mirror of
https://github.com/electron/electron.git
synced 2026-02-19 03:14:51 -05:00
Compare commits
105 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a07a70e8db | ||
|
|
0009a19ce6 | ||
|
|
4bc1221864 | ||
|
|
7f3640f761 | ||
|
|
01f367a344 | ||
|
|
178d937062 | ||
|
|
50ef5ed9f0 | ||
|
|
74fb38964a | ||
|
|
5955d53c48 | ||
|
|
3a5479aab6 | ||
|
|
7b3143cc84 | ||
|
|
d7816993b9 | ||
|
|
01f11a9169 | ||
|
|
d53ed0bcd7 | ||
|
|
999860f569 | ||
|
|
b8a8fe115f | ||
|
|
c50fa5486e | ||
|
|
3ad0eb0027 | ||
|
|
6619ad79d0 | ||
|
|
b74089153a | ||
|
|
9fec618788 | ||
|
|
55fd99488f | ||
|
|
ff3d3e6944 | ||
|
|
e39c0f9dae | ||
|
|
35b75e2285 | ||
|
|
5e9a959eae | ||
|
|
0a340b7f31 | ||
|
|
b3e5978c27 | ||
|
|
bce144aaf3 | ||
|
|
5910d3f090 | ||
|
|
b91a920128 | ||
|
|
a1342720ec | ||
|
|
53a6765fd6 | ||
|
|
3b45a30d2a | ||
|
|
1ec867c8a1 | ||
|
|
ec272f1e53 | ||
|
|
1914b92b8e | ||
|
|
59e3c0b9aa | ||
|
|
67e49b202c | ||
|
|
549e1a22e2 | ||
|
|
6a5ab8aa35 | ||
|
|
81dbdeb832 | ||
|
|
0dd76c79a8 | ||
|
|
b362e26261 | ||
|
|
d8b20376f9 | ||
|
|
e5237eb2ce | ||
|
|
fb5aa4660b | ||
|
|
78279119e2 | ||
|
|
bc12c6938a | ||
|
|
b21d314d61 | ||
|
|
3c8b3fcff4 | ||
|
|
daae931f40 | ||
|
|
ff8c72d9ef | ||
|
|
0b067eae23 | ||
|
|
3454ffb61e | ||
|
|
2298a3ac08 | ||
|
|
627b46141c | ||
|
|
7b777f949a | ||
|
|
d02f940039 | ||
|
|
1c3608c93b | ||
|
|
9e9700fe60 | ||
|
|
900d328eac | ||
|
|
52326a5ec7 | ||
|
|
c1741b90d7 | ||
|
|
5271a49fe8 | ||
|
|
df6a3583cb | ||
|
|
c85e4f01a9 | ||
|
|
83962f0604 | ||
|
|
a11c975a2d | ||
|
|
7b7ac29f14 | ||
|
|
6fb815bc3c | ||
|
|
ccd682e837 | ||
|
|
332d7d5cda | ||
|
|
9c03e02608 | ||
|
|
209a555a50 | ||
|
|
32ce192596 | ||
|
|
8b06e8a049 | ||
|
|
803d1c687a | ||
|
|
f3cc8cb8a5 | ||
|
|
427b4aa273 | ||
|
|
6a9ae16d76 | ||
|
|
5dd6c0a51d | ||
|
|
9c293834f1 | ||
|
|
f6966f6e35 | ||
|
|
91de7d0f13 | ||
|
|
8534c9a469 | ||
|
|
fdd94cdb8d | ||
|
|
ad7e6cccf3 | ||
|
|
987e1828d6 | ||
|
|
95e2105283 | ||
|
|
b21d7884e8 | ||
|
|
21085db4e3 | ||
|
|
0b71018107 | ||
|
|
e1675019d4 | ||
|
|
e671bd720d | ||
|
|
03bbd1483e | ||
|
|
1f25474038 | ||
|
|
4c96ced00a | ||
|
|
e645ea88e0 | ||
|
|
484cf26787 | ||
|
|
fb6b8e91db | ||
|
|
3be338100a | ||
|
|
5523d91bc8 | ||
|
|
6cb747e9c9 | ||
|
|
ebe3d4a19a |
1
.circleci/.gitignore
vendored
1
.circleci/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
config-staging
|
||||
@@ -1,79 +0,0 @@
|
||||
version: 2.1
|
||||
|
||||
# Required for dynamic configuration
|
||||
setup: true
|
||||
|
||||
# Orbs
|
||||
orbs:
|
||||
path-filtering: circleci/path-filtering@0.1.0
|
||||
continuation: circleci/continuation@0.2.0
|
||||
|
||||
# All input parameters to pass to build config
|
||||
parameters:
|
||||
run-docs-only:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
upload-to-storage:
|
||||
type: string
|
||||
default: '1'
|
||||
|
||||
run-build-linux:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
run-build-mac:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
run-linux-publish:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
linux-publish-arch-limit:
|
||||
type: enum
|
||||
default: all
|
||||
enum: ["all", "arm", "arm64", "x64", "ia32"]
|
||||
|
||||
run-macos-publish:
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
macos-publish-arch-limit:
|
||||
type: enum
|
||||
default: all
|
||||
enum: ["all", "osx-x64", "osx-arm64", "mas-x64", "mas-arm64"]
|
||||
|
||||
jobs:
|
||||
generate-config:
|
||||
docker:
|
||||
- image: cimg/node:16.14
|
||||
steps:
|
||||
- checkout
|
||||
- path-filtering/set-parameters:
|
||||
base-revision: main
|
||||
mapping: |
|
||||
^((?!docs/).)*$ run-build-mac true
|
||||
^((?!docs/).)*$ run-build-linux true
|
||||
docs/.* run-docs-only true
|
||||
^((?!docs/).)*$ run-docs-only false
|
||||
- run:
|
||||
command: |
|
||||
cd .circleci/config
|
||||
yarn
|
||||
export CIRCLECI_BINARY="$HOME/circleci"
|
||||
curl -fLSs https://raw.githubusercontent.com/CircleCI-Public/circleci-cli/main/install.sh | DESTDIR=$CIRCLECI_BINARY bash
|
||||
node build.js
|
||||
name: Pack config.yml
|
||||
- run:
|
||||
name: Set params
|
||||
command: node .circleci/config/params.js
|
||||
- continuation/continue:
|
||||
configuration_path: .circleci/config-staging/built.yml
|
||||
parameters: /tmp/pipeline-parameters.json
|
||||
|
||||
# Initial setup workflow
|
||||
workflows:
|
||||
setup:
|
||||
jobs:
|
||||
- generate-config
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,34 +0,0 @@
|
||||
const cp = require('child_process');
|
||||
const fs = require('fs-extra');
|
||||
const path = require('path');
|
||||
const yaml = require('js-yaml');
|
||||
|
||||
const STAGING_DIR = path.resolve(__dirname, '..', 'config-staging');
|
||||
|
||||
function copyAndExpand(dir = './') {
|
||||
const absDir = path.resolve(__dirname, dir);
|
||||
const targetDir = path.resolve(STAGING_DIR, dir);
|
||||
|
||||
if (!fs.existsSync(targetDir)) {
|
||||
fs.mkdirSync(targetDir);
|
||||
}
|
||||
|
||||
for (const file of fs.readdirSync(absDir)) {
|
||||
if (!file.endsWith('.yml')) {
|
||||
if (fs.statSync(path.resolve(absDir, file)).isDirectory()) {
|
||||
copyAndExpand(path.join(dir, file));
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
fs.writeFileSync(path.resolve(targetDir, file), yaml.dump(yaml.load(fs.readFileSync(path.resolve(absDir, file), 'utf8')), {
|
||||
noRefs: true,
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
if (fs.pathExists(STAGING_DIR)) fs.removeSync(STAGING_DIR);
|
||||
copyAndExpand();
|
||||
|
||||
const output = cp.spawnSync(process.env.CIRCLECI_BINARY || 'circleci', ['config', 'pack', STAGING_DIR]);
|
||||
fs.writeFileSync(path.resolve(STAGING_DIR, 'built.yml'), output.stdout.toString());
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"name": "@electron/circleci-config",
|
||||
"version": "0.0.0",
|
||||
"private": true,
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"fs-extra": "^10.1.0",
|
||||
"js-yaml": "^4.1.0"
|
||||
}
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
const fs = require('fs');
|
||||
|
||||
const PARAMS_PATH = '/tmp/pipeline-parameters.json';
|
||||
|
||||
const content = JSON.parse(fs.readFileSync(PARAMS_PATH, 'utf-8'));
|
||||
|
||||
// Choose resource class for linux hosts
|
||||
const currentBranch = process.env.CIRCLE_BRANCH || '';
|
||||
content['large-linux-executor'] = /^pull\/[0-9-]+$/.test(currentBranch) ? '2xlarge' : 'electronjs/aks-linux-large';
|
||||
content['medium-linux-executor'] = /^pull\/[0-9-]+$/.test(currentBranch) ? 'medium' : 'electronjs/aks-linux-medium';
|
||||
|
||||
fs.writeFileSync(PARAMS_PATH, JSON.stringify(content));
|
||||
@@ -1,43 +0,0 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
argparse@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
|
||||
integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
|
||||
|
||||
fs-extra@^10.1.0:
|
||||
version "10.1.0"
|
||||
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf"
|
||||
integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==
|
||||
dependencies:
|
||||
graceful-fs "^4.2.0"
|
||||
jsonfile "^6.0.1"
|
||||
universalify "^2.0.0"
|
||||
|
||||
graceful-fs@^4.1.6, graceful-fs@^4.2.0:
|
||||
version "4.2.10"
|
||||
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
|
||||
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
|
||||
|
||||
js-yaml@^4.1.0:
|
||||
version "4.1.0"
|
||||
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602"
|
||||
integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==
|
||||
dependencies:
|
||||
argparse "^2.0.1"
|
||||
|
||||
jsonfile@^6.0.1:
|
||||
version "6.1.0"
|
||||
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
|
||||
integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==
|
||||
dependencies:
|
||||
universalify "^2.0.0"
|
||||
optionalDependencies:
|
||||
graceful-fs "^4.1.6"
|
||||
|
||||
universalify@^2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
|
||||
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
|
||||
@@ -1,8 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
mkdir -p ~/.ssh
|
||||
echo "github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
|
||||
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
|
||||
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=" >> ~/.ssh/known_hosts
|
||||
@@ -40,7 +40,6 @@
|
||||
"dbaeumer.vscode-eslint",
|
||||
"shakram02.bash-beautify",
|
||||
"marshallofsound.gnls-electron",
|
||||
"CircleCI.circleci"
|
||||
],
|
||||
"settings": {
|
||||
"editor.tabSize": 2,
|
||||
|
||||
@@ -2,5 +2,4 @@
|
||||
# See docs/development/releasing.md
|
||||
|
||||
APPVEYOR_CLOUD_TOKEN=
|
||||
CIRCLE_TOKEN=
|
||||
ELECTRON_GITHUB_TOKEN=
|
||||
|
||||
220
.github/actions/build-electron/action.yml
vendored
Normal file
220
.github/actions/build-electron/action.yml
vendored
Normal file
@@ -0,0 +1,220 @@
|
||||
name: 'Build Electron'
|
||||
description: 'Builds Electron & Friends'
|
||||
inputs:
|
||||
target-arch:
|
||||
description: 'Target arch'
|
||||
required: true
|
||||
target-platform:
|
||||
description: 'Target platform'
|
||||
required: true
|
||||
artifact-platform:
|
||||
description: 'Artifact platform, should be linux, darwin or mas'
|
||||
required: true
|
||||
step-suffix:
|
||||
description: 'Suffix for build steps'
|
||||
required: false
|
||||
default: ''
|
||||
is-release:
|
||||
description: 'Is release build'
|
||||
required: true
|
||||
strip-binaries:
|
||||
description: 'Strip binaries (Linux only)'
|
||||
required: false
|
||||
generate-symbols:
|
||||
description: 'Generate symbols'
|
||||
required: true
|
||||
upload-to-storage:
|
||||
description: 'Upload to storage'
|
||||
required: true
|
||||
is-asan:
|
||||
description: 'The ASan Linux build'
|
||||
required: false
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Set GN_EXTRA_ARGS for MacOS x64 Builds
|
||||
shell: bash
|
||||
if: ${{ inputs.target-arch == 'x64' && inputs.target-platform == 'macos' }}
|
||||
run: |
|
||||
GN_APPENDED_ARGS="$GN_EXTRA_ARGS target_cpu=\"x64\" v8_snapshot_toolchain=\"//build/toolchain/mac:clang_x64\""
|
||||
echo "GN_EXTRA_ARGS=$GN_APPENDED_ARGS" >> $GITHUB_ENV
|
||||
- name: Build Electron ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: |
|
||||
rm -rf "src/out/Default/Electron Framework.framework"
|
||||
rm -rf src/out/Default/Electron*.app
|
||||
|
||||
cd src/electron
|
||||
# TODO(codebytere): remove this once we figure out why .git/packed-refs is initially missing
|
||||
git pack-refs
|
||||
cd ..
|
||||
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
ulimit -n 10000
|
||||
sudo launchctl limit maxfiles 65536 200000
|
||||
fi
|
||||
|
||||
NINJA_SUMMARIZE_BUILD=1 e build -j $NUMBER_OF_NINJA_PROCESSES
|
||||
cp out/Default/.ninja_log out/electron_ninja_log
|
||||
node electron/script/check-symlinks.js
|
||||
- name: Strip Electron Binaries ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
if: ${{ inputs.strip-binaries == 'true' }}
|
||||
run: |
|
||||
cd src
|
||||
electron/script/copy-debug-symbols.py --target-cpu="${{ inputs.target-arch }}" --out-dir=out/Default/debug --compress
|
||||
electron/script/strip-binaries.py --target-cpu="${{ inputs.target-arch }}"
|
||||
electron/script/add-debug-link.py --target-cpu="${{ inputs.target-arch }}" --debug-dir=out/Default/debug
|
||||
- name: Build Electron dist.zip ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd src
|
||||
e build --target electron:electron_dist_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
if [ "${{ inputs.is-asan }}" != "true" ]; then
|
||||
target_os=${{ inputs.target-platform == 'linux' && 'linux' || 'mac'}}
|
||||
if [ "${{ inputs.artifact-platform }}" = "mas" ]; then
|
||||
target_os="${target_os}_mas"
|
||||
fi
|
||||
electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip electron/script/zip_manifests/dist_zip.$target_os.${{ inputs.target-arch }}.manifest
|
||||
fi
|
||||
- name: Build Mksnapshot ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd src
|
||||
e build --target electron:electron_mksnapshot -j $NUMBER_OF_NINJA_PROCESSES
|
||||
gn desc out/Default v8:run_mksnapshot_default args > out/Default/mksnapshot_args
|
||||
# Remove unused args from mksnapshot_args
|
||||
SEDOPTION="-i"
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
SEDOPTION="-i ''"
|
||||
fi
|
||||
sed $SEDOPTION '/.*builtins-pgo/d' out/Default/mksnapshot_args
|
||||
sed $SEDOPTION '/--turbo-profiling-input/d' out/Default/mksnapshot_args
|
||||
sed $SEDOPTION '/The gn arg use_goma=true .*/d' out/Default/mksnapshot_args
|
||||
|
||||
if [ "`uname`" = "Linux" ]; then
|
||||
if [ "${{ inputs.target-arch }}" = "arm" ]; then
|
||||
electron/script/strip-binaries.py --file $PWD/out/Default/clang_x86_v8_arm/mksnapshot
|
||||
electron/script/strip-binaries.py --file $PWD/out/Default/clang_x86_v8_arm/v8_context_snapshot_generator
|
||||
elif [ "${{ inputs.target-arch }}" = "arm64" ]; then
|
||||
electron/script/strip-binaries.py --file $PWD/out/Default/clang_x64_v8_arm64/mksnapshot
|
||||
electron/script/strip-binaries.py --file $PWD/out/Default/clang_x64_v8_arm64/v8_context_snapshot_generator
|
||||
else
|
||||
electron/script/strip-binaries.py --file $PWD/out/Default/mksnapshot
|
||||
electron/script/strip-binaries.py --file $PWD/out/Default/v8_context_snapshot_generator
|
||||
fi
|
||||
fi
|
||||
|
||||
e build --target electron:electron_mksnapshot_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
(cd out/Default; zip mksnapshot.zip mksnapshot_args gen/v8/embedded.S)
|
||||
- name: Generate Cross-Arch Snapshot (arm/arm64) ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
if: ${{ (inputs.target-arch == 'arm' || inputs.target-arch == 'arm64') && inputs.target-platform == 'linux' }}
|
||||
run: |
|
||||
cd src
|
||||
if [ "${{ inputs.target-arch }}" = "arm" ]; then
|
||||
MKSNAPSHOT_PATH="clang_x86_v8_arm"
|
||||
elif [ "${{ inputs.target-arch }}" = "arm64" ]; then
|
||||
MKSNAPSHOT_PATH="clang_x64_v8_arm64"
|
||||
fi
|
||||
|
||||
cp "out/Default/$MKSNAPSHOT_PATH/mksnapshot" out/Default
|
||||
cp "out/Default/$MKSNAPSHOT_PATH/v8_context_snapshot_generator" out/Default
|
||||
cp "out/Default/$MKSNAPSHOT_PATH/libffmpeg.so" out/Default
|
||||
|
||||
python3 electron/script/verify-mksnapshot.py --source-root "$PWD" --build-dir out/Default --create-snapshot-only
|
||||
mkdir cross-arch-snapshots
|
||||
cp out/Default-mksnapshot-test/*.bin cross-arch-snapshots
|
||||
# Clean up so that ninja does not get confused
|
||||
rm -f out/Default/libffmpeg.so
|
||||
- name: Build Chromedriver ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd src
|
||||
e build --target electron:electron_chromedriver -j $NUMBER_OF_NINJA_PROCESSES
|
||||
e build --target electron:electron_chromedriver_zip
|
||||
- name: Build Node.js headers ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd src
|
||||
e build --target electron:node_headers
|
||||
- name: Generate & Zip Symbols ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: |
|
||||
# Generate breakpad symbols on release builds
|
||||
if [ "${{ inputs.generate-symbols }}" = "true" ]; then
|
||||
e build --target electron:electron_symbols
|
||||
fi
|
||||
cd src
|
||||
export BUILD_PATH="$(pwd)/out/Default"
|
||||
e build --target electron:licenses
|
||||
e build --target electron:electron_version_file
|
||||
if [ "${{ inputs.is-release }}" = "true" ]; then
|
||||
DELETE_DSYMS_AFTER_ZIP=1 electron/script/zip-symbols.py -b $BUILD_PATH
|
||||
else
|
||||
electron/script/zip-symbols.py -b $BUILD_PATH
|
||||
fi
|
||||
- name: Generate FFMpeg ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
if: ${{ inputs.is-release == 'true' }}
|
||||
run: |
|
||||
cd src
|
||||
gn gen out/ffmpeg --args="import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true $GN_EXTRA_ARGS"
|
||||
autoninja -C out/ffmpeg electron:electron_ffmpeg_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
- name: Generate Hunspell Dictionaries ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
if: ${{ inputs.is-release == 'true' && inputs.target-platform == 'linux' }}
|
||||
run: |
|
||||
cd src
|
||||
autoninja -C out/Default electron:hunspell_dictionaries_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
- name: Generate Libcxx ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
if: ${{ inputs.is-release == 'true' && inputs.target-platform == 'linux' }}
|
||||
run: |
|
||||
cd src
|
||||
autoninja -C out/Default electron:libcxx_headers_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
autoninja -C out/Default electron:libcxxabi_headers_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
autoninja -C out/Default electron:libcxx_objects_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||
- name: Generate TypeScript Definitions ${{ inputs.step-suffix }}
|
||||
if: ${{ inputs.is-release == 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn create-typescript-definitions
|
||||
- name: Publish Electron Dist ${{ inputs.step-suffix }}
|
||||
if: ${{ inputs.is-release == 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
rm -rf src/out/Default/obj
|
||||
cd src/electron
|
||||
if [ "${{ inputs.upload-to-storage }}" = "1" ]; then
|
||||
echo 'Uploading Electron release distribution to Azure'
|
||||
script/release/uploaders/upload.py --verbose --upload_to_storage
|
||||
else
|
||||
echo 'Uploading Electron release distribution to GitHub releases'
|
||||
script/release/uploaders/upload.py --verbose
|
||||
fi
|
||||
- name: Generate Artifact Key
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "${{ inputs.is-asan }}" = "true" ]; then
|
||||
ARTIFACT_KEY=${{ inputs.artifact-platform }}_${{ inputs.target-arch }}_asan
|
||||
else
|
||||
ARTIFACT_KEY=${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
||||
fi
|
||||
echo "ARTIFACT_KEY=$ARTIFACT_KEY" >> $GITHUB_ENV
|
||||
# The current generated_artifacts_<< artifact.key >> name was taken from CircleCI
|
||||
# to ensure we don't break anything, but we may be able to improve that.
|
||||
- name: Move all Generated Artifacts to Upload Folder ${{ inputs.step-suffix }}
|
||||
shell: bash
|
||||
run: ./src/electron/script/actions/move-artifacts.sh
|
||||
- name: Upload Generated Artifacts ${{ inputs.step-suffix }}
|
||||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||
with:
|
||||
name: generated_artifacts_${{ env.ARTIFACT_KEY }}
|
||||
path: ./generated_artifacts_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
||||
- name: Upload Src Artifacts ${{ inputs.step-suffix }}
|
||||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
||||
with:
|
||||
name: src_artifacts_${{ env.ARTIFACT_KEY }}
|
||||
path: ./src_artifacts_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
||||
155
.github/actions/checkout/action.yml
vendored
Normal file
155
.github/actions/checkout/action.yml
vendored
Normal file
@@ -0,0 +1,155 @@
|
||||
name: 'Checkout'
|
||||
description: 'Checks out Electron and stores it in the AKS Cache'
|
||||
inputs:
|
||||
generate-sas-token:
|
||||
description: 'Whether to generate and persist a SAS token for the item in the cache'
|
||||
required: false
|
||||
default: 'false'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Set GIT_CACHE_PATH to make gclient to use the cache
|
||||
shell: bash
|
||||
run: |
|
||||
echo "GIT_CACHE_PATH=$(pwd)/git-cache" >> $GITHUB_ENV
|
||||
- name: Install Dependencies
|
||||
shell: bash
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Get Depot Tools
|
||||
shell: bash
|
||||
run: |
|
||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
|
||||
sed -i '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
# Remove swift-format dep from cipd on macOS until we send a patch upstream.
|
||||
cd depot_tools
|
||||
git apply --3way ../src/electron/.github/workflows/config/gclient.diff
|
||||
|
||||
# Ensure depot_tools does not update.
|
||||
test -d depot_tools && cd depot_tools
|
||||
touch .disable_auto_update
|
||||
- name: Add Depot Tools to PATH
|
||||
shell: bash
|
||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
||||
- name: Generate DEPS Hash
|
||||
shell: bash
|
||||
run: |
|
||||
node src/electron/script/generate-deps-hash.js && cat src/electron/.depshash-target
|
||||
echo "DEPSHASH=v1-src-cache-$(shasum src/electron/.depshash | cut -f1 -d' ')" >> $GITHUB_ENV
|
||||
- name: Generate SAS Key
|
||||
if: ${{ inputs.generate-sas-token == 'true' }}
|
||||
shell: bash
|
||||
run: |
|
||||
curl --unix-socket /var/run/sas/sas.sock --fail "http://foo/$DEPSHASH.tar" > sas-token
|
||||
- name: Save SAS Key
|
||||
if: ${{ inputs.generate-sas-token == 'true' }}
|
||||
uses: actions/cache/save@v4
|
||||
with:
|
||||
path: |
|
||||
sas-token
|
||||
key: sas-key-${{ github.run_number }}-${{ github.run_attempt }}
|
||||
- name: Check If Cache Exists
|
||||
id: check-cache
|
||||
shell: bash
|
||||
run: |
|
||||
cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
||||
echo "Using cache key: $DEPSHASH"
|
||||
echo "Checking for cache in: $cache_path"
|
||||
if [ ! -f "$cache_path" ]; then
|
||||
echo "cache_exists=false" >> $GITHUB_OUTPUT
|
||||
echo "Cache Does Not Exist for $DEPSHASH"
|
||||
else
|
||||
echo "cache_exists=true" >> $GITHUB_OUTPUT
|
||||
echo "Cache Already Exists for $DEPSHASH, Skipping.."
|
||||
fi
|
||||
- name: Gclient Sync
|
||||
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||
shell: bash
|
||||
run: |
|
||||
gclient config \
|
||||
--name "src/electron" \
|
||||
--unmanaged \
|
||||
${GCLIENT_EXTRA_ARGS} \
|
||||
"$GITHUB_SERVER_URL/$GITHUB_REPOSITORY"
|
||||
|
||||
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 gclient sync --with_branch_heads --with_tags -vvvvv
|
||||
if [ "${{ inputs.is-release }}" != "true" && -n "${{ env.PATCH_UP_APP_CREDS }}" ]; then
|
||||
# Re-export all the patches to check if there were changes.
|
||||
python3 src/electron/script/export_all_patches.py src/electron/patches/config.json
|
||||
cd src/electron
|
||||
git update-index --refresh || true
|
||||
if ! git diff-index --quiet HEAD --; then
|
||||
# There are changes to the patches. Make a git commit with the updated patches
|
||||
git add patches
|
||||
GIT_COMMITTER_NAME="PatchUp" GIT_COMMITTER_EMAIL="73610968+patchup[bot]@users.noreply.github.com" git commit -m "chore: update patches" --author="PatchUp <73610968+patchup[bot]@users.noreply.github.com>"
|
||||
# Export it
|
||||
mkdir -p ../../patches
|
||||
git format-patch -1 --stdout --keep-subject --no-stat --full-index > ../../patches/update-patches.patch
|
||||
if (node ./script/push-patch.js 2> /dev/null > /dev/null); then
|
||||
echo
|
||||
echo "======================================================================"
|
||||
echo "Changes to the patches when applying, we have auto-pushed the diff to the current branch"
|
||||
echo "A new CI job will kick off shortly"
|
||||
echo "======================================================================"
|
||||
exit 1
|
||||
else
|
||||
echo
|
||||
echo "======================================================================"
|
||||
echo "There were changes to the patches when applying."
|
||||
echo "Check the CI artifacts for a patch you can apply to fix it."
|
||||
echo "======================================================================"
|
||||
cat ../../patches/update-patches.patch
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
# delete all .git directories under src/ except for
|
||||
# third_party/angle/ and third_party/dawn/ because of build time generation of files
|
||||
# gen/angle/commit.h depends on third_party/angle/.git/HEAD
|
||||
# https://chromium-review.googlesource.com/c/angle/angle/+/2074924
|
||||
# and dawn/common/Version_autogen.h depends on third_party/dawn/.git/HEAD
|
||||
# https://dawn-review.googlesource.com/c/dawn/+/83901
|
||||
# TODO: maybe better to always leave out */.git/HEAD file for all targets ?
|
||||
- name: Delete .git directories under src to free space
|
||||
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||
shell: bash
|
||||
run: |
|
||||
cd src
|
||||
( find . -type d -name ".git" -not -path "./third_party/angle/*" -not -path "./third_party/dawn/*" -not -path "./electron/*" ) | xargs rm -rf
|
||||
- name: Minimize Cache Size for Upload
|
||||
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||
shell: bash
|
||||
run: |
|
||||
rm -rf src/android_webview
|
||||
rm -rf src/ios/chrome
|
||||
rm -rf src/third_party/blink/web_tests
|
||||
rm -rf src/third_party/blink/perf_tests
|
||||
rm -rf src/chrome/test/data/xr/webvr_info
|
||||
rm -rf src/third_party/angle/third_party/VK-GL-CTS/src
|
||||
rm -rf src/third_party/swift-toolchain
|
||||
rm -rf src/third_party/swiftshader/tests/regres/testlists
|
||||
rm -rf src/electron
|
||||
- name: Compress Src Directory
|
||||
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Uncompressed src size: $(du -sh src | cut -f1 -d' ')"
|
||||
tar -cf $DEPSHASH.tar src
|
||||
echo "Compressed src to $(du -sh $DEPSHASH.tar | cut -f1 -d' ')"
|
||||
cp ./$DEPSHASH.tar /mnt/cross-instance-cache/
|
||||
- name: Persist Src Cache
|
||||
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||
shell: bash
|
||||
run: |
|
||||
final_cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
||||
echo "Using cache key: $DEPSHASH"
|
||||
echo "Checking path: $final_cache_path"
|
||||
if [ ! -f "$final_cache_path" ]; then
|
||||
echo "Cache key not found"
|
||||
exit 1
|
||||
else
|
||||
echo "Cache key persisted in $final_cache_path"
|
||||
fi
|
||||
61
.github/actions/fix-sync-macos/action.yml
vendored
Normal file
61
.github/actions/fix-sync-macos/action.yml
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
name: 'Fix Sync macOS'
|
||||
description: 'Checks out Electron and stores it in the AKS Cache'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Fix Sync
|
||||
shell: bash
|
||||
# This step is required to correct for differences between "gclient sync"
|
||||
# on Linux and the expected state on macOS. This requires:
|
||||
# 1. Fixing Clang Install (wrong binary)
|
||||
# 2. Fixing esbuild (wrong binary)
|
||||
# 3. Fixing rustc (wrong binary)
|
||||
# 4. Fixing gn (wrong binary)
|
||||
# 5. Fix reclient (wrong binary)
|
||||
# 6. Fixing dsymutil (wrong binary)
|
||||
# 7. Ensuring we are using the correct ninja and adding it to PATH
|
||||
# 8. Fixing angle (wrong remote)
|
||||
run : |
|
||||
SEDOPTION="-i ''"
|
||||
rm -rf src/third_party/llvm-build
|
||||
python3 src/tools/clang/scripts/update.py
|
||||
|
||||
echo 'infra/3pp/tools/esbuild/${platform}' `gclient getdep --deps-file=src/third_party/devtools-frontend/src/DEPS -r 'third_party/esbuild:infra/3pp/tools/esbuild/${platform}'` > esbuild_ensure_file
|
||||
# Remove extra output from calling gclient getdep which always calls update_depot_tools
|
||||
sed -i '' "s/Updating depot_tools... //g" esbuild_ensure_file
|
||||
cipd ensure --root src/third_party/devtools-frontend/src/third_party/esbuild -ensure-file esbuild_ensure_file
|
||||
|
||||
rm -rf src/third_party/rust-toolchain
|
||||
python3 src/tools/rust/update_rust.py
|
||||
|
||||
# Prevent calling gclient getdep which always calls update_depot_tools
|
||||
echo 'gn/gn/mac-${arch}' `gclient getdep --deps-file=src/DEPS -r 'src/buildtools/mac:gn/gn/mac-${arch}'` > gn_ensure_file
|
||||
sed -i '' "s/Updating depot_tools... //g" gn_ensure_file
|
||||
cipd ensure --root src/buildtools/mac -ensure-file gn_ensure_file
|
||||
|
||||
# Prevent calling gclient getdep which always calls update_depot_tools
|
||||
echo 'infra/rbe/client/${platform}' `gclient getdep --deps-file=src/DEPS -r 'src/buildtools/reclient:infra/rbe/client/${platform}'` > gn_ensure_file
|
||||
sed -i '' "s/Updating depot_tools... //g" gn_ensure_file
|
||||
cipd ensure --root src/buildtools/reclient -ensure-file gn_ensure_file
|
||||
python3 src/buildtools/reclient_cfgs/configure_reclient_cfgs.py --rbe_instance "projects/rbe-chrome-untrusted/instances/default_instance" --reproxy_cfg_template reproxy.cfg.template --rewrapper_cfg_project "" --skip_remoteexec_cfg_fetch
|
||||
|
||||
if [ "${{ env.TARGET_ARCH }}" == "arm64" ]; then
|
||||
DSYM_SHA_FILE=src/tools/clang/dsymutil/bin/dsymutil.arm64.sha1
|
||||
else
|
||||
DSYM_SHA_FILE=src/tools/clang/dsymutil/bin/dsymutil.x64.sha1
|
||||
fi
|
||||
python3 src/third_party/depot_tools/download_from_google_storage.py --no_resume --no_auth --bucket chromium-browser-clang -s $DSYM_SHA_FILE -o src/tools/clang/dsymutil/bin/dsymutil
|
||||
|
||||
echo 'infra/3pp/tools/ninja/${platform}' `gclient getdep --deps-file=src/DEPS -r 'src/third_party/ninja:infra/3pp/tools/ninja/${platform}'` > ninja_ensure_file
|
||||
sed $SEDOPTION "s/Updating depot_tools... //g" ninja_ensure_file
|
||||
cipd ensure --root src/third_party/ninja -ensure-file ninja_ensure_file
|
||||
|
||||
echo "$(pwd)/src/third_party/ninja" >> $GITHUB_PATH
|
||||
|
||||
cd src/third_party/angle
|
||||
rm -f .git/objects/info/alternates
|
||||
git remote set-url origin https://chromium.googlesource.com/angle/angle.git
|
||||
cp .git/config .git/config.backup
|
||||
git remote remove origin
|
||||
mv .git/config.backup .git/config
|
||||
git fetch
|
||||
65
.github/actions/free-space-macos/action.yml
vendored
Normal file
65
.github/actions/free-space-macos/action.yml
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
name: 'Free Space macOS'
|
||||
description: 'Checks out Electron and stores it in the AKS Cache'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Free Space on MacOS
|
||||
shell: bash
|
||||
run: |
|
||||
sudo mkdir -p $TMPDIR/del-target
|
||||
|
||||
tmpify() {
|
||||
if [ -d "$1" ]; then
|
||||
sudo mv "$1" $TMPDIR/del-target/$(echo $1|shasum -a 256|head -n1|cut -d " " -f1)
|
||||
fi
|
||||
}
|
||||
|
||||
strip_universal_deep() {
|
||||
opwd=$(pwd)
|
||||
cd $1
|
||||
f=$(find . -perm +111 -type f)
|
||||
for fp in $f
|
||||
do
|
||||
if [[ $(file "$fp") == *"universal binary"* ]]; then
|
||||
if [ "`arch`" == "arm64" ]; then
|
||||
if [[ $(file "$fp") == *"x86_64"* ]]; then
|
||||
sudo lipo -remove x86_64 "$fp" -o "$fp" || true
|
||||
fi
|
||||
else
|
||||
if [[ $(file "$fp") == *"arm64e)"* ]]; then
|
||||
sudo lipo -remove arm64e "$fp" -o "$fp" || true
|
||||
fi
|
||||
if [[ $(file "$fp") == *"arm64)"* ]]; then
|
||||
sudo lipo -remove arm64 "$fp" -o "$fp" || true
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
cd $opwd
|
||||
}
|
||||
|
||||
tmpify /Library/Developer/CoreSimulator
|
||||
tmpify ~/Library/Developer/CoreSimulator
|
||||
tmpify $(xcode-select -p)/Platforms/AppleTVOS.platform
|
||||
tmpify $(xcode-select -p)/Platforms/iPhoneOS.platform
|
||||
tmpify $(xcode-select -p)/Platforms/WatchOS.platform
|
||||
tmpify $(xcode-select -p)/Platforms/WatchSimulator.platform
|
||||
tmpify $(xcode-select -p)/Platforms/AppleTVSimulator.platform
|
||||
tmpify $(xcode-select -p)/Platforms/iPhoneSimulator.platform
|
||||
tmpify $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/metal/ios
|
||||
tmpify $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift
|
||||
tmpify $(xcode-select -p)/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift-5.0
|
||||
tmpify ~/.rubies
|
||||
tmpify ~/Library/Caches/Homebrew
|
||||
tmpify /usr/local/Homebrew
|
||||
|
||||
sudo rm -rf $TMPDIR/del-target
|
||||
|
||||
sudo rm -rf /Applications/Safari.app
|
||||
sudo rm -rf ~/project/src/third_party/catapult/tracing/test_data
|
||||
sudo rm -rf ~/project/src/third_party/angle/third_party/VK-GL-CTS
|
||||
|
||||
# lipo off some huge binaries arm64 versions to save space
|
||||
strip_universal_deep $(xcode-select -p)/../SharedFrameworks
|
||||
# strip_arm_deep /System/Volumes/Data/Library/Developer/CommandLineTools/usr
|
||||
11
.github/actions/install-build-tools/action.yml
vendored
Normal file
11
.github/actions/install-build-tools/action.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
name: 'Install Build Tools'
|
||||
description: 'Installs an exact SHA of build tools'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Install Build Tools
|
||||
shell: bash
|
||||
run: |
|
||||
export BUILD_TOOLS_SHA=d5b87591842be19058e8d75d2c5b7f1fabe9f450
|
||||
npm i -g @electron/build-tools
|
||||
e auto-update disable
|
||||
36
.github/actions/restore-cache-aks/action.yml
vendored
Normal file
36
.github/actions/restore-cache-aks/action.yml
vendored
Normal file
@@ -0,0 +1,36 @@
|
||||
name: 'Restore Cache AKS'
|
||||
description: 'Restores Electron src cache via AKS'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Restore and Ensure Src Cache
|
||||
shell: bash
|
||||
run: |
|
||||
cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
||||
echo "Using cache key: $DEPSHASH"
|
||||
echo "Checking for cache in: $cache_path"
|
||||
if [ ! -f "$cache_path" ]; then
|
||||
echo "Cache Does Not Exist for $DEPSHASH - exiting"
|
||||
exit 1
|
||||
else
|
||||
echo "Found Cache for $DEPSHASH at $cache_path"
|
||||
fi
|
||||
|
||||
echo "Persisted cache is $(du -sh $cache_path | cut -f1)"
|
||||
mkdir temp-cache
|
||||
tar -xf $cache_path -C temp-cache
|
||||
echo "Unzipped cache is $(du -sh temp-cache/src | cut -f1)"
|
||||
|
||||
if [ -d "temp-cache/src" ]; then
|
||||
echo "Relocating Cache"
|
||||
rm -rf src
|
||||
mv temp-cache/src src
|
||||
fi
|
||||
|
||||
if [ ! -d "src/third_party/blink" ]; then
|
||||
echo "Cache was not correctly restored - exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Wiping Electron Directory"
|
||||
rm -rf src/electron
|
||||
66
.github/actions/restore-cache-azcopy/action.yml
vendored
Normal file
66
.github/actions/restore-cache-azcopy/action.yml
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
name: 'Restore Cache AZCopy'
|
||||
description: 'Restores Electron src cache via AZCopy'
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Obtain SAS Key
|
||||
continue-on-error: true
|
||||
uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
|
||||
with:
|
||||
path: |
|
||||
sas-token
|
||||
key: sas-key-${{ github.run_number }}-1
|
||||
- name: Obtain SAS Key
|
||||
continue-on-error: true
|
||||
uses: actions/cache/restore@0c45773b623bea8c8e75f6c82b208c3cf94ea4f9
|
||||
with:
|
||||
path: |
|
||||
sas-token
|
||||
key: sas-key-${{ github.run_number }}-${{ github.run_attempt }}
|
||||
- name: Download Src Cache from AKS
|
||||
# The cache will always exist here as a result of the checkout job
|
||||
# Either it was uploaded to Azure in the checkout job for this commit
|
||||
# or it was uploaded in the checkout job for a previous commit.
|
||||
uses: nick-fields/retry@7152eba30c6575329ac0576536151aca5a72780e # v3.0.0
|
||||
with:
|
||||
timeout_minutes: 30
|
||||
max_attempts: 3
|
||||
retry_on: error
|
||||
command: |
|
||||
sas_token=$(cat sas-token)
|
||||
if [ -z $sas-token ]; then
|
||||
echo "SAS Token not found; exiting src cache download early..."
|
||||
exit 1
|
||||
fi
|
||||
azcopy copy --log-level=ERROR \
|
||||
"https://${{ env.AZURE_AKS_CACHE_STORAGE_ACCOUNT }}.file.core.windows.net/${{ env.AZURE_AKS_CACHE_SHARE_NAME }}/${{ env.CACHE_PATH }}?$sas_token" $DEPSHASH.tar
|
||||
env:
|
||||
AZURE_AKS_CACHE_STORAGE_ACCOUNT: f723719aa87a34622b5f7f3
|
||||
AZURE_AKS_CACHE_SHARE_NAME: pvc-f6a4089f-b082-4bee-a3f9-c3e1c0c02d8f
|
||||
- name: Clean SAS Key
|
||||
shell: bash
|
||||
run: rm -f sas-token
|
||||
- name: Unzip and Ensure Src Cache
|
||||
shell: bash
|
||||
run: |
|
||||
echo "Downloaded cache is $(du -sh $DEPSHASH.tar | cut -f1)"
|
||||
mkdir temp-cache
|
||||
tar -xf $DEPSHASH.tar -C temp-cache
|
||||
echo "Unzipped cache is $(du -sh temp-cache/src | cut -f1)"
|
||||
|
||||
if [ -d "temp-cache/src" ]; then
|
||||
echo "Relocating Cache"
|
||||
rm -rf src
|
||||
mv temp-cache/src src
|
||||
|
||||
echo "Deleting zip file"
|
||||
rm -rf $DEPSHASH.tar
|
||||
fi
|
||||
|
||||
if [ ! -d "src/third_party/blink" ]; then
|
||||
echo "Cache was not correctly restored - exiting"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Wiping Electron Directory"
|
||||
rm -rf src/electron
|
||||
252
.github/workflows/build.yml
vendored
Normal file
252
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,252 @@
|
||||
name: Build
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
build-image-sha:
|
||||
type: string
|
||||
description: 'SHA for electron/build image'
|
||||
default: 'cf814a4d2501e8e843caea071a6b70a48e78b855'
|
||||
required: true
|
||||
skip-macos:
|
||||
type: boolean
|
||||
description: 'Skip macOS builds'
|
||||
default: false
|
||||
required: false
|
||||
skip-linux:
|
||||
type: boolean
|
||||
description: 'Skip Linux builds'
|
||||
default: false
|
||||
required: false
|
||||
skip-lint:
|
||||
type: boolean
|
||||
description: 'Skip lint check'
|
||||
default: false
|
||||
required: false
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- '[1-9][0-9]-x-y'
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
setup:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
pull-requests: read
|
||||
outputs:
|
||||
docs: ${{ steps.filter.outputs.docs }}
|
||||
src: ${{ steps.filter.outputs.src }}
|
||||
build-image-sha: ${{ steps.set-output.outputs.build-image-sha }}
|
||||
docs-only: ${{ steps.set-output.outputs.docs-only }}
|
||||
steps:
|
||||
- uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 #v4.0.2
|
||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
||||
id: filter
|
||||
with:
|
||||
filters: |
|
||||
docs:
|
||||
- 'docs/**'
|
||||
src:
|
||||
- '!docs/**'
|
||||
- name: Set Outputs for Build Image SHA & Docs Only
|
||||
id: set-output
|
||||
run: |
|
||||
if [ -z "${{ inputs.build-image-sha }}" ]; then
|
||||
echo "build-image-sha=cf814a4d2501e8e843caea071a6b70a48e78b855" >> "$GITHUB_OUTPUT"
|
||||
else
|
||||
echo "build-image-sha=${{ inputs.build-image-sha }}" >> "$GITHUB_OUTPUT"
|
||||
fi
|
||||
echo "docs-only=${{ steps.filter.outputs.docs == 'true' && steps.filter.outputs.src == 'false' }}" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Lint Jobs
|
||||
lint:
|
||||
needs: setup
|
||||
if: ${{ !inputs.skip-lint }}
|
||||
uses: ./.github/workflows/pipeline-electron-lint.yml
|
||||
with:
|
||||
container: '{"image":"ghcr.io/electron/build:${{ needs.setup.outputs.build-image-sha }}","options":"--user root"}'
|
||||
secrets: inherit
|
||||
|
||||
# Docs Only Jobs
|
||||
docs-only:
|
||||
needs: setup
|
||||
if: ${{ needs.setup.outputs.docs-only == 'true' }}
|
||||
uses: ./.github/workflows/pipeline-electron-docs-only.yml
|
||||
with:
|
||||
container: '{"image":"ghcr.io/electron/build:${{ needs.setup.outputs.build-image-sha }}","options":"--user root"}'
|
||||
secrets: inherit
|
||||
|
||||
# Checkout Jobs
|
||||
checkout-macos:
|
||||
needs: setup
|
||||
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-macos}}
|
||||
runs-on: electron-arc-linux-amd64-32core
|
||||
container:
|
||||
image: ghcr.io/electron/build:${{ needs.setup.outputs.build-image-sha }}
|
||||
options: --user root
|
||||
volumes:
|
||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||
- /var/run/sas:/var/run/sas
|
||||
env:
|
||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
||||
outputs:
|
||||
build-image-sha: ${{ needs.setup.outputs.build-image-sha }}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Checkout & Sync & Save
|
||||
uses: ./src/electron/.github/actions/checkout
|
||||
with:
|
||||
generate-sas-token: 'true'
|
||||
|
||||
checkout-linux:
|
||||
needs: setup
|
||||
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-linux}}
|
||||
runs-on: electron-arc-linux-amd64-32core
|
||||
container:
|
||||
image: ghcr.io/electron/build:${{ needs.setup.outputs.build-image-sha }}
|
||||
options: --user root
|
||||
volumes:
|
||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||
- /var/run/sas:/var/run/sas
|
||||
env:
|
||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
||||
PATCH_UP_APP_CREDS: ${{ secrets.PATCH_UP_APP_CREDS }}
|
||||
outputs:
|
||||
build-image-sha: ${{ needs.setup.outputs.build-image-sha}}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Checkout & Sync & Save
|
||||
uses: ./src/electron/.github/actions/checkout
|
||||
|
||||
# Build Jobs - These cascade into testing jobs
|
||||
macos-x64:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||
needs: checkout-macos
|
||||
with:
|
||||
build-runs-on: macos-14-xlarge
|
||||
check-runs-on: macos-14
|
||||
test-runs-on: macos-13
|
||||
target-platform: macos
|
||||
target-arch: x64
|
||||
is-release: false
|
||||
gn-build-type: testing
|
||||
generate-symbols: false
|
||||
upload-to-storage: '0'
|
||||
secrets: inherit
|
||||
|
||||
macos-arm64:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||
needs: checkout-macos
|
||||
with:
|
||||
build-runs-on: macos-14-xlarge
|
||||
check-runs-on: macos-14
|
||||
test-runs-on: macos-14
|
||||
target-platform: macos
|
||||
target-arch: arm64
|
||||
is-release: false
|
||||
gn-build-type: testing
|
||||
generate-symbols: false
|
||||
upload-to-storage: '0'
|
||||
secrets: inherit
|
||||
|
||||
linux-x64:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
uses: ./.github/workflows/pipeline-electron-build-and-test-and-nan.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
check-runs-on: electron-arc-linux-amd64-8core
|
||||
test-runs-on: electron-arc-linux-amd64-4core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
test-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root --privileged --init"}'
|
||||
target-platform: linux
|
||||
target-arch: x64
|
||||
is-release: false
|
||||
gn-build-type: testing
|
||||
generate-symbols: false
|
||||
upload-to-storage: '0'
|
||||
secrets: inherit
|
||||
|
||||
linux-x64-asan:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
check-runs-on: electron-arc-linux-amd64-8core
|
||||
test-runs-on: electron-arc-linux-amd64-4core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
test-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root --privileged --init"}'
|
||||
target-platform: linux
|
||||
target-arch: x64
|
||||
is-release: false
|
||||
gn-build-type: testing
|
||||
generate-symbols: false
|
||||
upload-to-storage: '0'
|
||||
is-asan: true
|
||||
secrets: inherit
|
||||
|
||||
linux-arm:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
check-runs-on: electron-arc-linux-amd64-8core
|
||||
test-runs-on: electron-arc-linux-arm64-4core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
test-container: '{"image":"ghcr.io/electron/test:arm32v7-${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root --privileged --init","volumes":["/home/runner/externals:/mnt/runner-externals"]}'
|
||||
target-platform: linux
|
||||
target-arch: arm
|
||||
is-release: false
|
||||
gn-build-type: testing
|
||||
generate-symbols: false
|
||||
upload-to-storage: '0'
|
||||
secrets: inherit
|
||||
|
||||
linux-arm64:
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
check-runs-on: electron-arc-linux-amd64-8core
|
||||
test-runs-on: electron-arc-linux-arm64-4core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
test-container: '{"image":"ghcr.io/electron/test:arm64v8-${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root --privileged --init"}'
|
||||
target-platform: linux
|
||||
target-arch: arm64
|
||||
is-release: false
|
||||
gn-build-type: testing
|
||||
generate-symbols: false
|
||||
upload-to-storage: '0'
|
||||
secrets: inherit
|
||||
14
.github/workflows/config/gclient.diff
vendored
Normal file
14
.github/workflows/config/gclient.diff
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
diff --git a/gclient.py b/gclient.py
|
||||
index 59e2b4c5197928bdba1ef69bdbe637d7dfe471c1..b4bae5e48c83c84bd867187afaf40eed16e69851 100755
|
||||
--- a/gclient.py
|
||||
+++ b/gclient.py
|
||||
@@ -783,7 +783,8 @@ class Dependency(gclient_utils.WorkItem, DependencySettings):
|
||||
not condition or "non_git_source" not in condition):
|
||||
continue
|
||||
cipd_root = self.GetCipdRoot()
|
||||
- for package in dep_value.get('packages', []):
|
||||
+ packages = dep_value.get('packages', [])
|
||||
+ for package in (x for x in packages if "infra/3pp/tools/swift-format" not in x.get('package')):
|
||||
deps_to_add.append(
|
||||
CipdDependency(parent=self,
|
||||
name=name,
|
||||
86
.github/workflows/linux-publish.yml
vendored
Normal file
86
.github/workflows/linux-publish.yml
vendored
Normal file
@@ -0,0 +1,86 @@
|
||||
name: Publish Linux
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
build-image-sha:
|
||||
type: string
|
||||
description: 'SHA for electron/build image'
|
||||
default: 'cf814a4d2501e8e843caea071a6b70a48e78b855'
|
||||
upload-to-storage:
|
||||
description: 'Uploads to Azure storage'
|
||||
required: false
|
||||
default: '1'
|
||||
type: string
|
||||
run-linux-publish:
|
||||
description: 'Run the publish jobs vs just the build jobs'
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
checkout-linux:
|
||||
runs-on: electron-arc-linux-amd64-32core
|
||||
container:
|
||||
image: ghcr.io/electron/build:${{ inputs.build-image-sha }}
|
||||
options: --user root
|
||||
volumes:
|
||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||
- /var/run/sas:/var/run/sas
|
||||
env:
|
||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Checkout & Sync & Save
|
||||
uses: ./src/electron/.github/actions/checkout
|
||||
|
||||
publish-x64:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
environment: production-release
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ inputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
target-platform: linux
|
||||
target-arch: x64
|
||||
is-release: true
|
||||
gn-build-type: release
|
||||
generate-symbols: true
|
||||
strip-binaries: true
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
secrets: inherit
|
||||
|
||||
publish-arm:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
environment: production-release
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ inputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
target-platform: linux
|
||||
target-arch: arm
|
||||
is-release: true
|
||||
gn-build-type: release
|
||||
generate-symbols: true
|
||||
strip-binaries: true
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
secrets: inherit
|
||||
|
||||
publish-arm64:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
needs: checkout-linux
|
||||
with:
|
||||
environment: production-release
|
||||
build-runs-on: electron-arc-linux-amd64-32core
|
||||
build-container: '{"image":"ghcr.io/electron/build:${{ inputs.build-image-sha }}","options":"--user root","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
||||
target-platform: linux
|
||||
target-arch: arm64
|
||||
is-release: true
|
||||
gn-build-type: release
|
||||
generate-symbols: true
|
||||
strip-binaries: true
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
secrets: inherit
|
||||
69
.github/workflows/macos-publish.yml
vendored
Normal file
69
.github/workflows/macos-publish.yml
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
name: Publish MacOS
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
build-image-sha:
|
||||
type: string
|
||||
description: 'SHA for electron/build image'
|
||||
default: 'cf814a4d2501e8e843caea071a6b70a48e78b855'
|
||||
required: true
|
||||
upload-to-storage:
|
||||
description: 'Uploads to Azure storage'
|
||||
required: false
|
||||
default: '1'
|
||||
type: string
|
||||
run-macos-publish:
|
||||
description: 'Run the publish jobs vs just the build jobs'
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
jobs:
|
||||
checkout-macos:
|
||||
runs-on: electron-arc-linux-amd64-32core
|
||||
container:
|
||||
image: ghcr.io/electron/build:${{ inputs.build-image-sha }}
|
||||
options: --user root
|
||||
volumes:
|
||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||
- /var/run/sas:/var/run/sas
|
||||
env:
|
||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Checkout & Sync & Save
|
||||
uses: ./src/electron/.github/actions/checkout
|
||||
with:
|
||||
generate-sas-token: 'true'
|
||||
|
||||
publish-x64:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
needs: checkout-macos
|
||||
with:
|
||||
environment: production-release
|
||||
build-runs-on: macos-14-xlarge
|
||||
target-platform: macos
|
||||
target-arch: x64
|
||||
is-release: true
|
||||
gn-build-type: release
|
||||
generate-symbols: true
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
secrets: inherit
|
||||
|
||||
publish-arm64:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
needs: checkout-macos
|
||||
with:
|
||||
environment: production-release
|
||||
build-runs-on: macos-14-xlarge
|
||||
target-platform: macos
|
||||
target-arch: arm64
|
||||
is-release: true
|
||||
gn-build-type: release
|
||||
generate-symbols: true
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
secrets: inherit
|
||||
107
.github/workflows/pipeline-electron-build-and-test-and-nan.yml
vendored
Normal file
107
.github/workflows/pipeline-electron-build-and-test-and-nan.yml
vendored
Normal file
@@ -0,0 +1,107 @@
|
||||
name: Electron Build & Test (+ Node + NaN) Pipeline
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target-platform:
|
||||
type: string
|
||||
description: 'Platform to run on, can be macos or linux'
|
||||
required: true
|
||||
target-arch:
|
||||
type: string
|
||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
||||
required: true
|
||||
build-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the build'
|
||||
required: true
|
||||
check-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the gn-check'
|
||||
required: true
|
||||
test-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the tests on'
|
||||
required: true
|
||||
build-container:
|
||||
type: string
|
||||
description: 'JSON container information for aks runs-on'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
test-container:
|
||||
type: string
|
||||
description: 'JSON container information for testing'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
is-release:
|
||||
description: 'Whether this build job is a release job'
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
gn-build-type:
|
||||
description: 'The gn build type - testing or release'
|
||||
required: true
|
||||
type: string
|
||||
default: testing
|
||||
generate-symbols:
|
||||
description: 'Whether or not to generate symbols'
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
upload-to-storage:
|
||||
description: 'Whether or not to upload build artifacts to external storage'
|
||||
required: true
|
||||
type: string
|
||||
default: '0'
|
||||
is-asan:
|
||||
description: 'Building the Address Sanitizer (ASan) Linux build'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: electron-build-and-test-and-nan-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
with:
|
||||
build-runs-on: ${{ inputs.build-runs-on }}
|
||||
build-container: ${{ inputs.build-container }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
is-release: ${{ inputs.is-release }}
|
||||
gn-build-type: ${{ inputs.gn-build-type }}
|
||||
generate-symbols: ${{ inputs.generate-symbols }}
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
secrets: inherit
|
||||
gn-check:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-gn-check.yml
|
||||
with:
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
check-runs-on: ${{ inputs.check-runs-on }}
|
||||
check-container: ${{ inputs.build-container }}
|
||||
gn-build-type: ${{ inputs.gn-build-type }}
|
||||
is-asan: ${{ inputs.is-asan }}
|
||||
secrets: inherit
|
||||
test:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-test.yml
|
||||
needs: build
|
||||
with:
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
test-runs-on: ${{ inputs.test-runs-on }}
|
||||
test-container: ${{ inputs.test-container }}
|
||||
secrets: inherit
|
||||
nn-test:
|
||||
uses: ./.github/workflows/pipeline-segment-node-nan-test.yml
|
||||
needs: build
|
||||
with:
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
test-runs-on: ${{ inputs.test-runs-on }}
|
||||
test-container: ${{ inputs.test-container }}
|
||||
gn-build-type: ${{ inputs.gn-build-type }}
|
||||
secrets: inherit
|
||||
104
.github/workflows/pipeline-electron-build-and-test.yml
vendored
Normal file
104
.github/workflows/pipeline-electron-build-and-test.yml
vendored
Normal file
@@ -0,0 +1,104 @@
|
||||
name: Electron Build & Test Pipeline
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target-platform:
|
||||
type: string
|
||||
description: 'Platform to run on, can be macos or linux'
|
||||
required: true
|
||||
target-arch:
|
||||
type: string
|
||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
||||
required: true
|
||||
build-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the build'
|
||||
required: true
|
||||
check-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the gn-check'
|
||||
required: true
|
||||
test-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the tests on'
|
||||
required: true
|
||||
build-container:
|
||||
type: string
|
||||
description: 'JSON container information for aks runs-on'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
test-container:
|
||||
type: string
|
||||
description: 'JSON container information for testing'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
is-release:
|
||||
description: 'Whether this build job is a release job'
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
gn-build-type:
|
||||
description: 'The gn build type - testing or release'
|
||||
required: true
|
||||
type: string
|
||||
default: testing
|
||||
generate-symbols:
|
||||
description: 'Whether or not to generate symbols'
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
upload-to-storage:
|
||||
description: 'Whether or not to upload build artifacts to external storage'
|
||||
required: true
|
||||
type: string
|
||||
default: '0'
|
||||
is-asan:
|
||||
description: 'Building the Address Sanitizer (ASan) Linux build'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: electron-build-and-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
|
||||
jobs:
|
||||
build:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||
with:
|
||||
build-runs-on: ${{ inputs.build-runs-on }}
|
||||
build-container: ${{ inputs.build-container }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
is-release: ${{ inputs.is-release }}
|
||||
gn-build-type: ${{ inputs.gn-build-type }}
|
||||
generate-symbols: ${{ inputs.generate-symbols }}
|
||||
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||
is-asan: ${{ inputs.is-asan}}
|
||||
secrets: inherit
|
||||
gn-check:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-gn-check.yml
|
||||
with:
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
check-runs-on: ${{ inputs.check-runs-on }}
|
||||
check-container: ${{ inputs.build-container }}
|
||||
gn-build-type: ${{ inputs.gn-build-type }}
|
||||
is-asan: ${{ inputs.is-asan }}
|
||||
secrets: inherit
|
||||
test:
|
||||
uses: ./.github/workflows/pipeline-segment-electron-test.yml
|
||||
needs: build
|
||||
with:
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
test-runs-on: ${{ inputs.test-runs-on }}
|
||||
test-container: ${{ inputs.test-container }}
|
||||
is-asan: ${{ inputs.is-asan}}
|
||||
secrets: inherit
|
||||
43
.github/workflows/pipeline-electron-docs-only.yml
vendored
Normal file
43
.github/workflows/pipeline-electron-docs-only.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Electron Docs Compile
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
container:
|
||||
required: true
|
||||
description: 'Container to run the docs-only ts compile in'
|
||||
type: string
|
||||
|
||||
concurrency:
|
||||
group: electron-docs-only-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
docs-only:
|
||||
name: Docs Only Compile
|
||||
runs-on: electron-arc-linux-amd64-4core
|
||||
timeout-minutes: 20
|
||||
container: ${{ fromJSON(inputs.container) }}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Run TS/JS compile
|
||||
shell: bash
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn create-typescript-definitions
|
||||
node script/yarn tsc -p tsconfig.default_app.json --noEmit
|
||||
for f in build/webpack/*.js
|
||||
do
|
||||
out="${f:29}"
|
||||
if [ "$out" != "base.js" ]; then
|
||||
node script/yarn webpack --config $f --output-filename=$out --output-path=./.tmp --env mode=development
|
||||
fi
|
||||
done
|
||||
@@ -1,40 +1,65 @@
|
||||
executor:
|
||||
name: linux-docker
|
||||
size: medium
|
||||
steps:
|
||||
- checkout:
|
||||
path: src/electron
|
||||
- run:
|
||||
name: Setup third_party Depot Tools
|
||||
command: |
|
||||
name: Electron Lint
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
container:
|
||||
required: true
|
||||
description: 'Container to run lint in'
|
||||
type: string
|
||||
|
||||
concurrency:
|
||||
group: electron-lint-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
||||
|
||||
jobs:
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: electron-arc-linux-amd64-4core
|
||||
timeout-minutes: 20
|
||||
container: ${{ fromJSON(inputs.container) }}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Setup third_party Depot Tools
|
||||
shell: bash
|
||||
run: |
|
||||
# "depot_tools" has to be checkout into "//third_party/depot_tools" so pylint.py can a "pylintrc" file.
|
||||
git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git src/third_party/depot_tools
|
||||
echo 'export PATH="$PATH:'"$PWD"'/src/third_party/depot_tools"' >> $BASH_ENV
|
||||
- run:
|
||||
name: Download GN Binary
|
||||
command: |
|
||||
echo "$(pwd)/src/third_party/depot_tools" >> $GITHUB_PATH
|
||||
- name: Download GN Binary
|
||||
shell: bash
|
||||
run: |
|
||||
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
||||
gn_version="$(curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/DEPS?format=TEXT" | base64 -d | grep gn_version | head -n1 | cut -d\' -f4)"
|
||||
|
||||
cipd ensure -ensure-file - -root . \<<-CIPD
|
||||
cipd ensure -ensure-file - -root . <<-CIPD
|
||||
\$ServiceURL https://chrome-infra-packages.appspot.com/
|
||||
@Subdir src/buildtools/linux64
|
||||
gn/gn/linux-amd64 $gn_version
|
||||
CIPD
|
||||
|
||||
echo 'export CHROMIUM_BUILDTOOLS_PATH="'"$PWD"'/src/buildtools"' >> $BASH_ENV
|
||||
- run:
|
||||
name: Download clang-format Binary
|
||||
command: |
|
||||
buildtools_path="$(pwd)/src/buildtools"
|
||||
echo "CHROMIUM_BUILDTOOLS_PATH=$buildtools_path" >> $GITHUB_ENV
|
||||
- name: Download clang-format Binary
|
||||
shell: bash
|
||||
run: |
|
||||
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
||||
|
||||
sha1_path='buildtools/linux64/clang-format.sha1'
|
||||
curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/${sha1_path}?format=TEXT" | base64 -d > "src/${sha1_path}"
|
||||
|
||||
download_from_google_storage.py --no_resume --no_auth --bucket chromium-clang-format -s "src/${sha1_path}"
|
||||
- run:
|
||||
name: Run Lint
|
||||
command: |
|
||||
- name: Run Lint
|
||||
shell: bash
|
||||
run: |
|
||||
# gn.py tries to find a gclient root folder starting from the current dir.
|
||||
# When it fails and returns "None" path, the whole script fails. Let's "fix" it.
|
||||
touch .gclient
|
||||
@@ -44,8 +69,9 @@ steps:
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
node script/yarn lint
|
||||
- run:
|
||||
name: Run Script Typechecker
|
||||
command: |
|
||||
- name: Run Script Typechecker
|
||||
shell: bash
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn tsc -p tsconfig.script.json
|
||||
|
||||
217
.github/workflows/pipeline-segment-electron-build.yml
vendored
Normal file
217
.github/workflows/pipeline-segment-electron-build.yml
vendored
Normal file
@@ -0,0 +1,217 @@
|
||||
name: Pipeline Segment - Electron Build
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
environment:
|
||||
description: using the production or testing environment
|
||||
required: false
|
||||
type: string
|
||||
target-platform:
|
||||
type: string
|
||||
description: 'Platform to run on, can be macos or linux'
|
||||
required: true
|
||||
target-arch:
|
||||
type: string
|
||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
||||
required: true
|
||||
build-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the build'
|
||||
required: true
|
||||
build-container:
|
||||
type: string
|
||||
description: 'JSON container information for aks runs-on'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
is-release:
|
||||
description: 'Whether this build job is a release job'
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
gn-build-type:
|
||||
description: 'The gn build type - testing or release'
|
||||
required: true
|
||||
type: string
|
||||
default: testing
|
||||
generate-symbols:
|
||||
description: 'Whether or not to generate symbols'
|
||||
required: true
|
||||
type: boolean
|
||||
default: false
|
||||
upload-to-storage:
|
||||
description: 'Whether or not to upload build artifacts to external storage'
|
||||
required: true
|
||||
type: string
|
||||
default: '0'
|
||||
strip-binaries:
|
||||
description: 'Strip the binaries before release (Linux only)'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
is-asan:
|
||||
description: 'Building the Address Sanitizer (ASan) Linux build'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
|
||||
concurrency:
|
||||
group: electron-build-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
||||
|
||||
env:
|
||||
ELECTRON_ARTIFACTS_BLOB_STORAGE: ${{ secrets.ELECTRON_ARTIFACTS_BLOB_STORAGE }}
|
||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||
ELECTRON_GITHUB_TOKEN: ${{ secrets.ELECTRON_GITHUB_TOKEN }}
|
||||
GCLIENT_EXTRA_ARGS: ${{ inputs.target-platform == 'macos' && '--custom-var=checkout_mac=True --custom-var=host_os=mac' || '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True' }}
|
||||
ELECTRON_OUT_DIR: Default
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ inputs.build-runs-on }}
|
||||
container: ${{ fromJSON(inputs.build-container) }}
|
||||
environment: ${{ inputs.environment }}
|
||||
env:
|
||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||
steps:
|
||||
- name: Create src dir
|
||||
run: mkdir src
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Free up space (macOS)
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: ./src/electron/.github/actions/free-space-macos
|
||||
- name: Check disk space after freeing up space
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
run: df -h
|
||||
- name: Setup Node.js/npm
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8
|
||||
with:
|
||||
node-version: 20.11.x
|
||||
cache: yarn
|
||||
cache-dependency-path: src/electron/yarn.lock
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Install AZCopy
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
run: brew install azcopy
|
||||
- name: Set GN_EXTRA_ARGS for Linux
|
||||
if: ${{ inputs.target-platform == 'linux' }}
|
||||
run: |
|
||||
if [ "${{ inputs.target-arch }}" = "arm" ]; then
|
||||
if [ "${{ inputs.is-release }}" = true ]; then
|
||||
GN_EXTRA_ARGS='target_cpu="arm" build_tflite_with_xnnpack=false symbol_level=1'
|
||||
else
|
||||
GN_EXTRA_ARGS='target_cpu="arm" build_tflite_with_xnnpack=false'
|
||||
fi
|
||||
elif [ "${{ inputs.target-arch }}" = "arm64" ]; then
|
||||
GN_EXTRA_ARGS='target_cpu="arm64" fatal_linker_warnings=false enable_linux_installer=false'
|
||||
elif [ "${{ inputs.is-asan }}" = true ]; then
|
||||
GN_EXTRA_ARGS='is_asan=true'
|
||||
fi
|
||||
echo "GN_EXTRA_ARGS=$GN_EXTRA_ARGS" >> $GITHUB_ENV
|
||||
- name: Get Depot Tools
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
|
||||
SEDOPTION="-i"
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
SEDOPTION="-i ''"
|
||||
fi
|
||||
|
||||
# remove ninjalog_uploader_wrapper.py from autoninja since we don't use it and it causes problems
|
||||
sed $SEDOPTION '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
|
||||
# Ensure depot_tools does not update.
|
||||
test -d depot_tools && cd depot_tools
|
||||
if [ "`uname`" = "Linux" ]; then
|
||||
git apply --3way ../src/electron/.github/workflows/config/gclient.diff
|
||||
fi
|
||||
touch .disable_auto_update
|
||||
- name: Add Depot Tools to PATH
|
||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
||||
- name: Generate DEPS Hash
|
||||
run: |
|
||||
node src/electron/script/generate-deps-hash.js && cat src/electron/.depshash-target
|
||||
DEPSHASH=v1-src-cache-$(shasum src/electron/.depshash | cut -f1 -d' ')
|
||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||
- name: Restore src cache via AZCopy
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: ./src/electron/.github/actions/restore-cache-azcopy
|
||||
- name: Restore src cache via AKS
|
||||
if: ${{ inputs.target-platform == 'linux' }}
|
||||
uses: ./src/electron/.github/actions/restore-cache-aks
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Install Build Tools
|
||||
uses: ./src/electron/.github/actions/install-build-tools
|
||||
- name: Init Build Tools
|
||||
run: |
|
||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }} --only-sdk
|
||||
- name: Run Electron Only Hooks
|
||||
run: |
|
||||
gclient runhooks --spec="solutions=[{'name':'src/electron','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':False},'managed':False}]"
|
||||
- name: Regenerate DEPS Hash
|
||||
run: |
|
||||
(cd src/electron && git checkout .) && node src/electron/script/generate-deps-hash.js && cat src/electron/.depshash-target
|
||||
echo "DEPSHASH=$(shasum src/electron/.depshash | cut -f1 -d' ')" >> $GITHUB_ENV
|
||||
- name: Add CHROMIUM_BUILDTOOLS_PATH to env
|
||||
run: echo "CHROMIUM_BUILDTOOLS_PATH=$(pwd)/src/buildtools" >> $GITHUB_ENV
|
||||
- name: Fix Sync (macOS)
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: ./src/electron/.github/actions/fix-sync-macos
|
||||
- name: Install build-tools & Setup RBE
|
||||
run: |
|
||||
echo "NUMBER_OF_NINJA_PROCESSES=${{ inputs.target-platform == 'linux' && '300' || '200' }}" >> $GITHUB_ENV
|
||||
cd ~/.electron_build_tools
|
||||
npx yarn --ignore-engines
|
||||
# Pull down credential helper and print status
|
||||
node -e "require('./src/utils/reclient.js').downloadAndPrepare({})"
|
||||
HELPER=$(node -p "require('./src/utils/reclient.js').helperPath({})")
|
||||
$HELPER login
|
||||
echo 'RBE_service='`node -e "console.log(require('./src/utils/reclient.js').serviceAddress)"` >> $GITHUB_ENV
|
||||
echo 'RBE_experimental_credentials_helper='`node -e "console.log(require('./src/utils/reclient.js').helperPath({}))"` >> $GITHUB_ENV
|
||||
echo 'RBE_experimental_credentials_helper_args=print' >> $GITHUB_ENV
|
||||
- name: Free up space (macOS)
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: ./src/electron/.github/actions/free-space-macos
|
||||
- name: Build Electron
|
||||
uses: ./src/electron/.github/actions/build-electron
|
||||
with:
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
artifact-platform: ${{ inputs.target-platform == 'linux' && 'linux' || 'darwin' }}
|
||||
is-release: '${{ inputs.is-release }}'
|
||||
generate-symbols: '${{ inputs.generate-symbols }}'
|
||||
strip-binaries: '${{ inputs.strip-binaries }}'
|
||||
upload-to-storage: '${{ inputs.upload-to-storage }}'
|
||||
is-asan: '${{ inputs.is-asan }}'
|
||||
- name: Set GN_EXTRA_ARGS for MAS Build
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
run: |
|
||||
echo "MAS_BUILD=true" >> $GITHUB_ENV
|
||||
GN_EXTRA_ARGS='is_mas_build=true'
|
||||
echo "GN_EXTRA_ARGS=$GN_EXTRA_ARGS" >> $GITHUB_ENV
|
||||
- name: Build Electron (MAS)
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: ./src/electron/.github/actions/build-electron
|
||||
with:
|
||||
target-arch: ${{ inputs.target-arch }}
|
||||
target-platform: ${{ inputs.target-platform }}
|
||||
artifact-platform: 'mas'
|
||||
is-release: '${{ inputs.is-release }}'
|
||||
generate-symbols: '${{ inputs.generate-symbols }}'
|
||||
upload-to-storage: '${{ inputs.upload-to-storage }}'
|
||||
step-suffix: '(mas)'
|
||||
158
.github/workflows/pipeline-segment-electron-gn-check.yml
vendored
Normal file
158
.github/workflows/pipeline-segment-electron-gn-check.yml
vendored
Normal file
@@ -0,0 +1,158 @@
|
||||
name: Pipeline Segment - Electron GN Check
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target-platform:
|
||||
type: string
|
||||
description: 'Platform to run on, can be macos or linux'
|
||||
required: true
|
||||
target-arch:
|
||||
type: string
|
||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
||||
required: true
|
||||
check-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the tests on'
|
||||
required: true
|
||||
check-container:
|
||||
type: string
|
||||
description: 'JSON container information for aks runs-on'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
gn-build-type:
|
||||
description: 'The gn build type - testing or release'
|
||||
required: true
|
||||
type: string
|
||||
default: testing
|
||||
is-asan:
|
||||
description: 'Building the Address Sanitizer (ASan) Linux build'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: electron-gn-check-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||
GCLIENT_EXTRA_ARGS: ${{ inputs.target-platform == 'macos' && '--custom-var=checkout_mac=True --custom-var=host_os=mac' || '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True' }}
|
||||
ELECTRON_OUT_DIR: Default
|
||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||
|
||||
jobs:
|
||||
gn-check:
|
||||
# TODO(codebytere): Change this to medium VM
|
||||
runs-on: ${{ inputs.check-runs-on }}
|
||||
container: ${{ fromJSON(inputs.check-container) }}
|
||||
env:
|
||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Cleanup disk space on macOS
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
shell: bash
|
||||
run: |
|
||||
sudo mkdir -p $TMPDIR/del-target
|
||||
|
||||
tmpify() {
|
||||
if [ -d "$1" ]; then
|
||||
sudo mv "$1" $TMPDIR/del-target/$(echo $1|shasum -a 256|head -n1|cut -d " " -f1)
|
||||
fi
|
||||
}
|
||||
tmpify /Library/Developer/CoreSimulator
|
||||
tmpify ~/Library/Developer/CoreSimulator
|
||||
sudo rm -rf $TMPDIR/del-target
|
||||
- name: Check disk space after freeing up space
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
run: df -h
|
||||
- name: Install Build Tools
|
||||
uses: ./src/electron/.github/actions/install-build-tools
|
||||
- name: Init Build Tools
|
||||
run: |
|
||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }} --only-sdk
|
||||
- name: Get Depot Tools
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
|
||||
SEDOPTION="-i"
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
SEDOPTION="-i ''"
|
||||
fi
|
||||
|
||||
# remove ninjalog_uploader_wrapper.py from autoninja since we don't use it and it causes problems
|
||||
sed $SEDOPTION '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
|
||||
# Ensure depot_tools does not update.
|
||||
test -d depot_tools && cd depot_tools
|
||||
if [ "`uname`" = "Linux" ]; then
|
||||
git apply --3way ../src/electron/.github/workflows/config/gclient.diff
|
||||
fi
|
||||
touch .disable_auto_update
|
||||
- name: Add Depot Tools to PATH
|
||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
||||
- name: Set GN_EXTRA_ARGS for Linux
|
||||
if: ${{ inputs.target-platform == 'linux' }}
|
||||
run: |
|
||||
if [ "${{ inputs.target-arch }}" = "arm" ]; then
|
||||
GN_EXTRA_ARGS='build_tflite_with_xnnpack=false'
|
||||
elif [ "${{ inputs.target-arch }}" = "arm64" ]; then
|
||||
GN_EXTRA_ARGS='fatal_linker_warnings=false enable_linux_installer=false'
|
||||
fi
|
||||
echo "GN_EXTRA_ARGS=$GN_EXTRA_ARGS" >> $GITHUB_ENV
|
||||
- name: Generate DEPS Hash
|
||||
run: |
|
||||
node src/electron/script/generate-deps-hash.js && cat src/electron/.depshash-target
|
||||
DEPSHASH=v1-src-cache-$(shasum src/electron/.depshash | cut -f1 -d' ')
|
||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||
- name: Restore src cache via AZCopy
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
uses: ./src/electron/.github/actions/restore-cache-azcopy
|
||||
- name: Restore src cache via AKS
|
||||
if: ${{ inputs.target-platform == 'linux' }}
|
||||
uses: ./src/electron/.github/actions/restore-cache-aks
|
||||
- name: Run Electron Only Hooks
|
||||
run: |
|
||||
gclient runhooks --spec="solutions=[{'name':'src/electron','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':False},'managed':False}]"
|
||||
- name: Regenerate DEPS Hash
|
||||
run: |
|
||||
(cd src/electron && git checkout .) && node src/electron/script/generate-deps-hash.js && cat src/electron/.depshash-target
|
||||
echo "DEPSHASH=$(shasum src/electron/.depshash | cut -f1 -d' ')" >> $GITHUB_ENV
|
||||
- name: Add CHROMIUM_BUILDTOOLS_PATH to env
|
||||
run: echo "CHROMIUM_BUILDTOOLS_PATH=$(pwd)/src/buildtools" >> $GITHUB_ENV
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Default GN gen
|
||||
run: |
|
||||
cd src/electron
|
||||
git pack-refs
|
||||
cd ..
|
||||
|
||||
e build --only-gen
|
||||
- name: Run GN Check
|
||||
run: |
|
||||
cd src
|
||||
gn check out/Default //electron:electron_lib
|
||||
gn check out/Default //electron:electron_app
|
||||
gn check out/Default //electron/shell/common/api:mojo
|
||||
|
||||
# Check the hunspell filenames
|
||||
node electron/script/gen-hunspell-filenames.js --check
|
||||
node electron/script/gen-libc++-filenames.js --check
|
||||
- name: Wait for active SSH sessions
|
||||
if: always() && !cancelled()
|
||||
run: |
|
||||
while [ -f /var/.ssh-lock ]
|
||||
do
|
||||
sleep 60
|
||||
done
|
||||
196
.github/workflows/pipeline-segment-electron-test.yml
vendored
Normal file
196
.github/workflows/pipeline-segment-electron-test.yml
vendored
Normal file
@@ -0,0 +1,196 @@
|
||||
name: Pipeline Segment - Electron Test
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target-platform:
|
||||
type: string
|
||||
description: 'Platform to run on, can be macos or linux'
|
||||
required: true
|
||||
target-arch:
|
||||
type: string
|
||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
||||
required: true
|
||||
test-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the tests on'
|
||||
required: true
|
||||
test-container:
|
||||
type: string
|
||||
description: 'JSON container information for aks runs-on'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
is-asan:
|
||||
description: 'Building the Address Sanitizer (ASan) Linux build'
|
||||
required: false
|
||||
type: boolean
|
||||
default: false
|
||||
|
||||
concurrency:
|
||||
group: electron-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
issues: read
|
||||
pull-requests: read
|
||||
|
||||
env:
|
||||
ELECTRON_OUT_DIR: Default
|
||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||
ELECTRON_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ${{ inputs.test-runs-on }}
|
||||
container: ${{ fromJSON(inputs.test-container) }}
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
build-type: ${{ inputs.target-platform == 'macos' && fromJSON('["darwin","mas"]') || fromJSON('["linux"]') }}
|
||||
shard: ${{ inputs.target-platform == 'macos' && fromJSON('[1, 2]') || fromJSON('[1, 2, 3]') }}
|
||||
env:
|
||||
BUILD_TYPE: ${{ matrix.build-type }}
|
||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||
ARTIFACT_KEY: ${{ matrix.build-type }}_${{ inputs.target-arch }}
|
||||
steps:
|
||||
- name: Fix node20 on arm32 runners
|
||||
if: ${{ inputs.target-arch == 'arm' }}
|
||||
run: |
|
||||
cp $(which node) /mnt/runner-externals/node20/bin/
|
||||
- name: Add TCC permissions on macOS
|
||||
if: ${{ inputs.target-platform == 'macos' }}
|
||||
run: |
|
||||
configure_user_tccdb () {
|
||||
local values=$1
|
||||
local dbPath="$HOME/Library/Application Support/com.apple.TCC/TCC.db"
|
||||
local sqlQuery="INSERT OR REPLACE INTO access VALUES($values);"
|
||||
sqlite3 "$dbPath" "$sqlQuery"
|
||||
}
|
||||
|
||||
configure_sys_tccdb () {
|
||||
local values=$1
|
||||
local dbPath="/Library/Application Support/com.apple.TCC/TCC.db"
|
||||
local sqlQuery="INSERT OR REPLACE INTO access VALUES($values);"
|
||||
sudo sqlite3 "$dbPath" "$sqlQuery"
|
||||
}
|
||||
|
||||
userValuesArray=(
|
||||
"'kTCCServiceMicrophone','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159"
|
||||
"'kTCCServiceCamera','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159"
|
||||
"'kTCCServiceBluetoothAlways','/usr/local/opt/runner/provisioner/provisioner',1,2,4,1,NULL,NULL,0,'UNUSED',NULL,0,1687786159"
|
||||
)
|
||||
for values in "${userValuesArray[@]}"; do
|
||||
# Sonoma and higher have a few extra values
|
||||
# Ref: https://github.com/actions/runner-images/blob/main/images/macos/scripts/build/configure-tccdb-macos.sh
|
||||
if [ "$OSTYPE" = "darwin23" ]; then
|
||||
configure_user_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}"
|
||||
configure_sys_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}"
|
||||
else
|
||||
configure_user_tccdb "$values"
|
||||
configure_sys_tccdb "$values"
|
||||
fi
|
||||
done
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Get Depot Tools
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
# remove ninjalog_uploader_wrapper.py from autoninja since we don't use it and it causes problems
|
||||
sed -i '' '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
else
|
||||
sed -i '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
# Remove swift-format dep from cipd on macOS until we send a patch upstream.
|
||||
cd depot_tools
|
||||
git apply --3way ../src/electron/.github/workflows/config/gclient.diff
|
||||
fi
|
||||
# Ensure depot_tools does not update.
|
||||
test -d depot_tools && cd depot_tools
|
||||
touch .disable_auto_update
|
||||
- name: Add Depot Tools to PATH
|
||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
||||
- name: Load ASan specific environment variables
|
||||
if: ${{ inputs.is-asan == true }}
|
||||
run: |
|
||||
echo "ARTIFACT_KEY=${{ matrix.build-type }}_${{ inputs.target-arch }}_asan" >> $GITHUB_ENV
|
||||
echo "DISABLE_CRASH_REPORTER_TESTS=true" >> $GITHUB_ENV
|
||||
echo "IS_ASAN=true" >> $GITHUB_ENV
|
||||
- name: Download Generated Artifacts
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||
with:
|
||||
name: generated_artifacts_${{ env.ARTIFACT_KEY }}
|
||||
path: ./generated_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }}
|
||||
- name: Download Src Artifacts
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||
with:
|
||||
name: src_artifacts_${{ env.ARTIFACT_KEY }}
|
||||
path: ./src_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }}
|
||||
- name: Restore Generated Artifacts
|
||||
run: ./src/electron/script/actions/restore-artifacts.sh
|
||||
- name: Unzip Dist, Mksnapshot & Chromedriver
|
||||
run: |
|
||||
cd src/out/Default
|
||||
unzip -:o dist.zip
|
||||
unzip -:o chromedriver.zip
|
||||
unzip -:o mksnapshot.zip
|
||||
- name: Import & Trust Self-Signed Codesigning Cert on MacOS
|
||||
if: ${{ inputs.target-platform == 'macos' && inputs.target-arch == 'x64' }}
|
||||
run: |
|
||||
sudo security authorizationdb write com.apple.trust-settings.admin allow
|
||||
cd src/electron
|
||||
./script/codesign/generate-identity.sh
|
||||
- name: Run Electron Tests
|
||||
shell: bash
|
||||
env:
|
||||
MOCHA_REPORTER: mocha-multi-reporters
|
||||
ELECTRON_TEST_RESULTS_DIR: junit
|
||||
MOCHA_MULTI_REPORTERS: mocha-junit-reporter, tap
|
||||
ELECTRON_DISABLE_SECURITY_WARNINGS: 1
|
||||
ELECTRON_SKIP_NATIVE_MODULE_TESTS: true
|
||||
DISPLAY: ':99.0'
|
||||
run: |
|
||||
cd src/electron
|
||||
# Get which tests are on this shard
|
||||
tests_files=$(node script/split-tests ${{ matrix.shard }} ${{ inputs.target-platform == 'macos' && 2 || 3 }})
|
||||
|
||||
# Run tests
|
||||
if [ "`uname`" = "Darwin" ]; then
|
||||
echo "About to start tests"
|
||||
node script/yarn test --runners=main --trace-uncaught --enable-logging --files $tests_files
|
||||
else
|
||||
chown :builduser .. && chmod g+w ..
|
||||
chown -R :builduser . && chmod -R g+w .
|
||||
chmod 4755 ../out/Default/chrome-sandbox
|
||||
runuser -u builduser -- git config --global --add safe.directory $(pwd)
|
||||
if [ "${{ inputs.is-asan }}" == "true" ]; then
|
||||
cd ..
|
||||
ASAN_SYMBOLIZE="$PWD/tools/valgrind/asan/asan_symbolize.py --executable-path=$PWD/out/Default/electron"
|
||||
export ASAN_OPTIONS="symbolize=0 handle_abort=1"
|
||||
export G_SLICE=always-malloc
|
||||
export NSS_DISABLE_ARENA_FREE_LIST=1
|
||||
export NSS_DISABLE_UNLOAD=1
|
||||
export LLVM_SYMBOLIZER_PATH=$PWD/third_party/llvm-build/Release+Asserts/bin/llvm-symbolizer
|
||||
export MOCHA_TIMEOUT=180000
|
||||
echo "Piping output to ASAN_SYMBOLIZE ($ASAN_SYMBOLIZE)"
|
||||
cd electron
|
||||
runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn test --runners=main --trace-uncaught --enable-logging --files $tests_files | $ASAN_SYMBOLIZE
|
||||
else
|
||||
runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn test --runners=main --trace-uncaught --enable-logging --files $tests_files
|
||||
fi
|
||||
fi
|
||||
- name: Wait for active SSH sessions
|
||||
if: always() && !cancelled()
|
||||
run: |
|
||||
while [ -f /var/.ssh-lock ]
|
||||
do
|
||||
sleep 60
|
||||
done
|
||||
165
.github/workflows/pipeline-segment-node-nan-test.yml
vendored
Normal file
165
.github/workflows/pipeline-segment-node-nan-test.yml
vendored
Normal file
@@ -0,0 +1,165 @@
|
||||
name: Pipeline Segment - Node/Nan Test
|
||||
|
||||
on:
|
||||
workflow_call:
|
||||
inputs:
|
||||
target-platform:
|
||||
type: string
|
||||
description: 'Platform to run on, can be macos or linux'
|
||||
required: true
|
||||
target-arch:
|
||||
type: string
|
||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
||||
required: true
|
||||
test-runs-on:
|
||||
type: string
|
||||
description: 'What host to run the tests on'
|
||||
required: true
|
||||
test-container:
|
||||
type: string
|
||||
description: 'JSON container information for aks runs-on'
|
||||
required: false
|
||||
default: '{"image":null}'
|
||||
gn-build-type:
|
||||
description: 'The gn build type - testing or release'
|
||||
required: true
|
||||
type: string
|
||||
default: testing
|
||||
|
||||
concurrency:
|
||||
group: electron-node-nan-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref }}
|
||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
||||
|
||||
env:
|
||||
ELECTRON_OUT_DIR: Default
|
||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||
|
||||
jobs:
|
||||
node-tests:
|
||||
name: Run Node.js Tests
|
||||
runs-on: electron-arc-linux-amd64-8core
|
||||
timeout-minutes: 20
|
||||
env:
|
||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||
BUILD_TYPE: linux
|
||||
container: ${{ fromJSON(inputs.test-container) }}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Install Build Tools
|
||||
uses: ./src/electron/.github/actions/install-build-tools
|
||||
- name: Init Build Tools
|
||||
run: |
|
||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }}
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Get Depot Tools
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
sed -i '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
cd depot_tools
|
||||
git apply --3way ../src/electron/.github/workflows/config/gclient.diff
|
||||
# Ensure depot_tools does not update.
|
||||
test -d depot_tools && cd depot_tools
|
||||
touch .disable_auto_update
|
||||
- name: Add Depot Tools to PATH
|
||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
||||
- name: Download Generated Artifacts
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||
with:
|
||||
name: generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||
path: ./generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||
- name: Download Src Artifacts
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||
with:
|
||||
name: src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||
path: ./src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||
- name: Restore Generated Artifacts
|
||||
run: ./src/electron/script/actions/restore-artifacts.sh
|
||||
- name: Unzip Dist
|
||||
run: |
|
||||
cd src/out/Default
|
||||
unzip -:o dist.zip
|
||||
- name: Setup Linux for Headless Testing
|
||||
run: sh -e /etc/init.d/xvfb start
|
||||
- name: Run Node.js Tests
|
||||
run: |
|
||||
cd src
|
||||
node electron/script/node-spec-runner.js --default --jUnitDir=junit
|
||||
- name: Wait for active SSH sessions
|
||||
if: always() && !cancelled()
|
||||
run: |
|
||||
while [ -f /var/.ssh-lock ]
|
||||
do
|
||||
sleep 60
|
||||
done
|
||||
nan-tests:
|
||||
name: Run Nan Tests
|
||||
runs-on: electron-arc-linux-amd64-4core
|
||||
timeout-minutes: 20
|
||||
env:
|
||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||
BUILD_TYPE: linux
|
||||
container: ${{ fromJSON(inputs.test-container) }}
|
||||
steps:
|
||||
- name: Checkout Electron
|
||||
uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
|
||||
with:
|
||||
path: src/electron
|
||||
fetch-depth: 0
|
||||
- name: Install Build Tools
|
||||
uses: ./src/electron/.github/actions/install-build-tools
|
||||
- name: Init Build Tools
|
||||
run: |
|
||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }}
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
cd src/electron
|
||||
node script/yarn install --frozen-lockfile
|
||||
- name: Get Depot Tools
|
||||
timeout-minutes: 5
|
||||
run: |
|
||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
sed -i '/ninjalog_uploader_wrapper.py/d' ./depot_tools/autoninja
|
||||
cd depot_tools
|
||||
git apply --3way ../src/electron/.github/workflows/config/gclient.diff
|
||||
# Ensure depot_tools does not update.
|
||||
test -d depot_tools && cd depot_tools
|
||||
touch .disable_auto_update
|
||||
- name: Add Depot Tools to PATH
|
||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
||||
- name: Download Generated Artifacts
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||
with:
|
||||
name: generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||
path: ./generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||
- name: Download Src Artifacts
|
||||
uses: actions/download-artifact@65a9edc5881444af0b9093a5e628f2fe47ea3b2e
|
||||
with:
|
||||
name: src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||
path: ./src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||
- name: Restore Generated Artifacts
|
||||
run: ./src/electron/script/actions/restore-artifacts.sh
|
||||
- name: Unzip Dist
|
||||
run: |
|
||||
cd src/out/Default
|
||||
unzip -:o dist.zip
|
||||
- name: Setup Linux for Headless Testing
|
||||
run: sh -e /etc/init.d/xvfb start
|
||||
- name: Run Node.js Tests
|
||||
run: |
|
||||
cd src
|
||||
node electron/script/nan-spec-runner.js
|
||||
- name: Wait for active SSH sessions
|
||||
if: always() && !cancelled()
|
||||
run: |
|
||||
while [ -f /var/.ssh-lock ]
|
||||
do
|
||||
sleep 60
|
||||
done
|
||||
1
BUILD.gn
1
BUILD.gn
@@ -743,6 +743,7 @@ source_set("electron_lib") {
|
||||
"//components/pdf/common:constants",
|
||||
"//components/pdf/renderer",
|
||||
"//pdf",
|
||||
"//pdf:content_restriction",
|
||||
]
|
||||
sources += [
|
||||
"shell/browser/electron_pdf_document_helper_client.cc",
|
||||
|
||||
4
DEPS
4
DEPS
@@ -2,9 +2,9 @@ gclient_gn_args_from = 'src'
|
||||
|
||||
vars = {
|
||||
'chromium_version':
|
||||
'124.0.6367.233',
|
||||
'124.0.6367.243',
|
||||
'node_version':
|
||||
'v20.11.1',
|
||||
'v20.16.0',
|
||||
'nan_version':
|
||||
'e14bdcd1f72d62bca1d541b66da43130384ec213',
|
||||
'squirrel.mac_version':
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[](https://electronjs.org)
|
||||
|
||||
[](https://circleci.com/gh/electron/electron/tree/main)
|
||||
[](https://github.com/electron/electron/actions/workflows/build.yml)
|
||||
[](https://ci.appveyor.com/project/electron-bot/electron-ljo26/branch/main)
|
||||
[](https://discord.gg/electronjs)
|
||||
|
||||
|
||||
@@ -95,6 +95,8 @@ for:
|
||||
- git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
- ps: New-Item -Name depot_tools\.disable_auto_update -ItemType File
|
||||
- depot_tools\bootstrap\win_tools.bat
|
||||
- ps: |
|
||||
Set-Content -Path $pwd\depot_tools\build_telemetry.cfg -Value '{"user": "info@electronjs.org", "status": "opt-out", "countdown": 10, "version": 1}'
|
||||
- ps: $env:PATH="$pwd\depot_tools;$env:PATH"
|
||||
- ps: >-
|
||||
if (Test-Path -Path "$pwd\src\electron") {
|
||||
@@ -115,6 +117,13 @@ for:
|
||||
$env:RBE_experimental_credentials_helper = $env:RECLIENT_HELPER
|
||||
- ps: >-
|
||||
$env:RBE_experimental_credentials_helper_args = "print"
|
||||
- ps: >-
|
||||
if ($env:ELECTRON_RBE_JWT -eq '') {
|
||||
$env:RBE_fail_early_min_action_count = "0"
|
||||
$env:RBE_fail_early_min_fallback_ratio = "0"
|
||||
$env:RBE_exec_strategy = "local"
|
||||
$env:RBE_remote_update_cache= "false"
|
||||
}
|
||||
- cd ..\..
|
||||
- ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools"
|
||||
- ps: >-
|
||||
@@ -166,8 +175,8 @@ for:
|
||||
if ($env:GN_CONFIG -eq 'release') {
|
||||
# Needed for msdia140.dll on 64-bit windows
|
||||
$env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin"
|
||||
autoninja -C out/Default electron:electron_symbols
|
||||
}
|
||||
- if "%GN_CONFIG%"=="release" ( autoninja -C out/Default electron:electron_symbols )
|
||||
- ps: >-
|
||||
if ($env:GN_CONFIG -eq 'release') {
|
||||
python3 electron\script\zip-symbols.py
|
||||
|
||||
11
appveyor.yml
11
appveyor.yml
@@ -93,6 +93,8 @@ for:
|
||||
- git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||
- ps: New-Item -Name depot_tools\.disable_auto_update -ItemType File
|
||||
- depot_tools\bootstrap\win_tools.bat
|
||||
- ps: |
|
||||
Set-Content -Path $pwd\depot_tools\build_telemetry.cfg -Value '{"user": "info@electronjs.org", "status": "opt-out", "countdown": 10, "version": 1}'
|
||||
- ps: $env:PATH="$pwd\depot_tools;$env:PATH"
|
||||
- ps: >-
|
||||
if (Test-Path -Path "$pwd\src\electron") {
|
||||
@@ -113,6 +115,13 @@ for:
|
||||
$env:RBE_experimental_credentials_helper = $env:RECLIENT_HELPER
|
||||
- ps: >-
|
||||
$env:RBE_experimental_credentials_helper_args = "print"
|
||||
- ps: >-
|
||||
if ($env:ELECTRON_RBE_JWT -eq '') {
|
||||
$env:RBE_fail_early_min_action_count = "0"
|
||||
$env:RBE_fail_early_min_fallback_ratio = "0"
|
||||
$env:RBE_exec_strategy = "local"
|
||||
$env:RBE_remote_update_cache= "false"
|
||||
}
|
||||
- cd ..\..
|
||||
- ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools"
|
||||
- ps: >-
|
||||
@@ -163,8 +172,8 @@ for:
|
||||
if ($env:GN_CONFIG -eq 'release') {
|
||||
# Needed for msdia140.dll on 64-bit windows
|
||||
$env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin"
|
||||
autoninja -C out/Default electron:electron_symbols
|
||||
}
|
||||
- if "%GN_CONFIG%"=="release" ( autoninja -C out/Default electron:electron_symbols )
|
||||
- ps: >-
|
||||
if ($env:GN_CONFIG -eq 'release') {
|
||||
python3 electron\script\zip-symbols.py
|
||||
|
||||
@@ -106,6 +106,7 @@ static_library("chrome") {
|
||||
"//chrome/browser/ui/frame/window_frame_util.h",
|
||||
"//chrome/browser/ui/ui_features.cc",
|
||||
"//chrome/browser/ui/ui_features.h",
|
||||
"//chrome/browser/ui/view_ids.h",
|
||||
"//chrome/browser/ui/views/eye_dropper/eye_dropper.cc",
|
||||
"//chrome/browser/ui/views/eye_dropper/eye_dropper.h",
|
||||
"//chrome/browser/ui/views/overlay/back_to_tab_label_button.cc",
|
||||
@@ -149,12 +150,15 @@ static_library("chrome") {
|
||||
"//chrome/browser/media/webrtc/window_icon_util_win.cc",
|
||||
"//chrome/browser/process_singleton_win.cc",
|
||||
"//chrome/browser/ui/frame/window_frame_util.h",
|
||||
"//chrome/browser/ui/view_ids.h",
|
||||
"//chrome/browser/win/chrome_process_finder.cc",
|
||||
"//chrome/browser/win/chrome_process_finder.h",
|
||||
"//chrome/browser/win/chrome_select_file_dialog_factory.cc",
|
||||
"//chrome/browser/win/chrome_select_file_dialog_factory.h",
|
||||
"//chrome/browser/win/titlebar_config.cc",
|
||||
"//chrome/browser/win/titlebar_config.h",
|
||||
"//chrome/browser/win/titlebar_config.h",
|
||||
"//chrome/browser/win/util_win_service.cc",
|
||||
"//chrome/browser/win/util_win_service.h",
|
||||
"//chrome/child/v8_crashpad_support_win.cc",
|
||||
"//chrome/child/v8_crashpad_support_win.h",
|
||||
]
|
||||
@@ -233,6 +237,7 @@ static_library("chrome") {
|
||||
"//chrome/services/util_win:lib",
|
||||
"//components/webapps/common:mojo_bindings",
|
||||
]
|
||||
deps += [ "//chrome/services/util_win/public/mojom" ]
|
||||
}
|
||||
|
||||
if (is_mac) {
|
||||
|
||||
@@ -1265,7 +1265,7 @@ Returns `Object`:
|
||||
|
||||
* `openAtLogin` boolean - `true` if the app is set to open at login.
|
||||
* `openAsHidden` boolean _macOS_ _Deprecated_ - `true` if the app is set to open as hidden at login. This does not work on macOS 13 and up.
|
||||
* `wasOpenedAtLogin` boolean _macOS_ _Deprecated_ - `true` if the app was opened at login automatically. This setting is not available on [MAS builds][mas-builds] or on macOS 13 and up.
|
||||
* `wasOpenedAtLogin` boolean _macOS_ - `true` if the app was opened at login automatically.
|
||||
* `wasOpenedAsHidden` boolean _macOS_ _Deprecated_ - `true` if the app was opened as a hidden login item. This indicates that the app should not open any windows at startup. This setting is not available on [MAS builds][mas-builds] or on macOS 13 and up.
|
||||
* `restoreState` boolean _macOS_ _Deprecated_ - `true` if the app was opened as a login item that should restore the state from the previous session. This indicates that the app should restore the windows that were open the last time the app was closed. This setting is not available on [MAS builds][mas-builds] or on macOS 13 and up.
|
||||
* `status` string _macOS_ - can be one of `not-registered`, `enabled`, `requires-approval`, or `not-found`.
|
||||
@@ -1357,7 +1357,7 @@ Show the app's about panel options. These options can be overridden with `app.se
|
||||
* `credits` string (optional) _macOS_ _Windows_ - Credit information.
|
||||
* `authors` string[] (optional) _Linux_ - List of app authors.
|
||||
* `website` string (optional) _Linux_ - The app's website.
|
||||
* `iconPath` string (optional) _Linux_ _Windows_ - Path to the app's icon in a JPEG or PNG file format. On Linux, will be shown as 64x64 pixels while retaining aspect ratio.
|
||||
* `iconPath` string (optional) _Linux_ _Windows_ - Path to the app's icon in a JPEG or PNG file format. On Linux, will be shown as 64x64 pixels while retaining aspect ratio. On Windows, a 48x48 PNG will result in the best visual quality.
|
||||
|
||||
Set the about panel options. This will override the values defined in the app's `.plist` file on macOS. See the [Apple docs][about-panel-options] for more details. On Linux, values must be set in order to be shown; there are no defaults.
|
||||
|
||||
|
||||
@@ -1370,15 +1370,16 @@ machine has a touch bar.
|
||||
**Note:** The TouchBar API is currently experimental and may change or be
|
||||
removed in future Electron releases.
|
||||
|
||||
#### `win.setTitleBarOverlay(options)` _Windows_
|
||||
#### `win.setTitleBarOverlay(options)` _Windows_ _Linux_
|
||||
|
||||
* `options` Object
|
||||
* `color` String (optional) _Windows_ - The CSS color of the Window Controls Overlay when enabled.
|
||||
* `symbolColor` String (optional) _Windows_ - The CSS color of the symbols on the Window Controls Overlay when enabled.
|
||||
* `height` Integer (optional) _Windows_ - The height of the title bar and Window Controls Overlay in pixels.
|
||||
* `color` String (optional) - The CSS color of the Window Controls Overlay when enabled.
|
||||
* `symbolColor` String (optional) - The CSS color of the symbols on the Window Controls Overlay when enabled.
|
||||
* `height` Integer (optional) - The height of the title bar and Window Controls Overlay in pixels.
|
||||
|
||||
On a Window with Window Controls Overlay already enabled, this method updates
|
||||
the style of the title bar overlay.
|
||||
On a Window with Window Controls Overlay already enabled, this method updates the style of the title bar overlay.
|
||||
|
||||
On Linux, the `symbolColor` is automatically calculated to have minimum accessible contrast to the `color` if not explicitly set.
|
||||
|
||||
[quick-look]: https://en.wikipedia.org/wiki/Quick_Look
|
||||
[vibrancy-docs]: https://developer.apple.com/documentation/appkit/nsvisualeffectview?preferredLanguage=objc
|
||||
|
||||
@@ -690,6 +690,8 @@ Sets whether the window should be in fullscreen mode.
|
||||
|
||||
Returns `boolean` - Whether the window is in fullscreen mode.
|
||||
|
||||
**Note:** On macOS, fullscreen transitions take place asynchronously. When querying for a BrowserWindow's fullscreen status, you should ensure that either the ['enter-full-screen'](browser-window.md#event-enter-full-screen) or ['leave-full-screen'](browser-window.md#event-leave-full-screen) events have been emitted.
|
||||
|
||||
#### `win.setSimpleFullScreen(flag)` _macOS_
|
||||
|
||||
* `flag` boolean
|
||||
@@ -1641,15 +1643,16 @@ with `addBrowserView` or `setBrowserView`. The top-most BrowserView is the last
|
||||
> The `BrowserView` class is deprecated, and replaced by the new
|
||||
> [`WebContentsView`](web-contents-view.md) class.
|
||||
|
||||
#### `win.setTitleBarOverlay(options)` _Windows_
|
||||
#### `win.setTitleBarOverlay(options)` _Windows_ _Linux_
|
||||
|
||||
* `options` Object
|
||||
* `color` String (optional) _Windows_ - The CSS color of the Window Controls Overlay when enabled.
|
||||
* `symbolColor` String (optional) _Windows_ - The CSS color of the symbols on the Window Controls Overlay when enabled.
|
||||
* `height` Integer (optional) _macOS_ _Windows_ - The height of the title bar and Window Controls Overlay in pixels.
|
||||
* `color` String (optional) - The CSS color of the Window Controls Overlay when enabled.
|
||||
* `symbolColor` String (optional) - The CSS color of the symbols on the Window Controls Overlay when enabled.
|
||||
* `height` Integer (optional) - The height of the title bar and Window Controls Overlay in pixels.
|
||||
|
||||
On a Window with Window Controls Overlay already enabled, this method updates
|
||||
the style of the title bar overlay.
|
||||
On a window with Window Controls Overlay already enabled, this method updates the style of the title bar overlay.
|
||||
|
||||
On Linux, the `symbolColor` is automatically calculated to have minimum accessible contrast to the `color` if not explicitly set.
|
||||
|
||||
[page-visibility-api]: https://developer.mozilla.org/en-US/docs/Web/API/Page_Visibility_API
|
||||
[quick-look]: https://en.wikipedia.org/wiki/Quick_Look
|
||||
|
||||
@@ -138,6 +138,25 @@ has been included below for completeness:
|
||||
|
||||
If the type you care about is not in the above table, it is probably not supported.
|
||||
|
||||
### Exposing ipcRenderer
|
||||
|
||||
Attempting to send the entire `ipcRenderer` module as an object over the `contextBridge` will result in
|
||||
an empty object on the receiving side of the bridge. Sending over `ipcRenderer` in full can let any
|
||||
code send any message, which is a security footgun. To interact through `ipcRenderer`, provide a safe wrapper
|
||||
like below:
|
||||
|
||||
```js
|
||||
// Preload (Isolated World)
|
||||
contextBridge.exposeInMainWorld('electron', {
|
||||
onMyEventName: (callback) => ipcRenderer.on('MyEventName', (e, ...args) => callback(args))
|
||||
})
|
||||
```
|
||||
|
||||
```js @ts-nocheck
|
||||
// Renderer (Main World)
|
||||
window.electron.onMyEventName(data => { /* ... */ })
|
||||
```
|
||||
|
||||
### Exposing Node Global Symbols
|
||||
|
||||
The `contextBridge` can be used by the preload script to give your renderer access to Node APIs.
|
||||
|
||||
@@ -9,80 +9,66 @@ The following example shows how to capture video from a desktop window whose
|
||||
title is `Electron`:
|
||||
|
||||
```js
|
||||
// In the main process.
|
||||
const { BrowserWindow, desktopCapturer } = require('electron')
|
||||
// main.js
|
||||
const { app, BrowserWindow, desktopCapturer, session } = require('electron')
|
||||
|
||||
const mainWindow = new BrowserWindow()
|
||||
app.whenReady().then(() => {
|
||||
const mainWindow = new BrowserWindow()
|
||||
|
||||
desktopCapturer.getSources({ types: ['window', 'screen'] }).then(async sources => {
|
||||
for (const source of sources) {
|
||||
if (source.name === 'Electron') {
|
||||
mainWindow.webContents.send('SET_SOURCE', source.id)
|
||||
return
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
```js @ts-nocheck
|
||||
// In the preload script.
|
||||
const { ipcRenderer } = require('electron')
|
||||
|
||||
ipcRenderer.on('SET_SOURCE', async (event, sourceId) => {
|
||||
try {
|
||||
const stream = await navigator.mediaDevices.getUserMedia({
|
||||
audio: false,
|
||||
video: {
|
||||
mandatory: {
|
||||
chromeMediaSource: 'desktop',
|
||||
chromeMediaSourceId: sourceId,
|
||||
minWidth: 1280,
|
||||
maxWidth: 1280,
|
||||
minHeight: 720,
|
||||
maxHeight: 720
|
||||
}
|
||||
}
|
||||
session.defaultSession.setDisplayMediaRequestHandler((request, callback) => {
|
||||
desktopCapturer.getSources({ types: ['screen'] }).then((sources) => {
|
||||
// Grant access to the first screen found.
|
||||
callback({ video: sources[0], audio: 'loopback' })
|
||||
})
|
||||
handleStream(stream)
|
||||
} catch (e) {
|
||||
handleError(e)
|
||||
}
|
||||
})
|
||||
|
||||
mainWindow.loadFile('index.html')
|
||||
})
|
||||
|
||||
function handleStream (stream) {
|
||||
const video = document.querySelector('video')
|
||||
video.srcObject = stream
|
||||
video.onloadedmetadata = (e) => video.play()
|
||||
}
|
||||
|
||||
function handleError (e) {
|
||||
console.log(e)
|
||||
}
|
||||
```
|
||||
|
||||
To capture video from a source provided by `desktopCapturer` the constraints
|
||||
passed to [`navigator.mediaDevices.getUserMedia`][] must include
|
||||
`chromeMediaSource: 'desktop'`, and `audio: false`.
|
||||
|
||||
To capture both audio and video from the entire desktop the constraints passed
|
||||
to [`navigator.mediaDevices.getUserMedia`][] must include `chromeMediaSource: 'desktop'`,
|
||||
for both `audio` and `video`, but should not include a `chromeMediaSourceId` constraint.
|
||||
|
||||
```js
|
||||
const constraints = {
|
||||
audio: {
|
||||
mandatory: {
|
||||
chromeMediaSource: 'desktop'
|
||||
// renderer.js
|
||||
const startButton = document.getElementById('startButton')
|
||||
const stopButton = document.getElementById('stopButton')
|
||||
const video = document.querySelector('video')
|
||||
|
||||
startButton.addEventListener('click', () => {
|
||||
navigator.mediaDevices.getDisplayMedia({
|
||||
audio: true,
|
||||
video: {
|
||||
width: 320,
|
||||
height: 240,
|
||||
frameRate: 30
|
||||
}
|
||||
},
|
||||
video: {
|
||||
mandatory: {
|
||||
chromeMediaSource: 'desktop'
|
||||
}
|
||||
}
|
||||
}
|
||||
}).then(stream => {
|
||||
video.srcObject = stream
|
||||
video.onloadedmetadata = (e) => video.play()
|
||||
}).catch(e => console.log(e))
|
||||
})
|
||||
|
||||
stopButton.addEventListener('click', () => {
|
||||
video.pause()
|
||||
})
|
||||
```
|
||||
|
||||
```html
|
||||
<!-- index.html -->
|
||||
<html>
|
||||
<meta http-equiv="content-security-policy" content="script-src 'self' 'unsafe-inline'" />
|
||||
<body>
|
||||
<button id="startButton" class="button">Start</button>
|
||||
<button id="stopButton" class="button">Stop</button>
|
||||
<video width="320" height="240" autoplay></video>
|
||||
<script src="renderer.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
See [`navigator.mediaDevices.getDisplayMedia`](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getDisplayMedia) for more information.
|
||||
|
||||
**Note:** `navigator.mediaDevices.getDisplayMedia` does not permit the use of `deviceId` for
|
||||
selection of a source - see [specification](https://w3c.github.io/mediacapture-screen-share/#constraints).
|
||||
|
||||
## Methods
|
||||
|
||||
The `desktopCapturer` module has the following methods:
|
||||
|
||||
@@ -145,6 +145,10 @@ Returns `string` - The file name of the download item.
|
||||
disk. If user changes the file name in a prompted download saving dialog, the
|
||||
actual name of saved file will be different.
|
||||
|
||||
#### `downloadItem.getCurrentBytesPerSecond()`
|
||||
|
||||
Returns `Integer` - The current download speed in bytes per second.
|
||||
|
||||
#### `downloadItem.getTotalBytes()`
|
||||
|
||||
Returns `Integer` - The total size in bytes of the download item.
|
||||
@@ -155,6 +159,10 @@ If the size is unknown, it returns 0.
|
||||
|
||||
Returns `Integer` - The received bytes of the download item.
|
||||
|
||||
#### `downloadItem.getPercentComplete()`
|
||||
|
||||
Returns `Integer` - The download completion in percent.
|
||||
|
||||
#### `downloadItem.getContentDisposition()`
|
||||
|
||||
Returns `string` - The Content-Disposition field from the response
|
||||
@@ -184,6 +192,10 @@ Returns `string` - ETag header value.
|
||||
Returns `Double` - Number of seconds since the UNIX epoch when the download was
|
||||
started.
|
||||
|
||||
#### `downloadItem.getEndTime()`
|
||||
|
||||
Returns `Double` - Number of seconds since the UNIX epoch when the download ended.
|
||||
|
||||
### Instance Properties
|
||||
|
||||
#### `downloadItem.savePath`
|
||||
|
||||
@@ -72,3 +72,7 @@ or is being instructed to use an inverted color scheme.
|
||||
|
||||
A `boolean` indicating whether Chromium is in forced colors mode, controlled by system accessibility settings.
|
||||
Currently, Windows high contrast is the only system setting that triggers forced colors mode.
|
||||
|
||||
### `nativeTheme.prefersReducedTransparency` _Readonly_
|
||||
|
||||
A `boolean` that indicates the whether the user has chosen via system accessibility settings to reduce transparency at the OS level.
|
||||
|
||||
@@ -143,6 +143,71 @@ Returns:
|
||||
Emitted after an extension is loaded and all necessary browser state is
|
||||
initialized to support the start of the extension's background page.
|
||||
|
||||
#### Event: 'file-system-access-restricted'
|
||||
|
||||
Returns:
|
||||
|
||||
* `event` Event
|
||||
* `details` Object
|
||||
* `origin` string - The origin that initiated access to the blocked path.
|
||||
* `isDirectory` boolean - Whether or not the path is a directory.
|
||||
* `path` string - The blocked path attempting to be accessed.
|
||||
* `callback` Function
|
||||
* `action` string - The action to take as a result of the restricted path access attempt.
|
||||
* `allow` - This will allow `path` to be accessed despite restricted status.
|
||||
* `deny` - This will block the access request and trigger an [`AbortError`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort).
|
||||
* `tryAgain` - This will open a new file picker and allow the user to choose another path.
|
||||
|
||||
```js
|
||||
const { app, dialog, BrowserWindow, session } = require('electron')
|
||||
|
||||
async function createWindow () {
|
||||
const mainWindow = new BrowserWindow()
|
||||
|
||||
await mainWindow.loadURL('https://buzzfeed.com')
|
||||
|
||||
session.defaultSession.on('file-system-access-restricted', async (e, details, callback) => {
|
||||
const { origin, path } = details
|
||||
const { response } = await dialog.showMessageBox({
|
||||
message: `Are you sure you want ${origin} to open restricted path ${path}?`,
|
||||
title: 'File System Access Restricted',
|
||||
buttons: ['Choose a different folder', 'Allow', 'Cancel'],
|
||||
cancelId: 2
|
||||
})
|
||||
|
||||
if (response === 0) {
|
||||
callback('tryAgain')
|
||||
} else if (response === 1) {
|
||||
callback('allow')
|
||||
} else {
|
||||
callback('deny')
|
||||
}
|
||||
})
|
||||
|
||||
mainWindow.webContents.executeJavaScript(`
|
||||
window.showDirectoryPicker({
|
||||
id: 'electron-demo',
|
||||
mode: 'readwrite',
|
||||
startIn: 'downloads',
|
||||
}).catch(e => {
|
||||
console.log(e)
|
||||
})`, true
|
||||
)
|
||||
}
|
||||
|
||||
app.whenReady().then(() => {
|
||||
createWindow()
|
||||
|
||||
app.on('activate', () => {
|
||||
if (BrowserWindow.getAllWindows().length === 0) createWindow()
|
||||
})
|
||||
})
|
||||
|
||||
app.on('window-all-closed', function () {
|
||||
if (process.platform !== 'darwin') app.quit()
|
||||
})
|
||||
```
|
||||
|
||||
#### Event: 'preconnect'
|
||||
|
||||
Returns:
|
||||
|
||||
@@ -80,14 +80,14 @@
|
||||
* `followWindow` - The backdrop should automatically appear active when the window is active, and inactive when it is not. This is the default.
|
||||
* `active` - The backdrop should always appear active.
|
||||
* `inactive` - The backdrop should always appear inactive.
|
||||
* `titleBarStyle` string (optional) _macOS_ _Windows_ - The style of window title bar.
|
||||
* `titleBarStyle` string (optional) - The style of window title bar.
|
||||
Default is `default`. Possible values are:
|
||||
* `default` - Results in the standard title bar for macOS or Windows respectively.
|
||||
* `hidden` - Results in a hidden title bar and a full size content window. On macOS, the window still has the standard window controls (“traffic lights”) in the top left. On Windows, when combined with `titleBarOverlay: true` it will activate the Window Controls Overlay (see `titleBarOverlay` for more information), otherwise no window controls will be shown.
|
||||
* `hiddenInset` _macOS_ - Only on macOS, results in a hidden title bar
|
||||
* `hidden` - Results in a hidden title bar and a full size content window. On macOS, the window still has the standard window controls (“traffic lights”) in the top left. On Windows and Linux, when combined with `titleBarOverlay: true` it will activate the Window Controls Overlay (see `titleBarOverlay` for more information), otherwise no window controls will be shown.
|
||||
* `hiddenInset` _macOS_ - Results in a hidden title bar
|
||||
with an alternative look where the traffic light buttons are slightly
|
||||
more inset from the window edge.
|
||||
* `customButtonsOnHover` _macOS_ - Only on macOS, results in a hidden
|
||||
* `customButtonsOnHover` _macOS_ - Results in a hidden
|
||||
title bar and a full size content window, the traffic light buttons will
|
||||
display when being hovered over in the top left of the window.
|
||||
**Note:** This option is currently experimental.
|
||||
|
||||
@@ -3,9 +3,9 @@
|
||||
* `webPreferences` [WebPreferences](web-preferences.md?inline) (optional) - Settings of web page's features.
|
||||
* `paintWhenInitiallyHidden` boolean (optional) - Whether the renderer should be active when `show` is `false` and it has just been created. In order for `document.visibilityState` to work correctly on first load with `show: false` you should set this to `false`. Setting this to `false` will cause the `ready-to-show` event to not fire. Default is `true`.
|
||||
* `titleBarOverlay` Object | Boolean (optional) - When using a frameless window in conjunction with `win.setWindowButtonVisibility(true)` on macOS or using a `titleBarStyle` so that the standard window controls ("traffic lights" on macOS) are visible, this property enables the Window Controls Overlay [JavaScript APIs][overlay-javascript-apis] and [CSS Environment Variables][overlay-css-env-vars]. Specifying `true` will result in an overlay with default system colors. Default is `false`.
|
||||
* `color` String (optional) _Windows_ - The CSS color of the Window Controls Overlay when enabled. Default is the system color.
|
||||
* `color` String (optional) _Windows_ _Linux_ - The CSS color of the Window Controls Overlay when enabled. Default is the system color.
|
||||
* `symbolColor` String (optional) _Windows_ - The CSS color of the symbols on the Window Controls Overlay when enabled. Default is the system color.
|
||||
* `height` Integer (optional) _macOS_ _Windows_ - The height of the title bar and Window Controls Overlay in pixels. Default is system height.
|
||||
* `height` Integer (optional) - The height of the title bar and Window Controls Overlay in pixels. Default is system height.
|
||||
|
||||
[overlay-css-env-vars]: https://github.com/WICG/window-controls-overlay/blob/main/explainer.md#css-environment-variables
|
||||
[overlay-javascript-apis]: https://github.com/WICG/window-controls-overlay/blob/main/explainer.md#javascript-apis
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
> Get system preferences.
|
||||
|
||||
Process: [Main](../glossary.md#main-process)
|
||||
Process: [Main](../glossary.md#main-process), [Utility](../glossary.md#utility-process)
|
||||
|
||||
```js
|
||||
const { systemPreferences } = require('electron')
|
||||
|
||||
@@ -78,8 +78,7 @@ Electron
|
||||
|
||||
## Structure of Other Directories
|
||||
|
||||
* **.circleci** - Config file for CI with CircleCI.
|
||||
* **.github** - GitHub-specific config files including issues templates and CODEOWNERS.
|
||||
* **.github** - GitHub-specific config files including issues templates, CI with GitHub Actions and CODEOWNERS.
|
||||
* **dist** - Temporary directory created by `script/create-dist.py` script
|
||||
when creating a distribution.
|
||||
* **node_modules** - Third party node modules used for building.
|
||||
|
||||
@@ -97,19 +97,12 @@ is as follows:
|
||||
|
||||
<img src="https://raw.githubusercontent.com/nodejs/Release/main/schedule.svg?sanitize=true" alt="Releases">
|
||||
|
||||
As a rule, stable branches of Electron do not receive Node.js upgrades after they have been cut.
|
||||
If Electron has recently updated its `main` branch to a new major version of Node.js, the next stable
|
||||
branch to be cut will be released with the new version.
|
||||
|
||||
Patch upgrades of Node that contain significant security or bug fixes, and are submitted
|
||||
more than 2 weeks prior to a stable release date, will be accepted into an Electron alpha
|
||||
or beta release branch.
|
||||
|
||||
Minor upgrades of Node that contain significant security or bug fixes, and are submitted
|
||||
more than 2 weeks prior to a stable release date may be accepted into an Electron alpha or
|
||||
beta release branch on a case-by-case basis. These requests will be reviewed and voted on
|
||||
by the [Releases Working Group](https://github.com/electron/governance/tree/main/wg-releases),
|
||||
to ensure minimal disruption for developers who may be consuming alpha or beta releases.
|
||||
Stable release lines of Electron will receive minor and patch bumps of Node.js after they are released.
|
||||
Patch bumps to Node.js will be released in patch releases of Electron, and minor bumps to Node.js will result in a minor release of Electron.
|
||||
Security-only release branches will receive security-related changes from Node.js releases, but not the full release.
|
||||
|
||||
### Breaking API changes
|
||||
|
||||
|
||||
@@ -91,7 +91,7 @@ win.setWindowButtonVisibility(false)
|
||||
> combining `frame: false` with `win.setWindowButtonVisibility(true)` will yield the same
|
||||
> layout outcome as setting `titleBarStyle: 'hidden'`.
|
||||
|
||||
## Window Controls Overlay _macOS_ _Windows_
|
||||
## Window Controls Overlay
|
||||
|
||||
The [Window Controls Overlay API][] is a web standard that gives web apps the ability to
|
||||
customize their title bar region when installed on desktop. Electron exposes this API
|
||||
@@ -115,12 +115,11 @@ const win = new BrowserWindow({
|
||||
})
|
||||
```
|
||||
|
||||
On either platform `titleBarOverlay` can also be an object. On both macOS and Windows, the height of the overlay can be specified with the `height` property. On Windows, the color of the overlay and its symbols can be specified using the `color` and `symbolColor` properties respectively. `rgba()`, `hsla()`, and `#RRGGBBAA` color formats are supported to apply transparency.
|
||||
On either platform `titleBarOverlay` can also be an object. The height of the overlay can be specified with the `height` property. On Windows and Linux, the color of the overlay and can be specified using the `color` property. On Windows and Linux, the color of the overlay and its symbols can be specified using the `color` and `symbolColor` properties respectively. The `rgba()`, `hsla()`, and `#RRGGBBAA` color formats are supported to apply transparency.
|
||||
|
||||
If a color option is not specified, the color will default to its system color for the window control buttons. Similarly, if the height option is not specified it will default to the default height:
|
||||
|
||||
```js title='main.js'
|
||||
// on Windows
|
||||
const { BrowserWindow } = require('electron')
|
||||
const win = new BrowserWindow({
|
||||
titleBarStyle: 'hidden',
|
||||
|
||||
@@ -350,6 +350,7 @@ auto_filenames = {
|
||||
|
||||
utility_bundle_deps = [
|
||||
"lib/browser/api/net-fetch.ts",
|
||||
"lib/browser/api/system-preferences.ts",
|
||||
"lib/browser/message-port-main.ts",
|
||||
"lib/common/api/net-client-request.ts",
|
||||
"lib/common/define-properties.ts",
|
||||
|
||||
@@ -44,6 +44,10 @@ filenames = {
|
||||
"shell/browser/ui/status_icon_gtk.h",
|
||||
"shell/browser/ui/tray_icon_linux.cc",
|
||||
"shell/browser/ui/tray_icon_linux.h",
|
||||
"shell/browser/ui/views/opaque_frame_view.cc",
|
||||
"shell/browser/ui/views/opaque_frame_view.h",
|
||||
"shell/browser/ui/views/caption_button_placeholder_container.cc",
|
||||
"shell/browser/ui/views/caption_button_placeholder_container.h",
|
||||
"shell/browser/ui/views/client_frame_view_linux.cc",
|
||||
"shell/browser/ui/views/client_frame_view_linux.h",
|
||||
"shell/common/application_info_linux.cc",
|
||||
@@ -543,7 +547,6 @@ filenames = {
|
||||
"shell/common/api/electron_api_clipboard.h",
|
||||
"shell/common/api/electron_api_command_line.cc",
|
||||
"shell/common/api/electron_api_environment.cc",
|
||||
"shell/common/api/electron_api_key_weak_map.h",
|
||||
"shell/common/api/electron_api_native_image.cc",
|
||||
"shell/common/api/electron_api_native_image.h",
|
||||
"shell/common/api/electron_api_net.cc",
|
||||
@@ -555,8 +558,6 @@ filenames = {
|
||||
"shell/common/api/electron_bindings.cc",
|
||||
"shell/common/api/electron_bindings.h",
|
||||
"shell/common/api/features.cc",
|
||||
"shell/common/api/object_life_monitor.cc",
|
||||
"shell/common/api/object_life_monitor.h",
|
||||
"shell/common/application_info.cc",
|
||||
"shell/common/application_info.h",
|
||||
"shell/common/asar/archive.cc",
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { EventEmitter } from 'events';
|
||||
import type { BaseWindow as TLWT } from 'electron/main';
|
||||
import { TouchBar } from 'electron/main';
|
||||
|
||||
const { BaseWindow } = process._linkedBinding('electron_browser_base_window') as { BaseWindow: typeof TLWT };
|
||||
|
||||
Object.setPrototypeOf(BaseWindow.prototype, EventEmitter.prototype);
|
||||
@@ -15,6 +17,10 @@ BaseWindow.prototype._init = function (this: TLWT) {
|
||||
}
|
||||
};
|
||||
|
||||
BaseWindow.prototype.setTouchBar = function (touchBar) {
|
||||
(TouchBar as any)._setOnWindow(touchBar, this);
|
||||
};
|
||||
|
||||
// Properties
|
||||
|
||||
Object.defineProperty(BaseWindow.prototype, 'autoHideMenuBar', {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { BaseWindow, WebContents, TouchBar, BrowserView } from 'electron/main';
|
||||
import { BaseWindow, WebContents, BrowserView } from 'electron/main';
|
||||
import type { BrowserWindow as BWT } from 'electron/main';
|
||||
const { BrowserWindow } = process._linkedBinding('electron_browser_window') as { BrowserWindow: typeof BWT };
|
||||
|
||||
@@ -54,7 +54,7 @@ BrowserWindow.prototype._init = function (this: BWT) {
|
||||
|
||||
this._browserViews = [];
|
||||
|
||||
this.on('close', () => {
|
||||
this.on('closed', () => {
|
||||
this._browserViews.forEach(b => b.webContents?.close({ waitForBeforeUnload: true }));
|
||||
});
|
||||
|
||||
@@ -100,10 +100,6 @@ BrowserWindow.fromBrowserView = (browserView: BrowserView) => {
|
||||
return BrowserWindow.fromWebContents(browserView.webContents);
|
||||
};
|
||||
|
||||
BrowserWindow.prototype.setTouchBar = function (touchBar) {
|
||||
(TouchBar as any)._setOnWindow(touchBar, this);
|
||||
};
|
||||
|
||||
// Forwarded to webContents:
|
||||
|
||||
BrowserWindow.prototype.loadURL = function (...args) {
|
||||
@@ -209,7 +205,12 @@ BrowserWindow.prototype.getBrowserViews = function () {
|
||||
|
||||
BrowserWindow.prototype.setTopBrowserView = function (browserView: BrowserView) {
|
||||
if (browserView.ownerWindow !== this) { throw new Error('Given BrowserView is not attached to the window'); }
|
||||
this.addBrowserView(browserView);
|
||||
const idx = this._browserViews.indexOf(browserView);
|
||||
if (idx >= 0) {
|
||||
this.contentView.addChildView(browserView.webContentsView);
|
||||
this._browserViews.splice(idx, 1);
|
||||
this._browserViews.push(browserView);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = BrowserWindow;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { app, BrowserWindow } from 'electron/main';
|
||||
import { app, BaseWindow } from 'electron/main';
|
||||
import type { OpenDialogOptions, OpenDialogReturnValue, MessageBoxOptions, SaveDialogOptions, SaveDialogReturnValue, MessageBoxReturnValue, CertificateTrustDialogOptions } from 'electron/main';
|
||||
const dialogBinding = process._linkedBinding('electron_browser_dialog');
|
||||
|
||||
@@ -72,7 +72,7 @@ const setupSaveDialogProperties = (properties: (keyof typeof SaveFileDialogPrope
|
||||
return dialogProperties;
|
||||
};
|
||||
|
||||
const saveDialog = (sync: boolean, window: BrowserWindow | null, options?: SaveDialogOptions) => {
|
||||
const saveDialog = (sync: boolean, window: BaseWindow | null, options?: SaveDialogOptions) => {
|
||||
checkAppInitialized();
|
||||
|
||||
if (options == null) options = { title: 'Save' };
|
||||
@@ -111,7 +111,7 @@ const saveDialog = (sync: boolean, window: BrowserWindow | null, options?: SaveD
|
||||
return sync ? dialogBinding.showSaveDialogSync(settings) : dialogBinding.showSaveDialog(settings);
|
||||
};
|
||||
|
||||
const openDialog = (sync: boolean, window: BrowserWindow | null, options?: OpenDialogOptions) => {
|
||||
const openDialog = (sync: boolean, window: BaseWindow | null, options?: OpenDialogOptions) => {
|
||||
checkAppInitialized();
|
||||
|
||||
if (options == null) {
|
||||
@@ -152,7 +152,7 @@ const openDialog = (sync: boolean, window: BrowserWindow | null, options?: OpenD
|
||||
return (sync) ? dialogBinding.showOpenDialogSync(settings) : dialogBinding.showOpenDialog(settings);
|
||||
};
|
||||
|
||||
const messageBox = (sync: boolean, window: BrowserWindow | null, options?: MessageBoxOptions) => {
|
||||
const messageBox = (sync: boolean, window: BaseWindow | null, options?: MessageBoxOptions) => {
|
||||
checkAppInitialized();
|
||||
|
||||
if (options == null) options = { type: 'none', message: '' };
|
||||
@@ -237,51 +237,51 @@ const messageBox = (sync: boolean, window: BrowserWindow | null, options?: Messa
|
||||
}
|
||||
};
|
||||
|
||||
export function showOpenDialog(window: BrowserWindow, options: OpenDialogOptions): OpenDialogReturnValue;
|
||||
export function showOpenDialog(window: BaseWindow, options: OpenDialogOptions): OpenDialogReturnValue;
|
||||
export function showOpenDialog(options: OpenDialogOptions): OpenDialogReturnValue;
|
||||
export function showOpenDialog (windowOrOptions: BrowserWindow | OpenDialogOptions, maybeOptions?: OpenDialogOptions): OpenDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showOpenDialog (windowOrOptions: BaseWindow | OpenDialogOptions, maybeOptions?: OpenDialogOptions): OpenDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
return openDialog(false, window, options);
|
||||
}
|
||||
|
||||
export function showOpenDialogSync(window: BrowserWindow, options: OpenDialogOptions): OpenDialogReturnValue;
|
||||
export function showOpenDialogSync(window: BaseWindow, options: OpenDialogOptions): OpenDialogReturnValue;
|
||||
export function showOpenDialogSync(options: OpenDialogOptions): OpenDialogReturnValue;
|
||||
export function showOpenDialogSync (windowOrOptions: BrowserWindow | OpenDialogOptions, maybeOptions?: OpenDialogOptions): OpenDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showOpenDialogSync (windowOrOptions: BaseWindow | OpenDialogOptions, maybeOptions?: OpenDialogOptions): OpenDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
return openDialog(true, window, options);
|
||||
}
|
||||
|
||||
export function showSaveDialog(window: BrowserWindow, options: SaveDialogOptions): SaveDialogReturnValue;
|
||||
export function showSaveDialog(window: BaseWindow, options: SaveDialogOptions): SaveDialogReturnValue;
|
||||
export function showSaveDialog(options: SaveDialogOptions): SaveDialogReturnValue;
|
||||
export function showSaveDialog (windowOrOptions: BrowserWindow | SaveDialogOptions, maybeOptions?: SaveDialogOptions): SaveDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showSaveDialog (windowOrOptions: BaseWindow | SaveDialogOptions, maybeOptions?: SaveDialogOptions): SaveDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
return saveDialog(false, window, options);
|
||||
}
|
||||
|
||||
export function showSaveDialogSync(window: BrowserWindow, options: SaveDialogOptions): SaveDialogReturnValue;
|
||||
export function showSaveDialogSync(window: BaseWindow, options: SaveDialogOptions): SaveDialogReturnValue;
|
||||
export function showSaveDialogSync(options: SaveDialogOptions): SaveDialogReturnValue;
|
||||
export function showSaveDialogSync (windowOrOptions: BrowserWindow | SaveDialogOptions, maybeOptions?: SaveDialogOptions): SaveDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showSaveDialogSync (windowOrOptions: BaseWindow | SaveDialogOptions, maybeOptions?: SaveDialogOptions): SaveDialogReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
return saveDialog(true, window, options);
|
||||
}
|
||||
|
||||
export function showMessageBox(window: BrowserWindow, options: MessageBoxOptions): MessageBoxReturnValue;
|
||||
export function showMessageBox(window: BaseWindow, options: MessageBoxOptions): MessageBoxReturnValue;
|
||||
export function showMessageBox(options: MessageBoxOptions): MessageBoxReturnValue;
|
||||
export function showMessageBox (windowOrOptions: BrowserWindow | MessageBoxOptions, maybeOptions?: MessageBoxOptions): MessageBoxReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showMessageBox (windowOrOptions: BaseWindow | MessageBoxOptions, maybeOptions?: MessageBoxOptions): MessageBoxReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
return messageBox(false, window, options);
|
||||
}
|
||||
|
||||
export function showMessageBoxSync(window: BrowserWindow, options: MessageBoxOptions): MessageBoxReturnValue;
|
||||
export function showMessageBoxSync(window: BaseWindow, options: MessageBoxOptions): MessageBoxReturnValue;
|
||||
export function showMessageBoxSync(options: MessageBoxOptions): MessageBoxReturnValue;
|
||||
export function showMessageBoxSync (windowOrOptions: BrowserWindow | MessageBoxOptions, maybeOptions?: MessageBoxOptions): MessageBoxReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showMessageBoxSync (windowOrOptions: BaseWindow | MessageBoxOptions, maybeOptions?: MessageBoxOptions): MessageBoxReturnValue {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
return messageBox(true, window, options);
|
||||
}
|
||||
|
||||
@@ -289,9 +289,9 @@ export function showErrorBox (...args: any[]) {
|
||||
return dialogBinding.showErrorBox(...args);
|
||||
}
|
||||
|
||||
export function showCertificateTrustDialog (windowOrOptions: BrowserWindow | CertificateTrustDialogOptions, maybeOptions?: CertificateTrustDialogOptions) {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BrowserWindow) ? windowOrOptions : maybeOptions);
|
||||
export function showCertificateTrustDialog (windowOrOptions: BaseWindow | CertificateTrustDialogOptions, maybeOptions?: CertificateTrustDialogOptions) {
|
||||
const window = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? null : windowOrOptions);
|
||||
const options = (windowOrOptions && !(windowOrOptions instanceof BaseWindow) ? windowOrOptions : maybeOptions);
|
||||
|
||||
if (options == null || typeof options !== 'object') {
|
||||
throw new TypeError('options must be an object');
|
||||
|
||||
@@ -284,7 +284,7 @@ const escapeItemSymbol = Symbol('escape item');
|
||||
|
||||
class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||
// Bind a touch bar to a window
|
||||
static _setOnWindow (touchBar: TouchBar | Electron.TouchBarConstructorOptions['items'], window: Electron.BrowserWindow) {
|
||||
static _setOnWindow (touchBar: TouchBar | Electron.TouchBarConstructorOptions['items'], window: Electron.BaseWindow) {
|
||||
if (window._touchBar != null) {
|
||||
window._touchBar._removeFromWindow(window);
|
||||
}
|
||||
@@ -383,7 +383,7 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||
return this[escapeItemSymbol];
|
||||
}
|
||||
|
||||
_addToWindow (window: Electron.BrowserWindow) {
|
||||
_addToWindow (window: Electron.BaseWindow) {
|
||||
const { id } = window;
|
||||
|
||||
// Already added to window
|
||||
@@ -439,7 +439,7 @@ class TouchBar extends EventEmitter implements Electron.TouchBar {
|
||||
escapeItemListener(this.escapeItem);
|
||||
}
|
||||
|
||||
_removeFromWindow (window: Electron.BrowserWindow) {
|
||||
_removeFromWindow (window: Electron.BaseWindow) {
|
||||
const removeListeners = this.windowListeners.get(window.id);
|
||||
if (removeListeners != null) removeListeners();
|
||||
}
|
||||
|
||||
@@ -200,11 +200,11 @@ delete process.appCodeLoaded;
|
||||
if (packagePath) {
|
||||
// Finally load app's main.js and transfer control to C++.
|
||||
if ((packageJson.type === 'module' && !mainStartupScript.endsWith('.cjs')) || mainStartupScript.endsWith('.mjs')) {
|
||||
const { loadESM } = __non_webpack_require__('internal/process/esm_loader');
|
||||
const { runEntryPointWithESMLoader } = __non_webpack_require__('internal/modules/run_main');
|
||||
const main = (require('url') as typeof url).pathToFileURL(path.join(packagePath, mainStartupScript));
|
||||
loadESM(async (esmLoader: any) => {
|
||||
runEntryPointWithESMLoader(async (cascadedLoader: any) => {
|
||||
try {
|
||||
await esmLoader.import(main.toString(), undefined, Object.create(null));
|
||||
await cascadedLoader.import(main.toString(), undefined, Object.create(null));
|
||||
appCodeLoaded!();
|
||||
} catch (err) {
|
||||
appCodeLoaded!();
|
||||
|
||||
@@ -467,7 +467,7 @@ export const wrapFsWithAsar = (fs: Record<string, any>) => {
|
||||
};
|
||||
|
||||
const { access } = fs;
|
||||
fs.access = function (pathArgument: string, mode: any, callback: any) {
|
||||
fs.access = function (pathArgument: string, mode: number, callback: any) {
|
||||
const pathInfo = splitPath(pathArgument);
|
||||
if (!pathInfo.isAsar) return access.apply(this, arguments);
|
||||
const { asarPath, filePath } = pathInfo;
|
||||
@@ -512,7 +512,16 @@ export const wrapFsWithAsar = (fs: Record<string, any>) => {
|
||||
nextTick(callback);
|
||||
};
|
||||
|
||||
fs.promises.access = util.promisify(fs.access);
|
||||
const { access: accessPromise } = fs.promises;
|
||||
fs.promises.access = function (pathArgument: string, mode: number) {
|
||||
const pathInfo = splitPath(pathArgument);
|
||||
if (!pathInfo.isAsar) {
|
||||
return accessPromise.apply(this, arguments);
|
||||
}
|
||||
|
||||
const p = util.promisify(fs.access);
|
||||
return p(pathArgument, mode);
|
||||
};
|
||||
|
||||
const { accessSync } = fs;
|
||||
fs.accessSync = function (pathArgument: string, mode: any) {
|
||||
|
||||
@@ -2,6 +2,14 @@
|
||||
import { wrapFsWithAsar } from './asar-fs-wrapper';
|
||||
wrapFsWithAsar(require('fs'));
|
||||
|
||||
// See ElectronRendererClient::DidCreateScriptContext.
|
||||
if ((globalThis as any).blinkfetch) {
|
||||
const keys = ['fetch', 'Response', 'FormData', 'Request', 'Headers'];
|
||||
for (const key of keys) {
|
||||
(globalThis as any)[key] = (globalThis as any)[`blink${key}`];
|
||||
}
|
||||
}
|
||||
|
||||
// Hook child_process.fork.
|
||||
import cp = require('child_process'); // eslint-disable-line import/first
|
||||
const originalFork = cp.fork;
|
||||
|
||||
@@ -150,12 +150,12 @@ if (cjsPreloads.length) {
|
||||
}
|
||||
}
|
||||
if (esmPreloads.length) {
|
||||
const { loadESM } = __non_webpack_require__('internal/process/esm_loader');
|
||||
const { runEntryPointWithESMLoader } = __non_webpack_require__('internal/modules/run_main');
|
||||
|
||||
loadESM(async (esmLoader: any) => {
|
||||
runEntryPointWithESMLoader(async (cascadedLoader: any) => {
|
||||
// Load the preload scripts.
|
||||
for (const preloadScript of esmPreloads) {
|
||||
await esmLoader.import(pathToFileURL(preloadScript).toString(), undefined, Object.create(null)).catch((err: Error) => {
|
||||
await cascadedLoader.import(pathToFileURL(preloadScript).toString(), undefined, Object.create(null)).catch((err: Error) => {
|
||||
console.error(`Unable to load preload script: ${preloadScript}`);
|
||||
console.error(err);
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
// Utility side modules, please sort alphabetically.
|
||||
export const utilityNodeModuleList: ElectronInternal.ModuleEntry[] = [
|
||||
{ name: 'net', loader: () => require('./net') }
|
||||
{ name: 'net', loader: () => require('./net') },
|
||||
{ name: 'systemPreferences', loader: () => require('@electron/internal/browser/api/system-preferences') }
|
||||
];
|
||||
|
||||
@@ -36,11 +36,12 @@ parentPort.on('removeListener', (name: string) => {
|
||||
});
|
||||
|
||||
// Finally load entry script.
|
||||
const { loadESM } = __non_webpack_require__('internal/process/esm_loader');
|
||||
const { runEntryPointWithESMLoader } = __non_webpack_require__('internal/modules/run_main');
|
||||
const mainEntry = pathToFileURL(entryScript);
|
||||
loadESM(async (esmLoader: any) => {
|
||||
|
||||
runEntryPointWithESMLoader(async (cascadedLoader: any) => {
|
||||
try {
|
||||
await esmLoader.import(mainEntry.toString(), undefined, Object.create(null));
|
||||
await cascadedLoader.import(mainEntry.toString(), undefined, Object.create(null));
|
||||
} catch (err) {
|
||||
// @ts-ignore internalBinding is a secret internal global that we shouldn't
|
||||
// really be using, so we ignore the type error instead of declaring it in types
|
||||
|
||||
@@ -17,6 +17,14 @@ const { makeRequireFunction } = __non_webpack_require__('internal/modules/helper
|
||||
global.module = new Module('electron/js2c/worker_init');
|
||||
global.require = makeRequireFunction(global.module);
|
||||
|
||||
// See WebWorkerObserver::WorkerScriptReadyForEvaluation.
|
||||
if ((globalThis as any).blinkfetch) {
|
||||
const keys = ['fetch', 'Response', 'FormData', 'Request', 'Headers'];
|
||||
for (const key of keys) {
|
||||
(globalThis as any)[key] = (globalThis as any)[`blink${key}`];
|
||||
}
|
||||
}
|
||||
|
||||
// Set the __filename to the path of html file if it is file: protocol.
|
||||
// NB. 'self' isn't defined in an AudioWorklet.
|
||||
if (typeof self !== 'undefined' && self.location.protocol === 'file:') {
|
||||
|
||||
@@ -19,8 +19,6 @@
|
||||
"@types/chai-as-promised": "^7.1.3",
|
||||
"@types/dirty-chai": "^2.0.2",
|
||||
"@types/express": "^4.17.13",
|
||||
"@types/fs-extra": "^9.0.1",
|
||||
"@types/klaw": "^3.0.1",
|
||||
"@types/minimist": "^1.2.0",
|
||||
"@types/mocha": "^7.0.2",
|
||||
"@types/node": "^20.9.0",
|
||||
@@ -51,10 +49,8 @@
|
||||
"events": "^3.2.0",
|
||||
"express": "^4.16.4",
|
||||
"folder-hash": "^2.1.1",
|
||||
"fs-extra": "^9.0.1",
|
||||
"got": "^11.8.5",
|
||||
"husky": "^8.0.1",
|
||||
"klaw": "^3.0.0",
|
||||
"lint": "^1.1.2",
|
||||
"lint-staged": "^10.2.11",
|
||||
"minimist": "^1.2.6",
|
||||
|
||||
7
patches/DirectXShaderCompiler/.patches
Normal file
7
patches/DirectXShaderCompiler/.patches
Normal file
@@ -0,0 +1,7 @@
|
||||
cherry-pick-93c3cf1c787f.patch
|
||||
cherry-pick-33051b084850.patch
|
||||
cherry-pick-b845fed99111.patch
|
||||
cherry-pick-771e74ab497d.patch
|
||||
cherry-pick-8f07d39227f6.patch
|
||||
cherry-pick-b3c64851765c.patch
|
||||
cherry-pick-9463ce9cd8d9.patch
|
||||
332
patches/DirectXShaderCompiler/cherry-pick-33051b084850.patch
Normal file
332
patches/DirectXShaderCompiler/cherry-pick-33051b084850.patch
Normal file
@@ -0,0 +1,332 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Maiorano <amaiorano@google.com>
|
||||
Date: Mon, 10 Jun 2024 10:52:30 -0400
|
||||
Subject: Loop exit restructurizer: don't iterate over uses while mutating them
|
||||
(#6644)
|
||||
|
||||
The SkipBlockWithBranch function does the following:
|
||||
- Splits the block into three blocks with an if-then-endif structure.
|
||||
- Moves most instructions from the original block into the "then" block
|
||||
- If any of those values are used outside the original block, they are
|
||||
propagated through newly-constructed phis in the 'endif' block.
|
||||
|
||||
This algorithm had a bug where the uses of a value were being scanned
|
||||
while the uses were also being updated. In some cases a downstream
|
||||
out-of-block use could be skipped. That results in an invalid module
|
||||
because now the original definition is now in the 'then' block, which
|
||||
does not dominate the downstream out-of-block use.
|
||||
|
||||
Add a test that demonstrates the problem.
|
||||
|
||||
Bug: chromium:339171223
|
||||
Change-Id: Ia34fd7a2fe84de635289f7499772d11866a28e24
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5615350
|
||||
Reviewed-by: James Price <jrprice@google.com>
|
||||
Reviewed-by: dan sinclair <dsinclair@google.com>
|
||||
|
||||
diff --git a/lib/Transforms/Scalar/DxilRemoveUnstructuredLoopExits.cpp b/lib/Transforms/Scalar/DxilRemoveUnstructuredLoopExits.cpp
|
||||
index ef6718f0f22ee33e3f16f9801a64c1a6fb6c653a..70e6ccd8ddbaeabdb469710ad8529933f0286abd 100644
|
||||
--- a/lib/Transforms/Scalar/DxilRemoveUnstructuredLoopExits.cpp
|
||||
+++ b/lib/Transforms/Scalar/DxilRemoveUnstructuredLoopExits.cpp
|
||||
@@ -322,24 +322,26 @@ static void SkipBlockWithBranch(BasicBlock *bb, Value *cond, Loop *L,
|
||||
BranchInst::Create(end, body, cond, bb);
|
||||
|
||||
for (Instruction &inst : *body) {
|
||||
- PHINode *phi = nullptr;
|
||||
|
||||
// For each user that's outside of 'body', replace its use of 'inst' with a
|
||||
// phi created in 'end'
|
||||
- for (auto it = inst.user_begin(); it != inst.user_end();) {
|
||||
- Instruction *user_inst = cast<Instruction>(*(it++));
|
||||
- if (user_inst == phi)
|
||||
- continue;
|
||||
+ SmallPtrSet<Instruction *, 8> users_in_other_blocks;
|
||||
+ for (auto *user : inst.users()) {
|
||||
+ Instruction *user_inst = cast<Instruction>(user);
|
||||
if (user_inst->getParent() != body) {
|
||||
- if (!phi) {
|
||||
- phi = PHINode::Create(inst.getType(), 2, "", &*end->begin());
|
||||
- phi->addIncoming(GetDefaultValue(inst.getType()), bb);
|
||||
- phi->addIncoming(&inst, body);
|
||||
- }
|
||||
+ users_in_other_blocks.insert(user_inst);
|
||||
+ }
|
||||
+ }
|
||||
+ if (users_in_other_blocks.size() > 0) {
|
||||
+ auto *phi = PHINode::Create(inst.getType(), 2, "", &*end->begin());
|
||||
+ phi->addIncoming(GetDefaultValue(inst.getType()), bb);
|
||||
+ phi->addIncoming(&inst, body);
|
||||
+
|
||||
+ for (auto *user_inst : users_in_other_blocks) {
|
||||
user_inst->replaceUsesOfWith(&inst, phi);
|
||||
}
|
||||
- } // For each user of inst of body
|
||||
- } // For each inst in body
|
||||
+ }
|
||||
+ } // For each inst in body
|
||||
|
||||
L->addBasicBlockToLoop(body, *LI);
|
||||
L->addBasicBlockToLoop(end, *LI);
|
||||
diff --git a/tools/clang/test/DXC/Passes/DxilRemoveUnstructuredLoopExits/struct_exit_wrap_value_iteration_bug.ll b/tools/clang/test/DXC/Passes/DxilRemoveUnstructuredLoopExits/struct_exit_wrap_value_iteration_bug.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..ee912c929bdc0424959a29d16c3d5c64f885f809
|
||||
--- /dev/null
|
||||
+++ b/tools/clang/test/DXC/Passes/DxilRemoveUnstructuredLoopExits/struct_exit_wrap_value_iteration_bug.ll
|
||||
@@ -0,0 +1,257 @@
|
||||
+; RUN: %dxopt %s -hlsl-passes-resume -loop-unroll,StructurizeLoopExits=1 -S | FileCheck %s
|
||||
+
|
||||
+; The Loop exit structurizer will wrap the definition of %DerivFineX3 in a conditional block.
|
||||
+; Its value will later be propagated into a phi, and that phi replaces all further uses
|
||||
+; of %DerivFineX3.
|
||||
+;
|
||||
+; Tests that a bug is fixed where the code used to iterate through the uses of a value
|
||||
+; while also updating those uses. The old code would fail to update the definition
|
||||
+; of %g.i.2.i3 and the result would be an invalid module: %DerivFineX3 would not dominate
|
||||
+; all its uses.
|
||||
+
|
||||
+
|
||||
+; CHECK: define void @main
|
||||
+; CHECK-NOT: %DerivFineX3
|
||||
+; CHECK: "\01?f@@YAXXZ.exit.i":
|
||||
+; CHECK-NEXT: br i1 true, label %dx.struct_exit.cond_end, label %dx.struct_exit.cond_body
|
||||
+
|
||||
+; CHECK: dx.struct_exit.cond_body:
|
||||
+; CHECK: %DerivFineX3 = call
|
||||
+; CHECK: br label %dx.struct_exit.cond_end
|
||||
+
|
||||
+; CHECK: dx.struct_exit.cond_end:
|
||||
+; CHECK: = phi {{.*}} %DerivFineX3
|
||||
+; CHECK: br
|
||||
+; CHECK-NOT: %DerivFineX3
|
||||
+; CHECK: ret void
|
||||
+
|
||||
+
|
||||
+;
|
||||
+;
|
||||
+; void f() {
|
||||
+; int l_1 = 10;
|
||||
+; for (int l = 0, l_2 = 0; l < 5 && l_2 < 1; l++, l_2++) {
|
||||
+; while (1 < l_1) { }
|
||||
+; }
|
||||
+; }
|
||||
+;
|
||||
+;
|
||||
+; struct tint_symbol {
|
||||
+; float4 value : SV_Target0;
|
||||
+; };
|
||||
+;
|
||||
+; float4 main_inner() {
|
||||
+; float4 g = float4(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
+; bool2 true2 = (true).xx;
|
||||
+; uint2 _e8 = (0u).xx;
|
||||
+; do {
|
||||
+; if (_e8.x != 2u) {
|
||||
+; f();
|
||||
+; float4 _e15 = ddx_fine(g);
|
||||
+; if (_e8[_e8.x] == 2u) {
|
||||
+; g = _e15;
|
||||
+; } else {
|
||||
+; f();
|
||||
+; }
|
||||
+; switch(_e8.x) {
|
||||
+; case 3u: {
|
||||
+; break;
|
||||
+; }
|
||||
+; case 2u: {
|
||||
+; g = _e15;
|
||||
+; break;
|
||||
+; }
|
||||
+; default: {
|
||||
+; g = _e15;
|
||||
+; }
|
||||
+; }
|
||||
+; f();
|
||||
+; }
|
||||
+; } while(!all(true2));
|
||||
+; return g;
|
||||
+;}
|
||||
+;
|
||||
+;tint_symbol main() {
|
||||
+; float4 inner_result = main_inner();
|
||||
+; tint_symbol wrapper_result = (tint_symbol)0;
|
||||
+; wrapper_result.value = inner_result;
|
||||
+; return wrapper_result;
|
||||
+;}
|
||||
+
|
||||
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+%struct.tint_symbol = type { <4 x float> }
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+define void @main(<4 x float>* noalias) #0 {
|
||||
+entry:
|
||||
+ %1 = alloca [2 x i32], align 4
|
||||
+ %2 = getelementptr inbounds [2 x i32], [2 x i32]* %1, i32 0, i32 0, !dbg !20 ; line:17 col:9
|
||||
+ store i32 0, i32* %2, align 4, !dbg !20 ; line:17 col:9
|
||||
+ %3 = getelementptr inbounds [2 x i32], [2 x i32]* %1, i32 0, i32 1, !dbg !20 ; line:17 col:9
|
||||
+ store i32 0, i32* %3, align 4, !dbg !20 ; line:17 col:9
|
||||
+ br label %do.body.i, !dbg !26 ; line:18 col:3
|
||||
+
|
||||
+do.body.i: ; preds = %do.cond.i, %entry
|
||||
+ %g.i.0.i0 = phi float [ 0.000000e+00, %entry ], [ %g.i.3.i0, %do.cond.i ]
|
||||
+ %g.i.0.i1 = phi float [ 0.000000e+00, %entry ], [ %g.i.3.i1, %do.cond.i ]
|
||||
+ %g.i.0.i2 = phi float [ 0.000000e+00, %entry ], [ %g.i.3.i2, %do.cond.i ]
|
||||
+ %g.i.0.i3 = phi float [ 0.000000e+00, %entry ], [ %g.i.3.i3, %do.cond.i ]
|
||||
+ %4 = getelementptr inbounds [2 x i32], [2 x i32]* %1, i32 0, i32 0, !dbg !27 ; line:19 col:9
|
||||
+ %5 = load i32, i32* %4, align 4, !dbg !27 ; line:19 col:9
|
||||
+ %cmp.i = icmp ne i32 %5, 2, !dbg !28 ; line:19 col:15
|
||||
+ br i1 %cmp.i, label %for.cond.i.i, label %do.cond.i, !dbg !27 ; line:19 col:9
|
||||
+
|
||||
+for.cond.i.i: ; preds = %do.body.i
|
||||
+ br i1 true, label %while.cond.i.i.preheader, label %"\01?f@@YAXXZ.exit.i", !dbg !29 ; line:4 col:3
|
||||
+
|
||||
+while.cond.i.i.preheader: ; preds = %for.cond.i.i
|
||||
+ br label %while.cond.i.i, !dbg !32 ; line:5 col:5
|
||||
+
|
||||
+while.cond.i.i: ; preds = %while.cond.i.i.preheader, %while.cond.i.i
|
||||
+ br label %while.cond.i.i, !dbg !32 ; line:5 col:5
|
||||
+
|
||||
+"\01?f@@YAXXZ.exit.i": ; preds = %for.cond.i.i
|
||||
+ %DerivFineX = call float @dx.op.unary.f32(i32 85, float %g.i.0.i0), !dbg !33 ; line:21 col:21 ; DerivFineX(value)
|
||||
+ %DerivFineX1 = call float @dx.op.unary.f32(i32 85, float %g.i.0.i1), !dbg !33 ; line:21 col:21 ; DerivFineX(value)
|
||||
+ %DerivFineX2 = call float @dx.op.unary.f32(i32 85, float %g.i.0.i2), !dbg !33 ; line:21 col:21 ; DerivFineX(value)
|
||||
+ %DerivFineX3 = call float @dx.op.unary.f32(i32 85, float %g.i.0.i3), !dbg !33 ; line:21 col:21 ; DerivFineX(value)
|
||||
+ %6 = getelementptr inbounds [2 x i32], [2 x i32]* %1, i32 0, i32 0, !dbg !34 ; line:22 col:15
|
||||
+ %7 = load i32, i32* %6, align 4, !dbg !34 ; line:22 col:15
|
||||
+ %8 = getelementptr [2 x i32], [2 x i32]* %1, i32 0, i32 %7, !dbg !35 ; line:22 col:11
|
||||
+ %9 = load i32, i32* %8, !dbg !35, !tbaa !36 ; line:22 col:11
|
||||
+ %cmp6.i = icmp eq i32 %9, 2, !dbg !40 ; line:22 col:22
|
||||
+ br i1 %cmp6.i, label %if.end.i, label %for.cond.i.19.i, !dbg !35 ; line:22 col:11
|
||||
+
|
||||
+for.cond.i.19.i: ; preds = %"\01?f@@YAXXZ.exit.i"
|
||||
+ br i1 true, label %while.cond.i.24.i.preheader, label %if.end.i, !dbg !41 ; line:4 col:3
|
||||
+
|
||||
+while.cond.i.24.i.preheader: ; preds = %for.cond.i.19.i
|
||||
+ br label %while.cond.i.24.i, !dbg !43 ; line:5 col:5
|
||||
+
|
||||
+while.cond.i.24.i: ; preds = %while.cond.i.24.i.preheader, %while.cond.i.24.i
|
||||
+ br label %while.cond.i.24.i, !dbg !43 ; line:5 col:5
|
||||
+
|
||||
+if.end.i: ; preds = %for.cond.i.19.i, %"\01?f@@YAXXZ.exit.i"
|
||||
+ %g.i.1.i0 = phi float [ %DerivFineX, %"\01?f@@YAXXZ.exit.i" ], [ %g.i.0.i0, %for.cond.i.19.i ]
|
||||
+ %g.i.1.i1 = phi float [ %DerivFineX1, %"\01?f@@YAXXZ.exit.i" ], [ %g.i.0.i1, %for.cond.i.19.i ]
|
||||
+ %g.i.1.i2 = phi float [ %DerivFineX2, %"\01?f@@YAXXZ.exit.i" ], [ %g.i.0.i2, %for.cond.i.19.i ]
|
||||
+ %g.i.1.i3 = phi float [ %DerivFineX3, %"\01?f@@YAXXZ.exit.i" ], [ %g.i.0.i3, %for.cond.i.19.i ]
|
||||
+ %10 = getelementptr inbounds [2 x i32], [2 x i32]* %1, i32 0, i32 0, !dbg !44 ; line:27 col:14
|
||||
+ %11 = load i32, i32* %10, align 4, !dbg !44 ; line:27 col:14
|
||||
+ switch i32 %11, label %sw.default.i [
|
||||
+ i32 3, label %for.cond.i.5.i
|
||||
+ i32 2, label %sw.bb.10.i
|
||||
+ ], !dbg !45 ; line:27 col:7
|
||||
+
|
||||
+sw.bb.10.i: ; preds = %if.end.i
|
||||
+ br label %for.cond.i.5.i, !dbg !46 ; line:33 col:11
|
||||
+
|
||||
+sw.default.i: ; preds = %if.end.i
|
||||
+ br label %for.cond.i.5.i, !dbg !47 ; line:38 col:7
|
||||
+
|
||||
+for.cond.i.5.i: ; preds = %if.end.i, %sw.bb.10.i, %sw.default.i
|
||||
+ %g.i.2.i0 = phi float [ %DerivFineX, %sw.default.i ], [ %DerivFineX, %sw.bb.10.i ], [ %g.i.1.i0, %if.end.i ]
|
||||
+ %g.i.2.i1 = phi float [ %DerivFineX1, %sw.default.i ], [ %DerivFineX1, %sw.bb.10.i ], [ %g.i.1.i1, %if.end.i ]
|
||||
+ %g.i.2.i2 = phi float [ %DerivFineX2, %sw.default.i ], [ %DerivFineX2, %sw.bb.10.i ], [ %g.i.1.i2, %if.end.i ]
|
||||
+ %g.i.2.i3 = phi float [ %DerivFineX3, %sw.default.i ], [ %DerivFineX3, %sw.bb.10.i ], [ %g.i.1.i3, %if.end.i ]
|
||||
+ br i1 true, label %while.cond.i.10.i.preheader, label %do.cond.i, !dbg !48 ; line:4 col:3
|
||||
+
|
||||
+while.cond.i.10.i.preheader: ; preds = %for.cond.i.5.i
|
||||
+ br label %while.cond.i.10.i, !dbg !50 ; line:5 col:5
|
||||
+
|
||||
+while.cond.i.10.i: ; preds = %while.cond.i.10.i.preheader, %while.cond.i.10.i
|
||||
+ br label %while.cond.i.10.i, !dbg !50 ; line:5 col:5
|
||||
+
|
||||
+do.cond.i: ; preds = %for.cond.i.5.i, %do.body.i
|
||||
+ %g.i.3.i0 = phi float [ %g.i.0.i0, %do.body.i ], [ %g.i.2.i0, %for.cond.i.5.i ]
|
||||
+ %g.i.3.i1 = phi float [ %g.i.0.i1, %do.body.i ], [ %g.i.2.i1, %for.cond.i.5.i ]
|
||||
+ %g.i.3.i2 = phi float [ %g.i.0.i2, %do.body.i ], [ %g.i.2.i2, %for.cond.i.5.i ]
|
||||
+ %g.i.3.i3 = phi float [ %g.i.0.i3, %do.body.i ], [ %g.i.2.i3, %for.cond.i.5.i ]
|
||||
+ br i1 false, label %do.body.i, label %"\01?main_inner@@YA?AV?$vector@M$03@@XZ.exit", !dbg !51 ; line:41 col:3
|
||||
+
|
||||
+"\01?main_inner@@YA?AV?$vector@M$03@@XZ.exit": ; preds = %do.cond.i
|
||||
+ %g.i.3.i3.lcssa = phi float [ %g.i.3.i3, %do.cond.i ]
|
||||
+ %g.i.3.i2.lcssa = phi float [ %g.i.3.i2, %do.cond.i ]
|
||||
+ %g.i.3.i1.lcssa = phi float [ %g.i.3.i1, %do.cond.i ]
|
||||
+ %g.i.3.i0.lcssa = phi float [ %g.i.3.i0, %do.cond.i ]
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float %g.i.3.i0.lcssa), !dbg !52 ; line:49 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float %g.i.3.i1.lcssa), !dbg !52 ; line:49 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float %g.i.3.i2.lcssa), !dbg !52 ; line:49 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %g.i.3.i3.lcssa), !dbg !52 ; line:49 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ ret void, !dbg !53 ; line:49 col:3
|
||||
+}
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #0
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare float @dx.op.unary.f32(i32, float) #1
|
||||
+
|
||||
+attributes #0 = { nounwind }
|
||||
+attributes #1 = { nounwind readnone }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+!pauseresume = !{!1}
|
||||
+!llvm.ident = !{!2}
|
||||
+!dx.version = !{!3}
|
||||
+!dx.valver = !{!4}
|
||||
+!dx.shaderModel = !{!5}
|
||||
+!dx.typeAnnotations = !{!6, !9}
|
||||
+!dx.entryPoints = !{!16}
|
||||
+
|
||||
+!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!1 = !{!"hlsl-dxilemit", !"hlsl-dxilload"}
|
||||
+!2 = !{!"dxc(private) 1.8.0.14549 (main, 0781ded87-dirty)"}
|
||||
+!3 = !{i32 1, i32 0}
|
||||
+!4 = !{i32 1, i32 8}
|
||||
+!5 = !{!"ps", i32 6, i32 0}
|
||||
+!6 = !{i32 0, %struct.tint_symbol undef, !7}
|
||||
+!7 = !{i32 16, !8}
|
||||
+!8 = !{i32 6, !"value", i32 3, i32 0, i32 4, !"SV_Target0", i32 7, i32 9}
|
||||
+!9 = !{i32 1, void (<4 x float>*)* @main, !10}
|
||||
+!10 = !{!11, !13}
|
||||
+!11 = !{i32 0, !12, !12}
|
||||
+!12 = !{}
|
||||
+!13 = !{i32 1, !14, !15}
|
||||
+!14 = !{i32 4, !"SV_Target0", i32 7, i32 9}
|
||||
+!15 = !{i32 0}
|
||||
+!16 = !{void (<4 x float>*)* @main, !"main", !17, null, null}
|
||||
+!17 = !{null, !18, null}
|
||||
+!18 = !{!19}
|
||||
+!19 = !{i32 0, !"SV_Target", i8 9, i8 16, !15, i8 0, i32 1, i8 4, i32 0, i8 0, null}
|
||||
+!20 = !DILocation(line: 17, column: 9, scope: !21, inlinedAt: !24)
|
||||
+!21 = !DISubprogram(name: "main_inner", scope: !22, file: !22, line: 14, type: !23, isLocal: false, isDefinition: true, scopeLine: 14, flags: DIFlagPrototyped, isOptimized: false)
|
||||
+!22 = !DIFile(filename: "s2.hlsl", directory: "")
|
||||
+!23 = !DISubroutineType(types: !12)
|
||||
+!24 = distinct !DILocation(line: 46, column: 25, scope: !25)
|
||||
+!25 = !DISubprogram(name: "main", scope: !22, file: !22, line: 45, type: !23, isLocal: false, isDefinition: true, scopeLine: 45, flags: DIFlagPrototyped, isOptimized: false, function: void (<4 x float>*)* @main)
|
||||
+!26 = !DILocation(line: 18, column: 3, scope: !21, inlinedAt: !24)
|
||||
+!27 = !DILocation(line: 19, column: 9, scope: !21, inlinedAt: !24)
|
||||
+!28 = !DILocation(line: 19, column: 15, scope: !21, inlinedAt: !24)
|
||||
+!29 = !DILocation(line: 4, column: 3, scope: !30, inlinedAt: !31)
|
||||
+!30 = !DISubprogram(name: "f", scope: !22, file: !22, line: 2, type: !23, isLocal: false, isDefinition: true, scopeLine: 2, flags: DIFlagPrototyped, isOptimized: false)
|
||||
+!31 = distinct !DILocation(line: 20, column: 7, scope: !21, inlinedAt: !24)
|
||||
+!32 = !DILocation(line: 5, column: 5, scope: !30, inlinedAt: !31)
|
||||
+!33 = !DILocation(line: 21, column: 21, scope: !21, inlinedAt: !24)
|
||||
+!34 = !DILocation(line: 22, column: 15, scope: !21, inlinedAt: !24)
|
||||
+!35 = !DILocation(line: 22, column: 11, scope: !21, inlinedAt: !24)
|
||||
+!36 = !{!37, !37, i64 0}
|
||||
+!37 = !{!"int", !38, i64 0}
|
||||
+!38 = !{!"omnipotent char", !39, i64 0}
|
||||
+!39 = !{!"Simple C/C++ TBAA"}
|
||||
+!40 = !DILocation(line: 22, column: 22, scope: !21, inlinedAt: !24)
|
||||
+!41 = !DILocation(line: 4, column: 3, scope: !30, inlinedAt: !42)
|
||||
+!42 = distinct !DILocation(line: 25, column: 9, scope: !21, inlinedAt: !24)
|
||||
+!43 = !DILocation(line: 5, column: 5, scope: !30, inlinedAt: !42)
|
||||
+!44 = !DILocation(line: 27, column: 14, scope: !21, inlinedAt: !24)
|
||||
+!45 = !DILocation(line: 27, column: 7, scope: !21, inlinedAt: !24)
|
||||
+!46 = !DILocation(line: 33, column: 11, scope: !21, inlinedAt: !24)
|
||||
+!47 = !DILocation(line: 38, column: 7, scope: !21, inlinedAt: !24)
|
||||
+!48 = !DILocation(line: 4, column: 3, scope: !30, inlinedAt: !49)
|
||||
+!49 = distinct !DILocation(line: 39, column: 7, scope: !21, inlinedAt: !24)
|
||||
+!50 = !DILocation(line: 5, column: 5, scope: !30, inlinedAt: !49)
|
||||
+!51 = !DILocation(line: 41, column: 3, scope: !21, inlinedAt: !24)
|
||||
+!52 = !DILocation(line: 49, column: 10, scope: !25)
|
||||
+!53 = !DILocation(line: 49, column: 3, scope: !25)
|
||||
116
patches/DirectXShaderCompiler/cherry-pick-771e74ab497d.patch
Normal file
116
patches/DirectXShaderCompiler/cherry-pick-771e74ab497d.patch
Normal file
@@ -0,0 +1,116 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Maiorano <amaiorano@google.com>
|
||||
Date: Thu, 20 Jun 2024 14:02:42 -0400
|
||||
Subject: indvars: don't replace a phi when that breaks LCSSA (#6695)
|
||||
|
||||
Induction variable simplification (indvars) tries to rewrite exit
|
||||
values; these appear as phi nodes in loop exit blocks. If the
|
||||
replacement for the phi is still in the loop, then that would break the
|
||||
LCSSA property. Don't do that.
|
||||
|
||||
Add a test for this.
|
||||
|
||||
Bug: chromium:345993680
|
||||
Change-Id: Ib2330afa3c6f47373cb4336cfd00e851044fea3a
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5645925
|
||||
Reviewed-by: dan sinclair <dsinclair@chromium.org>
|
||||
Reviewed-by: James Price <jrprice@google.com>
|
||||
|
||||
diff --git a/lib/Transforms/Scalar/IndVarSimplify.cpp b/lib/Transforms/Scalar/IndVarSimplify.cpp
|
||||
index f5b1455d5932b63dfef699991c5eeab38e447a7d..e6ff7b3ab4d81bbb782f0bd0a7b5185a30fd1285 100644
|
||||
--- a/lib/Transforms/Scalar/IndVarSimplify.cpp
|
||||
+++ b/lib/Transforms/Scalar/IndVarSimplify.cpp
|
||||
@@ -24,7 +24,6 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
-#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/ADT/DenseMap.h"
|
||||
#include "llvm/ADT/SmallVector.h"
|
||||
#include "llvm/ADT/Statistic.h"
|
||||
@@ -41,11 +40,13 @@
|
||||
#include "llvm/IR/Instructions.h"
|
||||
#include "llvm/IR/IntrinsicInst.h"
|
||||
#include "llvm/IR/LLVMContext.h"
|
||||
+#include "llvm/IR/Module.h"
|
||||
#include "llvm/IR/PatternMatch.h"
|
||||
#include "llvm/IR/Type.h"
|
||||
#include "llvm/Support/CommandLine.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
+#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Transforms/Utils/SimplifyIndVar.h"
|
||||
@@ -698,6 +699,16 @@ void IndVarSimplify::RewriteLoopExitValues(Loop *L, SCEVExpander &Rewriter) {
|
||||
continue;
|
||||
}
|
||||
|
||||
+ // HLSL Change Begin
|
||||
+ // Avoid breaking LCSSA: Don't replace the PHI if its replacement
|
||||
+ // is defined inside the loop.
|
||||
+ if (auto *ExitValInst = dyn_cast<Instruction>(ExitVal)) {
|
||||
+ if (L->contains(ExitValInst)) {
|
||||
+ continue;
|
||||
+ }
|
||||
+ }
|
||||
+ // HLSL Change End
|
||||
+
|
||||
// Collect all the candidate PHINodes to be rewritten.
|
||||
RewritePhiSet.push_back(
|
||||
RewritePhi(PN, i, ExitVal, HighCost, LCSSASafePhiForRAUW));
|
||||
diff --git a/test/HLSL/passes/indvars/preserve-phi-when-replacement-is-in-loop.ll b/test/HLSL/passes/indvars/preserve-phi-when-replacement-is-in-loop.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b550ce993837814229f8223a47b2af328cc7c87c
|
||||
--- /dev/null
|
||||
+++ b/test/HLSL/passes/indvars/preserve-phi-when-replacement-is-in-loop.ll
|
||||
@@ -0,0 +1,49 @@
|
||||
+; RUN: opt < %s -indvars -S | FileCheck %s
|
||||
+
|
||||
+; The inner loop (%header1) has a fixed trip count.
|
||||
+; The indvars pass is tempted to delete the phi instruction %hexit,
|
||||
+; and replace its uses with %add3.
|
||||
+; But %hexit is used in %latch0, which is outside the inner loop and
|
||||
+; its exit block. Deleting the phi %hexit would break LCSSA form.
|
||||
+
|
||||
+; CHECK: @main
|
||||
+; CHECK: exit1:
|
||||
+; CHECK-NEXT: %hexit = phi i32 [ %hnext, %header1 ]
|
||||
+; CHECK-NEXT: br label %latch0
|
||||
+
|
||||
+; CHECK: latch0:
|
||||
+
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+define void @main(i32 %arg) {
|
||||
+entry:
|
||||
+ br label %header0
|
||||
+
|
||||
+header0:
|
||||
+ %isgt0 = icmp sgt i32 %arg, 0
|
||||
+ %smax = select i1 %isgt0, i32 %arg, i32 0
|
||||
+ %h0 = add i32 %smax, 1
|
||||
+ %j0 = add i32 %smax, 2
|
||||
+ %doinner = icmp slt i32 %j0, 1
|
||||
+ br i1 %doinner, label %header1.pre, label %latch0
|
||||
+
|
||||
+header1.pre:
|
||||
+ br label %header1
|
||||
+
|
||||
+header1:
|
||||
+ %hi = phi i32 [ %hnext, %header1 ], [ %h0, %header1.pre ]
|
||||
+ %ji = phi i32 [ %jnext, %header1 ], [ %j0, %header1.pre ]
|
||||
+ %add3 = add i32 %smax, 3
|
||||
+ %hnext = add i32 %hi, 1
|
||||
+ %jnext = add nsw i32 %ji, 1 ; the nsw here is essential
|
||||
+ %do1again = icmp slt i32 %ji, %add3
|
||||
+ br i1 %do1again, label %header1, label %exit1
|
||||
+
|
||||
+exit1:
|
||||
+ %hexit = phi i32 [ %hnext, %header1 ]
|
||||
+ br label %latch0
|
||||
+
|
||||
+latch0:
|
||||
+ %useh = phi i32 [ %h0, %header0 ], [ %hexit, %exit1 ]
|
||||
+ br label %header0
|
||||
+}
|
||||
151
patches/DirectXShaderCompiler/cherry-pick-8f07d39227f6.patch
Normal file
151
patches/DirectXShaderCompiler/cherry-pick-8f07d39227f6.patch
Normal file
@@ -0,0 +1,151 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Maiorano <amaiorano@google.com>
|
||||
Date: Thu, 20 Jun 2024 14:49:58 -0400
|
||||
Subject: Fix crash in scalarrepl-param-hlsl when dynamically indexing a GEP of
|
||||
a constant indexed GEP (#6670)
|
||||
|
||||
When processing global values to determine when to flatten vectors, this
|
||||
pass was only checking the immdiate users of the value for non-dynamic
|
||||
indexing of the vector. But this would fail in the case of a dynamic
|
||||
indexed GEP of a constant indexed GEP (e.g. h[0][a]) because the first
|
||||
level GEP was constant indexed, but not the second. We fix this by
|
||||
checking the full User tree of the value in `hasDynamicVectorIndexing`.
|
||||
|
||||
Bug: chromium:342428008
|
||||
Change-Id: Ibf2ae3a6528cfc9b50634058385c5a45aa1d3b75
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5645927
|
||||
Reviewed-by: James Price <jrprice@google.com>
|
||||
Reviewed-by: dan sinclair <dsinclair@chromium.org>
|
||||
|
||||
diff --git a/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp b/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp
|
||||
index 9b843ef0e49e554001b827e30eb6256853d90f5b..b1b38c0ee038dedb2064f5726663992a5bec736b 100644
|
||||
--- a/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp
|
||||
+++ b/lib/Transforms/Scalar/ScalarReplAggregatesHLSL.cpp
|
||||
@@ -1645,6 +1645,10 @@ bool hasDynamicVectorIndexing(Value *V) {
|
||||
}
|
||||
}
|
||||
}
|
||||
+ // Also recursively check the uses of this User to find a possible
|
||||
+ // dynamically indexed GEP of this GEP.
|
||||
+ if (hasDynamicVectorIndexing(U))
|
||||
+ return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
diff --git a/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-dyn-idx-gep-of-const-idx-gep.ll b/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-dyn-idx-gep-of-const-idx-gep.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..04fdea1500e75266a59705a1c2da98a4aef7391c
|
||||
--- /dev/null
|
||||
+++ b/tools/clang/test/DXC/Passes/ScalarReplHLSL/scalarrepl-param-hlsl-dyn-idx-gep-of-const-idx-gep.ll
|
||||
@@ -0,0 +1,111 @@
|
||||
+; RUN: %dxopt %s -hlsl-passes-resume -scalarrepl-param-hlsl -S | FileCheck %s
|
||||
+
|
||||
+; Produced from the following HLSL:
|
||||
+; static int4 g[4] = (int4[4])0;
|
||||
+; static int4 h[4] = (int4[4])0;
|
||||
+;
|
||||
+; [numthreads(1, 1, 1)]
|
||||
+; void main() {
|
||||
+; int a = 0;
|
||||
+; int b = h[0][a];
|
||||
+; h = g;
|
||||
+; }
|
||||
+;
|
||||
+; This was crashing in scalarrepl-param-hlsl because it was attempting to flatten
|
||||
+; global variable 'h' even though it is dynamically indexed. This was not detected
|
||||
+; because the resulting IR was a dynamically indexed GEP of a constant-indexed GEP,
|
||||
+; and the code was only checking the immediate users of 'h':
|
||||
+;
|
||||
+; %1 = getelementptr <4 x i32>, <4 x i32>* getelementptr inbounds ([4 x <4 x i32>], [4 x <4 x i32>]* @h, i32 0, i32 0), i32 0, i32 %0, !dbg !26 ; line:7 col:11
|
||||
+;
|
||||
+; Verify that it does not get flattened
|
||||
+; CHECK: %1 = getelementptr <4 x i32>, <4 x i32>* getelementptr inbounds ([4 x <4 x i32>], [4 x <4 x i32>]* @g, i32 0, i32 0), i32 0, i32 %0
|
||||
+
|
||||
+;
|
||||
+; Buffer Definitions:
|
||||
+;
|
||||
+; cbuffer $Globals
|
||||
+; {
|
||||
+;
|
||||
+; [0 x i8] (type annotation not present)
|
||||
+;
|
||||
+; }
|
||||
+;
|
||||
+;
|
||||
+; Resource Bindings:
|
||||
+;
|
||||
+; Name Type Format Dim ID HLSL Bind Count
|
||||
+; ------------------------------ ---------- ------- ----------- ------- -------------- ------
|
||||
+; $Globals cbuffer NA NA CB0 cb4294967295 1
|
||||
+;
|
||||
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+%ConstantBuffer = type opaque
|
||||
+
|
||||
+@h = internal global [4 x <4 x i32>] zeroinitializer, align 4
|
||||
+@g = internal global [4 x <4 x i32>] zeroinitializer, align 4
|
||||
+@"$Globals" = external constant %ConstantBuffer
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+define void @main() #0 {
|
||||
+entry:
|
||||
+ %a = alloca i32, align 4
|
||||
+ %b = alloca i32, align 4
|
||||
+ store i32 0, i32* %a, align 4, !dbg !17, !tbaa !21 ; line:6 col:7
|
||||
+ %0 = load i32, i32* %a, align 4, !dbg !25, !tbaa !21 ; line:7 col:16
|
||||
+ %1 = getelementptr <4 x i32>, <4 x i32>* getelementptr inbounds ([4 x <4 x i32>], [4 x <4 x i32>]* @h, i32 0, i32 0), i32 0, i32 %0, !dbg !26 ; line:7 col:11
|
||||
+ %2 = load i32, i32* %1, !dbg !26, !tbaa !21 ; line:7 col:11
|
||||
+ store i32 %2, i32* %b, align 4, !dbg !27, !tbaa !21 ; line:7 col:7
|
||||
+ %3 = bitcast [4 x <4 x i32>]* @h to i8*, !dbg !28 ; line:8 col:7
|
||||
+ %4 = bitcast [4 x <4 x i32>]* @g to i8*, !dbg !28 ; line:8 col:7
|
||||
+ call void @llvm.memcpy.p0i8.p0i8.i64(i8* %3, i8* %4, i64 64, i32 1, i1 false), !dbg !28 ; line:8 col:7
|
||||
+ ret void, !dbg !29 ; line:9 col:1
|
||||
+}
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #0
|
||||
+
|
||||
+attributes #0 = { nounwind }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+!pauseresume = !{!1}
|
||||
+!llvm.ident = !{!2}
|
||||
+!dx.version = !{!3}
|
||||
+!dx.valver = !{!4}
|
||||
+!dx.shaderModel = !{!5}
|
||||
+!dx.typeAnnotations = !{!6}
|
||||
+!dx.entryPoints = !{!10}
|
||||
+!dx.fnprops = !{!14}
|
||||
+!dx.options = !{!15, !16}
|
||||
+
|
||||
+!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!1 = !{!"hlsl-hlemit", !"hlsl-hlensure"}
|
||||
+!2 = !{!"dxc(private) 1.8.0.4514 (d9bd2a706-dirty)"}
|
||||
+!3 = !{i32 1, i32 0}
|
||||
+!4 = !{i32 1, i32 8}
|
||||
+!5 = !{!"cs", i32 6, i32 0}
|
||||
+!6 = !{i32 1, void ()* @main, !7}
|
||||
+!7 = !{!8}
|
||||
+!8 = !{i32 1, !9, !9}
|
||||
+!9 = !{}
|
||||
+!10 = !{void ()* @main, !"main", null, !11, null}
|
||||
+!11 = !{null, null, !12, null}
|
||||
+!12 = !{!13}
|
||||
+!13 = !{i32 0, %ConstantBuffer* @"$Globals", !"$Globals", i32 0, i32 -1, i32 1, i32 0, null}
|
||||
+!14 = !{void ()* @main, i32 5, i32 1, i32 1, i32 1}
|
||||
+!15 = !{i32 64}
|
||||
+!16 = !{i32 -1}
|
||||
+!17 = !DILocation(line: 6, column: 7, scope: !18)
|
||||
+!18 = !DISubprogram(name: "main", scope: !19, file: !19, line: 5, type: !20, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @main)
|
||||
+!19 = !DIFile(filename: "/mnt/c/Users/amaiorano/Downloads/342428008/standalone_reduced.hlsl", directory: "")
|
||||
+!20 = !DISubroutineType(types: !9)
|
||||
+!21 = !{!22, !22, i64 0}
|
||||
+!22 = !{!"int", !23, i64 0}
|
||||
+!23 = !{!"omnipotent char", !24, i64 0}
|
||||
+!24 = !{!"Simple C/C++ TBAA"}
|
||||
+!25 = !DILocation(line: 7, column: 16, scope: !18)
|
||||
+!26 = !DILocation(line: 7, column: 11, scope: !18)
|
||||
+!27 = !DILocation(line: 7, column: 7, scope: !18)
|
||||
+!28 = !DILocation(line: 8, column: 7, scope: !18)
|
||||
+!29 = !DILocation(line: 9, column: 1, scope: !18)
|
||||
312
patches/DirectXShaderCompiler/cherry-pick-93c3cf1c787f.patch
Normal file
312
patches/DirectXShaderCompiler/cherry-pick-93c3cf1c787f.patch
Normal file
@@ -0,0 +1,312 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Natalie Chouinard <chouinard@google.com>
|
||||
Date: Fri, 14 Jun 2024 13:29:19 +0000
|
||||
Subject: Fix another UAF in SimplifyCFG (#6680)
|
||||
|
||||
In certain cases of unreachable code, SimplifyCFG could try to replace a
|
||||
phi node with a select where the phi node itself was the select's
|
||||
condition. This resulted in an ASAN use-after-free during SimplifyCFG.
|
||||
|
||||
The test case added isn't quite ideal because by the end of the
|
||||
SimplifyCFG pass, the phi node is restored to its original state both
|
||||
before and after this fix. However, an ASAN build of `dxopt` or
|
||||
`check-clang-dxc` will identify a heap-use-after-free failure in the
|
||||
intermediary steps of this test without this patch and succeeds with it.
|
||||
|
||||
This was also fixed in upstream LLVM:
|
||||
https://github.com/llvm/llvm-project/commit/602ab248335e1540e82667e74fea44b7f042e112
|
||||
|
||||
Bug: 344639860
|
||||
Change-Id: I743e96fb172de867c89cad51805edf96387c04ec
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5631796
|
||||
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
|
||||
Reviewed-by: James Price <jrprice@google.com>
|
||||
|
||||
diff --git a/lib/Transforms/Utils/SimplifyCFG.cpp b/lib/Transforms/Utils/SimplifyCFG.cpp
|
||||
index 0d3ba1e00719060c1e71fa238726f0c63bd5b32f..5b364856928af6aab007e958b24f1daea32cd733 100644
|
||||
--- a/lib/Transforms/Utils/SimplifyCFG.cpp
|
||||
+++ b/lib/Transforms/Utils/SimplifyCFG.cpp
|
||||
@@ -1830,6 +1830,14 @@ static bool FoldTwoEntryPHINode(PHINode *PN, const TargetTransformInfo &TTI,
|
||||
isa<ConstantInt>(IfCond))
|
||||
return false;
|
||||
|
||||
+ // HLSL Change Begins: Patching in llvm/llvm-project@602ab24
|
||||
+ // Don't try to fold an unreachable block. For example, the phi node itself
|
||||
+ // can't be the candidate if-condition for a select that we want to form.
|
||||
+ if (auto *IfCondPhiInst = dyn_cast<PHINode>(IfCond))
|
||||
+ if (IfCondPhiInst->getParent() == BB)
|
||||
+ return false;
|
||||
+ // HLSL Change Ends.
|
||||
+
|
||||
// Okay, we found that we can merge this two-entry phi node into a select.
|
||||
// Doing so would require us to fold *all* two entry phi nodes in this block.
|
||||
// At some point this becomes non-profitable (particularly if the target
|
||||
diff --git a/tools/clang/test/DXC/Passes/SimplifyCFG/simplifycfg-uaf-phi-condition.ll b/tools/clang/test/DXC/Passes/SimplifyCFG/simplifycfg-uaf-phi-condition.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..573745a819fd1b51e3163d644088738d5128d30c
|
||||
--- /dev/null
|
||||
+++ b/tools/clang/test/DXC/Passes/SimplifyCFG/simplifycfg-uaf-phi-condition.ll
|
||||
@@ -0,0 +1,263 @@
|
||||
+; RUN: %dxopt %s -hlsl-passes-resume -simplifycfg -S | FileCheck %s
|
||||
+
|
||||
+; The IR below comes from the following HLSL.
|
||||
+; Compiling this HLSL with dxc was resulting in an ASAN use-after-free in
|
||||
+; SimplifyCFG during FoldTwoEntryPHINode because it was deleting a PHI node
|
||||
+; which was itself used as the condition for the select that replaced it.
|
||||
+
|
||||
+; struct a {
|
||||
+; int b[2];
|
||||
+; };
|
||||
+;
|
||||
+; cbuffer cbuffer_c : register(b0) {
|
||||
+; uint4 c[1];
|
||||
+; };
|
||||
+;
|
||||
+; void d(inout a e, inout int f) {
|
||||
+; int n = f;
|
||||
+; int g = asint(c[0].x);
|
||||
+; int s = f;
|
||||
+; bool i = (s >= 0);
|
||||
+; int j = (s * n);
|
||||
+; bool k = (6 > g);
|
||||
+; int l = 0;
|
||||
+; bool q = (s > j);
|
||||
+; while (true) {
|
||||
+; while (true) {
|
||||
+; while (true) {
|
||||
+; if (k) {
|
||||
+; {
|
||||
+; int t[2] = e.b;
|
||||
+; t[g] = n;
|
||||
+; e.b = t;
|
||||
+; }
|
||||
+; }
|
||||
+; e.b[1] = g;
|
||||
+; e.b[0] = s;
|
||||
+; if (q) {
|
||||
+; break;
|
||||
+; }
|
||||
+; }
|
||||
+; switch(j) {
|
||||
+; case 0: {
|
||||
+; break;
|
||||
+; }
|
||||
+; case 9: {
|
||||
+; break;
|
||||
+; }
|
||||
+; default: {
|
||||
+; {
|
||||
+; int u[2] = e.b;
|
||||
+; u[g] = l;
|
||||
+; e.b = u;
|
||||
+; }
|
||||
+; break;
|
||||
+; }
|
||||
+; }
|
||||
+; {
|
||||
+; if (q) { break; }
|
||||
+; }
|
||||
+; }
|
||||
+; {
|
||||
+; int v[2] = e.b;
|
||||
+; v[g] = j;
|
||||
+; e.b = v;
|
||||
+; }
|
||||
+; if (!(i)) {
|
||||
+; break;
|
||||
+; }
|
||||
+; }
|
||||
+; }
|
||||
+;
|
||||
+; [numthreads(1, 1, 1)]
|
||||
+; void main() {
|
||||
+; int o = 0;
|
||||
+; a p = (a)0;
|
||||
+; while (true) {
|
||||
+; bool i = (o < asint(c[0].x));
|
||||
+; if (i) {
|
||||
+; bool r = !(i);
|
||||
+; if (!(r)) {
|
||||
+; return;
|
||||
+; }
|
||||
+; d(p, o);
|
||||
+; }
|
||||
+; o = (o + 1);
|
||||
+; }
|
||||
+; return;
|
||||
+; }
|
||||
+
|
||||
+; Make sure the phi node did not get deleted by simplifycfg
|
||||
+; CHECK: while.body:
|
||||
+; CHECK-NEXT: %o.0 = phi i32 [ 0, %entry ], [ %add, %if.end.6 ]
|
||||
+
|
||||
+;
|
||||
+; Buffer Definitions:
|
||||
+;
|
||||
+; cbuffer cbuffer_c
|
||||
+; {
|
||||
+;
|
||||
+; struct cbuffer_c
|
||||
+; {
|
||||
+;
|
||||
+; uint4 c[1]; ; Offset: 0
|
||||
+;
|
||||
+; } cbuffer_c; ; Offset: 0 Size: 16
|
||||
+;
|
||||
+; }
|
||||
+;
|
||||
+;
|
||||
+; Resource Bindings:
|
||||
+;
|
||||
+; Name Type Format Dim ID HLSL Bind Count
|
||||
+; ------------------------------ ---------- ------- ----------- ------- -------------- ------
|
||||
+; cbuffer_c cbuffer NA NA CB0 cb0 1
|
||||
+;
|
||||
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+%cbuffer_c = type { [1 x <4 x i32>] }
|
||||
+%dx.types.Handle = type { i8* }
|
||||
+%dx.types.ResourceProperties = type { i32, i32 }
|
||||
+%dx.types.CBufRet.i32 = type { i32, i32, i32, i32 }
|
||||
+%struct.a = type { [2 x i32] }
|
||||
+
|
||||
+@cbuffer_c = external constant %cbuffer_c
|
||||
+@llvm.used = appending global [1 x i8*] [i8* bitcast (%cbuffer_c* @cbuffer_c to i8*)], section "llvm.metadata"
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+define void @main() #0 {
|
||||
+entry:
|
||||
+ %0 = load %cbuffer_c, %cbuffer_c* @cbuffer_c, align 4
|
||||
+ %cbuffer_c8 = call %dx.types.Handle @dx.op.createHandleForLib.cbuffer_c(i32 160, %cbuffer_c %0) ; CreateHandleForLib(Resource)
|
||||
+ %1 = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %cbuffer_c8, %dx.types.ResourceProperties { i32 13, i32 16 }) ; AnnotateHandle(res,props) resource: CBuffer
|
||||
+ %cbuffer_c = call %dx.types.Handle @dx.op.createHandleForLib.cbuffer_c(i32 160, %cbuffer_c %0) ; CreateHandleForLib(Resource)
|
||||
+ %2 = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %cbuffer_c, %dx.types.ResourceProperties { i32 13, i32 16 }) ; AnnotateHandle(res,props) resource: CBuffer
|
||||
+ br label %while.body, !dbg !21 ; line:69 col:3
|
||||
+
|
||||
+while.body: ; preds = %if.end.6, %entry
|
||||
+ %o.0 = phi i32 [ 0, %entry ], [ %add, %if.end.6 ]
|
||||
+ %3 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %1, i32 0), !dbg !25 ; line:70 col:25 ; CBufferLoadLegacy(handle,regIndex)
|
||||
+ %4 = extractvalue %dx.types.CBufRet.i32 %3, 0, !dbg !25 ; line:70 col:25
|
||||
+ %cmp = icmp slt i32 %o.0, %4, !dbg !26 ; line:70 col:17
|
||||
+ br i1 %cmp, label %if.then, label %if.end.6, !dbg !27 ; line:71 col:9
|
||||
+
|
||||
+if.then: ; preds = %while.body
|
||||
+ br i1 %cmp, label %if.then.5, label %if.end, !dbg !28 ; line:73 col:11
|
||||
+
|
||||
+if.then.5: ; preds = %if.then
|
||||
+ ret void, !dbg !29 ; line:74 col:9
|
||||
+
|
||||
+if.end: ; preds = %if.then
|
||||
+ %5 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %2, i32 0), !dbg !30 ; line:11 col:17 ; CBufferLoadLegacy(handle,regIndex)
|
||||
+ %6 = extractvalue %dx.types.CBufRet.i32 %5, 0, !dbg !30 ; line:11 col:17
|
||||
+ %cmp.i = icmp sgt i32 %o.0, -1, !dbg !33 ; line:13 col:15
|
||||
+ %mul.i = mul nsw i32 %o.0, %o.0, !dbg !34 ; line:14 col:14
|
||||
+ %cmp1.i = icmp slt i32 %6, 6, !dbg !35 ; line:15 col:15
|
||||
+ %cmp4.i = icmp sgt i32 %o.0, %mul.i, !dbg !36 ; line:17 col:15
|
||||
+ br label %while.body.10.i, !dbg !37 ; line:18 col:3
|
||||
+
|
||||
+while.body.10.i: ; preds = %while.end.27.i, %sw.epilog.i, %if.end.i, %if.end
|
||||
+ br i1 %cmp1.i, label %if.then.i, label %if.end.i, !dbg !38 ; line:21 col:13
|
||||
+
|
||||
+if.then.i: ; preds = %while.body.10.i
|
||||
+ br label %if.end.i, !dbg !39 ; line:27 col:9
|
||||
+
|
||||
+if.end.i: ; preds = %if.then.i, %while.body.10.i
|
||||
+ br i1 %cmp4.i, label %while.end.i, label %while.body.10.i, !dbg !40 ; line:30 col:13
|
||||
+
|
||||
+while.end.i: ; preds = %if.end.i
|
||||
+ switch i32 %mul.i, label %sw.default.i [
|
||||
+ i32 0, label %sw.epilog.i
|
||||
+ i32 9, label %sw.epilog.i
|
||||
+ ], !dbg !41 ; line:34 col:7
|
||||
+
|
||||
+sw.default.i: ; preds = %while.end.i
|
||||
+ br label %sw.epilog.i, !dbg !42 ; line:47 col:11
|
||||
+
|
||||
+sw.epilog.i: ; preds = %sw.default.i, %while.end.i, %while.end.i
|
||||
+ br i1 %cmp4.i, label %while.end.27.i, label %while.body.10.i, !dbg !43 ; line:51 col:13
|
||||
+
|
||||
+while.end.27.i: ; preds = %sw.epilog.i
|
||||
+ br i1 %cmp.i, label %while.body.10.i, label %if.end.6, !dbg !44 ; line:59 col:9
|
||||
+
|
||||
+if.end.6: ; preds = %while.end.27.i, %while.body
|
||||
+ %add = add nsw i32 %o.0, 1, !dbg !45 ; line:78 col:12
|
||||
+ br label %while.body, !dbg !21 ; line:69 col:3
|
||||
+}
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %cbuffer_c*, i32)"(i32, %cbuffer_c*, i32) #1
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %cbuffer_c)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %cbuffer_c) #1
|
||||
+
|
||||
+; Function Attrs: nounwind readonly
|
||||
+declare %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32, %dx.types.Handle, i32) #2
|
||||
+
|
||||
+; Function Attrs: nounwind readonly
|
||||
+declare %dx.types.Handle @dx.op.createHandleForLib.cbuffer_c(i32, %cbuffer_c) #2
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @dx.op.annotateHandle(i32, %dx.types.Handle, %dx.types.ResourceProperties) #1
|
||||
+
|
||||
+attributes #0 = { nounwind }
|
||||
+attributes #1 = { nounwind readnone }
|
||||
+attributes #2 = { nounwind readonly }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+!pauseresume = !{!1}
|
||||
+!llvm.ident = !{!2}
|
||||
+!dx.version = !{!3}
|
||||
+!dx.valver = !{!4}
|
||||
+!dx.shaderModel = !{!5}
|
||||
+!dx.resources = !{!6}
|
||||
+!dx.typeAnnotations = !{!9, !14}
|
||||
+!dx.entryPoints = !{!18}
|
||||
+
|
||||
+!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!1 = !{!"hlsl-dxilemit", !"hlsl-dxilload"}
|
||||
+!2 = !{!"dxc(private) 1.8.0.14620 (main, 8408ae882)"}
|
||||
+!3 = !{i32 1, i32 2}
|
||||
+!4 = !{i32 1, i32 8}
|
||||
+!5 = !{!"cs", i32 6, i32 2}
|
||||
+!6 = !{null, null, !7, null}
|
||||
+!7 = !{!8}
|
||||
+!8 = !{i32 0, %cbuffer_c* @cbuffer_c, !"cbuffer_c", i32 0, i32 0, i32 1, i32 16, null}
|
||||
+!9 = !{i32 0, %struct.a undef, !10, %cbuffer_c undef, !12}
|
||||
+!10 = !{i32 20, !11}
|
||||
+!11 = !{i32 6, !"b", i32 3, i32 0, i32 7, i32 4}
|
||||
+!12 = !{i32 16, !13}
|
||||
+!13 = !{i32 6, !"c", i32 3, i32 0, i32 7, i32 5}
|
||||
+!14 = !{i32 1, void ()* @main, !15}
|
||||
+!15 = !{!16}
|
||||
+!16 = !{i32 1, !17, !17}
|
||||
+!17 = !{}
|
||||
+!18 = !{void ()* @main, !"main", null, !6, !19}
|
||||
+!19 = !{i32 4, !20}
|
||||
+!20 = !{i32 1, i32 1, i32 1}
|
||||
+!21 = !DILocation(line: 69, column: 3, scope: !22)
|
||||
+!22 = !DISubprogram(name: "main", scope: !23, file: !23, line: 66, type: !24, isLocal: false, isDefinition: true, scopeLine: 66, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @main)
|
||||
+!23 = !DIFile(filename: "/usr/local/google/home/chouinard/Downloads/standalone.hlsl", directory: "")
|
||||
+!24 = !DISubroutineType(types: !17)
|
||||
+!25 = !DILocation(line: 70, column: 25, scope: !22)
|
||||
+!26 = !DILocation(line: 70, column: 17, scope: !22)
|
||||
+!27 = !DILocation(line: 71, column: 9, scope: !22)
|
||||
+!28 = !DILocation(line: 73, column: 11, scope: !22)
|
||||
+!29 = !DILocation(line: 74, column: 9, scope: !22)
|
||||
+!30 = !DILocation(line: 11, column: 17, scope: !31, inlinedAt: !32)
|
||||
+!31 = !DISubprogram(name: "d", scope: !23, file: !23, line: 9, type: !24, isLocal: false, isDefinition: true, scopeLine: 9, flags: DIFlagPrototyped, isOptimized: false)
|
||||
+!32 = distinct !DILocation(line: 76, column: 7, scope: !22)
|
||||
+!33 = !DILocation(line: 13, column: 15, scope: !31, inlinedAt: !32)
|
||||
+!34 = !DILocation(line: 14, column: 14, scope: !31, inlinedAt: !32)
|
||||
+!35 = !DILocation(line: 15, column: 15, scope: !31, inlinedAt: !32)
|
||||
+!36 = !DILocation(line: 17, column: 15, scope: !31, inlinedAt: !32)
|
||||
+!37 = !DILocation(line: 18, column: 3, scope: !31, inlinedAt: !32)
|
||||
+!38 = !DILocation(line: 21, column: 13, scope: !31, inlinedAt: !32)
|
||||
+!39 = !DILocation(line: 27, column: 9, scope: !31, inlinedAt: !32)
|
||||
+!40 = !DILocation(line: 30, column: 13, scope: !31, inlinedAt: !32)
|
||||
+!41 = !DILocation(line: 34, column: 7, scope: !31, inlinedAt: !32)
|
||||
+!42 = !DILocation(line: 47, column: 11, scope: !31, inlinedAt: !32)
|
||||
+!43 = !DILocation(line: 51, column: 13, scope: !31, inlinedAt: !32)
|
||||
+!44 = !DILocation(line: 59, column: 9, scope: !31, inlinedAt: !32)
|
||||
+!45 = !DILocation(line: 78, column: 12, scope: !22)
|
||||
261
patches/DirectXShaderCompiler/cherry-pick-9463ce9cd8d9.patch
Normal file
261
patches/DirectXShaderCompiler/cherry-pick-9463ce9cd8d9.patch
Normal file
@@ -0,0 +1,261 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: David Neto <dneto@google.com>
|
||||
Date: Tue, 16 Jul 2024 16:34:52 -0400
|
||||
Subject: Add CMake option DXC_CODEGEN_EXCEPTIONS_TRAP (#6764)
|
||||
|
||||
When enabled, any hlsl::Exception thrown during code generation and
|
||||
optimization will cause the process to trap.
|
||||
|
||||
Bug: 346618785
|
||||
Change-Id: I9ac966d339ec3090e3455d51a9d7516cc5a3f153
|
||||
|
||||
HLMatrixLower: allow exceptions to propagate out (#6710)
|
||||
|
||||
If an exception is thrown, don't block it in the TempOverloadPool
|
||||
destructor. Allow it to propagate out as a user-visible error.
|
||||
|
||||
Explicitly clear the TempOverloadPool before returning from the
|
||||
HLMatrixLowerPass::runOnModule. In the normal case, when no exception is
|
||||
thrown, that will still verify that all the overloads actually have been
|
||||
lowered, and will assert out if they aren't.
|
||||
|
||||
Bug: 346618785
|
||||
Change-Id: Id421ca324e4d799477a41abb14b966e8f39be482
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5715228
|
||||
Reviewed-by: Natalie Chouinard <chouinard@google.com>
|
||||
|
||||
diff --git a/CMakeLists.txt b/CMakeLists.txt
|
||||
index 15097b8473bf9f6c2b6c28ac095936616aa917f6..ac35ebd1a6afd55934da502ddb0e0c286da10db8 100644
|
||||
--- a/CMakeLists.txt
|
||||
+++ b/CMakeLists.txt
|
||||
@@ -104,6 +104,9 @@ endif()
|
||||
option(DXC_DISABLE_ALLOCATOR_OVERRIDES "Disable usage of allocator overrides" OFF)
|
||||
mark_as_advanced(DXC_DISABLE_ALLOCATOR_OVERRIDES)
|
||||
|
||||
+option(DXC_CODEGEN_EXCEPTIONS_TRAP "An exception in code generation generates a trap, ending the compiler process" OFF)
|
||||
+mark_as_advanced(DXC_CODEGEN_EXCEPTIONS_TRAP)
|
||||
+
|
||||
# adjust link option to enable debugging from kernel mode; not compatible with incremental linking
|
||||
if(NOT CMAKE_VERSION VERSION_LESS "3.13" AND WIN32 AND NOT CMAKE_C_COMPILER_ARCHITECTURE_ID STREQUAL "ARM64EC")
|
||||
add_link_options(/DEBUGTYPE:CV,FIXUP,PDATA /INCREMENTAL:NO)
|
||||
diff --git a/include/dxc/config.h.cmake b/include/dxc/config.h.cmake
|
||||
index 6d7450323ec864ef5f6e8796c46423d49f278b76..7226ed75a108f63c3c894b59eb7e0dbc5fb66002 100644
|
||||
--- a/include/dxc/config.h.cmake
|
||||
+++ b/include/dxc/config.h.cmake
|
||||
@@ -1,2 +1,4 @@
|
||||
/* Disable overriding memory allocators. */
|
||||
#cmakedefine DXC_DISABLE_ALLOCATOR_OVERRIDES
|
||||
+/* Generate a trap if an hlsl::Exception is thrown during code generation */
|
||||
+#cmakedefine DXC_CODEGEN_EXCEPTIONS_TRAP
|
||||
diff --git a/lib/HLSL/HLMatrixLowerPass.cpp b/lib/HLSL/HLMatrixLowerPass.cpp
|
||||
index d5959eb9335465f67d8e7ef7d7ab4eb720274226..3bb9f65834ecfd0c7a25c8a176f62c124e9967e5 100644
|
||||
--- a/lib/HLSL/HLMatrixLowerPass.cpp
|
||||
+++ b/lib/HLSL/HLMatrixLowerPass.cpp
|
||||
@@ -60,7 +60,12 @@ class TempOverloadPool {
|
||||
public:
|
||||
TempOverloadPool(llvm::Module &Module, const char *BaseName)
|
||||
: Module(Module), BaseName(BaseName) {}
|
||||
- ~TempOverloadPool() { clear(); }
|
||||
+ ~TempOverloadPool() {
|
||||
+ if (!Funcs.empty()) {
|
||||
+ // The flow has thrown an exception. Let that exception
|
||||
+ // propagate out and be reported as a compile error.
|
||||
+ }
|
||||
+ }
|
||||
|
||||
Function *get(FunctionType *Ty);
|
||||
bool contains(FunctionType *Ty) const { return Funcs.count(Ty) != 0; }
|
||||
@@ -248,12 +253,15 @@ bool HLMatrixLowerPass::runOnModule(Module &M) {
|
||||
m_matToVecStubs = nullptr;
|
||||
m_vecToMatStubs = nullptr;
|
||||
|
||||
- // If you hit an assert during TempOverloadPool destruction,
|
||||
+ // If you hit an assert while clearing TempOverloadPool,
|
||||
// it means that either a matrix producer was lowered,
|
||||
// causing a translation stub to be created,
|
||||
// but the consumer of that matrix was never (properly) lowered.
|
||||
// Or the opposite: a matrix consumer was lowered and not its producer.
|
||||
|
||||
+ matToVecStubs.clear();
|
||||
+ vecToMatStubs.clear();
|
||||
+
|
||||
return true;
|
||||
}
|
||||
|
||||
diff --git a/tools/clang/lib/CodeGen/BackendUtil.cpp b/tools/clang/lib/CodeGen/BackendUtil.cpp
|
||||
index 294ca05946eed6d87a3ad4e2b56a641d24065760..1e9adb40f4bae4cada42b5581582d50dc3676594 100644
|
||||
--- a/tools/clang/lib/CodeGen/BackendUtil.cpp
|
||||
+++ b/tools/clang/lib/CodeGen/BackendUtil.cpp
|
||||
@@ -8,6 +8,10 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "clang/CodeGen/BackendUtil.h"
|
||||
+#include "dxc/HLSL/DxilGenerationPass.h" // HLSL Change
|
||||
+#include "dxc/HLSL/HLMatrixLowerPass.h" // HLSL Change
|
||||
+#include "dxc/Support/Global.h" // HLSL Change
|
||||
+#include "dxc/config.h" // HLSL Change
|
||||
#include "clang/Basic/Diagnostic.h"
|
||||
#include "clang/Basic/LangOptions.h"
|
||||
#include "clang/Basic/TargetOptions.h"
|
||||
@@ -41,10 +45,8 @@
|
||||
#include "llvm/Transforms/ObjCARC.h"
|
||||
#include "llvm/Transforms/Scalar.h"
|
||||
#include "llvm/Transforms/Utils/SymbolRewriter.h"
|
||||
+#include <cstdio>
|
||||
#include <memory>
|
||||
-#include "dxc/HLSL/DxilGenerationPass.h" // HLSL Change
|
||||
-#include "dxc/HLSL/HLMatrixLowerPass.h" // HLSL Change
|
||||
-#include "dxc/Support/Global.h" // HLSL Change
|
||||
|
||||
using namespace clang;
|
||||
using namespace llvm;
|
||||
@@ -780,6 +782,13 @@ void clang::EmitBackendOutput(DiagnosticsEngine &Diags,
|
||||
} catch (const ::hlsl::Exception &hlslException) {
|
||||
Diags.Report(Diags.getCustomDiagID(DiagnosticsEngine::Error, "%0\n"))
|
||||
<< StringRef(hlslException.what());
|
||||
+#if defined(DXC_CODEGEN_EXCEPTIONS_TRAP)
|
||||
+ // llvm::errs() doesn't work in release builds on Linux.
|
||||
+ // Use C-style fprintf because it works everywhere.
|
||||
+ fprintf(stderr, "internal codegen error: %s\n", hlslException.what());
|
||||
+ fflush(stderr);
|
||||
+ LLVM_BUILTIN_TRAP;
|
||||
+#endif
|
||||
} // HLSL Change Ends
|
||||
|
||||
// If an optional clang TargetInfo description string was passed in, use it to
|
||||
diff --git a/tools/clang/test/DXC/Passes/HLMatrixLower/dont_crash_on_invalid_cast.ll b/tools/clang/test/DXC/Passes/HLMatrixLower/dont_crash_on_invalid_cast.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..fca52d11595d3ac99dedb28219f0746a26add6c9
|
||||
--- /dev/null
|
||||
+++ b/tools/clang/test/DXC/Passes/HLMatrixLower/dont_crash_on_invalid_cast.ll
|
||||
@@ -0,0 +1,130 @@
|
||||
+; RUN: not %dxopt %s -hlsl-passes-resume -hlmatrixlower -S | FileCheck %s
|
||||
+
|
||||
+
|
||||
+; The HL matrix lowering pass can sometimes throw an exception
|
||||
+; due to an invalid LLVM-level cast<Ty> call. Make sure that
|
||||
+; propagates out to a user-level error.
|
||||
+
|
||||
+; Note: There is still a bug in the compiler here. Not all matrix
|
||||
+; lowerings are covered by the pass.
|
||||
+
|
||||
+; TODO: Fix the underlying bug https://github.com/microsoft/DirectXShaderCompiler/issues/6723
|
||||
+; Once that is fixed, this test changes or should be deleted.
|
||||
+
|
||||
+
|
||||
+; CHECK: Operation failed - error code
|
||||
+
|
||||
+;
|
||||
+; Buffer Definitions:
|
||||
+;
|
||||
+; cbuffer $Globals
|
||||
+; {
|
||||
+;
|
||||
+; [0 x i8] (type annotation not present)
|
||||
+;
|
||||
+; }
|
||||
+;
|
||||
+;
|
||||
+; Resource Bindings:
|
||||
+;
|
||||
+; Name Type Format Dim ID HLSL Bind Count
|
||||
+; ------------------------------ ---------- ------- ----------- ------- -------------- ------
|
||||
+; $Globals cbuffer NA NA CB0 cb4294967295 1
|
||||
+;
|
||||
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+%ConstantBuffer = type opaque
|
||||
+%class.matrix.float.2.4 = type { [2 x <4 x float>] }
|
||||
+%struct.e = type { [1 x %struct.d], [1 x %struct.d] }
|
||||
+%struct.d = type { %struct.a }
|
||||
+%struct.a = type { float, %class.matrix.float.2.4 }
|
||||
+
|
||||
+@"$Globals" = external constant %ConstantBuffer
|
||||
+@g.0.0.0 = internal global [1 x float] undef, align 4
|
||||
+@g.0.0.1 = internal global [1 x %class.matrix.float.2.4] undef, align 4
|
||||
+@g.1.0.0 = internal global [1 x float] undef, align 4
|
||||
+@g.1.0.1 = internal global [1 x %class.matrix.float.2.4] undef, align 4
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+define void @main() #0 {
|
||||
+entry:
|
||||
+ %h.0.1 = alloca %class.matrix.float.2.4, !dbg !26 ; line:13 col:17
|
||||
+ store float 0.000000e+00, float* getelementptr inbounds ([1 x float], [1 x float]* @g.0.0.0, i32 0, i32 0), !dbg !26 ; line:13 col:17
|
||||
+ %0 = call %class.matrix.float.2.4 @"dx.hl.init.rn.%class.matrix.float.2.4 (i32, <8 x float>)"(i32 0, <8 x float> zeroinitializer) #0, !dbg !26 ; line:13 col:17
|
||||
+ %1 = call %class.matrix.float.2.4 @"dx.hl.cast.rowMatToColMat.%class.matrix.float.2.4 (i32, %class.matrix.float.2.4)"(i32 7, %class.matrix.float.2.4 %0) #0, !dbg !26 ; line:13 col:17
|
||||
+ %2 = call %class.matrix.float.2.4 @"dx.hl.matldst.colStore.%class.matrix.float.2.4 (i32, %class.matrix.float.2.4*, %class.matrix.float.2.4)"(i32 1, %class.matrix.float.2.4* getelementptr inbounds ([1 x %class.matrix.float.2.4], [1 x %class.matrix.float.2.4]* @g.0.0.1, i32 0, i32 0), %class.matrix.float.2.4 %1) #0, !dbg !26 ; line:13 col:17
|
||||
+ store float 0.000000e+00, float* getelementptr inbounds ([1 x float], [1 x float]* @g.1.0.0, i32 0, i32 0), !dbg !26 ; line:13 col:17
|
||||
+ %3 = call %class.matrix.float.2.4 @"dx.hl.init.rn.%class.matrix.float.2.4 (i32, <8 x float>)"(i32 0, <8 x float> zeroinitializer) #0, !dbg !26 ; line:13 col:17
|
||||
+ %4 = call %class.matrix.float.2.4 @"dx.hl.cast.rowMatToColMat.%class.matrix.float.2.4 (i32, %class.matrix.float.2.4)"(i32 7, %class.matrix.float.2.4 %3) #0, !dbg !26 ; line:13 col:17
|
||||
+ %5 = call %class.matrix.float.2.4 @"dx.hl.matldst.colStore.%class.matrix.float.2.4 (i32, %class.matrix.float.2.4*, %class.matrix.float.2.4)"(i32 1, %class.matrix.float.2.4* getelementptr inbounds ([1 x %class.matrix.float.2.4], [1 x %class.matrix.float.2.4]* @g.1.0.1, i32 0, i32 0), %class.matrix.float.2.4 %4) #0, !dbg !26 ; line:13 col:17
|
||||
+ %6 = load float, float* getelementptr inbounds ([1 x float], [1 x float]* @g.1.0.0, i32 0, i32 0), !dbg !32 ; line:17 col:9
|
||||
+ %7 = getelementptr inbounds %class.matrix.float.2.4, %class.matrix.float.2.4* %h.0.1, i32 0, i32 0, i32 0, !dbg !32 ; line:17 col:9
|
||||
+ %8 = load <4 x float>, <4 x float>* getelementptr inbounds ([1 x %class.matrix.float.2.4], [1 x %class.matrix.float.2.4]* @g.1.0.1, i32 0, i32 0, i32 0, i32 0), !dbg !32 ; line:17 col:9
|
||||
+ store <4 x float> %8, <4 x float>* %7, !dbg !32 ; line:17 col:9
|
||||
+ %9 = getelementptr inbounds %class.matrix.float.2.4, %class.matrix.float.2.4* %h.0.1, i32 0, i32 0, i32 1, !dbg !32 ; line:17 col:9
|
||||
+ %10 = load <4 x float>, <4 x float>* getelementptr inbounds ([1 x %class.matrix.float.2.4], [1 x %class.matrix.float.2.4]* @g.1.0.1, i32 0, i32 0, i32 0, i32 1), !dbg !32 ; line:17 col:9
|
||||
+ store <4 x float> %10, <4 x float>* %9, !dbg !32 ; line:17 col:9
|
||||
+ ret void, !dbg !33 ; line:18 col:3
|
||||
+}
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+declare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture readonly, i64, i32, i1) #0
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %class.matrix.float.2.4 @"dx.hl.init.rn.%class.matrix.float.2.4 (i32, <8 x float>)"(i32, <8 x float>) #1
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %class.matrix.float.2.4 @"dx.hl.cast.rowMatToColMat.%class.matrix.float.2.4 (i32, %class.matrix.float.2.4)"(i32, %class.matrix.float.2.4) #1
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+declare %class.matrix.float.2.4 @"dx.hl.matldst.colStore.%class.matrix.float.2.4 (i32, %class.matrix.float.2.4*, %class.matrix.float.2.4)"(i32, %class.matrix.float.2.4*, %class.matrix.float.2.4) #0
|
||||
+
|
||||
+attributes #0 = { nounwind }
|
||||
+attributes #1 = { nounwind readnone }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+!pauseresume = !{!1}
|
||||
+!llvm.ident = !{!2}
|
||||
+!dx.version = !{!3}
|
||||
+!dx.valver = !{!4}
|
||||
+!dx.shaderModel = !{!5}
|
||||
+!dx.typeAnnotations = !{!6, !15}
|
||||
+!dx.entryPoints = !{!19}
|
||||
+!dx.fnprops = !{!23}
|
||||
+!dx.options = !{!24, !25}
|
||||
+
|
||||
+!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!1 = !{!"hlsl-hlemit", !"hlsl-hlensure"}
|
||||
+!2 = !{!"dxc(private) 1.8.0.4640 (issue-785, 45018c752d)"}
|
||||
+!3 = !{i32 1, i32 0}
|
||||
+!4 = !{i32 1, i32 8}
|
||||
+!5 = !{!"cs", i32 6, i32 0}
|
||||
+!6 = !{i32 0, %struct.e undef, !7, %struct.d undef, !10, %struct.a undef, !11}
|
||||
+!7 = !{i32 152, !8, !9}
|
||||
+!8 = !{i32 6, !"c", i32 3, i32 0}
|
||||
+!9 = !{i32 6, !"f", i32 3, i32 80}
|
||||
+!10 = !{i32 72, !8}
|
||||
+!11 = !{i32 72, !12, !13}
|
||||
+!12 = !{i32 6, !"b", i32 3, i32 0, i32 7, i32 9}
|
||||
+!13 = !{i32 6, !"c", i32 2, !14, i32 3, i32 16, i32 7, i32 9}
|
||||
+!14 = !{i32 2, i32 4, i32 2}
|
||||
+!15 = !{i32 1, void ()* @main, !16}
|
||||
+!16 = !{!17}
|
||||
+!17 = !{i32 1, !18, !18}
|
||||
+!18 = !{}
|
||||
+!19 = !{void ()* @main, !"main", null, !20, null}
|
||||
+!20 = !{null, null, !21, null}
|
||||
+!21 = !{!22}
|
||||
+!22 = !{i32 0, %ConstantBuffer* @"$Globals", !"$Globals", i32 0, i32 -1, i32 1, i32 0, null}
|
||||
+!23 = !{void ()* @main, i32 5, i32 1, i32 1, i32 1}
|
||||
+!24 = !{i32 64}
|
||||
+!25 = !{i32 -1}
|
||||
+!26 = !DILocation(line: 13, column: 17, scope: !27, inlinedAt: !30)
|
||||
+!27 = !DISubprogram(name: "??__Eg@@YAXXZ", scope: !28, file: !28, line: 13, type: !29, isLocal: true, isDefinition: true, scopeLine: 13, flags: DIFlagPrototyped, isOptimized: false)
|
||||
+!28 = !DIFile(filename: "a.hlsl", directory: "")
|
||||
+!29 = !DISubroutineType(types: !18)
|
||||
+!30 = distinct !DILocation(line: 16, scope: !31)
|
||||
+!31 = !DISubprogram(name: "main", scope: !28, file: !28, line: 16, type: !29, isLocal: false, isDefinition: true, scopeLine: 16, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @main)
|
||||
+!32 = !DILocation(line: 17, column: 9, scope: !31)
|
||||
+!33 = !DILocation(line: 18, column: 3, scope: !31)
|
||||
231
patches/DirectXShaderCompiler/cherry-pick-b3c64851765c.patch
Normal file
231
patches/DirectXShaderCompiler/cherry-pick-b3c64851765c.patch
Normal file
@@ -0,0 +1,231 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Maiorano <amaiorano@google.com>
|
||||
Date: Thu, 20 Jun 2024 15:39:00 -0400
|
||||
Subject: Fix instcombine overflow check inserting inst at wrong place (#6679)
|
||||
|
||||
When optimizing an overflow check of an add followed by a compare, the
|
||||
new instruction was being inserted at the compare, and the add removed.
|
||||
This produced invalid IR in cases where there were other uses of the
|
||||
former add between it and the compare. This fix makes sure to insert the
|
||||
new instruction at the old add location, rather than at the compare.
|
||||
|
||||
Note that this was also fixed in LLVM:
|
||||
|
||||
https://github.com/llvm/llvm-project/commit/6f5dca70ed1c030957a45ad91bd295921f17b18d
|
||||
|
||||
Bug: chromium:342545100
|
||||
Change-Id: Iecf758e4465b32371266bbe9879790328f363322
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5644335
|
||||
Reviewed-by: dan sinclair <dsinclair@google.com>
|
||||
Reviewed-by: Ryan Harrison <rharrison@chromium.org>
|
||||
|
||||
diff --git a/lib/Transforms/InstCombine/InstCombineCompares.cpp b/lib/Transforms/InstCombine/InstCombineCompares.cpp
|
||||
index 7274304b3de7b110a4fa3a5123ea7215d99935ef..82e7e49003e65846c84e3df2801453fb463aa23e 100644
|
||||
--- a/lib/Transforms/InstCombine/InstCombineCompares.cpp
|
||||
+++ b/lib/Transforms/InstCombine/InstCombineCompares.cpp
|
||||
@@ -2145,6 +2145,12 @@ bool InstCombiner::OptimizeOverflowCheck(OverflowCheckFlavor OCF, Value *LHS,
|
||||
return true;
|
||||
};
|
||||
|
||||
+ // If the overflow check was an add followed by a compare, the insertion point
|
||||
+ // may be pointing to the compare. We want to insert the new instructions
|
||||
+ // before the add in case there are uses of the add between the add and the
|
||||
+ // compare.
|
||||
+ Builder->SetInsertPoint(&OrigI);
|
||||
+
|
||||
switch (OCF) {
|
||||
case OCF_INVALID:
|
||||
llvm_unreachable("bad overflow check kind!");
|
||||
diff --git a/tools/clang/test/DXC/Passes/InstructionCombining/instcombine-opt-overflow-check-inserts-at-add.ll b/tools/clang/test/DXC/Passes/InstructionCombining/instcombine-opt-overflow-check-inserts-at-add.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..70efa00c91c6523867980de0fb9f69c7fcfb318c
|
||||
--- /dev/null
|
||||
+++ b/tools/clang/test/DXC/Passes/InstructionCombining/instcombine-opt-overflow-check-inserts-at-add.ll
|
||||
@@ -0,0 +1,187 @@
|
||||
+; RUN: %dxopt %s -hlsl-passes-resume -instcombine,NoSink=0 -S | FileCheck %s
|
||||
+
|
||||
+; Generated from the following HLSL:
|
||||
+; cbuffer cbuffer_g : register(b0) {
|
||||
+; uint4 g[1];
|
||||
+; };
|
||||
+;
|
||||
+; [numthreads(1, 1, 1)]
|
||||
+; void main() {
|
||||
+; uint a = 2147483648u;
|
||||
+; uint b = (g[0].x | 2651317025u);
|
||||
+; uint c = (b + 2651317025u);
|
||||
+; while (true) {
|
||||
+; bool d = (a > c);
|
||||
+; if (d) {
|
||||
+; break;
|
||||
+; } else {
|
||||
+; while (true) {
|
||||
+; if (!d) {
|
||||
+; return;
|
||||
+; }
|
||||
+; a = b;
|
||||
+; bool e = (d ? d : d);
|
||||
+; if (e) {
|
||||
+; break;
|
||||
+; }
|
||||
+; }
|
||||
+; }
|
||||
+; }
|
||||
+; }
|
||||
+;
|
||||
+; Compiling this was resulting in invalid IR being produced from instcombine.
|
||||
+; Specifically, when optimizing an overflow check of an add followed by a compare,
|
||||
+; the new instruction was being inserted at the compare, and the add removed. This
|
||||
+; broke in cases like this one, where there were other uses of the former add between
|
||||
+; it and the compare. The fix was to make sure to insert the new instruction
|
||||
+; (another add in this case) at the old add rather than at the compare.
|
||||
+
|
||||
+; Make sure the new %add is still in the entry block before its uses.
|
||||
+; CHECK-LABEL: entry
|
||||
+; CHECK: %add = add i32 %or, -1643650271
|
||||
+; CHECK-NEXT: %cmp.2 = icmp sgt i32 %add, -1,
|
||||
+;
|
||||
+; Make sure the new %add is NOT in the loopexit where %cmp was optimized.
|
||||
+; CHECK-LABEL: while.body.loopexit
|
||||
+; CHECK-NEXT: br i1 false, label %if.end.preheader, label %while.end.14
|
||||
+
|
||||
+;
|
||||
+; Buffer Definitions:
|
||||
+;
|
||||
+; cbuffer cbuffer_g
|
||||
+; {
|
||||
+;
|
||||
+; struct cbuffer_g
|
||||
+; {
|
||||
+;
|
||||
+; uint4 g[1]; ; Offset: 0
|
||||
+;
|
||||
+; } cbuffer_g; ; Offset: 0 Size: 16
|
||||
+;
|
||||
+; }
|
||||
+;
|
||||
+;
|
||||
+; Resource Bindings:
|
||||
+;
|
||||
+; Name Type Format Dim ID HLSL Bind Count
|
||||
+; ------------------------------ ---------- ------- ----------- ------- -------------- ------
|
||||
+; cbuffer_g cbuffer NA NA CB0 cb0 1
|
||||
+;
|
||||
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+%cbuffer_g = type { [1 x <4 x i32>] }
|
||||
+%dx.types.Handle = type { i8* }
|
||||
+%dx.types.ResourceProperties = type { i32, i32 }
|
||||
+%dx.types.CBufRet.i32 = type { i32, i32, i32, i32 }
|
||||
+
|
||||
+@cbuffer_g = external constant %cbuffer_g
|
||||
+@llvm.used = appending global [1 x i8*] [i8* bitcast (%cbuffer_g* @cbuffer_g to i8*)], section "llvm.metadata"
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+define void @main() #0 {
|
||||
+entry:
|
||||
+ %0 = load %cbuffer_g, %cbuffer_g* @cbuffer_g
|
||||
+ %cbuffer_g = call %dx.types.Handle @dx.op.createHandleForLib.cbuffer_g(i32 160, %cbuffer_g %0) ; CreateHandleForLib(Resource)
|
||||
+ %1 = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %cbuffer_g, %dx.types.ResourceProperties { i32 13, i32 16 }) ; AnnotateHandle(res,props) resource: CBuffer
|
||||
+ %2 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %1, i32 0), !dbg !19 ; line:8 col:13 ; CBufferLoadLegacy(handle,regIndex)
|
||||
+ %3 = extractvalue %dx.types.CBufRet.i32 %2, 0, !dbg !19 ; line:8 col:13
|
||||
+ %or = or i32 %3, -1643650271, !dbg !23 ; line:8 col:20
|
||||
+ %add = add i32 %or, -1643650271, !dbg !24 ; line:9 col:15
|
||||
+ %cmp.2 = icmp ugt i32 -2147483648, %add, !dbg !25 ; line:11 col:17
|
||||
+ %frombool.3 = zext i1 %cmp.2 to i32, !dbg !26 ; line:11 col:10
|
||||
+ %tobool1.4 = icmp eq i32 %frombool.3, 0, !dbg !27 ; line:12 col:9
|
||||
+ %or.cond.6 = and i1 %tobool1.4, %cmp.2, !dbg !27 ; line:12 col:9
|
||||
+ br i1 %or.cond.6, label %if.end.preheader, label %while.end.14, !dbg !27 ; line:12 col:9
|
||||
+
|
||||
+while.body.loopexit: ; preds = %if.end
|
||||
+ %cmp = icmp ugt i32 %or, %add, !dbg !25 ; line:11 col:17
|
||||
+ %frombool = zext i1 %cmp to i32, !dbg !26 ; line:11 col:10
|
||||
+ %tobool1 = icmp eq i32 %frombool, 0, !dbg !27 ; line:12 col:9
|
||||
+ %or.cond = and i1 %tobool1, %cmp, !dbg !27 ; line:12 col:9
|
||||
+ br i1 %or.cond, label %if.end.preheader, label %while.end.14, !dbg !27 ; line:12 col:9
|
||||
+
|
||||
+if.end.preheader: ; preds = %entry, %while.body.loopexit
|
||||
+ %d.0 = phi i32 [ %frombool, %while.body.loopexit ], [ %frombool.3, %entry ]
|
||||
+ br label %if.end, !dbg !28 ; line:19 col:13
|
||||
+
|
||||
+while.body.3: ; preds = %if.end
|
||||
+ %tobool4.old = icmp ne i32 %d.0, 0, !dbg !29 ; line:16 col:14
|
||||
+ br i1 %tobool4.old, label %if.end, label %while.end.14, !dbg !30 ; line:16 col:13
|
||||
+
|
||||
+if.end: ; preds = %if.end.preheader, %while.body.3
|
||||
+ %tobool6 = icmp ne i32 %d.0, 0, !dbg !31 ; line:20 col:19
|
||||
+ %tobool7 = icmp ne i32 %d.0, 0, !dbg !32 ; line:20 col:23
|
||||
+ %tobool8 = icmp ne i32 %d.0, 0, !dbg !33 ; line:20 col:27
|
||||
+ %4 = select i1 %tobool6, i1 %tobool7, i1 %tobool8, !dbg !31 ; line:20 col:19
|
||||
+ br i1 %4, label %while.body.loopexit, label %while.body.3, !dbg !34 ; line:21 col:13
|
||||
+
|
||||
+while.end.14: ; preds = %while.body.loopexit, %while.body.3, %entry
|
||||
+ ret void, !dbg !35 ; line:27 col:1
|
||||
+}
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %cbuffer_g*, i32)"(i32, %cbuffer_g*, i32) #1
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %cbuffer_g)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %cbuffer_g) #1
|
||||
+
|
||||
+; Function Attrs: nounwind readonly
|
||||
+declare %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32, %dx.types.Handle, i32) #2
|
||||
+
|
||||
+; Function Attrs: nounwind readonly
|
||||
+declare %dx.types.Handle @dx.op.createHandleForLib.cbuffer_g(i32, %cbuffer_g) #2
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @dx.op.annotateHandle(i32, %dx.types.Handle, %dx.types.ResourceProperties) #1
|
||||
+
|
||||
+attributes #0 = { nounwind }
|
||||
+attributes #1 = { nounwind readnone }
|
||||
+attributes #2 = { nounwind readonly }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+!pauseresume = !{!1}
|
||||
+!llvm.ident = !{!2}
|
||||
+!dx.version = !{!3}
|
||||
+!dx.valver = !{!4}
|
||||
+!dx.shaderModel = !{!5}
|
||||
+!dx.resources = !{!6}
|
||||
+!dx.typeAnnotations = !{!9, !12}
|
||||
+!dx.entryPoints = !{!16}
|
||||
+
|
||||
+!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!1 = !{!"hlsl-dxilemit", !"hlsl-dxilload"}
|
||||
+!2 = !{!"dxc(private) 1.8.0.4514 (d9bd2a706-dirty)"}
|
||||
+!3 = !{i32 1, i32 0}
|
||||
+!4 = !{i32 1, i32 8}
|
||||
+!5 = !{!"cs", i32 6, i32 0}
|
||||
+!6 = !{null, null, !7, null}
|
||||
+!7 = !{!8}
|
||||
+!8 = !{i32 0, %cbuffer_g* @cbuffer_g, !"cbuffer_g", i32 0, i32 0, i32 1, i32 16, null}
|
||||
+!9 = !{i32 0, %cbuffer_g undef, !10}
|
||||
+!10 = !{i32 16, !11}
|
||||
+!11 = !{i32 6, !"g", i32 3, i32 0, i32 7, i32 5}
|
||||
+!12 = !{i32 1, void ()* @main, !13}
|
||||
+!13 = !{!14}
|
||||
+!14 = !{i32 1, !15, !15}
|
||||
+!15 = !{}
|
||||
+!16 = !{void ()* @main, !"main", null, !6, !17}
|
||||
+!17 = !{i32 4, !18}
|
||||
+!18 = !{i32 1, i32 1, i32 1}
|
||||
+!19 = !DILocation(line: 8, column: 13, scope: !20)
|
||||
+!20 = !DISubprogram(name: "main", scope: !21, file: !21, line: 6, type: !22, isLocal: false, isDefinition: true, scopeLine: 6, flags: DIFlagPrototyped, isOptimized: false, function: void ()* @main)
|
||||
+!21 = !DIFile(filename: "/mnt/c/Users/amaiorano/Downloads/342545100/standalone_reduced.hlsl", directory: "")
|
||||
+!22 = !DISubroutineType(types: !15)
|
||||
+!23 = !DILocation(line: 8, column: 20, scope: !20)
|
||||
+!24 = !DILocation(line: 9, column: 15, scope: !20)
|
||||
+!25 = !DILocation(line: 11, column: 17, scope: !20)
|
||||
+!26 = !DILocation(line: 11, column: 10, scope: !20)
|
||||
+!27 = !DILocation(line: 12, column: 9, scope: !20)
|
||||
+!28 = !DILocation(line: 19, column: 13, scope: !20)
|
||||
+!29 = !DILocation(line: 16, column: 14, scope: !20)
|
||||
+!30 = !DILocation(line: 16, column: 13, scope: !20)
|
||||
+!31 = !DILocation(line: 20, column: 19, scope: !20)
|
||||
+!32 = !DILocation(line: 20, column: 23, scope: !20)
|
||||
+!33 = !DILocation(line: 20, column: 27, scope: !20)
|
||||
+!34 = !DILocation(line: 21, column: 13, scope: !20)
|
||||
+!35 = !DILocation(line: 27, column: 1, scope: !20)
|
||||
294
patches/DirectXShaderCompiler/cherry-pick-b845fed99111.patch
Normal file
294
patches/DirectXShaderCompiler/cherry-pick-b845fed99111.patch
Normal file
@@ -0,0 +1,294 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Natalie Chouinard <chouinard@google.com>
|
||||
Date: Mon, 10 Jun 2024 18:21:40 +0000
|
||||
Subject: Fix LoopDeletion incorrectly updating PHI with multiple duplicate
|
||||
inputs (#6643)
|
||||
|
||||
LoopDeletion was incorrectly updating PHI nodes in the target block when
|
||||
it had duplicate input edges. This happens, for example, when deleting a
|
||||
loop that uses a switch with multiple cases that exit the same way.
|
||||
|
||||
After determining that this was the bug, I found this fix in LLVM:
|
||||
https://reviews.llvm.org/D34516 and applied it here.
|
||||
|
||||
Bug: 340196361
|
||||
Change-Id: I98b150bb9a164466eb84dd3d46f720d5d92ef909
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/external/github.com/microsoft/DirectXShaderCompiler/+/5616791
|
||||
Reviewed-by: Antonio Maiorano <amaiorano@google.com>
|
||||
Reviewed-by: dan sinclair <dsinclair@chromium.org>
|
||||
|
||||
diff --git a/lib/Transforms/Scalar/LoopDeletion.cpp b/lib/Transforms/Scalar/LoopDeletion.cpp
|
||||
index 6c2c1d60548f5a8a7939fee70728e8a34572b648..6cd1fba7c085b6d61dcb23b073358fc4c798e099 100644
|
||||
--- a/lib/Transforms/Scalar/LoopDeletion.cpp
|
||||
+++ b/lib/Transforms/Scalar/LoopDeletion.cpp
|
||||
@@ -195,15 +195,29 @@ bool LoopDeletion::runOnLoop(Loop *L, LPPassManager &LPM) {
|
||||
|
||||
// Rewrite phis in the exit block to get their inputs from
|
||||
// the preheader instead of the exiting block.
|
||||
- BasicBlock *exitingBlock = exitingBlocks[0];
|
||||
BasicBlock::iterator BI = exitBlock->begin();
|
||||
while (PHINode *P = dyn_cast<PHINode>(BI)) {
|
||||
- int j = P->getBasicBlockIndex(exitingBlock);
|
||||
- assert(j >= 0 && "Can't find exiting block in exit block's phi node!");
|
||||
- P->setIncomingBlock(j, preheader);
|
||||
- for (unsigned i = 1; i < exitingBlocks.size(); ++i)
|
||||
- P->removeIncomingValue(exitingBlocks[i]);
|
||||
+ // HLSL Change begin - apply https://reviews.llvm.org/D34516
|
||||
+ // Set the zero'th element of Phi to be from the preheader and remove all
|
||||
+ // other incoming values. Given the loop has dedicated exits, all other
|
||||
+ // incoming values must be from the exiting blocks.
|
||||
+ int PredIndex = 0;
|
||||
+ P->setIncomingBlock(PredIndex, preheader);
|
||||
+ // Removes all incoming values from all other exiting blocks (including
|
||||
+ // duplicate values from an exiting block).
|
||||
+ // Nuke all entries except the zero'th entry which is the preheader entry.
|
||||
+ // NOTE! We need to remove Incoming Values in the reverse order as done
|
||||
+ // below, to keep the indices valid for deletion (removeIncomingValues
|
||||
+ // updates getNumIncomingValues and shifts all values down into the operand
|
||||
+ // being deleted).
|
||||
+ for (unsigned i = 0, e = P->getNumIncomingValues() - 1; i != e; ++i)
|
||||
+ P->removeIncomingValue(e - i, false);
|
||||
+
|
||||
+ assert((P->getNumIncomingValues() == 1 &&
|
||||
+ P->getIncomingBlock(PredIndex) == preheader) &&
|
||||
+ "Should have exactly one value and that's from the preheader!");
|
||||
++BI;
|
||||
+ // HLSL Change end
|
||||
}
|
||||
|
||||
// Update the dominator tree and remove the instructions and blocks that will
|
||||
diff --git a/tools/clang/test/DXC/Passes/DxilLoopDeletion/dxil-loop-deletion-phi-with-duplicate-preds.ll b/tools/clang/test/DXC/Passes/DxilLoopDeletion/dxil-loop-deletion-phi-with-duplicate-preds.ll
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..62736bf2934a5db67ee75386431498f49e101f49
|
||||
--- /dev/null
|
||||
+++ b/tools/clang/test/DXC/Passes/DxilLoopDeletion/dxil-loop-deletion-phi-with-duplicate-preds.ll
|
||||
@@ -0,0 +1,229 @@
|
||||
+; RUN: %dxopt %s -hlsl-passes-resume -dxil-loop-deletion,NoSink=0 -S | FileCheck %s
|
||||
+
|
||||
+; This test was generated from the following HLSL:
|
||||
+;
|
||||
+; cbuffer cbuffer_g : register(b0) {
|
||||
+; uint4 gu4[1];
|
||||
+; };
|
||||
+;
|
||||
+; float4 f() {
|
||||
+; float4 r = float4(0.0f, 0.0f, 0.0f, 0.0f);
|
||||
+; int i = 0;
|
||||
+; int j = 0;
|
||||
+; while (true) {
|
||||
+; float a = asfloat(gu4[0].y);
|
||||
+; int ai = int(a);
|
||||
+; bool b = (j < ai);
|
||||
+; if (j >= ai) {
|
||||
+; break;
|
||||
+; }
|
||||
+; bool c = (i > 0);
|
||||
+; if (c) {
|
||||
+; break;
|
||||
+; } else {
|
||||
+; bool3 b3 = bool3(b.xxx);
|
||||
+; if (b3[i]) {
|
||||
+; switch(i) {
|
||||
+; case 0: return r;
|
||||
+; case -1: return r;
|
||||
+; }
|
||||
+; if (c) {
|
||||
+; break;
|
||||
+; }
|
||||
+; } else {
|
||||
+; r = float4(0.0f, 0.0f, 0.0f, a);
|
||||
+; }
|
||||
+; }
|
||||
+; i = j;
|
||||
+; j = (j + 1);
|
||||
+; }
|
||||
+; r = (0.0f).xxxx;
|
||||
+; return r;
|
||||
+; }
|
||||
+;
|
||||
+; struct return_val {
|
||||
+; float4 value : SV_Target0;
|
||||
+; };
|
||||
+;
|
||||
+; return_val main() {
|
||||
+; float4 inner_result = f();
|
||||
+; return_val wrapper_result = (return_val)0;
|
||||
+; wrapper_result.value = inner_result;
|
||||
+; return wrapper_result;
|
||||
+; }
|
||||
+;
|
||||
+; When compiling the above with dxc, ASAN reported a use-after-free in simplifycfg,
|
||||
+; which originated from a delete during the dxil-loop-deletion pass. This was due
|
||||
+; to a bug in LoopDeletion::runOnLoop that did not properly handle updated PHIs
|
||||
+; with duplicate input preds. After this test runs, the loop should be deleted,
|
||||
+; and the program optimized to simply write out 0s to the cbuffer.
|
||||
+
|
||||
+; CHECK: define void @main
|
||||
+; CHECK-NEXT: entry:
|
||||
+; CHECK-NEXT: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float 0.000000e+00)
|
||||
+; CHECK-NEXT: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float 0.000000e+00)
|
||||
+; CHECK-NEXT: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float 0.000000e+00)
|
||||
+; CHECK-NEXT: call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float 0.000000e+00)
|
||||
+; CHECK-NEXT: ret void
|
||||
+
|
||||
+;
|
||||
+; Output signature:
|
||||
+;
|
||||
+; Name Index InterpMode DynIdx
|
||||
+; -------------------- ----- ---------------------- ------
|
||||
+; SV_Target 0
|
||||
+;
|
||||
+; Buffer Definitions:
|
||||
+;
|
||||
+; cbuffer cbuffer_g
|
||||
+; {
|
||||
+;
|
||||
+; struct cbuffer_g
|
||||
+; {
|
||||
+;
|
||||
+; uint4 gu4[1]; ; Offset: 0
|
||||
+;
|
||||
+; } cbuffer_g; ; Offset: 0 Size: 16
|
||||
+;
|
||||
+; }
|
||||
+;
|
||||
+;
|
||||
+; Resource Bindings:
|
||||
+;
|
||||
+; Name Type Format Dim ID HLSL Bind Count
|
||||
+; ------------------------------ ---------- ------- ----------- ------- -------------- ------
|
||||
+; cbuffer_g cbuffer NA NA CB0 cb0 1
|
||||
+;
|
||||
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
|
||||
+target triple = "dxil-ms-dx"
|
||||
+
|
||||
+%cbuffer_g = type { [1 x <4 x i32>] }
|
||||
+%dx.types.Handle = type { i8* }
|
||||
+%dx.types.ResourceProperties = type { i32, i32 }
|
||||
+%dx.types.CBufRet.i32 = type { i32, i32, i32, i32 }
|
||||
+%struct.return_val = type { <4 x float> }
|
||||
+
|
||||
+@cbuffer_g = external constant %cbuffer_g
|
||||
+@.hca = internal unnamed_addr constant [3 x i32] [i32 1, i32 1, i32 1]
|
||||
+@llvm.used = appending global [1 x i8*] [i8* bitcast (%cbuffer_g* @cbuffer_g to i8*)], section "llvm.metadata"
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @"dx.hl.createhandle..%dx.types.Handle (i32, %cbuffer_g*, i32)"(i32, %cbuffer_g*, i32) #0
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @"dx.hl.annotatehandle..%dx.types.Handle (i32, %dx.types.Handle, %dx.types.ResourceProperties, %cbuffer_g)"(i32, %dx.types.Handle, %dx.types.ResourceProperties, %cbuffer_g) #0
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+define void @main(<4 x float>* noalias nocapture readnone) #1 {
|
||||
+entry:
|
||||
+ %1 = load %cbuffer_g, %cbuffer_g* @cbuffer_g, align 4, !dbg !25 ; line:45 col:25
|
||||
+ %cbuffer_g = call %dx.types.Handle @dx.op.createHandleForLib.cbuffer_g(i32 160, %cbuffer_g %1), !dbg !25 ; line:45 col:25 ; CreateHandleForLib(Resource)
|
||||
+ %2 = call %dx.types.Handle @dx.op.annotateHandle(i32 216, %dx.types.Handle %cbuffer_g, %dx.types.ResourceProperties { i32 13, i32 16 }), !dbg !25 ; line:45 col:25 ; AnnotateHandle(res,props) resource: CBuffer
|
||||
+ %3 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %2, i32 0), !dbg !29 ; line:10 col:23 ; CBufferLoadLegacy(handle,regIndex)
|
||||
+ %4 = extractvalue %dx.types.CBufRet.i32 %3, 1, !dbg !29 ; line:10 col:23
|
||||
+ %5 = bitcast i32 %4 to float, !dbg !32 ; line:10 col:15
|
||||
+ %conv.i.6 = fptosi float %5 to i32, !dbg !33 ; line:11 col:18
|
||||
+ %cmp1.i.8 = icmp sgt i32 %conv.i.6, 0, !dbg !34 ; line:13 col:11
|
||||
+ br i1 %cmp1.i.8, label %if.end.i, label %"\01?f@@YA?AV?$vector@M$03@@XZ.exit", !dbg !35 ; line:13 col:9
|
||||
+
|
||||
+if.end.i: ; preds = %entry, %if.end.19.i
|
||||
+ %6 = phi float [ %9, %if.end.19.i ], [ %5, %entry ]
|
||||
+ %j.i.011 = phi i32 [ %add.i, %if.end.19.i ], [ 0, %entry ]
|
||||
+ %r.i.0.i310 = phi float [ %r.i.0.i310, %if.end.19.i ], [ 0.000000e+00, %entry ]
|
||||
+ %i.i.09 = phi i32 [ %j.i.011, %if.end.19.i ], [ 0, %entry ]
|
||||
+ %cmp4.i = icmp sgt i32 %i.i.09, 0, !dbg !36 ; line:16 col:17
|
||||
+ br i1 %cmp4.i, label %"\01?f@@YA?AV?$vector@M$03@@XZ.exit", label %if.then.12.i, !dbg !37 ; line:17 col:9
|
||||
+
|
||||
+if.then.12.i: ; preds = %if.end.i
|
||||
+ switch i32 %i.i.09, label %if.end.19.i [
|
||||
+ i32 0, label %"\01?f@@YA?AV?$vector@M$03@@XZ.exit"
|
||||
+ i32 -1, label %"\01?f@@YA?AV?$vector@M$03@@XZ.exit"
|
||||
+ ], !dbg !38 ; line:22 col:9
|
||||
+
|
||||
+if.end.19.i: ; preds = %if.then.12.i
|
||||
+ %add.i = add nuw nsw i32 %j.i.011, 1, !dbg !39 ; line:34 col:12
|
||||
+ %7 = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %2, i32 0), !dbg !29 ; line:10 col:23 ; CBufferLoadLegacy(handle,regIndex)
|
||||
+ %8 = extractvalue %dx.types.CBufRet.i32 %7, 1, !dbg !29 ; line:10 col:23
|
||||
+ %9 = bitcast i32 %8 to float, !dbg !32 ; line:10 col:15
|
||||
+ %conv.i = fptosi float %9 to i32, !dbg !33 ; line:11 col:18
|
||||
+ %cmp.i = icmp slt i32 %add.i, %conv.i, !dbg !40 ; line:12 col:17
|
||||
+ br i1 %cmp.i, label %if.end.i, label %"\01?f@@YA?AV?$vector@M$03@@XZ.exit", !dbg !35 ; line:13 col:9
|
||||
+
|
||||
+"\01?f@@YA?AV?$vector@M$03@@XZ.exit": ; preds = %if.then.12.i, %if.then.12.i, %if.end.i, %if.end.19.i, %entry
|
||||
+ %retval.i.0.i3 = phi float [ 0.000000e+00, %entry ], [ %r.i.0.i310, %if.then.12.i ], [ %r.i.0.i310, %if.then.12.i ], [ 0.000000e+00, %if.end.i ], [ 0.000000e+00, %if.end.19.i ]
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 0, float 0.000000e+00), !dbg !41 ; line:48 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 1, float 0.000000e+00), !dbg !41 ; line:48 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 2, float 0.000000e+00), !dbg !41 ; line:48 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ call void @dx.op.storeOutput.f32(i32 5, i32 0, i32 0, i8 3, float %retval.i.0.i3), !dbg !41 ; line:48 col:10 ; StoreOutput(outputSigId,rowIndex,colIndex,value)
|
||||
+ ret void, !dbg !42 ; line:48 col:3
|
||||
+}
|
||||
+
|
||||
+; Function Attrs: nounwind
|
||||
+declare void @dx.op.storeOutput.f32(i32, i32, i32, i8, float) #1
|
||||
+
|
||||
+; Function Attrs: nounwind readonly
|
||||
+declare %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32, %dx.types.Handle, i32) #2
|
||||
+
|
||||
+; Function Attrs: nounwind readonly
|
||||
+declare %dx.types.Handle @dx.op.createHandleForLib.cbuffer_g(i32, %cbuffer_g) #2
|
||||
+
|
||||
+; Function Attrs: nounwind readnone
|
||||
+declare %dx.types.Handle @dx.op.annotateHandle(i32, %dx.types.Handle, %dx.types.ResourceProperties) #0
|
||||
+
|
||||
+attributes #0 = { nounwind readnone }
|
||||
+attributes #1 = { nounwind }
|
||||
+attributes #2 = { nounwind readonly }
|
||||
+
|
||||
+!llvm.module.flags = !{!0}
|
||||
+!pauseresume = !{!1}
|
||||
+!llvm.ident = !{!2}
|
||||
+!dx.version = !{!3}
|
||||
+!dx.valver = !{!4}
|
||||
+!dx.shaderModel = !{!5}
|
||||
+!dx.resources = !{!6}
|
||||
+!dx.typeAnnotations = !{!9, !14}
|
||||
+!dx.entryPoints = !{!21}
|
||||
+
|
||||
+!0 = !{i32 2, !"Debug Info Version", i32 3}
|
||||
+!1 = !{!"hlsl-dxilemit", !"hlsl-dxilload"}
|
||||
+!2 = !{!"dxc(private) 1.8.0.4514 (d9bd2a706-dirty)"}
|
||||
+!3 = !{i32 1, i32 5}
|
||||
+!4 = !{i32 1, i32 8}
|
||||
+!5 = !{!"ps", i32 6, i32 5}
|
||||
+!6 = !{null, null, !7, null}
|
||||
+!7 = !{!8}
|
||||
+!8 = !{i32 0, %cbuffer_g* @cbuffer_g, !"cbuffer_g", i32 0, i32 0, i32 1, i32 16, null}
|
||||
+!9 = !{i32 0, %struct.return_val undef, !10, %cbuffer_g undef, !12}
|
||||
+!10 = !{i32 16, !11}
|
||||
+!11 = !{i32 6, !"value", i32 3, i32 0, i32 4, !"SV_Target0", i32 7, i32 9}
|
||||
+!12 = !{i32 16, !13}
|
||||
+!13 = !{i32 6, !"gu4", i32 3, i32 0, i32 7, i32 5}
|
||||
+!14 = !{i32 1, void (<4 x float>*)* @main, !15}
|
||||
+!15 = !{!16, !18}
|
||||
+!16 = !{i32 0, !17, !17}
|
||||
+!17 = !{}
|
||||
+!18 = !{i32 1, !19, !20}
|
||||
+!19 = !{i32 4, !"SV_Target0", i32 7, i32 9}
|
||||
+!20 = !{i32 0}
|
||||
+!21 = !{void (<4 x float>*)* @main, !"main", !22, !6, null}
|
||||
+!22 = !{null, !23, null}
|
||||
+!23 = !{!24}
|
||||
+!24 = !{i32 0, !"SV_Target", i8 9, i8 16, !20, i8 0, i32 1, i8 4, i32 0, i8 0, null}
|
||||
+!25 = !DILocation(line: 45, column: 25, scope: !26)
|
||||
+!26 = !DISubprogram(name: "main", scope: !27, file: !27, line: 44, type: !28, isLocal: false, isDefinition: true, scopeLine: 44, flags: DIFlagPrototyped, isOptimized: false, function: void (<4 x float>*)* @main)
|
||||
+!27 = !DIFile(filename: "/mnt/c/Users/amaiorano/Downloads/340196361/standalone_reduced.hlsl", directory: "")
|
||||
+!28 = !DISubroutineType(types: !17)
|
||||
+!29 = !DILocation(line: 10, column: 23, scope: !30, inlinedAt: !31)
|
||||
+!30 = !DISubprogram(name: "f", scope: !27, file: !27, line: 5, type: !28, isLocal: false, isDefinition: true, scopeLine: 5, flags: DIFlagPrototyped, isOptimized: false)
|
||||
+!31 = distinct !DILocation(line: 45, column: 25, scope: !26)
|
||||
+!32 = !DILocation(line: 10, column: 15, scope: !30, inlinedAt: !31)
|
||||
+!33 = !DILocation(line: 11, column: 18, scope: !30, inlinedAt: !31)
|
||||
+!34 = !DILocation(line: 13, column: 11, scope: !30, inlinedAt: !31)
|
||||
+!35 = !DILocation(line: 13, column: 9, scope: !30, inlinedAt: !31)
|
||||
+!36 = !DILocation(line: 16, column: 17, scope: !30, inlinedAt: !31)
|
||||
+!37 = !DILocation(line: 17, column: 9, scope: !30, inlinedAt: !31)
|
||||
+!38 = !DILocation(line: 22, column: 9, scope: !30, inlinedAt: !31)
|
||||
+!39 = !DILocation(line: 34, column: 12, scope: !30, inlinedAt: !31)
|
||||
+!40 = !DILocation(line: 12, column: 17, scope: !30, inlinedAt: !31)
|
||||
+!41 = !DILocation(line: 48, column: 10, scope: !26)
|
||||
+!42 = !DILocation(line: 48, column: 3, scope: !26)
|
||||
1
patches/angle/.patches
Normal file
1
patches/angle/.patches
Normal file
@@ -0,0 +1 @@
|
||||
cherry-pick-5d4df51d1d7d.patch
|
||||
28
patches/angle/cherry-pick-5d4df51d1d7d.patch
Normal file
28
patches/angle/cherry-pick-5d4df51d1d7d.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
From 5d4df51d1d7d6a290d54111527a4798f10c7ca3c Mon Sep 17 00:00:00 2001
|
||||
From: Shahbaz Youssefi <syoussefi@chromium.org>
|
||||
Date: Thu, 13 Jun 2024 16:54:03 -0400
|
||||
Subject: [PATCH] M126: Vulkan: Disable VK_EXT_shader_stencil_export on SwiftShader
|
||||
|
||||
Bug: chromium:40942995
|
||||
Change-Id: I5035d9b11997a1c7c839d7d62544fecca9fd1f73
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/5634418
|
||||
Reviewed-by: Yuly Novikov <ynovikov@chromium.org>
|
||||
---
|
||||
|
||||
diff --git a/src/libANGLE/renderer/vulkan/vk_renderer.cpp b/src/libANGLE/renderer/vulkan/vk_renderer.cpp
|
||||
index 581c84b..f818130 100644
|
||||
--- a/src/libANGLE/renderer/vulkan/vk_renderer.cpp
|
||||
+++ b/src/libANGLE/renderer/vulkan/vk_renderer.cpp
|
||||
@@ -4287,9 +4287,11 @@
|
||||
}
|
||||
#endif // defined(ANGLE_PLATFORM_ANDROID) || defined(ANGLE_PLATFORM_LINUX)
|
||||
|
||||
+ // Disabled on SwiftShader due to http://crbug.com/40942995
|
||||
ANGLE_FEATURE_CONDITION(
|
||||
&mFeatures, supportsShaderStencilExport,
|
||||
- ExtensionFound(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, deviceExtensionNames));
|
||||
+ ExtensionFound(VK_EXT_SHADER_STENCIL_EXPORT_EXTENSION_NAME, deviceExtensionNames) &&
|
||||
+ !isSwiftShader);
|
||||
|
||||
ANGLE_FEATURE_CONDITION(
|
||||
&mFeatures, supportsRenderPassLoadStoreOpNone,
|
||||
@@ -133,3 +133,15 @@ refactor_expose_file_system_access_blocklist.patch
|
||||
cherry-pick-013961609785.patch
|
||||
feat_add_support_for_missing_dialog_features_to_shell_dialogs.patch
|
||||
revert_fix_ime_prevent_tsf_hang_chromium_window_when_dpi_changed.patch
|
||||
fix_font_face_resolution_when_renderer_is_blocked.patch
|
||||
x11_use_localized_display_label_only_for_browser_process.patch
|
||||
feat_enable_passing_exit_code_on_service_process_crash.patch
|
||||
feat_enable_customizing_symbol_color_in_framecaptionbutton.patch
|
||||
cherry-pick-44b7fbf35b10.patch
|
||||
cherry-pick-d54105311590.patch
|
||||
cherry-pick-43b8b682d05c.patch
|
||||
cherry-pick-c5dd8839bfaf.patch
|
||||
cherry-pick-38e4483e47f9.patch
|
||||
cherry-pick-1b9040817119.patch
|
||||
cherry-pick-99cafbf4b4b9.patch
|
||||
cherry-pick-d9f7652c867c.patch
|
||||
|
||||
84
patches/chromium/cherry-pick-1b9040817119.patch
Normal file
84
patches/chromium/cherry-pick-1b9040817119.patch
Normal file
@@ -0,0 +1,84 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Bryant Chandler <bryantchandler@chromium.org>
|
||||
Date: Mon, 24 Jun 2024 17:28:53 +0000
|
||||
Subject: Fix pointer tear down order problem
|
||||
|
||||
Holding a RenderFrameHost* in the `OnceBinding` isn't safe,
|
||||
because the `RenderFrameHost` can be destroyed before the
|
||||
binding. This CL changes the task strategy so that the
|
||||
RenderFrameHost* doesn't need to be bound in a callback.
|
||||
|
||||
Tested using the repro steps in the bug and this change stops
|
||||
it from reproducing.
|
||||
|
||||
Fixed: 347373236
|
||||
Change-Id: Id639f317b0f37a508833aba9fe52ffc5c0ed590c
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5640501
|
||||
Reviewed-by: Dave Tapuska <dtapuska@chromium.org>
|
||||
Commit-Queue: Bryant Chandler <bryantchandler@chromium.org>
|
||||
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1318653}
|
||||
|
||||
diff --git a/content/browser/renderer_host/media/media_stream_manager.cc b/content/browser/renderer_host/media/media_stream_manager.cc
|
||||
index 65bee7132f6583cb64d774756423942382c8eed6..2c27db7ee49193cbf91158d576e29bb255378a3e 100644
|
||||
--- a/content/browser/renderer_host/media/media_stream_manager.cc
|
||||
+++ b/content/browser/renderer_host/media/media_stream_manager.cc
|
||||
@@ -2887,25 +2887,19 @@ void MediaStreamManager::GetRawDeviceIdsOpenedForFrame(
|
||||
RenderFrameHost* render_frame_host,
|
||||
blink::mojom::MediaStreamType type,
|
||||
GetRawDeviceIdsOpenedForFrameCallback callback) const {
|
||||
- DCHECK_CURRENTLY_ON(BrowserThread::IO);
|
||||
- CHECK(render_frame_host);
|
||||
- auto collect_all_render_frame_host_ids = base::BindOnce(
|
||||
- [](RenderFrameHost* render_frame_host) {
|
||||
- base::flat_set<GlobalRenderFrameHostId> all_render_frame_host_ids;
|
||||
- render_frame_host->ForEachRenderFrameHost(
|
||||
- [&all_render_frame_host_ids](RenderFrameHost* render_frame_host) {
|
||||
- all_render_frame_host_ids.insert(
|
||||
- render_frame_host->GetGlobalId());
|
||||
- });
|
||||
- return all_render_frame_host_ids;
|
||||
- },
|
||||
- render_frame_host);
|
||||
-
|
||||
- GetUIThreadTaskRunner()->PostTaskAndReplyWithResult(
|
||||
- FROM_HERE, std::move(collect_all_render_frame_host_ids),
|
||||
- base::BindPostTaskToCurrentDefault(
|
||||
- base::BindOnce(&MediaStreamManager::GetRawDeviceIdsOpenedForFrameIds,
|
||||
- base::Unretained(this), type, std::move(callback))));
|
||||
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
+
|
||||
+ base::flat_set<GlobalRenderFrameHostId> all_render_frame_host_ids;
|
||||
+ render_frame_host->ForEachRenderFrameHost(
|
||||
+ [&all_render_frame_host_ids](RenderFrameHost* render_frame_host) {
|
||||
+ all_render_frame_host_ids.insert(render_frame_host->GetGlobalId());
|
||||
+ });
|
||||
+
|
||||
+ GetIOThreadTaskRunner()->PostTask(
|
||||
+ FROM_HERE,
|
||||
+ base::BindOnce(&MediaStreamManager::GetRawDeviceIdsOpenedForFrameIds,
|
||||
+ base::Unretained(this), type, std::move(callback),
|
||||
+ all_render_frame_host_ids));
|
||||
}
|
||||
|
||||
void MediaStreamManager::GetRawDeviceIdsOpenedForFrameIds(
|
||||
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
|
||||
index b0b1d0aea5bf251411d0cab06562fd77d8d7c549..819c73370d6e6fc5e6ab24e78646a206b6a5873d 100644
|
||||
--- a/content/browser/web_contents/web_contents_impl.cc
|
||||
+++ b/content/browser/web_contents/web_contents_impl.cc
|
||||
@@ -10808,12 +10808,9 @@ void WebContentsImpl::GetMediaCaptureRawDeviceIdsOpened(
|
||||
return;
|
||||
}
|
||||
|
||||
- GetIOThreadTaskRunner({})->PostTask(
|
||||
- FROM_HERE,
|
||||
- base::BindOnce(&MediaStreamManager::GetRawDeviceIdsOpenedForFrame,
|
||||
- base::Unretained(media_stream_manager),
|
||||
- GetPrimaryMainFrame(), type,
|
||||
- base::BindPostTaskToCurrentDefault(std::move(callback))));
|
||||
+ media_stream_manager->GetRawDeviceIdsOpenedForFrame(
|
||||
+ GetPrimaryMainFrame(), type,
|
||||
+ base::BindPostTaskToCurrentDefault(std::move(callback)));
|
||||
}
|
||||
|
||||
} // namespace content
|
||||
88
patches/chromium/cherry-pick-38e4483e47f9.patch
Normal file
88
patches/chromium/cherry-pick-38e4483e47f9.patch
Normal file
@@ -0,0 +1,88 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Johannes Kron <kron@chromium.org>
|
||||
Date: Wed, 19 Jun 2024 20:59:48 +0000
|
||||
Subject: Use BindPostTask() + weak pointer in callback handler
|
||||
|
||||
The callback handler incorrectly accessed member objects directly which may
|
||||
cause UAF. Avoid this by using BindPostTask() together with a weak pointer.
|
||||
|
||||
Fixed: 346898524
|
||||
Change-Id: I9d03d6decfd0212af88d3d0d8d70f83f1081d2e3
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5639016
|
||||
Reviewed-by: Avi Drissman <avi@chromium.org>
|
||||
Reviewed-by: Mark Foltz <mfoltz@chromium.org>
|
||||
Commit-Queue: Johannes Kron <kron@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1317142}
|
||||
|
||||
diff --git a/content/browser/media/capture/screen_capture_kit_device_mac.mm b/content/browser/media/capture/screen_capture_kit_device_mac.mm
|
||||
index 4fb3e8eb5f34a7ee9e8b0f22a7c842129cdc31eb..e2710fba1a8d7a4cee6023558898c74706a9c189 100644
|
||||
--- a/content/browser/media/capture/screen_capture_kit_device_mac.mm
|
||||
+++ b/content/browser/media/capture/screen_capture_kit_device_mac.mm
|
||||
@@ -326,13 +326,18 @@ void OnStreamSample(gfx::ScopedInUseIOSurface io_surface,
|
||||
destRectInFrame:dest_rect_in_frame
|
||||
frameRate:requested_capture_format_->
|
||||
frame_rate];
|
||||
+
|
||||
+ __block base::OnceCallback<void()> on_update_configuration_error =
|
||||
+ base::BindPostTask(
|
||||
+ device_task_runner_,
|
||||
+ base::BindOnce(
|
||||
+ &ScreenCaptureKitDeviceMac::OnUpdateConfigurationError,
|
||||
+ weak_factory_.GetWeakPtr()));
|
||||
[stream_
|
||||
updateConfiguration:config
|
||||
completionHandler:^(NSError* _Nullable error) {
|
||||
if (error) {
|
||||
- client()->OnError(
|
||||
- media::VideoCaptureError::kScreenCaptureKitStreamError,
|
||||
- FROM_HERE, "Error on updateConfiguration");
|
||||
+ std::move(on_update_configuration_error).Run();
|
||||
}
|
||||
}];
|
||||
}
|
||||
@@ -361,6 +366,21 @@ void OnStreamError() {
|
||||
FROM_HERE, "Stream delegate called didStopWithError");
|
||||
}
|
||||
}
|
||||
+ void OnUpdateContentFilterCompleted(NSError* _Nullable error) {
|
||||
+ DCHECK(device_task_runner_->RunsTasksInCurrentSequence());
|
||||
+ is_resetting_ = false;
|
||||
+
|
||||
+ if (error) {
|
||||
+ client()->OnError(media::VideoCaptureError::kScreenCaptureKitStreamError,
|
||||
+ FROM_HERE,
|
||||
+ "Error on updateContentFilter (fullscreen window).");
|
||||
+ }
|
||||
+ }
|
||||
+ void OnUpdateConfigurationError() {
|
||||
+ DCHECK(device_task_runner_->RunsTasksInCurrentSequence());
|
||||
+ client()->OnError(media::VideoCaptureError::kScreenCaptureKitStreamError,
|
||||
+ FROM_HERE, "Error on updateConfiguration");
|
||||
+ }
|
||||
|
||||
// IOSurfaceCaptureDeviceBase:
|
||||
void OnStart() override {
|
||||
@@ -411,15 +431,16 @@ void ResetStreamTo(SCWindow* window) override {
|
||||
SCContentFilter* filter =
|
||||
[[SCContentFilter alloc] initWithDesktopIndependentWindow:window];
|
||||
|
||||
+ __block base::OnceCallback<void(NSError*)>
|
||||
+ on_update_content_filter_completed = base::BindPostTask(
|
||||
+ device_task_runner_,
|
||||
+ base::BindOnce(
|
||||
+ &ScreenCaptureKitDeviceMac::OnUpdateContentFilterCompleted,
|
||||
+ weak_factory_.GetWeakPtr()));
|
||||
+
|
||||
[stream_ updateContentFilter:filter
|
||||
completionHandler:^(NSError* _Nullable error) {
|
||||
- is_resetting_ = false;
|
||||
- if (error) {
|
||||
- client()->OnError(
|
||||
- media::VideoCaptureError::kScreenCaptureKitStreamError,
|
||||
- FROM_HERE,
|
||||
- "Error on updateContentFilter (fullscreen window).");
|
||||
- }
|
||||
+ std::move(on_update_content_filter_completed).Run(error);
|
||||
}];
|
||||
}
|
||||
|
||||
264
patches/chromium/cherry-pick-43b8b682d05c.patch
Normal file
264
patches/chromium/cherry-pick-43b8b682d05c.patch
Normal file
@@ -0,0 +1,264 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Philip Pfaffe <pfaffe@chromium.org>
|
||||
Date: Tue, 18 Jun 2024 10:04:45 +0000
|
||||
Subject: Prevent script injection on reload when racing with a navigation
|
||||
|
||||
DevTools passes the loaderId now when calling Page.reload, in order to
|
||||
prevent accidentally reloading the wrong page when a navigation occurred
|
||||
concurrently. It can still happen that the navigation kicks in in between the reload iniated in the browser and the script injection that happens in the renderer, which would run the injected script on the wrong target. We need to check the loaderId also on the renderer side.
|
||||
|
||||
Fixed: 341136300
|
||||
Change-Id: I891fb37fa10e6789c8697a0f29bf7118788a9319
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5625857
|
||||
Reviewed-by: Andrey Kosyakov <caseq@chromium.org>
|
||||
Commit-Queue: Philip Pfaffe <pfaffe@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1316330}
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/inspector/build.gni b/third_party/blink/renderer/core/inspector/build.gni
|
||||
index 2e9feebe066f938506d63d157be65828aa2a27c9..39de006f5f97f9e2a84ee4d38f7bb98e99c41924 100644
|
||||
--- a/third_party/blink/renderer/core/inspector/build.gni
|
||||
+++ b/third_party/blink/renderer/core/inspector/build.gni
|
||||
@@ -138,6 +138,7 @@ blink_core_tests_inspector = [
|
||||
"inspector_emulation_agent_test.cc",
|
||||
"inspector_highlight_test.cc",
|
||||
"inspector_history_test.cc",
|
||||
+ "inspector_page_agent_unittest.cc",
|
||||
"inspector_preload_agent_unittest.cc",
|
||||
"inspector_media_context_impl_unittest.cc",
|
||||
"inspector_session_state_test.cc",
|
||||
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
|
||||
index 1825080b32ab6d7adb86236a389c08caf0b90c5c..f17565a6178c3f47037378faf965cd0f52cb0d26 100644
|
||||
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
|
||||
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.cc
|
||||
@@ -479,6 +479,42 @@ String InspectorPageAgent::CachedResourceTypeJson(
|
||||
return ResourceTypeJson(ToResourceType(cached_resource.GetType()));
|
||||
}
|
||||
|
||||
+InspectorPageAgent::PageReloadScriptInjection::PageReloadScriptInjection(
|
||||
+ InspectorAgentState& agent_state)
|
||||
+ : pending_script_to_evaluate_on_load_once_(&agent_state,
|
||||
+ /*default_value=*/{}),
|
||||
+ target_url_for_pending_script_(&agent_state,
|
||||
+ /*default_value=*/{}) {}
|
||||
+
|
||||
+void InspectorPageAgent::PageReloadScriptInjection::clear() {
|
||||
+ script_to_evaluate_on_load_once_ = {};
|
||||
+ pending_script_to_evaluate_on_load_once_.Set({});
|
||||
+ target_url_for_pending_script_.Set({});
|
||||
+}
|
||||
+
|
||||
+void InspectorPageAgent::PageReloadScriptInjection::SetPending(
|
||||
+ String script,
|
||||
+ const KURL& target_url) {
|
||||
+ pending_script_to_evaluate_on_load_once_.Set(script);
|
||||
+ target_url_for_pending_script_.Set(target_url.GetString().GetString());
|
||||
+}
|
||||
+
|
||||
+void InspectorPageAgent::PageReloadScriptInjection::PromoteToLoadOnce() {
|
||||
+ script_to_evaluate_on_load_once_ =
|
||||
+ pending_script_to_evaluate_on_load_once_.Get();
|
||||
+ target_url_for_active_script_ = target_url_for_pending_script_.Get();
|
||||
+ pending_script_to_evaluate_on_load_once_.Set({});
|
||||
+ target_url_for_pending_script_.Set({});
|
||||
+}
|
||||
+
|
||||
+String InspectorPageAgent::PageReloadScriptInjection::GetScriptForInjection(
|
||||
+ const KURL& target_url) {
|
||||
+ if (target_url_for_active_script_ == target_url.GetString()) {
|
||||
+ return script_to_evaluate_on_load_once_;
|
||||
+ }
|
||||
+ return {};
|
||||
+}
|
||||
+
|
||||
InspectorPageAgent::InspectorPageAgent(
|
||||
InspectedFrames* inspected_frames,
|
||||
Client* client,
|
||||
@@ -495,8 +531,6 @@ InspectorPageAgent::InspectorPageAgent(
|
||||
screencast_enabled_(&agent_state_, /*default_value=*/false),
|
||||
lifecycle_events_enabled_(&agent_state_, /*default_value=*/false),
|
||||
bypass_csp_enabled_(&agent_state_, /*default_value=*/false),
|
||||
- pending_script_to_evaluate_on_load_once_(&agent_state_,
|
||||
- /*default_value=*/String()),
|
||||
scripts_to_evaluate_on_load_(&agent_state_,
|
||||
/*default_value=*/String()),
|
||||
worlds_to_evaluate_on_load_(&agent_state_,
|
||||
@@ -506,7 +540,8 @@ InspectorPageAgent::InspectorPageAgent(
|
||||
/*default_value=*/false),
|
||||
standard_font_size_(&agent_state_, /*default_value=*/0),
|
||||
fixed_font_size_(&agent_state_, /*default_value=*/0),
|
||||
- script_font_families_cbor_(&agent_state_, std::vector<uint8_t>()) {}
|
||||
+ script_font_families_cbor_(&agent_state_, std::vector<uint8_t>()),
|
||||
+ script_injection_on_load_(agent_state_) {}
|
||||
|
||||
void InspectorPageAgent::Restore() {
|
||||
if (enabled_.Get())
|
||||
@@ -545,8 +580,7 @@ protocol::Response InspectorPageAgent::enable() {
|
||||
protocol::Response InspectorPageAgent::disable() {
|
||||
agent_state_.ClearAllFields();
|
||||
pending_isolated_worlds_.clear();
|
||||
- script_to_evaluate_on_load_once_ = String();
|
||||
- pending_script_to_evaluate_on_load_once_.Set(String());
|
||||
+ script_injection_on_load_.clear();
|
||||
instrumenting_agents_->RemoveInspectorPageAgent(this);
|
||||
inspector_resource_content_loader_->Cancel(
|
||||
resource_content_loader_client_id_);
|
||||
@@ -672,8 +706,9 @@ protocol::Response InspectorPageAgent::setAdBlockingEnabled(bool enable) {
|
||||
protocol::Response InspectorPageAgent::reload(
|
||||
Maybe<bool> optional_bypass_cache,
|
||||
Maybe<String> optional_script_to_evaluate_on_load) {
|
||||
- pending_script_to_evaluate_on_load_once_.Set(
|
||||
- optional_script_to_evaluate_on_load.value_or(""));
|
||||
+ script_injection_on_load_.SetPending(
|
||||
+ optional_script_to_evaluate_on_load.value_or(""),
|
||||
+ inspected_frames_->Root()->Loader().GetDocumentLoader()->Url());
|
||||
v8_session_->setSkipAllPauses(true);
|
||||
v8_session_->resume(true /* terminate on resume */);
|
||||
return protocol::Response::Success();
|
||||
@@ -989,7 +1024,9 @@ void InspectorPageAgent::DidCreateMainWorldContext(LocalFrame* frame) {
|
||||
EvaluateScriptOnNewDocument(*frame, key);
|
||||
}
|
||||
|
||||
- if (script_to_evaluate_on_load_once_.empty()) {
|
||||
+ String script = script_injection_on_load_.GetScriptForInjection(
|
||||
+ frame->Loader().GetDocumentLoader()->Url());
|
||||
+ if (script.empty()) {
|
||||
return;
|
||||
}
|
||||
ScriptState* script_state = ToScriptStateForMainWorld(frame);
|
||||
@@ -997,9 +1034,8 @@ void InspectorPageAgent::DidCreateMainWorldContext(LocalFrame* frame) {
|
||||
return;
|
||||
}
|
||||
|
||||
- v8_session_->evaluate(
|
||||
- script_state->GetContext(),
|
||||
- ToV8InspectorStringView(script_to_evaluate_on_load_once_));
|
||||
+ v8_session_->evaluate(script_state->GetContext(),
|
||||
+ ToV8InspectorStringView(script));
|
||||
}
|
||||
|
||||
void InspectorPageAgent::EvaluateScriptOnNewDocument(
|
||||
@@ -1049,9 +1085,7 @@ void InspectorPageAgent::LoadEventFired(LocalFrame* frame) {
|
||||
|
||||
void InspectorPageAgent::WillCommitLoad(LocalFrame*, DocumentLoader* loader) {
|
||||
if (loader->GetFrame() == inspected_frames_->Root()) {
|
||||
- script_to_evaluate_on_load_once_ =
|
||||
- pending_script_to_evaluate_on_load_once_.Get();
|
||||
- pending_script_to_evaluate_on_load_once_.Set(String());
|
||||
+ script_injection_on_load_.PromoteToLoadOnce();
|
||||
}
|
||||
GetFrontend()->frameNavigated(BuildObjectForFrame(loader->GetFrame()),
|
||||
protocol::Page::NavigationTypeEnum::Navigation);
|
||||
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent.h b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
|
||||
index 6e6263beee810946d03934e7f707bb49a3177a2f..e7003baa895494bf61ad06f875d825ac9f53aec2 100644
|
||||
--- a/third_party/blink/renderer/core/inspector/inspector_page_agent.h
|
||||
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent.h
|
||||
@@ -94,6 +94,22 @@ class CORE_EXPORT InspectorPageAgent final
|
||||
kOtherResource
|
||||
};
|
||||
|
||||
+ class CORE_EXPORT PageReloadScriptInjection {
|
||||
+ private:
|
||||
+ String script_to_evaluate_on_load_once_;
|
||||
+ String target_url_for_active_script_;
|
||||
+ InspectorAgentState::String pending_script_to_evaluate_on_load_once_;
|
||||
+ InspectorAgentState::String target_url_for_pending_script_;
|
||||
+
|
||||
+ public:
|
||||
+ explicit PageReloadScriptInjection(InspectorAgentState&);
|
||||
+
|
||||
+ void clear();
|
||||
+ void SetPending(String script, const KURL& target_url);
|
||||
+ void PromoteToLoadOnce();
|
||||
+ String GetScriptForInjection(const KURL& target_url);
|
||||
+ };
|
||||
+
|
||||
static bool CachedResourceContent(const Resource*,
|
||||
String* result,
|
||||
bool* base64_encoded);
|
||||
@@ -307,7 +323,6 @@ class CORE_EXPORT InspectorPageAgent final
|
||||
ad_script_identifiers_;
|
||||
v8_inspector::V8InspectorSession* v8_session_;
|
||||
Client* client_;
|
||||
- String script_to_evaluate_on_load_once_;
|
||||
Member<InspectorResourceContentLoader> inspector_resource_content_loader_;
|
||||
int resource_content_loader_client_id_;
|
||||
InspectorAgentState::Boolean intercept_file_chooser_;
|
||||
@@ -315,7 +330,6 @@ class CORE_EXPORT InspectorPageAgent final
|
||||
InspectorAgentState::Boolean screencast_enabled_;
|
||||
InspectorAgentState::Boolean lifecycle_events_enabled_;
|
||||
InspectorAgentState::Boolean bypass_csp_enabled_;
|
||||
- InspectorAgentState::String pending_script_to_evaluate_on_load_once_;
|
||||
InspectorAgentState::StringMap scripts_to_evaluate_on_load_;
|
||||
InspectorAgentState::StringMap worlds_to_evaluate_on_load_;
|
||||
InspectorAgentState::BooleanMap
|
||||
@@ -323,6 +337,7 @@ class CORE_EXPORT InspectorPageAgent final
|
||||
InspectorAgentState::Integer standard_font_size_;
|
||||
InspectorAgentState::Integer fixed_font_size_;
|
||||
InspectorAgentState::Bytes script_font_families_cbor_;
|
||||
+ PageReloadScriptInjection script_injection_on_load_;
|
||||
};
|
||||
|
||||
} // namespace blink
|
||||
diff --git a/third_party/blink/renderer/core/inspector/inspector_page_agent_unittest.cc b/third_party/blink/renderer/core/inspector/inspector_page_agent_unittest.cc
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..b81f6b4735392f3f542ccbb2a114c2def185be1c
|
||||
--- /dev/null
|
||||
+++ b/third_party/blink/renderer/core/inspector/inspector_page_agent_unittest.cc
|
||||
@@ -0,0 +1,57 @@
|
||||
+// Copyright 2024 The Chromium Authors
|
||||
+// Use of this source code is governed by a BSD-style license that can be
|
||||
+// found in the LICENSE file.
|
||||
+
|
||||
+#include "third_party/blink/renderer/core/inspector/inspector_page_agent.h"
|
||||
+
|
||||
+#include "testing/gtest/include/gtest/gtest.h"
|
||||
+#include "third_party/blink/renderer/core/inspector/inspector_session_state.h"
|
||||
+#include "third_party/blink/renderer/platform/weborigin/kurl.h"
|
||||
+
|
||||
+class PageReloadScriptInjectionTest : public testing::Test {
|
||||
+ protected:
|
||||
+ blink::mojom::blink::DevToolsSessionStatePtr session_state_cookie_;
|
||||
+ blink::InspectorAgentState agent_state_;
|
||||
+ blink::InspectorPageAgent::PageReloadScriptInjection injection_;
|
||||
+ blink::InspectorSessionState state_;
|
||||
+
|
||||
+ public:
|
||||
+ PageReloadScriptInjectionTest()
|
||||
+ : agent_state_("page"),
|
||||
+ injection_(agent_state_),
|
||||
+ state_(session_state_cookie_.Clone()) {}
|
||||
+
|
||||
+ void SetUp() override { agent_state_.InitFrom(&state_); }
|
||||
+};
|
||||
+
|
||||
+TEST_F(PageReloadScriptInjectionTest, PromotesScript) {
|
||||
+ blink::KURL url("http://example.com");
|
||||
+ injection_.SetPending("script", url);
|
||||
+ ASSERT_TRUE(injection_.GetScriptForInjection(url).empty());
|
||||
+ injection_.PromoteToLoadOnce();
|
||||
+ ASSERT_EQ(injection_.GetScriptForInjection(url), "script");
|
||||
+ injection_.PromoteToLoadOnce();
|
||||
+ ASSERT_TRUE(injection_.GetScriptForInjection(url).empty());
|
||||
+}
|
||||
+
|
||||
+TEST_F(PageReloadScriptInjectionTest, ClearsScript) {
|
||||
+ blink::KURL url("http://example.com");
|
||||
+ injection_.SetPending("script", url);
|
||||
+ injection_.clear();
|
||||
+ injection_.PromoteToLoadOnce();
|
||||
+ ASSERT_TRUE(injection_.GetScriptForInjection(url).empty());
|
||||
+
|
||||
+ injection_.SetPending("script", url);
|
||||
+ injection_.PromoteToLoadOnce();
|
||||
+ ASSERT_EQ(injection_.GetScriptForInjection(url), "script");
|
||||
+ injection_.clear();
|
||||
+ ASSERT_TRUE(injection_.GetScriptForInjection(url).empty());
|
||||
+}
|
||||
+
|
||||
+TEST_F(PageReloadScriptInjectionTest, ChecksLoaderId) {
|
||||
+ blink::KURL url("http://example.com");
|
||||
+ blink::KURL url2("about:blank");
|
||||
+ injection_.SetPending("script", url);
|
||||
+ injection_.PromoteToLoadOnce();
|
||||
+ ASSERT_TRUE(injection_.GetScriptForInjection(url2).empty());
|
||||
+}
|
||||
288
patches/chromium/cherry-pick-44b7fbf35b10.patch
Normal file
288
patches/chromium/cherry-pick-44b7fbf35b10.patch
Normal file
@@ -0,0 +1,288 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Hiroshige Hayashizaki <hiroshige@chromium.org>
|
||||
Date: Tue, 16 Jul 2024 03:44:29 +0000
|
||||
Subject: Handle ThrottlingURLLoader deletion during throttle calls
|
||||
|
||||
Theoretically `ThrottlingURLLoader` can be deleted during
|
||||
throttle calls and some call sites have already protection
|
||||
for such cases. This CL adds the protection for more call sites.
|
||||
|
||||
This CL also adds more unit tests for cancelling/deleting
|
||||
`ThrottlingURLLoader` during throttle calls.
|
||||
|
||||
(cherry picked from commit c40f8866cfd6438725cc58e5db2d792e6d9f869b)
|
||||
|
||||
Bug: 349342289
|
||||
Change-Id: I80d64be9ba1a3ac920315f5b4012b29c9737e414
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5665925
|
||||
Commit-Queue: Hiroshige Hayashizaki <hiroshige@chromium.org>
|
||||
Reviewed-by: Tsuyoshi Horo <horo@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/main@{#1323986}
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5710951
|
||||
Bot-Commit: Rubber Stamper <rubber-stamper@appspot.gserviceaccount.com>
|
||||
Reviewed-by: Kouhei Ueno <kouhei@chromium.org>
|
||||
Cr-Commit-Position: refs/branch-heads/6533@{#1515}
|
||||
Cr-Branched-From: 7e0b87ec6b8cb5cb2969e1479fc25776e582721d-refs/heads/main@{#1313161}
|
||||
|
||||
diff --git a/third_party/blink/common/loader/throttling_url_loader.cc b/third_party/blink/common/loader/throttling_url_loader.cc
|
||||
index d2de163172880bd23f7478c6743c2608a5f04d94..28f55e1b3867cbd1ff3817c21c1f648fef4fcbc7 100644
|
||||
--- a/third_party/blink/common/loader/throttling_url_loader.cc
|
||||
+++ b/third_party/blink/common/loader/throttling_url_loader.cc
|
||||
@@ -660,8 +660,12 @@ void ThrottlingURLLoader::OnReceiveResponse(
|
||||
for (auto& entry : throttles_) {
|
||||
auto* throttle = entry.throttle.get();
|
||||
base::Time start = base::Time::Now();
|
||||
+ auto weak_ptr = weak_factory_.GetWeakPtr();
|
||||
throttle->BeforeWillProcessResponse(response_url_, *response_head,
|
||||
&has_pending_restart);
|
||||
+ if (!weak_ptr) {
|
||||
+ return;
|
||||
+ }
|
||||
RecordExecutionTimeHistogram("BeforeWillProcessResponse", start);
|
||||
if (!HandleThrottleResult(throttle)) {
|
||||
return;
|
||||
@@ -681,8 +685,12 @@ void ThrottlingURLLoader::OnReceiveResponse(
|
||||
auto* throttle = entry.throttle.get();
|
||||
bool throttle_deferred = false;
|
||||
base::Time start = base::Time::Now();
|
||||
+ auto weak_ptr = weak_factory_.GetWeakPtr();
|
||||
throttle->WillProcessResponse(response_url_, response_head.get(),
|
||||
&throttle_deferred);
|
||||
+ if (!weak_ptr) {
|
||||
+ return;
|
||||
+ }
|
||||
RecordExecutionTimeHistogram(GetStageNameForHistogram(DEFERRED_RESPONSE),
|
||||
start);
|
||||
if (!HandleThrottleResult(throttle, throttle_deferred, &deferred))
|
||||
@@ -852,7 +860,11 @@ void ThrottlingURLLoader::OnComplete(
|
||||
for (auto& entry : throttles_) {
|
||||
auto* throttle = entry.throttle.get();
|
||||
base::Time start = base::Time::Now();
|
||||
+ auto weak_ptr = weak_factory_.GetWeakPtr();
|
||||
throttle->WillOnCompleteWithError(status);
|
||||
+ if (!weak_ptr) {
|
||||
+ return;
|
||||
+ }
|
||||
RecordExecutionTimeHistogram("WillOnCompleteWithError", start);
|
||||
if (!HandleThrottleResult(throttle)) {
|
||||
return;
|
||||
diff --git a/third_party/blink/common/loader/throttling_url_loader_unittest.cc b/third_party/blink/common/loader/throttling_url_loader_unittest.cc
|
||||
index 2c73705d12445c13067e937b4bfae1c99290da09..a7e037b2dde9390d9cc15d863ed926809f9afccf 100644
|
||||
--- a/third_party/blink/common/loader/throttling_url_loader_unittest.cc
|
||||
+++ b/third_party/blink/common/loader/throttling_url_loader_unittest.cc
|
||||
@@ -338,9 +338,9 @@ class TestURLLoaderThrottle : public blink::URLLoaderThrottle {
|
||||
network::mojom::URLResponseHead* response_head,
|
||||
bool* defer) override {
|
||||
will_process_response_called_++;
|
||||
+ response_url_ = response_url;
|
||||
if (will_process_response_callback_)
|
||||
will_process_response_callback_.Run(delegate_.get(), defer);
|
||||
- response_url_ = response_url;
|
||||
}
|
||||
|
||||
void BeforeWillProcessResponse(
|
||||
@@ -422,6 +422,11 @@ class ThrottlingURLLoaderTest : public testing::Test {
|
||||
factory_.factory_remote().FlushForTesting();
|
||||
}
|
||||
|
||||
+ void ResetLoader() {
|
||||
+ ResetThrottleRawPointer();
|
||||
+ loader_.reset();
|
||||
+ }
|
||||
+
|
||||
void ResetThrottleRawPointer() { throttle_ = nullptr; }
|
||||
|
||||
// Be the first member so it is destroyed last.
|
||||
@@ -467,6 +472,25 @@ TEST_F(ThrottlingURLLoaderTest, CancelBeforeStart) {
|
||||
EXPECT_EQ(1u, client_.on_complete_called());
|
||||
}
|
||||
|
||||
+TEST_F(ThrottlingURLLoaderTest, DeleteBeforeStart) {
|
||||
+ base::RunLoop run_loop;
|
||||
+ throttle_->set_will_start_request_callback(base::BindLambdaForTesting(
|
||||
+ [this, &run_loop](blink::URLLoaderThrottle::Delegate* delegate,
|
||||
+ bool* defer) {
|
||||
+ ResetLoader();
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(1u, factory_.create_loader_and_start_called());
|
||||
+
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(0u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
TEST_F(ThrottlingURLLoaderTest, DeferBeforeStart) {
|
||||
throttle_->set_will_start_request_callback(base::BindLambdaForTesting(
|
||||
[](blink::URLLoaderThrottle::Delegate* delegate, bool* defer) {
|
||||
@@ -667,6 +691,88 @@ TEST_F(ThrottlingURLLoaderTest, CancelBeforeRedirect) {
|
||||
EXPECT_EQ(1u, client_.on_complete_called());
|
||||
}
|
||||
|
||||
+TEST_F(ThrottlingURLLoaderTest, DeleteBeforeRedirect) {
|
||||
+ base::RunLoop run_loop;
|
||||
+ throttle_->set_will_redirect_request_callback(base::BindLambdaForTesting(
|
||||
+ [this, &run_loop](
|
||||
+ blink::URLLoaderThrottle::Delegate* delegate, bool* /* defer */,
|
||||
+ std::vector<std::string>* /* removed_headers */,
|
||||
+ net::HttpRequestHeaders* /* modified_headers */,
|
||||
+ net::HttpRequestHeaders* /* modified_cors_exempt_headers */) {
|
||||
+ ResetLoader();
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+
|
||||
+ factory_.NotifyClientOnReceiveRedirect();
|
||||
+
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(0u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
+TEST_F(ThrottlingURLLoaderTest, CancelBeforeWillRedirect) {
|
||||
+ throttle_->set_before_will_redirect_request_callback(
|
||||
+ base::BindLambdaForTesting(
|
||||
+ [](blink::URLLoaderThrottle::Delegate* delegate,
|
||||
+ RestartWithURLReset* restart_with_url_reset,
|
||||
+ std::vector<std::string>* /* removed_headers */,
|
||||
+ net::HttpRequestHeaders* /* modified_headers */,
|
||||
+ net::HttpRequestHeaders* /* modified_cors_exempt_headers */) {
|
||||
+ delegate->CancelWithError(net::ERR_ACCESS_DENIED);
|
||||
+ }));
|
||||
+
|
||||
+ base::RunLoop run_loop;
|
||||
+ client_.set_on_complete_callback(
|
||||
+ base::BindLambdaForTesting([&run_loop](int error) {
|
||||
+ EXPECT_EQ(net::ERR_ACCESS_DENIED, error);
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+
|
||||
+ factory_.NotifyClientOnReceiveRedirect();
|
||||
+
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(1u, throttle_->will_start_request_called());
|
||||
+ EXPECT_EQ(1u, throttle_->will_redirect_request_called());
|
||||
+ EXPECT_EQ(0u, throttle_->before_will_process_response_called());
|
||||
+ EXPECT_EQ(0u, throttle_->will_process_response_called());
|
||||
+
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(1u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
+TEST_F(ThrottlingURLLoaderTest, DeleteBeforeWillRedirect) {
|
||||
+ base::RunLoop run_loop;
|
||||
+ throttle_->set_before_will_redirect_request_callback(
|
||||
+ base::BindLambdaForTesting(
|
||||
+ [this, &run_loop](
|
||||
+ blink::URLLoaderThrottle::Delegate* delegate,
|
||||
+ RestartWithURLReset* restart_with_url_reset,
|
||||
+ std::vector<std::string>* /* removed_headers */,
|
||||
+ net::HttpRequestHeaders* /* modified_headers */,
|
||||
+ net::HttpRequestHeaders* /* modified_cors_exempt_headers */) {
|
||||
+ ResetLoader();
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+
|
||||
+ factory_.NotifyClientOnReceiveRedirect();
|
||||
+
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(0u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
TEST_F(ThrottlingURLLoaderTest, DeferBeforeRedirect) {
|
||||
base::RunLoop run_loop1;
|
||||
throttle_->set_will_redirect_request_callback(base::BindLambdaForTesting(
|
||||
@@ -880,6 +986,77 @@ TEST_F(ThrottlingURLLoaderTest, CancelBeforeResponse) {
|
||||
EXPECT_EQ(1u, client_.on_complete_called());
|
||||
}
|
||||
|
||||
+TEST_F(ThrottlingURLLoaderTest, DeleteBeforeResponse) {
|
||||
+ base::RunLoop run_loop;
|
||||
+ throttle_->set_will_process_response_callback(base::BindLambdaForTesting(
|
||||
+ [this, &run_loop](blink::URLLoaderThrottle::Delegate* delegate,
|
||||
+ bool* defer) {
|
||||
+ ResetLoader();
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+
|
||||
+ factory_.NotifyClientOnReceiveResponse();
|
||||
+
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(0u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
+TEST_F(ThrottlingURLLoaderTest, CancelBeforeWillProcessResponse) {
|
||||
+ throttle_->set_before_will_process_response_callback(
|
||||
+ base::BindLambdaForTesting(
|
||||
+ [](blink::URLLoaderThrottle::Delegate* delegate,
|
||||
+ RestartWithURLReset* restart_with_url_reset) {
|
||||
+ delegate->CancelWithError(net::ERR_ACCESS_DENIED);
|
||||
+ }));
|
||||
+
|
||||
+ base::RunLoop run_loop;
|
||||
+ client_.set_on_complete_callback(
|
||||
+ base::BindLambdaForTesting([&run_loop](int error) {
|
||||
+ EXPECT_EQ(net::ERR_ACCESS_DENIED, error);
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+
|
||||
+ factory_.NotifyClientOnReceiveResponse();
|
||||
+
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(1u, throttle_->will_start_request_called());
|
||||
+ EXPECT_EQ(0u, throttle_->will_redirect_request_called());
|
||||
+ EXPECT_EQ(1u, throttle_->before_will_process_response_called());
|
||||
+ EXPECT_EQ(0u, throttle_->will_process_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(1u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
+TEST_F(ThrottlingURLLoaderTest, DeleteBeforeWillProcessResponse) {
|
||||
+ base::RunLoop run_loop;
|
||||
+ throttle_->set_before_will_process_response_callback(
|
||||
+ base::BindLambdaForTesting(
|
||||
+ [this, &run_loop](blink::URLLoaderThrottle::Delegate* delegate,
|
||||
+ RestartWithURLReset* restart_with_url_reset) {
|
||||
+ ResetLoader();
|
||||
+ run_loop.Quit();
|
||||
+ }));
|
||||
+
|
||||
+ CreateLoaderAndStart();
|
||||
+
|
||||
+ factory_.NotifyClientOnReceiveResponse();
|
||||
+
|
||||
+ run_loop.Run();
|
||||
+
|
||||
+ EXPECT_EQ(0u, client_.on_received_response_called());
|
||||
+ EXPECT_EQ(0u, client_.on_received_redirect_called());
|
||||
+ EXPECT_EQ(0u, client_.on_complete_called());
|
||||
+}
|
||||
+
|
||||
TEST_F(ThrottlingURLLoaderTest, DeferBeforeResponse) {
|
||||
base::RunLoop run_loop1;
|
||||
throttle_->set_will_process_response_callback(base::BindRepeating(
|
||||
166
patches/chromium/cherry-pick-99cafbf4b4b9.patch
Normal file
166
patches/chromium/cherry-pick-99cafbf4b4b9.patch
Normal file
@@ -0,0 +1,166 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Yann Dago <ydago@chromium.org>
|
||||
Date: Mon, 8 Jul 2024 16:20:32 +0000
|
||||
Subject: Ensure chrome://policy/test messages ignored when not supported
|
||||
|
||||
It was possible to go to chrome://policy and in the dev tools and send
|
||||
the right message to set test policies even if the policy test page was disabled and/or unavailable because both pages share the same handler.
|
||||
|
||||
Bug: 338248595
|
||||
Change-Id: If689325999cb108b2b71b2821d905e42efd3390d
|
||||
Low-Coverage-Reason: TRIVIAL_CHANGE
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5679162
|
||||
Auto-Submit: Yann Dago <ydago@chromium.org>
|
||||
Reviewed-by: Rohit Rao <rohitrao@chromium.org>
|
||||
Reviewed-by: Sergey Poromov <poromov@chromium.org>
|
||||
Commit-Queue: Rohit Rao <rohitrao@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1324277}
|
||||
|
||||
diff --git a/chrome/browser/ui/webui/policy/policy_test_ui_browsertest.cc b/chrome/browser/ui/webui/policy/policy_test_ui_browsertest.cc
|
||||
index e27325a18087c8a01d21111f2fa0dd6e6da60023..a03c639b8654a5cbedccc3c38de4007dba084bf8 100644
|
||||
--- a/chrome/browser/ui/webui/policy/policy_test_ui_browsertest.cc
|
||||
+++ b/chrome/browser/ui/webui/policy/policy_test_ui_browsertest.cc
|
||||
@@ -8,6 +8,7 @@
|
||||
#include "base/test/scoped_feature_list.h"
|
||||
#include "build/build_config.h"
|
||||
#include "build/chromeos_buildflags.h"
|
||||
+#include "chrome/browser/enterprise/browser_management/browser_management_service.h"
|
||||
#include "chrome/browser/enterprise/browser_management/management_service_factory.h"
|
||||
#include "chrome/browser/lifetime/application_lifetime.h"
|
||||
#include "chrome/browser/policy/chrome_browser_policy_connector.h"
|
||||
@@ -270,6 +271,57 @@ class PolicyTestHandlerTest : public PlatformBrowserTest {
|
||||
#endif
|
||||
};
|
||||
|
||||
+IN_PROC_BROWSER_TEST_F(PolicyTestHandlerTest,
|
||||
+ HandleSetLocalTestPoliciesNotSupported) {
|
||||
+ // Ensure chrome://policy/test not supported.
|
||||
+ policy::ScopedManagementServiceOverrideForTesting profile_management(
|
||||
+ policy::ManagementServiceFactory::GetForProfile(GetProfile()),
|
||||
+ policy::EnterpriseManagementAuthority::CLOUD);
|
||||
+ std::unique_ptr<PolicyUIHandler> handler = SetUpHandler();
|
||||
+ const std::string jsonString =
|
||||
+ R"([
|
||||
+ {"level": 0,"scope": 0,"source": 0, "namespace": "chrome",
|
||||
+ "name": "AutofillAddressEnabled","value": false},
|
||||
+ {"level": 1,"scope": 1,"source": 2, "namespace": "chrome",
|
||||
+ "name": "CloudReportingEnabled","value": true}
|
||||
+ ])";
|
||||
+ const std::string revertAppliedPoliciesButtonDisabledJs =
|
||||
+ R"(
|
||||
+ document
|
||||
+ .querySelector('#revert-applied-policies')
|
||||
+ .disabled;
|
||||
+ )";
|
||||
+
|
||||
+ base::Value::List list_args;
|
||||
+
|
||||
+ list_args.Append("setLocalTestPolicies");
|
||||
+ list_args.Append(jsonString);
|
||||
+ list_args.Append("{}");
|
||||
+
|
||||
+ // Open chrome://policy
|
||||
+ ASSERT_TRUE(
|
||||
+ content::NavigateToURL(web_contents(), GURL(chrome::kChromeUIPolicyURL)));
|
||||
+ web_ui()->HandleReceivedMessage("setLocalTestPolicies", list_args);
|
||||
+
|
||||
+ base::RunLoop().RunUntilIdle();
|
||||
+
|
||||
+ const policy::PolicyNamespace chrome_namespace(policy::POLICY_DOMAIN_CHROME,
|
||||
+ std::string());
|
||||
+ policy::PolicyService* policy_service =
|
||||
+ GetProfile()->GetProfilePolicyConnector()->policy_service();
|
||||
+
|
||||
+ // Check policies not applied
|
||||
+ const policy::PolicyMap* policy_map =
|
||||
+ &policy_service->GetPolicies(chrome_namespace);
|
||||
+ ASSERT_TRUE(policy_map);
|
||||
+
|
||||
+ {
|
||||
+ const policy::PolicyMap::Entry* entry =
|
||||
+ policy_map->Get(policy::key::kAutofillAddressEnabled);
|
||||
+ ASSERT_FALSE(entry);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
IN_PROC_BROWSER_TEST_F(PolicyTestHandlerTest,
|
||||
HandleSetAndRevertLocalTestPolicies) {
|
||||
if (!policy::utils::IsPolicyTestingEnabled(/*pref_service=*/nullptr,
|
||||
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
|
||||
index 0d13979009fc4df379432d5eea1a394607203615..1dc6ecc6bed91115be10021c0661f8d81456161b 100644
|
||||
--- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc
|
||||
+++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
|
||||
@@ -49,6 +49,7 @@
|
||||
#include "chrome/browser/ui/chrome_select_file_policy.h"
|
||||
#include "chrome/browser/ui/webui/policy/policy_ui.h"
|
||||
#include "chrome/browser/ui/webui/webui_util.h"
|
||||
+#include "chrome/common/channel_info.h"
|
||||
#include "chrome/grit/branded_strings.h"
|
||||
#include "components/crx_file/id_util.h"
|
||||
#include "components/enterprise/browser/controller/browser_dm_token_storage.h"
|
||||
@@ -69,6 +70,7 @@
|
||||
#include "components/policy/core/common/policy_pref_names.h"
|
||||
#include "components/policy/core/common/policy_scheduler.h"
|
||||
#include "components/policy/core/common/policy_types.h"
|
||||
+#include "components/policy/core/common/policy_utils.h"
|
||||
#include "components/policy/core/common/remote_commands/remote_commands_service.h"
|
||||
#include "components/policy/core/common/schema.h"
|
||||
#include "components/policy/core/common/schema_map.h"
|
||||
@@ -316,6 +318,12 @@ void PolicyUIHandler::HandleCopyPoliciesJson(const base::Value::List& args) {
|
||||
void PolicyUIHandler::HandleSetLocalTestPolicies(
|
||||
const base::Value::List& args) {
|
||||
std::string policies = args[1].GetString();
|
||||
+ AllowJavascript();
|
||||
+
|
||||
+ if (!PolicyUI::ShouldLoadTestPage(Profile::FromWebUI(web_ui()))) {
|
||||
+ ResolveJavascriptCallback(args[0], true);
|
||||
+ return;
|
||||
+ }
|
||||
|
||||
policy::LocalTestPolicyProvider* local_test_provider =
|
||||
static_cast<policy::LocalTestPolicyProvider*>(
|
||||
@@ -338,12 +346,14 @@ void PolicyUIHandler::HandleSetLocalTestPolicies(
|
||||
->UseLocalTestPolicyProvider();
|
||||
|
||||
local_test_provider->LoadJsonPolicies(policies);
|
||||
- AllowJavascript();
|
||||
ResolveJavascriptCallback(args[0], true);
|
||||
}
|
||||
|
||||
void PolicyUIHandler::HandleRevertLocalTestPolicies(
|
||||
const base::Value::List& args) {
|
||||
+ if (!PolicyUI::ShouldLoadTestPage(Profile::FromWebUI(web_ui()))) {
|
||||
+ return;
|
||||
+ }
|
||||
#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS)
|
||||
Profile::FromWebUI(web_ui())->GetPrefs()->ClearPref(
|
||||
prefs::kUserCloudSigninPolicyResponseFromPolicyTestPage);
|
||||
diff --git a/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm b/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
|
||||
index 577caf2012e0cdcdcf5baa4c5a288119da40cabd..94466842c2faeb13fd0ae33ba619362f8a43cd06 100644
|
||||
--- a/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
|
||||
+++ b/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
|
||||
@@ -220,6 +220,12 @@
|
||||
const base::Value::List& args) {
|
||||
std::string json_policies_string = args[1].GetString();
|
||||
|
||||
+ if (!PolicyUI::ShouldLoadTestPage(
|
||||
+ ChromeBrowserState::FromWebUIIOS(web_ui()))) {
|
||||
+ web_ui()->ResolveJavascriptCallback(args[0], true);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
policy::LocalTestPolicyProvider* local_test_provider =
|
||||
static_cast<policy::LocalTestPolicyProvider*>(
|
||||
GetApplicationContext()
|
||||
@@ -238,6 +244,11 @@
|
||||
|
||||
void PolicyUIHandler::HandleRevertLocalTestPolicies(
|
||||
const base::Value::List& args) {
|
||||
+ if (!PolicyUI::ShouldLoadTestPage(
|
||||
+ ChromeBrowserState::FromWebUIIOS(web_ui()))) {
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
ChromeBrowserState::FromWebUIIOS(web_ui())
|
||||
->GetPolicyConnector()
|
||||
->RevertUseLocalTestPolicyProvider();
|
||||
32
patches/chromium/cherry-pick-c5dd8839bfaf.patch
Normal file
32
patches/chromium/cherry-pick-c5dd8839bfaf.patch
Normal file
@@ -0,0 +1,32 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Rakina Zata Amni <rakina@chromium.org>
|
||||
Date: Wed, 19 Jun 2024 02:49:58 +0000
|
||||
Subject: Destruct controller before referenced WebUI in CreateWebUIIfNeeded
|
||||
|
||||
Reset `controller` first before resetting `web_ui_`, since the
|
||||
controller still has a pointer to `web_ui_`, to avoid referencing to
|
||||
the already deleted `web_ui_` object from `controller`'s destructor.
|
||||
|
||||
Bug: 345640549
|
||||
Change-Id: Ie9c193436b593845d8269605f68bf94bc75beed7
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5624749
|
||||
Commit-Queue: Rakina Zata Amni <rakina@chromium.org>
|
||||
Reviewed-by: Nasko Oskov <nasko@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1316830}
|
||||
|
||||
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc
|
||||
index 8a9beaf3bfb9fe5eca8ca6675c7c45b4b880db03..85041c38c8d2e84d780948a4dab94013ce39dfbe 100644
|
||||
--- a/content/browser/renderer_host/navigation_request.cc
|
||||
+++ b/content/browser/renderer_host/navigation_request.cc
|
||||
@@ -10268,6 +10268,11 @@ void NavigationRequest::CreateWebUIIfNeeded(RenderFrameHostImpl* frame_host) {
|
||||
bindings() != web_ui_->GetBindings()) {
|
||||
RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM"));
|
||||
base::WeakPtr<NavigationRequest> self = GetWeakPtr();
|
||||
+ // Reset `controller` first before resetting `web_ui_`, since the controller
|
||||
+ // still has a pointer to `web_ui_`, to avoid referencing to the already
|
||||
+ // deleted `web_ui_` object from `controller`'s destructor. See also
|
||||
+ // https://crbug.com/345640549.
|
||||
+ controller.reset();
|
||||
web_ui_.reset();
|
||||
// Resetting the WebUI may indirectly call content's embedders and delete
|
||||
// `this`. There are no known occurrences of it, so we assume this never
|
||||
37
patches/chromium/cherry-pick-d54105311590.patch
Normal file
37
patches/chromium/cherry-pick-d54105311590.patch
Normal file
@@ -0,0 +1,37 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: "mark a. foltz" <mfoltz@chromium.org>
|
||||
Date: Mon, 17 Jun 2024 23:07:32 +0000
|
||||
Subject: Retain refptr to shared helper to prevent UAF.
|
||||
|
||||
Capture a reference to the shared helper in the onerror handler to
|
||||
prevent a UAF that can occur when the browser drops the mojo
|
||||
connection.
|
||||
|
||||
Bug: 346692546
|
||||
Change-Id: Ifb264488a6fa8417c134a34d902605d2c141720b
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5634908
|
||||
Reviewed-by: Avi Drissman <avi@chromium.org>
|
||||
Commit-Queue: Mark Foltz <mfoltz@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1316145}
|
||||
|
||||
diff --git a/media/audio/mac/audio_loopback_input_mac_impl.mm b/media/audio/mac/audio_loopback_input_mac_impl.mm
|
||||
index 7b301492f17a3f1da96b8ff990f6deeb4a19b6e3..f90c00e668f58c2389e622466422ae7aa237c94d 100644
|
||||
--- a/media/audio/mac/audio_loopback_input_mac_impl.mm
|
||||
+++ b/media/audio/mac/audio_loopback_input_mac_impl.mm
|
||||
@@ -394,12 +394,15 @@ - (void)stream:(SCStream*)stream
|
||||
base::BindRepeating(&SCKAudioInputStream::OnStreamError,
|
||||
base::Unretained(this)));
|
||||
|
||||
+ // Make a local copy of the shared_refptr in case the error handler is called
|
||||
+ // after `this` is destroyed.
|
||||
+ auto local_shared_helper = shared_helper_;
|
||||
[stream_ startCaptureWithCompletionHandler:^(NSError* error) {
|
||||
if (!error) {
|
||||
return;
|
||||
}
|
||||
|
||||
- shared_helper_->OnStreamError(error);
|
||||
+ local_shared_helper->OnStreamError(error);
|
||||
}];
|
||||
}
|
||||
|
||||
159
patches/chromium/cherry-pick-d9f7652c867c.patch
Normal file
159
patches/chromium/cherry-pick-d9f7652c867c.patch
Normal file
@@ -0,0 +1,159 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Adam Rice <ricea@chromium.org>
|
||||
Date: Thu, 25 Jul 2024 05:28:45 +0000
|
||||
Subject: Don't allocate WebTransportCloseInfo on stack
|
||||
|
||||
blink::WebTransport::OnClosed() was allocating a WebTransportCloseInfo
|
||||
object on the stack. Since it is a garbage-collected object, this is
|
||||
wrong. Allocate it with MakeGarbageCollected<>() instead.
|
||||
|
||||
(cherry picked from commit 84c1481d8a8d5e7f51316b648d1bf71f2ae52122)
|
||||
|
||||
Fixed: 352872238
|
||||
Change-Id: I83484021d5f3f6d49d3c222c8f2dc34219f2d240
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5725413
|
||||
Commit-Queue: Nidhi Jaju <nidhijaju@chromium.org>
|
||||
Reviewed-by: Nidhi Jaju <nidhijaju@chromium.org>
|
||||
Auto-Submit: Adam Rice <ricea@chromium.org>
|
||||
Cr-Original-Commit-Position: refs/heads/main@{#1331525}
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5740536
|
||||
Commit-Queue: Adam Rice <ricea@chromium.org>
|
||||
Cr-Commit-Position: refs/branch-heads/6478@{#1848}
|
||||
Cr-Branched-From: e6143acc03189c5e52959545b110d6d17ecd5286-refs/heads/main@{#1300313}
|
||||
|
||||
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport.cc b/third_party/blink/renderer/modules/webtransport/web_transport.cc
|
||||
index bcfa17448f3051dc2b292aa3e19dbfb915cf692a..4922359605b53c6b9ac5339f6ce6b3613bfe275b 100644
|
||||
--- a/third_party/blink/renderer/modules/webtransport/web_transport.cc
|
||||
+++ b/third_party/blink/renderer/modules/webtransport/web_transport.cc
|
||||
@@ -1092,17 +1092,17 @@ void WebTransport::OnClosed(
|
||||
|
||||
latest_stats_ = ConvertStatsFromMojom(std::move(final_stats));
|
||||
|
||||
- WebTransportCloseInfo idl_close_info;
|
||||
+ auto* idl_close_info = MakeGarbageCollected<WebTransportCloseInfo>();
|
||||
if (close_info) {
|
||||
- idl_close_info.setCloseCode(close_info->code);
|
||||
- idl_close_info.setReason(close_info->reason);
|
||||
+ idl_close_info->setCloseCode(close_info->code);
|
||||
+ idl_close_info->setReason(close_info->reason);
|
||||
}
|
||||
|
||||
v8::Local<v8::Value> error = WebTransportError::Create(
|
||||
isolate, /*stream_error_code=*/std::nullopt, "The session is closed.",
|
||||
WebTransportError::Source::kSession);
|
||||
|
||||
- Cleanup(&idl_close_info, error, /*abruptly=*/false);
|
||||
+ Cleanup(idl_close_info, error, /*abruptly=*/false);
|
||||
}
|
||||
|
||||
void WebTransport::OnOutgoingStreamClosed(uint32_t stream_id) {
|
||||
diff --git a/third_party/blink/renderer/modules/webtransport/web_transport_test.cc b/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
|
||||
index 01f5a0fca58d88e342298e03231dd2263ca5a678..fc05ad637888df648f8692683f8a626c8d6a38dd 100644
|
||||
--- a/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
|
||||
+++ b/third_party/blink/renderer/modules/webtransport/web_transport_test.cc
|
||||
@@ -1959,6 +1959,21 @@ TEST_F(WebTransportTest, OnClosed) {
|
||||
EXPECT_EQ(close_info->reason(), "reason");
|
||||
}
|
||||
|
||||
+// Regression test for https://crbug.com/347710668.
|
||||
+TEST_F(WebTransportTest, ClosedAccessorCalledAfterOnClosed) {
|
||||
+ V8TestingScope scope;
|
||||
+
|
||||
+ auto* web_transport =
|
||||
+ CreateAndConnectSuccessfully(scope, "https://example.com");
|
||||
+
|
||||
+ web_transport->OnClosed(
|
||||
+ network::mojom::blink::WebTransportCloseInfo::New(99, "reason"),
|
||||
+ network::mojom::blink::WebTransportStats::New());
|
||||
+
|
||||
+ // If this doesn't crash then the test passed.
|
||||
+ EXPECT_FALSE(web_transport->closed(scope.GetScriptState()).IsEmpty());
|
||||
+}
|
||||
+
|
||||
TEST_F(WebTransportTest, OnClosedWithNull) {
|
||||
V8TestingScope scope;
|
||||
v8::Isolate* isolate = scope.GetIsolate();
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt
|
||||
index d4e43edbd19a9eb16f3384c1c95e5c3d1a2f2619..09e2bbddaa40e1cfc192d3adbeb9538e7aeaebfe 100644
|
||||
--- a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt
|
||||
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any-expected.txt
|
||||
@@ -1,4 +1,5 @@
|
||||
This is a testharness.js-based test.
|
||||
+Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: promise_rejects_dom: function "function() { throw e }" threw object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection." that is not a DOMException InvalidStateError: property "code" is equal to 19, expected 11
|
||||
[FAIL] opening unidirectional stream before ready
|
||||
promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
|
||||
[FAIL] opening bidirectional stream before ready
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js
|
||||
index 0d8579584fbb21e74595588f663ef21c3b028c63..d69967ba70bb716f8664f973fe83d4158ba6da89 100644
|
||||
--- a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js
|
||||
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.js
|
||||
@@ -163,3 +163,24 @@ promise_test(async t => {
|
||||
const wt = new WebTransport(webtransport_url('server-close.py'));
|
||||
promise_rejects_dom(t, "InvalidStateError", wt.createBidirectionalStream());
|
||||
}, 'server initiated closure while opening bidirectional stream before ready');
|
||||
+
|
||||
+// Regression test for https://crbug.com/347710668.
|
||||
+promise_test(async t => {
|
||||
+ const wt = new WebTransport(webtransport_url('server-read-then-close.py'));
|
||||
+ add_completion_callback(() => wt.close());
|
||||
+ await wt.ready;
|
||||
+
|
||||
+ const bidi_reader = wt.incomingBidirectionalStreams.getReader();
|
||||
+ const { value: bidi } = await bidi_reader.read();
|
||||
+
|
||||
+ bidi.writable.getWriter().write(new TextEncoder().encode('some data'));
|
||||
+ const reader = bidi.readable.getReader();
|
||||
+ await reader.closed.catch(t.step_func(
|
||||
+ e => assert_true(e instanceof WebTransportError)));
|
||||
+
|
||||
+ // The WebTransport session will already be closed.
|
||||
+ const {reason, closeCode} = await wt.closed;
|
||||
+
|
||||
+ assert_equals(reason, '', 'reason should be default');
|
||||
+ assert_equals(closeCode, 0, 'closeCode should be default');
|
||||
+}, 'reading closed property after close should work');
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt
|
||||
index d4e43edbd19a9eb16f3384c1c95e5c3d1a2f2619..09e2bbddaa40e1cfc192d3adbeb9538e7aeaebfe 100644
|
||||
--- a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt
|
||||
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.serviceworker-expected.txt
|
||||
@@ -1,4 +1,5 @@
|
||||
This is a testharness.js-based test.
|
||||
+Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: promise_rejects_dom: function "function() { throw e }" threw object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection." that is not a DOMException InvalidStateError: property "code" is equal to 19, expected 11
|
||||
[FAIL] opening unidirectional stream before ready
|
||||
promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
|
||||
[FAIL] opening bidirectional stream before ready
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt
|
||||
index d4e43edbd19a9eb16f3384c1c95e5c3d1a2f2619..09e2bbddaa40e1cfc192d3adbeb9538e7aeaebfe 100644
|
||||
--- a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt
|
||||
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.sharedworker-expected.txt
|
||||
@@ -1,4 +1,5 @@
|
||||
This is a testharness.js-based test.
|
||||
+Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: promise_rejects_dom: function "function() { throw e }" threw object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection." that is not a DOMException InvalidStateError: property "code" is equal to 19, expected 11
|
||||
[FAIL] opening unidirectional stream before ready
|
||||
promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
|
||||
[FAIL] opening bidirectional stream before ready
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt
|
||||
index d4e43edbd19a9eb16f3384c1c95e5c3d1a2f2619..09e2bbddaa40e1cfc192d3adbeb9538e7aeaebfe 100644
|
||||
--- a/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt
|
||||
+++ b/third_party/blink/web_tests/external/wpt/webtransport/close.https.any.worker-expected.txt
|
||||
@@ -1,4 +1,5 @@
|
||||
This is a testharness.js-based test.
|
||||
+Harness Error. harness_status.status = 1 , harness_status.message = Unhandled rejection: promise_rejects_dom: function "function() { throw e }" threw object "NetworkError: Failed to execute 'createBidirectionalStream' on 'WebTransport': No connection." that is not a DOMException InvalidStateError: property "code" is equal to 19, expected 11
|
||||
[FAIL] opening unidirectional stream before ready
|
||||
promise_test: Unhandled rejection with value: object "NetworkError: Failed to execute 'createUnidirectionalStream' on 'WebTransport': No connection."
|
||||
[FAIL] opening bidirectional stream before ready
|
||||
diff --git a/third_party/blink/web_tests/external/wpt/webtransport/handlers/server-read-then-close.py b/third_party/blink/web_tests/external/wpt/webtransport/handlers/server-read-then-close.py
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..7f992e0dcca3ae62277cac0fa39355fce3e57be0
|
||||
--- /dev/null
|
||||
+++ b/third_party/blink/web_tests/external/wpt/webtransport/handlers/server-read-then-close.py
|
||||
@@ -0,0 +1,9 @@
|
||||
+def session_established(session):
|
||||
+ stream_id = session.create_bidirectional_stream()
|
||||
+
|
||||
+
|
||||
+def stream_data_received(session,
|
||||
+ stream_id: int,
|
||||
+ data: bytes,
|
||||
+ stream_ended: bool):
|
||||
+ session.close(None)
|
||||
@@ -8,6 +8,9 @@ This CL adds support for the following features to //shell_dialogs:
|
||||
* showHiddenFiles - Show hidden files in dialog.
|
||||
* showOverwriteConfirmation - Whether the user will be presented a confirmation dialog if the user types a file name that already exists.
|
||||
|
||||
It also:
|
||||
* Changes XDG Portal implementation behavior to set default path regardless of dialog type.
|
||||
|
||||
This may be partially upstreamed to Chromium in the future.
|
||||
|
||||
diff --git a/ui/gtk/select_file_dialog_linux_gtk.cc b/ui/gtk/select_file_dialog_linux_gtk.cc
|
||||
@@ -186,24 +189,10 @@ index 698f97b23f851c02af037880585c82d4494da63f..0a3b701a701289a2124214e7421a6383
|
||||
}
|
||||
|
||||
diff --git a/ui/gtk/select_file_dialog_linux_gtk.h b/ui/gtk/select_file_dialog_linux_gtk.h
|
||||
index 53ae15f14c45ee72abdae172fc4555c9e4b3ff9a..af181afd9db1351cd886ba24dd651c7bf2f8a716 100644
|
||||
index 53ae15f14c45ee72abdae172fc4555c9e4b3ff9a..ee19c3f399a1d060d5e9bd0dc5f1b3828381e8df 100644
|
||||
--- a/ui/gtk/select_file_dialog_linux_gtk.h
|
||||
+++ b/ui/gtk/select_file_dialog_linux_gtk.h
|
||||
@@ -15,6 +15,13 @@
|
||||
|
||||
namespace gtk {
|
||||
|
||||
+struct ExtraSettings {
|
||||
+ std::string button_label;
|
||||
+ bool show_overwrite_confirmation = true;
|
||||
+ bool show_hidden = false;
|
||||
+ bool allow_multiple_selection = false;
|
||||
+};
|
||||
+
|
||||
// Implementation of SelectFileDialog that shows a Gtk common dialog for
|
||||
// choosing a file or folder. This acts as a modal dialog.
|
||||
class SelectFileDialogLinuxGtk : public ui::SelectFileDialogLinux,
|
||||
@@ -90,19 +97,23 @@ class SelectFileDialogLinuxGtk : public ui::SelectFileDialogLinux,
|
||||
@@ -90,19 +90,23 @@ class SelectFileDialogLinuxGtk : public ui::SelectFileDialogLinux,
|
||||
GtkWidget* CreateSelectFolderDialog(Type type,
|
||||
const std::string& title,
|
||||
const base::FilePath& default_path,
|
||||
@@ -231,7 +220,7 @@ index 53ae15f14c45ee72abdae172fc4555c9e4b3ff9a..af181afd9db1351cd886ba24dd651c7b
|
||||
|
||||
// Removes and returns the |params| associated with |dialog| from
|
||||
// |params_map_|.
|
||||
@@ -121,7 +132,8 @@ class SelectFileDialogLinuxGtk : public ui::SelectFileDialogLinux,
|
||||
@@ -121,7 +125,8 @@ class SelectFileDialogLinuxGtk : public ui::SelectFileDialogLinux,
|
||||
// Common function for CreateFileOpenDialog and CreateMultiFileOpenDialog.
|
||||
GtkWidget* CreateFileOpenHelper(const std::string& title,
|
||||
const base::FilePath& default_path,
|
||||
@@ -241,3 +230,192 @@ index 53ae15f14c45ee72abdae172fc4555c9e4b3ff9a..af181afd9db1351cd886ba24dd651c7b
|
||||
|
||||
// Callback for when the user responds to a Save As or Open File dialog.
|
||||
void OnSelectSingleFileDialogResponse(GtkWidget* dialog, int response_id);
|
||||
diff --git a/ui/shell_dialogs/select_file_dialog_linux.h b/ui/shell_dialogs/select_file_dialog_linux.h
|
||||
index 20ad001988831afca73315c577f90c824a36e282..57a8d35ace583eaafb526f70935d21c0f8fd1078 100644
|
||||
--- a/ui/shell_dialogs/select_file_dialog_linux.h
|
||||
+++ b/ui/shell_dialogs/select_file_dialog_linux.h
|
||||
@@ -26,6 +26,13 @@ class SHELL_DIALOGS_EXPORT SelectFileDialogLinux : public SelectFileDialog {
|
||||
SelectFileDialogLinux(const SelectFileDialogLinux&) = delete;
|
||||
SelectFileDialogLinux& operator=(const SelectFileDialogLinux&) = delete;
|
||||
|
||||
+ struct ExtraSettings {
|
||||
+ std::string button_label;
|
||||
+ bool show_overwrite_confirmation = true;
|
||||
+ bool show_hidden = false;
|
||||
+ bool allow_multiple_selection = false;
|
||||
+ };
|
||||
+
|
||||
// Returns true if the SelectFileDialog class returned by
|
||||
// NewSelectFileDialogImplKDE will actually work.
|
||||
static bool CheckKDEDialogWorksOnUIThread(std::string& kdialog_version);
|
||||
diff --git a/ui/shell_dialogs/select_file_dialog_linux_kde.cc b/ui/shell_dialogs/select_file_dialog_linux_kde.cc
|
||||
index 796e98cd42a5c6087da6cdf1d7bff4248113aeab..bcf43ab96bcb426fde6362dd0da4421758854449 100644
|
||||
--- a/ui/shell_dialogs/select_file_dialog_linux_kde.cc
|
||||
+++ b/ui/shell_dialogs/select_file_dialog_linux_kde.cc
|
||||
@@ -479,6 +479,9 @@ void SelectFileDialogLinuxKde::CreateSelectFolderDialog(
|
||||
int title_message_id = (type == SELECT_UPLOAD_FOLDER)
|
||||
? IDS_SELECT_UPLOAD_FOLDER_DIALOG_TITLE
|
||||
: IDS_SELECT_FOLDER_DIALOG_TITLE;
|
||||
+ ExtraSettings extra_settings;
|
||||
+ if (params)
|
||||
+ extra_settings = *(static_cast<ExtraSettings*>(params));
|
||||
pipe_task_runner_->PostTaskAndReplyWithResult(
|
||||
FROM_HERE,
|
||||
base::BindOnce(
|
||||
@@ -486,7 +489,7 @@ void SelectFileDialogLinuxKde::CreateSelectFolderDialog(
|
||||
KDialogParams(
|
||||
"--getexistingdirectory", GetTitle(title, title_message_id),
|
||||
default_path.empty() ? *last_opened_path() : default_path, parent,
|
||||
- false, false)),
|
||||
+ false, extra_settings.allow_multiple_selection)),
|
||||
base::BindOnce(
|
||||
&SelectFileDialogLinuxKde::OnSelectSingleFolderDialogResponse, this,
|
||||
parent, params));
|
||||
diff --git a/ui/shell_dialogs/select_file_dialog_linux_portal.cc b/ui/shell_dialogs/select_file_dialog_linux_portal.cc
|
||||
index decba61300c21f7f5d070b24c23ff2e08b06d161..9bc449d5ebcb88310058559bee78ece90bd3ef25 100644
|
||||
--- a/ui/shell_dialogs/select_file_dialog_linux_portal.cc
|
||||
+++ b/ui/shell_dialogs/select_file_dialog_linux_portal.cc
|
||||
@@ -38,7 +38,7 @@ constexpr char kMethodStartServiceByName[] = "StartServiceByName";
|
||||
constexpr char kXdgPortalService[] = "org.freedesktop.portal.Desktop";
|
||||
constexpr char kXdgPortalObject[] = "/org/freedesktop/portal/desktop";
|
||||
|
||||
-constexpr int kXdgPortalRequiredVersion = 3;
|
||||
+constexpr int kXdgPortalRequiredVersion = 4;
|
||||
|
||||
constexpr char kXdgPortalRequestInterfaceName[] =
|
||||
"org.freedesktop.portal.Request";
|
||||
@@ -218,6 +218,10 @@ void SelectFileDialogLinuxPortal::SelectFileImpl(
|
||||
info_->main_task_runner = base::SequencedTaskRunner::GetCurrentDefault();
|
||||
listener_params_ = params;
|
||||
|
||||
+ ExtraSettings extra_settings;
|
||||
+ if (params)
|
||||
+ extra_settings = *(static_cast<ExtraSettings*>(params));
|
||||
+
|
||||
if (owning_window) {
|
||||
if (auto* root = owning_window->GetRootWindow()) {
|
||||
if (auto* host = root->GetNativeWindowProperty(
|
||||
@@ -245,7 +249,7 @@ void SelectFileDialogLinuxPortal::SelectFileImpl(
|
||||
host_->GetAcceleratedWidget(),
|
||||
base::BindOnce(
|
||||
&SelectFileDialogLinuxPortal::SelectFileImplWithParentHandle,
|
||||
- this, title, default_path, filter_set, default_extension))) {
|
||||
+ this, title, default_path, filter_set, default_extension, extra_settings))) {
|
||||
// Return early to skip the fallback below.
|
||||
return;
|
||||
} else {
|
||||
@@ -255,7 +259,7 @@ void SelectFileDialogLinuxPortal::SelectFileImpl(
|
||||
|
||||
// No parent, so just use a blank parent handle.
|
||||
SelectFileImplWithParentHandle(title, default_path, filter_set,
|
||||
- default_extension, "");
|
||||
+ default_extension, extra_settings, "");
|
||||
}
|
||||
|
||||
bool SelectFileDialogLinuxPortal::HasMultipleFileTypeChoicesImpl() {
|
||||
@@ -452,6 +456,7 @@ void SelectFileDialogLinuxPortal::SelectFileImplWithParentHandle(
|
||||
base::FilePath default_path,
|
||||
PortalFilterSet filter_set,
|
||||
base::FilePath::StringType default_extension,
|
||||
+ const ExtraSettings& settings,
|
||||
std::string parent_handle) {
|
||||
bool default_path_exists = CallDirectoryExistsOnUIThread(default_path);
|
||||
dbus_thread_linux::GetTaskRunner()->PostTask(
|
||||
@@ -460,7 +465,7 @@ void SelectFileDialogLinuxPortal::SelectFileImplWithParentHandle(
|
||||
&SelectFileDialogLinuxPortal::DialogInfo::SelectFileImplOnBusThread,
|
||||
info_, std::move(title), std::move(default_path), default_path_exists,
|
||||
std::move(filter_set), std::move(default_extension),
|
||||
- std::move(parent_handle)));
|
||||
+ std::move(parent_handle), std::move(settings)));
|
||||
}
|
||||
|
||||
void SelectFileDialogLinuxPortal::DialogInfo::SelectFileImplOnBusThread(
|
||||
@@ -469,7 +474,8 @@ void SelectFileDialogLinuxPortal::DialogInfo::SelectFileImplOnBusThread(
|
||||
const bool default_path_exists,
|
||||
PortalFilterSet filter_set,
|
||||
base::FilePath::StringType default_extension,
|
||||
- std::string parent_handle) {
|
||||
+ std::string parent_handle,
|
||||
+ const ExtraSettings& settings) {
|
||||
DCHECK(dbus_thread_linux::GetTaskRunner()->RunsTasksInCurrentSequence());
|
||||
dbus::Bus* bus = AcquireBusOnBusThread();
|
||||
if (!bus->Connect())
|
||||
@@ -515,7 +521,7 @@ void SelectFileDialogLinuxPortal::DialogInfo::SelectFileImplOnBusThread(
|
||||
base::StringPrintf("handle_%d", handle_token_counter_++);
|
||||
|
||||
AppendOptions(&writer, response_handle_token, default_path,
|
||||
- default_path_exists, filter_set);
|
||||
+ default_path_exists, filter_set, settings);
|
||||
|
||||
// The sender part of the handle object contains the D-Bus connection name
|
||||
// without the prefix colon and with all dots replaced with underscores.
|
||||
@@ -545,7 +551,8 @@ void SelectFileDialogLinuxPortal::DialogInfo::AppendOptions(
|
||||
const std::string& response_handle_token,
|
||||
const base::FilePath& default_path,
|
||||
const bool default_path_exists,
|
||||
- const SelectFileDialogLinuxPortal::PortalFilterSet& filter_set) {
|
||||
+ const SelectFileDialogLinuxPortal::PortalFilterSet& filter_set,
|
||||
+ const ExtraSettings& settings) {
|
||||
dbus::MessageWriter options_writer(nullptr);
|
||||
writer->OpenArray("{sv}", &options_writer);
|
||||
|
||||
@@ -553,8 +560,10 @@ void SelectFileDialogLinuxPortal::DialogInfo::AppendOptions(
|
||||
response_handle_token);
|
||||
|
||||
if (type == SelectFileDialog::Type::SELECT_UPLOAD_FOLDER) {
|
||||
- AppendStringOption(&options_writer, kFileChooserOptionAcceptLabel,
|
||||
- l10n_util::GetStringUTF8(
|
||||
+ const std::string accept_label = settings.button_label.empty()
|
||||
+ ? kFileChooserOptionAcceptLabel
|
||||
+ : settings.button_label;
|
||||
+ AppendStringOption(&options_writer, accept_label, l10n_util::GetStringUTF8(
|
||||
IDS_SELECT_UPLOAD_FOLDER_DIALOG_UPLOAD_BUTTON));
|
||||
}
|
||||
|
||||
@@ -562,12 +571,12 @@ void SelectFileDialogLinuxPortal::DialogInfo::AppendOptions(
|
||||
type == SelectFileDialog::Type::SELECT_UPLOAD_FOLDER ||
|
||||
type == SelectFileDialog::Type::SELECT_EXISTING_FOLDER) {
|
||||
AppendBoolOption(&options_writer, kFileChooserOptionDirectory, true);
|
||||
+ AppendBoolOption(&options_writer, kFileChooserOptionMultiple, settings.allow_multiple_selection);
|
||||
} else if (type == SelectFileDialog::Type::SELECT_OPEN_MULTI_FILE) {
|
||||
AppendBoolOption(&options_writer, kFileChooserOptionMultiple, true);
|
||||
}
|
||||
|
||||
- if (type == SelectFileDialog::Type::SELECT_SAVEAS_FILE &&
|
||||
- !default_path.empty()) {
|
||||
+ if (!default_path.empty()) {
|
||||
if (default_path_exists) {
|
||||
// If this is an existing directory, navigate to that directory, with no
|
||||
// filename.
|
||||
diff --git a/ui/shell_dialogs/select_file_dialog_linux_portal.h b/ui/shell_dialogs/select_file_dialog_linux_portal.h
|
||||
index c487f7da19e2d05696a8eb72f2fa3e12972149f3..02a40c571570974dcc61e1b1f7ed95fbfc2bedf2 100644
|
||||
--- a/ui/shell_dialogs/select_file_dialog_linux_portal.h
|
||||
+++ b/ui/shell_dialogs/select_file_dialog_linux_portal.h
|
||||
@@ -115,7 +115,8 @@ class SelectFileDialogLinuxPortal : public SelectFileDialogLinux {
|
||||
const bool default_path_exists,
|
||||
PortalFilterSet filter_set,
|
||||
base::FilePath::StringType default_extension,
|
||||
- std::string parent_handle);
|
||||
+ std::string parent_handle,
|
||||
+ const ExtraSettings& settings);
|
||||
Type type;
|
||||
// The task runner the SelectFileImpl method was called on.
|
||||
scoped_refptr<base::SequencedTaskRunner> main_task_runner;
|
||||
@@ -143,7 +144,8 @@ class SelectFileDialogLinuxPortal : public SelectFileDialogLinux {
|
||||
const std::string& response_handle_token,
|
||||
const base::FilePath& default_path,
|
||||
const bool derfault_path_exists,
|
||||
- const PortalFilterSet& filter_set);
|
||||
+ const PortalFilterSet& filter_set,
|
||||
+ const ExtraSettings& settings);
|
||||
void AppendFilterStruct(dbus::MessageWriter* writer,
|
||||
const PortalFilter& filter);
|
||||
std::vector<base::FilePath> ConvertUrisToPaths(
|
||||
@@ -190,6 +192,7 @@ class SelectFileDialogLinuxPortal : public SelectFileDialogLinux {
|
||||
base::FilePath default_path,
|
||||
PortalFilterSet filter_set,
|
||||
base::FilePath::StringType default_extension,
|
||||
+ const ExtraSettings& settings,
|
||||
std::string parent_handle);
|
||||
|
||||
void DialogCreatedOnMainThread();
|
||||
|
||||
@@ -0,0 +1,80 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Shelley Vohr <shelley.vohr@gmail.com>
|
||||
Date: Fri, 5 Apr 2024 11:07:22 +0200
|
||||
Subject: feat: enable customizing symbol color in FrameCaptionButton
|
||||
|
||||
This enables customizing the symbol color on a given FrameCaptionButton
|
||||
for the Window Controls Overlay API on Linux. By default, the symbol color
|
||||
is dynamically calculated based on the background color of the button to
|
||||
ensure it has minimum contrast required to be accessible.
|
||||
|
||||
This should be upstreamed to Chromium if possible.
|
||||
|
||||
diff --git a/ui/views/window/frame_caption_button.cc b/ui/views/window/frame_caption_button.cc
|
||||
index 73e6020e3b9b6e0d12a8dea991f189b3ddeab14c..b38e5bd1408c26cbbfc995fc2ac5dc5983cc0db7 100644
|
||||
--- a/ui/views/window/frame_caption_button.cc
|
||||
+++ b/ui/views/window/frame_caption_button.cc
|
||||
@@ -107,7 +107,7 @@ FrameCaptionButton::FrameCaptionButton(PressedCallback callback,
|
||||
FrameCaptionButton::~FrameCaptionButton() = default;
|
||||
|
||||
// static
|
||||
-SkColor FrameCaptionButton::GetButtonColor(SkColor background_color) {
|
||||
+SkColor FrameCaptionButton::GetAccessibleButtonColor(SkColor background_color) {
|
||||
// Use IsDark() to change target colors instead of PickContrastingColor(), so
|
||||
// that DefaultFrameHeader::GetTitleColor() (which uses different target
|
||||
// colors) can change between light/dark targets at the same time. It looks
|
||||
@@ -124,6 +124,22 @@ SkColor FrameCaptionButton::GetButtonColor(SkColor background_color) {
|
||||
.color;
|
||||
}
|
||||
|
||||
+SkColor FrameCaptionButton::GetButtonColor(SkColor background_color) {
|
||||
+ // If the button color has been overridden, return that.
|
||||
+ if (button_color_ != SkColor())
|
||||
+ return button_color_;
|
||||
+
|
||||
+ return GetAccessibleButtonColor(background_color);
|
||||
+}
|
||||
+
|
||||
+void FrameCaptionButton::SetButtonColor(SkColor button_color) {
|
||||
+ if (button_color_ == button_color)
|
||||
+ return;
|
||||
+
|
||||
+ button_color_ = button_color;
|
||||
+ MaybeRefreshIconAndInkdropBaseColor();
|
||||
+}
|
||||
+
|
||||
// static
|
||||
float FrameCaptionButton::GetInactiveButtonColorAlphaRatio() {
|
||||
return 0.38f;
|
||||
diff --git a/ui/views/window/frame_caption_button.h b/ui/views/window/frame_caption_button.h
|
||||
index 0d20ec5891d08187b4dae7a6b46a9a6de2f7c39c..eb396811a39c4e6021916dbba1f89baa83d77d31 100644
|
||||
--- a/ui/views/window/frame_caption_button.h
|
||||
+++ b/ui/views/window/frame_caption_button.h
|
||||
@@ -43,8 +43,18 @@ class VIEWS_EXPORT FrameCaptionButton : public Button {
|
||||
FrameCaptionButton& operator=(const FrameCaptionButton&) = delete;
|
||||
~FrameCaptionButton() override;
|
||||
|
||||
+ // Gets the color to use for a frame caption button with accessible contrast
|
||||
+ // to the given background color.
|
||||
+ static SkColor GetAccessibleButtonColor(SkColor background_color);
|
||||
+
|
||||
// Gets the color to use for a frame caption button.
|
||||
- static SkColor GetButtonColor(SkColor background_color);
|
||||
+ SkColor GetButtonColor(SkColor background_color);
|
||||
+
|
||||
+ // Sets the color to use for a frame caption button.
|
||||
+ // The color is by default calculated to be an accessible contrast
|
||||
+ // to the background color, so you should keep that in mind when
|
||||
+ // overriding that behavior.
|
||||
+ void SetButtonColor(SkColor button_color);
|
||||
|
||||
// Gets the alpha ratio for the colors of inactive frame caption buttons.
|
||||
static float GetInactiveButtonColorAlphaRatio();
|
||||
@@ -133,6 +143,7 @@ class VIEWS_EXPORT FrameCaptionButton : public Button {
|
||||
// TODO(b/292154873): Store the foreground color instead of the background
|
||||
// color for the SkColor type.
|
||||
absl::variant<ui::ColorId, SkColor> color_ = gfx::kPlaceholderColor;
|
||||
+ SkColor button_color_ = SkColor();
|
||||
|
||||
// Whether the button should be painted as active.
|
||||
bool paint_as_active_ = false;
|
||||
@@ -0,0 +1,136 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Shelley Vohr <shelley.vohr@gmail.com>
|
||||
Date: Tue, 28 May 2024 10:44:06 +0200
|
||||
Subject: feat: enable passing exit code on service process crash
|
||||
|
||||
This patch enables plumbing the exit code of the service process to the
|
||||
browser process when the service process crashes. The process can perform cleanup
|
||||
after the message pipe disconnection, which previously led to racy and incorrect
|
||||
exit codes in some crashing scenarios. To mitigate this, we can rely on
|
||||
ServiceProcessHost::Observer functions, but we need to pass the exit code to
|
||||
the observer.
|
||||
|
||||
diff --git a/content/browser/service_process_host_impl.cc b/content/browser/service_process_host_impl.cc
|
||||
index 73d8c2fcbed9db89161ad3fabd5cbfb6b3761a4d..9d5673a19f4d9cc1754759ac792e0bdd0d12a2d7 100644
|
||||
--- a/content/browser/service_process_host_impl.cc
|
||||
+++ b/content/browser/service_process_host_impl.cc
|
||||
@@ -72,12 +72,15 @@ class ServiceProcessTracker {
|
||||
processes_.erase(iter);
|
||||
}
|
||||
|
||||
- void NotifyCrashed(ServiceProcessId id) {
|
||||
+ void NotifyCrashed(ServiceProcessId id, int exit_code) {
|
||||
DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
auto iter = processes_.find(id);
|
||||
DCHECK(iter != processes_.end());
|
||||
- for (auto& observer : observers_)
|
||||
- observer.OnServiceProcessCrashed(iter->second.Duplicate());
|
||||
+ for (auto& observer : observers_) {
|
||||
+ auto params = iter->second.Duplicate();
|
||||
+ params.set_exit_code(exit_code);
|
||||
+ observer.OnServiceProcessCrashed(params);
|
||||
+ }
|
||||
processes_.erase(iter);
|
||||
}
|
||||
|
||||
@@ -86,6 +89,11 @@ class ServiceProcessTracker {
|
||||
observers_.AddObserver(observer);
|
||||
}
|
||||
|
||||
+ bool HasObserver(ServiceProcessHost::Observer* observer) {
|
||||
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
||||
+ return observers_.HasObserver(observer);
|
||||
+ }
|
||||
+
|
||||
void RemoveObserver(ServiceProcessHost::Observer* observer) {
|
||||
// NOTE: Some tests may remove observers after BrowserThreads are shut down.
|
||||
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI) ||
|
||||
@@ -153,7 +161,7 @@ class UtilityProcessClient : public UtilityProcessHost::Client {
|
||||
process_info_->service_process_id());
|
||||
}
|
||||
|
||||
- void OnProcessCrashed() override {
|
||||
+ void OnProcessCrashed(int exit_code) override {
|
||||
// TODO(https://crbug.com/1016027): It is unclear how we can observe
|
||||
// |OnProcessCrashed()| without observing |OnProcessLaunched()| first, but
|
||||
// it can happen on Android. Ignore the notification in this case.
|
||||
@@ -161,7 +169,7 @@ class UtilityProcessClient : public UtilityProcessHost::Client {
|
||||
return;
|
||||
|
||||
GetServiceProcessTracker().NotifyCrashed(
|
||||
- process_info_->service_process_id());
|
||||
+ process_info_->service_process_id(), exit_code);
|
||||
}
|
||||
|
||||
private:
|
||||
@@ -233,6 +241,11 @@ void ServiceProcessHost::AddObserver(Observer* observer) {
|
||||
GetServiceProcessTracker().AddObserver(observer);
|
||||
}
|
||||
|
||||
+// static
|
||||
+bool ServiceProcessHost::HasObserver(Observer* observer) {
|
||||
+ return GetServiceProcessTracker().HasObserver(observer);
|
||||
+}
|
||||
+
|
||||
// static
|
||||
void ServiceProcessHost::RemoveObserver(Observer* observer) {
|
||||
GetServiceProcessTracker().RemoveObserver(observer);
|
||||
diff --git a/content/browser/utility_process_host.cc b/content/browser/utility_process_host.cc
|
||||
index 9b99a3caf366368917c39ae5c12a11f5294c3948..c54bd936ed463dea36f3b2a301549111bfded55d 100644
|
||||
--- a/content/browser/utility_process_host.cc
|
||||
+++ b/content/browser/utility_process_host.cc
|
||||
@@ -551,7 +551,7 @@ void UtilityProcessHost::OnProcessCrashed(int exit_code) {
|
||||
// Take ownership of |client_| so the destructor doesn't notify it of
|
||||
// termination.
|
||||
auto client = std::move(client_);
|
||||
- client->OnProcessCrashed();
|
||||
+ client->OnProcessCrashed(exit_code);
|
||||
}
|
||||
|
||||
std::optional<std::string> UtilityProcessHost::GetServiceName() {
|
||||
diff --git a/content/browser/utility_process_host.h b/content/browser/utility_process_host.h
|
||||
index ecb0b0e02870386f3ad4365461325ba0627ba1ce..780e43ddaedbf91aea9918bb860c487b4aed54b8 100644
|
||||
--- a/content/browser/utility_process_host.h
|
||||
+++ b/content/browser/utility_process_host.h
|
||||
@@ -84,7 +84,7 @@ class CONTENT_EXPORT UtilityProcessHost
|
||||
|
||||
virtual void OnProcessLaunched(const base::Process& process) {}
|
||||
virtual void OnProcessTerminatedNormally() {}
|
||||
- virtual void OnProcessCrashed() {}
|
||||
+ virtual void OnProcessCrashed(int exit_code) {}
|
||||
};
|
||||
|
||||
// This class is self-owned. It must be instantiated using new, and shouldn't
|
||||
diff --git a/content/public/browser/service_process_host.h b/content/public/browser/service_process_host.h
|
||||
index 4895ba5c305c898bb21472a2408ecd62afb46fd6..c67737f4647b2b07f13aee77d95401edf34c72d0 100644
|
||||
--- a/content/public/browser/service_process_host.h
|
||||
+++ b/content/public/browser/service_process_host.h
|
||||
@@ -234,6 +234,10 @@ class CONTENT_EXPORT ServiceProcessHost {
|
||||
// removed before destruction. Must be called from the UI thread only.
|
||||
static void AddObserver(Observer* observer);
|
||||
|
||||
+ // Returns true if the given observer is currently registered.
|
||||
+ // Must be called from the UI thread only.
|
||||
+ static bool HasObserver(Observer* observer);
|
||||
+
|
||||
// Removes a registered observer. This must be called some time before
|
||||
// |*observer| is destroyed and must be called from the UI thread only.
|
||||
static void RemoveObserver(Observer* observer);
|
||||
diff --git a/content/public/browser/service_process_info.h b/content/public/browser/service_process_info.h
|
||||
index 1a8656aef341cd3b23af588fb00569b79d6cd100..f904af7ee6bbacf4474e0939855ecf9f2c9a5eaa 100644
|
||||
--- a/content/public/browser/service_process_info.h
|
||||
+++ b/content/public/browser/service_process_info.h
|
||||
@@ -64,7 +64,13 @@ class CONTENT_EXPORT ServiceProcessInfo {
|
||||
const std::optional<GURL>& site() const { return site_; }
|
||||
const base::Process& GetProcess() const { return process_; }
|
||||
|
||||
+ void set_exit_code(int exit_code) { exit_code_ = exit_code; }
|
||||
+ int exit_code() const { return exit_code_; }
|
||||
+
|
||||
private:
|
||||
+ // The exit code of the process, if it has exited.
|
||||
+ int exit_code_;
|
||||
+
|
||||
// The name of the service interface for which the process was launched.
|
||||
std::string service_interface_name_;
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Shelley Vohr <shelley.vohr@gmail.com>
|
||||
Date: Tue, 4 Jun 2024 15:29:10 +0200
|
||||
Subject: Fix font face resolution when renderer is blocked
|
||||
|
||||
Backports https://chromium-review.googlesource.com/c/chromium/src/+/5584820
|
||||
|
||||
As a result of https://chromium-review.googlesource.com/c/chromium/src/+/5290838,
|
||||
the FontFaceSet promise in e.g. contentWindow.document.fonts.ready will never resolve
|
||||
while the renderer is blocked. This Cl takes an approach similar to that taken in
|
||||
MediaQueryList in order to enable the promise to be resolved.
|
||||
|
||||
diff --git a/third_party/blink/renderer/core/css/font_face_set_document.cc b/third_party/blink/renderer/core/css/font_face_set_document.cc
|
||||
index a88c3b56314abd5d0dfb477d359452a0afc40077..ecdf86f3aa632e226880f429a851a62071c2242b 100644
|
||||
--- a/third_party/blink/renderer/core/css/font_face_set_document.cc
|
||||
+++ b/third_party/blink/renderer/core/css/font_face_set_document.cc
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "base/metrics/histogram_functions.h"
|
||||
#include "third_party/blink/public/common/features.h"
|
||||
+#include "third_party/blink/public/common/metrics/document_update_reason.h"
|
||||
#include "third_party/blink/renderer/bindings/core/v8/dictionary.h"
|
||||
#include "third_party/blink/renderer/core/css/css_font_face.h"
|
||||
#include "third_party/blink/renderer/core/css/css_font_selector.h"
|
||||
@@ -150,21 +151,27 @@ FontFaceSetDocument::CSSConnectedFontFaceList() const {
|
||||
}
|
||||
|
||||
void FontFaceSetDocument::FireDoneEventIfPossible() {
|
||||
- if (should_fire_loading_event_) {
|
||||
+ Document* d = GetDocument();
|
||||
+ if (!d || !d->View()) {
|
||||
return;
|
||||
}
|
||||
+
|
||||
if (!ShouldSignalReady()) {
|
||||
return;
|
||||
}
|
||||
- Document* d = GetDocument();
|
||||
- if (!d) {
|
||||
+
|
||||
+ // FireDoneEventIfPossible gets scheduled via PostTask at the end of a
|
||||
+ // successful style+layout update. An invalidation may have occurred in
|
||||
+ // the interim, so update style and layout synchronously here.
|
||||
+ d->UpdateStyleAndLayout(DocumentUpdateReason::kUnknown);
|
||||
+
|
||||
+ // These values can change during style+layout update, so check them
|
||||
+ // *after* the call to UpdateStyleAndLayout.
|
||||
+ if (should_fire_loading_event_) {
|
||||
return;
|
||||
}
|
||||
|
||||
- // If the layout was invalidated in between when we thought layout
|
||||
- // was updated and when we're ready to fire the event, just wait
|
||||
- // until after the next layout before firing events.
|
||||
- if (!d->View() || d->View()->NeedsLayout()) {
|
||||
+ if (!ShouldSignalReady()) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: deepak1556 <hop2deep@gmail.com>
|
||||
Date: Mon, 17 Jun 2024 18:05:47 +0000
|
||||
Subject: Use localized display label only for browser process
|
||||
|
||||
With https://crrev.com/c/5098130, GetPrimaryDisplayRefreshIntervalFromXrandr uses BuildDisplaysFromXRandRInfo
|
||||
to calculate the primary display frequency. In software compositing mode --disable-gpu-compositing,
|
||||
this code path will be called from the gpu process via SoftwareOutputSurface::SwapBuffers and
|
||||
can trigger a crash when attempting to set localized string. This is because on linux,
|
||||
gpu process does not have access to the resource bundle.
|
||||
|
||||
Bug: none
|
||||
Change-Id: I9d66b98c07a1a8671369546d4fc685213904a84f
|
||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5631219
|
||||
Auto-Submit: Deepak Mohan (Robo) <hop2deep@gmail.com>
|
||||
Reviewed-by: Thomas Anderson <thomasanderson@chromium.org>
|
||||
Reviewed-by: Scott Violet <sky@chromium.org>
|
||||
Commit-Queue: Scott Violet <sky@chromium.org>
|
||||
Cr-Commit-Position: refs/heads/main@{#1315980}
|
||||
|
||||
diff --git a/ui/base/x/x11_display_util.cc b/ui/base/x/x11_display_util.cc
|
||||
index 2f1c8f1b40c3aacc2815b4683eb24c8a9f1a0ecb..686eba52aab8f69f2d41fceb136d10c1ac750bd8 100644
|
||||
--- a/ui/base/x/x11_display_util.cc
|
||||
+++ b/ui/base/x/x11_display_util.cc
|
||||
@@ -299,6 +299,7 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
|
||||
const display::DisplayConfig& display_config,
|
||||
size_t* primary_display_index_out) {
|
||||
DCHECK(primary_display_index_out);
|
||||
+ auto* command_line = base::CommandLine::ForCurrentProcess();
|
||||
const float primary_scale = display_config.primary_scale;
|
||||
|
||||
auto* connection = x11::Connection::Get();
|
||||
@@ -348,7 +349,7 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
|
||||
connection->Flush();
|
||||
|
||||
std::vector<x11::Future<x11::GetPropertyReply>> icc_futures{n_iccs};
|
||||
- if (!base::CommandLine::ForCurrentProcess()->HasSwitch(switches::kHeadless)) {
|
||||
+ if (!command_line->HasSwitch(switches::kHeadless)) {
|
||||
for (size_t monitor = 0; monitor < n_iccs; ++monitor) {
|
||||
icc_futures[monitor] = GetIccProfileFuture(connection, monitor);
|
||||
}
|
||||
@@ -446,11 +447,18 @@ std::vector<display::Display> BuildDisplaysFromXRandRInfo(
|
||||
}
|
||||
|
||||
const std::string name(output_info->name.begin(), output_info->name.end());
|
||||
+ auto process_type =
|
||||
+ command_line->GetSwitchValueASCII("type");
|
||||
if (base::StartsWith(name, "eDP") || base::StartsWith(name, "LVDS")) {
|
||||
display::SetInternalDisplayIds({display_id});
|
||||
- // Use localized variant of "Built-in display" for internal displays.
|
||||
+ // For browser process which has access to resource bundle,
|
||||
+ // use localized variant of "Built-in display" for internal displays.
|
||||
// This follows the ozone DRM behavior (i.e. ChromeOS).
|
||||
- display.set_label(l10n_util::GetStringUTF8(IDS_DISPLAY_NAME_INTERNAL));
|
||||
+ if (process_type.empty()) {
|
||||
+ display.set_label(l10n_util::GetStringUTF8(IDS_DISPLAY_NAME_INTERNAL));
|
||||
+ } else {
|
||||
+ display.set_label("Built-in display");
|
||||
+ }
|
||||
} else {
|
||||
display.set_label(edid_parser.display_name());
|
||||
}
|
||||
@@ -11,5 +11,8 @@
|
||||
{ "patch_dir": "src/electron/patches/Mantle", "repo": "src/third_party/squirrel.mac/vendor/Mantle" },
|
||||
{ "patch_dir": "src/electron/patches/ReactiveObjC", "repo": "src/third_party/squirrel.mac/vendor/ReactiveObjC" },
|
||||
{ "patch_dir": "src/electron/patches/webrtc", "repo": "src/third_party/webrtc" },
|
||||
{ "patch_dir": "src/electron/patches/reclient-configs", "repo": "src/third_party/engflow-reclient-configs" }
|
||||
{ "patch_dir": "src/electron/patches/reclient-configs", "repo": "src/third_party/engflow-reclient-configs" },
|
||||
{ "patch_dir": "src/electron/patches/libaom", "repo": "src/third_party/libaom/source/libaom" },
|
||||
{ "patch_dir": "src/electron/patches/DirectXShaderCompiler", "repo": "src/third_party/dawn/third_party/dxc" },
|
||||
{ "patch_dir": "src/electron/patches/dawn", "repo": "src/third_party/dawn" }
|
||||
]
|
||||
|
||||
2
patches/dawn/.patches
Normal file
2
patches/dawn/.patches
Normal file
@@ -0,0 +1,2 @@
|
||||
dawn_dxc_disable_dxc_pass_structurize-loop-exits-for-unroll.patch
|
||||
deps_update_dxc_to_patched_branch.patch
|
||||
@@ -0,0 +1,34 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Antonio Maiorano <amaiorano@google.com>
|
||||
Date: Mon, 17 Jun 2024 18:33:47 +0000
|
||||
Subject: dawn/dxc: disable DXC pass 'structurize-loop-exits-for-unroll'
|
||||
|
||||
Multiple security bugs have been reported related to this optimization pass, and after careful consideration, we have decided to disable it.
|
||||
|
||||
Bug: chromium:333508731
|
||||
Bug: chromium:339171223
|
||||
Bug: chromium:339169163
|
||||
Bug: chromium:346595893
|
||||
Change-Id: I5c9d7180ed09e7417c120595937bcb1013b6ce66
|
||||
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/184422
|
||||
Commit-Queue: Antonio Maiorano <amaiorano@google.com>
|
||||
Reviewed-by: Natalie Chouinard <chouinard@google.com>
|
||||
Reviewed-by: Austin Eng <enga@chromium.org>
|
||||
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/194160
|
||||
Reviewed-by: dan sinclair <dsinclair@chromium.org>
|
||||
|
||||
diff --git a/src/dawn/native/d3d/ShaderUtils.cpp b/src/dawn/native/d3d/ShaderUtils.cpp
|
||||
index e1937ca2d5f9b84f3590c5cc3285850a06db5a5d..2d2d5dc49b971dc52ed39c29bb443e127e6d5166 100644
|
||||
--- a/src/dawn/native/d3d/ShaderUtils.cpp
|
||||
+++ b/src/dawn/native/d3d/ShaderUtils.cpp
|
||||
@@ -58,6 +58,10 @@ std::vector<const wchar_t*> GetDXCArguments(std::wstring_view entryPointNameW,
|
||||
arguments.push_back(L"-E");
|
||||
arguments.push_back(entryPointNameW.data());
|
||||
|
||||
+ // TODO(chromium:346595893): Disable buggy DXC pass
|
||||
+ arguments.push_back(L"-opt-disable");
|
||||
+ arguments.push_back(L"structurize-loop-exits-for-unroll");
|
||||
+
|
||||
uint32_t compileFlags = r.compileFlags;
|
||||
if (compileFlags & D3DCOMPILE_ENABLE_BACKWARDS_COMPATIBILITY) {
|
||||
arguments.push_back(L"/Gec");
|
||||
28
patches/dawn/deps_update_dxc_to_patched_branch.patch
Normal file
28
patches/dawn/deps_update_dxc_to_patched_branch.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: David Neto <dneto@google.com>
|
||||
Date: Wed, 17 Jul 2024 14:09:26 +0000
|
||||
Subject: DEPS: Update DXC to patched branch
|
||||
|
||||
Also, add DXC_CODEGEN_EXCEPTIONS_TRAP=1 to DXC gn config.
|
||||
|
||||
Bug: chromium:346618785, chromium:350696474
|
||||
Change-Id: I4c1ac753d824c4790e78d8f36231c8f2fe0e2722
|
||||
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/198756
|
||||
Reviewed-by: Natalie Chouinard <chouinard@google.com>
|
||||
|
||||
diff --git a/third_party/gn/dxc/BUILD.gn b/third_party/gn/dxc/BUILD.gn
|
||||
index aadb64eeb4fba2f2da442a8a7f4b285a469c5cdd..0060484cefcf1835138b111258c33e09fab1279c 100644
|
||||
--- a/third_party/gn/dxc/BUILD.gn
|
||||
+++ b/third_party/gn/dxc/BUILD.gn
|
||||
@@ -453,7 +453,10 @@ cmake_configure_file("clang-config-h") {
|
||||
cmake_configure_file("dxc-config-h") {
|
||||
input = "$dawn_dxc_dir/include/dxc/config.h.cmake"
|
||||
output = "$target_gen_dir/include/dxc/config.h"
|
||||
- values = [ "DXC_DISABLE_ALLOCATOR_OVERRIDES=1" ]
|
||||
+ values = [
|
||||
+ "DXC_DISABLE_ALLOCATOR_OVERRIDES=1",
|
||||
+ "DXC_CODEGEN_EXCEPTIONS_TRAP=1",
|
||||
+ ]
|
||||
}
|
||||
|
||||
#######################################################################
|
||||
2
patches/libaom/.patches
Normal file
2
patches/libaom/.patches
Normal file
@@ -0,0 +1,2 @@
|
||||
update_codec_config_after_svc_scale_controls.patch
|
||||
encode_api_test_add_repro_for_chromium_339877165.patch
|
||||
@@ -0,0 +1,162 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: James Zern <jzern@google.com>
|
||||
Date: Thu, 16 May 2024 13:44:52 -0700
|
||||
Subject: encode_api_test: add repro for chromium 339877165
|
||||
|
||||
BUG=chromium:339877165
|
||||
|
||||
Change-Id: I69dcc2cda098ec96a34e1e5f7ef557ee8caf5521
|
||||
(cherry picked from commit 01467cdbd524900eed283660836179fd1b2cd536)
|
||||
|
||||
diff --git a/test/encode_api_test.cc b/test/encode_api_test.cc
|
||||
index a7d5b3aa3c7dbcfce8e726fca1f1670ed878e53c..27bcbc14c14c4218d45e59e509fbe5fdbdc005bb 100644
|
||||
--- a/test/encode_api_test.cc
|
||||
+++ b/test/encode_api_test.cc
|
||||
@@ -635,6 +635,147 @@ TEST(EncodeAPI, PtsOrDurationTooBig) {
|
||||
aom_codec_destroy(&enc);
|
||||
}
|
||||
|
||||
+// Reproduces https://crbug.com/339877165.
|
||||
+TEST(EncodeAPI, Buganizer339877165) {
|
||||
+ // Initialize libaom encoder.
|
||||
+ aom_codec_iface_t *const iface = aom_codec_av1_cx();
|
||||
+ aom_codec_ctx_t enc;
|
||||
+ aom_codec_enc_cfg_t cfg;
|
||||
+
|
||||
+ ASSERT_EQ(aom_codec_enc_config_default(iface, &cfg, AOM_USAGE_REALTIME),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ cfg.g_w = 2560;
|
||||
+ cfg.g_h = 1600;
|
||||
+ cfg.rc_target_bitrate = 231;
|
||||
+ cfg.rc_end_usage = AOM_CBR;
|
||||
+ cfg.g_threads = 8;
|
||||
+
|
||||
+ ASSERT_EQ(aom_codec_enc_init(&enc, iface, &cfg, 0), AOM_CODEC_OK);
|
||||
+
|
||||
+ // From libaom_av1_encoder.cc in WebRTC.
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AOME_SET_CPUUSED, 11), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_CDEF, 1), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_TPL_MODEL, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_DELTAQ_MODE, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_ORDER_HINT, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_AQ_MODE, 3), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AOME_SET_MAX_INTRA_BITRATE_PCT, 300),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_COEFF_COST_UPD_FREQ, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_MODE_COST_UPD_FREQ, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_MV_COST_UPD_FREQ, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_TUNE_CONTENT, AOM_CONTENT_SCREEN),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_PALETTE, 1), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_TILE_ROWS, 1), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_TILE_COLUMNS, 2), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_OBMC, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_NOISE_SENSITIVITY, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_WARPED_MOTION, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_GLOBAL_MOTION, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_REF_FRAME_MVS, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SUPERBLOCK_SIZE,
|
||||
+ AOM_SUPERBLOCK_SIZE_DYNAMIC),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_CFL_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_SMOOTH_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_ANGLE_DELTA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_FILTER_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_INTRA_DEFAULT_TX_ONLY, 1),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_DISABLE_TRELLIS_QUANT, 1),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_DIST_WTD_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_DIFF_WTD_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_DUAL_FILTER, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTERINTRA_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTERINTRA_WEDGE, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTRA_EDGE_FILTER, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_INTRABC, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_MASKED_COMP, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_PAETH_INTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_QM, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_RECT_PARTITIONS, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_RESTORATION, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_SMOOTH_INTERINTRA, 0),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_ENABLE_TX64, 0), AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_MAX_REFERENCE_FRAMES, 3),
|
||||
+ AOM_CODEC_OK);
|
||||
+ ASSERT_EQ(aom_codec_enc_config_set(&enc, &cfg), AOM_CODEC_OK);
|
||||
+
|
||||
+ aom_svc_params_t svc_params = {};
|
||||
+ svc_params.number_spatial_layers = 2;
|
||||
+ svc_params.number_temporal_layers = 1;
|
||||
+ svc_params.max_quantizers[0] = svc_params.max_quantizers[1] = 56;
|
||||
+ svc_params.min_quantizers[0] = svc_params.min_quantizers[1] = 10;
|
||||
+ svc_params.scaling_factor_num[0] = svc_params.scaling_factor_num[1] = 1;
|
||||
+ svc_params.scaling_factor_den[0] = 2;
|
||||
+ svc_params.scaling_factor_den[1] = 1;
|
||||
+ svc_params.layer_target_bitrate[0] = cfg.rc_target_bitrate;
|
||||
+ svc_params.framerate_factor[0] = 1;
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SVC_PARAMS, &svc_params),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ aom_svc_layer_id_t layer_id = {};
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SVC_LAYER_ID, &layer_id),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ aom_svc_ref_frame_config_t ref_frame_config = {};
|
||||
+ ref_frame_config.refresh[0] = 1;
|
||||
+ ASSERT_EQ(
|
||||
+ aom_codec_control(&enc, AV1E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ // Create input image.
|
||||
+ aom_image_t *const image =
|
||||
+ CreateGrayImage(AOM_IMG_FMT_I420, cfg.g_w, cfg.g_h);
|
||||
+ ASSERT_NE(image, nullptr);
|
||||
+
|
||||
+ // Encode layer 0.
|
||||
+ ASSERT_EQ(aom_codec_encode(&enc, image, 0, 1, 0), AOM_CODEC_OK);
|
||||
+
|
||||
+ layer_id.spatial_layer_id = 1;
|
||||
+ ASSERT_EQ(aom_codec_control(&enc, AV1E_SET_SVC_LAYER_ID, &layer_id),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ ref_frame_config.refresh[0] = 0;
|
||||
+ ASSERT_EQ(
|
||||
+ aom_codec_control(&enc, AV1E_SET_SVC_REF_FRAME_CONFIG, &ref_frame_config),
|
||||
+ AOM_CODEC_OK);
|
||||
+
|
||||
+ // Encode layer 1.
|
||||
+ ASSERT_EQ(aom_codec_encode(&enc, image, 0, 1, 0), AOM_CODEC_OK);
|
||||
+
|
||||
+ // Free resources.
|
||||
+ aom_img_free(image);
|
||||
+ aom_codec_destroy(&enc);
|
||||
+}
|
||||
+
|
||||
class EncodeAPIParameterized
|
||||
: public testing::TestWithParam<std::tuple<
|
||||
/*usage=*/unsigned int, /*speed=*/int, /*aq_mode=*/unsigned int>> {};
|
||||
@@ -0,0 +1,196 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: James Zern <jzern@google.com>
|
||||
Date: Tue, 14 May 2024 17:54:10 -0700
|
||||
Subject: update codec config after svc/scale controls
|
||||
|
||||
This ensures the encoder state/allocations stay in sync with scaling and
|
||||
svc layer changes. In the SVC case, depending on the resolution,
|
||||
differences in the chosen superblock size among layers may have caused a
|
||||
crash. This was reproducible in WebRTC in screen content mode.
|
||||
|
||||
The fix is based on a change by Yuan Tong (tongyuan200097) [1]. It
|
||||
refreshes the encoder config after AOME_SET_SCALEMODE,
|
||||
AOME_SET_NUMBER_SPATIAL_LAYERS and AV1E_SET_SVC_PARAMS if no frames have
|
||||
been encoded. AV1E_SET_SVC_PARAMS was missed in the original change.
|
||||
|
||||
[1]: https://aomedia-review.googlesource.com/c/aom/+/171941/2
|
||||
|
||||
Bug: chromium:339877165
|
||||
Change-Id: Ib3d2a123b159898d7c7e19c81e89ff148920e1f1
|
||||
(cherry picked from commit e42f4b1980bbbc772aa886d8b43a885461d7b89e)
|
||||
|
||||
diff --git a/av1/av1_cx_iface.c b/av1/av1_cx_iface.c
|
||||
index 2b6b1504e6245b44f7693612eda31bfe3a14c402..652c6eadef2911a1a54a14cd78fd064b801868f5 100644
|
||||
--- a/av1/av1_cx_iface.c
|
||||
+++ b/av1/av1_cx_iface.c
|
||||
@@ -1609,37 +1609,42 @@ static aom_codec_err_t ctrl_get_baseline_gf_interval(aom_codec_alg_priv_t *ctx,
|
||||
return AOM_CODEC_OK;
|
||||
}
|
||||
|
||||
+static aom_codec_err_t update_encoder_cfg(aom_codec_alg_priv_t *ctx) {
|
||||
+ set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
|
||||
+ av1_check_fpmt_config(ctx->ppi, &ctx->oxcf);
|
||||
+ bool is_sb_size_changed = false;
|
||||
+ av1_change_config_seq(ctx->ppi, &ctx->oxcf, &is_sb_size_changed);
|
||||
+ for (int i = 0; i < ctx->ppi->num_fp_contexts; i++) {
|
||||
+ AV1_COMP *const cpi = ctx->ppi->parallel_cpi[i];
|
||||
+ struct aom_internal_error_info *const error = cpi->common.error;
|
||||
+ if (setjmp(error->jmp)) {
|
||||
+ error->setjmp = 0;
|
||||
+ return error->error_code;
|
||||
+ }
|
||||
+ error->setjmp = 1;
|
||||
+ av1_change_config(cpi, &ctx->oxcf, is_sb_size_changed);
|
||||
+ error->setjmp = 0;
|
||||
+ }
|
||||
+ if (ctx->ppi->cpi_lap != NULL) {
|
||||
+ AV1_COMP *const cpi_lap = ctx->ppi->cpi_lap;
|
||||
+ struct aom_internal_error_info *const error = cpi_lap->common.error;
|
||||
+ if (setjmp(error->jmp)) {
|
||||
+ error->setjmp = 0;
|
||||
+ return error->error_code;
|
||||
+ }
|
||||
+ error->setjmp = 1;
|
||||
+ av1_change_config(cpi_lap, &ctx->oxcf, is_sb_size_changed);
|
||||
+ error->setjmp = 0;
|
||||
+ }
|
||||
+ return AOM_CODEC_OK;
|
||||
+}
|
||||
+
|
||||
static aom_codec_err_t update_extra_cfg(aom_codec_alg_priv_t *ctx,
|
||||
const struct av1_extracfg *extra_cfg) {
|
||||
const aom_codec_err_t res = validate_config(ctx, &ctx->cfg, extra_cfg);
|
||||
if (res == AOM_CODEC_OK) {
|
||||
ctx->extra_cfg = *extra_cfg;
|
||||
- set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
|
||||
- av1_check_fpmt_config(ctx->ppi, &ctx->oxcf);
|
||||
- bool is_sb_size_changed = false;
|
||||
- av1_change_config_seq(ctx->ppi, &ctx->oxcf, &is_sb_size_changed);
|
||||
- for (int i = 0; i < ctx->ppi->num_fp_contexts; i++) {
|
||||
- AV1_COMP *const cpi = ctx->ppi->parallel_cpi[i];
|
||||
- struct aom_internal_error_info *const error = cpi->common.error;
|
||||
- if (setjmp(error->jmp)) {
|
||||
- error->setjmp = 0;
|
||||
- return error->error_code;
|
||||
- }
|
||||
- error->setjmp = 1;
|
||||
- av1_change_config(cpi, &ctx->oxcf, is_sb_size_changed);
|
||||
- error->setjmp = 0;
|
||||
- }
|
||||
- if (ctx->ppi->cpi_lap != NULL) {
|
||||
- AV1_COMP *const cpi_lap = ctx->ppi->cpi_lap;
|
||||
- struct aom_internal_error_info *const error = cpi_lap->common.error;
|
||||
- if (setjmp(error->jmp)) {
|
||||
- error->setjmp = 0;
|
||||
- return error->error_code;
|
||||
- }
|
||||
- error->setjmp = 1;
|
||||
- av1_change_config(cpi_lap, &ctx->oxcf, is_sb_size_changed);
|
||||
- error->setjmp = 0;
|
||||
- }
|
||||
+ return update_encoder_cfg(ctx);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
@@ -3610,11 +3615,23 @@ static aom_codec_err_t ctrl_set_scale_mode(aom_codec_alg_priv_t *ctx,
|
||||
aom_scaling_mode_t *const mode = va_arg(args, aom_scaling_mode_t *);
|
||||
|
||||
if (mode) {
|
||||
- const int res = av1_set_internal_size(
|
||||
- &ctx->ppi->cpi->oxcf, &ctx->ppi->cpi->resize_pending_params,
|
||||
- mode->h_scaling_mode, mode->v_scaling_mode);
|
||||
- av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
|
||||
- return (res == 0) ? AOM_CODEC_OK : AOM_CODEC_INVALID_PARAM;
|
||||
+ AV1EncoderConfig *const oxcf =
|
||||
+ ctx->ppi->seq_params_locked ? &ctx->ppi->cpi->oxcf : &ctx->oxcf;
|
||||
+ const int res =
|
||||
+ av1_set_internal_size(oxcf, &ctx->ppi->cpi->resize_pending_params,
|
||||
+ mode->h_scaling_mode, mode->v_scaling_mode);
|
||||
+ if (res == 0) {
|
||||
+ // update_encoder_cfg() is somewhat costly and this control may be called
|
||||
+ // multiple times, so update_encoder_cfg() is only called to ensure frame
|
||||
+ // and superblock sizes are updated before they're fixed by the first
|
||||
+ // encode call.
|
||||
+ if (ctx->ppi->seq_params_locked) {
|
||||
+ av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
|
||||
+ return AOM_CODEC_OK;
|
||||
+ }
|
||||
+ return update_encoder_cfg(ctx);
|
||||
+ }
|
||||
+ return AOM_CODEC_INVALID_PARAM;
|
||||
} else {
|
||||
return AOM_CODEC_INVALID_PARAM;
|
||||
}
|
||||
@@ -3635,6 +3652,13 @@ static aom_codec_err_t ctrl_set_number_spatial_layers(aom_codec_alg_priv_t *ctx,
|
||||
if (number_spatial_layers > MAX_NUM_SPATIAL_LAYERS)
|
||||
return AOM_CODEC_INVALID_PARAM;
|
||||
ctx->ppi->number_spatial_layers = number_spatial_layers;
|
||||
+ // update_encoder_cfg() is somewhat costly and this control may be called
|
||||
+ // multiple times, so update_encoder_cfg() is only called to ensure frame and
|
||||
+ // superblock sizes are updated before they're fixed by the first encode
|
||||
+ // call.
|
||||
+ if (!ctx->ppi->seq_params_locked) {
|
||||
+ return update_encoder_cfg(ctx);
|
||||
+ }
|
||||
return AOM_CODEC_OK;
|
||||
}
|
||||
|
||||
@@ -3652,8 +3676,6 @@ static aom_codec_err_t ctrl_set_svc_params(aom_codec_alg_priv_t *ctx,
|
||||
va_list args) {
|
||||
AV1_PRIMARY *const ppi = ctx->ppi;
|
||||
AV1_COMP *const cpi = ppi->cpi;
|
||||
- AV1_COMMON *const cm = &cpi->common;
|
||||
- AV1EncoderConfig *oxcf = &cpi->oxcf;
|
||||
aom_svc_params_t *const params = va_arg(args, aom_svc_params_t *);
|
||||
int64_t target_bandwidth = 0;
|
||||
ppi->number_spatial_layers = params->number_spatial_layers;
|
||||
@@ -3693,19 +3715,38 @@ static aom_codec_err_t ctrl_set_svc_params(aom_codec_alg_priv_t *ctx,
|
||||
target_bandwidth += lc->layer_target_bitrate;
|
||||
}
|
||||
}
|
||||
- if (cm->current_frame.frame_number == 0) {
|
||||
- if (!cpi->ppi->seq_params_locked) {
|
||||
- SequenceHeader *const seq_params = &ppi->seq_params;
|
||||
- seq_params->operating_points_cnt_minus_1 =
|
||||
- ppi->number_spatial_layers * ppi->number_temporal_layers - 1;
|
||||
- av1_init_seq_coding_tools(ppi, &cpi->oxcf, 1);
|
||||
- }
|
||||
+
|
||||
+ if (ppi->seq_params_locked) {
|
||||
+ AV1EncoderConfig *const oxcf = &cpi->oxcf;
|
||||
+ // Keep ctx->oxcf in sync in case further codec controls are made prior
|
||||
+ // to encoding.
|
||||
+ ctx->oxcf.rc_cfg.target_bandwidth = oxcf->rc_cfg.target_bandwidth =
|
||||
+ target_bandwidth;
|
||||
+ set_primary_rc_buffer_sizes(oxcf, ppi);
|
||||
+ av1_update_layer_context_change_config(cpi, target_bandwidth);
|
||||
+ check_reset_rc_flag(cpi);
|
||||
+ } else {
|
||||
+ // Note av1_init_layer_context() relies on cpi->oxcf. The order of that
|
||||
+ // call and the ones in the other half of this block (which
|
||||
+ // update_encoder_cfg() transitively makes) is important. So we keep
|
||||
+ // ctx->oxcf and cpi->oxcf in sync here as update_encoder_cfg() will
|
||||
+ // overwrite cpi->oxcf with ctx->oxcf.
|
||||
+ ctx->oxcf.rc_cfg.target_bandwidth = cpi->oxcf.rc_cfg.target_bandwidth =
|
||||
+ target_bandwidth;
|
||||
+ SequenceHeader *const seq_params = &ppi->seq_params;
|
||||
+ seq_params->operating_points_cnt_minus_1 =
|
||||
+ ppi->number_spatial_layers * ppi->number_temporal_layers - 1;
|
||||
+
|
||||
av1_init_layer_context(cpi);
|
||||
+ // update_encoder_cfg() is somewhat costly and this control may be called
|
||||
+ // multiple times, so update_encoder_cfg() is only called to ensure frame
|
||||
+ // and superblock sizes are updated before they're fixed by the first
|
||||
+ // encode call.
|
||||
+ return update_encoder_cfg(ctx);
|
||||
}
|
||||
- oxcf->rc_cfg.target_bandwidth = target_bandwidth;
|
||||
- set_primary_rc_buffer_sizes(oxcf, cpi->ppi);
|
||||
- av1_update_layer_context_change_config(cpi, target_bandwidth);
|
||||
- check_reset_rc_flag(cpi);
|
||||
+ } else if (!ppi->seq_params_locked) {
|
||||
+ // Ensure frame and superblock sizes are updated.
|
||||
+ return update_encoder_cfg(ctx);
|
||||
}
|
||||
av1_check_fpmt_config(ctx->ppi, &ctx->ppi->cpi->oxcf);
|
||||
return AOM_CODEC_OK;
|
||||
@@ -13,7 +13,6 @@ fix_account_for_debugger_agent_race_condition.patch
|
||||
fix_readbarrier_undefined_symbol_error_on_woa_arm64.patch
|
||||
fix_suppress_clang_-wdeprecated-declarations_in_libuv.patch
|
||||
fix_serdes_test.patch
|
||||
feat_add_knostartdebugsignalhandler_to_environment_to_prevent.patch
|
||||
feat_add_uv_loop_interrupt_on_io_change_option_to_uv_loop_configure.patch
|
||||
support_v8_sandboxed_pointers.patch
|
||||
build_ensure_native_module_compilation_fails_if_not_using_a_new.patch
|
||||
@@ -33,18 +32,15 @@ fix_assert_module_in_the_renderer_process.patch
|
||||
fix_add_trusted_space_and_trusted_lo_space_to_the_v8_heap.patch
|
||||
win_process_avoid_assert_after_spawning_store_app_4152.patch
|
||||
chore_remove_use_of_deprecated_kmaxlength.patch
|
||||
feat_optionally_prevent_calling_v8_enablewebassemblytraphandler.patch
|
||||
build_only_create_cppgc_heap_on_non-32_bit_platforms.patch
|
||||
fix_-wshadow_error_in_uvwasi_c.patch
|
||||
src_update_default_v8_platform_to_override_functions_with_location.patch
|
||||
fix_capture_embedder_exceptions_before_entering_v8.patch
|
||||
spec_add_iterator_to_global_intrinsics.patch
|
||||
build_do_not_rely_on_gn_helpers_in_gn_build.patch
|
||||
test_make_test-node-output-v8-warning_generic.patch
|
||||
test_match_wpt_streams_transferable_transform-stream-members_any_js.patch
|
||||
build_ensure_v8_pointer_compression_sandbox_is_enabled_on_64bit.patch
|
||||
fix_revert_src_lb_reducing_c_calls_of_esm_legacy_main_resolve.patch
|
||||
src_preload_function_for_environment.patch
|
||||
deprecate_vector_v8_local_in_v8.patch
|
||||
fs_fix_wtf-8_decoding_issue.patch
|
||||
stream_do_not_defer_construction_by_one_microtick.patch
|
||||
src_account_for_openssl_unexpected_version.patch
|
||||
windows_32bit_config_change_callback_needs_to_be_stdcall.patch
|
||||
fix_building_with_unicode.patch
|
||||
|
||||
@@ -11,10 +11,10 @@ really in 20/21. We have to wait until 22 is released to be able to
|
||||
build with upstream GN files.
|
||||
|
||||
diff --git a/BUILD.gn b/BUILD.gn
|
||||
index 1ed186b597eece7c34cb69c8e1e20870555a040d..541e7d2b8ee05677b64a3ea39c1422560fd5df75 100644
|
||||
index 1ed186b597eece7c34cb69c8e1e20870555a040d..7d201bb6b822f0401c3be2bc52d65bc71463748b 100644
|
||||
--- a/BUILD.gn
|
||||
+++ b/BUILD.gn
|
||||
@@ -1,14 +1,404 @@
|
||||
@@ -1,14 +1,406 @@
|
||||
-##############################################################################
|
||||
-# #
|
||||
-# DO NOT EDIT THIS FILE! #
|
||||
@@ -258,9 +258,11 @@ index 1ed186b597eece7c34cb69c8e1e20870555a040d..541e7d2b8ee05677b64a3ea39c142256
|
||||
+ defines = []
|
||||
+ sources = [
|
||||
+ "tools/js2c.cc",
|
||||
+ "tools/executable_wrapper.h"
|
||||
+ "tools/executable_wrapper.h",
|
||||
+ "src/embedded_data.cc",
|
||||
+ "src/embedded_data.h",
|
||||
+ ]
|
||||
+ include_dirs = [ "tools" ]
|
||||
+ include_dirs = [ "tools", "src" ]
|
||||
+ deps = [
|
||||
+ "deps/simdutf($electron_js2c_toolchain)",
|
||||
+ "deps/uv($electron_js2c_toolchain)",
|
||||
@@ -457,88 +459,88 @@ index e92ac3a3beac143dced2efb05304ed8ba832b067..1ce69e9deba1a9b191e8d95f4c82e0ec
|
||||
+ public_configs = [ ":ada_config" ]
|
||||
}
|
||||
diff --git a/deps/base64/unofficial.gni b/deps/base64/unofficial.gni
|
||||
index 269c62d976d6adea6d020568094e23e9b0a9dc7c..14ffff0b4badb7ad71f2b6df43ad2eb300fc55ed 100644
|
||||
index 0e69d7383762f6b81c5b57698aa9d121d5a9c401..35bbeb37acc7ccb14b4b8a644ec3d4c76ca5c61c 100644
|
||||
--- a/deps/base64/unofficial.gni
|
||||
+++ b/deps/base64/unofficial.gni
|
||||
@@ -18,6 +18,10 @@ template("base64_gn_build") {
|
||||
@@ -12,6 +12,10 @@ template("base64_gn_build") {
|
||||
}
|
||||
}
|
||||
|
||||
+ # FIXME(zcbenz): ASM on win/x86 compiles perfectly in upstream Node, figure
|
||||
+ # out why it does not work in Electron's build configs.
|
||||
+ support_x86_asm = target_cpu == "x64" || (target_cpu == "x86" && !is_win)
|
||||
+ support_x86_asm = current_cpu == "x64" || (current_cpu == "x86" && !is_win)
|
||||
+
|
||||
config("base64_internal_config") {
|
||||
include_dirs = [ "base64/lib" ]
|
||||
if (is_component_build) {
|
||||
@@ -25,7 +29,7 @@ template("base64_gn_build") {
|
||||
@@ -19,7 +23,7 @@ template("base64_gn_build") {
|
||||
} else {
|
||||
defines = []
|
||||
}
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
defines += [
|
||||
"HAVE_SSSE3=1",
|
||||
"HAVE_SSE41=1",
|
||||
@@ -75,7 +79,7 @@ template("base64_gn_build") {
|
||||
@@ -69,7 +73,7 @@ template("base64_gn_build") {
|
||||
source_set("base64_ssse3") {
|
||||
configs += [ ":base64_internal_config" ]
|
||||
sources = [ "base64/lib/arch/ssse3/codec.c" ]
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
if (is_clang || !is_win) {
|
||||
cflags_c = [ "-mssse3" ]
|
||||
}
|
||||
@@ -85,7 +89,7 @@ template("base64_gn_build") {
|
||||
@@ -79,7 +83,7 @@ template("base64_gn_build") {
|
||||
source_set("base64_sse41") {
|
||||
configs += [ ":base64_internal_config" ]
|
||||
sources = [ "base64/lib/arch/sse41/codec.c" ]
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
if (is_clang || !is_win) {
|
||||
cflags_c = [ "-msse4.1" ]
|
||||
}
|
||||
@@ -95,7 +99,7 @@ template("base64_gn_build") {
|
||||
@@ -89,7 +93,7 @@ template("base64_gn_build") {
|
||||
source_set("base64_sse42") {
|
||||
configs += [ ":base64_internal_config" ]
|
||||
sources = [ "base64/lib/arch/sse42/codec.c" ]
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
if (is_clang || !is_win) {
|
||||
cflags_c = [ "-msse4.2" ]
|
||||
}
|
||||
@@ -105,7 +109,7 @@ template("base64_gn_build") {
|
||||
@@ -99,7 +103,7 @@ template("base64_gn_build") {
|
||||
source_set("base64_avx") {
|
||||
configs += [ ":base64_internal_config" ]
|
||||
sources = [ "base64/lib/arch/avx/codec.c" ]
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
if (is_clang || !is_win) {
|
||||
cflags_c = [ "-mavx" ]
|
||||
} else if (is_win) {
|
||||
@@ -117,7 +121,7 @@ template("base64_gn_build") {
|
||||
@@ -111,7 +115,7 @@ template("base64_gn_build") {
|
||||
source_set("base64_avx2") {
|
||||
configs += [ ":base64_internal_config" ]
|
||||
sources = [ "base64/lib/arch/avx2/codec.c" ]
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
if (is_clang || !is_win) {
|
||||
cflags_c = [ "-mavx2" ]
|
||||
} else if (is_win) {
|
||||
@@ -129,7 +133,7 @@ template("base64_gn_build") {
|
||||
@@ -123,7 +127,7 @@ template("base64_gn_build") {
|
||||
source_set("base64_avx512") {
|
||||
configs += [ ":base64_internal_config" ]
|
||||
sources = [ "base64/lib/arch/avx512/codec.c" ]
|
||||
- if (target_cpu == "x86" || target_cpu == "x64") {
|
||||
- if (current_cpu == "x86" || current_cpu == "x64") {
|
||||
+ if (support_x86_asm) {
|
||||
if (is_clang || !is_win) {
|
||||
cflags_c = [
|
||||
"-mavx512vl",
|
||||
diff --git a/deps/cares/BUILD.gn b/deps/cares/BUILD.gn
|
||||
index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe078270585843eca3 100644
|
||||
index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..087e27424f3997575e4e089a57955d04b8802321 100644
|
||||
--- a/deps/cares/BUILD.gn
|
||||
+++ b/deps/cares/BUILD.gn
|
||||
@@ -1,14 +1,143 @@
|
||||
@@ -1,14 +1,170 @@
|
||||
-##############################################################################
|
||||
-# #
|
||||
-# DO NOT EDIT THIS FILE! #
|
||||
@@ -562,36 +564,61 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
+ sources = [
|
||||
+ "include/ares.h",
|
||||
+ "include/ares_dns.h",
|
||||
+ "include/ares_dns_record.h",
|
||||
+ "include/ares_nameser.h",
|
||||
+ "include/ares_rules.h",
|
||||
+ "include/ares_version.h",
|
||||
+ "src/lib/ares__addrinfo2hostent.c",
|
||||
+ "src/lib/ares__addrinfo_localhost.c",
|
||||
+ "src/lib/ares_android.c",
|
||||
+ "src/lib/ares__buf.c",
|
||||
+ "src/lib/ares__buf.h",
|
||||
+ "src/lib/ares__close_sockets.c",
|
||||
+ "src/lib/ares__hosts_file.c",
|
||||
+ "src/lib/ares__htable.c",
|
||||
+ "src/lib/ares__htable.h",
|
||||
+ "src/lib/ares__htable_asvp.c",
|
||||
+ "src/lib/ares__htable_asvp.h",
|
||||
+ "src/lib/ares__htable_stvp.c",
|
||||
+ "src/lib/ares__htable_stvp.h",
|
||||
+ "src/lib/ares__htable_strvp.c",
|
||||
+ "src/lib/ares__htable_strvp.h",
|
||||
+ "src/lib/ares__htable_szvp.c",
|
||||
+ "src/lib/ares__htable_szvp.h",
|
||||
+ "src/lib/ares__htable_vpvp.c",
|
||||
+ "src/lib/ares__htable_vpvp.h",
|
||||
+ "src/lib/ares__iface_ips.c",
|
||||
+ "src/lib/ares__iface_ips.h",
|
||||
+ "src/lib/ares__llist.c",
|
||||
+ "src/lib/ares__llist.h",
|
||||
+ "src/lib/ares__get_hostent.c",
|
||||
+ "src/lib/ares__parse_into_addrinfo.c",
|
||||
+ "src/lib/ares__read_line.c",
|
||||
+ "src/lib/ares__readaddrinfo.c",
|
||||
+ "src/lib/ares__slist.c",
|
||||
+ "src/lib/ares__slist.h",
|
||||
+ "src/lib/ares__socket.c",
|
||||
+ "src/lib/ares__sortaddrinfo.c",
|
||||
+ "src/lib/ares__threads.c",
|
||||
+ "src/lib/ares__threads.h",
|
||||
+ "src/lib/ares__timeval.c",
|
||||
+ "src/lib/ares_android.c",
|
||||
+ "src/lib/ares_android.h",
|
||||
+ "src/lib/ares_cancel.c",
|
||||
+ "src/lib/ares_create_query.c",
|
||||
+ "src/lib/ares_data.c",
|
||||
+ "src/lib/ares_data.h",
|
||||
+ "src/lib/ares_destroy.c",
|
||||
+ "src/lib/ares_dns_mapping.c",
|
||||
+ "src/lib/ares_dns_name.c",
|
||||
+ "src/lib/ares_dns_parse.c",
|
||||
+ "src/lib/ares_dns_record.c",
|
||||
+ "src/lib/ares_dns_private.h",
|
||||
+ "src/lib/ares_dns_write.c",
|
||||
+ "src/lib/ares_event_configchg.c",
|
||||
+ "src/lib/ares_event.h",
|
||||
+ "src/lib/ares_event_win32.h",
|
||||
+ "src/lib/ares_event_epoll.c",
|
||||
+ "src/lib/ares_event_kqueue.c",
|
||||
+ "src/lib/ares_event_poll.c",
|
||||
+ "src/lib/ares_event_select.c",
|
||||
+ "src/lib/ares_event_thread.c",
|
||||
+ "src/lib/ares_event_wake_pipe.c",
|
||||
+ "src/lib/ares_event_win32.c",
|
||||
+ "src/lib/ares_expand_name.c",
|
||||
+ "src/lib/ares_expand_string.c",
|
||||
+ "src/lib/ares_fds.c",
|
||||
@@ -599,6 +626,7 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
+ "src/lib/ares_free_string.c",
|
||||
+ "src/lib/ares_freeaddrinfo.c",
|
||||
+ "src/lib/ares_getaddrinfo.c",
|
||||
+ "src/lib/ares_getenv.c",
|
||||
+ "src/lib/ares_getenv.h",
|
||||
+ "src/lib/ares_gethostbyaddr.c",
|
||||
+ "src/lib/ares_gethostbyname.c",
|
||||
@@ -606,16 +634,12 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
+ "src/lib/ares_getsock.c",
|
||||
+ "src/lib/ares_inet_net_pton.h",
|
||||
+ "src/lib/ares_init.c",
|
||||
+ "src/lib/ares_ipv6.h",
|
||||
+ "src/lib/ares_library_init.c",
|
||||
+ "src/lib/ares_library_init.h",
|
||||
+ "src/lib/ares_mkquery.c",
|
||||
+ "src/lib/ares_nameser.h",
|
||||
+ "src/lib/ares_nowarn.c",
|
||||
+ "src/lib/ares_nowarn.h",
|
||||
+ "src/lib/ares_ipv6.h",
|
||||
+ "src/lib/ares_math.c",
|
||||
+ "src/lib/ares_options.c",
|
||||
+ "src/lib/ares_parse_aaaa_reply.c",
|
||||
+ "src/lib/ares_parse_a_reply.c",
|
||||
+ "src/lib/ares_parse_aaaa_reply.c",
|
||||
+ "src/lib/ares_parse_caa_reply.c",
|
||||
+ "src/lib/ares_parse_mx_reply.c",
|
||||
+ "src/lib/ares_parse_naptr_reply.c",
|
||||
@@ -625,9 +649,11 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
+ "src/lib/ares_parse_srv_reply.c",
|
||||
+ "src/lib/ares_parse_txt_reply.c",
|
||||
+ "src/lib/ares_parse_uri_reply.c",
|
||||
+ "src/lib/ares_platform.c",
|
||||
+ "src/lib/ares_platform.h",
|
||||
+ "src/lib/ares_private.h",
|
||||
+ "src/lib/ares_process.c",
|
||||
+ "src/lib/ares_qcache.c",
|
||||
+ "src/lib/ares_query.c",
|
||||
+ "src/lib/ares_rand.c",
|
||||
+ "src/lib/ares_search.c",
|
||||
@@ -635,14 +661,16 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
+ "src/lib/ares_setup.h",
|
||||
+ "src/lib/ares_strcasecmp.c",
|
||||
+ "src/lib/ares_strcasecmp.h",
|
||||
+ "src/lib/ares_strdup.c",
|
||||
+ "src/lib/ares_strdup.h",
|
||||
+ "src/lib/ares_str.c",
|
||||
+ "src/lib/ares_str.h",
|
||||
+ "src/lib/ares_strerror.c",
|
||||
+ "src/lib/ares_strsplit.c",
|
||||
+ "src/lib/ares_strsplit.h",
|
||||
+ "src/lib/ares_sysconfig.c",
|
||||
+ "src/lib/ares_sysconfig_files.c",
|
||||
+ "src/lib/ares_timeout.c",
|
||||
+ "src/lib/ares_update_servers.c",
|
||||
+ "src/lib/ares_version.c",
|
||||
+ "src/lib/bitncmp.c",
|
||||
+ "src/lib/bitncmp.h",
|
||||
+ "src/lib/inet_net_pton.c",
|
||||
+ "src/lib/inet_ntop.c",
|
||||
+ "src/lib/setup_once.h",
|
||||
@@ -666,9 +694,6 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
+ defines += [ "CARES_PULL_WS2TCPIP_H=1" ]
|
||||
+ include_dirs += [ "config/win32" ]
|
||||
+ sources += [
|
||||
+ "src/lib/ares_getenv.c",
|
||||
+ "src/lib/ares_iphlpapi.h",
|
||||
+ "src/lib/ares_platform.c",
|
||||
+ "src/lib/config-win32.h",
|
||||
+ "src/lib/windows_port.c",
|
||||
+ ]
|
||||
@@ -689,7 +714,11 @@ index ac19ac73ed1e24c61cb679f3851685b79cfc8b39..fb1b3138cdb674205afa0ffe07827058
|
||||
-cares_gn_build("cares") {
|
||||
+ if (is_mac) {
|
||||
+ include_dirs += [ "config/darwin" ]
|
||||
+ sources += [ "config/darwin/ares_config.h" ]
|
||||
+ sources += [
|
||||
+ "config/darwin/ares_config.h",
|
||||
+ "src/lib/ares_sysconfig_mac.c",
|
||||
+ "src/lib/thirdparty/apple/dnsinfo.h",
|
||||
+ ]
|
||||
+ }
|
||||
}
|
||||
diff --git a/deps/googletest/BUILD.gn b/deps/googletest/BUILD.gn
|
||||
@@ -838,7 +867,7 @@ index 64a2a4799d5530276f46aa1faa63ece063390ada..fb000f8ee7647c375bc190d1729d67bb
|
||||
+ ]
|
||||
}
|
||||
diff --git a/deps/nghttp2/BUILD.gn b/deps/nghttp2/BUILD.gn
|
||||
index 274352b0e2449f8db49d9a49c6b92a69f97e8363..7d2ca477db2415f43ababa270d8aefa3124b2765 100644
|
||||
index 274352b0e2449f8db49d9a49c6b92a69f97e8363..f04c7ca24af6cdbe8d739bcd55172110963888e9 100644
|
||||
--- a/deps/nghttp2/BUILD.gn
|
||||
+++ b/deps/nghttp2/BUILD.gn
|
||||
@@ -1,14 +1,51 @@
|
||||
@@ -888,7 +917,7 @@ index 274352b0e2449f8db49d9a49c6b92a69f97e8363..7d2ca477db2415f43ababa270d8aefa3
|
||||
+ "lib/nghttp2_http.c",
|
||||
+ "lib/nghttp2_map.c",
|
||||
+ "lib/nghttp2_mem.c",
|
||||
+ "lib/nghttp2_npn.c",
|
||||
+ "lib/nghttp2_alpn.c",
|
||||
+ "lib/nghttp2_option.c",
|
||||
+ "lib/nghttp2_outbound_item.c",
|
||||
+ "lib/nghttp2_pq.c",
|
||||
@@ -901,7 +930,7 @@ index 274352b0e2449f8db49d9a49c6b92a69f97e8363..7d2ca477db2415f43ababa270d8aefa3
|
||||
+ "lib/nghttp2_submit.c",
|
||||
+ "lib/nghttp2_time.c",
|
||||
+ "lib/nghttp2_version.c",
|
||||
+ "lib/sfparse.c"
|
||||
+ "lib/sfparse.c",
|
||||
+ ]
|
||||
}
|
||||
diff --git a/deps/simdjson/BUILD.gn b/deps/simdjson/BUILD.gn
|
||||
@@ -1234,10 +1263,10 @@ index 0000000000000000000000000000000000000000..af9cbada10203b387fb9732b346583b1
|
||||
+}
|
||||
diff --git a/filenames.json b/filenames.json
|
||||
new file mode 100644
|
||||
index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334fb05654f
|
||||
index 0000000000000000000000000000000000000000..7fed188f922a6754907411046ba4a977049394ea
|
||||
--- /dev/null
|
||||
+++ b/filenames.json
|
||||
@@ -0,0 +1,733 @@
|
||||
@@ -0,0 +1,740 @@
|
||||
+// This file is automatically generated by generate_gn_filenames_json.py
|
||||
+// DO NOT EDIT
|
||||
+{
|
||||
@@ -1507,6 +1536,7 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "lib/internal/error_serdes.js",
|
||||
+ "lib/internal/errors.js",
|
||||
+ "lib/internal/event_target.js",
|
||||
+ "lib/internal/events/abort_listener.js",
|
||||
+ "lib/internal/events/symbols.js",
|
||||
+ "lib/internal/file.js",
|
||||
+ "lib/internal/fixed_queue.js",
|
||||
@@ -1543,7 +1573,6 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "lib/internal/modules/esm/fetch_module.js",
|
||||
+ "lib/internal/modules/esm/formats.js",
|
||||
+ "lib/internal/modules/esm/get_format.js",
|
||||
+ "lib/internal/modules/esm/handle_process_exit.js",
|
||||
+ "lib/internal/modules/esm/hooks.js",
|
||||
+ "lib/internal/modules/esm/initialize_import_meta.js",
|
||||
+ "lib/internal/modules/esm/load.js",
|
||||
@@ -1578,7 +1607,6 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "lib/internal/policy/manifest.js",
|
||||
+ "lib/internal/policy/sri.js",
|
||||
+ "lib/internal/priority_queue.js",
|
||||
+ "lib/internal/process/esm_loader.js",
|
||||
+ "lib/internal/process/execution.js",
|
||||
+ "lib/internal/process/per_thread.js",
|
||||
+ "lib/internal/process/permission.js",
|
||||
@@ -1692,6 +1720,7 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "lib/readline.js",
|
||||
+ "lib/readline/promises.js",
|
||||
+ "lib/repl.js",
|
||||
+ "lib/sea.js",
|
||||
+ "lib/stream.js",
|
||||
+ "lib/stream/consumers.js",
|
||||
+ "lib/stream/promises.js",
|
||||
@@ -1748,12 +1777,14 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "src/connection_wrap.cc",
|
||||
+ "src/dataqueue/queue.cc",
|
||||
+ "src/debug_utils.cc",
|
||||
+ "src/embedded_data.cc",
|
||||
+ "src/encoding_binding.cc",
|
||||
+ "src/env.cc",
|
||||
+ "src/fs_event_wrap.cc",
|
||||
+ "src/handle_wrap.cc",
|
||||
+ "src/heap_utils.cc",
|
||||
+ "src/histogram.cc",
|
||||
+ "src/internal_only_v8.cc",
|
||||
+ "src/js_native_api.h",
|
||||
+ "src/js_native_api_types.h",
|
||||
+ "src/js_native_api_v8.cc",
|
||||
@@ -1817,10 +1848,12 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "src/node_watchdog.cc",
|
||||
+ "src/node_worker.cc",
|
||||
+ "src/node_zlib.cc",
|
||||
+ "src/path.cc",
|
||||
+ "src/permission/child_process_permission.cc",
|
||||
+ "src/permission/fs_permission.cc",
|
||||
+ "src/permission/inspector_permission.cc",
|
||||
+ "src/permission/permission.cc",
|
||||
+ "src/permission/wasi_permission.cc",
|
||||
+ "src/permission/worker_permission.cc",
|
||||
+ "src/pipe_wrap.cc",
|
||||
+ "src/process_wrap.cc",
|
||||
@@ -1865,6 +1898,7 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "src/dataqueue/queue.h",
|
||||
+ "src/debug_utils.h",
|
||||
+ "src/debug_utils-inl.h",
|
||||
+ "src/embeded_data.h",
|
||||
+ "src/encoding_binding.h",
|
||||
+ "src/env_properties.h",
|
||||
+ "src/env.h",
|
||||
@@ -1936,10 +1970,12 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ "src/node_wasi.h",
|
||||
+ "src/node_watchdog.h",
|
||||
+ "src/node_worker.h",
|
||||
+ "src/path.h",
|
||||
+ "src/permission/child_process_permission.h",
|
||||
+ "src/permission/fs_permission.h",
|
||||
+ "src/permission/inspector_permission.h",
|
||||
+ "src/permission/permission.h",
|
||||
+ "src/permission/wasi_permission.h",
|
||||
+ "src/permission/worker_permission.h",
|
||||
+ "src/pipe_wrap.h",
|
||||
+ "src/req_wrap.h",
|
||||
@@ -1972,10 +2008,10 @@ index 0000000000000000000000000000000000000000..4404338bb5d576b341cae3bf79c84334
|
||||
+ ]
|
||||
+}
|
||||
diff --git a/src/inspector/BUILD.gn b/src/inspector/BUILD.gn
|
||||
index 909fd14345fcd988c381e640280f4b33f2e0c351..cb0e4558436ab7a109cadf439d49413b0f569a5a 100644
|
||||
index 909fd14345fcd988c381e640280f4b33f2e0c351..800431e6659f95f0495cb90b8fa2cccbc9f34661 100644
|
||||
--- a/src/inspector/BUILD.gn
|
||||
+++ b/src/inspector/BUILD.gn
|
||||
@@ -1,14 +1,203 @@
|
||||
@@ -1,14 +1,202 @@
|
||||
-##############################################################################
|
||||
-# #
|
||||
-# DO NOT EDIT THIS FILE! #
|
||||
@@ -2068,7 +2104,6 @@ index 909fd14345fcd988c381e640280f4b33f2e0c351..cb0e4558436ab7a109cadf439d49413b
|
||||
+ "$inspector_protocol_dir/lib/base_string_adapter_cc.template",
|
||||
+ "$inspector_protocol_dir/lib/base_string_adapter_h.template",
|
||||
+ "$inspector_protocol_dir/lib/Allocator_h.template",
|
||||
+ "$inspector_protocol_dir/lib/Array_h.template",
|
||||
+ "$inspector_protocol_dir/lib/DispatcherBase_cpp.template",
|
||||
+ "$inspector_protocol_dir/lib/DispatcherBase_h.template",
|
||||
+ "$inspector_protocol_dir/lib/ErrorSupport_cpp.template",
|
||||
@@ -2190,10 +2225,10 @@ index 909fd14345fcd988c381e640280f4b33f2e0c351..cb0e4558436ab7a109cadf439d49413b
|
||||
+ args = rebase_path(inputs + outputs, root_build_dir)
|
||||
}
|
||||
diff --git a/src/node_builtins.cc b/src/node_builtins.cc
|
||||
index bafd8d4b8581f0aee6cb1f30b810c8dfc46c2ce9..453d874efff767a95ef25fad7005ac11717f0c67 100644
|
||||
index bbb63df7899d4b9bf80e13eee78453352dd5c75b..804296db12f7864f72648f5f36834a924503e4a6 100644
|
||||
--- a/src/node_builtins.cc
|
||||
+++ b/src/node_builtins.cc
|
||||
@@ -739,6 +739,7 @@ void BuiltinLoader::RegisterExternalReferences(
|
||||
@@ -765,6 +765,7 @@ void BuiltinLoader::RegisterExternalReferences(
|
||||
registry->Register(GetNatives);
|
||||
|
||||
RegisterExternalReferencesForInternalizedBuiltinCode(registry);
|
||||
@@ -2202,7 +2237,7 @@ index bafd8d4b8581f0aee6cb1f30b810c8dfc46c2ce9..453d874efff767a95ef25fad7005ac11
|
||||
|
||||
} // namespace builtins
|
||||
diff --git a/src/node_builtins.h b/src/node_builtins.h
|
||||
index 9f2fbc1e53937448aa27c1f5fe110eabc7edc0df..ea77c7598153bb8a9ba20c89a4ece2c1580b9a25 100644
|
||||
index 75a7f3dd89e096d13ad7d70ed29d301cd56315b5..9a20a275fbe5df9f384b7b1d1d26806e7cd05384 100644
|
||||
--- a/src/node_builtins.h
|
||||
+++ b/src/node_builtins.h
|
||||
@@ -74,6 +74,8 @@ using BuiltinCodeCacheMap =
|
||||
@@ -2336,229 +2371,25 @@ index 0000000000000000000000000000000000000000..a6cdf33f2c0bcca4d7b4eacaa407f1ac
|
||||
+ transformed_f.write(transformed_contents)
|
||||
+
|
||||
diff --git a/tools/install.py b/tools/install.py
|
||||
index 11616e1bcac5308020eb68fdb811bfb86cb14dd5..74b01f8352021f1105c080dbbf8bb29121a13501 100755
|
||||
index b132c7bf26c02886a7ab341a1973bf449744ba0f..912a10c1edd76b1ed9ccfd446059c03a8ca712af 100755
|
||||
--- a/tools/install.py
|
||||
+++ b/tools/install.py
|
||||
@@ -199,105 +199,108 @@ def headers(action):
|
||||
v8_headers = [
|
||||
# The internal cppgc headers are depended on by the public
|
||||
# ones, so they need to be included as well.
|
||||
- 'deps/v8/include/cppgc/internal/api-constants.h',
|
||||
- 'deps/v8/include/cppgc/internal/atomic-entry-flag.h',
|
||||
- 'deps/v8/include/cppgc/internal/base-page-handle.h',
|
||||
- 'deps/v8/include/cppgc/internal/caged-heap-local-data.h',
|
||||
- 'deps/v8/include/cppgc/internal/caged-heap.h',
|
||||
- 'deps/v8/include/cppgc/internal/compiler-specific.h',
|
||||
- 'deps/v8/include/cppgc/internal/finalizer-trait.h',
|
||||
- 'deps/v8/include/cppgc/internal/gc-info.h',
|
||||
- 'deps/v8/include/cppgc/internal/logging.h',
|
||||
- 'deps/v8/include/cppgc/internal/member-storage.h',
|
||||
- 'deps/v8/include/cppgc/internal/name-trait.h',
|
||||
- 'deps/v8/include/cppgc/internal/persistent-node.h',
|
||||
- 'deps/v8/include/cppgc/internal/pointer-policies.h',
|
||||
- 'deps/v8/include/cppgc/internal/write-barrier.h',
|
||||
+ '../../v8/include/cppgc/internal/api-constants.h',
|
||||
+ '../../v8/include/cppgc/internal/atomic-entry-flag.h',
|
||||
+ '../../v8/include/cppgc/internal/base-page-handle.h',
|
||||
+ '../../v8/include/cppgc/internal/caged-heap-local-data.h',
|
||||
+ '../../v8/include/cppgc/internal/caged-heap.h',
|
||||
+ '../../v8/include/cppgc/internal/compiler-specific.h',
|
||||
+ '../../v8/include/cppgc/internal/finalizer-trait.h',
|
||||
+ '../../v8/include/cppgc/internal/gc-info.h',
|
||||
+ '../../v8/include/cppgc/internal/logging.h',
|
||||
+ '../../v8/include/cppgc/internal/member-storage.h',
|
||||
+ '../../v8/include/cppgc/internal/name-trait.h',
|
||||
+ '../../v8/include/cppgc/internal/persistent-node.h',
|
||||
+ '../../v8/include/cppgc/internal/pointer-policies.h',
|
||||
+ '../../v8/include/cppgc/internal/write-barrier.h',
|
||||
# cppgc headers
|
||||
- 'deps/v8/include/cppgc/allocation.h',
|
||||
- 'deps/v8/include/cppgc/common.h',
|
||||
- 'deps/v8/include/cppgc/cross-thread-persistent.h',
|
||||
- 'deps/v8/include/cppgc/custom-space.h',
|
||||
- 'deps/v8/include/cppgc/default-platform.h',
|
||||
- 'deps/v8/include/cppgc/ephemeron-pair.h',
|
||||
- 'deps/v8/include/cppgc/explicit-management.h',
|
||||
- 'deps/v8/include/cppgc/garbage-collected.h',
|
||||
- 'deps/v8/include/cppgc/heap-consistency.h',
|
||||
- 'deps/v8/include/cppgc/heap-handle.h',
|
||||
- 'deps/v8/include/cppgc/heap-state.h',
|
||||
- 'deps/v8/include/cppgc/heap-statistics.h',
|
||||
- 'deps/v8/include/cppgc/heap.h',
|
||||
- 'deps/v8/include/cppgc/liveness-broker.h',
|
||||
- 'deps/v8/include/cppgc/macros.h',
|
||||
- 'deps/v8/include/cppgc/member.h',
|
||||
- 'deps/v8/include/cppgc/name-provider.h',
|
||||
- 'deps/v8/include/cppgc/object-size-trait.h',
|
||||
- 'deps/v8/include/cppgc/persistent.h',
|
||||
- 'deps/v8/include/cppgc/platform.h',
|
||||
- 'deps/v8/include/cppgc/prefinalizer.h',
|
||||
- 'deps/v8/include/cppgc/process-heap-statistics.h',
|
||||
- 'deps/v8/include/cppgc/sentinel-pointer.h',
|
||||
- 'deps/v8/include/cppgc/source-location.h',
|
||||
- 'deps/v8/include/cppgc/testing.h',
|
||||
- 'deps/v8/include/cppgc/trace-trait.h',
|
||||
- 'deps/v8/include/cppgc/type-traits.h',
|
||||
- 'deps/v8/include/cppgc/visitor.h',
|
||||
+ '../../v8/include/cppgc/allocation.h',
|
||||
+ '../../v8/include/cppgc/common.h',
|
||||
+ '../../v8/include/cppgc/cross-thread-persistent.h',
|
||||
+ '../../v8/include/cppgc/custom-space.h',
|
||||
+ '../../v8/include/cppgc/default-platform.h',
|
||||
+ '../../v8/include/cppgc/ephemeron-pair.h',
|
||||
+ '../../v8/include/cppgc/explicit-management.h',
|
||||
+ '../../v8/include/cppgc/garbage-collected.h',
|
||||
+ '../../v8/include/cppgc/heap-consistency.h',
|
||||
+ '../../v8/include/cppgc/heap-handle.h',
|
||||
+ '../../v8/include/cppgc/heap-state.h',
|
||||
+ '../../v8/include/cppgc/heap-statistics.h',
|
||||
+ '../../v8/include/cppgc/heap.h',
|
||||
+ '../../v8/include/cppgc/liveness-broker.h',
|
||||
+ '../../v8/include/cppgc/macros.h',
|
||||
+ '../../v8/include/cppgc/member.h',
|
||||
+ '../../v8/include/cppgc/name-provider.h',
|
||||
+ '../../v8/include/cppgc/object-size-trait.h',
|
||||
+ '../../v8/include/cppgc/persistent.h',
|
||||
+ '../../v8/include/cppgc/platform.h',
|
||||
+ '../../v8/include/cppgc/prefinalizer.h',
|
||||
+ '../../v8/include/cppgc/process-heap-statistics.h',
|
||||
+ '../../v8/include/cppgc/sentinel-pointer.h',
|
||||
+ '../../v8/include/cppgc/source-location.h',
|
||||
+ '../../v8/include/cppgc/testing.h',
|
||||
+ '../../v8/include/cppgc/trace-trait.h',
|
||||
+ '../../v8/include/cppgc/type-traits.h',
|
||||
+ '../../v8/include/cppgc/visitor.h',
|
||||
# libplatform headers
|
||||
- 'deps/v8/include/libplatform/libplatform-export.h',
|
||||
- 'deps/v8/include/libplatform/libplatform.h',
|
||||
- 'deps/v8/include/libplatform/v8-tracing.h',
|
||||
+ '../../v8/include/libplatform/libplatform-export.h',
|
||||
+ '../../v8/include/libplatform/libplatform.h',
|
||||
+ '../../v8/include/libplatform/v8-tracing.h',
|
||||
# v8 headers
|
||||
- 'deps/v8/include/v8-array-buffer.h',
|
||||
- 'deps/v8/include/v8-callbacks.h',
|
||||
- 'deps/v8/include/v8-container.h',
|
||||
- 'deps/v8/include/v8-context.h',
|
||||
- 'deps/v8/include/v8-cppgc.h',
|
||||
- 'deps/v8/include/v8-data.h',
|
||||
- 'deps/v8/include/v8-date.h',
|
||||
- 'deps/v8/include/v8-debug.h',
|
||||
- 'deps/v8/include/v8-embedder-heap.h',
|
||||
- 'deps/v8/include/v8-embedder-state-scope.h',
|
||||
- 'deps/v8/include/v8-exception.h',
|
||||
- 'deps/v8/include/v8-extension.h',
|
||||
- 'deps/v8/include/v8-external.h',
|
||||
- 'deps/v8/include/v8-forward.h',
|
||||
- 'deps/v8/include/v8-function-callback.h',
|
||||
- 'deps/v8/include/v8-function.h',
|
||||
- 'deps/v8/include/v8-initialization.h',
|
||||
- 'deps/v8/include/v8-internal.h',
|
||||
- 'deps/v8/include/v8-isolate.h',
|
||||
- 'deps/v8/include/v8-json.h',
|
||||
- 'deps/v8/include/v8-local-handle.h',
|
||||
- 'deps/v8/include/v8-locker.h',
|
||||
- 'deps/v8/include/v8-maybe.h',
|
||||
- 'deps/v8/include/v8-memory-span.h',
|
||||
- 'deps/v8/include/v8-message.h',
|
||||
- 'deps/v8/include/v8-microtask-queue.h',
|
||||
- 'deps/v8/include/v8-microtask.h',
|
||||
- 'deps/v8/include/v8-object.h',
|
||||
- 'deps/v8/include/v8-persistent-handle.h',
|
||||
- 'deps/v8/include/v8-platform.h',
|
||||
- 'deps/v8/include/v8-primitive-object.h',
|
||||
- 'deps/v8/include/v8-primitive.h',
|
||||
- 'deps/v8/include/v8-profiler.h',
|
||||
- 'deps/v8/include/v8-promise.h',
|
||||
- 'deps/v8/include/v8-proxy.h',
|
||||
- 'deps/v8/include/v8-regexp.h',
|
||||
- 'deps/v8/include/v8-script.h',
|
||||
- 'deps/v8/include/v8-snapshot.h',
|
||||
- 'deps/v8/include/v8-statistics.h',
|
||||
- 'deps/v8/include/v8-template.h',
|
||||
- 'deps/v8/include/v8-traced-handle.h',
|
||||
- 'deps/v8/include/v8-typed-array.h',
|
||||
- 'deps/v8/include/v8-unwinder.h',
|
||||
- 'deps/v8/include/v8-value-serializer.h',
|
||||
- 'deps/v8/include/v8-value.h',
|
||||
- 'deps/v8/include/v8-version.h',
|
||||
- 'deps/v8/include/v8-wasm.h',
|
||||
- 'deps/v8/include/v8-weak-callback-info.h',
|
||||
- 'deps/v8/include/v8.h',
|
||||
- 'deps/v8/include/v8config.h',
|
||||
+ '../../v8/include/v8-array-buffer.h',
|
||||
+ '../../v8/include/v8-callbacks.h',
|
||||
+ '../../v8/include/v8-container.h',
|
||||
+ '../../v8/include/v8-context.h',
|
||||
+ '../../v8/include/v8-cppgc.h',
|
||||
+ '../../v8/include/v8-data.h',
|
||||
+ '../../v8/include/v8-date.h',
|
||||
+ '../../v8/include/v8-debug.h',
|
||||
+ '../../v8/include/v8-embedder-heap.h',
|
||||
+ '../../v8/include/v8-embedder-state-scope.h',
|
||||
+ '../../v8/include/v8-exception.h',
|
||||
+ '../../v8/include/v8-extension.h',
|
||||
+ '../../v8/include/v8-external.h',
|
||||
+ '../../v8/include/v8-forward.h',
|
||||
+ '../../v8/include/v8-function-callback.h',
|
||||
+ '../../v8/include/v8-function.h',
|
||||
+ '../../v8/include/v8-handle-base.h',
|
||||
+ '../../v8/include/v8-initialization.h',
|
||||
+ '../../v8/include/v8-internal.h',
|
||||
+ '../../v8/include/v8-isolate.h',
|
||||
+ '../../v8/include/v8-json.h',
|
||||
+ '../../v8/include/v8-local-handle.h',
|
||||
+ '../../v8/include/v8-locker.h',
|
||||
+ '../../v8/include/v8-maybe.h',
|
||||
+ '../../v8/include/v8-memory-span.h',
|
||||
+ '../../v8/include/v8-message.h',
|
||||
+ '../../v8/include/v8-microtask-queue.h',
|
||||
+ '../../v8/include/v8-microtask.h',
|
||||
+ '../../v8/include/v8-object.h',
|
||||
+ '../../v8/include/v8-persistent-handle.h',
|
||||
+ '../../v8/include/v8-platform.h',
|
||||
+ '../../v8/include/v8-primitive-object.h',
|
||||
+ '../../v8/include/v8-primitive.h',
|
||||
+ '../../v8/include/v8-profiler.h',
|
||||
+ '../../v8/include/v8-promise.h',
|
||||
+ '../../v8/include/v8-proxy.h',
|
||||
+ '../../v8/include/v8-regexp.h',
|
||||
+ '../../v8/include/v8-script.h',
|
||||
+ '../../v8/include/v8-snapshot.h',
|
||||
+ '../../v8/include/v8-source-location.h',
|
||||
+ '../../v8/include/v8-statistics.h',
|
||||
+ '../../v8/include/v8-template.h',
|
||||
+ '../../v8/include/v8-traced-handle.h',
|
||||
+ '../../v8/include/v8-typed-array.h',
|
||||
+ '../../v8/include/v8-unwinder.h',
|
||||
+ '../../v8/include/v8-value-serializer.h',
|
||||
+ '../../v8/include/v8-value.h',
|
||||
+ '../../v8/include/v8-version.h',
|
||||
+ '../../v8/include/v8-wasm.h',
|
||||
+ '../../v8/include/v8-weak-callback-info.h',
|
||||
+ '../../v8/include/v8.h',
|
||||
+ '../../v8/include/v8config.h',
|
||||
]
|
||||
+ v8_headers = [h.replace('deps/', '../../') for h in v8_headers]
|
||||
files_arg = [name for name in files_arg if name in v8_headers]
|
||||
action(files_arg, dest)
|
||||
|
||||
@@ -324,7 +327,7 @@ def headers(action):
|
||||
if sys.platform.startswith('aix') or sys.platform == "os400":
|
||||
action(['out/Release/node.exp'], 'include/node/')
|
||||
|
||||
- subdir_files('deps/v8/include', 'include/node/', wanted_v8_headers)
|
||||
+ subdir_files('../../v8/include', 'include/node/', wanted_v8_headers)
|
||||
|
||||
if 'false' == variables.get('node_shared_libuv'):
|
||||
subdir_files('deps/uv/include', 'include/node/', action)
|
||||
@@ -390,7 +390,7 @@ def parse_options(args):
|
||||
parser.add_argument('--build-dir', help='the location of built binaries',
|
||||
default='out/Release')
|
||||
parser.add_argument('--v8-dir', help='the location of V8',
|
||||
- default='deps/v8')
|
||||
+ default='../../v8')
|
||||
parser.add_argument('--config-gypi-path', help='the location of config.gypi',
|
||||
default='config.gypi')
|
||||
parser.add_argument('--is-win', help='build for Windows target',
|
||||
diff --git a/tools/js2c.cc b/tools/js2c.cc
|
||||
old mode 100644
|
||||
new mode 100755
|
||||
index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26721d1413
|
||||
index e0f3d8844718ab8a6478c40ff713c1fd6bcff95a..c73a5b666dbaf555c749d836c20a7ae19a840847
|
||||
--- a/tools/js2c.cc
|
||||
+++ b/tools/js2c.cc
|
||||
@@ -29,6 +29,7 @@ namespace js2c {
|
||||
@@ -30,6 +30,7 @@ namespace js2c {
|
||||
int Main(int argc, char* argv[]);
|
||||
|
||||
static bool is_verbose = false;
|
||||
@@ -2566,7 +2397,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
|
||||
void Debug(const char* format, ...) {
|
||||
va_list arguments;
|
||||
@@ -195,6 +196,7 @@ const char* kTemplate = R"(
|
||||
@@ -196,6 +197,7 @@ const char* kTemplate = R"(
|
||||
#include "node_builtins.h"
|
||||
#include "node_external_reference.h"
|
||||
#include "node_internals.h"
|
||||
@@ -2574,7 +2405,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
|
||||
namespace node {
|
||||
|
||||
@@ -210,7 +212,11 @@ const ThreadsafeCopyOnWrite<BuiltinSourceMap> global_source_map {
|
||||
@@ -211,7 +213,11 @@ const ThreadsafeCopyOnWrite<BuiltinSourceMap> global_source_map {
|
||||
} // anonymous namespace
|
||||
|
||||
void BuiltinLoader::LoadJavaScriptSource() {
|
||||
@@ -2587,7 +2418,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
}
|
||||
|
||||
void RegisterExternalReferencesForInternalizedBuiltinCode(
|
||||
@@ -227,6 +233,45 @@ UnionBytes BuiltinLoader::GetConfig() {
|
||||
@@ -228,6 +234,45 @@ UnionBytes BuiltinLoader::GetConfig() {
|
||||
} // namespace node
|
||||
)";
|
||||
|
||||
@@ -2633,7 +2464,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
Fragment Format(const Fragments& definitions,
|
||||
const Fragments& initializers,
|
||||
const Fragments& registrations) {
|
||||
@@ -236,13 +281,12 @@ Fragment Format(const Fragments& definitions,
|
||||
@@ -237,13 +282,12 @@ Fragment Format(const Fragments& definitions,
|
||||
size_t init_size = init_buf.size();
|
||||
std::vector<char> reg_buf = Join(registrations, "\n");
|
||||
size_t reg_size = reg_buf.size();
|
||||
@@ -2650,7 +2481,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
static_cast<int>(def_buf.size()),
|
||||
def_buf.data(),
|
||||
static_cast<int>(init_buf.size()),
|
||||
@@ -711,12 +755,15 @@ int JS2C(const FileList& js_files,
|
||||
@@ -834,12 +878,15 @@ int JS2C(const FileList& js_files,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2666,7 +2497,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
Fragment out = Format(definitions, initializers, registrations);
|
||||
return WriteIfChanged(out, dest);
|
||||
}
|
||||
@@ -742,6 +789,8 @@ int Main(int argc, char* argv[]) {
|
||||
@@ -865,6 +912,8 @@ int Main(int argc, char* argv[]) {
|
||||
std::string arg(argv[i]);
|
||||
if (arg == "--verbose") {
|
||||
is_verbose = true;
|
||||
@@ -2675,7 +2506,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
} else if (arg == "--root") {
|
||||
if (i == argc - 1) {
|
||||
fprintf(stderr, "--root must be followed by a path\n");
|
||||
@@ -790,6 +839,14 @@ int Main(int argc, char* argv[]) {
|
||||
@@ -913,6 +962,14 @@ int Main(int argc, char* argv[]) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2690,7 +2521,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
// Should have exactly 3 types: `.js`, `.mjs` and `.gypi`.
|
||||
assert(file_map.size() == 3);
|
||||
auto gypi_it = file_map.find(".gypi");
|
||||
@@ -809,6 +866,7 @@ int Main(int argc, char* argv[]) {
|
||||
@@ -932,6 +989,7 @@ int Main(int argc, char* argv[]) {
|
||||
std::sort(mjs_it->second.begin(), mjs_it->second.end());
|
||||
|
||||
return JS2C(js_it->second, mjs_it->second, gypi_it->second[0], output);
|
||||
@@ -2698,7 +2529,7 @@ index 904fb6fa44d4f56fb67476e937edcbb797d78fe7..129cd4b2c12b58464fbab8355afa0c26
|
||||
}
|
||||
} // namespace js2c
|
||||
} // namespace node
|
||||
@@ -817,4 +875,4 @@ NODE_MAIN(int argc, node::argv_type raw_argv[]) {
|
||||
@@ -940,4 +998,4 @@ NODE_MAIN(int argc, node::argv_type raw_argv[]) {
|
||||
char** argv;
|
||||
node::FixupMain(argc, raw_argv, &argv);
|
||||
return node::js2c::Main(argc, argv);
|
||||
|
||||
@@ -1,171 +0,0 @@
|
||||
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||
From: Cheng Zhao <zcbenz@gmail.com>
|
||||
Date: Fri, 12 Jan 2024 08:46:57 +0900
|
||||
Subject: build: do not rely on gn_helpers in GN build
|
||||
|
||||
Backport https://github.com/nodejs/node/pull/51439
|
||||
|
||||
diff --git a/deps/ngtcp2/unofficial.gni b/deps/ngtcp2/unofficial.gni
|
||||
index a304cf4aded42d27a1656be36f2d9e1e2b1818c9..838f5d2402cfd6265f913fa1afa57c1c14ed6eca 100644
|
||||
--- a/deps/ngtcp2/unofficial.gni
|
||||
+++ b/deps/ngtcp2/unofficial.gni
|
||||
@@ -7,7 +7,7 @@
|
||||
# building official binaries.
|
||||
# Please edit the gyp files if you are making changes to build system.
|
||||
|
||||
-import("//node/node.gni")
|
||||
+import("../../node.gni")
|
||||
|
||||
# The actual configurations are put inside a template in unofficial.gni to
|
||||
# prevent accidental edits from contributors.
|
||||
diff --git a/tools/gypi_to_gn.py b/tools/gypi_to_gn.py
|
||||
index 47182d8017bfc2e4c156d43a868eaa3df15ed3e2..8a094bd7cf844f880d20a9015e76eefe350af592 100755
|
||||
--- a/tools/gypi_to_gn.py
|
||||
+++ b/tools/gypi_to_gn.py
|
||||
@@ -77,29 +77,119 @@ the input will be replaced with "bar":
|
||||
from __future__ import absolute_import
|
||||
from __future__ import print_function
|
||||
from optparse import OptionParser
|
||||
-import os
|
||||
import sys
|
||||
|
||||
|
||||
-# Look for standalone GN distribution.
|
||||
-def FindGNPath():
|
||||
- for i in os.environ['PATH'].split(os.pathsep):
|
||||
- if i.rstrip(os.sep).endswith('gn'):
|
||||
- return i
|
||||
- return None
|
||||
+# This function is copied from build/gn_helpers.py in Chromium.
|
||||
+def ToGNString(value, pretty=False):
|
||||
+ """Returns a stringified GN equivalent of a Python value.
|
||||
|
||||
+ Args:
|
||||
+ value: The Python value to convert.
|
||||
+ pretty: Whether to pretty print. If true, then non-empty lists are rendered
|
||||
+ recursively with one item per line, with indents. Otherwise lists are
|
||||
+ rendered without new line.
|
||||
+ Returns:
|
||||
+ The stringified GN equivalent to |value|.
|
||||
|
||||
-try:
|
||||
- # May already be in the import path.
|
||||
- import gn_helpers
|
||||
-except ImportError:
|
||||
- # Add src/build to import path.
|
||||
- src_dir = os.path.abspath(os.path.join(os.path.dirname(__file__),
|
||||
- os.pardir, os.pardir))
|
||||
- sys.path.append(os.path.join(src_dir, 'build'))
|
||||
- if FindGNPath():
|
||||
- sys.path.append(os.path.join(FindGNPath(), 'build'))
|
||||
- import gn_helpers
|
||||
+ Raises:
|
||||
+ ValueError: |value| cannot be printed to GN.
|
||||
+ """
|
||||
+
|
||||
+ # Emits all output tokens without intervening whitespaces.
|
||||
+ def GenerateTokens(v, level):
|
||||
+ if isinstance(v, str):
|
||||
+ yield '"' + ''.join(TranslateToGnChars(v)) + '"'
|
||||
+
|
||||
+ elif isinstance(v, bool):
|
||||
+ yield 'true' if v else 'false'
|
||||
+
|
||||
+ elif isinstance(v, int):
|
||||
+ yield str(v)
|
||||
+
|
||||
+ elif isinstance(v, list):
|
||||
+ yield '['
|
||||
+ for i, item in enumerate(v):
|
||||
+ if i > 0:
|
||||
+ yield ','
|
||||
+ for tok in GenerateTokens(item, level + 1):
|
||||
+ yield tok
|
||||
+ yield ']'
|
||||
+
|
||||
+ elif isinstance(v, dict):
|
||||
+ if level > 0:
|
||||
+ yield '{'
|
||||
+ for key in sorted(v):
|
||||
+ if not isinstance(key, str):
|
||||
+ raise ValueError('Dictionary key is not a string.')
|
||||
+ if not key or key[0].isdigit() or not key.replace('_', '').isalnum():
|
||||
+ raise ValueError('Dictionary key is not a valid GN identifier.')
|
||||
+ yield key # No quotations.
|
||||
+ yield '='
|
||||
+ for tok in GenerateTokens(v[key], level + 1):
|
||||
+ yield tok
|
||||
+ if level > 0:
|
||||
+ yield '}'
|
||||
+
|
||||
+ else: # Not supporting float: Add only when needed.
|
||||
+ raise ValueError('Unsupported type when printing to GN.')
|
||||
+
|
||||
+ can_start = lambda tok: tok and tok not in ',}]='
|
||||
+ can_end = lambda tok: tok and tok not in ',{[='
|
||||
+
|
||||
+ # Adds whitespaces, trying to keep everything (except dicts) in 1 line.
|
||||
+ def PlainGlue(gen):
|
||||
+ prev_tok = None
|
||||
+ for i, tok in enumerate(gen):
|
||||
+ if i > 0:
|
||||
+ if can_end(prev_tok) and can_start(tok):
|
||||
+ yield '\n' # New dict item.
|
||||
+ elif prev_tok == '[' and tok == ']':
|
||||
+ yield ' ' # Special case for [].
|
||||
+ elif tok != ',':
|
||||
+ yield ' '
|
||||
+ yield tok
|
||||
+ prev_tok = tok
|
||||
+
|
||||
+ # Adds whitespaces so non-empty lists can span multiple lines, with indent.
|
||||
+ def PrettyGlue(gen):
|
||||
+ prev_tok = None
|
||||
+ level = 0
|
||||
+ for i, tok in enumerate(gen):
|
||||
+ if i > 0:
|
||||
+ if can_end(prev_tok) and can_start(tok):
|
||||
+ yield '\n' + ' ' * level # New dict item.
|
||||
+ elif tok == '=' or prev_tok in '=':
|
||||
+ yield ' ' # Separator before and after '=', on same line.
|
||||
+ if tok in ']}':
|
||||
+ level -= 1
|
||||
+ # Exclude '[]' and '{}' cases.
|
||||
+ if int(prev_tok == '[') + int(tok == ']') == 1 or \
|
||||
+ int(prev_tok == '{') + int(tok == '}') == 1:
|
||||
+ yield '\n' + ' ' * level
|
||||
+ yield tok
|
||||
+ if tok in '[{':
|
||||
+ level += 1
|
||||
+ if tok == ',':
|
||||
+ yield '\n' + ' ' * level
|
||||
+ prev_tok = tok
|
||||
+
|
||||
+ token_gen = GenerateTokens(value, 0)
|
||||
+ ret = ''.join((PrettyGlue if pretty else PlainGlue)(token_gen))
|
||||
+ # Add terminating '\n' for dict |value| or multi-line output.
|
||||
+ if isinstance(value, dict) or '\n' in ret:
|
||||
+ return ret + '\n'
|
||||
+ return ret
|
||||
+
|
||||
+
|
||||
+def TranslateToGnChars(s):
|
||||
+ for code in s.encode('utf-8'):
|
||||
+ if code in (34, 36, 92): # For '"', '$', or '\\'.
|
||||
+ yield '\\' + chr(code)
|
||||
+ elif 32 <= code < 127:
|
||||
+ yield chr(code)
|
||||
+ else:
|
||||
+ yield '$0x%02X' % code
|
||||
|
||||
|
||||
def LoadPythonDictionary(path):
|
||||
@@ -209,7 +299,7 @@ def main():
|
||||
else:
|
||||
gn_dict[gn_key] = data[key]
|
||||
|
||||
- print(gn_helpers.ToGNString(DeduplicateLists(gn_dict)))
|
||||
+ print(ToGNString(DeduplicateLists(gn_dict)))
|
||||
|
||||
if __name__ == '__main__':
|
||||
try:
|
||||
@@ -7,10 +7,10 @@ Subject: build: ensure native module compilation fails if not using a new
|
||||
This should not be upstreamed, it is a quality-of-life patch for downstream module builders.
|
||||
|
||||
diff --git a/common.gypi b/common.gypi
|
||||
index f52d4f805406c513904151be90e433948764b3ad..7b790060b03cceec62bfe4c1f12d396b9cf52e8c 100644
|
||||
index 9a27610992612b59eadcc8e481683cf1e6a5dbb6..1fad20645d059ad5f3efaa9279f582f99cb1006b 100644
|
||||
--- a/common.gypi
|
||||
+++ b/common.gypi
|
||||
@@ -86,6 +86,8 @@
|
||||
@@ -87,6 +87,8 @@
|
||||
'v8_use_perfetto': 0,
|
||||
'tsan%': 0,
|
||||
|
||||
@@ -19,7 +19,7 @@ index f52d4f805406c513904151be90e433948764b3ad..7b790060b03cceec62bfe4c1f12d396b
|
||||
##### end V8 defaults #####
|
||||
|
||||
# When building native modules using 'npm install' with the system npm,
|
||||
@@ -285,6 +287,7 @@
|
||||
@@ -286,6 +288,7 @@
|
||||
# Defines these mostly for node-gyp to pickup.
|
||||
'defines': [
|
||||
'_GLIBCXX_USE_CXX11_ABI=1',
|
||||
@@ -27,7 +27,7 @@ index f52d4f805406c513904151be90e433948764b3ad..7b790060b03cceec62bfe4c1f12d396b
|
||||
],
|
||||
|
||||
# Forcibly disable -Werror. We support a wide range of compilers, it's
|
||||
@@ -391,6 +394,11 @@
|
||||
@@ -415,6 +418,11 @@
|
||||
}],
|
||||
],
|
||||
}],
|
||||
@@ -40,10 +40,10 @@ index f52d4f805406c513904151be90e433948764b3ad..7b790060b03cceec62bfe4c1f12d396b
|
||||
# list in v8/BUILD.gn.
|
||||
['v8_enable_v8_checks == 1', {
|
||||
diff --git a/configure.py b/configure.py
|
||||
index 84b016cd853080656d4dcf982e64855fcfa72a55..f0cccff0eed2ef11275d2f7ec2358276f6e10458 100755
|
||||
index f189ba2bf09fc248b3c1ce3c3535b939a4160ad2..2c24db93618f88f5f07e95a3edf63fb7942ac009 100755
|
||||
--- a/configure.py
|
||||
+++ b/configure.py
|
||||
@@ -1489,6 +1489,7 @@ def configure_library(lib, output, pkgname=None):
|
||||
@@ -1559,6 +1559,7 @@ def configure_library(lib, output, pkgname=None):
|
||||
|
||||
|
||||
def configure_v8(o):
|
||||
@@ -52,7 +52,7 @@ index 84b016cd853080656d4dcf982e64855fcfa72a55..f0cccff0eed2ef11275d2f7ec2358276
|
||||
o['variables']['v8_enable_javascript_promise_hooks'] = 1
|
||||
o['variables']['v8_enable_lite_mode'] = 1 if options.v8_lite_mode else 0
|
||||
diff --git a/src/node.h b/src/node.h
|
||||
index 868366f6d3e35d0fe543c89efd7d5e313a831a96..a512d2228e0afcfff765c3fe845e1f22073047d0 100644
|
||||
index c267ed1eeaa2d8b6ecd5a1563a4e9440bf0cca00..e55256996f2c85b0ae3854cbd1b83ca88a3e22cb 100644
|
||||
--- a/src/node.h
|
||||
+++ b/src/node.h
|
||||
@@ -22,6 +22,12 @@
|
||||
|
||||
@@ -10,10 +10,10 @@ in.
|
||||
This should be upstreamed.
|
||||
|
||||
diff --git a/common.gypi b/common.gypi
|
||||
index 7b790060b03cceec62bfe4c1f12d396b9cf52e8c..ef8c7a0477aa9c92439846699e739eae4340b88c 100644
|
||||
index 1fad20645d059ad5f3efaa9279f582f99cb1006b..4fbb33550e8a044b92997a42eb6603f151ba1043 100644
|
||||
--- a/common.gypi
|
||||
+++ b/common.gypi
|
||||
@@ -133,6 +133,7 @@
|
||||
@@ -134,6 +134,7 @@
|
||||
['target_arch in "arm ia32 mips mipsel ppc"', {
|
||||
'v8_enable_pointer_compression': 0,
|
||||
'v8_enable_31bit_smis_on_64bit_arch': 0,
|
||||
@@ -22,10 +22,10 @@ index 7b790060b03cceec62bfe4c1f12d396b9cf52e8c..ef8c7a0477aa9c92439846699e739eae
|
||||
['target_arch in "ppc64 s390x"', {
|
||||
'v8_enable_backtrace': 1,
|
||||
diff --git a/configure.py b/configure.py
|
||||
index f0cccff0eed2ef11275d2f7ec2358276f6e10458..87b647ab363219add8201966a64b539215bdee03 100755
|
||||
index 2c24db93618f88f5f07e95a3edf63fb7942ac009..4e6dc7378e4435b90246eb072379cea1bfdad09c 100755
|
||||
--- a/configure.py
|
||||
+++ b/configure.py
|
||||
@@ -1503,6 +1503,7 @@ def configure_v8(o):
|
||||
@@ -1573,6 +1573,7 @@ def configure_v8(o):
|
||||
o['variables']['v8_use_siphash'] = 0 if options.without_siphash else 1
|
||||
o['variables']['v8_enable_maglev'] = 1 if options.v8_enable_maglev else 0
|
||||
o['variables']['v8_enable_pointer_compression'] = 1 if options.enable_pointer_compression else 0
|
||||
|
||||
@@ -10,7 +10,7 @@ JS errors and ensures embedder JS is loaded via LoadEmbedderJavaScriptSource.
|
||||
That method is generated by our modifications to js2c.cc in the BUILD.gn patch
|
||||
|
||||
diff --git a/lib/internal/fs/watchers.js b/lib/internal/fs/watchers.js
|
||||
index 99212fa713bf3f767d4604906e41d9b279447239..4e32a274a63c8244ce3168d0c5cc56203cfe5473 100644
|
||||
index f5ecc15159f457cd0b8069c0427b7c758c916c4e..c9ce67391f321989b0af48159b4da3ab8ffc3e65 100644
|
||||
--- a/lib/internal/fs/watchers.js
|
||||
+++ b/lib/internal/fs/watchers.js
|
||||
@@ -292,12 +292,13 @@ function emitCloseNT(self) {
|
||||
@@ -34,7 +34,7 @@ index 99212fa713bf3f767d4604906e41d9b279447239..4e32a274a63c8244ce3168d0c5cc5620
|
||||
let kResistStopPropagation;
|
||||
|
||||
diff --git a/src/node_builtins.cc b/src/node_builtins.cc
|
||||
index 453d874efff767a95ef25fad7005ac11717f0c67..bcef04f980d1b1f010c5349ecbfca8080f39b308 100644
|
||||
index 804296db12f7864f72648f5f36834a924503e4a6..2cac503e92640a4683a4be6969f1ed40e42785a0 100644
|
||||
--- a/src/node_builtins.cc
|
||||
+++ b/src/node_builtins.cc
|
||||
@@ -35,6 +35,7 @@ using v8::Value;
|
||||
@@ -46,14 +46,14 @@ index 453d874efff767a95ef25fad7005ac11717f0c67..bcef04f980d1b1f010c5349ecbfca808
|
||||
AddExternalizedBuiltin(
|
||||
"internal/deps/cjs-module-lexer/lexer",
|
||||
diff --git a/src/node_builtins.h b/src/node_builtins.h
|
||||
index ea77c7598153bb8a9ba20c89a4ece2c1580b9a25..11d10f52b7c492bfae4bc58b39c20a693762a72d 100644
|
||||
index 9a20a275fbe5df9f384b7b1d1d26806e7cd05384..a1a9fe7d592f0d57b70dcee8c865b99d71248bf2 100644
|
||||
--- a/src/node_builtins.h
|
||||
+++ b/src/node_builtins.h
|
||||
@@ -126,6 +126,7 @@ class NODE_EXTERN_PRIVATE BuiltinLoader {
|
||||
@@ -132,6 +132,7 @@ class NODE_EXTERN_PRIVATE BuiltinLoader {
|
||||
|
||||
// Generated by tools/js2c.py as node_javascript.cc
|
||||
void LoadJavaScriptSource(); // Loads data into source_
|
||||
+ void LoadEmbedderJavaScriptSource(); // Loads embedder data into source_
|
||||
UnionBytes GetConfig(); // Return data for config.gypi
|
||||
|
||||
std::vector<std::string_view> GetBuiltinIds() const;
|
||||
struct BuiltinCategories {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user