mirror of
https://github.com/electron/electron.git
synced 2026-02-26 03:01:17 -05:00
Compare commits
353 Commits
refactor/a
...
v35.7.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ea17e8339f | ||
|
|
7b5d411819 | ||
|
|
def6203bb9 | ||
|
|
28d8ed037c | ||
|
|
ee8942dcbf | ||
|
|
0f934858ed | ||
|
|
d5ede72bc5 | ||
|
|
a5d68cebd3 | ||
|
|
f468c9a896 | ||
|
|
1ae9a36da9 | ||
|
|
a8562b0beb | ||
|
|
dbf9f04085 | ||
|
|
12be909cc0 | ||
|
|
c5c94822ce | ||
|
|
7efd6ff76e | ||
|
|
382e2740f5 | ||
|
|
9c5562d290 | ||
|
|
7807ac893c | ||
|
|
e6666f811e | ||
|
|
ff5b9a6680 | ||
|
|
eb6c475b5f | ||
|
|
ded238107f | ||
|
|
2d2e62feda | ||
|
|
64dfeb8a4d | ||
|
|
8ca091251f | ||
|
|
6b08d83af7 | ||
|
|
71233a4517 | ||
|
|
f370a19e36 | ||
|
|
a7fd8872bf | ||
|
|
7f5e6c54bc | ||
|
|
fadec9ac65 | ||
|
|
a8cdd60c88 | ||
|
|
6280172ee9 | ||
|
|
94f6e16871 | ||
|
|
5fde5696d0 | ||
|
|
73605f97ee | ||
|
|
72d3d359c3 | ||
|
|
0b026d261e | ||
|
|
0954ac7843 | ||
|
|
feab959781 | ||
|
|
282903e7b8 | ||
|
|
15d6344b6a | ||
|
|
fcb576566a | ||
|
|
64a07ffc3f | ||
|
|
720684c766 | ||
|
|
b626829f71 | ||
|
|
2fb93ed6cb | ||
|
|
45f84be0b8 | ||
|
|
2bf22b53f1 | ||
|
|
853392e0f0 | ||
|
|
2b96789b23 | ||
|
|
406f4eded6 | ||
|
|
535d9fb1c8 | ||
|
|
caf1c1faf2 | ||
|
|
ed71d0733e | ||
|
|
d03a12aef4 | ||
|
|
458fa5f421 | ||
|
|
f872b431fe | ||
|
|
af31ce0135 | ||
|
|
f9bcea3bfc | ||
|
|
b8e4d3650e | ||
|
|
24fcd14cdc | ||
|
|
dec69bb61b | ||
|
|
9f4e0b9343 | ||
|
|
b8712a35db | ||
|
|
db3b0e01c1 | ||
|
|
f87950a371 | ||
|
|
d341a523e5 | ||
|
|
a2b954c8f3 | ||
|
|
8696da7de8 | ||
|
|
8e0f91f93f | ||
|
|
5104001067 | ||
|
|
102457bbd5 | ||
|
|
0630744f5b | ||
|
|
00d6963afd | ||
|
|
cd871fd58c | ||
|
|
800640ea2d | ||
|
|
621c6b4148 | ||
|
|
ec4eafecae | ||
|
|
d091cb91ba | ||
|
|
8275aa98ca | ||
|
|
b27a5f1cde | ||
|
|
bdde668926 | ||
|
|
afee4a78f2 | ||
|
|
713165e406 | ||
|
|
d224d03e31 | ||
|
|
52a7c752e6 | ||
|
|
40624199eb | ||
|
|
6433847b09 | ||
|
|
8e5735e499 | ||
|
|
96db57f36f | ||
|
|
ffe6656d2f | ||
|
|
fbc175aa1f | ||
|
|
b123b07d87 | ||
|
|
d605b97f9a | ||
|
|
d2134f84e1 | ||
|
|
0f73bba452 | ||
|
|
ee54727582 | ||
|
|
f6f9e23fe2 | ||
|
|
6e56fed2cb | ||
|
|
3437927a78 | ||
|
|
1543089e2f | ||
|
|
dc9f6ecd54 | ||
|
|
6d07f541b1 | ||
|
|
0675686451 | ||
|
|
ee04cb9ebe | ||
|
|
592d0155f1 | ||
|
|
1d2107ebff | ||
|
|
3d535afc28 | ||
|
|
88a1448b31 | ||
|
|
b2e695c2e2 | ||
|
|
c438ed4790 | ||
|
|
b1fdf2a8c7 | ||
|
|
48a7d5d45b | ||
|
|
f2a27511b1 | ||
|
|
23035a587e | ||
|
|
f66c385080 | ||
|
|
323aca8822 | ||
|
|
abef5d6eed | ||
|
|
c6c4ace8ef | ||
|
|
f26645e9ab | ||
|
|
ef973971a3 | ||
|
|
17ef6b8885 | ||
|
|
a2f3d820cb | ||
|
|
7886cc3cd0 | ||
|
|
cbc150486c | ||
|
|
1ebad64192 | ||
|
|
1fe77cdcf2 | ||
|
|
446128bc14 | ||
|
|
e76f986aa9 | ||
|
|
b44892e27c | ||
|
|
bd134a7f78 | ||
|
|
12cae22e22 | ||
|
|
23bd5c3d98 | ||
|
|
785193e858 | ||
|
|
3e4810484a | ||
|
|
e4554f9536 | ||
|
|
69a38fa5aa | ||
|
|
55e25b437d | ||
|
|
6048985cc8 | ||
|
|
3277481681 | ||
|
|
3343975488 | ||
|
|
71150ffe56 | ||
|
|
8bca8d2b9d | ||
|
|
f3d7a9043d | ||
|
|
cf559d7c72 | ||
|
|
d025ab4995 | ||
|
|
a644c7029a | ||
|
|
13488d3c98 | ||
|
|
d0658ccc98 | ||
|
|
c95323051a | ||
|
|
ff0156e67b | ||
|
|
65f9f08187 | ||
|
|
15d2a7dc4c | ||
|
|
073df4e738 | ||
|
|
c3127249e4 | ||
|
|
a842911215 | ||
|
|
b51d9976d0 | ||
|
|
46d9bd8b4a | ||
|
|
f527b982b5 | ||
|
|
60427961a2 | ||
|
|
929cba26c2 | ||
|
|
94926b734c | ||
|
|
dc4233fd40 | ||
|
|
ac20d29095 | ||
|
|
2b4716253d | ||
|
|
39cbd0c27c | ||
|
|
cd5da1b933 | ||
|
|
3023f14bdd | ||
|
|
fe445869ca | ||
|
|
f9164968d6 | ||
|
|
e0014f507f | ||
|
|
44afb48112 | ||
|
|
6e112a8410 | ||
|
|
c6c67208d2 | ||
|
|
a3ba653bee | ||
|
|
7a950f09ae | ||
|
|
ac22aa932f | ||
|
|
d38c2d507e | ||
|
|
7d27b2c542 | ||
|
|
8a120b6b58 | ||
|
|
11c1e70384 | ||
|
|
0d9b7d8121 | ||
|
|
09ec28b150 | ||
|
|
a82f92e1d8 | ||
|
|
a2a3f7cf1c | ||
|
|
262beabdc6 | ||
|
|
37f876e3b5 | ||
|
|
628288f074 | ||
|
|
230ecf7e32 | ||
|
|
538cf9ade7 | ||
|
|
b13526ecd0 | ||
|
|
56f17662a5 | ||
|
|
69b80e02e7 | ||
|
|
a1d8676e9c | ||
|
|
998de7aa6c | ||
|
|
e3d95bb8a4 | ||
|
|
b257f3c660 | ||
|
|
0b37f8cced | ||
|
|
4b40bfeb01 | ||
|
|
a29490a4e8 | ||
|
|
56b79a3a91 | ||
|
|
4137488761 | ||
|
|
a6fe725dab | ||
|
|
5f48031c24 | ||
|
|
344b0ae3ad | ||
|
|
c2ba6b7a28 | ||
|
|
f3c4f0ecf6 | ||
|
|
7d207c7a3b | ||
|
|
4b184a89d1 | ||
|
|
73a99ea189 | ||
|
|
ae55fce5df | ||
|
|
7388188015 | ||
|
|
65a7dddd4a | ||
|
|
6bbe996f62 | ||
|
|
3ad43182eb | ||
|
|
11bdd8cf44 | ||
|
|
75cf1b08c3 | ||
|
|
c91ddf2609 | ||
|
|
02783dd1e0 | ||
|
|
11fad1b737 | ||
|
|
de6105dc50 | ||
|
|
385b84ad87 | ||
|
|
7a9b9cdf0b | ||
|
|
de4458ff5c | ||
|
|
dda60cd4ed | ||
|
|
a2aacd7f25 | ||
|
|
702fdac1c4 | ||
|
|
0b24418ca7 | ||
|
|
3da65aa53e | ||
|
|
079b2bbf97 | ||
|
|
5b15c348e9 | ||
|
|
10da0d694e | ||
|
|
463031b771 | ||
|
|
53d7bd6abd | ||
|
|
6eb4932c68 | ||
|
|
179fde9278 | ||
|
|
107b3f8580 | ||
|
|
d98d95b04f | ||
|
|
5874ec779c | ||
|
|
8505f7a73d | ||
|
|
fc288849db | ||
|
|
b6d61577aa | ||
|
|
260933601e | ||
|
|
18007f843e | ||
|
|
4417f74a5b | ||
|
|
8a200e0427 | ||
|
|
7a0abfd667 | ||
|
|
255e4e22e4 | ||
|
|
c32fcdfede | ||
|
|
a9c535d900 | ||
|
|
aa584714cd | ||
|
|
24bc99cc2f | ||
|
|
248104ece6 | ||
|
|
0a543f389d | ||
|
|
768daef27b | ||
|
|
8e32d80512 | ||
|
|
4c81971213 | ||
|
|
2da02ec9bc | ||
|
|
05b57a2f07 | ||
|
|
4cb9c44d97 | ||
|
|
51babe4592 | ||
|
|
4015b8c48e | ||
|
|
671178cfdb | ||
|
|
3a65cfe339 | ||
|
|
8934eb1af5 | ||
|
|
02b85f1e6d | ||
|
|
5a641e02ee | ||
|
|
d291fa6ced | ||
|
|
f29559e46c | ||
|
|
3ad2989862 | ||
|
|
8ea1f5b604 | ||
|
|
b63be7b5c7 | ||
|
|
11d1f063bd | ||
|
|
eb456ec5cd | ||
|
|
c92a02ea17 | ||
|
|
74c71dbb2d | ||
|
|
497849bf66 | ||
|
|
277a80da98 | ||
|
|
fc6a602929 | ||
|
|
bdab736f08 | ||
|
|
3c6e75e22d | ||
|
|
9a7f27d845 | ||
|
|
b2b59a6c0b | ||
|
|
b6884b5c50 | ||
|
|
fa0da6f19f | ||
|
|
cf85d2d7c1 | ||
|
|
bc163a5ea8 | ||
|
|
b52917c380 | ||
|
|
cd1186a116 | ||
|
|
f1176be749 | ||
|
|
aacbdaf4ec | ||
|
|
5b90ce2290 | ||
|
|
8fb9fd97df | ||
|
|
107c0c6c6e | ||
|
|
bca80f19e0 | ||
|
|
66eb15d093 | ||
|
|
a1b846c9e5 | ||
|
|
71d3a86d32 | ||
|
|
452d891be5 | ||
|
|
fc697735c4 | ||
|
|
acfe4766d2 | ||
|
|
763d978765 | ||
|
|
2bce515091 | ||
|
|
e15ba780c4 | ||
|
|
713d32fccc | ||
|
|
3b421ef77f | ||
|
|
9d9d1afb2e | ||
|
|
984b8f9b1b | ||
|
|
cb7eb6fe3d | ||
|
|
f1d8e03ef8 | ||
|
|
637313c2f3 | ||
|
|
20941efeb5 | ||
|
|
7373bde546 | ||
|
|
acfc32f534 | ||
|
|
eaa28375d9 | ||
|
|
f40fc49461 | ||
|
|
a07de0099c | ||
|
|
46c9ed61da | ||
|
|
51170c3652 | ||
|
|
5be655585d | ||
|
|
04e37266c4 | ||
|
|
b0b7c8f540 | ||
|
|
49078100f4 | ||
|
|
599030ea08 | ||
|
|
07bdef0370 | ||
|
|
cc6164fe27 | ||
|
|
59e4794ff5 | ||
|
|
fa03b92f7e | ||
|
|
9d696ceffe | ||
|
|
e9b3e4cc91 | ||
|
|
895bc51272 | ||
|
|
ef1ad85082 | ||
|
|
e99328a45e | ||
|
|
04f5fe6a1c | ||
|
|
08b6bb1712 | ||
|
|
813efbcdf7 | ||
|
|
d34fa2e301 | ||
|
|
724744af16 | ||
|
|
91bb748eaa | ||
|
|
d77c2d75ed | ||
|
|
f4c3eb4391 | ||
|
|
9aca9e9fb6 | ||
|
|
e0fa647601 | ||
|
|
6b0fd02c0a | ||
|
|
1017ac821f | ||
|
|
91b53b633a | ||
|
|
8da9572592 | ||
|
|
291bbff5d8 | ||
|
|
d704a3fc5b | ||
|
|
fb70b81ee6 | ||
|
|
97fa059e1f | ||
|
|
8a64cdc0b1 |
@@ -2,7 +2,7 @@ version: '3'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
buildtools:
|
buildtools:
|
||||||
image: ghcr.io/electron/devcontainer:77262e58c37631ab082482f42c33cdf68c6c394b
|
image: ghcr.io/electron/devcontainer:424eedbf277ad9749ffa9219068aa72ed4a5e373
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- ..:/workspaces/gclient/src/electron:cached
|
- ..:/workspaces/gclient/src/electron:cached
|
||||||
|
|||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -13,7 +13,7 @@ Contributors guide: https://github.com/electron/electron/blob/main/CONTRIBUTING.
|
|||||||
- [ ] PR description included and stakeholders cc'd
|
- [ ] PR description included and stakeholders cc'd
|
||||||
- [ ] `npm test` passes
|
- [ ] `npm test` passes
|
||||||
- [ ] tests are [changed or added](https://github.com/electron/electron/blob/main/docs/development/testing.md)
|
- [ ] tests are [changed or added](https://github.com/electron/electron/blob/main/docs/development/testing.md)
|
||||||
- [ ] relevant documentation, tutorials, templates and examples are changed or added
|
- [ ] relevant API documentation, tutorials, and examples are updated and follow the [documentation style guide](https://github.com/electron/electron/blob/main/docs/development/style-guide.md)
|
||||||
- [ ] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).
|
- [ ] [PR release notes](https://github.com/electron/clerk/blob/main/README.md) describe the change in a way relevant to app developers, and are [capitalized, punctuated, and past tense](https://github.com/electron/clerk/blob/main/README.md#examples).
|
||||||
|
|
||||||
#### Release Notes
|
#### Release Notes
|
||||||
|
|||||||
37
.github/actions/build-electron/action.yml
vendored
37
.github/actions/build-electron/action.yml
vendored
@@ -38,6 +38,15 @@ runs:
|
|||||||
run: |
|
run: |
|
||||||
GN_APPENDED_ARGS="$GN_EXTRA_ARGS target_cpu=\"x64\" v8_snapshot_toolchain=\"//build/toolchain/mac:clang_x64\""
|
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
|
echo "GN_EXTRA_ARGS=$GN_APPENDED_ARGS" >> $GITHUB_ENV
|
||||||
|
- name: Set GN_EXTRA_ARGS for Windows
|
||||||
|
shell: bash
|
||||||
|
if: ${{inputs.target-arch != 'x64' && inputs.target-platform == 'win' }}
|
||||||
|
run: |
|
||||||
|
GN_APPENDED_ARGS="$GN_EXTRA_ARGS target_cpu=\"${{ inputs.target-arch }}\""
|
||||||
|
echo "GN_EXTRA_ARGS=$GN_APPENDED_ARGS" >> $GITHUB_ENV
|
||||||
|
- name: Add Clang problem matcher
|
||||||
|
shell: bash
|
||||||
|
run: echo "::add-matcher::src/electron/.github/problem-matchers/clang.json"
|
||||||
- name: Build Electron ${{ inputs.step-suffix }}
|
- name: Build Electron ${{ inputs.step-suffix }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -108,7 +117,9 @@ runs:
|
|||||||
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
cd out/Default
|
cd out/Default
|
||||||
powershell Compress-Archive -update mksnapshot_args mksnapshot.zip
|
powershell Compress-Archive -update mksnapshot_args mksnapshot.zip
|
||||||
powershell Compress-Archive -update gen/v8/embedded.S mksnapshot.zip
|
powershell mkdir mktmp\\gen\\v8
|
||||||
|
powershell Copy-Item gen\\v8\\embedded.S mktmp\\gen\\v8
|
||||||
|
powershell Compress-Archive -update -Path mktmp\\gen mksnapshot.zip
|
||||||
else
|
else
|
||||||
(cd out/Default; zip mksnapshot.zip mksnapshot_args gen/v8/embedded.S)
|
(cd out/Default; zip mksnapshot.zip mksnapshot_args gen/v8/embedded.S)
|
||||||
fi
|
fi
|
||||||
@@ -143,6 +154,25 @@ runs:
|
|||||||
run: |
|
run: |
|
||||||
cd src
|
cd src
|
||||||
e build --target electron:node_headers
|
e build --target electron:node_headers
|
||||||
|
- name: Create installed_software.json ${{ inputs.step-suffix }}
|
||||||
|
shell: powershell
|
||||||
|
if: ${{ inputs.is-release == 'true' && inputs.target-platform == 'win' }}
|
||||||
|
run: |
|
||||||
|
cd src
|
||||||
|
Get-CimInstance -Namespace root\cimv2 -Class Win32_product | Select vendor, description, @{l='install_location';e='InstallLocation'}, @{l='install_date';e='InstallDate'}, @{l='install_date_2';e='InstallDate2'}, caption, version, name, @{l='sku_number';e='SKUNumber'} | ConvertTo-Json | Out-File -Encoding utf8 -FilePath .\installed_software.json
|
||||||
|
- name: Profile Windows Toolchain ${{ inputs.step-suffix }}
|
||||||
|
shell: bash
|
||||||
|
if: ${{ inputs.is-release == 'true' && inputs.target-platform == 'win' }}
|
||||||
|
run: |
|
||||||
|
cd src
|
||||||
|
python3 electron/build/profile_toolchain.py --output-json=out/Default/windows_toolchain_profile.json
|
||||||
|
- name: Add msdia140.dll to Path ${{ inputs.step-suffix }}
|
||||||
|
shell: bash
|
||||||
|
if: ${{ inputs.is-release == 'true' && inputs.target-platform == 'win' }}
|
||||||
|
run: |
|
||||||
|
# Needed for msdia140.dll on 64-bit windows
|
||||||
|
cd src
|
||||||
|
export PATH="$PATH:$(pwd)/third_party/llvm-build/Release+Asserts/bin"
|
||||||
- name: Generate & Zip Symbols ${{ inputs.step-suffix }}
|
- name: Generate & Zip Symbols ${{ inputs.step-suffix }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -160,8 +190,8 @@ runs:
|
|||||||
electron/script/zip-symbols.py -b $BUILD_PATH
|
electron/script/zip-symbols.py -b $BUILD_PATH
|
||||||
fi
|
fi
|
||||||
- name: Generate FFMpeg ${{ inputs.step-suffix }}
|
- name: Generate FFMpeg ${{ inputs.step-suffix }}
|
||||||
shell: bash
|
|
||||||
if: ${{ inputs.is-release == 'true' }}
|
if: ${{ inputs.is-release == 'true' }}
|
||||||
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cd src
|
cd src
|
||||||
gn gen out/ffmpeg --args="import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true $GN_EXTRA_ARGS"
|
gn gen out/ffmpeg --args="import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true $GN_EXTRA_ARGS"
|
||||||
@@ -178,6 +208,9 @@ runs:
|
|||||||
e build --target electron:libcxx_headers_zip -j $NUMBER_OF_NINJA_PROCESSES
|
e build --target electron:libcxx_headers_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||||
e build --target electron:libcxxabi_headers_zip -j $NUMBER_OF_NINJA_PROCESSES
|
e build --target electron:libcxxabi_headers_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||||
e build --target electron:libcxx_objects_zip -j $NUMBER_OF_NINJA_PROCESSES
|
e build --target electron:libcxx_objects_zip -j $NUMBER_OF_NINJA_PROCESSES
|
||||||
|
- name: Remove Clang problem matcher
|
||||||
|
shell: bash
|
||||||
|
run: echo "::remove-matcher owner=clang::"
|
||||||
- name: Generate TypeScript Definitions ${{ inputs.step-suffix }}
|
- name: Generate TypeScript Definitions ${{ inputs.step-suffix }}
|
||||||
if: ${{ inputs.is-release == 'true' }}
|
if: ${{ inputs.is-release == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
83
.github/actions/build-git-cache/action.yml
vendored
Normal file
83
.github/actions/build-git-cache/action.yml
vendored
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
name: 'Build Git Cache'
|
||||||
|
description: 'Runs a gclient sync to build the git cache for Electron'
|
||||||
|
inputs:
|
||||||
|
target-platform:
|
||||||
|
description: 'Target platform, should be linux, win, macos'
|
||||||
|
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: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
|
- name: Install Build Tools
|
||||||
|
uses: ./src/electron/.github/actions/install-build-tools
|
||||||
|
- name: Set up cache drive
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
|
echo "CACHE_DRIVE=/mnt/win-cache" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "CACHE_DRIVE=/mnt/cross-instance-cache" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
|
- name: Check cross instance cache disk space
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
# if there is less than 35 GB free space then creating the cache might fail so exit early
|
||||||
|
freespace=`df -m $CACHE_DRIVE | grep -w $CACHE_DRIVE | awk '{print $4}'`
|
||||||
|
freespace_human=`df -h $CACHE_DRIVE | grep -w $CACHE_DRIVE | awk '{print $4}'`
|
||||||
|
if [ $freespace -le 35000 ]; then
|
||||||
|
echo "The cross mount cache has $freespace_human free space which is not enough - exiting"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "The cross mount cache has $freespace_human free space - continuing"
|
||||||
|
fi
|
||||||
|
- name: Restore gitcache
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
GIT_CACHE_TAR="$CACHE_DRIVE/gitcache.tar"
|
||||||
|
if [ ! -f "$GIT_CACHE_TAR" ]; then
|
||||||
|
echo "Git cache tar file does not exist, skipping restore"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo "Restoring git cache from $GIT_CACHE_TAR to $GIT_CACHE_PATH"
|
||||||
|
mkdir -p $GIT_CACHE_PATH
|
||||||
|
tar -xf $GIT_CACHE_TAR -C $GIT_CACHE_PATH
|
||||||
|
- name: Gclient Sync
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
e d gclient config \
|
||||||
|
--name "src/electron" \
|
||||||
|
--unmanaged \
|
||||||
|
${GCLIENT_EXTRA_ARGS} \
|
||||||
|
"$GITHUB_SERVER_URL/$GITHUB_REPOSITORY"
|
||||||
|
|
||||||
|
if [ "$TARGET_OS" != "" ]; then
|
||||||
|
echo "target_os=['$TARGET_OS']" >> ./.gclient
|
||||||
|
fi
|
||||||
|
|
||||||
|
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 e d gclient sync --with_branch_heads --with_tags --nohooks -vv
|
||||||
|
- name: Compress Git Cache Directory
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "Uncompressed gitcache size: $(du -sh $GIT_CACHE_PATH | cut -f1 -d' ')"
|
||||||
|
cd $GIT_CACHE_PATH
|
||||||
|
tar -cf ../gitcache.tar .
|
||||||
|
cd ..
|
||||||
|
echo "Compressed gitcache to $(du -sh gitcache.tar | cut -f1 -d' ')"
|
||||||
|
# remove the old cache file if it exists
|
||||||
|
if [ -f $CACHE_DRIVE/gitcache.tar ]; then
|
||||||
|
echo "Removing old gitcache.tar from $CACHE_DRIVE"
|
||||||
|
rm $CACHE_DRIVE/gitcache.tar
|
||||||
|
fi
|
||||||
|
cp ./gitcache.tar $CACHE_DRIVE/
|
||||||
|
- name: Wait for active SSH sessions
|
||||||
|
shell: bash
|
||||||
|
if: always() && !cancelled()
|
||||||
|
run: |
|
||||||
|
while [ -f /var/.ssh-lock ]
|
||||||
|
do
|
||||||
|
sleep 60
|
||||||
|
done
|
||||||
99
.github/actions/checkout/action.yml
vendored
99
.github/actions/checkout/action.yml
vendored
@@ -9,6 +9,8 @@ inputs:
|
|||||||
description: 'Whether to persist the cache to the shared drive'
|
description: 'Whether to persist the cache to the shared drive'
|
||||||
required: false
|
required: false
|
||||||
default: 'true'
|
default: 'true'
|
||||||
|
target-platform:
|
||||||
|
description: 'Target platform, should be linux, win, macos'
|
||||||
runs:
|
runs:
|
||||||
using: "composite"
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
@@ -18,38 +20,34 @@ runs:
|
|||||||
echo "GIT_CACHE_PATH=$(pwd)/git-cache" >> $GITHUB_ENV
|
echo "GIT_CACHE_PATH=$(pwd)/git-cache" >> $GITHUB_ENV
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
|
- name: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
- name: Install Build Tools
|
- name: Install Build Tools
|
||||||
uses: ./src/electron/.github/actions/install-build-tools
|
uses: ./src/electron/.github/actions/install-build-tools
|
||||||
- name: Get Depot Tools
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if [[ ! -d depot_tools ]]; then
|
|
||||||
git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
|
||||||
|
|
||||||
# Ensure depot_tools does not update.
|
|
||||||
test -d depot_tools && cd depot_tools
|
|
||||||
touch .disable_auto_update
|
|
||||||
fi
|
|
||||||
- name: Add Depot Tools to PATH
|
|
||||||
shell: bash
|
|
||||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
|
||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
echo "DEPSHASH=v1-src-cache-$(cat src/electron/.depshash)" >> $GITHUB_ENV
|
DEPSHASH="v1-src-cache-$(cat src/electron/.depshash)"
|
||||||
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
|
echo "CACHE_FILE=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
|
echo "CACHE_DRIVE=/mnt/win-cache" >> $GITHUB_ENV
|
||||||
|
else
|
||||||
|
echo "CACHE_DRIVE=/mnt/cross-instance-cache" >> $GITHUB_ENV
|
||||||
|
fi
|
||||||
- name: Generate SAS Key
|
- name: Generate SAS Key
|
||||||
if: ${{ inputs.generate-sas-token == 'true' }}
|
if: ${{ inputs.generate-sas-token == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
curl --unix-socket /var/run/sas/sas.sock --fail "http://foo/$DEPSHASH.tar" > sas-token
|
curl --unix-socket /var/run/sas/sas.sock --fail "http://foo/$CACHE_FILE?platform=${{ inputs.target-platform }}" > sas-token
|
||||||
- name: Save SAS Key
|
- name: Save SAS Key
|
||||||
if: ${{ inputs.generate-sas-token == 'true' }}
|
if: ${{ inputs.generate-sas-token == 'true' }}
|
||||||
uses: actions/cache/save@1bd1e32a3bdc45362d1e726936510720a7c30a57
|
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: sas-token
|
||||||
sas-token
|
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
key: sas-key-${{ github.run_number }}-${{ github.run_attempt }}
|
enableCrossOsArchive: true
|
||||||
- name: Check If Cache Exists
|
- name: Check If Cache Exists
|
||||||
id: check-cache
|
id: check-cache
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -58,7 +56,7 @@ runs:
|
|||||||
echo "Not using cache this time..."
|
echo "Not using cache this time..."
|
||||||
echo "cache_exists=false" >> $GITHUB_OUTPUT
|
echo "cache_exists=false" >> $GITHUB_OUTPUT
|
||||||
else
|
else
|
||||||
cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
cache_path=$CACHE_DRIVE/$CACHE_FILE
|
||||||
echo "Using cache key: $DEPSHASH"
|
echo "Using cache key: $DEPSHASH"
|
||||||
echo "Checking for cache in: $cache_path"
|
echo "Checking for cache in: $cache_path"
|
||||||
if [ ! -f "$cache_path" ] || [ `du $cache_path | cut -f1` = "0" ]; then
|
if [ ! -f "$cache_path" ] || [ `du $cache_path | cut -f1` = "0" ]; then
|
||||||
@@ -73,15 +71,30 @@ runs:
|
|||||||
if: steps.check-cache.outputs.cache_exists == 'false' && inputs.use-cache == 'true'
|
if: steps.check-cache.outputs.cache_exists == 'false' && inputs.use-cache == 'true'
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
# if there is less than 20 GB free space then creating the cache might fail so exit early
|
# if there is less than 35 GB free space then creating the cache might fail so exit early
|
||||||
freespace=`df -m /mnt/cross-instance-cache | grep -w /mnt/cross-instance-cache | awk '{print $4}'`
|
freespace=`df -m $CACHE_DRIVE | grep -w $CACHE_DRIVE | awk '{print $4}'`
|
||||||
freespace_human=`df -h /mnt/cross-instance-cache | grep -w /mnt/cross-instance-cache | awk '{print $4}'`
|
freespace_human=`df -h $CACHE_DRIVE | grep -w $CACHE_DRIVE | awk '{print $4}'`
|
||||||
if [ $freespace -le 20000 ]; then
|
if [ $freespace -le 35000 ]; then
|
||||||
echo "The cross mount cache has $freespace_human free space which is not enough - exiting"
|
echo "The cross mount cache has $freespace_human free space which is not enough - exiting"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
echo "The cross mount cache has $freespace_human free space - continuing"
|
echo "The cross mount cache has $freespace_human free space - continuing"
|
||||||
fi
|
fi
|
||||||
|
- name: Add patch conflict problem matcher
|
||||||
|
shell: bash
|
||||||
|
run: echo "::add-matcher::src/electron/.github/problem-matchers/patch-conflict.json"
|
||||||
|
- name: Restore gitcache
|
||||||
|
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
GIT_CACHE_TAR="$CACHE_DRIVE/gitcache.tar"
|
||||||
|
if [ ! -f "$GIT_CACHE_TAR" ]; then
|
||||||
|
echo "Git cache tar file does not exist, skipping restore"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
echo "Restoring git cache from $GIT_CACHE_TAR to $GIT_CACHE_PATH"
|
||||||
|
mkdir -p $GIT_CACHE_PATH
|
||||||
|
tar -xf $GIT_CACHE_TAR -C $GIT_CACHE_PATH
|
||||||
- name: Gclient Sync
|
- name: Gclient Sync
|
||||||
if: steps.check-cache.outputs.cache_exists == 'false'
|
if: steps.check-cache.outputs.cache_exists == 'false'
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -97,19 +110,14 @@ runs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 e d gclient sync --with_branch_heads --with_tags -vv
|
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 e d gclient sync --with_branch_heads --with_tags -vv
|
||||||
if [ "${{ inputs.is-release }}" != "true" && -n "${{ env.PATCH_UP_APP_CREDS }}" ]; then
|
if [[ "${{ inputs.is-release }}" != "true" ]]; then
|
||||||
# Re-export all the patches to check if there were changes.
|
# Re-export all the patches to check if there were changes.
|
||||||
python3 src/electron/script/export_all_patches.py src/electron/patches/config.json
|
python3 src/electron/script/export_all_patches.py src/electron/patches/config.json
|
||||||
cd src/electron
|
cd src/electron
|
||||||
git update-index --refresh || true
|
git update-index --refresh || true
|
||||||
if ! git diff-index --quiet HEAD --; then
|
if ! git diff-index --quiet HEAD --; then
|
||||||
# There are changes to the patches. Make a git commit with the updated patches
|
# There are changes to the patches. Make a git commit with the updated patches
|
||||||
git add patches
|
if node ./script/patch-up.js; then
|
||||||
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; then
|
|
||||||
echo
|
echo
|
||||||
echo "======================================================================"
|
echo "======================================================================"
|
||||||
echo "Changes to the patches when applying, we have auto-pushed the diff to the current branch"
|
echo "Changes to the patches when applying, we have auto-pushed the diff to the current branch"
|
||||||
@@ -117,6 +125,11 @@ runs:
|
|||||||
echo "======================================================================"
|
echo "======================================================================"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
else
|
||||||
|
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
|
||||||
echo
|
echo
|
||||||
echo "======================================================================"
|
echo "======================================================================"
|
||||||
echo "There were changes to the patches when applying."
|
echo "There were changes to the patches when applying."
|
||||||
@@ -126,9 +139,15 @@ runs:
|
|||||||
cat ../../patches/update-patches.patch
|
cat ../../patches/update-patches.patch
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "No changes to patches detected"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
- name: Remove patch conflict problem matcher
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "::remove-matcher owner=merge-conflict::"
|
||||||
|
echo "::remove-matcher owner=patch-conflict::"
|
||||||
# delete all .git directories under src/ except for
|
# delete all .git directories under src/ except for
|
||||||
# third_party/angle/ and third_party/dawn/ because of build time generation of files
|
# 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
|
# gen/angle/commit.h depends on third_party/angle/.git/HEAD
|
||||||
@@ -163,14 +182,14 @@ runs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "Uncompressed src size: $(du -sh src | cut -f1 -d' ')"
|
echo "Uncompressed src size: $(du -sh src | cut -f1 -d' ')"
|
||||||
tar -cf $DEPSHASH.tar src
|
tar -cf $CACHE_FILE src
|
||||||
echo "Compressed src to $(du -sh $DEPSHASH.tar | cut -f1 -d' ')"
|
echo "Compressed src to $(du -sh $CACHE_FILE | cut -f1 -d' ')"
|
||||||
cp ./$DEPSHASH.tar /mnt/cross-instance-cache/
|
cp ./$CACHE_FILE $CACHE_DRIVE/
|
||||||
- name: Persist Src Cache
|
- name: Persist Src Cache
|
||||||
if: ${{ steps.check-cache.outputs.cache_exists == 'false' && inputs.use-cache == 'true' }}
|
if: ${{ steps.check-cache.outputs.cache_exists == 'false' && inputs.use-cache == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
final_cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
final_cache_path=$CACHE_DRIVE/$CACHE_FILE
|
||||||
echo "Using cache key: $DEPSHASH"
|
echo "Using cache key: $DEPSHASH"
|
||||||
echo "Checking path: $final_cache_path"
|
echo "Checking path: $final_cache_path"
|
||||||
if [ ! -f "$final_cache_path" ]; then
|
if [ ! -f "$final_cache_path" ]; then
|
||||||
@@ -179,3 +198,11 @@ runs:
|
|||||||
else
|
else
|
||||||
echo "Cache key persisted in $final_cache_path"
|
echo "Cache key persisted in $final_cache_path"
|
||||||
fi
|
fi
|
||||||
|
- name: Wait for active SSH sessions
|
||||||
|
shell: bash
|
||||||
|
if: always() && !cancelled()
|
||||||
|
run: |
|
||||||
|
while [ -f /var/.ssh-lock ]
|
||||||
|
do
|
||||||
|
sleep 60
|
||||||
|
done
|
||||||
|
|||||||
40
.github/actions/cipd-install/action.yml
vendored
Normal file
40
.github/actions/cipd-install/action.yml
vendored
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
name: 'CIPD install'
|
||||||
|
description: 'Installs the specified CIPD package'
|
||||||
|
inputs:
|
||||||
|
cipd-root-prefix-path:
|
||||||
|
description: 'Path to prepend to installation directory'
|
||||||
|
default: ''
|
||||||
|
dependency:
|
||||||
|
description: 'Name of dependency to install'
|
||||||
|
deps-file:
|
||||||
|
description: 'Location of DEPS file that defines the dependency'
|
||||||
|
installation-dir:
|
||||||
|
description: 'Location to install dependency'
|
||||||
|
target-platform:
|
||||||
|
description: 'Target platform, should be linux, win, macos'
|
||||||
|
package:
|
||||||
|
description: 'Package to install'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Delete wrong ${{ inputs.dependency }}
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
rm -rf ${{ inputs.cipd-root-prefix-path }}${{ inputs.installation-dir }}
|
||||||
|
- name: Create ensure file for ${{ inputs.dependency }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo '${{ inputs.package }}' `e d gclient getdep --deps-file=${{ inputs.deps-file }} -r '${{ inputs.installation-dir }}:${{ inputs.package }}'` > ${{ inputs.dependency }}_ensure_file
|
||||||
|
cat ${{ inputs.dependency }}_ensure_file
|
||||||
|
- name: CIPD installation of ${{ inputs.dependency }} (macOS)
|
||||||
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "ensuring ${{ inputs.dependency }} on macOS"
|
||||||
|
e d cipd ensure --root ${{ inputs.cipd-root-prefix-path }}${{ inputs.installation-dir }} -ensure-file ${{ inputs.dependency }}_ensure_file
|
||||||
|
- name: CIPD installation of ${{ inputs.dependency }} (Windows)
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
echo "ensuring ${{ inputs.dependency }} on Windows"
|
||||||
|
e d cipd ensure --root ${{ inputs.cipd-root-prefix-path }}${{ inputs.installation-dir }} -ensure-file ${{ inputs.dependency }}_ensure_file
|
||||||
61
.github/actions/fix-sync-macos/action.yml
vendored
61
.github/actions/fix-sync-macos/action.yml
vendored
@@ -1,61 +0,0 @@
|
|||||||
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
|
|
||||||
120
.github/actions/fix-sync/action.yml
vendored
Normal file
120
.github/actions/fix-sync/action.yml
vendored
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
name: 'Fix Sync'
|
||||||
|
description: 'Ensures proper binaries are in place'
|
||||||
|
# This action is required to correct for differences between "gclient sync"
|
||||||
|
# on Linux and the expected state on macOS/windows. 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)
|
||||||
|
# 9. Install windows toolchain on Windows
|
||||||
|
# 10. Fix node binary on Windows
|
||||||
|
# 11. Fix rc binary on Windows
|
||||||
|
inputs:
|
||||||
|
target-platform:
|
||||||
|
description: 'Target platform, should be linux, win, macos'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Fix clang
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
rm -rf src/third_party/llvm-build
|
||||||
|
python3 src/tools/clang/scripts/update.py
|
||||||
|
- name: Fix esbuild
|
||||||
|
uses: ./src/electron/.github/actions/cipd-install
|
||||||
|
with:
|
||||||
|
cipd-root-prefix-path: src/third_party/devtools-frontend/src/
|
||||||
|
dependency: esbuild
|
||||||
|
deps-file: src/third_party/devtools-frontend/src/DEPS
|
||||||
|
installation-dir: third_party/esbuild
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
package: infra/3pp/tools/esbuild/${platform}
|
||||||
|
- name: Fix rustc
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
rm -rf src/third_party/rust-toolchain
|
||||||
|
python3 src/tools/rust/update_rust.py
|
||||||
|
- name: Fix gn (macOS)
|
||||||
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
|
uses: ./src/electron/.github/actions/cipd-install
|
||||||
|
with:
|
||||||
|
dependency: gn
|
||||||
|
deps-file: src/DEPS
|
||||||
|
installation-dir: src/buildtools/mac
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
package: gn/gn/mac-${arch}
|
||||||
|
- name: Fix gn (Windows)
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
uses: ./src/electron/.github/actions/cipd-install
|
||||||
|
with:
|
||||||
|
dependency: gn
|
||||||
|
deps-file: src/DEPS
|
||||||
|
installation-dir: src/buildtools/win
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
package: gn/gn/windows-amd64
|
||||||
|
- name: Fix reclient
|
||||||
|
uses: ./src/electron/.github/actions/cipd-install
|
||||||
|
with:
|
||||||
|
dependency: reclient
|
||||||
|
deps-file: src/DEPS
|
||||||
|
installation-dir: src/buildtools/reclient
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
package: infra/rbe/client/${platform}
|
||||||
|
- name: Configure reclient configs
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
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
|
||||||
|
- name: Fix dsymutil (macOS)
|
||||||
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
# Fix dsymutil
|
||||||
|
if [ "${{ inputs.target-platform }}" = "macos" ]; then
|
||||||
|
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
|
||||||
|
fi
|
||||||
|
- name: Fix ninja
|
||||||
|
uses: ./src/electron/.github/actions/cipd-install
|
||||||
|
with:
|
||||||
|
dependency: ninja
|
||||||
|
deps-file: src/DEPS
|
||||||
|
installation-dir: src/third_party/ninja
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
package: infra/3pp/tools/ninja/${platform}
|
||||||
|
- name: Set ninja in path
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
echo "$(pwd)/src/third_party/ninja" >> $GITHUB_PATH
|
||||||
|
- name: Fixup angle git
|
||||||
|
shell: bash
|
||||||
|
run : |
|
||||||
|
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
|
||||||
|
- name: Get Windows toolchain
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
shell: powershell
|
||||||
|
run: e d vpython3 src\build\vs_toolchain.py update --force
|
||||||
|
- name: Download nodejs
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$nodedeps = e d gclient getdep --deps-file=src/DEPS -r src/third_party/node/win | ConvertFrom-JSON
|
||||||
|
python3 src\third_party\depot_tools\download_from_google_storage.py --no_resume --no_auth --bucket chromium-nodejs -o src\third_party\node\win\node.exe $nodedeps.object_name
|
||||||
|
- name: Install rc
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
python3 src/third_party/depot_tools/download_from_google_storage.py --no_resume --no_auth --bucket chromium-browser-clang/rc -s src/build/toolchain/win/rc/win/rc.exe.sha1
|
||||||
15
.github/actions/install-build-tools/action.yml
vendored
15
.github/actions/install-build-tools/action.yml
vendored
@@ -10,11 +10,22 @@ runs:
|
|||||||
git config --global core.filemode false
|
git config --global core.filemode false
|
||||||
git config --global core.autocrlf false
|
git config --global core.autocrlf false
|
||||||
git config --global branch.autosetuprebase always
|
git config --global branch.autosetuprebase always
|
||||||
|
git config --global core.fscache true
|
||||||
|
git config --global core.longpaths true
|
||||||
|
git config --global core.preloadindex true
|
||||||
fi
|
fi
|
||||||
export BUILD_TOOLS_SHA=8246e57791b0af4ae5975eb96f09855f9269b1cd
|
export BUILD_TOOLS_SHA=6e8526315ea3b4828882497e532b8340e64e053c
|
||||||
npm i -g @electron/build-tools
|
npm i -g @electron/build-tools
|
||||||
|
# Update depot_tools to ensure python
|
||||||
|
e d update_depot_tools
|
||||||
e auto-update disable
|
e auto-update disable
|
||||||
|
# Disable further updates of depot_tools
|
||||||
|
e d auto-update disable
|
||||||
if [ "$(expr substr $(uname -s) 1 10)" == "MSYS_NT-10" ]; then
|
if [ "$(expr substr $(uname -s) 1 10)" == "MSYS_NT-10" ]; then
|
||||||
e d cipd.bat --version
|
e d cipd.bat --version
|
||||||
cp "C:\Python37\python.exe" "C:\Python37\python3.exe"
|
cp "C:\Python311\python.exe" "C:\Python311\python3.exe"
|
||||||
|
echo "C:\Users\ContainerAdministrator\.electron_build_tools\third_party\depot_tools" >> $GITHUB_PATH
|
||||||
|
else
|
||||||
|
echo "$HOME/.electron_build_tools/third_party/depot_tools" >> $GITHUB_PATH
|
||||||
|
echo "$HOME/.electron_build_tools/third_party/depot_tools/python-bin" >> $GITHUB_PATH
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ runs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
id: yarn-cache-dir-path
|
id: yarn-cache-dir-path
|
||||||
run: echo "dir=$(node src/electron/script/yarn cache dir)" >> $GITHUB_OUTPUT
|
run: echo "dir=$(node src/electron/script/yarn cache dir)" >> $GITHUB_OUTPUT
|
||||||
- uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57
|
- uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||||
id: yarn-cache
|
id: yarn-cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
|||||||
10
.github/actions/restore-cache-aks/action.yml
vendored
10
.github/actions/restore-cache-aks/action.yml
vendored
@@ -1,12 +1,20 @@
|
|||||||
name: 'Restore Cache AKS'
|
name: 'Restore Cache AKS'
|
||||||
description: 'Restores Electron src cache via AKS'
|
description: 'Restores Electron src cache via AKS'
|
||||||
|
inputs:
|
||||||
|
target-platform:
|
||||||
|
description: 'Target platform, should be linux, win, macos'
|
||||||
runs:
|
runs:
|
||||||
using: "composite"
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
- name: Restore and Ensure Src Cache
|
- name: Restore and Ensure Src Cache
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
|
cache_path=/mnt/win-cache/$DEPSHASH.tar
|
||||||
|
else
|
||||||
|
cache_path=/mnt/cross-instance-cache/$DEPSHASH.tar
|
||||||
|
fi
|
||||||
|
|
||||||
echo "Using cache key: $DEPSHASH"
|
echo "Using cache key: $DEPSHASH"
|
||||||
echo "Checking for cache in: $cache_path"
|
echo "Checking for cache in: $cache_path"
|
||||||
if [ ! -f "$cache_path" ]; then
|
if [ ! -f "$cache_path" ]; then
|
||||||
|
|||||||
77
.github/actions/restore-cache-azcopy/action.yml
vendored
77
.github/actions/restore-cache-azcopy/action.yml
vendored
@@ -1,22 +1,25 @@
|
|||||||
name: 'Restore Cache AZCopy'
|
name: 'Restore Cache AZCopy'
|
||||||
description: 'Restores Electron src cache via AZCopy'
|
description: 'Restores Electron src cache via AZCopy'
|
||||||
|
inputs:
|
||||||
|
target-platform:
|
||||||
|
description: 'Target platform, should be linux, win, macos'
|
||||||
runs:
|
runs:
|
||||||
using: "composite"
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
- name: Obtain SAS Key
|
- name: Obtain SAS Key
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57
|
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: sas-token
|
||||||
sas-token
|
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-1
|
||||||
key: sas-key-${{ github.run_number }}-1
|
enableCrossOsArchive: true
|
||||||
- name: Obtain SAS Key
|
- name: Obtain SAS Key
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: actions/cache/restore@1bd1e32a3bdc45362d1e726936510720a7c30a57
|
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
||||||
with:
|
with:
|
||||||
path: |
|
path: sas-token
|
||||||
sas-token
|
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
key: sas-key-${{ github.run_number }}-${{ github.run_attempt }}
|
enableCrossOsArchive: true
|
||||||
- name: Download Src Cache from AKS
|
- name: Download Src Cache from AKS
|
||||||
# The cache will always exist here as a result of the checkout job
|
# 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
|
# Either it was uploaded to Azure in the checkout job for this commit
|
||||||
@@ -26,21 +29,30 @@ runs:
|
|||||||
timeout_minutes: 30
|
timeout_minutes: 30
|
||||||
max_attempts: 3
|
max_attempts: 3
|
||||||
retry_on: error
|
retry_on: error
|
||||||
|
shell: bash
|
||||||
command: |
|
command: |
|
||||||
sas_token=$(cat sas-token)
|
sas_token=$(cat sas-token)
|
||||||
if [ -z $sas-token ]; then
|
if [ -z "$sas_token" ]; then
|
||||||
echo "SAS Token not found; exiting src cache download early..."
|
echo "SAS Token not found; exiting src cache download early..."
|
||||||
exit 1
|
exit 1
|
||||||
|
else
|
||||||
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
|
azcopy copy --log-level=ERROR \
|
||||||
|
"https://${{ env.AZURE_AKS_CACHE_STORAGE_ACCOUNT }}.file.core.windows.net/${{ env.AZURE_AKS_WIN_CACHE_SHARE_NAME }}/${{ env.CACHE_PATH }}?$sas_token" $DEPSHASH.tar
|
||||||
|
else
|
||||||
|
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
|
||||||
|
fi
|
||||||
fi
|
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:
|
env:
|
||||||
AZURE_AKS_CACHE_STORAGE_ACCOUNT: f723719aa87a34622b5f7f3
|
AZURE_AKS_CACHE_STORAGE_ACCOUNT: f723719aa87a34622b5f7f3
|
||||||
AZURE_AKS_CACHE_SHARE_NAME: pvc-f6a4089f-b082-4bee-a3f9-c3e1c0c02d8f
|
AZURE_AKS_CACHE_SHARE_NAME: pvc-f6a4089f-b082-4bee-a3f9-c3e1c0c02d8f
|
||||||
|
AZURE_AKS_WIN_CACHE_SHARE_NAME: pvc-71dec4f2-0d44-4fd1-a2c3-add049d70bdf
|
||||||
- name: Clean SAS Key
|
- name: Clean SAS Key
|
||||||
shell: bash
|
shell: bash
|
||||||
run: rm -f sas-token
|
run: rm -f sas-token
|
||||||
- name: Unzip and Ensure Src Cache
|
- name: Unzip and Ensure Src Cache
|
||||||
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "Downloaded cache is $(du -sh $DEPSHASH.tar | cut -f1)"
|
echo "Downloaded cache is $(du -sh $DEPSHASH.tar | cut -f1)"
|
||||||
@@ -68,4 +80,45 @@ runs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Wiping Electron Directory"
|
echo "Wiping Electron Directory"
|
||||||
rm -rf src/electron
|
rm -rf src/electron
|
||||||
|
|
||||||
|
- name: Unzip and Ensure Src Cache (Windows)
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$src_cache = "$env:DEPSHASH.tar"
|
||||||
|
$cache_size = $(Get-Item $src_cache).length
|
||||||
|
Write-Host "Downloaded cache is $cache_size"
|
||||||
|
if ($cache_size -eq 0) {
|
||||||
|
Write-Host "Cache is empty - exiting"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$TEMP_DIR=New-Item -ItemType Directory -Path temp-cache
|
||||||
|
$TEMP_DIR_PATH = $TEMP_DIR.FullName
|
||||||
|
C:\ProgramData\Chocolatey\bin\7z.exe -y -snld x $src_cache -o"$TEMP_DIR_PATH"
|
||||||
|
|
||||||
|
- name: Move Src Cache (Windows)
|
||||||
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
|
uses: nick-fields/retry@7152eba30c6575329ac0576536151aca5a72780e # v3.0.0
|
||||||
|
with:
|
||||||
|
timeout_minutes: 30
|
||||||
|
max_attempts: 3
|
||||||
|
retry_on: error
|
||||||
|
shell: powershell
|
||||||
|
command: |
|
||||||
|
if (Test-Path "temp-cache\src") {
|
||||||
|
Write-Host "Relocating Cache"
|
||||||
|
Remove-Item -Recurse -Force src
|
||||||
|
Move-Item temp-cache\src src
|
||||||
|
|
||||||
|
Write-Host "Deleting zip file"
|
||||||
|
Remove-Item -Force $src_cache
|
||||||
|
}
|
||||||
|
if (-Not (Test-Path "src\third_party\blink")) {
|
||||||
|
Write-Host "Cache was not correctly restored - exiting"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Wiping Electron Directory"
|
||||||
|
Remove-Item -Recurse -Force src\electron
|
||||||
|
|||||||
58
.github/actions/set-chromium-cookie/action.yml
vendored
Normal file
58
.github/actions/set-chromium-cookie/action.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: 'Set Chromium Git Cookie'
|
||||||
|
description: 'Sets an authenticated cookie from Chromium to allow for a higher request limit'
|
||||||
|
runs:
|
||||||
|
using: "composite"
|
||||||
|
steps:
|
||||||
|
- name: Set the git cookie from chromium.googlesource.com (Unix)
|
||||||
|
if: ${{ runner.os != 'Windows' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [[ -z "${{ env.CHROMIUM_GIT_COOKIE }}" ]]; then
|
||||||
|
echo "CHROMIUM_GIT_COOKIE is not set - cannot authenticate."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
eval 'set +o history' 2>/dev/null || setopt HIST_IGNORE_SPACE 2>/dev/null
|
||||||
|
touch ~/.gitcookies
|
||||||
|
chmod 0600 ~/.gitcookies
|
||||||
|
|
||||||
|
git config --global http.cookiefile ~/.gitcookies
|
||||||
|
|
||||||
|
tr , \\t <<\__END__ >>~/.gitcookies
|
||||||
|
${{ env.CHROMIUM_GIT_COOKIE }}
|
||||||
|
__END__
|
||||||
|
eval 'set -o history' 2>/dev/null || unsetopt HIST_IGNORE_SPACE 2>/dev/null
|
||||||
|
|
||||||
|
RESPONSE=$(curl -s -b ~/.gitcookies https://chromium-review.googlesource.com/a/accounts/self)
|
||||||
|
if [[ $RESPONSE == ")]}'"* ]]; then
|
||||||
|
# Extract account email for verification
|
||||||
|
EMAIL=$(echo "$RESPONSE" | tail -c +5 | jq -r '.email // "No email found"')
|
||||||
|
echo "Cookie authentication successful - authenticated as: $EMAIL"
|
||||||
|
else
|
||||||
|
echo "Cookie authentication failed - ensure CHROMIUM_GIT_COOKIE is set correctly"
|
||||||
|
echo $RESPONSE
|
||||||
|
fi
|
||||||
|
- name: Set the git cookie from chromium.googlesource.com (Windows)
|
||||||
|
if: ${{ runner.os == 'Windows' }}
|
||||||
|
shell: cmd
|
||||||
|
run: |
|
||||||
|
if "%CHROMIUM_GIT_COOKIE_WINDOWS_STRING%"=="" (
|
||||||
|
echo CHROMIUM_GIT_COOKIE_WINDOWS_STRING is not set - cannot authenticate.
|
||||||
|
exit /b 0
|
||||||
|
)
|
||||||
|
|
||||||
|
git config --global http.cookiefile "%USERPROFILE%\.gitcookies"
|
||||||
|
powershell -noprofile -nologo -command Write-Output "${{ env.CHROMIUM_GIT_COOKIE_WINDOWS_STRING }}" >>"%USERPROFILE%\.gitcookies"
|
||||||
|
|
||||||
|
curl -s -b "%USERPROFILE%\.gitcookies" https://chromium-review.googlesource.com/a/accounts/self > response.txt
|
||||||
|
|
||||||
|
findstr /B /C:")]}'" response.txt > nul
|
||||||
|
if %ERRORLEVEL% EQU 0 (
|
||||||
|
echo Cookie authentication successful
|
||||||
|
powershell -NoProfile -Command "& {$content = Get-Content -Raw response.txt; $content = $content.Substring(4); try { $json = ConvertFrom-Json $content; if($json.email) { Write-Host 'Authenticated as:' $json.email } else { Write-Host 'No email found in response' } } catch { Write-Host 'Error parsing JSON:' $_ }}"
|
||||||
|
) else (
|
||||||
|
echo Cookie authentication failed - ensure CHROMIUM_GIT_COOKIE_WINDOWS_STRING is set correctly
|
||||||
|
type response.txt
|
||||||
|
)
|
||||||
|
|
||||||
|
del response.txt
|
||||||
18
.github/problem-matchers/clang.json
vendored
Normal file
18
.github/problem-matchers/clang.json
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"problemMatcher": [
|
||||||
|
{
|
||||||
|
"owner": "clang",
|
||||||
|
"fromPath": "src/out/Default/args.gn",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "^(.+)[(:](\\d+)[:,](\\d+)\\)?:\\s+(warning|error):\\s+(.*)$",
|
||||||
|
"file": 1,
|
||||||
|
"line": 2,
|
||||||
|
"column": 3,
|
||||||
|
"severity": 4,
|
||||||
|
"message": 5
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
22
.github/problem-matchers/eslint-stylish.json
vendored
Normal file
22
.github/problem-matchers/eslint-stylish.json
vendored
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
{
|
||||||
|
"problemMatcher": [
|
||||||
|
{
|
||||||
|
"owner": "eslint-stylish",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "^\\s*([^\\s].*)$",
|
||||||
|
"file": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"regexp": "^\\s+(\\d+):(\\d+)\\s+(error|warning|info)\\s+(.*)\\s\\s+(.*)$",
|
||||||
|
"line": 1,
|
||||||
|
"column": 2,
|
||||||
|
"severity": 3,
|
||||||
|
"message": 4,
|
||||||
|
"code": 5,
|
||||||
|
"loop": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
24
.github/problem-matchers/patch-conflict.json
vendored
Normal file
24
.github/problem-matchers/patch-conflict.json
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{
|
||||||
|
"problemMatcher": [
|
||||||
|
{
|
||||||
|
"owner": "merge-conflict",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "^CONFLICT\\s\\(\\S+\\): (Merge conflict in \\S+)$",
|
||||||
|
"message": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"owner": "patch-conflict",
|
||||||
|
"pattern": [
|
||||||
|
{
|
||||||
|
"regexp": "^error: (patch failed: (\\S+):(\\d+))$",
|
||||||
|
"message": 1,
|
||||||
|
"file": 2,
|
||||||
|
"line": 3
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
2
.github/workflows/archaeologist-dig.yml
vendored
2
.github/workflows/archaeologist-dig.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
- name: Setup Node.js/npm
|
- name: Setup Node.js/npm
|
||||||
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
|
||||||
with:
|
with:
|
||||||
node-version: 20.11.x
|
node-version: 20.19.x
|
||||||
- name: Setting Up Dig Site
|
- name: Setting Up Dig Site
|
||||||
run: |
|
run: |
|
||||||
echo "remote: ${{ github.event.pull_request.head.repo.clone_url }}"
|
echo "remote: ${{ github.event.pull_request.head.repo.clone_url }}"
|
||||||
|
|||||||
74
.github/workflows/build-git-cache.yml
vendored
Normal file
74
.github/workflows/build-git-cache.yml
vendored
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
name: Build Git Cache
|
||||||
|
# This workflow updates git cache on the cross-instance cache volumes
|
||||||
|
# It runs daily at midnight.
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 0 * * *"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-git-cache-linux:
|
||||||
|
runs-on: electron-arc-linux-amd64-32core
|
||||||
|
container:
|
||||||
|
image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1
|
||||||
|
options: --user root
|
||||||
|
volumes:
|
||||||
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
||||||
|
steps:
|
||||||
|
- name: Checkout Electron
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
with:
|
||||||
|
path: src/electron
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Build Git Cache
|
||||||
|
uses: ./src/electron/.github/actions/build-git-cache
|
||||||
|
with:
|
||||||
|
target-platform: linux
|
||||||
|
|
||||||
|
build-git-cache-windows:
|
||||||
|
runs-on: electron-arc-linux-amd64-32core
|
||||||
|
container:
|
||||||
|
image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1
|
||||||
|
options: --user root --device /dev/fuse --cap-add SYS_ADMIN
|
||||||
|
volumes:
|
||||||
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_win=True'
|
||||||
|
TARGET_OS: 'win'
|
||||||
|
steps:
|
||||||
|
- name: Checkout Electron
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
with:
|
||||||
|
path: src/electron
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Build Git Cache
|
||||||
|
uses: ./src/electron/.github/actions/build-git-cache
|
||||||
|
with:
|
||||||
|
target-platform: win
|
||||||
|
|
||||||
|
build-git-cache-macos:
|
||||||
|
runs-on: electron-arc-linux-amd64-32core
|
||||||
|
# This job updates the same git cache as linux, so it needs to run after the linux one.
|
||||||
|
needs: build-git-cache-linux
|
||||||
|
container:
|
||||||
|
image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1
|
||||||
|
options: --user root
|
||||||
|
volumes:
|
||||||
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
||||||
|
steps:
|
||||||
|
- name: Checkout Electron
|
||||||
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
|
with:
|
||||||
|
path: src/electron
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Build Git Cache
|
||||||
|
uses: ./src/electron/.github/actions/build-git-cache
|
||||||
|
with:
|
||||||
|
target-platform: macos
|
||||||
23
.github/workflows/build.yml
vendored
23
.github/workflows/build.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'bc2f48b2415a670de18d13605b1cf0eb5fdbaae1'
|
default: '424eedbf277ad9749ffa9219068aa72ed4a5e373'
|
||||||
required: true
|
required: true
|
||||||
skip-macos:
|
skip-macos:
|
||||||
type: boolean
|
type: boolean
|
||||||
@@ -64,7 +64,7 @@ jobs:
|
|||||||
id: set-output
|
id: set-output
|
||||||
run: |
|
run: |
|
||||||
if [ -z "${{ inputs.build-image-sha }}" ]; then
|
if [ -z "${{ inputs.build-image-sha }}" ]; then
|
||||||
echo "build-image-sha=bc2f48b2415a670de18d13605b1cf0eb5fdbaae1" >> "$GITHUB_OUTPUT"
|
echo "build-image-sha=424eedbf277ad9749ffa9219068aa72ed4a5e373" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
echo "build-image-sha=${{ inputs.build-image-sha }}" >> "$GITHUB_OUTPUT"
|
echo "build-image-sha=${{ inputs.build-image-sha }}" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
@@ -100,6 +100,7 @@ jobs:
|
|||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
- /var/run/sas:/var/run/sas
|
- /var/run/sas:/var/run/sas
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
||||||
outputs:
|
outputs:
|
||||||
build-image-sha: ${{ needs.setup.outputs.build-image-sha }}
|
build-image-sha: ${{ needs.setup.outputs.build-image-sha }}
|
||||||
@@ -114,6 +115,7 @@ jobs:
|
|||||||
uses: ./src/electron/.github/actions/checkout
|
uses: ./src/electron/.github/actions/checkout
|
||||||
with:
|
with:
|
||||||
generate-sas-token: 'true'
|
generate-sas-token: 'true'
|
||||||
|
target-platform: macos
|
||||||
|
|
||||||
checkout-linux:
|
checkout-linux:
|
||||||
needs: setup
|
needs: setup
|
||||||
@@ -126,6 +128,7 @@ jobs:
|
|||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
- /var/run/sas:/var/run/sas
|
- /var/run/sas:/var/run/sas
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
||||||
PATCH_UP_APP_CREDS: ${{ secrets.PATCH_UP_APP_CREDS }}
|
PATCH_UP_APP_CREDS: ${{ secrets.PATCH_UP_APP_CREDS }}
|
||||||
outputs:
|
outputs:
|
||||||
@@ -148,8 +151,11 @@ jobs:
|
|||||||
image: ghcr.io/electron/build:${{ needs.setup.outputs.build-image-sha }}
|
image: ghcr.io/electron/build:${{ needs.setup.outputs.build-image-sha }}
|
||||||
options: --user root --device /dev/fuse --cap-add SYS_ADMIN
|
options: --user root --device /dev/fuse --cap-add SYS_ADMIN
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
|
- /var/run/sas:/var/run/sas
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
CHROMIUM_GIT_COOKIE_WINDOWS_STRING: ${{ secrets.CHROMIUM_GIT_COOKIE_WINDOWS_STRING }}
|
||||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_win=True'
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_win=True'
|
||||||
TARGET_OS: 'win'
|
TARGET_OS: 'win'
|
||||||
ELECTRON_DEPOT_TOOLS_WIN_TOOLCHAIN: '1'
|
ELECTRON_DEPOT_TOOLS_WIN_TOOLCHAIN: '1'
|
||||||
@@ -164,6 +170,9 @@ jobs:
|
|||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Checkout & Sync & Save
|
- name: Checkout & Sync & Save
|
||||||
uses: ./src/electron/.github/actions/checkout
|
uses: ./src/electron/.github/actions/checkout
|
||||||
|
with:
|
||||||
|
generate-sas-token: 'true'
|
||||||
|
target-platform: win
|
||||||
|
|
||||||
# GN Check Jobs
|
# GN Check Jobs
|
||||||
macos-gn-check:
|
macos-gn-check:
|
||||||
@@ -194,7 +203,7 @@ jobs:
|
|||||||
target-platform: win
|
target-platform: win
|
||||||
target-archs: x64 x86 arm64
|
target-archs: x64 x86 arm64
|
||||||
check-runs-on: electron-arc-linux-amd64-8core
|
check-runs-on: electron-arc-linux-amd64-8core
|
||||||
check-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-windows.outputs.build-image-sha }}","options":"--user root --device /dev/fuse --cap-add SYS_ADMIN","volumes":["/mnt/cross-instance-cache:/mnt/cross-instance-cache"]}'
|
check-container: '{"image":"ghcr.io/electron/build:${{ needs.checkout-windows.outputs.build-image-sha }}","options":"--user root --device /dev/fuse --cap-add SYS_ADMIN","volumes":["/mnt/win-cache:/mnt/win-cache"]}'
|
||||||
gn-build-type: testing
|
gn-build-type: testing
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
@@ -322,7 +331,7 @@ jobs:
|
|||||||
issues: read
|
issues: read
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||||
needs: setup
|
needs: checkout-windows
|
||||||
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-windows }}
|
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-windows }}
|
||||||
with:
|
with:
|
||||||
build-runs-on: electron-arc-windows-amd64-16core
|
build-runs-on: electron-arc-windows-amd64-16core
|
||||||
@@ -341,7 +350,7 @@ jobs:
|
|||||||
issues: read
|
issues: read
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||||
needs: setup
|
needs: checkout-windows
|
||||||
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-windows }}
|
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-windows }}
|
||||||
with:
|
with:
|
||||||
build-runs-on: electron-arc-windows-amd64-16core
|
build-runs-on: electron-arc-windows-amd64-16core
|
||||||
@@ -360,7 +369,7 @@ jobs:
|
|||||||
issues: read
|
issues: read
|
||||||
pull-requests: read
|
pull-requests: read
|
||||||
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
uses: ./.github/workflows/pipeline-electron-build-and-test.yml
|
||||||
needs: setup
|
needs: checkout-windows
|
||||||
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-windows }}
|
if: ${{ needs.setup.outputs.src == 'true' && !inputs.skip-windows }}
|
||||||
with:
|
with:
|
||||||
build-runs-on: electron-arc-windows-amd64-16core
|
build-runs-on: electron-arc-windows-amd64-16core
|
||||||
|
|||||||
12
.github/workflows/clean-src-cache.yml
vendored
12
.github/workflows/clean-src-cache.yml
vendored
@@ -1,8 +1,12 @@
|
|||||||
name: Clean Source Cache
|
name: Clean Source Cache
|
||||||
|
|
||||||
|
description: |
|
||||||
|
This workflow cleans up the source cache on the cross-instance cache volume
|
||||||
|
to free up space. It runs daily at midnight and clears files older than 15 days.
|
||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "0 0 * * SUN" # Run at midnight every Sunday
|
- cron: "0 0 * * *"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
clean-src-cache:
|
clean-src-cache:
|
||||||
@@ -12,10 +16,14 @@ jobs:
|
|||||||
options: --user root
|
options: --user root
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
steps:
|
steps:
|
||||||
- name: Cleanup Source Cache
|
- name: Cleanup Source Cache
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
df -h /mnt/cross-instance-cache
|
df -h /mnt/cross-instance-cache
|
||||||
find /mnt/cross-instance-cache -type f -mtime +30 -delete
|
find /mnt/cross-instance-cache -type f -mtime +15 -delete
|
||||||
df -h /mnt/cross-instance-cache
|
df -h /mnt/cross-instance-cache
|
||||||
|
df -h /mnt/win-cache
|
||||||
|
find /mnt/win-cache -type f -mtime +15 -delete
|
||||||
|
df -h /mnt/win-cache
|
||||||
|
|||||||
3
.github/workflows/linux-publish.yml
vendored
3
.github/workflows/linux-publish.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'bc2f48b2415a670de18d13605b1cf0eb5fdbaae1'
|
default: '424eedbf277ad9749ffa9219068aa72ed4a5e373'
|
||||||
upload-to-storage:
|
upload-to-storage:
|
||||||
description: 'Uploads to Azure storage'
|
description: 'Uploads to Azure storage'
|
||||||
required: false
|
required: false
|
||||||
@@ -27,6 +27,7 @@ jobs:
|
|||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
- /var/run/sas:/var/run/sas
|
- /var/run/sas:/var/run/sas
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_arm=True --custom-var=checkout_arm64=True'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Electron
|
- name: Checkout Electron
|
||||||
|
|||||||
4
.github/workflows/macos-publish.yml
vendored
4
.github/workflows/macos-publish.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'bc2f48b2415a670de18d13605b1cf0eb5fdbaae1'
|
default: '424eedbf277ad9749ffa9219068aa72ed4a5e373'
|
||||||
required: true
|
required: true
|
||||||
upload-to-storage:
|
upload-to-storage:
|
||||||
description: 'Uploads to Azure storage'
|
description: 'Uploads to Azure storage'
|
||||||
@@ -28,6 +28,7 @@ jobs:
|
|||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
- /var/run/sas:/var/run/sas
|
- /var/run/sas:/var/run/sas
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_mac=True --custom-var=host_os=mac'
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Electron
|
- name: Checkout Electron
|
||||||
@@ -39,6 +40,7 @@ jobs:
|
|||||||
uses: ./src/electron/.github/actions/checkout
|
uses: ./src/electron/.github/actions/checkout
|
||||||
with:
|
with:
|
||||||
generate-sas-token: 'true'
|
generate-sas-token: 'true'
|
||||||
|
target-platform: macos
|
||||||
|
|
||||||
publish-x64-darwin:
|
publish-x64-darwin:
|
||||||
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ on:
|
|||||||
default: false
|
default: false
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-build-and-test-and-nan-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref }}
|
group: electron-build-and-test-and-nan-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build:
|
||||||
|
|||||||
@@ -56,8 +56,8 @@ on:
|
|||||||
default: false
|
default: false
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-build-and-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref }}
|
group: electron-build-and-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|||||||
12
.github/workflows/pipeline-electron-lint.yml
vendored
12
.github/workflows/pipeline-electron-lint.yml
vendored
@@ -9,8 +9,11 @@ on:
|
|||||||
type: string
|
type: string
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-lint-${{ github.ref }}
|
group: electron-lint-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
@@ -27,6 +30,8 @@ jobs:
|
|||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
|
- name: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
- name: Setup third_party Depot Tools
|
- name: Setup third_party Depot Tools
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -56,6 +61,9 @@ jobs:
|
|||||||
curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/buildtools/DEPS?format=TEXT" | base64 -d > src/buildtools/DEPS
|
curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/buildtools/DEPS?format=TEXT" | base64 -d > src/buildtools/DEPS
|
||||||
|
|
||||||
gclient sync --spec="solutions=[{'name':'src/buildtools','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':True},'managed':False}]"
|
gclient sync --spec="solutions=[{'name':'src/buildtools','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':True},'managed':False}]"
|
||||||
|
- name: Add ESLint problem matcher
|
||||||
|
shell: bash
|
||||||
|
run: echo "::add-matcher::src/electron/.github/problem-matchers/eslint-stylish.json"
|
||||||
- name: Run Lint
|
- name: Run Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ on:
|
|||||||
required: true
|
required: true
|
||||||
target-arch:
|
target-arch:
|
||||||
type: string
|
type: string
|
||||||
description: 'Arch to build for, can be x64, arm64 or arm'
|
description: 'Arch to build for, can be x64, arm64, ia32 or arm'
|
||||||
required: true
|
required: true
|
||||||
target-variant:
|
target-variant:
|
||||||
type: string
|
type: string
|
||||||
@@ -61,10 +61,12 @@ on:
|
|||||||
|
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-build-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.target-variant }}-${{ inputs.is-asan }}-${{ github.ref }}
|
group: electron-build-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.target-variant }}-${{ inputs.is-asan }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
CHROMIUM_GIT_COOKIE_WINDOWS_STRING: ${{ secrets.CHROMIUM_GIT_COOKIE_WINDOWS_STRING }}
|
||||||
ELECTRON_ARTIFACTS_BLOB_STORAGE: ${{ secrets.ELECTRON_ARTIFACTS_BLOB_STORAGE }}
|
ELECTRON_ARTIFACTS_BLOB_STORAGE: ${{ secrets.ELECTRON_ARTIFACTS_BLOB_STORAGE }}
|
||||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||||
SUDOWOODO_EXCHANGE_URL: ${{ secrets.SUDOWOODO_EXCHANGE_URL }}
|
SUDOWOODO_EXCHANGE_URL: ${{ secrets.SUDOWOODO_EXCHANGE_URL }}
|
||||||
@@ -102,7 +104,7 @@ jobs:
|
|||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
|
||||||
with:
|
with:
|
||||||
node-version: 20.11.x
|
node-version: 20.19.x
|
||||||
cache: yarn
|
cache: yarn
|
||||||
cache-dependency-path: src/electron/yarn.lock
|
cache-dependency-path: src/electron/yarn.lock
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
@@ -125,24 +127,10 @@ jobs:
|
|||||||
GN_EXTRA_ARGS='is_asan=true'
|
GN_EXTRA_ARGS='is_asan=true'
|
||||||
fi
|
fi
|
||||||
echo "GN_EXTRA_ARGS=$GN_EXTRA_ARGS" >> $GITHUB_ENV
|
echo "GN_EXTRA_ARGS=$GN_EXTRA_ARGS" >> $GITHUB_ENV
|
||||||
- name: Get Depot Tools
|
- name: Set Chromium Git Cookie
|
||||||
timeout-minutes: 5
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
run: |
|
- name: Install Build Tools
|
||||||
git clone --filter=tree:0 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
uses: ./src/electron/.github/actions/install-build-tools
|
||||||
|
|
||||||
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
|
|
||||||
touch .disable_auto_update
|
|
||||||
- name: Add Depot Tools to PATH
|
|
||||||
run: echo "$(pwd)/depot_tools" >> $GITHUB_PATH
|
|
||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
@@ -150,24 +138,26 @@ jobs:
|
|||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
- name: Restore src cache via AZCopy
|
- name: Restore src cache via AZCopy
|
||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform != 'linux' }}
|
||||||
uses: ./src/electron/.github/actions/restore-cache-azcopy
|
uses: ./src/electron/.github/actions/restore-cache-azcopy
|
||||||
|
with:
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
- name: Restore src cache via AKS
|
- name: Restore src cache via AKS
|
||||||
if: ${{ inputs.target-platform == 'linux' }}
|
if: ${{ inputs.target-platform == 'linux' }}
|
||||||
uses: ./src/electron/.github/actions/restore-cache-aks
|
uses: ./src/electron/.github/actions/restore-cache-aks
|
||||||
- name: Checkout src via gclient sync
|
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
|
||||||
uses: ./src/electron/.github/actions/checkout
|
|
||||||
with:
|
|
||||||
use-cache: 'false'
|
|
||||||
- name: Checkout Electron
|
- name: Checkout Electron
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
with:
|
with:
|
||||||
path: src/electron
|
path: src/electron
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install Build Tools
|
- name: Fix Sync
|
||||||
uses: ./src/electron/.github/actions/install-build-tools
|
if: ${{ inputs.target-platform != 'linux' }}
|
||||||
|
uses: ./src/electron/.github/actions/fix-sync
|
||||||
|
with:
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
env:
|
||||||
|
ELECTRON_DEPOT_TOOLS_DISABLE_LOG: true
|
||||||
- name: Init Build Tools
|
- name: Init Build Tools
|
||||||
run: |
|
run: |
|
||||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }}
|
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }}
|
||||||
@@ -180,9 +170,6 @@ jobs:
|
|||||||
echo "DEPSHASH=$(cat src/electron/.depshash)" >> $GITHUB_ENV
|
echo "DEPSHASH=$(cat src/electron/.depshash)" >> $GITHUB_ENV
|
||||||
- name: Add CHROMIUM_BUILDTOOLS_PATH to env
|
- name: Add CHROMIUM_BUILDTOOLS_PATH to env
|
||||||
run: echo "CHROMIUM_BUILDTOOLS_PATH=$(pwd)/src/buildtools" >> $GITHUB_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: Setup Number of Ninja Processes
|
- name: Setup Number of Ninja Processes
|
||||||
run: |
|
run: |
|
||||||
echo "NUMBER_OF_NINJA_PROCESSES=${{ inputs.target-platform != 'macos' && '300' || '200' }}" >> $GITHUB_ENV
|
echo "NUMBER_OF_NINJA_PROCESSES=${{ inputs.target-platform != 'macos' && '300' || '200' }}" >> $GITHUB_ENV
|
||||||
|
|||||||
@@ -65,7 +65,9 @@ jobs:
|
|||||||
sudo rm -rf $TMPDIR/del-target
|
sudo rm -rf $TMPDIR/del-target
|
||||||
- name: Check disk space after freeing up space
|
- name: Check disk space after freeing up space
|
||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
run: df -h
|
run: df -h
|
||||||
|
- name: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
- name: Install Build Tools
|
- name: Install Build Tools
|
||||||
uses: ./src/electron/.github/actions/install-build-tools
|
uses: ./src/electron/.github/actions/install-build-tools
|
||||||
- name: Enable windows toolchain
|
- name: Enable windows toolchain
|
||||||
@@ -81,9 +83,13 @@ jobs:
|
|||||||
- name: Restore src cache via AZCopy
|
- name: Restore src cache via AZCopy
|
||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
uses: ./src/electron/.github/actions/restore-cache-azcopy
|
uses: ./src/electron/.github/actions/restore-cache-azcopy
|
||||||
|
with:
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
- name: Restore src cache via AKS
|
- name: Restore src cache via AKS
|
||||||
if: ${{ inputs.target-platform == 'linux' || inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'linux' || inputs.target-platform == 'win' }}
|
||||||
uses: ./src/electron/.github/actions/restore-cache-aks
|
uses: ./src/electron/.github/actions/restore-cache-aks
|
||||||
|
with:
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
- name: Run Electron Only Hooks
|
- name: Run Electron Only Hooks
|
||||||
run: |
|
run: |
|
||||||
echo "solutions=[{'name':'src/electron','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':False},'managed':False}]" > tmpgclient
|
echo "solutions=[{'name':'src/electron','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':False},'managed':False}]" > tmpgclient
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ on:
|
|||||||
default: false
|
default: false
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref }}
|
group: electron-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
@@ -36,6 +36,8 @@ permissions:
|
|||||||
pull-requests: read
|
pull-requests: read
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
|
CHROMIUM_GIT_COOKIE_WINDOWS_STRING: ${{ secrets.CHROMIUM_GIT_COOKIE_WINDOWS_STRING }}
|
||||||
ELECTRON_OUT_DIR: Default
|
ELECTRON_OUT_DIR: Default
|
||||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||||
|
|
||||||
@@ -74,11 +76,12 @@ jobs:
|
|||||||
echo "C:\Program Files\Git\cmd" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
echo "C:\Program Files\Git\cmd" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
echo "C:\Program Files\Git\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
echo "C:\Program Files\Git\bin" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
echo "C:\Python311" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
echo "C:\Python311" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append
|
||||||
|
cp "C:\Python311\python.exe" "C:\Python311\python3.exe"
|
||||||
- name: Setup Node.js/npm
|
- name: Setup Node.js/npm
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
|
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af
|
||||||
with:
|
with:
|
||||||
node-version: 20.11.x
|
node-version: 20.19.x
|
||||||
- name: Add TCC permissions on macOS
|
- name: Add TCC permissions on macOS
|
||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
run: |
|
run: |
|
||||||
@@ -112,6 +115,9 @@ jobs:
|
|||||||
configure_sys_tccdb "$values"
|
configure_sys_tccdb "$values"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
- name: Turn off the unexpectedly quit dialog on macOS
|
||||||
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
|
run: defaults write com.apple.CrashReporter DialogType server
|
||||||
- name: Checkout Electron
|
- name: Checkout Electron
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
|
||||||
with:
|
with:
|
||||||
@@ -120,12 +126,17 @@ jobs:
|
|||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
|
- name: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
- name: Get Depot Tools
|
- name: Get Depot Tools
|
||||||
timeout-minutes: 5
|
timeout-minutes: 5
|
||||||
run: |
|
run: |
|
||||||
git config --global core.filemode false
|
git config --global core.filemode false
|
||||||
git config --global core.autocrlf false
|
git config --global core.autocrlf false
|
||||||
git config --global branch.autosetuprebase always
|
git config --global branch.autosetuprebase always
|
||||||
|
git config --global core.fscache true
|
||||||
|
git config --global core.longpaths true
|
||||||
|
git config --global core.preloadindex true
|
||||||
git clone --filter=tree:0 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
git clone --filter=tree:0 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
||||||
# Ensure depot_tools does not update.
|
# Ensure depot_tools does not update.
|
||||||
test -d depot_tools && cd depot_tools
|
test -d depot_tools && cd depot_tools
|
||||||
|
|||||||
@@ -27,10 +27,11 @@ on:
|
|||||||
default: testing
|
default: testing
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-node-nan-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref }}
|
group: electron-node-nan-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref != 'refs/heads/main' && !endsWith(github.ref, '-x-y') }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
env:
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
ELECTRON_OUT_DIR: Default
|
ELECTRON_OUT_DIR: Default
|
||||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||||
|
|
||||||
@@ -38,7 +39,7 @@ jobs:
|
|||||||
node-tests:
|
node-tests:
|
||||||
name: Run Node.js Tests
|
name: Run Node.js Tests
|
||||||
runs-on: electron-arc-linux-amd64-8core
|
runs-on: electron-arc-linux-amd64-8core
|
||||||
timeout-minutes: 20
|
timeout-minutes: 30
|
||||||
env:
|
env:
|
||||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||||
BUILD_TYPE: linux
|
BUILD_TYPE: linux
|
||||||
@@ -50,6 +51,8 @@ jobs:
|
|||||||
path: src/electron
|
path: src/electron
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
- name: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
- name: Install Build Tools
|
- name: Install Build Tools
|
||||||
uses: ./src/electron/.github/actions/install-build-tools
|
uses: ./src/electron/.github/actions/install-build-tools
|
||||||
- name: Init Build Tools
|
- name: Init Build Tools
|
||||||
@@ -57,15 +60,6 @@ jobs:
|
|||||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }}
|
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }} --import ${{ inputs.gn-build-type }} --target-cpu ${{ inputs.target-arch }}
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
- name: Get Depot Tools
|
|
||||||
timeout-minutes: 5
|
|
||||||
run: |
|
|
||||||
git clone --filter=tree:0 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
|
||||||
# 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
|
- name: Download Generated Artifacts
|
||||||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
|
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
|
||||||
with:
|
with:
|
||||||
@@ -99,7 +93,7 @@ jobs:
|
|||||||
nan-tests:
|
nan-tests:
|
||||||
name: Run Nan Tests
|
name: Run Nan Tests
|
||||||
runs-on: electron-arc-linux-amd64-4core
|
runs-on: electron-arc-linux-amd64-4core
|
||||||
timeout-minutes: 20
|
timeout-minutes: 30
|
||||||
env:
|
env:
|
||||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||||
BUILD_TYPE: linux
|
BUILD_TYPE: linux
|
||||||
@@ -111,6 +105,8 @@ jobs:
|
|||||||
path: src/electron
|
path: src/electron
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
- name: Set Chromium Git Cookie
|
||||||
|
uses: ./src/electron/.github/actions/set-chromium-cookie
|
||||||
- name: Install Build Tools
|
- name: Install Build Tools
|
||||||
uses: ./src/electron/.github/actions/install-build-tools
|
uses: ./src/electron/.github/actions/install-build-tools
|
||||||
- name: Init Build Tools
|
- name: Init Build Tools
|
||||||
@@ -118,15 +114,6 @@ jobs:
|
|||||||
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }}
|
e init -f --root=$(pwd) --out=Default ${{ inputs.gn-build-type }}
|
||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
- name: Get Depot Tools
|
|
||||||
timeout-minutes: 5
|
|
||||||
run: |
|
|
||||||
git clone --filter=tree:0 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
|
||||||
# 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
|
- name: Download Generated Artifacts
|
||||||
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
|
uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16
|
||||||
with:
|
with:
|
||||||
|
|||||||
4
.github/workflows/pull-request-labeled.yml
vendored
4
.github/workflows/pull-request-labeled.yml
vendored
@@ -15,12 +15,12 @@ jobs:
|
|||||||
- name: Trigger Slack workflow
|
- name: Trigger Slack workflow
|
||||||
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
|
uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0
|
||||||
with:
|
with:
|
||||||
|
webhook: ${{ secrets.BACKPORT_REQUESTED_SLACK_WEBHOOK_URL }}
|
||||||
|
webhook-type: webhook-trigger
|
||||||
payload: |
|
payload: |
|
||||||
{
|
{
|
||||||
"url": "${{ github.event.pull_request.html_url }}"
|
"url": "${{ github.event.pull_request.html_url }}"
|
||||||
}
|
}
|
||||||
env:
|
|
||||||
SLACK_WEBHOOK_URL: ${{ secrets.BACKPORT_REQUESTED_SLACK_WEBHOOK_URL }}
|
|
||||||
pull-request-labeled-deprecation-review-complete:
|
pull-request-labeled-deprecation-review-complete:
|
||||||
name: deprecation-review/complete label added
|
name: deprecation-review/complete label added
|
||||||
if: github.event.label.name == 'deprecation-review/complete ✅'
|
if: github.event.label.name == 'deprecation-review/complete ✅'
|
||||||
|
|||||||
78
.github/workflows/update_appveyor_image.yml
vendored
78
.github/workflows/update_appveyor_image.yml
vendored
@@ -1,78 +0,0 @@
|
|||||||
name: Update AppVeyor Image
|
|
||||||
|
|
||||||
# Run chron daily Mon-Fri
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 8 * * 1-5' # runs 8:00 every business day (see https://crontab.guru)
|
|
||||||
|
|
||||||
permissions: {}
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
bake-appveyor-image:
|
|
||||||
name: Bake AppVeyor Image
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Generate GitHub App token
|
|
||||||
uses: electron/github-app-auth-action@384fd19694fe7b6dcc9a684746c6976ad78228ae # v1.1.1
|
|
||||||
id: generate-token
|
|
||||||
with:
|
|
||||||
creds: ${{ secrets.APPVEYOR_UPDATER_GH_APP_CREDS }}
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0
|
|
||||||
with:
|
|
||||||
node-version: 20.11.x
|
|
||||||
- name: Yarn install
|
|
||||||
run: |
|
|
||||||
node script/yarn.js install --frozen-lockfile
|
|
||||||
- name: Set Repo for Commit
|
|
||||||
run: git config --global --add safe.directory $GITHUB_WORKSPACE
|
|
||||||
- name: Check AppVeyor Image
|
|
||||||
env:
|
|
||||||
APPVEYOR_TOKEN: ${{ secrets.APPVEYOR_TOKEN }}
|
|
||||||
run: |
|
|
||||||
node ./script/prepare-appveyor
|
|
||||||
if [ -f ./image_version.txt ]; then
|
|
||||||
echo "APPVEYOR_IMAGE_VERSION="$(cat image_version.txt)"" >> $GITHUB_ENV
|
|
||||||
rm image_version.txt
|
|
||||||
fi
|
|
||||||
- name: (Optionally) Update Appveyor Image
|
|
||||||
if: ${{ env.APPVEYOR_IMAGE_VERSION }}
|
|
||||||
uses: mikefarah/yq@4839dbbf80445070a31c7a9c1055da527db2d5ee # v4.44.6
|
|
||||||
with:
|
|
||||||
cmd: |
|
|
||||||
yq '.image = "${{ env.APPVEYOR_IMAGE_VERSION }}"' "appveyor.yml" > "appveyor2.yml"
|
|
||||||
yq '.image = "${{ env.APPVEYOR_IMAGE_VERSION }}"' "appveyor-woa.yml" > "appveyor-woa2.yml"
|
|
||||||
- name: (Optionally) Generate Commit Diff
|
|
||||||
if: ${{ env.APPVEYOR_IMAGE_VERSION }}
|
|
||||||
run: |
|
|
||||||
diff -w -B appveyor.yml appveyor2.yml > appveyor.diff || true
|
|
||||||
patch -f appveyor.yml < appveyor.diff
|
|
||||||
rm appveyor2.yml appveyor.diff
|
|
||||||
git add appveyor.yml
|
|
||||||
- name: (Optionally) Generate Commit Diff for WOA
|
|
||||||
if: ${{ env.APPVEYOR_IMAGE_VERSION }}
|
|
||||||
run: |
|
|
||||||
diff -w -B appveyor-woa.yml appveyor-woa2.yml > appveyor-woa.diff || true
|
|
||||||
patch -f appveyor-woa.yml < appveyor-woa.diff
|
|
||||||
rm appveyor-woa2.yml appveyor-woa.diff
|
|
||||||
git add appveyor-woa.yml
|
|
||||||
- name: (Optionally) Commit to Branch
|
|
||||||
if: ${{ env.APPVEYOR_IMAGE_VERSION }}
|
|
||||||
uses: dsanders11/github-app-commit-action@43de6da2f4d927e997c0784c7a0b61bd19ad6aac # v1.5.0
|
|
||||||
with:
|
|
||||||
message: 'build: update appveyor image to latest version'
|
|
||||||
ref: bump-appveyor-image
|
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
|
||||||
- name: (Optionally) Create Pull Request
|
|
||||||
if: ${{ env.APPVEYOR_IMAGE_VERSION }}
|
|
||||||
run: |
|
|
||||||
printf "This PR updates appveyor.yml to the latest baked image, ${{ env.APPVEYOR_IMAGE_VERSION }}.\n\nNotes: none" | gh pr create --head bump-appveyor-image --label no-backport --label semver/none --title 'build: update appveyor image to latest version' --body-file=-
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
|
||||||
89
.github/workflows/windows-publish.yml
vendored
Normal file
89
.github/workflows/windows-publish.yml
vendored
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
name: Publish Windows
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
build-image-sha:
|
||||||
|
type: string
|
||||||
|
description: 'SHA for electron/build image'
|
||||||
|
default: '424eedbf277ad9749ffa9219068aa72ed4a5e373'
|
||||||
|
required: true
|
||||||
|
upload-to-storage:
|
||||||
|
description: 'Uploads to Azure storage'
|
||||||
|
required: false
|
||||||
|
default: '1'
|
||||||
|
type: string
|
||||||
|
run-windows-publish:
|
||||||
|
description: 'Run the publish jobs vs just the build jobs'
|
||||||
|
type: boolean
|
||||||
|
default: false
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
checkout-windows:
|
||||||
|
runs-on: electron-arc-linux-amd64-32core
|
||||||
|
container:
|
||||||
|
image: ghcr.io/electron/build:${{ inputs.build-image-sha }}
|
||||||
|
options: --user root --device /dev/fuse --cap-add SYS_ADMIN
|
||||||
|
volumes:
|
||||||
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
|
- /var/run/sas:/var/run/sas
|
||||||
|
env:
|
||||||
|
CHROMIUM_GIT_COOKIE_WINDOWS_STRING: ${{ secrets.CHROMIUM_GIT_COOKIE_WINDOWS_STRING }}
|
||||||
|
GCLIENT_EXTRA_ARGS: '--custom-var=checkout_win=True'
|
||||||
|
TARGET_OS: 'win'
|
||||||
|
ELECTRON_DEPOT_TOOLS_WIN_TOOLCHAIN: '1'
|
||||||
|
outputs:
|
||||||
|
build-image-sha: ${{ inputs.build-image-sha }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout Electron
|
||||||
|
uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29
|
||||||
|
with:
|
||||||
|
path: src/electron
|
||||||
|
fetch-depth: 0
|
||||||
|
- name: Checkout & Sync & Save
|
||||||
|
uses: ./src/electron/.github/actions/checkout
|
||||||
|
with:
|
||||||
|
generate-sas-token: 'true'
|
||||||
|
target-platform: win
|
||||||
|
|
||||||
|
publish-x64-win:
|
||||||
|
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||||
|
needs: checkout-windows
|
||||||
|
with:
|
||||||
|
environment: production-release
|
||||||
|
build-runs-on: electron-arc-windows-amd64-16core
|
||||||
|
target-platform: win
|
||||||
|
target-arch: x64
|
||||||
|
is-release: true
|
||||||
|
gn-build-type: release
|
||||||
|
generate-symbols: true
|
||||||
|
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
publish-arm64-win:
|
||||||
|
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||||
|
needs: checkout-windows
|
||||||
|
with:
|
||||||
|
environment: production-release
|
||||||
|
build-runs-on: electron-arc-windows-amd64-16core
|
||||||
|
target-platform: win
|
||||||
|
target-arch: arm64
|
||||||
|
is-release: true
|
||||||
|
gn-build-type: release
|
||||||
|
generate-symbols: true
|
||||||
|
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
|
publish-x86-win:
|
||||||
|
uses: ./.github/workflows/pipeline-segment-electron-build.yml
|
||||||
|
needs: checkout-windows
|
||||||
|
with:
|
||||||
|
environment: production-release
|
||||||
|
build-runs-on: electron-arc-windows-amd64-16core
|
||||||
|
target-platform: win
|
||||||
|
target-arch: x86
|
||||||
|
is-release: true
|
||||||
|
gn-build-type: release
|
||||||
|
generate-symbols: true
|
||||||
|
upload-to-storage: ${{ inputs.upload-to-storage }}
|
||||||
|
secrets: inherit
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"config": {
|
"config": {
|
||||||
"extends": "@electron/lint-roller/configs/markdownlint.json",
|
"extends": "@electron/lint-roller/configs/markdownlint.json",
|
||||||
|
"descriptive-link-text": false,
|
||||||
"link-image-style": {
|
"link-image-style": {
|
||||||
"autolink": false,
|
"autolink": false,
|
||||||
"shortcut": false
|
"shortcut": false
|
||||||
@@ -26,6 +27,6 @@
|
|||||||
"no-newline-in-links": true
|
"no-newline-in-links": true
|
||||||
},
|
},
|
||||||
"customRules": [
|
"customRules": [
|
||||||
"@electron/lint-roller/markdownlint-rules/"
|
"./node_modules/@electron/lint-roller/markdownlint-rules/index.mjs"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
16
BUILD.gn
16
BUILD.gn
@@ -224,11 +224,21 @@ webpack_build("electron_utility_bundle") {
|
|||||||
out_file = "$target_gen_dir/js2c/utility_init.js"
|
out_file = "$target_gen_dir/js2c/utility_init.js"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
webpack_build("electron_preload_realm_bundle") {
|
||||||
|
deps = [ ":build_electron_definitions" ]
|
||||||
|
|
||||||
|
inputs = auto_filenames.preload_realm_bundle_deps
|
||||||
|
|
||||||
|
config_file = "//electron/build/webpack/webpack.config.preload_realm.js"
|
||||||
|
out_file = "$target_gen_dir/js2c/preload_realm_bundle.js"
|
||||||
|
}
|
||||||
|
|
||||||
action("electron_js2c") {
|
action("electron_js2c") {
|
||||||
deps = [
|
deps = [
|
||||||
":electron_browser_bundle",
|
":electron_browser_bundle",
|
||||||
":electron_isolated_renderer_bundle",
|
":electron_isolated_renderer_bundle",
|
||||||
":electron_node_bundle",
|
":electron_node_bundle",
|
||||||
|
":electron_preload_realm_bundle",
|
||||||
":electron_renderer_bundle",
|
":electron_renderer_bundle",
|
||||||
":electron_sandboxed_renderer_bundle",
|
":electron_sandboxed_renderer_bundle",
|
||||||
":electron_utility_bundle",
|
":electron_utility_bundle",
|
||||||
@@ -240,6 +250,7 @@ action("electron_js2c") {
|
|||||||
"$target_gen_dir/js2c/browser_init.js",
|
"$target_gen_dir/js2c/browser_init.js",
|
||||||
"$target_gen_dir/js2c/isolated_bundle.js",
|
"$target_gen_dir/js2c/isolated_bundle.js",
|
||||||
"$target_gen_dir/js2c/node_init.js",
|
"$target_gen_dir/js2c/node_init.js",
|
||||||
|
"$target_gen_dir/js2c/preload_realm_bundle.js",
|
||||||
"$target_gen_dir/js2c/renderer_init.js",
|
"$target_gen_dir/js2c/renderer_init.js",
|
||||||
"$target_gen_dir/js2c/sandbox_bundle.js",
|
"$target_gen_dir/js2c/sandbox_bundle.js",
|
||||||
"$target_gen_dir/js2c/utility_init.js",
|
"$target_gen_dir/js2c/utility_init.js",
|
||||||
@@ -430,6 +441,7 @@ source_set("electron_lib") {
|
|||||||
"chromium_src:chrome_spellchecker",
|
"chromium_src:chrome_spellchecker",
|
||||||
"shell/common:mojo",
|
"shell/common:mojo",
|
||||||
"shell/common:plugin",
|
"shell/common:plugin",
|
||||||
|
"shell/common:web_contents_utility",
|
||||||
"shell/services/node/public/mojom",
|
"shell/services/node/public/mojom",
|
||||||
"//base:base_static",
|
"//base:base_static",
|
||||||
"//base/allocator:buildflags",
|
"//base/allocator:buildflags",
|
||||||
@@ -658,6 +670,8 @@ source_set("electron_lib") {
|
|||||||
sources += [
|
sources += [
|
||||||
"shell/browser/certificate_manager_model.cc",
|
"shell/browser/certificate_manager_model.cc",
|
||||||
"shell/browser/certificate_manager_model.h",
|
"shell/browser/certificate_manager_model.h",
|
||||||
|
"shell/browser/linux/x11_util.cc",
|
||||||
|
"shell/browser/linux/x11_util.h",
|
||||||
"shell/browser/ui/gtk_util.cc",
|
"shell/browser/ui/gtk_util.cc",
|
||||||
"shell/browser/ui/gtk_util.h",
|
"shell/browser/ui/gtk_util.h",
|
||||||
]
|
]
|
||||||
@@ -1234,7 +1248,7 @@ if (is_mac) {
|
|||||||
"//components/crash/core/app:run_as_crashpad_handler",
|
"//components/crash/core/app:run_as_crashpad_handler",
|
||||||
]
|
]
|
||||||
|
|
||||||
ldflags = []
|
ldflags = [ "/DELAYLOAD:ffmpeg.dll" ]
|
||||||
|
|
||||||
libs = [
|
libs = [
|
||||||
"comctl32.lib",
|
"comctl32.lib",
|
||||||
|
|||||||
6
DEPS
6
DEPS
@@ -2,9 +2,9 @@ gclient_gn_args_from = 'src'
|
|||||||
|
|
||||||
vars = {
|
vars = {
|
||||||
'chromium_version':
|
'chromium_version':
|
||||||
'133.0.6920.0',
|
'134.0.6998.205',
|
||||||
'node_version':
|
'node_version':
|
||||||
'v22.9.0',
|
'v22.16.0',
|
||||||
'nan_version':
|
'nan_version':
|
||||||
'e14bdcd1f72d62bca1d541b66da43130384ec213',
|
'e14bdcd1f72d62bca1d541b66da43130384ec213',
|
||||||
'squirrel.mac_version':
|
'squirrel.mac_version':
|
||||||
@@ -31,7 +31,7 @@ vars = {
|
|||||||
'sysroots_json_path': 'electron/script/sysroots.json',
|
'sysroots_json_path': 'electron/script/sysroots.json',
|
||||||
|
|
||||||
# KEEP IN SYNC WITH utils.js FILE
|
# KEEP IN SYNC WITH utils.js FILE
|
||||||
'yarn_version': '1.15.2',
|
'yarn_version': '1.22.22',
|
||||||
|
|
||||||
# To be able to build clean Chromium from sources.
|
# To be able to build clean Chromium from sources.
|
||||||
'apply_patches': True,
|
'apply_patches': True,
|
||||||
|
|||||||
@@ -1,107 +0,0 @@
|
|||||||
# The config is used to bake appveyor images, not for running CI jobs.
|
|
||||||
# The config expects the following environment variables to be set:
|
|
||||||
# - "APPVEYOR_BAKE_IMAGE" e.g. 'electron-99.0.4767.0'. Name of the image to be baked.
|
|
||||||
# Typically named after the Chromium version on which the image is built.
|
|
||||||
# This can be set dynamically in the prepare-appveyor script.
|
|
||||||
|
|
||||||
version: 1.0.{build}
|
|
||||||
build_cloud: electronhq-16-core
|
|
||||||
image: base-bake-image
|
|
||||||
environment:
|
|
||||||
GIT_CACHE_PATH: C:\Users\appveyor\libcc_cache
|
|
||||||
ELECTRON_OUT_DIR: Default
|
|
||||||
ELECTRON_ENABLE_STACK_DUMPING: 1
|
|
||||||
MOCHA_REPORTER: mocha-multi-reporters
|
|
||||||
MOCHA_MULTI_REPORTERS: mocha-appveyor-reporter, tap
|
|
||||||
DEPOT_TOOLS_WIN_TOOLCHAIN: 0
|
|
||||||
PYTHONIOENCODING: UTF-8
|
|
||||||
|
|
||||||
# The following lines are needed when baking from a completely new image (eg MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest via image: base-windows-server2019)
|
|
||||||
# init:
|
|
||||||
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
# - appveyor version
|
|
||||||
# - ps: $ErrorActionPreference = 'Stop'
|
|
||||||
# - ps: 'Write-Host "OS Build: $((Get-CimInstance Win32_OperatingSystem).BuildNumber)"'
|
|
||||||
|
|
||||||
# clone_folder: '%USERPROFILE%\image-bake-scripts'
|
|
||||||
|
|
||||||
# clone_script:
|
|
||||||
# - ps: Invoke-WebRequest "https://github.com/appveyor/build-images/archive/1f90d94e74c8243c909a09b994e527584dfcb838.zip" -OutFile "$env:temp\scripts.zip"
|
|
||||||
# - ps: Expand-Archive -Path "$env:temp\scripts.zip" -DestinationPath "$env:temp\scripts" -Force
|
|
||||||
# - ps: Copy-Item -Path "$env:temp\scripts\build-images-1f90d94e74c8243c909a09b994e527584dfcb838\scripts\Windows\*" -Destination $env:APPVEYOR_BUILD_FOLDER -Recurse
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
# The following lines are needed when baking from a completely new image (eg MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest via image: base-windows-server2019)
|
|
||||||
# - ps: .\init_server.ps1
|
|
||||||
# - ps: .\extend_system_volume.ps1
|
|
||||||
|
|
||||||
# # Restart VM
|
|
||||||
# - ps: Start-Sleep -s 5; Restart-Computer
|
|
||||||
# - ps: Start-Sleep -s 5
|
|
||||||
|
|
||||||
# - appveyor version
|
|
||||||
# - ps: .\install_path_utils.ps1
|
|
||||||
# - ps: .\install_powershell_core.ps1
|
|
||||||
# - ps: .\install_powershell_get.ps1
|
|
||||||
# - ps: .\install_7zip.ps1
|
|
||||||
# - ps: .\install_chocolatey.ps1
|
|
||||||
# - ps: .\install_webpi.ps1
|
|
||||||
# - ps: .\install_nuget.ps1
|
|
||||||
# - ps: .\install_pstools.ps1
|
|
||||||
|
|
||||||
# - ps: .\install_git.ps1
|
|
||||||
# - ps: .\install_git_lfs.ps1
|
|
||||||
|
|
||||||
# # Restart VM
|
|
||||||
# - ps: Start-Sleep -s 5; Restart-Computer
|
|
||||||
# - ps: Start-Sleep -s 5
|
|
||||||
# END LINES FOR COMPLETELY NEW IMAGE
|
|
||||||
|
|
||||||
- git config --global core.longpaths true
|
|
||||||
- ps: >-
|
|
||||||
if (-not (Test-Path -Path C:\projects\src)) {
|
|
||||||
New-Item -Path C:\projects\src -ItemType Directory
|
|
||||||
}
|
|
||||||
- cd C:\projects\
|
|
||||||
- git clone -q --branch=%APPVEYOR_REPO_BRANCH% https://github.com/electron/electron.git C:\projects\src\electron
|
|
||||||
- git clone --depth=1 https://chromium.googlesource.com/chromium/tools/depot_tools.git
|
|
||||||
- ps: $env:PATH="$pwd\depot_tools;$env:PATH"
|
|
||||||
- update_depot_tools.bat
|
|
||||||
# Uncomment the following line if windows deps change
|
|
||||||
- src\electron\script\setup-win-for-dev.bat
|
|
||||||
- >-
|
|
||||||
gclient config
|
|
||||||
--name "src\electron"
|
|
||||||
--unmanaged
|
|
||||||
%GCLIENT_EXTRA_ARGS%
|
|
||||||
"https://github.com/electron/electron"
|
|
||||||
- ps: cd src\electron
|
|
||||||
- ps: node script\generate-deps-hash.js
|
|
||||||
- ps: $depshash = Get-Content .\.depshash -Raw
|
|
||||||
- ps: Copy-Item -path .\.depshash -destination ..\.depshash
|
|
||||||
- ps: cd ..\..
|
|
||||||
- gclient sync --with_branch_heads --with_tags --nohooks
|
|
||||||
- ps: regsvr32 /s "C:\Program Files\Microsoft Visual Studio\2022\Community\DIA SDK\bin\amd64\msdia140.dll"
|
|
||||||
- ps: set vs2022_install="C:\Program Files\Microsoft Visual Studio\2022\Community"
|
|
||||||
|
|
||||||
# The following lines are needed when baking from a completely new image (eg MicrosoftWindowsServer:WindowsServer:2019-Datacenter:latest via image: base-windows-server2019)
|
|
||||||
# # Restart VM
|
|
||||||
# - ps: Start-Sleep -s 5; Restart-Computer
|
|
||||||
# - ps: Start-Sleep -s 5
|
|
||||||
|
|
||||||
# - cd %USERPROFILE%\image-bake-scripts
|
|
||||||
# - appveyor version
|
|
||||||
# - ps: .\optimize_dotnet_runtime.ps1
|
|
||||||
# - ps: .\disable_windows_background_services.ps1
|
|
||||||
# - ps: .\enforce_windows_firewall.ps1
|
|
||||||
# - ps: .\cleanup_windows.ps1
|
|
||||||
# END LINES FOR COMPLETELY NEW IMAGE
|
|
||||||
on_image_bake:
|
|
||||||
- ps: >-
|
|
||||||
echo "Baking image: $env:APPVEYOR_BAKE_IMAGE at dir $PWD"
|
|
||||||
- ps: Remove-Item -Recurse -Force C:\projects\depot_tools
|
|
||||||
- ps: Remove-Item -Recurse -Force C:\projects\src\electron
|
|
||||||
# Uncomment these lines and set APPVEYOR_RDP_PASSWORD in project settings to enable RDP after bake is done
|
|
||||||
# # on_finish:
|
|
||||||
# - ps: >-
|
|
||||||
# $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
352
appveyor-woa.yml
352
appveyor-woa.yml
@@ -1,352 +0,0 @@
|
|||||||
# NOTE IF CHANGING THIS FILE, ALSO APPLY THE CHANGE TO appveyor.yml
|
|
||||||
# IF APPLICABLE!!!!
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# The config expects the following environment variables to be set:
|
|
||||||
# - "GN_CONFIG" Build type. One of {'testing', 'release'}.
|
|
||||||
# - "GN_EXTRA_ARGS" Additional gn arguments for a build config,
|
|
||||||
# e.g. 'target_cpu="x86"' to build for a 32bit platform.
|
|
||||||
# https://gn.googlesource.com/gn/+/main/docs/reference.md#var_target_cpu
|
|
||||||
# Don't forget to set up "NPM_CONFIG_ARCH" and "TARGET_ARCH" accordingly
|
|
||||||
# if you pass a custom value for 'target_cpu'.
|
|
||||||
# - "ELECTRON_RELEASE" Set it to '1' upload binaries on success.
|
|
||||||
# - "NPM_CONFIG_ARCH" E.g. 'x86'. Is used to build native Node.js modules.
|
|
||||||
# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "TARGET_ARCH" value.
|
|
||||||
# - "TARGET_ARCH" Choose from {'ia32', 'x64', 'arm', 'arm64'}.
|
|
||||||
# Is used in some publishing scripts, but does NOT affect the Electron binary.
|
|
||||||
# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "NPM_CONFIG_ARCH" value.
|
|
||||||
# - "UPLOAD_TO_STORAGE" Set it to '1' upload a release to the Azure bucket.
|
|
||||||
# Otherwise the release will be uploaded to the GitHub Releases.
|
|
||||||
# (The value is only checked if "ELECTRON_RELEASE" is defined.)
|
|
||||||
#
|
|
||||||
# The publishing scripts expect access tokens to be defined as env vars,
|
|
||||||
# but those are not covered here.
|
|
||||||
#
|
|
||||||
# AppVeyor docs on variables:
|
|
||||||
# https://www.appveyor.com/docs/environment-variables/
|
|
||||||
# https://www.appveyor.com/docs/build-configuration/#secure-variables
|
|
||||||
# https://www.appveyor.com/docs/build-configuration/#custom-environment-variables
|
|
||||||
|
|
||||||
version: 1.0.{build}
|
|
||||||
build_cloud: electronhq-16-core
|
|
||||||
image: e-133.0.6878.0
|
|
||||||
environment:
|
|
||||||
GIT_CACHE_PATH: C:\Users\appveyor\libcc_cache
|
|
||||||
ELECTRON_OUT_DIR: Default
|
|
||||||
ELECTRON_ENABLE_STACK_DUMPING: 1
|
|
||||||
ELECTRON_ALSO_LOG_TO_STDERR: 1
|
|
||||||
MOCHA_REPORTER: mocha-multi-reporters
|
|
||||||
MOCHA_MULTI_REPORTERS: "@marshallofsound/mocha-appveyor-reporter, mocha-junit-reporter, tap"
|
|
||||||
DEPOT_TOOLS_WIN_TOOLCHAIN: 1
|
|
||||||
DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL: "https://dev-cdn.electronjs.org/windows-toolchains/_"
|
|
||||||
GYP_MSVS_HASH_7393122652: 3ba76c5c20
|
|
||||||
PYTHONIOENCODING: UTF-8
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
|
|
||||||
- job_name: Build Arm on X64 Windows
|
|
||||||
- job_name: Test On Windows On Arm Hardware 1
|
|
||||||
job_depends_on: Build Arm on X64 Windows
|
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: base-woa
|
|
||||||
APPVEYOR_BUILD_WORKER_CLOUD: electronhq-woa
|
|
||||||
shard: 1
|
|
||||||
- job_name: Test On Windows On Arm Hardware 2
|
|
||||||
job_depends_on: Build Arm on X64 Windows
|
|
||||||
APPVEYOR_BUILD_WORKER_IMAGE: base-woa
|
|
||||||
APPVEYOR_BUILD_WORKER_CLOUD: electronhq-woa
|
|
||||||
shard: 2
|
|
||||||
|
|
||||||
clone_script:
|
|
||||||
- ps: git clone -q $("--branch=" + $Env:APPVEYOR_REPO_BRANCH) $("https://github.com/" + $Env:APPVEYOR_REPO_NAME + ".git") $Env:APPVEYOR_BUILD_FOLDER
|
|
||||||
- ps: if (!$Env:APPVEYOR_PULL_REQUEST_NUMBER) {$("git checkout -qf " + $Env:APPVEYOR_REPO_COMMIT)}
|
|
||||||
- ps: if ($Env:APPVEYOR_PULL_REQUEST_NUMBER) {git fetch -q origin +refs/pull/$($Env:APPVEYOR_PULL_REQUEST_NUMBER)/head; git checkout -qf FETCH_HEAD}
|
|
||||||
|
|
||||||
clone_folder: C:\projects\src\electron
|
|
||||||
|
|
||||||
skip_branch_with_pr: true
|
|
||||||
|
|
||||||
# the first failed job cancels other jobs and fails entire build
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
for:
|
|
||||||
|
|
||||||
- matrix:
|
|
||||||
only:
|
|
||||||
- job_name: Build Arm on X64 Windows
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
# TODO: Remove --ignore-engines once WOA image is up to node 20
|
|
||||||
- ps: |
|
|
||||||
node script/yarn.js install --frozen-lockfile --ignore-engines
|
|
||||||
node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER
|
|
||||||
$env:SHOULD_SKIP_ARTIFACT_VALIDATION = "false"
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
|
||||||
Write-warning "Skipping build for doc-only change"
|
|
||||||
$env:SHOULD_SKIP_ARTIFACT_VALIDATION = "true"
|
|
||||||
Exit-AppveyorBuild
|
|
||||||
} else {
|
|
||||||
$global:LASTEXITCODE = 0
|
|
||||||
}
|
|
||||||
- cd ..
|
|
||||||
- ps: Write-Host "Building $env:GN_CONFIG build"
|
|
||||||
- git config --global core.longpaths true
|
|
||||||
- ps: >-
|
|
||||||
if (Test-Path -Path "$pwd\depot_tools") {
|
|
||||||
Remove-Item -Recurse -Force $pwd\depot_tools
|
|
||||||
}
|
|
||||||
- ps: >-
|
|
||||||
if (Test-Path -Path "$pwd\build-tools") {
|
|
||||||
Remove-Item -Recurse -Force $pwd\build-tools
|
|
||||||
}
|
|
||||||
- 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") {
|
|
||||||
Remove-Item -Recurse -Force $pwd\src\electron
|
|
||||||
}
|
|
||||||
- git clone https://github.com/electron/build-tools.git
|
|
||||||
- cd build-tools
|
|
||||||
- npx yarn --ignore-engines
|
|
||||||
- mkdir third_party
|
|
||||||
- ps: >-
|
|
||||||
node -e "require('./src/utils/reclient.js').downloadAndPrepare({})"
|
|
||||||
- ps: $env:RECLIENT_HELPER = node -p "require('./src/utils/reclient.js').helperPath({})"
|
|
||||||
- ps: >-
|
|
||||||
& $env:RECLIENT_HELPER login
|
|
||||||
- ps: >-
|
|
||||||
$env:RBE_service = node -e "console.log(require('./src/utils/reclient.js').serviceAddress)"
|
|
||||||
- ps: >-
|
|
||||||
$env:RBE_credentials_helper = $env:RECLIENT_HELPER
|
|
||||||
- ps: >-
|
|
||||||
$env:RBE_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"
|
|
||||||
}
|
|
||||||
- cd ..\..
|
|
||||||
- ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools"
|
|
||||||
- ps: >-
|
|
||||||
if ($env:GN_CONFIG -ne 'release') {
|
|
||||||
$env:NINJA_STATUS="[%r processes, %f/%t @ %o/s : %es] "
|
|
||||||
}
|
|
||||||
- gclient config --name "src\electron" --unmanaged %GCLIENT_EXTRA_ARGS% "https://github.com/electron/electron"
|
|
||||||
# Patches are applied in the image bake. Check depshash to see if patches have changed.
|
|
||||||
- ps: $env:RUN_GCLIENT_SYNC="false"
|
|
||||||
- ps: $depshash_baked = Get-Content .\src\.depshash -Raw
|
|
||||||
- ps: cd src\electron
|
|
||||||
- ps: node script\generate-deps-hash.js
|
|
||||||
- ps: $depshash = Get-Content .\.depshash -Raw
|
|
||||||
- ps: cd ..\..
|
|
||||||
- ps: >-
|
|
||||||
if ($depshash_baked -ne $depshash) {
|
|
||||||
$env:RUN_GCLIENT_SYNC="true"
|
|
||||||
}
|
|
||||||
- if "%RUN_GCLIENT_SYNC%"=="true" ( gclient sync --with_branch_heads --with_tags ) else ( gclient runhooks )
|
|
||||||
- cd src
|
|
||||||
- ps: $env:PATH="$pwd\third_party\ninja;$env:PATH"
|
|
||||||
- set BUILD_CONFIG_PATH=//electron/build/args/%GN_CONFIG%.gn
|
|
||||||
- gn gen out/Default "--args=import(\"%BUILD_CONFIG_PATH%\") use_remoteexec=true %GN_EXTRA_ARGS% "
|
|
||||||
- gn check out/Default //electron:electron_lib
|
|
||||||
- gn check out/Default //electron:electron_app
|
|
||||||
- gn check out/Default //electron/shell/common:mojo
|
|
||||||
- gn check out/Default //electron/shell/common:plugin
|
|
||||||
- autoninja -j 300 -C out/Default electron:electron_app
|
|
||||||
- if "%GN_CONFIG%"=="testing" ( python C:\depot_tools\post_build_ninja_summary.py -C out\Default )
|
|
||||||
- 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
|
|
||||||
- autoninja -C out/Default electron:electron_dist_zip
|
|
||||||
- gn desc out/Default v8:run_mksnapshot_default args > out/Default/default_mksnapshot_args
|
|
||||||
# Remove unused args from mksnapshot_args
|
|
||||||
- ps: >-
|
|
||||||
Get-Content out/Default/default_mksnapshot_args | Where-Object { -not $_.Contains('--turbo-profiling-input') -And -not $_.Contains('builtins-pgo') } | Set-Content out/Default/mksnapshot_args
|
|
||||||
- autoninja -C out/Default electron:electron_mksnapshot_zip
|
|
||||||
- cd out\Default
|
|
||||||
- 7z a mksnapshot.zip mksnapshot_args gen\v8\embedded.S
|
|
||||||
- cd ..\..
|
|
||||||
- autoninja -C out/Default electron:hunspell_dictionaries_zip
|
|
||||||
- autoninja -C out/Default electron:electron_chromedriver_zip
|
|
||||||
- autoninja -C out/Default electron:node_headers
|
|
||||||
- ps: >-
|
|
||||||
Get-CimInstance -Namespace root\cimv2 -Class Win32_product | Select vendor, description, @{l='install_location';e='InstallLocation'}, @{l='install_date';e='InstallDate'}, @{l='install_date_2';e='InstallDate2'}, caption, version, name, @{l='sku_number';e='SKUNumber'} | ConvertTo-Json | Out-File -Encoding utf8 -FilePath .\installed_software.json
|
|
||||||
- python3 electron/build/profile_toolchain.py --output-json=out/Default/windows_toolchain_profile.json
|
|
||||||
- 7z a node_headers.zip out\Default\gen\node_headers
|
|
||||||
- 7z a nan.zip third_party\nan
|
|
||||||
- ps: >-
|
|
||||||
if ($env:GN_CONFIG -eq 'release') {
|
|
||||||
# Needed for msdia140.dll on 64-bit windows
|
|
||||||
$env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin"
|
|
||||||
}
|
|
||||||
- if "%GN_CONFIG%"=="release" ( autoninja -C out/Default electron:electron_symbols )
|
|
||||||
- ps: >-
|
|
||||||
if ($env:GN_CONFIG -eq 'release') {
|
|
||||||
python3 electron\script\zip-symbols.py
|
|
||||||
appveyor-retry appveyor PushArtifact out/Default/symbols.zip
|
|
||||||
} else {
|
|
||||||
# It's useful to have pdb files when debugging testing builds that are
|
|
||||||
# built on CI.
|
|
||||||
7z a pdb.zip out\Default\*.pdb
|
|
||||||
}
|
|
||||||
- ps: |
|
|
||||||
$manifest_file = "electron/script/zip_manifests/dist_zip.win.$env:TARGET_ARCH.manifest"
|
|
||||||
python3 electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip $manifest_file
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "Zip contains files not listed in the manifest $manifest_file"
|
|
||||||
}
|
|
||||||
- ps: |
|
|
||||||
cd C:\projects\src
|
|
||||||
$missing_artifacts = $false
|
|
||||||
if ($env:SHOULD_SKIP_ARTIFACT_VALIDATION -eq 'true') {
|
|
||||||
Write-warning "Skipping artifact validation for doc-only $env:APPVEYOR_PROJECT_NAME"
|
|
||||||
} else {
|
|
||||||
$artifacts_to_validate = 'dist.zip','windows_toolchain_profile.json','chromedriver.zip','ffmpeg.zip','node_headers.zip','mksnapshot.zip','electron.lib','hunspell_dictionaries.zip','nan.zip'
|
|
||||||
foreach($artifact_name in $artifacts_to_validate) {
|
|
||||||
if ($artifact_name -eq 'ffmpeg.zip') {
|
|
||||||
$artifact_file = "out\ffmpeg\ffmpeg.zip"
|
|
||||||
} elseif (
|
|
||||||
$artifact_name -eq 'node_headers.zip') {
|
|
||||||
$artifact_file = $artifact_name
|
|
||||||
} elseif (
|
|
||||||
$artifact_name -eq 'nan.zip') {
|
|
||||||
$artifact_file = $artifact_name
|
|
||||||
} else {
|
|
||||||
$artifact_file = "out\Default\$artifact_name"
|
|
||||||
}
|
|
||||||
if (-not(Test-Path $artifact_file)) {
|
|
||||||
Write-warning "$artifact_name is missing and cannot be added to artifacts"
|
|
||||||
$missing_artifacts = $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($missing_artifacts) {
|
|
||||||
throw "Build failed due to missing artifacts"
|
|
||||||
}
|
|
||||||
|
|
||||||
deploy_script:
|
|
||||||
- cd electron
|
|
||||||
- ps: >-
|
|
||||||
if (Test-Path Env:\ELECTRON_RELEASE) {
|
|
||||||
if (Test-Path Env:\UPLOAD_TO_STORAGE) {
|
|
||||||
Write-Output "Uploading Electron release distribution to azure"
|
|
||||||
& python3 script\release\uploaders\upload.py --verbose --upload_to_storage
|
|
||||||
} else {
|
|
||||||
Write-Output "Uploading Electron release distribution to github releases"
|
|
||||||
& python3 script\release\uploaders\upload.py --verbose
|
|
||||||
}
|
|
||||||
}
|
|
||||||
on_finish:
|
|
||||||
# Uncomment this lines to enable RDP
|
|
||||||
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
- cd C:\projects\src
|
|
||||||
- if exist out\Default\windows_toolchain_profile.json ( appveyor-retry appveyor PushArtifact out\Default\windows_toolchain_profile.json )
|
|
||||||
- if exist out\Default\dist.zip (appveyor-retry appveyor PushArtifact out\Default\dist.zip)
|
|
||||||
- if exist out\Default\chromedriver.zip (appveyor-retry appveyor PushArtifact out\Default\chromedriver.zip)
|
|
||||||
- if exist out\ffmpeg\ffmpeg.zip (appveyor-retry appveyor PushArtifact out\ffmpeg\ffmpeg.zip)
|
|
||||||
- if exist node_headers.zip (appveyor-retry appveyor PushArtifact node_headers.zip)
|
|
||||||
- if exist nan.zip (appveyor-retry appveyor PushArtifact nan.zip)
|
|
||||||
- if exist out\Default\mksnapshot.zip (appveyor-retry appveyor PushArtifact out\Default\mksnapshot.zip)
|
|
||||||
- if exist out\Default\hunspell_dictionaries.zip (appveyor-retry appveyor PushArtifact out\Default\hunspell_dictionaries.zip)
|
|
||||||
- if exist out\Default\electron.lib (appveyor-retry appveyor PushArtifact out\Default\electron.lib)
|
|
||||||
- ps: >-
|
|
||||||
if ((Test-Path "pdb.zip") -And ($env:GN_CONFIG -ne 'release')) {
|
|
||||||
appveyor-retry appveyor PushArtifact pdb.zip
|
|
||||||
}
|
|
||||||
- matrix:
|
|
||||||
only:
|
|
||||||
- job_name: Test On Windows On Arm Hardware 1
|
|
||||||
- job_name: Test On Windows On Arm Hardware 2
|
|
||||||
|
|
||||||
environment:
|
|
||||||
IGNORE_YARN_INSTALL_ERROR: 1
|
|
||||||
ELECTRON_TEST_RESULTS_DIR: C:\projects\src\electron\junit
|
|
||||||
MOCHA_MULTI_REPORTERS: "@marshallofsound/mocha-appveyor-reporter, mocha-junit-reporter, tap"
|
|
||||||
MOCHA_REPORTER: mocha-multi-reporters
|
|
||||||
ELECTRON_SKIP_NATIVE_MODULE_TESTS: true
|
|
||||||
DD_ENV: ci
|
|
||||||
DD_SERVICE: electron
|
|
||||||
DD_CIVISIBILITY_LOGS_ENABLED: true
|
|
||||||
DD_GIT_REPOSITORY_URL: "https://github.com/electron/electron.git"
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- ps: |
|
|
||||||
node script/yarn.js install --frozen-lockfile --ignore-engines
|
|
||||||
node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
|
||||||
Write-warning "Skipping build for doc only change"
|
|
||||||
Exit-AppveyorBuild
|
|
||||||
} else {
|
|
||||||
$global:LASTEXITCODE = 0
|
|
||||||
}
|
|
||||||
- ps: Invoke-WebRequest -Uri "https://github.com/DataDog/datadog-ci/releases/latest/download/datadog-ci_win-x64" -OutFile "C:\projects\src\electron\datadog-ci.exe"
|
|
||||||
- cd ..
|
|
||||||
- mkdir out\Default
|
|
||||||
- cd ..
|
|
||||||
- ps: |
|
|
||||||
# Download build artifacts
|
|
||||||
$apiUrl = 'https://ci.appveyor.com/api'
|
|
||||||
$build_info = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/builds/$env:APPVEYOR_BUILD_ID"
|
|
||||||
$artifacts_to_download = @('dist.zip','ffmpeg.zip','node_headers.zip','electron.lib', 'nan.zip')
|
|
||||||
foreach ($job in $build_info.build.jobs) {
|
|
||||||
if ($job.name -eq "Build Arm on X64 Windows") {
|
|
||||||
$jobId = $job.jobId
|
|
||||||
foreach($artifact_name in $artifacts_to_download) {
|
|
||||||
if ($artifact_name -eq 'electron.lib') {
|
|
||||||
$outfile = "src\out\Default\$artifact_name"
|
|
||||||
} else {
|
|
||||||
$outfile = $artifact_name
|
|
||||||
}
|
|
||||||
Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/$artifact_name" -OutFile $outfile
|
|
||||||
}
|
|
||||||
# Uncomment the following lines to download the pdb.zip to show real stacktraces when crashes happen during testing
|
|
||||||
Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/pdb.zip" -OutFile pdb.zip
|
|
||||||
7z x -y -osrc pdb.zip
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- ps: |
|
|
||||||
$out_default_zips = @('dist.zip')
|
|
||||||
foreach($zip_name in $out_default_zips) {
|
|
||||||
7z x -y -osrc\out\Default $zip_name
|
|
||||||
}
|
|
||||||
- ps: 7z x -y -osrc\out\ffmpeg ffmpeg.zip
|
|
||||||
- ps: 7z x -y -osrc node_headers.zip
|
|
||||||
- ps: 7z x -y -osrc nan.zip
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
# Workaround for https://github.com/appveyor/ci/issues/2420
|
|
||||||
- set "PATH=%PATH%;C:\Program Files\Git\mingw64\libexec\git-core"
|
|
||||||
- ps: |
|
|
||||||
cd src
|
|
||||||
New-Item .\out\Default\gen\node_headers\Release -Type directory
|
|
||||||
Copy-Item -path .\out\Default\electron.lib -destination .\out\Default\gen\node_headers\Release\node.lib
|
|
||||||
- set npm_config_nodedir=%cd%\out\Default\gen\node_headers
|
|
||||||
- set npm_config_arch=arm64
|
|
||||||
- cd electron
|
|
||||||
# Explicitly set npm_config_arch because the .env doesn't persist
|
|
||||||
- ps: >-
|
|
||||||
if ($env:TARGET_ARCH -eq 'ia32') {
|
|
||||||
$env:npm_config_arch = "ia32"
|
|
||||||
}
|
|
||||||
- ps: $env:tests_files=node script\split-tests $env:shard 2
|
|
||||||
- echo "Running shard %shard% specs %tests_files%"
|
|
||||||
- echo Running main test suite & node script/yarn test --runners=main --enable-logging --disable-features=CalculateNativeWinOcclusion --files %tests_files%
|
|
||||||
- cd ..
|
|
||||||
- echo Verifying non proprietary ffmpeg & python electron\script\verify-ffmpeg.py --build-dir out\Default --source-root %cd% --ffmpeg-path out\ffmpeg
|
|
||||||
|
|
||||||
on_finish:
|
|
||||||
# Uncomment these lines to enable RDP
|
|
||||||
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
- if exist electron\junit\test-results-main.xml ( appveyor-retry appveyor PushArtifact electron\junit\test-results-main.xml )
|
|
||||||
- ps: |
|
|
||||||
if ($env:DD_API_KEY) {
|
|
||||||
$env:DD_GIT_COMMIT_SHA = $env:APPVEYOR_REPO_COMMIT
|
|
||||||
$env:DD_GIT_BRANCH = $env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH
|
|
||||||
$env:DD_TAGS = "os.architecture:$env:TARGET_ARCH,os.family:windows,os.platform:win32"
|
|
||||||
if (Test-Path -Path "C:\projects\src\electron\junit\test-results-main.xml") {
|
|
||||||
C:\projects\src\electron\datadog-ci.exe junit upload --verbose C:\projects\src\electron\junit\test-results-main.xml
|
|
||||||
}
|
|
||||||
}
|
|
||||||
350
appveyor.yml
350
appveyor.yml
@@ -1,350 +0,0 @@
|
|||||||
# NOTE IF CHANGING THIS FILE, ALSO APPLY THE CHANGE TO appveyor-woa.yml
|
|
||||||
# IF APPLICABLE!!!!
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# The config expects the following environment variables to be set:
|
|
||||||
# - "GN_CONFIG" Build type. One of {'testing', 'release'}.
|
|
||||||
# - "GN_EXTRA_ARGS" Additional gn arguments for a build config,
|
|
||||||
# e.g. 'target_cpu="x86"' to build for a 32bit platform.
|
|
||||||
# https://gn.googlesource.com/gn/+/main/docs/reference.md#var_target_cpu
|
|
||||||
# Don't forget to set up "NPM_CONFIG_ARCH" and "TARGET_ARCH" accordingly
|
|
||||||
# if you pass a custom value for 'target_cpu'.
|
|
||||||
# - "ELECTRON_RELEASE" Set it to '1' upload binaries on success.
|
|
||||||
# - "NPM_CONFIG_ARCH" E.g. 'x86'. Is used to build native Node.js modules.
|
|
||||||
# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "TARGET_ARCH" value.
|
|
||||||
# - "TARGET_ARCH" Choose from {'ia32', 'x64', 'arm', 'arm64'}.
|
|
||||||
# Is used in some publishing scripts, but does NOT affect the Electron binary.
|
|
||||||
# Must match 'target_cpu' passed to "GN_EXTRA_ARGS" and "NPM_CONFIG_ARCH" value.
|
|
||||||
# - "UPLOAD_TO_STORAGE" Set it to '1' upload a release to the Azure bucket.
|
|
||||||
# Otherwise the release will be uploaded to the GitHub Releases.
|
|
||||||
# (The value is only checked if "ELECTRON_RELEASE" is defined.)
|
|
||||||
#
|
|
||||||
# The publishing scripts expect access tokens to be defined as env vars,
|
|
||||||
# but those are not covered here.
|
|
||||||
#
|
|
||||||
# AppVeyor docs on variables:
|
|
||||||
# https://www.appveyor.com/docs/environment-variables/
|
|
||||||
# https://www.appveyor.com/docs/build-configuration/#secure-variables
|
|
||||||
# https://www.appveyor.com/docs/build-configuration/#custom-environment-variables
|
|
||||||
|
|
||||||
version: 1.0.{build}
|
|
||||||
build_cloud: electronhq-16-core
|
|
||||||
image: e-133.0.6878.0
|
|
||||||
environment:
|
|
||||||
GIT_CACHE_PATH: C:\Users\appveyor\libcc_cache
|
|
||||||
ELECTRON_OUT_DIR: Default
|
|
||||||
ELECTRON_ENABLE_STACK_DUMPING: 1
|
|
||||||
ELECTRON_ALSO_LOG_TO_STDERR: 1
|
|
||||||
MOCHA_REPORTER: mocha-multi-reporters
|
|
||||||
MOCHA_MULTI_REPORTERS: "@marshallofsound/mocha-appveyor-reporter, mocha-junit-reporter, tap"
|
|
||||||
DEPOT_TOOLS_WIN_TOOLCHAIN: 1
|
|
||||||
DEPOT_TOOLS_WIN_TOOLCHAIN_BASE_URL: "https://dev-cdn.electronjs.org/windows-toolchains/_"
|
|
||||||
GYP_MSVS_HASH_7393122652: 3ba76c5c20
|
|
||||||
PYTHONIOENCODING: UTF-8
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
|
|
||||||
- job_name: Build
|
|
||||||
- job_name: Test 1
|
|
||||||
job_depends_on: Build
|
|
||||||
shard: 1
|
|
||||||
- job_name: Test 2
|
|
||||||
job_depends_on: Build
|
|
||||||
shard: 2
|
|
||||||
|
|
||||||
clone_script:
|
|
||||||
- ps: git clone -q $("--branch=" + $Env:APPVEYOR_REPO_BRANCH) $("https://github.com/" + $Env:APPVEYOR_REPO_NAME + ".git") $Env:APPVEYOR_BUILD_FOLDER
|
|
||||||
- ps: if (!$Env:APPVEYOR_PULL_REQUEST_NUMBER) {$("git checkout -qf " + $Env:APPVEYOR_REPO_COMMIT)}
|
|
||||||
- ps: if ($Env:APPVEYOR_PULL_REQUEST_NUMBER) {git fetch -q origin +refs/pull/$($Env:APPVEYOR_PULL_REQUEST_NUMBER)/head; git checkout -qf FETCH_HEAD}
|
|
||||||
|
|
||||||
clone_folder: C:\projects\src\electron
|
|
||||||
|
|
||||||
skip_branch_with_pr: true
|
|
||||||
|
|
||||||
# the first failed job cancels other jobs and fails entire build
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
for:
|
|
||||||
|
|
||||||
- matrix:
|
|
||||||
only:
|
|
||||||
- job_name: Build
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- ps: |
|
|
||||||
node script/yarn.js install --frozen-lockfile
|
|
||||||
node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER
|
|
||||||
$env:SHOULD_SKIP_ARTIFACT_VALIDATION = "false"
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
|
||||||
Write-warning "Skipping build for doc-only change"
|
|
||||||
$env:SHOULD_SKIP_ARTIFACT_VALIDATION = "true"
|
|
||||||
Exit-AppveyorBuild
|
|
||||||
} else {
|
|
||||||
$global:LASTEXITCODE = 0
|
|
||||||
}
|
|
||||||
- cd ..
|
|
||||||
- ps: Write-Host "Building $env:GN_CONFIG build"
|
|
||||||
- git config --global core.longpaths true
|
|
||||||
- ps: >-
|
|
||||||
if (Test-Path -Path "$pwd\depot_tools") {
|
|
||||||
Remove-Item -Recurse -Force $pwd\depot_tools
|
|
||||||
}
|
|
||||||
- ps: >-
|
|
||||||
if (Test-Path -Path "$pwd\build-tools") {
|
|
||||||
Remove-Item -Recurse -Force $pwd\build-tools
|
|
||||||
}
|
|
||||||
- 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") {
|
|
||||||
Remove-Item -Recurse -Force $pwd\src\electron
|
|
||||||
}
|
|
||||||
- git clone https://github.com/electron/build-tools.git
|
|
||||||
- cd build-tools
|
|
||||||
- npx yarn --ignore-engines
|
|
||||||
- mkdir third_party
|
|
||||||
- ps: >-
|
|
||||||
node -e "require('./src/utils/reclient.js').downloadAndPrepare({})"
|
|
||||||
- ps: $env:RECLIENT_HELPER = node -p "require('./src/utils/reclient.js').helperPath({})"
|
|
||||||
- ps: >-
|
|
||||||
& $env:RECLIENT_HELPER login
|
|
||||||
- ps: >-
|
|
||||||
$env:RBE_service = node -e "console.log(require('./src/utils/reclient.js').serviceAddress)"
|
|
||||||
- ps: >-
|
|
||||||
$env:RBE_credentials_helper = $env:RECLIENT_HELPER
|
|
||||||
- ps: >-
|
|
||||||
$env:RBE_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"
|
|
||||||
}
|
|
||||||
- cd ..\..
|
|
||||||
- ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools"
|
|
||||||
- ps: >-
|
|
||||||
if ($env:GN_CONFIG -ne 'release') {
|
|
||||||
$env:NINJA_STATUS="[%r processes, %f/%t @ %o/s : %es] "
|
|
||||||
}
|
|
||||||
- gclient config --name "src\electron" --unmanaged %GCLIENT_EXTRA_ARGS% "https://github.com/electron/electron"
|
|
||||||
# Patches are applied in the image bake. Check depshash to see if patches have changed.
|
|
||||||
- ps: $env:RUN_GCLIENT_SYNC="false"
|
|
||||||
- ps: $depshash_baked = Get-Content .\src\.depshash -Raw
|
|
||||||
- ps: cd src\electron
|
|
||||||
- ps: node script\generate-deps-hash.js
|
|
||||||
- ps: $depshash = Get-Content .\.depshash -Raw
|
|
||||||
- ps: cd ..\..
|
|
||||||
- ps: >-
|
|
||||||
if ($depshash_baked -ne $depshash) {
|
|
||||||
$env:RUN_GCLIENT_SYNC="true"
|
|
||||||
}
|
|
||||||
- if "%RUN_GCLIENT_SYNC%"=="true" ( gclient sync --with_branch_heads --with_tags ) else ( gclient runhooks )
|
|
||||||
- cd src
|
|
||||||
- ps: $env:PATH="$pwd\third_party\ninja;$env:PATH"
|
|
||||||
- set BUILD_CONFIG_PATH=//electron/build/args/%GN_CONFIG%.gn
|
|
||||||
- gn gen out/Default "--args=import(\"%BUILD_CONFIG_PATH%\") use_remoteexec=true %GN_EXTRA_ARGS% "
|
|
||||||
- gn check out/Default //electron:electron_lib
|
|
||||||
- gn check out/Default //electron:electron_app
|
|
||||||
- gn check out/Default //electron/shell/common:mojo
|
|
||||||
- gn check out/Default //electron/shell/common:plugin
|
|
||||||
- autoninja -j 300 -C out/Default electron:electron_app
|
|
||||||
- if "%GN_CONFIG%"=="testing" ( python C:\depot_tools\post_build_ninja_summary.py -C out\Default )
|
|
||||||
- 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
|
|
||||||
- autoninja -C out/Default electron:electron_dist_zip
|
|
||||||
- gn desc out/Default v8:run_mksnapshot_default args > out/Default/default_mksnapshot_args
|
|
||||||
# Remove unused args from mksnapshot_args
|
|
||||||
- ps: >-
|
|
||||||
Get-Content out/Default/default_mksnapshot_args | Where-Object { -not $_.Contains('--turbo-profiling-input') -And -not $_.Contains('builtins-pgo') } | Set-Content out/Default/mksnapshot_args
|
|
||||||
- autoninja -C out/Default electron:electron_mksnapshot_zip
|
|
||||||
- cd out\Default
|
|
||||||
- 7z a mksnapshot.zip mksnapshot_args gen\v8\embedded.S
|
|
||||||
- cd ..\..
|
|
||||||
- autoninja -C out/Default electron:hunspell_dictionaries_zip
|
|
||||||
- autoninja -C out/Default electron:electron_chromedriver_zip
|
|
||||||
- autoninja -C out/Default electron:node_headers
|
|
||||||
- ps: >-
|
|
||||||
Get-CimInstance -Namespace root\cimv2 -Class Win32_product | Select vendor, description, @{l='install_location';e='InstallLocation'}, @{l='install_date';e='InstallDate'}, @{l='install_date_2';e='InstallDate2'}, caption, version, name, @{l='sku_number';e='SKUNumber'} | ConvertTo-Json | Out-File -Encoding utf8 -FilePath .\installed_software.json
|
|
||||||
- python3 electron/build/profile_toolchain.py --output-json=out/Default/windows_toolchain_profile.json
|
|
||||||
- 7z a node_headers.zip out\Default\gen\node_headers
|
|
||||||
- ps: >-
|
|
||||||
if ($env:GN_CONFIG -eq 'release') {
|
|
||||||
# Needed for msdia140.dll on 64-bit windows
|
|
||||||
$env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin"
|
|
||||||
}
|
|
||||||
- if "%GN_CONFIG%"=="release" ( autoninja -C out/Default electron:electron_symbols )
|
|
||||||
- ps: >-
|
|
||||||
if ($env:GN_CONFIG -eq 'release') {
|
|
||||||
python3 electron\script\zip-symbols.py
|
|
||||||
appveyor-retry appveyor PushArtifact out/Default/symbols.zip
|
|
||||||
} else {
|
|
||||||
# It's useful to have pdb files when debugging testing builds that are
|
|
||||||
# built on CI.
|
|
||||||
7z a pdb.zip out\Default\*.pdb
|
|
||||||
}
|
|
||||||
- ps: |
|
|
||||||
if ($env:TARGET_ARCH -eq 'ia32') {
|
|
||||||
$env:MANIFEST_ARCH = "x86"
|
|
||||||
} else {
|
|
||||||
$env:MANIFEST_ARCH = $env:TARGET_ARCH
|
|
||||||
}
|
|
||||||
$manifest_file = "electron/script/zip_manifests/dist_zip.win.$env:MANIFEST_ARCH.manifest"
|
|
||||||
python3 electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip $manifest_file
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
|
||||||
throw "Zip contains files not listed in the manifest $manifest_file"
|
|
||||||
}
|
|
||||||
- ps: |
|
|
||||||
cd C:\projects\src
|
|
||||||
$missing_artifacts = $false
|
|
||||||
if ($env:SHOULD_SKIP_ARTIFACT_VALIDATION -eq 'true') {
|
|
||||||
Write-warning "Skipping artifact validation for doc-only $env:APPVEYOR_PROJECT_NAME"
|
|
||||||
} else {
|
|
||||||
$artifacts_to_validate = 'dist.zip','windows_toolchain_profile.json','chromedriver.zip','ffmpeg.zip','node_headers.zip','mksnapshot.zip','electron.lib','hunspell_dictionaries.zip'
|
|
||||||
foreach($artifact_name in $artifacts_to_validate) {
|
|
||||||
if ($artifact_name -eq 'ffmpeg.zip') {
|
|
||||||
$artifact_file = "out\ffmpeg\ffmpeg.zip"
|
|
||||||
} elseif (
|
|
||||||
$artifact_name -eq 'node_headers.zip') {
|
|
||||||
$artifact_file = $artifact_name
|
|
||||||
} else {
|
|
||||||
$artifact_file = "out\Default\$artifact_name"
|
|
||||||
}
|
|
||||||
if (-not(Test-Path $artifact_file)) {
|
|
||||||
Write-warning "$artifact_name is missing and cannot be added to artifacts"
|
|
||||||
$missing_artifacts = $true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($missing_artifacts) {
|
|
||||||
throw "Build failed due to missing artifacts"
|
|
||||||
}
|
|
||||||
|
|
||||||
deploy_script:
|
|
||||||
- cd electron
|
|
||||||
- ps: >-
|
|
||||||
if (Test-Path Env:\ELECTRON_RELEASE) {
|
|
||||||
if (Test-Path Env:\UPLOAD_TO_STORAGE) {
|
|
||||||
Write-Output "Uploading Electron release distribution to azure"
|
|
||||||
& python3 script\release\uploaders\upload.py --verbose --upload_to_storage
|
|
||||||
} else {
|
|
||||||
Write-Output "Uploading Electron release distribution to github releases"
|
|
||||||
& python3 script\release\uploaders\upload.py --verbose
|
|
||||||
}
|
|
||||||
}
|
|
||||||
on_finish:
|
|
||||||
# Uncomment this lines to enable RDP
|
|
||||||
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
- cd C:\projects\src
|
|
||||||
- if exist out\Default\windows_toolchain_profile.json ( appveyor-retry appveyor PushArtifact out\Default\windows_toolchain_profile.json )
|
|
||||||
- if exist out\Default\dist.zip (appveyor-retry appveyor PushArtifact out\Default\dist.zip)
|
|
||||||
- if exist out\Default\chromedriver.zip (appveyor-retry appveyor PushArtifact out\Default\chromedriver.zip)
|
|
||||||
- if exist out\ffmpeg\ffmpeg.zip (appveyor-retry appveyor PushArtifact out\ffmpeg\ffmpeg.zip)
|
|
||||||
- if exist node_headers.zip (appveyor-retry appveyor PushArtifact node_headers.zip)
|
|
||||||
- if exist out\Default\mksnapshot.zip (appveyor-retry appveyor PushArtifact out\Default\mksnapshot.zip)
|
|
||||||
- if exist out\Default\hunspell_dictionaries.zip (appveyor-retry appveyor PushArtifact out\Default\hunspell_dictionaries.zip)
|
|
||||||
- if exist out\Default\electron.lib (appveyor-retry appveyor PushArtifact out\Default\electron.lib)
|
|
||||||
- ps: >-
|
|
||||||
if ((Test-Path "pdb.zip") -And ($env:GN_CONFIG -ne 'release')) {
|
|
||||||
appveyor-retry appveyor PushArtifact pdb.zip
|
|
||||||
}
|
|
||||||
- matrix:
|
|
||||||
only:
|
|
||||||
- job_name: Test 1
|
|
||||||
- job_name: Test 2
|
|
||||||
|
|
||||||
environment:
|
|
||||||
DD_ENV: ci
|
|
||||||
DD_SERVICE: electron
|
|
||||||
DD_CIVISIBILITY_LOGS_ENABLED: true
|
|
||||||
DD_GIT_REPOSITORY_URL: "https://github.com/electron/electron.git"
|
|
||||||
ELECTRON_TEST_RESULTS_DIR: C:\projects\src\electron\junit
|
|
||||||
|
|
||||||
init:
|
|
||||||
- ps: |
|
|
||||||
if ($env:RUN_TESTS -ne 'true') {
|
|
||||||
Write-warning "Skipping tests for $env:APPVEYOR_PROJECT_NAME"; Exit-AppveyorBuild
|
|
||||||
}
|
|
||||||
build_script:
|
|
||||||
- ps: |
|
|
||||||
node script/yarn.js install --frozen-lockfile
|
|
||||||
node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER
|
|
||||||
if ($LASTEXITCODE -eq 0) {
|
|
||||||
Write-warning "Skipping build for doc only change"
|
|
||||||
Exit-AppveyorBuild
|
|
||||||
} else {
|
|
||||||
$global:LASTEXITCODE = 0
|
|
||||||
}
|
|
||||||
- npm install -g @datadog/datadog-ci
|
|
||||||
- cd ..
|
|
||||||
- mkdir out\Default
|
|
||||||
- cd ..
|
|
||||||
- ps: |
|
|
||||||
# Download build artifacts
|
|
||||||
$apiUrl = 'https://ci.appveyor.com/api'
|
|
||||||
$build_info = Invoke-RestMethod -Method Get -Uri "$apiUrl/projects/$env:APPVEYOR_ACCOUNT_NAME/$env:APPVEYOR_PROJECT_SLUG/builds/$env:APPVEYOR_BUILD_ID"
|
|
||||||
$artifacts_to_download = @('dist.zip','chromedriver.zip','ffmpeg.zip','node_headers.zip','mksnapshot.zip','electron.lib')
|
|
||||||
foreach ($job in $build_info.build.jobs) {
|
|
||||||
if ($job.name -eq "Build") {
|
|
||||||
$jobId = $job.jobId
|
|
||||||
foreach($artifact_name in $artifacts_to_download) {
|
|
||||||
if ($artifact_name -eq 'electron.lib') {
|
|
||||||
$outfile = "src\out\Default\$artifact_name"
|
|
||||||
} else {
|
|
||||||
$outfile = $artifact_name
|
|
||||||
}
|
|
||||||
Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/$artifact_name" -OutFile $outfile
|
|
||||||
}
|
|
||||||
# Uncomment the following lines to download the pdb.zip to show real stacktraces when crashes happen during testing
|
|
||||||
Invoke-RestMethod -Method Get -Uri "$apiUrl/buildjobs/$jobId/artifacts/pdb.zip" -OutFile pdb.zip
|
|
||||||
7z x -y -osrc pdb.zip
|
|
||||||
}
|
|
||||||
}
|
|
||||||
- ps: |
|
|
||||||
$out_default_zips = @('dist.zip','chromedriver.zip','mksnapshot.zip')
|
|
||||||
foreach($zip_name in $out_default_zips) {
|
|
||||||
7z x -y -osrc\out\Default $zip_name
|
|
||||||
}
|
|
||||||
- ps: 7z x -y -osrc\out\ffmpeg ffmpeg.zip
|
|
||||||
- ps: 7z x -y -osrc node_headers.zip
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
# Workaround for https://github.com/appveyor/ci/issues/2420
|
|
||||||
- set "PATH=%PATH%;C:\Program Files\Git\mingw64\libexec\git-core"
|
|
||||||
- ps: |
|
|
||||||
cd src
|
|
||||||
New-Item .\out\Default\gen\node_headers\Release -Type directory
|
|
||||||
Copy-Item -path .\out\Default\electron.lib -destination .\out\Default\gen\node_headers\Release\node.lib
|
|
||||||
- cd electron
|
|
||||||
# Explicitly set npm_config_arch because the .env doesn't persist
|
|
||||||
- ps: >-
|
|
||||||
if ($env:TARGET_ARCH -eq 'ia32') {
|
|
||||||
$env:npm_config_arch = "ia32"
|
|
||||||
}
|
|
||||||
- ps: $env:tests_files=node script\split-tests $env:shard 2
|
|
||||||
- echo "Running shard %shard% specs %tests_files%"
|
|
||||||
- echo Running main test suite & node script/yarn test -- --trace-uncaught --runners=main --enable-logging --files %tests_files%
|
|
||||||
- cd ..
|
|
||||||
- echo Verifying non proprietary ffmpeg & python electron\script\verify-ffmpeg.py --build-dir out\Default --source-root %cd% --ffmpeg-path out\ffmpeg
|
|
||||||
- echo "About to verify mksnapshot"
|
|
||||||
- echo Verifying mksnapshot & python electron\script\verify-mksnapshot.py --build-dir out\Default --source-root %cd%
|
|
||||||
- echo "Done verifying mksnapshot"
|
|
||||||
- echo Verifying chromedriver & python electron\script\verify-chromedriver.py --build-dir out\Default --source-root %cd%
|
|
||||||
- echo "Done verifying chromedriver"
|
|
||||||
|
|
||||||
on_finish:
|
|
||||||
# Uncomment these lines to enable RDP
|
|
||||||
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
|
|
||||||
- if exist electron\junit\test-results-main.xml ( appveyor-retry appveyor PushArtifact electron\junit\test-results-main.xml )
|
|
||||||
- ps: |
|
|
||||||
if ($env:RUN_TESTS -eq 'true' -And $env:DD_API_KEY) {
|
|
||||||
$env:DD_GIT_COMMIT_SHA = $env:APPVEYOR_REPO_COMMIT
|
|
||||||
$env:DD_GIT_BRANCH = $env:APPVEYOR_PULL_REQUEST_HEAD_REPO_BRANCH
|
|
||||||
$env:DD_TAGS = "os.architecture:$env:TARGET_ARCH,os.family:windows,os.platform:win32"
|
|
||||||
if (Test-Path -Path "C:\projects\src\electron\junit\test-results-main.xml") {
|
|
||||||
C:\Users\appveyor\AppData\Roaming\npm\datadog-ci.ps1 junit upload --verbose C:\projects\src\electron\junit\test-results-main.xml
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"unicorn"
|
"import"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"unicorn/prefer-node-protocol": "error"
|
"import/enforce-node-protocol-usage": ["error", "always"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ v8_enable_snapshot_native_code_counters = false
|
|||||||
v8_enable_javascript_promise_hooks = true
|
v8_enable_javascript_promise_hooks = true
|
||||||
|
|
||||||
enable_cdm_host_verification = false
|
enable_cdm_host_verification = false
|
||||||
proprietary_codecs = true
|
|
||||||
ffmpeg_branding = "Chrome"
|
ffmpeg_branding = "Chrome"
|
||||||
|
proprietary_codecs = true
|
||||||
|
|
||||||
enable_printing = true
|
enable_printing = true
|
||||||
|
|
||||||
@@ -48,7 +48,8 @@ enable_cet_shadow_stack = false
|
|||||||
is_cfi = false
|
is_cfi = false
|
||||||
|
|
||||||
# TODO: fix this once sysroots have been updated.
|
# TODO: fix this once sysroots have been updated.
|
||||||
use_qt = false
|
use_qt5 = false
|
||||||
|
use_qt6 = false
|
||||||
|
|
||||||
# Disables the builtins PGO for V8
|
# Disables the builtins PGO for V8
|
||||||
v8_builtins_profiling_log_file = ""
|
v8_builtins_profiling_log_file = ""
|
||||||
@@ -65,11 +66,6 @@ v8_enable_private_mapping_fork_optimization = true
|
|||||||
# Expose public V8 symbols for native modules.
|
# Expose public V8 symbols for native modules.
|
||||||
v8_expose_public_symbols = true
|
v8_expose_public_symbols = true
|
||||||
|
|
||||||
# Disables unsafe-buffers-usage plugin due to incompatibilities with our reclient implementation
|
|
||||||
# Ref: https://chromium-review.googlesource.com/c/chromium/src/+/5426599
|
|
||||||
# Ref: https://github.com/electron/electron/commit/8e20f16ea35eeaeb149ae63bad3703d782665f6a
|
|
||||||
clang_unsafe_buffers_paths = ""
|
|
||||||
|
|
||||||
# Disable snapshotting a page when printing for its content to be analyzed for
|
# Disable snapshotting a page when printing for its content to be analyzed for
|
||||||
# sensitive content by enterprise users.
|
# sensitive content by enterprise users.
|
||||||
enterprise_cloud_content_analysis = false
|
enterprise_cloud_content_analysis = false
|
||||||
@@ -78,5 +74,4 @@ enterprise_cloud_content_analysis = false
|
|||||||
# https://issues.chromium.org/issues/40943039
|
# https://issues.chromium.org/issues/40943039
|
||||||
content_enable_legacy_ipc = true
|
content_enable_legacy_ipc = true
|
||||||
|
|
||||||
# Electron has its own unsafe-buffers enforcement directories.
|
|
||||||
clang_unsafe_buffers_paths = "//electron/electron_unsafe_buffers_paths.txt"
|
clang_unsafe_buffers_paths = "//electron/electron_unsafe_buffers_paths.txt"
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import("all.gn")
|
import("//electron/build/args/all.gn")
|
||||||
is_component_build = false
|
is_component_build = false
|
||||||
is_component_ffmpeg = true
|
is_component_ffmpeg = true
|
||||||
is_official_build = true
|
is_official_build = true
|
||||||
proprietary_codecs = false
|
|
||||||
ffmpeg_branding = "Chromium"
|
ffmpeg_branding = "Chromium"
|
||||||
enable_dsyms = false
|
enable_dsyms = false
|
||||||
|
proprietary_codecs = false
|
||||||
|
|||||||
@@ -1,14 +1,7 @@
|
|||||||
import("all.gn")
|
import("//electron/build/args/all.gn")
|
||||||
is_component_build = false
|
is_component_build = false
|
||||||
is_official_build = true
|
is_official_build = true
|
||||||
|
|
||||||
# This may be guarded behind is_chrome_branded alongside
|
|
||||||
# proprietary_codecs https://webrtc-review.googlesource.com/c/src/+/36321,
|
|
||||||
# explicitly override here to build OpenH264 encoder/FFmpeg decoder.
|
|
||||||
# The initialization of the decoder depends on whether ffmpeg has
|
|
||||||
# been built with H.264 support.
|
|
||||||
rtc_use_h264 = proprietary_codecs
|
|
||||||
|
|
||||||
# By default, Electron builds ffmpeg with proprietary codecs enabled. In order
|
# By default, Electron builds ffmpeg with proprietary codecs enabled. In order
|
||||||
# to facilitate users who don't want to ship proprietary codecs in ffmpeg, or
|
# to facilitate users who don't want to ship proprietary codecs in ffmpeg, or
|
||||||
# who have an LGPL requirement to ship ffmpeg as a dynamically linked library,
|
# who have an LGPL requirement to ship ffmpeg as a dynamically linked library,
|
||||||
|
|||||||
@@ -1,14 +1,7 @@
|
|||||||
import("all.gn")
|
import("//electron/build/args/all.gn")
|
||||||
is_debug = false
|
is_debug = false
|
||||||
is_component_build = false
|
is_component_build = false
|
||||||
is_component_ffmpeg = true
|
is_component_ffmpeg = true
|
||||||
is_official_build = false
|
is_official_build = false
|
||||||
dcheck_always_on = true
|
dcheck_always_on = true
|
||||||
symbol_level = 1
|
symbol_level = 1
|
||||||
|
|
||||||
# This may be guarded behind is_chrome_branded alongside
|
|
||||||
# proprietary_codecs https://webrtc-review.googlesource.com/c/src/+/36321,
|
|
||||||
# explicitly override here to build OpenH264 encoder/FFmpeg decoder.
|
|
||||||
# The initialization of the decoder depends on whether ffmpeg has
|
|
||||||
# been built with H.264 support.
|
|
||||||
rtc_use_h264 = proprietary_codecs
|
|
||||||
|
|||||||
6
build/webpack/webpack.config.preload_realm.js
Normal file
6
build/webpack/webpack.config.preload_realm.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
module.exports = require('./webpack.config.base')({
|
||||||
|
target: 'preload_realm',
|
||||||
|
alwaysHasNode: false,
|
||||||
|
wrapInitWithProfilingTimeout: true,
|
||||||
|
wrapInitWithTryCatch: true
|
||||||
|
});
|
||||||
@@ -34,8 +34,6 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/devtools/features.h",
|
"//chrome/browser/devtools/features.h",
|
||||||
"//chrome/browser/devtools/visual_logging.cc",
|
"//chrome/browser/devtools/visual_logging.cc",
|
||||||
"//chrome/browser/devtools/visual_logging.h",
|
"//chrome/browser/devtools/visual_logging.h",
|
||||||
"//chrome/browser/extensions/global_shortcut_listener.cc",
|
|
||||||
"//chrome/browser/extensions/global_shortcut_listener.h",
|
|
||||||
"//chrome/browser/file_system_access/file_system_access_features.cc",
|
"//chrome/browser/file_system_access/file_system_access_features.cc",
|
||||||
"//chrome/browser/file_system_access/file_system_access_features.h",
|
"//chrome/browser/file_system_access/file_system_access_features.h",
|
||||||
"//chrome/browser/icon_loader.cc",
|
"//chrome/browser/icon_loader.cc",
|
||||||
@@ -70,6 +68,8 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/picture_in_picture/picture_in_picture_occlusion_tracker_observer.h",
|
"//chrome/browser/picture_in_picture/picture_in_picture_occlusion_tracker_observer.h",
|
||||||
"//chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc",
|
"//chrome/browser/picture_in_picture/picture_in_picture_window_manager.cc",
|
||||||
"//chrome/browser/picture_in_picture/picture_in_picture_window_manager.h",
|
"//chrome/browser/picture_in_picture/picture_in_picture_window_manager.h",
|
||||||
|
"//chrome/browser/picture_in_picture/picture_in_picture_window_manager_uma_helper.cc",
|
||||||
|
"//chrome/browser/picture_in_picture/picture_in_picture_window_manager_uma_helper.h",
|
||||||
"//chrome/browser/picture_in_picture/scoped_picture_in_picture_occlusion_observation.cc",
|
"//chrome/browser/picture_in_picture/scoped_picture_in_picture_occlusion_observation.cc",
|
||||||
"//chrome/browser/picture_in_picture/scoped_picture_in_picture_occlusion_observation.h",
|
"//chrome/browser/picture_in_picture/scoped_picture_in_picture_occlusion_observation.h",
|
||||||
"//chrome/browser/platform_util.cc",
|
"//chrome/browser/platform_util.cc",
|
||||||
@@ -146,6 +146,8 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/ui/webui/accessibility/accessibility_ui.h",
|
"//chrome/browser/ui/webui/accessibility/accessibility_ui.h",
|
||||||
"//extensions/browser/app_window/size_constraints.cc",
|
"//extensions/browser/app_window/size_constraints.cc",
|
||||||
"//extensions/browser/app_window/size_constraints.h",
|
"//extensions/browser/app_window/size_constraints.h",
|
||||||
|
"//ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.cc",
|
||||||
|
"//ui/base/accelerators/global_accelerator_listener/global_accelerator_listener.h",
|
||||||
"//ui/views/native_window_tracker.h",
|
"//ui/views/native_window_tracker.h",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -176,7 +178,6 @@ static_library("chrome") {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public_deps = [
|
public_deps = [
|
||||||
"//chrome/browser:dev_ui_browser_resources",
|
|
||||||
"//chrome/browser/resources/accessibility:resources",
|
"//chrome/browser/resources/accessibility:resources",
|
||||||
"//chrome/browser/ui/color:color_headers",
|
"//chrome/browser/ui/color:color_headers",
|
||||||
"//chrome/browser/ui/color:mixers",
|
"//chrome/browser/ui/color:mixers",
|
||||||
@@ -198,6 +199,7 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/ui/webui/tab_search:mojo_bindings",
|
"//chrome/browser/ui/webui/tab_search:mojo_bindings",
|
||||||
"//chrome/browser/web_applications/mojom:mojom_web_apps_enum",
|
"//chrome/browser/web_applications/mojom:mojom_web_apps_enum",
|
||||||
"//components/enterprise/buildflags",
|
"//components/enterprise/buildflags",
|
||||||
|
"//components/enterprise/common/proto:browser_events_proto",
|
||||||
"//components/enterprise/common/proto:connectors_proto",
|
"//components/enterprise/common/proto:connectors_proto",
|
||||||
"//components/enterprise/obfuscation/core:enterprise_obfuscation",
|
"//components/enterprise/obfuscation/core:enterprise_obfuscation",
|
||||||
"//components/safe_browsing/core/browser/db:safebrowsing_proto",
|
"//components/safe_browsing/core/browser/db:safebrowsing_proto",
|
||||||
@@ -219,9 +221,9 @@ static_library("chrome") {
|
|||||||
|
|
||||||
if (is_linux) {
|
if (is_linux) {
|
||||||
sources += [
|
sources += [
|
||||||
"//chrome/browser/extensions/global_shortcut_listener_linux.cc",
|
|
||||||
"//chrome/browser/extensions/global_shortcut_listener_linux.h",
|
|
||||||
"//chrome/browser/icon_loader_auralinux.cc",
|
"//chrome/browser/icon_loader_auralinux.cc",
|
||||||
|
"//ui/base/accelerators/global_accelerator_listener/global_accelerator_listener_linux.cc",
|
||||||
|
"//ui/base/accelerators/global_accelerator_listener/global_accelerator_listener_linux.h",
|
||||||
]
|
]
|
||||||
sources += [
|
sources += [
|
||||||
"//chrome/browser/ui/views/status_icons/concat_menu_model.cc",
|
"//chrome/browser/ui/views/status_icons/concat_menu_model.cc",
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"plugins": [
|
"plugins": [
|
||||||
"unicorn"
|
"import"
|
||||||
],
|
],
|
||||||
"rules": {
|
"rules": {
|
||||||
"unicorn/prefer-node-protocol": "error"
|
"import/enforce-node-protocol-usage": ["error", "always"]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ an issue:
|
|||||||
### Getting started
|
### Getting started
|
||||||
|
|
||||||
* [Introduction](tutorial/introduction.md)
|
* [Introduction](tutorial/introduction.md)
|
||||||
* [Quick Start](tutorial/quick-start.md)
|
|
||||||
* [Process Model](tutorial/process-model.md)
|
* [Process Model](tutorial/process-model.md)
|
||||||
|
|
||||||
### Learning the basics
|
### Learning the basics
|
||||||
@@ -128,6 +127,7 @@ These individual tutorials expand on topics discussed in the guide above.
|
|||||||
* [pushNotifications](api/push-notifications.md)
|
* [pushNotifications](api/push-notifications.md)
|
||||||
* [safeStorage](api/safe-storage.md)
|
* [safeStorage](api/safe-storage.md)
|
||||||
* [screen](api/screen.md)
|
* [screen](api/screen.md)
|
||||||
|
* [ServiceWorkerMain](api/service-worker-main.md)
|
||||||
* [session](api/session.md)
|
* [session](api/session.md)
|
||||||
* [ShareMenu](api/share-menu.md)
|
* [ShareMenu](api/share-menu.md)
|
||||||
* [systemPreferences](api/system-preferences.md)
|
* [systemPreferences](api/system-preferences.md)
|
||||||
|
|||||||
@@ -1559,8 +1559,8 @@ command line arguments that Chromium uses.
|
|||||||
|
|
||||||
### `app.dock` _macOS_ _Readonly_
|
### `app.dock` _macOS_ _Readonly_
|
||||||
|
|
||||||
A [`Dock`](./dock.md) `| undefined` object that allows you to perform actions on your app icon in the user's
|
A `Dock | undefined` property ([`Dock`](./dock.md) on macOS, `undefined` on all other
|
||||||
dock on macOS.
|
platforms) that allows you to perform actions on your app icon in the user's dock.
|
||||||
|
|
||||||
### `app.isPackaged` _Readonly_
|
### `app.isPackaged` _Readonly_
|
||||||
|
|
||||||
|
|||||||
@@ -342,12 +342,12 @@ Emitted when the window has closed a sheet.
|
|||||||
|
|
||||||
Emitted when the native new tab button is clicked.
|
Emitted when the native new tab button is clicked.
|
||||||
|
|
||||||
#### Event: 'system-context-menu' _Windows_
|
#### Event: 'system-context-menu' _Windows_ _Linux_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
* `event` Event
|
* `event` Event
|
||||||
* `point` [Point](structures/point.md) - The screen coordinates the context menu was triggered at
|
* `point` [Point](structures/point.md) - The screen coordinates where the context menu was triggered.
|
||||||
|
|
||||||
Emitted when the system context menu is triggered on the window, this is
|
Emitted when the system context menu is triggered on the window, this is
|
||||||
normally only triggered when the user right clicks on the non-client area
|
normally only triggered when the user right clicks on the non-client area
|
||||||
@@ -356,6 +356,8 @@ as `-webkit-app-region: drag` in a frameless window.
|
|||||||
|
|
||||||
Calling `event.preventDefault()` will prevent the menu from being displayed.
|
Calling `event.preventDefault()` will prevent the menu from being displayed.
|
||||||
|
|
||||||
|
To convert `point` to DIP, use [`screen.screenToDipPoint(point)`](./screen.md#screenscreentodippointpoint-windows-linux).
|
||||||
|
|
||||||
### Static Methods
|
### Static Methods
|
||||||
|
|
||||||
The `BaseWindow` class has the following static methods:
|
The `BaseWindow` class has the following static methods:
|
||||||
@@ -396,7 +398,7 @@ A `View` property for the content view of the window.
|
|||||||
|
|
||||||
A `string` (optional) property that is equal to the `tabbingIdentifier` passed to the `BrowserWindow` constructor or `undefined` if none was set.
|
A `string` (optional) property that is equal to the `tabbingIdentifier` passed to the `BrowserWindow` constructor or `undefined` if none was set.
|
||||||
|
|
||||||
#### `win.autoHideMenuBar`
|
#### `win.autoHideMenuBar` _Linux_ _Windows_
|
||||||
|
|
||||||
A `boolean` property that determines whether the window menu bar should hide itself automatically. Once set, the menu bar will only show when users press the single `Alt` key.
|
A `boolean` property that determines whether the window menu bar should hide itself automatically. Once set, the menu bar will only show when users press the single `Alt` key.
|
||||||
|
|
||||||
|
|||||||
@@ -421,12 +421,12 @@ Emitted when the window has closed a sheet.
|
|||||||
|
|
||||||
Emitted when the native new tab button is clicked.
|
Emitted when the native new tab button is clicked.
|
||||||
|
|
||||||
#### Event: 'system-context-menu' _Windows_
|
#### Event: 'system-context-menu' _Windows_ _Linux_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
* `event` Event
|
* `event` Event
|
||||||
* `point` [Point](structures/point.md) - The screen coordinates the context menu was triggered at
|
* `point` [Point](structures/point.md) - The screen coordinates where the context menu was triggered.
|
||||||
|
|
||||||
Emitted when the system context menu is triggered on the window, this is
|
Emitted when the system context menu is triggered on the window, this is
|
||||||
normally only triggered when the user right clicks on the non-client area
|
normally only triggered when the user right clicks on the non-client area
|
||||||
@@ -435,6 +435,8 @@ as `-webkit-app-region: drag` in a frameless window.
|
|||||||
|
|
||||||
Calling `event.preventDefault()` will prevent the menu from being displayed.
|
Calling `event.preventDefault()` will prevent the menu from being displayed.
|
||||||
|
|
||||||
|
To convert `point` to DIP, use [`screen.screenToDipPoint(point)`](./screen.md#screenscreentodippointpoint-windows-linux).
|
||||||
|
|
||||||
### Static Methods
|
### Static Methods
|
||||||
|
|
||||||
The `BrowserWindow` class has the following static methods:
|
The `BrowserWindow` class has the following static methods:
|
||||||
@@ -497,7 +499,7 @@ A `Integer` property representing the unique ID of the window. Each ID is unique
|
|||||||
|
|
||||||
A `string` (optional) property that is equal to the `tabbingIdentifier` passed to the `BrowserWindow` constructor or `undefined` if none was set.
|
A `string` (optional) property that is equal to the `tabbingIdentifier` passed to the `BrowserWindow` constructor or `undefined` if none was set.
|
||||||
|
|
||||||
#### `win.autoHideMenuBar`
|
#### `win.autoHideMenuBar` _Linux_ _Windows_
|
||||||
|
|
||||||
A `boolean` property that determines whether the window menu bar should hide itself automatically. Once set, the menu bar will only show when users press the single `Alt` key.
|
A `boolean` property that determines whether the window menu bar should hide itself automatically. Once set, the menu bar will only show when users press the single `Alt` key.
|
||||||
|
|
||||||
|
|||||||
@@ -254,7 +254,7 @@ Electron supports some of the [CLI flags][node-cli] supported by Node.js.
|
|||||||
|
|
||||||
**Note:** Passing unsupported command line switches to Electron when it is not running in `ELECTRON_RUN_AS_NODE` will have no effect.
|
**Note:** Passing unsupported command line switches to Electron when it is not running in `ELECTRON_RUN_AS_NODE` will have no effect.
|
||||||
|
|
||||||
### `--inspect-brk\[=\[host:]port]`
|
### `--inspect-brk[=[host:]port]`
|
||||||
|
|
||||||
Activate inspector on host:port and break at start of user script. Default host:port is 127.0.0.1:9229.
|
Activate inspector on host:port and break at start of user script. Default host:port is 127.0.0.1:9229.
|
||||||
|
|
||||||
@@ -266,13 +266,13 @@ Activate inspector on `host:port` and break at start of the first internal
|
|||||||
JavaScript script executed when the inspector is available.
|
JavaScript script executed when the inspector is available.
|
||||||
Default `host:port` is `127.0.0.1:9229`.
|
Default `host:port` is `127.0.0.1:9229`.
|
||||||
|
|
||||||
### `--inspect-port=\[host:]port`
|
### `--inspect-port=[host:]port`
|
||||||
|
|
||||||
Set the `host:port` to be used when the inspector is activated. Useful when activating the inspector by sending the SIGUSR1 signal. Default host is `127.0.0.1`.
|
Set the `host:port` to be used when the inspector is activated. Useful when activating the inspector by sending the SIGUSR1 signal. Default host is `127.0.0.1`.
|
||||||
|
|
||||||
Aliased to `--debug-port=[host:]port`.
|
Aliased to `--debug-port=[host:]port`.
|
||||||
|
|
||||||
### `--inspect\[=\[host:]port]`
|
### `--inspect[=[host:]port]`
|
||||||
|
|
||||||
Activate inspector on `host:port`. Default is `127.0.0.1:9229`.
|
Activate inspector on `host:port`. Default is `127.0.0.1:9229`.
|
||||||
|
|
||||||
@@ -288,6 +288,10 @@ Specify ways of the inspector web socket url exposure.
|
|||||||
|
|
||||||
By default inspector websocket url is available in stderr and under /json/list endpoint on `http://host:port/json/list`.
|
By default inspector websocket url is available in stderr and under /json/list endpoint on `http://host:port/json/list`.
|
||||||
|
|
||||||
|
### `--experimental-network-inspector`
|
||||||
|
|
||||||
|
Enable support for devtools network inspector events, for visibility into requests made by the nodejs `http` and `https` modules.
|
||||||
|
|
||||||
### `--no-deprecation`
|
### `--no-deprecation`
|
||||||
|
|
||||||
Silence deprecation warnings.
|
Silence deprecation warnings.
|
||||||
@@ -313,6 +317,16 @@ Set the default value of the `verbatim` parameter in the Node.js [`dns.lookup()`
|
|||||||
|
|
||||||
The default is `verbatim` and `dns.setDefaultResultOrder()` have higher priority than `--dns-result-order`.
|
The default is `verbatim` and `dns.setDefaultResultOrder()` have higher priority than `--dns-result-order`.
|
||||||
|
|
||||||
|
### `--diagnostic-dir=directory`
|
||||||
|
|
||||||
|
Set the directory to which all Node.js diagnostic output files are written. Defaults to current working directory.
|
||||||
|
|
||||||
|
Affects the default output directory of [v8.setHeapSnapshotNearHeapLimit](https://nodejs.org/docs/latest/api/v8.html#v8setheapsnapshotnearheaplimitlimit).
|
||||||
|
|
||||||
|
### `--no-experimental-global-navigator`
|
||||||
|
|
||||||
|
Disable exposition of [Navigator API][] on the global scope from Node.js.
|
||||||
|
|
||||||
[app]: app.md
|
[app]: app.md
|
||||||
[append-switch]: command-line.md#commandlineappendswitchswitch-value
|
[append-switch]: command-line.md#commandlineappendswitchswitch-value
|
||||||
[debugging-main-process]: ../tutorial/debugging-main-process.md
|
[debugging-main-process]: ../tutorial/debugging-main-process.md
|
||||||
@@ -321,3 +335,4 @@ The default is `verbatim` and `dns.setDefaultResultOrder()` have higher priority
|
|||||||
[play-silent-audio]: https://github.com/atom/atom/pull/9485/files
|
[play-silent-audio]: https://github.com/atom/atom/pull/9485/files
|
||||||
[ready]: app.md#event-ready
|
[ready]: app.md#event-ready
|
||||||
[severities]: https://source.chromium.org/chromium/chromium/src/+/main:base/logging.h?q=logging::LogSeverity&ss=chromium
|
[severities]: https://source.chromium.org/chromium/chromium/src/+/main:base/logging.h?q=logging::LogSeverity&ss=chromium
|
||||||
|
[Navigator API]: https://github.com/nodejs/node/blob/main/doc/api/globals.md#navigator
|
||||||
|
|||||||
@@ -20,45 +20,87 @@ document.
|
|||||||
|
|
||||||
#### `commandLine.appendSwitch(switch[, value])`
|
#### `commandLine.appendSwitch(switch[, value])`
|
||||||
|
|
||||||
* `switch` string - A command-line switch, without the leading `--`
|
* `switch` string - A command-line switch, without the leading `--`.
|
||||||
* `value` string (optional) - A value for the given switch
|
* `value` string (optional) - A value for the given switch.
|
||||||
|
|
||||||
Append a switch (with optional `value`) to Chromium's command line.
|
Append a switch (with optional `value`) to Chromium's command line.
|
||||||
|
|
||||||
**Note:** This will not affect `process.argv`. The intended usage of this function is to
|
**Note:** This will not affect `process.argv`. The intended usage of this function is to
|
||||||
control Chromium's behavior.
|
control Chromium's behavior.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app } = require('electron')
|
||||||
|
|
||||||
|
app.commandLine.appendSwitch('remote-debugging-port', '8315')
|
||||||
|
```
|
||||||
|
|
||||||
#### `commandLine.appendArgument(value)`
|
#### `commandLine.appendArgument(value)`
|
||||||
|
|
||||||
* `value` string - The argument to append to the command line
|
* `value` string - The argument to append to the command line.
|
||||||
|
|
||||||
Append an argument to Chromium's command line. The argument will be quoted
|
Append an argument to Chromium's command line. The argument will be quoted
|
||||||
correctly. Switches will precede arguments regardless of appending order.
|
correctly. Switches will precede arguments regardless of appending order.
|
||||||
|
|
||||||
If you're appending an argument like `--switch=value`, consider using `appendSwitch('switch', 'value')` instead.
|
If you're appending an argument like `--switch=value`, consider using `appendSwitch('switch', 'value')` instead.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app } = require('electron')
|
||||||
|
|
||||||
|
app.commandLine.appendArgument('--enable-experimental-web-platform-features')
|
||||||
|
```
|
||||||
|
|
||||||
**Note:** This will not affect `process.argv`. The intended usage of this function is to
|
**Note:** This will not affect `process.argv`. The intended usage of this function is to
|
||||||
control Chromium's behavior.
|
control Chromium's behavior.
|
||||||
|
|
||||||
#### `commandLine.hasSwitch(switch)`
|
#### `commandLine.hasSwitch(switch)`
|
||||||
|
|
||||||
* `switch` string - A command-line switch
|
* `switch` string - A command-line switch.
|
||||||
|
|
||||||
Returns `boolean` - Whether the command-line switch is present.
|
Returns `boolean` - Whether the command-line switch is present.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app } = require('electron')
|
||||||
|
|
||||||
|
app.commandLine.appendSwitch('remote-debugging-port', '8315')
|
||||||
|
const hasPort = app.commandLine.hasSwitch('remote-debugging-port')
|
||||||
|
console.log(hasPort) // true
|
||||||
|
```
|
||||||
|
|
||||||
#### `commandLine.getSwitchValue(switch)`
|
#### `commandLine.getSwitchValue(switch)`
|
||||||
|
|
||||||
* `switch` string - A command-line switch
|
* `switch` string - A command-line switch.
|
||||||
|
|
||||||
Returns `string` - The command-line switch value.
|
Returns `string` - The command-line switch value.
|
||||||
|
|
||||||
|
This function is meant to obtain Chromium command line switches. It is not
|
||||||
|
meant to be used for application-specific command line arguments. For the
|
||||||
|
latter, please use `process.argv`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app } = require('electron')
|
||||||
|
|
||||||
|
app.commandLine.appendSwitch('remote-debugging-port', '8315')
|
||||||
|
const portValue = app.commandLine.getSwitchValue('remote-debugging-port')
|
||||||
|
console.log(portValue) // '8315'
|
||||||
|
```
|
||||||
|
|
||||||
**Note:** When the switch is not present or has no value, it returns empty string.
|
**Note:** When the switch is not present or has no value, it returns empty string.
|
||||||
|
|
||||||
#### `commandLine.removeSwitch(switch)`
|
#### `commandLine.removeSwitch(switch)`
|
||||||
|
|
||||||
* `switch` string - A command-line switch
|
* `switch` string - A command-line switch.
|
||||||
|
|
||||||
Removes the specified switch from Chromium's command line.
|
Removes the specified switch from Chromium's command line.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app } = require('electron')
|
||||||
|
|
||||||
|
app.commandLine.appendSwitch('remote-debugging-port', '8315')
|
||||||
|
console.log(app.commandLine.hasSwitch('remote-debugging-port')) // true
|
||||||
|
|
||||||
|
app.commandLine.removeSwitch('remote-debugging-port')
|
||||||
|
console.log(app.commandLine.hasSwitch('remote-debugging-port')) // false
|
||||||
|
```
|
||||||
|
|
||||||
**Note:** This will not affect `process.argv`. The intended usage of this function is to
|
**Note:** This will not affect `process.argv`. The intended usage of this function is to
|
||||||
control Chromium's behavior.
|
control Chromium's behavior.
|
||||||
|
|||||||
@@ -61,6 +61,20 @@ The `contextBridge` module has the following methods:
|
|||||||
* `apiKey` string - The key to inject the API onto `window` with. The API will be accessible on `window[apiKey]`.
|
* `apiKey` string - The key to inject the API onto `window` with. The API will be accessible on `window[apiKey]`.
|
||||||
* `api` any - Your API, more information on what this API can be and how it works is available below.
|
* `api` any - Your API, more information on what this API can be and how it works is available below.
|
||||||
|
|
||||||
|
### `contextBridge.executeInMainWorld(executionScript)` _Experimental_
|
||||||
|
|
||||||
|
<!-- TODO(samuelmaddock): add generics to map the `args` types to the `func` params -->
|
||||||
|
|
||||||
|
* `executionScript` Object
|
||||||
|
* `func` (...args: any[]) => any - A JavaScript function to execute. This function will be serialized which means
|
||||||
|
that any bound parameters and execution context will be lost.
|
||||||
|
* `args` any[] (optional) - An array of arguments to pass to the provided function. These
|
||||||
|
arguments will be copied between worlds in accordance with
|
||||||
|
[the table of supported types.](#parameter--error--return-type-support)
|
||||||
|
|
||||||
|
Returns `any` - A copy of the resulting value from executing the function in the main world.
|
||||||
|
[Refer to the table](#parameter--error--return-type-support) on how values are copied between worlds.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ The following example shows how to bounce your icon on the dock.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
const { app } = require('electron')
|
const { app } = require('electron')
|
||||||
app.dock.bounce()
|
app.dock?.bounce()
|
||||||
```
|
```
|
||||||
|
|
||||||
### Instance Methods
|
### Instance Methods
|
||||||
|
|||||||
@@ -12,9 +12,17 @@ shortcuts.
|
|||||||
not have the keyboard focus. This module cannot be used before the `ready`
|
not have the keyboard focus. This module cannot be used before the `ready`
|
||||||
event of the app module is emitted.
|
event of the app module is emitted.
|
||||||
|
|
||||||
|
Please also note that it is also possible to use Chromium's
|
||||||
|
`GlobalShortcutsPortal` implementation, which allows apps to bind global
|
||||||
|
shortcuts when running within a Wayland session.
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { app, globalShortcut } = require('electron')
|
const { app, globalShortcut } = require('electron')
|
||||||
|
|
||||||
|
// Enable usage of Portal's globalShortcuts. This is essential for cases when
|
||||||
|
// the app runs in a Wayland session.
|
||||||
|
app.commandLine.appendSwitch('enable-features', 'GlobalShortcutsPortal')
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
// Register a 'CommandOrControl+X' shortcut listener.
|
// Register a 'CommandOrControl+X' shortcut listener.
|
||||||
const ret = globalShortcut.register('CommandOrControl+X', () => {
|
const ret = globalShortcut.register('CommandOrControl+X', () => {
|
||||||
|
|||||||
@@ -10,13 +10,13 @@ The `inAppPurchase` module emits the following events:
|
|||||||
|
|
||||||
### Event: 'transactions-updated'
|
### Event: 'transactions-updated'
|
||||||
|
|
||||||
Emitted when one or more transactions have been updated.
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
* `event` Event
|
* `event` Event
|
||||||
* `transactions` Transaction[] - Array of [`Transaction`](structures/transaction.md) objects.
|
* `transactions` Transaction[] - Array of [`Transaction`](structures/transaction.md) objects.
|
||||||
|
|
||||||
|
Emitted when one or more transactions have been updated.
|
||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
|
|
||||||
The `inAppPurchase` module has the following methods:
|
The `inAppPurchase` module has the following methods:
|
||||||
|
|||||||
75
docs/api/ipc-main-service-worker.md
Normal file
75
docs/api/ipc-main-service-worker.md
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
## Class: IpcMainServiceWorker
|
||||||
|
|
||||||
|
> Communicate asynchronously from the main process to service workers.
|
||||||
|
|
||||||
|
Process: [Main](../glossary.md#main-process)
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> This API is a subtle variation of [`IpcMain`](ipc-main.md)—targeted for
|
||||||
|
> communicating with service workers. For communicating with web frames,
|
||||||
|
> consult the `IpcMain` documentation.
|
||||||
|
|
||||||
|
<!-- TODO(samuelmaddock): refactor doc gen to allow generics to reduce duplication -->
|
||||||
|
|
||||||
|
### Instance Methods
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.on(channel, listener)`
|
||||||
|
|
||||||
|
* `channel` string
|
||||||
|
* `listener` Function
|
||||||
|
* `event` [IpcMainServiceWorkerEvent][ipc-main-service-worker-event]
|
||||||
|
* `...args` any[]
|
||||||
|
|
||||||
|
Listens to `channel`, when a new message arrives `listener` would be called with
|
||||||
|
`listener(event, args...)`.
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.once(channel, listener)`
|
||||||
|
|
||||||
|
* `channel` string
|
||||||
|
* `listener` Function
|
||||||
|
* `event` [IpcMainServiceWorkerEvent][ipc-main-service-worker-event]
|
||||||
|
* `...args` any[]
|
||||||
|
|
||||||
|
Adds a one time `listener` function for the event. This `listener` is invoked
|
||||||
|
only the next time a message is sent to `channel`, after which it is removed.
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.removeListener(channel, listener)`
|
||||||
|
|
||||||
|
* `channel` string
|
||||||
|
* `listener` Function
|
||||||
|
* `...args` any[]
|
||||||
|
|
||||||
|
Removes the specified `listener` from the listener array for the specified
|
||||||
|
`channel`.
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.removeAllListeners([channel])`
|
||||||
|
|
||||||
|
* `channel` string (optional)
|
||||||
|
|
||||||
|
Removes listeners of the specified `channel`.
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.handle(channel, listener)`
|
||||||
|
|
||||||
|
* `channel` string
|
||||||
|
* `listener` Function\<Promise\<any\> | any\>
|
||||||
|
* `event` [IpcMainServiceWorkerInvokeEvent][ipc-main-service-worker-invoke-event]
|
||||||
|
* `...args` any[]
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.handleOnce(channel, listener)`
|
||||||
|
|
||||||
|
* `channel` string
|
||||||
|
* `listener` Function\<Promise\<any\> | any\>
|
||||||
|
* `event` [IpcMainServiceWorkerInvokeEvent][ipc-main-service-worker-invoke-event]
|
||||||
|
* `...args` any[]
|
||||||
|
|
||||||
|
Handles a single `invoke`able IPC message, then removes the listener. See
|
||||||
|
`ipcMainServiceWorker.handle(channel, listener)`.
|
||||||
|
|
||||||
|
#### `ipcMainServiceWorker.removeHandler(channel)`
|
||||||
|
|
||||||
|
* `channel` string
|
||||||
|
|
||||||
|
Removes any handler for `channel`, if present.
|
||||||
|
|
||||||
|
[ipc-main-service-worker-event]:../api/structures/ipc-main-service-worker-event.md
|
||||||
|
[ipc-main-service-worker-invoke-event]:../api/structures/ipc-main-service-worker-invoke-event.md
|
||||||
@@ -41,6 +41,16 @@ The `ipcRenderer` module has the following method to listen for events and send
|
|||||||
Listens to `channel`, when a new message arrives `listener` would be called with
|
Listens to `channel`, when a new message arrives `listener` would be called with
|
||||||
`listener(event, args...)`.
|
`listener(event, args...)`.
|
||||||
|
|
||||||
|
:::warning
|
||||||
|
Do not expose the `event` argument to the renderer for security reasons! Wrap any
|
||||||
|
callback that you receive from the renderer in another function like this:
|
||||||
|
`ipcRenderer.on('my-channel', (event, ...args) => callback(...args))`.
|
||||||
|
Not wrapping the callback in such a function would expose dangerous Electron APIs
|
||||||
|
to the renderer process. See the
|
||||||
|
[security guide](../tutorial/security.md#20-do-not-expose-electron-apis-to-untrusted-web-content)
|
||||||
|
for more info.
|
||||||
|
:::
|
||||||
|
|
||||||
### `ipcRenderer.off(channel, listener)`
|
### `ipcRenderer.off(channel, listener)`
|
||||||
|
|
||||||
* `channel` string
|
* `channel` string
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ See [`Menu`](menu.md) for examples.
|
|||||||
* `type` string (optional) - Can be `normal`, `separator`, `submenu`, `checkbox` or
|
* `type` string (optional) - Can be `normal`, `separator`, `submenu`, `checkbox` or
|
||||||
`radio`.
|
`radio`.
|
||||||
* `label` string (optional)
|
* `label` string (optional)
|
||||||
* `sublabel` string (optional)
|
* `sublabel` string (optional) _macOS_ - Available in macOS >= 14.4
|
||||||
* `toolTip` string (optional) _macOS_ - Hover text for this menu item.
|
* `toolTip` string (optional) _macOS_ - Hover text for this menu item.
|
||||||
* `accelerator` [Accelerator](accelerator.md) (optional)
|
* `accelerator` [Accelerator](accelerator.md) (optional)
|
||||||
* `icon` ([NativeImage](native-image.md) | string) (optional)
|
* `icon` ([NativeImage](native-image.md) | string) (optional)
|
||||||
|
|||||||
@@ -327,6 +327,27 @@ name, no matter what label you set. To change it, modify your app bundle's
|
|||||||
[About Information Property List Files][AboutInformationPropertyListFiles]
|
[About Information Property List Files][AboutInformationPropertyListFiles]
|
||||||
for more information.
|
for more information.
|
||||||
|
|
||||||
|
### Menu Sublabels
|
||||||
|
|
||||||
|
Menu sublabels, or [subtitles](https://developer.apple.com/documentation/appkit/nsmenuitem/subtitle?language=objc), can be added to menu items using the `sublabel` option. Below is an example based on the renderer example above:
|
||||||
|
|
||||||
|
```js @ts-expect-error=[12]
|
||||||
|
// main
|
||||||
|
ipcMain.on('show-context-menu', (event) => {
|
||||||
|
const template = [
|
||||||
|
{
|
||||||
|
label: 'Menu Item 1',
|
||||||
|
sublabel: 'Subtitle 1',
|
||||||
|
click: () => { event.sender.send('context-menu-command', 'menu-item-1') }
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ label: 'Menu Item 2', sublabel: 'Subtitle 2', type: 'checkbox', checked: true }
|
||||||
|
]
|
||||||
|
const menu = Menu.buildFromTemplate(template)
|
||||||
|
menu.popup({ window: BrowserWindow.fromWebContents(event.sender) })
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
## Setting Menu for Specific Browser Window (_Linux_ _Windows_)
|
## Setting Menu for Specific Browser Window (_Linux_ _Windows_)
|
||||||
|
|
||||||
The [`setMenu` method][setMenu] of browser windows can set the menu of certain
|
The [`setMenu` method][setMenu] of browser windows can set the menu of certain
|
||||||
|
|||||||
@@ -63,6 +63,14 @@ Your application should then always use `shouldUseDarkColors` to determine what
|
|||||||
A `boolean` for if the OS / Chromium currently has high-contrast mode enabled
|
A `boolean` for if the OS / Chromium currently has high-contrast mode enabled
|
||||||
or is being instructed to show a high-contrast UI.
|
or is being instructed to show a high-contrast UI.
|
||||||
|
|
||||||
|
### `nativeTheme.shouldUseDarkColorsForSystemIntegratedUI` _macOS_ _Windows_ _Readonly_
|
||||||
|
|
||||||
|
A `boolean` property indicating whether or not the system theme has been set to dark or light.
|
||||||
|
|
||||||
|
On Windows this property distinguishes between system and app light/dark theme, returning
|
||||||
|
`true` if the system theme is set to dark theme and `false` otherwise. On macOS the return
|
||||||
|
value will be the same as `nativeTheme.shouldUseDarkColors`.
|
||||||
|
|
||||||
### `nativeTheme.shouldUseInvertedColorScheme` _macOS_ _Windows_ _Readonly_
|
### `nativeTheme.shouldUseInvertedColorScheme` _macOS_ _Windows_ _Readonly_
|
||||||
|
|
||||||
A `boolean` for if the OS / Chromium currently has an inverted color scheme
|
A `boolean` for if the OS / Chromium currently has an inverted color scheme
|
||||||
|
|||||||
@@ -5,7 +5,16 @@
|
|||||||
Process: [Main](../glossary.md#main-process)<br />
|
Process: [Main](../glossary.md#main-process)<br />
|
||||||
_This class is not exported from the `'electron'` module. It is only available as a return value of other methods in the Electron API._
|
_This class is not exported from the `'electron'` module. It is only available as a return value of other methods in the Electron API._
|
||||||
|
|
||||||
Each navigation entry corresponds to a specific page. The indexing system follows a sequential order, where the first available navigation entry is at index 0, representing the earliest visited page, and the latest navigation entry is at index N, representing the most recent page. Maintaining this ordered list of navigation entries enables seamless navigation both backward and forward through the user's browsing history.
|
Each [NavigationEntry](./structures/navigation-entry.md) corresponds to a specific visited page.
|
||||||
|
The indexing system follows a sequential order, where the entry for the earliest visited
|
||||||
|
page is at index 0 and the entry for the most recent visited page is at index N.
|
||||||
|
|
||||||
|
Some APIs in this class also accept an _offset_, which is an integer representing the relative
|
||||||
|
position of an index from the current entry according to the above indexing system (i.e. an offset
|
||||||
|
value of `1` would represent going forward in history by one page).
|
||||||
|
|
||||||
|
Maintaining this ordered list of navigation entries enables seamless navigation both backward and
|
||||||
|
forward through the user's browsing history.
|
||||||
|
|
||||||
### Instance Methods
|
### Instance Methods
|
||||||
|
|
||||||
@@ -21,7 +30,7 @@ Returns `boolean` - Whether the browser can go forward to next web page.
|
|||||||
|
|
||||||
* `offset` Integer
|
* `offset` Integer
|
||||||
|
|
||||||
Returns `boolean` - Whether the web page can go to the specified `offset` from the current entry.
|
Returns `boolean` - Whether the web page can go to the specified relative `offset` from the current entry.
|
||||||
|
|
||||||
#### `navigationHistory.clear()`
|
#### `navigationHistory.clear()`
|
||||||
|
|
||||||
@@ -57,7 +66,7 @@ Navigates browser to the specified absolute web page index.
|
|||||||
|
|
||||||
* `offset` Integer
|
* `offset` Integer
|
||||||
|
|
||||||
Navigates to the specified offset from the current entry.
|
Navigates to the specified relative offset from the current entry.
|
||||||
|
|
||||||
#### `navigationHistory.length()`
|
#### `navigationHistory.length()`
|
||||||
|
|
||||||
@@ -74,3 +83,22 @@ Returns `boolean` - Whether the navigation entry was removed from the webContent
|
|||||||
#### `navigationHistory.getAllEntries()`
|
#### `navigationHistory.getAllEntries()`
|
||||||
|
|
||||||
Returns [`NavigationEntry[]`](structures/navigation-entry.md) - WebContents complete history.
|
Returns [`NavigationEntry[]`](structures/navigation-entry.md) - WebContents complete history.
|
||||||
|
|
||||||
|
#### `navigationHistory.restore(options)`
|
||||||
|
|
||||||
|
Restores navigation history and loads the given entry in the in stack. Will make a best effort
|
||||||
|
to restore not just the navigation stack but also the state of the individual pages - for instance
|
||||||
|
including HTML form values or the scroll position. It's recommended to call this API before any
|
||||||
|
navigation entries are created, so ideally before you call `loadURL()` or `loadFile()` on the
|
||||||
|
`webContents` object.
|
||||||
|
|
||||||
|
This API allows you to create common flows that aim to restore, recreate, or clone other webContents.
|
||||||
|
|
||||||
|
* `options` Object
|
||||||
|
* `entries` [NavigationEntry[]](structures/navigation-entry.md) - Result of a prior `getAllEntries()` call
|
||||||
|
* `index` Integer (optional) - Index of the stack that should be loaded. If you set it to `0`, the webContents will load the first (oldest) entry. If you leave it undefined, Electron will automatically load the last (newest) entry.
|
||||||
|
|
||||||
|
Returns `Promise<void>` - the promise will resolve when the page has finished loading the selected navigation entry
|
||||||
|
(see [`did-finish-load`](web-contents.md#event-did-finish-load)), and rejects
|
||||||
|
if the page fails to load (see
|
||||||
|
[`did-fail-load`](web-contents.md#event-did-fail-load)). A noop rejection handler is already attached, which avoids unhandled rejection errors.
|
||||||
|
|||||||
@@ -26,7 +26,10 @@ Emitted when system changes to battery power.
|
|||||||
|
|
||||||
### Event: 'thermal-state-change' _macOS_
|
### Event: 'thermal-state-change' _macOS_
|
||||||
|
|
||||||
* `state` string - The system's new thermal state. Can be `unknown`, `nominal`, `fair`, `serious`, `critical`.
|
Returns:
|
||||||
|
|
||||||
|
* `details` Event\<\>
|
||||||
|
* `state` string - The system's new thermal state. Can be `unknown`, `nominal`, `fair`, `serious`, `critical`.
|
||||||
|
|
||||||
Emitted when the thermal state of the system changes. Notification of a change
|
Emitted when the thermal state of the system changes. Notification of a change
|
||||||
in the thermal status of the system, such as entering a critical temperature
|
in the thermal status of the system, such as entering a critical temperature
|
||||||
@@ -44,7 +47,8 @@ See https://developer.apple.com/library/archive/documentation/Performance/Concep
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
* `limit` number - The operating system's advertised speed limit for CPUs, in percent.
|
* `details` Event\<\>
|
||||||
|
* `limit` number - The operating system's advertised speed limit for CPUs, in percent.
|
||||||
|
|
||||||
Notification of a change in the operating system's advertised speed limit for
|
Notification of a change in the operating system's advertised speed limit for
|
||||||
CPUs, in percent. Values below 100 indicate that the system is impairing
|
CPUs, in percent. Values below 100 indicate that the system is impairing
|
||||||
|
|||||||
@@ -114,6 +114,7 @@ A `string` representing the current process's type, can be:
|
|||||||
|
|
||||||
* `browser` - The main process
|
* `browser` - The main process
|
||||||
* `renderer` - A renderer process
|
* `renderer` - A renderer process
|
||||||
|
* `service-worker` - In a service worker
|
||||||
* `worker` - In a web worker
|
* `worker` - In a web worker
|
||||||
* `utility` - In a node process launched as a service
|
* `utility` - In a node process launched as a service
|
||||||
|
|
||||||
|
|||||||
@@ -46,4 +46,7 @@ See: https://developer.apple.com/documentation/appkit/nsapplication/1428476-regi
|
|||||||
### `pushNotifications.unregisterForAPNSNotifications()` _macOS_
|
### `pushNotifications.unregisterForAPNSNotifications()` _macOS_
|
||||||
|
|
||||||
Unregisters the app from notifications received from APNS.
|
Unregisters the app from notifications received from APNS.
|
||||||
|
|
||||||
|
Apps unregistered through this method can always reregister.
|
||||||
|
|
||||||
See: https://developer.apple.com/documentation/appkit/nsapplication/1428747-unregisterforremotenotifications?language=objc
|
See: https://developer.apple.com/documentation/appkit/nsapplication/1428747-unregisterforremotenotifications?language=objc
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ Returns [`Display`](structures/display.md) - The display nearest the specified p
|
|||||||
Returns [`Display`](structures/display.md) - The display that most closely
|
Returns [`Display`](structures/display.md) - The display that most closely
|
||||||
intersects the provided bounds.
|
intersects the provided bounds.
|
||||||
|
|
||||||
### `screen.screenToDipPoint(point)` _Windows_
|
### `screen.screenToDipPoint(point)` _Windows_ _Linux_
|
||||||
|
|
||||||
* `point` [Point](structures/point.md)
|
* `point` [Point](structures/point.md)
|
||||||
|
|
||||||
@@ -133,7 +133,10 @@ Returns [`Point`](structures/point.md)
|
|||||||
Converts a screen physical point to a screen DIP point.
|
Converts a screen physical point to a screen DIP point.
|
||||||
The DPI scale is performed relative to the display containing the physical point.
|
The DPI scale is performed relative to the display containing the physical point.
|
||||||
|
|
||||||
### `screen.dipToScreenPoint(point)` _Windows_
|
Not currently supported on Wayland - if used there it will return the point passed
|
||||||
|
in with no changes.
|
||||||
|
|
||||||
|
### `screen.dipToScreenPoint(point)` _Windows_ _Linux_
|
||||||
|
|
||||||
* `point` [Point](structures/point.md)
|
* `point` [Point](structures/point.md)
|
||||||
|
|
||||||
@@ -142,6 +145,8 @@ Returns [`Point`](structures/point.md)
|
|||||||
Converts a screen DIP point to a screen physical point.
|
Converts a screen DIP point to a screen physical point.
|
||||||
The DPI scale is performed relative to the display containing the DIP point.
|
The DPI scale is performed relative to the display containing the DIP point.
|
||||||
|
|
||||||
|
Not currently supported on Wayland.
|
||||||
|
|
||||||
### `screen.screenToDipRect(window, rect)` _Windows_
|
### `screen.screenToDipRect(window, rect)` _Windows_
|
||||||
|
|
||||||
* `window` [BrowserWindow](browser-window.md) | null
|
* `window` [BrowserWindow](browser-window.md) | null
|
||||||
|
|||||||
54
docs/api/service-worker-main.md
Normal file
54
docs/api/service-worker-main.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# ServiceWorkerMain
|
||||||
|
|
||||||
|
> An instance of a Service Worker representing a version of a script for a given scope.
|
||||||
|
|
||||||
|
Process: [Main](../glossary.md#main-process)
|
||||||
|
|
||||||
|
## Class: ServiceWorkerMain
|
||||||
|
|
||||||
|
Process: [Main](../glossary.md#main-process)<br />
|
||||||
|
_This class is not exported from the `'electron'` module. It is only available as a return value of other methods in the Electron API._
|
||||||
|
|
||||||
|
### Instance Methods
|
||||||
|
|
||||||
|
#### `serviceWorker.isDestroyed()` _Experimental_
|
||||||
|
|
||||||
|
Returns `boolean` - Whether the service worker has been destroyed.
|
||||||
|
|
||||||
|
#### `serviceWorker.send(channel, ...args)` _Experimental_
|
||||||
|
|
||||||
|
- `channel` string
|
||||||
|
- `...args` any[]
|
||||||
|
|
||||||
|
Send an asynchronous message to the service worker process via `channel`, along with
|
||||||
|
arguments. Arguments will be serialized with the [Structured Clone Algorithm][SCA],
|
||||||
|
just like [`postMessage`][], so prototype chains will not be included.
|
||||||
|
Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will throw an exception.
|
||||||
|
|
||||||
|
The service worker process can handle the message by listening to `channel` with the
|
||||||
|
[`ipcRenderer`](ipc-renderer.md) module.
|
||||||
|
|
||||||
|
#### `serviceWorker.startTask()` _Experimental_
|
||||||
|
|
||||||
|
Returns `Object`:
|
||||||
|
|
||||||
|
- `end` Function - Method to call when the task has ended. If never called, the service won't terminate while otherwise idle.
|
||||||
|
|
||||||
|
Initiate a task to keep the service worker alive until ended.
|
||||||
|
|
||||||
|
### Instance Properties
|
||||||
|
|
||||||
|
#### `serviceWorker.ipc` _Readonly_ _Experimental_
|
||||||
|
|
||||||
|
An [`IpcMainServiceWorker`](ipc-main-service-worker.md) instance scoped to the service worker.
|
||||||
|
|
||||||
|
#### `serviceWorker.scope` _Readonly_ _Experimental_
|
||||||
|
|
||||||
|
A `string` representing the scope URL of the service worker.
|
||||||
|
|
||||||
|
#### `serviceWorker.versionId` _Readonly_ _Experimental_
|
||||||
|
|
||||||
|
A `number` representing the ID of the specific version of the service worker script in its scope.
|
||||||
|
|
||||||
|
[SCA]: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm
|
||||||
|
[`postMessage`]: https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage
|
||||||
@@ -56,6 +56,17 @@ Returns:
|
|||||||
|
|
||||||
Emitted when a service worker has been registered. Can occur after a call to [`navigator.serviceWorker.register('/sw.js')`](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register) successfully resolves or when a Chrome extension is loaded.
|
Emitted when a service worker has been registered. Can occur after a call to [`navigator.serviceWorker.register('/sw.js')`](https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerContainer/register) successfully resolves or when a Chrome extension is loaded.
|
||||||
|
|
||||||
|
#### Event: 'running-status-changed' _Experimental_
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
* `details` Event\<\>
|
||||||
|
* `versionId` number - ID of the updated service worker version
|
||||||
|
* `runningStatus` string - Running status.
|
||||||
|
Possible values include `starting`, `running`, `stopping`, or `stopped`.
|
||||||
|
|
||||||
|
Emitted when a service worker's running status has changed.
|
||||||
|
|
||||||
### Instance Methods
|
### Instance Methods
|
||||||
|
|
||||||
The following methods are available on instances of `ServiceWorkers`:
|
The following methods are available on instances of `ServiceWorkers`:
|
||||||
@@ -64,10 +75,55 @@ The following methods are available on instances of `ServiceWorkers`:
|
|||||||
|
|
||||||
Returns `Record<number, ServiceWorkerInfo>` - A [ServiceWorkerInfo](structures/service-worker-info.md) object where the keys are the service worker version ID and the values are the information about that service worker.
|
Returns `Record<number, ServiceWorkerInfo>` - A [ServiceWorkerInfo](structures/service-worker-info.md) object where the keys are the service worker version ID and the values are the information about that service worker.
|
||||||
|
|
||||||
#### `serviceWorkers.getFromVersionID(versionId)`
|
#### `serviceWorkers.getInfoFromVersionID(versionId)`
|
||||||
|
|
||||||
* `versionId` number
|
* `versionId` number - ID of the service worker version
|
||||||
|
|
||||||
Returns [`ServiceWorkerInfo`](structures/service-worker-info.md) - Information about this service worker
|
Returns [`ServiceWorkerInfo`](structures/service-worker-info.md) - Information about this service worker
|
||||||
|
|
||||||
If the service worker does not exist or is not running this method will throw an exception.
|
If the service worker does not exist or is not running this method will throw an exception.
|
||||||
|
|
||||||
|
#### `serviceWorkers.getFromVersionID(versionId)` _Deprecated_
|
||||||
|
|
||||||
|
* `versionId` number - ID of the service worker version
|
||||||
|
|
||||||
|
Returns [`ServiceWorkerInfo`](structures/service-worker-info.md) - Information about this service worker
|
||||||
|
|
||||||
|
If the service worker does not exist or is not running this method will throw an exception.
|
||||||
|
|
||||||
|
**Deprecated:** Use the new `serviceWorkers.getInfoFromVersionID` API.
|
||||||
|
|
||||||
|
#### `serviceWorkers.getWorkerFromVersionID(versionId)` _Experimental_
|
||||||
|
|
||||||
|
* `versionId` number - ID of the service worker version
|
||||||
|
|
||||||
|
Returns [`ServiceWorkerMain | undefined`](service-worker-main.md) - Instance of the service worker associated with the given version ID. If there's no associated version, or its running status has changed to 'stopped', this will return `undefined`.
|
||||||
|
|
||||||
|
#### `serviceWorkers.startWorkerForScope(scope)` _Experimental_
|
||||||
|
|
||||||
|
* `scope` string - The scope of the service worker to start.
|
||||||
|
|
||||||
|
Returns `Promise<ServiceWorkerMain>` - Resolves with the service worker when it's started.
|
||||||
|
|
||||||
|
Starts the service worker or does nothing if already running.
|
||||||
|
|
||||||
|
```js
|
||||||
|
const { app, session } = require('electron')
|
||||||
|
const { serviceWorkers } = session.defaultSession
|
||||||
|
|
||||||
|
// Collect service workers scopes
|
||||||
|
const workerScopes = Object.values(serviceWorkers.getAllRunning()).map((info) => info.scope)
|
||||||
|
|
||||||
|
app.on('browser-window-created', async (event, window) => {
|
||||||
|
for (const scope of workerScopes) {
|
||||||
|
try {
|
||||||
|
// Ensure worker is started
|
||||||
|
const serviceWorker = await serviceWorkers.startWorkerForScope(scope)
|
||||||
|
serviceWorker.send('window-created', { windowId: window.id })
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`Failed to start service worker for ${scope}`)
|
||||||
|
console.error(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|||||||
@@ -933,6 +933,7 @@ session.fromPartition('some-partition').setPermissionRequestHandler((webContents
|
|||||||
* `storage-access` - Allows content loaded in a third-party context to request access to third-party cookies using the [Storage Access API](https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API).
|
* `storage-access` - Allows content loaded in a third-party context to request access to third-party cookies using the [Storage Access API](https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API).
|
||||||
* `top-level-storage-access` - Allow top-level sites to request third-party cookie access on behalf of embedded content originating from another site in the same related website set using the [Storage Access API](https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API).
|
* `top-level-storage-access` - Allow top-level sites to request third-party cookie access on behalf of embedded content originating from another site in the same related website set using the [Storage Access API](https://developer.mozilla.org/en-US/docs/Web/API/Storage_Access_API).
|
||||||
* `usb` - Expose non-standard Universal Serial Bus (USB) compatible devices services to the web with the [WebUSB API](https://developer.mozilla.org/en-US/docs/Web/API/WebUSB_API).
|
* `usb` - Expose non-standard Universal Serial Bus (USB) compatible devices services to the web with the [WebUSB API](https://developer.mozilla.org/en-US/docs/Web/API/WebUSB_API).
|
||||||
|
* `deprecated-sync-clipboard-read` _Deprecated_ - Request access to run `document.execCommand("paste")`
|
||||||
* `requestingOrigin` string - The origin URL of the permission check
|
* `requestingOrigin` string - The origin URL of the permission check
|
||||||
* `details` Object - Some properties are only available on certain permission types.
|
* `details` Object - Some properties are only available on certain permission types.
|
||||||
* `embeddingOrigin` string (optional) - The origin of the frame embedding the frame that made the permission check. Only set for cross-origin sub frames making permission checks.
|
* `embeddingOrigin` string (optional) - The origin of the frame embedding the frame that made the permission check. Only set for cross-origin sub frames making permission checks.
|
||||||
@@ -1330,18 +1331,43 @@ the initial state will be `interrupted`. The download will start only when the
|
|||||||
|
|
||||||
Returns `Promise<void>` - resolves when the session’s HTTP authentication cache has been cleared.
|
Returns `Promise<void>` - resolves when the session’s HTTP authentication cache has been cleared.
|
||||||
|
|
||||||
#### `ses.setPreloads(preloads)`
|
#### `ses.setPreloads(preloads)` _Deprecated_
|
||||||
|
|
||||||
* `preloads` string[] - An array of absolute path to preload scripts
|
* `preloads` string[] - An array of absolute path to preload scripts
|
||||||
|
|
||||||
Adds scripts that will be executed on ALL web contents that are associated with
|
Adds scripts that will be executed on ALL web contents that are associated with
|
||||||
this session just before normal `preload` scripts run.
|
this session just before normal `preload` scripts run.
|
||||||
|
|
||||||
#### `ses.getPreloads()`
|
**Deprecated:** Use the new `ses.registerPreloadScript` API.
|
||||||
|
|
||||||
|
#### `ses.getPreloads()` _Deprecated_
|
||||||
|
|
||||||
Returns `string[]` an array of paths to preload scripts that have been
|
Returns `string[]` an array of paths to preload scripts that have been
|
||||||
registered.
|
registered.
|
||||||
|
|
||||||
|
**Deprecated:** Use the new `ses.getPreloadScripts` API. This will only return preload script paths
|
||||||
|
for `frame` context types.
|
||||||
|
|
||||||
|
#### `ses.registerPreloadScript(script)`
|
||||||
|
|
||||||
|
* `script` [PreloadScriptRegistration](structures/preload-script-registration.md) - Preload script
|
||||||
|
|
||||||
|
Registers preload script that will be executed in its associated context type in this session. For
|
||||||
|
`frame` contexts, this will run prior to any preload defined in the web preferences of a
|
||||||
|
WebContents.
|
||||||
|
|
||||||
|
Returns `string` - The ID of the registered preload script.
|
||||||
|
|
||||||
|
#### `ses.unregisterPreloadScript(id)`
|
||||||
|
|
||||||
|
* `id` string - Preload script ID
|
||||||
|
|
||||||
|
Unregisters script.
|
||||||
|
|
||||||
|
#### `ses.getPreloadScripts()`
|
||||||
|
|
||||||
|
Returns [`PreloadScript[]`](structures/preload-script.md): An array of paths to preload scripts that have been registered.
|
||||||
|
|
||||||
#### `ses.setCodeCachePath(path)`
|
#### `ses.setCodeCachePath(path)`
|
||||||
|
|
||||||
* `path` String - Absolute path to store the v8 generated JS code cache from the renderer.
|
* `path` String - Absolute path to store the v8 generated JS code cache from the renderer.
|
||||||
|
|||||||
@@ -58,8 +58,8 @@
|
|||||||
`false` on macOS. This option is not configurable on other platforms.
|
`false` on macOS. This option is not configurable on other platforms.
|
||||||
* `disableAutoHideCursor` boolean (optional) - Whether to hide cursor when typing.
|
* `disableAutoHideCursor` boolean (optional) - Whether to hide cursor when typing.
|
||||||
Default is `false`.
|
Default is `false`.
|
||||||
* `autoHideMenuBar` boolean (optional) - Auto hide the menu bar unless the `Alt`
|
* `autoHideMenuBar` boolean (optional) _Linux_ _Windows_ - Auto hide the menu bar
|
||||||
key is pressed. Default is `false`.
|
unless the `Alt` key is pressed. Default is `false`.
|
||||||
* `enableLargerThanScreen` boolean (optional) _macOS_ - Enable the window to
|
* `enableLargerThanScreen` boolean (optional) _macOS_ - Enable the window to
|
||||||
be resized larger than screen. Only relevant for macOS, as other OSes
|
be resized larger than screen. Only relevant for macOS, as other OSes
|
||||||
allow larger-than-screen windows by default. Default is `false`.
|
allow larger-than-screen windows by default. Default is `false`.
|
||||||
@@ -93,13 +93,15 @@
|
|||||||
**Note:** This option is currently experimental.
|
**Note:** This option is currently experimental.
|
||||||
* `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`.
|
* `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_ _Linux_ - 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.
|
* `symbolColor` String (optional) _Windows_ _Linux_ - The CSS color of the symbols on the Window Controls Overlay when enabled. Default is the system color.
|
||||||
* `height` Integer (optional) - 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.
|
||||||
|
* `accentColor` boolean | string (optional) _Windows_ - The accent color for the window. By default, follows user preference in System Settings. Set to `false` to explicitly disable, or set the color in Hex, RGB, RGBA, HSL, HSLA or named CSS color format. Alpha values will be ignored.
|
||||||
* `trafficLightPosition` [Point](point.md) (optional) _macOS_ -
|
* `trafficLightPosition` [Point](point.md) (optional) _macOS_ -
|
||||||
Set a custom position for the traffic light buttons in frameless windows.
|
Set a custom position for the traffic light buttons in frameless windows.
|
||||||
* `roundedCorners` boolean (optional) _macOS_ - Whether frameless window
|
* `roundedCorners` boolean (optional) _macOS_ _Windows_ - Whether frameless window
|
||||||
should have rounded corners on macOS. Default is `true`. Setting this property
|
should have rounded corners. Default is `true`. Setting this property
|
||||||
to `false` will prevent the window from being fullscreenable.
|
to `false` will prevent the window from being fullscreenable on macOS.
|
||||||
|
On Windows versions older than Windows 11 Build 22000 this property has no effect, and frameless windows will not have rounded corners.
|
||||||
* `thickFrame` boolean (optional) - Use `WS_THICKFRAME` style for frameless windows on
|
* `thickFrame` boolean (optional) - Use `WS_THICKFRAME` style for frameless windows on
|
||||||
Windows, which adds standard window frame. Setting it to `false` will remove
|
Windows, which adds standard window frame. Setting it to `false` will remove
|
||||||
window shadow and window animations. Default is `true`.
|
window shadow and window animations. Default is `true`.
|
||||||
@@ -149,7 +151,7 @@ Possible values are:
|
|||||||
focus, keyboard or mouse events, but you can use `globalShortcut` to receive
|
focus, keyboard or mouse events, but you can use `globalShortcut` to receive
|
||||||
input sparingly.
|
input sparingly.
|
||||||
* The `panel` type enables the window to float on top of full-screened apps
|
* The `panel` type enables the window to float on top of full-screened apps
|
||||||
by adding the `NSWindowStyleMaskNonactivatingPanel` style mask,normally
|
by adding the `NSWindowStyleMaskNonactivatingPanel` style mask, normally
|
||||||
reserved for NSPanel, at runtime. Also, the window will appear on all
|
reserved for NSPanel, at runtime. Also, the window will appear on all
|
||||||
spaces (desktops).
|
spaces (desktops).
|
||||||
* On Windows, possible type is `toolbar`.
|
* On Windows, possible type is `toolbar`.
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* `colorDepth` number - The number of bits per pixel.
|
* `colorDepth` number - The number of bits per pixel.
|
||||||
* `colorSpace` string - represent a color space (three-dimensional object which contains all realizable color combinations) for the purpose of color conversions.
|
* `colorSpace` string - represent a color space (three-dimensional object which contains all realizable color combinations) for the purpose of color conversions.
|
||||||
* `depthPerComponent` number - The number of bits per color component.
|
* `depthPerComponent` number - The number of bits per color component.
|
||||||
* `detected` boolean - `true`` if the display is detected by the system.
|
* `detected` boolean - `true` if the display is detected by the system.
|
||||||
* `displayFrequency` number - The display refresh rate.
|
* `displayFrequency` number - The display refresh rate.
|
||||||
* `id` number - Unique identifier associated with the display. A value of of -1 means the display is invalid or the correct `id` is not yet known, and a value of -10 means the display is a virtual display assigned to a unified desktop.
|
* `id` number - Unique identifier associated with the display. A value of of -1 means the display is invalid or the correct `id` is not yet known, and a value of -10 means the display is a virtual display assigned to a unified desktop.
|
||||||
* `internal` boolean - `true` for an internal display and `false` for an external display.
|
* `internal` boolean - `true` for an internal display and `false` for an external display.
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# IpcMainEvent Object extends `Event`
|
# IpcMainEvent Object extends `Event`
|
||||||
|
|
||||||
|
* `type` String - Possible values include `frame`
|
||||||
* `processId` Integer - The internal ID of the renderer process that sent this message
|
* `processId` Integer - The internal ID of the renderer process that sent this message
|
||||||
* `frameId` Integer - The ID of the renderer frame that sent this message
|
* `frameId` Integer - The ID of the renderer frame that sent this message
|
||||||
* `returnValue` any - Set this to the value to be returned in a synchronous message
|
* `returnValue` any - Set this to the value to be returned in a synchronous message
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# IpcMainInvokeEvent Object extends `Event`
|
# IpcMainInvokeEvent Object extends `Event`
|
||||||
|
|
||||||
|
* `type` String - Possible values include `frame`
|
||||||
* `processId` Integer - The internal ID of the renderer process that sent this message
|
* `processId` Integer - The internal ID of the renderer process that sent this message
|
||||||
* `frameId` Integer - The ID of the renderer frame that sent this message
|
* `frameId` Integer - The ID of the renderer frame that sent this message
|
||||||
* `sender` [WebContents](../web-contents.md) - Returns the `webContents` that sent the message
|
* `sender` [WebContents](../web-contents.md) - Returns the `webContents` that sent the message
|
||||||
|
|||||||
11
docs/api/structures/ipc-main-service-worker-event.md
Normal file
11
docs/api/structures/ipc-main-service-worker-event.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# IpcMainServiceWorkerEvent Object extends `Event`
|
||||||
|
|
||||||
|
* `type` String - Possible values include `service-worker`.
|
||||||
|
* `serviceWorker` [ServiceWorkerMain](../service-worker-main.md) _Readonly_ - The service worker that sent this message
|
||||||
|
* `versionId` Number - The service worker version ID.
|
||||||
|
* `session` Session - The [`Session`](../session.md) instance with which the event is associated.
|
||||||
|
* `returnValue` any - Set this to the value to be returned in a synchronous message
|
||||||
|
* `ports` [MessagePortMain](../message-port-main.md)[] - A list of MessagePorts that were transferred with this message
|
||||||
|
* `reply` Function - A function that will send an IPC message to the renderer frame that sent the original message that you are currently handling. You should use this method to "reply" to the sent message in order to guarantee the reply will go to the correct process and frame.
|
||||||
|
* `channel` string
|
||||||
|
* `...args` any[]
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
# IpcMainServiceWorkerInvokeEvent Object extends `Event`
|
||||||
|
|
||||||
|
* `type` String - Possible values include `service-worker`.
|
||||||
|
* `serviceWorker` [ServiceWorkerMain](../service-worker-main.md) _Readonly_ - The service worker that sent this message
|
||||||
|
* `versionId` Number - The service worker version ID.
|
||||||
|
* `session` Session - The [`Session`](../session.md) instance with which the event is associated.
|
||||||
@@ -2,3 +2,6 @@
|
|||||||
|
|
||||||
* `url` string
|
* `url` string
|
||||||
* `title` string
|
* `title` string
|
||||||
|
* `pageState` string (optional) - A base64 encoded data string containing Chromium page state
|
||||||
|
including information like the current scroll position or form values. It is committed by
|
||||||
|
Chromium before a navigation event and on a regular interval.
|
||||||
|
|||||||
6
docs/api/structures/preload-script-registration.md
Normal file
6
docs/api/structures/preload-script-registration.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# PreloadScriptRegistration Object
|
||||||
|
|
||||||
|
* `type` string - Context type where the preload script will be executed.
|
||||||
|
Possible values include `frame` or `service-worker`.
|
||||||
|
* `id` string (optional) - Unique ID of preload script. Defaults to a random UUID.
|
||||||
|
* `filePath` string - Path of the script file. Must be an absolute path.
|
||||||
6
docs/api/structures/preload-script.md
Normal file
6
docs/api/structures/preload-script.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# PreloadScript Object
|
||||||
|
|
||||||
|
* `type` string - Context type where the preload script will be executed.
|
||||||
|
Possible values include `frame` or `service-worker`.
|
||||||
|
* `id` string - Unique ID of preload script.
|
||||||
|
* `filePath` string - Path of the script file. Must be an absolute path.
|
||||||
@@ -3,3 +3,4 @@
|
|||||||
* `scriptUrl` string - The full URL to the script that this service worker runs
|
* `scriptUrl` string - The full URL to the script that this service worker runs
|
||||||
* `scope` string - The base URL that this service worker is active for.
|
* `scope` string - The base URL that this service worker is active for.
|
||||||
* `renderProcessId` number - The virtual ID of the process that this service worker is running in. This is not an OS level PID. This aligns with the ID set used for `webContents.getProcessId()`.
|
* `renderProcessId` number - The virtual ID of the process that this service worker is running in. This is not an OS level PID. This aligns with the ID set used for `webContents.getProcessId()`.
|
||||||
|
* `versionId` number - ID of the service worker version
|
||||||
|
|||||||
@@ -148,6 +148,7 @@
|
|||||||
this will cause the `preferred-size-changed` event to be emitted on the
|
this will cause the `preferred-size-changed` event to be emitted on the
|
||||||
`WebContents` when the preferred size changes. Default is `false`.
|
`WebContents` when the preferred size changes. Default is `false`.
|
||||||
* `transparent` boolean (optional) - Whether to enable background transparency for the guest page. Default is `true`. **Note:** The guest page's text and background colors are derived from the [color scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme) of its root element. When transparency is enabled, the text color will still change accordingly but the background will remain transparent.
|
* `transparent` boolean (optional) - Whether to enable background transparency for the guest page. Default is `true`. **Note:** The guest page's text and background colors are derived from the [color scheme](https://developer.mozilla.org/en-US/docs/Web/CSS/color-scheme) of its root element. When transparency is enabled, the text color will still change accordingly but the background will remain transparent.
|
||||||
|
* `enableDeprecatedPaste` boolean (optional) _Deprecated_ - Whether to enable the `paste` [execCommand](https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand). Default is `false`.
|
||||||
|
|
||||||
[chrome-content-scripts]: https://developer.chrome.com/extensions/content_scripts#execution-environment
|
[chrome-content-scripts]: https://developer.chrome.com/extensions/content_scripts#execution-environment
|
||||||
[runtime-enabled-features]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/runtime_enabled_features.json5
|
[runtime-enabled-features]: https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/runtime_enabled_features.json5
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# WebRequestFilter Object
|
# WebRequestFilter Object
|
||||||
|
|
||||||
* `urls` string[] - Array of [URL patterns](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Match_patterns) that will be used to filter out the requests that do not match the URL patterns.
|
* `urls` string[] - Array of [URL patterns](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Match_patterns) used to include requests that match these patterns. Use the pattern `<all_urls>` to match all URLs.
|
||||||
* `types` String[] (optional) - Array of types that will be used to filter out the requests that do not match the types. When not specified, all types will be matched. Can be `mainFrame`, `subFrame`, `stylesheet`, `script`, `image`, `font`, `object`, `xhr`, `ping`, `cspReport`, `media` or `webSocket`.
|
* `excludeUrls` string[] (optional) - Array of [URL patterns](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Match_patterns) used to exclude requests that match these patterns.
|
||||||
|
* `types` string[] (optional) - Array of types that will be used to filter out the requests that do not match the types. When not specified, all types will be matched. Can be `mainFrame`, `subFrame`, `stylesheet`, `script`, `image`, `font`, `object`, `xhr`, `ping`, `cspReport`, `media` or `webSocket`.
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Process: [Main](../glossary.md#main-process), [Utility](../glossary.md#utility-p
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
const { systemPreferences } = require('electron')
|
const { systemPreferences } = require('electron')
|
||||||
console.log(systemPreferences.isAeroGlassEnabled())
|
console.log(systemPreferences.getEffectiveAppearance())
|
||||||
```
|
```
|
||||||
|
|
||||||
## Events
|
## Events
|
||||||
@@ -181,35 +181,13 @@ Some popular `key` and `type`s are:
|
|||||||
Removes the `key` in `NSUserDefaults`. This can be used to restore the default
|
Removes the `key` in `NSUserDefaults`. This can be used to restore the default
|
||||||
or global value of a `key` previously set with `setUserDefault`.
|
or global value of a `key` previously set with `setUserDefault`.
|
||||||
|
|
||||||
### `systemPreferences.isAeroGlassEnabled()` _Windows_
|
### `systemPreferences.isAeroGlassEnabled()` _Windows_ _Deprecated_
|
||||||
|
|
||||||
Returns `boolean` - `true` if [DWM composition][dwm-composition] (Aero Glass) is
|
Returns `boolean` - `true` if [DWM composition][dwm-composition] (Aero Glass) is
|
||||||
enabled, and `false` otherwise.
|
enabled, and `false` otherwise.
|
||||||
|
|
||||||
An example of using it to determine if you should create a transparent window or
|
**Deprecated:**
|
||||||
not (transparent windows won't work correctly when DWM composition is disabled):
|
This function has been always returning `true` since Electron 23, which only supports Windows 10+.
|
||||||
|
|
||||||
```js
|
|
||||||
const { BrowserWindow, systemPreferences } = require('electron')
|
|
||||||
const browserOptions = { width: 1000, height: 800 }
|
|
||||||
|
|
||||||
// Make the window transparent only if the platform supports it.
|
|
||||||
if (process.platform !== 'win32' || systemPreferences.isAeroGlassEnabled()) {
|
|
||||||
browserOptions.transparent = true
|
|
||||||
browserOptions.frame = false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create the window.
|
|
||||||
const win = new BrowserWindow(browserOptions)
|
|
||||||
|
|
||||||
// Navigate.
|
|
||||||
if (browserOptions.transparent) {
|
|
||||||
win.loadFile('index.html')
|
|
||||||
} else {
|
|
||||||
// No transparency, so we load a fallback that uses basic styles.
|
|
||||||
win.loadFile('fallback.html')
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
[dwm-composition]: https://learn.microsoft.com/en-us/windows/win32/dwm/composition-ovw
|
[dwm-composition]: https://learn.microsoft.com/en-us/windows/win32/dwm/composition-ovw
|
||||||
|
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ Process: [Main](../glossary.md#main-process)<br />
|
|||||||
|
|
||||||
Returns [`UtilityProcess`](utility-process.md#class-utilityprocess)
|
Returns [`UtilityProcess`](utility-process.md#class-utilityprocess)
|
||||||
|
|
||||||
|
**Note:** `utilityProcess.fork` can only be called after the `ready` event has been emitted on `App`.
|
||||||
|
|
||||||
## Class: UtilityProcess
|
## Class: UtilityProcess
|
||||||
|
|
||||||
> Instances of the `UtilityProcess` represent the Chromium spawned child process
|
> Instances of the `UtilityProcess` represent the Chromium spawned child process
|
||||||
|
|||||||
@@ -106,6 +106,12 @@ Examples of valid `color` values:
|
|||||||
|
|
||||||
* `visible` boolean - If false, the view will be hidden from display.
|
* `visible` boolean - If false, the view will be hidden from display.
|
||||||
|
|
||||||
|
#### `view.getVisible()`
|
||||||
|
|
||||||
|
Returns `boolean` - Whether the view should be drawn. Note that this is
|
||||||
|
different from whether the view is visible on screen—it may still be obscured
|
||||||
|
or out of view.
|
||||||
|
|
||||||
### Instance Properties
|
### Instance Properties
|
||||||
|
|
||||||
Objects created with `new View` have the following properties:
|
Objects created with `new View` have the following properties:
|
||||||
|
|||||||
@@ -838,9 +838,10 @@ Emitted when a bluetooth device needs to be selected when a call to
|
|||||||
the `deviceId` of the device to be selected. Passing an empty string to
|
the `deviceId` of the device to be selected. Passing an empty string to
|
||||||
`callback` will cancel the request.
|
`callback` will cancel the request.
|
||||||
|
|
||||||
If an event listener is not added for this event, or if `event.preventDefault`
|
If no event listener is added for this event, all bluetooth requests will be cancelled.
|
||||||
is not called when handling this event, the first available device will be
|
|
||||||
automatically selected.
|
If `event.preventDefault` is not called when handling this event, the first available
|
||||||
|
device will be automatically selected.
|
||||||
|
|
||||||
Due to the nature of bluetooth, scanning for devices when
|
Due to the nature of bluetooth, scanning for devices when
|
||||||
`navigator.bluetooth.requestDevice` is called may take time and will cause
|
`navigator.bluetooth.requestDevice` is called may take time and will cause
|
||||||
@@ -2389,7 +2390,7 @@ A [`WebFrameMain`](web-frame-main.md) property that represents the top frame of
|
|||||||
|
|
||||||
#### `contents.opener` _Readonly_
|
#### `contents.opener` _Readonly_
|
||||||
|
|
||||||
A [`WebFrameMain`](web-frame-main.md) property that represents the frame that opened this WebContents, either
|
A [`WebFrameMain | null`](web-frame-main.md) property that represents the frame that opened this WebContents, either
|
||||||
with open(), or by navigating a link with a target attribute.
|
with open(), or by navigating a link with a target attribute.
|
||||||
|
|
||||||
[keyboardevent]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
|
[keyboardevent]: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ The `callback` has to be called with an `response` object.
|
|||||||
Some examples of valid `urls`:
|
Some examples of valid `urls`:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
|
'<all_urls>'
|
||||||
'http://foo:1234/'
|
'http://foo:1234/'
|
||||||
'http://foo.com/'
|
'http://foo.com/'
|
||||||
'http://foo:1234/bar'
|
'http://foo:1234/bar'
|
||||||
|
|||||||
@@ -14,6 +14,58 @@ This document uses the following convention to categorize breaking changes:
|
|||||||
|
|
||||||
## Planned Breaking API Changes (35.0)
|
## Planned Breaking API Changes (35.0)
|
||||||
|
|
||||||
|
### Behavior Changes: `app.commandLine`
|
||||||
|
|
||||||
|
`app.commandLine` will convert upper-cases switches and arguments to lowercase.
|
||||||
|
|
||||||
|
`app.commandLine` was only meant to handle chromium switches (which aren't case-sensitive) and switches passed via `app.commandLine` will not be passed down to any of the child processes.
|
||||||
|
|
||||||
|
If you were using `app.commandLine` to control the behavior of the main process, you should do this via `process.argv`.
|
||||||
|
|
||||||
|
### Behavior Changed: Dialog API's `defaultPath` option on Linux
|
||||||
|
|
||||||
|
On Linux, the required portal version for file dialogs has been reverted
|
||||||
|
to 3 from 4. Using the `defaultPath` option of the Dialog API is not
|
||||||
|
supported when using portal file chooser dialogs unless the portal
|
||||||
|
backend is version 4 or higher. The `--xdg-portal-required-version`
|
||||||
|
[command-line switch](api/command-line-switches.md#--xdg-portal-required-versionversion)
|
||||||
|
can be used to force a required version for your application.
|
||||||
|
See [#44426](https://github.com/electron/electron/pull/44426) for more details.
|
||||||
|
|
||||||
|
### Deprecated: `setPreloads`, `getPreloads` on `Session`
|
||||||
|
|
||||||
|
`registerPreloadScript`, `unregisterPreloadScript`, and `getPreloadScripts` are introduced as a
|
||||||
|
replacement for the deprecated methods. These new APIs allow third-party libraries to register
|
||||||
|
preload scripts without replacing existing scripts. Also, the new `type` option allows for
|
||||||
|
additional preload targets beyond `frame`.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated
|
||||||
|
session.setPreloads([path.join(__dirname, 'preload.js')])
|
||||||
|
|
||||||
|
// Replace with:
|
||||||
|
session.registerPreloadScript({
|
||||||
|
type: 'frame',
|
||||||
|
id: 'app-preload',
|
||||||
|
filePath: path.join(__dirname, 'preload.js')
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deprecated: `getFromVersionID` on `session.serviceWorkers`
|
||||||
|
|
||||||
|
The `session.serviceWorkers.fromVersionID(versionId)` API has been deprecated
|
||||||
|
in favor of `session.serviceWorkers.getInfoFromVersionID(versionId)`. This was
|
||||||
|
changed to make it more clear which object is returned with the introduction
|
||||||
|
of the `session.serviceWorkers.getWorkerFromVersionID(versionId)` API.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated
|
||||||
|
session.serviceWorkers.fromVersionID(versionId)
|
||||||
|
|
||||||
|
// Replace with
|
||||||
|
session.serviceWorkers.getInfoFromVersionID(versionId)
|
||||||
|
```
|
||||||
|
|
||||||
### Deprecated: `level`, `message`, `line`, and `sourceId` arguments in `console-message` event on `WebContents`
|
### Deprecated: `level`, `message`, `line`, and `sourceId` arguments in `console-message` event on `WebContents`
|
||||||
|
|
||||||
The `console-message` event on `WebContents` has been updated to provide details on the `Event`
|
The `console-message` event on `WebContents` has been updated to provide details on the `Event`
|
||||||
@@ -29,6 +81,29 @@ webContents.on('console-message', ({ level, message, lineNumber, sourceId, frame
|
|||||||
|
|
||||||
Additionally, `level` is now a string with possible values of `info`, `warning`, `error`, and `debug`.
|
Additionally, `level` is now a string with possible values of `info`, `warning`, `error`, and `debug`.
|
||||||
|
|
||||||
|
### Behavior Changed: `urls` property of `WebRequestFilter`.
|
||||||
|
|
||||||
|
Previously, an empty urls array was interpreted as including all URLs. To explicitly include all URLs, developers should now use the `<all_urls>` pattern, which is a [designated URL pattern](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Match_patterns#all_urls) that matches every possible URL. This change clarifies the intent and ensures more predictable behavior.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated
|
||||||
|
const deprecatedFilter = {
|
||||||
|
urls: []
|
||||||
|
}
|
||||||
|
|
||||||
|
// Replace with
|
||||||
|
const newFilter = {
|
||||||
|
urls: ['<all_urls>']
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deprecated: `systemPreferences.isAeroGlassEnabled()`
|
||||||
|
|
||||||
|
The `systemPreferences.isAeroGlassEnabled()` function has been deprecated without replacement.
|
||||||
|
It has been always returning `true` since Electron 23, which only supports Windows 10+, where DWM composition can no longer be disabled.
|
||||||
|
|
||||||
|
https://learn.microsoft.com/en-us/windows/win32/dwm/composition-ovw#disabling-dwm-composition-windows7-and-earlier
|
||||||
|
|
||||||
## Planned Breaking API Changes (34.0)
|
## Planned Breaking API Changes (34.0)
|
||||||
|
|
||||||
### Behavior Changed: menu bar will be hidden during fullscreen on Windows
|
### Behavior Changed: menu bar will be hidden during fullscreen on Windows
|
||||||
@@ -39,6 +114,15 @@ This brings the behavior to parity with Linux. Prior behavior: Menu bar is still
|
|||||||
|
|
||||||
## Planned Breaking API Changes (33.0)
|
## Planned Breaking API Changes (33.0)
|
||||||
|
|
||||||
|
### Deprecated: `document.execCommand("paste")`
|
||||||
|
|
||||||
|
The synchronous clipboard read API [document.execCommand("paste")](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Interact_with_the_clipboard) has been
|
||||||
|
deprecated in favor of [async clipboard API](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API). This is to align with the browser defaults.
|
||||||
|
|
||||||
|
The `enableDeprecatedPaste` option on `WebPreferences` that triggers the permission
|
||||||
|
checks for this API and the associated permission type `deprecated-sync-clipboard-read`
|
||||||
|
are also deprecated.
|
||||||
|
|
||||||
### Behavior Changed: frame properties may retrieve detached WebFrameMain instances or none at all
|
### Behavior Changed: frame properties may retrieve detached WebFrameMain instances or none at all
|
||||||
|
|
||||||
APIs which provide access to a `WebFrameMain` instance may return an instance
|
APIs which provide access to a `WebFrameMain` instance may return an instance
|
||||||
@@ -56,15 +140,15 @@ immediately upon being received. Otherwise, it's not guaranteed to point to the
|
|||||||
same webpage as when received. To avoid misaligned expectations, Electron will
|
same webpage as when received. To avoid misaligned expectations, Electron will
|
||||||
return `null` in the case of late access where the webpage has changed.
|
return `null` in the case of late access where the webpage has changed.
|
||||||
|
|
||||||
```ts
|
```js
|
||||||
ipcMain.on('unload-event', (event) => {
|
ipcMain.on('unload-event', (event) => {
|
||||||
event.senderFrame; // ✅ accessed immediately
|
event.senderFrame // ✅ accessed immediately
|
||||||
});
|
})
|
||||||
|
|
||||||
ipcMain.on('unload-event', async (event) => {
|
ipcMain.on('unload-event', async (event) => {
|
||||||
await crossOriginNavigationPromise;
|
await crossOriginNavigationPromise
|
||||||
event.senderFrame; // ❌ returns `null` due to late access
|
event.senderFrame // ❌ returns `null` due to late access
|
||||||
});
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
### Behavior Changed: custom protocol URL handling on Windows
|
### Behavior Changed: custom protocol URL handling on Windows
|
||||||
@@ -111,6 +195,16 @@ macOS 10.15 (Catalina) is no longer supported by [Chromium](https://chromium-rev
|
|||||||
Older versions of Electron will continue to run on Catalina, but macOS 11 (Big Sur)
|
Older versions of Electron will continue to run on Catalina, but macOS 11 (Big Sur)
|
||||||
or later will be required to run Electron v33.0.0 and higher.
|
or later will be required to run Electron v33.0.0 and higher.
|
||||||
|
|
||||||
|
### Behavior Changed: Native modules now require C++20
|
||||||
|
|
||||||
|
Due to changes made upstream, both
|
||||||
|
[V8](https://chromium-review.googlesource.com/c/v8/v8/+/5587859) and
|
||||||
|
[Node.js](https://github.com/nodejs/node/pull/45427) now require C++20 as a
|
||||||
|
minimum version. Developers using native node modules should build their
|
||||||
|
modules with `--std=c++20` rather than `--std=c++17`. Images using gcc9 or
|
||||||
|
lower may need to update to gcc10 in order to compile. See
|
||||||
|
[#43555](https://github.com/electron/electron/pull/43555) for more details.
|
||||||
|
|
||||||
### Deprecated: `systemPreferences.accessibilityDisplayShouldReduceTransparency`
|
### Deprecated: `systemPreferences.accessibilityDisplayShouldReduceTransparency`
|
||||||
|
|
||||||
The `systemPreferences.accessibilityDisplayShouldReduceTransparency` property is now deprecated in favor of the new `nativeTheme.prefersReducedTransparency`, which provides identical information and works cross-platform.
|
The `systemPreferences.accessibilityDisplayShouldReduceTransparency` property is now deprecated in favor of the new `nativeTheme.prefersReducedTransparency`, which provides identical information and works cross-platform.
|
||||||
@@ -182,6 +276,14 @@ win.webContents.navigationHistory.canGoToOffset()
|
|||||||
win.webContents.navigationHistory.goToOffset(index)
|
win.webContents.navigationHistory.goToOffset(index)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Behavior changed: Directory `databases` in `userData` will be deleted
|
||||||
|
|
||||||
|
If you have a directory called `databases` in the directory returned by
|
||||||
|
`app.getPath('userData')`, it will be deleted when Electron 32 is first run.
|
||||||
|
The `databases` directory was used by WebSQL, which was removed in Electron 31.
|
||||||
|
Chromium now performs a cleanup that deletes this directory. See
|
||||||
|
[issue #45396](https://github.com/electron/electron/issues/45396).
|
||||||
|
|
||||||
## Planned Breaking API Changes (31.0)
|
## Planned Breaking API Changes (31.0)
|
||||||
|
|
||||||
### Removed: `WebSQL` support
|
### Removed: `WebSQL` support
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ Verify that the Pull Request is correct and make a corresponding entry in the
|
|||||||
API History:
|
API History:
|
||||||
|
|
||||||
> [!NOTE]
|
> [!NOTE]
|
||||||
> Refer to the [API History section of `styleguide.md`](../styleguide.md#api-history)
|
> Refer to the [API History section of `style-guide.md`](./style-guide.md#api-history)
|
||||||
for information on how to create API History blocks.
|
for information on how to create API History blocks.
|
||||||
|
|
||||||
`````markdown
|
`````markdown
|
||||||
|
|||||||
@@ -195,7 +195,7 @@ required[, optional]
|
|||||||
More detailed information on each of the arguments is noted in an unordered list
|
More detailed information on each of the arguments is noted in an unordered list
|
||||||
below the method. The type of argument is notated by either JavaScript primitives
|
below the method. The type of argument is notated by either JavaScript primitives
|
||||||
(e.g. `string`, `Promise`, or `Object`), a custom API structure like Electron's
|
(e.g. `string`, `Promise`, or `Object`), a custom API structure like Electron's
|
||||||
[`Cookie`](api/structures/cookie.md), or the wildcard `any`.
|
[`Cookie`](../api/structures/cookie.md), or the wildcard `any`.
|
||||||
|
|
||||||
If the argument is of type `Array`, use `[]` shorthand with the type of value
|
If the argument is of type `Array`, use `[]` shorthand with the type of value
|
||||||
inside the array (for example,`any[]` or `string[]`).
|
inside the array (for example,`any[]` or `string[]`).
|
||||||
@@ -290,7 +290,7 @@ The purpose of the API History block is to describe when/where/how/why an API wa
|
|||||||
Each API change listed in the block should include a link to the
|
Each API change listed in the block should include a link to the
|
||||||
PR where that change was made along with an optional short description of the
|
PR where that change was made along with an optional short description of the
|
||||||
change. If applicable, include the [heading id](https://gist.github.com/asabaylus/3071099)
|
change. If applicable, include the [heading id](https://gist.github.com/asabaylus/3071099)
|
||||||
for that change from the [breaking changes documentation](./breaking-changes.md).
|
for that change from the [breaking changes documentation](../breaking-changes.md).
|
||||||
|
|
||||||
The [API History linting script][api-history-linting-script] (`lint:api-history`)
|
The [API History linting script][api-history-linting-script] (`lint:api-history`)
|
||||||
validates API History blocks in the Electron documentation against the schema and
|
validates API History blocks in the Electron documentation against the schema and
|
||||||
@@ -24,9 +24,7 @@ const dockMenu = Menu.buildFromTemplate([
|
|||||||
])
|
])
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
if (process.platform === 'darwin') {
|
app.dock?.setMenu(dockMenu)
|
||||||
app.dock.setMenu(dockMenu)
|
|
||||||
}
|
|
||||||
}).then(createWindow)
|
}).then(createWindow)
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
app.on('window-all-closed', () => {
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ the illusion of a circular window.
|
|||||||
open on the user's system).
|
open on the user's system).
|
||||||
* The window will not be transparent when DevTools is opened.
|
* The window will not be transparent when DevTools is opened.
|
||||||
* On _Windows_:
|
* On _Windows_:
|
||||||
* Transparent windows will not work when DWM is disabled.
|
|
||||||
* Transparent windows can not be maximized using the Windows system menu or by double
|
* Transparent windows can not be maximized using the Windows system menu or by double
|
||||||
clicking the title bar. The reasoning behind this can be seen on
|
clicking the title bar. The reasoning behind this can be seen on
|
||||||
PR [#28207](https://github.com/electron/electron/pull/28207).
|
PR [#28207](https://github.com/electron/electron/pull/28207).
|
||||||
|
|||||||
@@ -9,10 +9,11 @@ check out our [Electron Versioning](./electron-versioning.md) doc.
|
|||||||
|
|
||||||
| Electron | Alpha | Beta | Stable | EOL | Chrome | Node | Supported |
|
| Electron | Alpha | Beta | Stable | EOL | Chrome | Node | Supported |
|
||||||
| ------- | ----- | ------- | ------ | ------ | ---- | ---- | ---- |
|
| ------- | ----- | ------- | ------ | ------ | ---- | ---- | ---- |
|
||||||
| 35.0.0 | 2025-Jan-16 | 2025-Feb-05 | 2025-Mar-04 | 2025-Sep-02 | M134 | TBD | ✅ |
|
| 36.0.0 | 2025-Mar-06 | 2025-Apr-02 | 2025-Apr-29 | 2025-Oct-28 | M136 | TBD | ✅ |
|
||||||
|
| 35.0.0 | 2025-Jan-16 | 2025-Feb-05 | 2025-Mar-04 | 2025-Sep-02 | M134 | v22.14 | ✅ |
|
||||||
| 34.0.0 | 2024-Oct-17 | 2024-Nov-13 | 2025-Jan-14 | 2025-Jun-24 | M132 | v20.18 | ✅ |
|
| 34.0.0 | 2024-Oct-17 | 2024-Nov-13 | 2025-Jan-14 | 2025-Jun-24 | M132 | v20.18 | ✅ |
|
||||||
| 33.0.0 | 2024-Aug-22 | 2024-Sep-18 | 2024-Oct-15 | 2025-Apr-29 | M130 | v20.18 | ✅ |
|
| 33.0.0 | 2024-Aug-22 | 2024-Sep-18 | 2024-Oct-15 | 2025-Apr-29 | M130 | v20.18 | ✅ |
|
||||||
| 32.0.0 | 2024-Jun-14 | 2024-Jul-24 | 2024-Aug-20 | 2025-Mar-04 | M128 | v20.16 | ✅ |
|
| 32.0.0 | 2024-Jun-14 | 2024-Jul-24 | 2024-Aug-20 | 2025-Mar-04 | M128 | v20.16 | 🚫 |
|
||||||
| 31.0.0 | 2024-Apr-18 | 2024-May-15 | 2024-Jun-11 | 2025-Jan-14 | M126 | v20.14 | 🚫 |
|
| 31.0.0 | 2024-Apr-18 | 2024-May-15 | 2024-Jun-11 | 2025-Jan-14 | M126 | v20.14 | 🚫 |
|
||||||
| 30.0.0 | 2024-Feb-22 | 2024-Mar-20 | 2024-Apr-16 | 2024-Oct-15 | M124 | v20.11 | 🚫 |
|
| 30.0.0 | 2024-Feb-22 | 2024-Mar-20 | 2024-Apr-16 | 2024-Oct-15 | M124 | v20.11 | 🚫 |
|
||||||
| 29.0.0 | 2023-Dec-07 | 2024-Jan-24 | 2024-Feb-20 | 2024-Aug-20 | M122 | v20.9 | 🚫 |
|
| 29.0.0 | 2023-Dec-07 | 2024-Jan-24 | 2024-Feb-20 | 2024-Aug-20 | M122 | v20.9 | 🚫 |
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ To configure a local keyboard shortcut, you need to specify an [`accelerator`][]
|
|||||||
property when creating a [MenuItem][] within the [Menu][] module.
|
property when creating a [MenuItem][] within the [Menu][] module.
|
||||||
|
|
||||||
Starting with a working application from the
|
Starting with a working application from the
|
||||||
[Quick Start Guide](quick-start.md), update the `main.js` to be:
|
[tutorial starter code][tutorial-starter-code], update the `main.js` to be:
|
||||||
|
|
||||||
```fiddle docs/fiddles/features/keyboard-shortcuts/local
|
```fiddle docs/fiddles/features/keyboard-shortcuts/local
|
||||||
const { app, BrowserWindow, Menu, MenuItem } = require('electron/main')
|
const { app, BrowserWindow, Menu, MenuItem } = require('electron/main')
|
||||||
@@ -75,7 +75,7 @@ module to detect keyboard events even when the application does not have
|
|||||||
keyboard focus.
|
keyboard focus.
|
||||||
|
|
||||||
Starting with a working application from the
|
Starting with a working application from the
|
||||||
[Quick Start Guide](quick-start.md), update the `main.js` to be:
|
[tutorial starter code][tutorial-starter-code], update the `main.js` to be:
|
||||||
|
|
||||||
```fiddle docs/fiddles/features/keyboard-shortcuts/global
|
```fiddle docs/fiddles/features/keyboard-shortcuts/global
|
||||||
const { app, BrowserWindow, globalShortcut } = require('electron/main')
|
const { app, BrowserWindow, globalShortcut } = require('electron/main')
|
||||||
@@ -144,7 +144,7 @@ is emitted before dispatching `keydown` and `keyup` events in the page. It can
|
|||||||
be used to catch and handle custom shortcuts that are not visible in the menu.
|
be used to catch and handle custom shortcuts that are not visible in the menu.
|
||||||
|
|
||||||
Starting with a working application from the
|
Starting with a working application from the
|
||||||
[Quick Start Guide](quick-start.md), update the `main.js` file with the
|
[tutorial starter code][tutorial-starter-code], update the `main.js` file with the
|
||||||
following lines:
|
following lines:
|
||||||
|
|
||||||
```fiddle docs/fiddles/features/keyboard-shortcuts/interception-from-main
|
```fiddle docs/fiddles/features/keyboard-shortcuts/interception-from-main
|
||||||
@@ -207,3 +207,4 @@ Mousetrap.bind('up up down down left right left right b a enter', () => {
|
|||||||
[mousetrap]: https://github.com/ccampbell/mousetrap
|
[mousetrap]: https://github.com/ccampbell/mousetrap
|
||||||
[dom-events]: https://developer.mozilla.org/en-US/docs/Web/Events
|
[dom-events]: https://developer.mozilla.org/en-US/docs/Web/Events
|
||||||
[addEventListener-api]: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
|
[addEventListener-api]: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener
|
||||||
|
[tutorial-starter-code]: tutorial-2-first-app.md#final-starter-code
|
||||||
|
|||||||
@@ -50,9 +50,7 @@ const dockMenu = Menu.buildFromTemplate([
|
|||||||
])
|
])
|
||||||
|
|
||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
if (process.platform === 'darwin') {
|
app.dock?.setMenu(dockMenu)
|
||||||
app.dock.setMenu(dockMenu)
|
|
||||||
}
|
|
||||||
}).then(createWindow)
|
}).then(createWindow)
|
||||||
|
|
||||||
app.on('window-all-closed', () => {
|
app.on('window-all-closed', () => {
|
||||||
|
|||||||
1638
docs/tutorial/native-code-and-electron-cpp-linux.md
Normal file
1638
docs/tutorial/native-code-and-electron-cpp-linux.md
Normal file
File diff suppressed because it is too large
Load Diff
1346
docs/tutorial/native-code-and-electron-cpp-win32.md
Normal file
1346
docs/tutorial/native-code-and-electron-cpp-win32.md
Normal file
File diff suppressed because it is too large
Load Diff
1152
docs/tutorial/native-code-and-electron-objc-macos.md
Normal file
1152
docs/tutorial/native-code-and-electron-objc-macos.md
Normal file
File diff suppressed because it is too large
Load Diff
380
docs/tutorial/native-code-and-electron.md
Normal file
380
docs/tutorial/native-code-and-electron.md
Normal file
@@ -0,0 +1,380 @@
|
|||||||
|
# Native Code and Electron
|
||||||
|
|
||||||
|
One of Electron's most powerful features is the ability to combine web technologies with native code - both for compute-intensive logic as well as for the occasional native user interface, where desired.
|
||||||
|
|
||||||
|
Electron does so by building on top of "Native Node.js Addons". You've probably already come across a few of them - packages like the famous [sqlite](https://www.npmjs.com/package/sqlite3) use native code to combine JavaScript and native technologies. You can use this feature to extend your Electron application with anything a fully native application can do:
|
||||||
|
|
||||||
|
* Access native platform APIs not available in JavaScript. Any macOS, Windows, or Linux operating system API is available to you.
|
||||||
|
* Create UI components that interact with native desktop frameworks.
|
||||||
|
* Integrate with existing native libraries.
|
||||||
|
* Implement performance-critical code that runs faster than JavaScript.
|
||||||
|
|
||||||
|
Native Node.js addons are dynamically-linked shared objects (on Unix-like systems) or DLL files (on Windows) that can be loaded into Node.js or Electron using the `require()` or `import` functions. They behave just like regular JavaScript modules but provide an interface to code written in C++, Rust, or other languages that can compile to native code.
|
||||||
|
|
||||||
|
# Tutorial: Creating a Native Node.js Addon for Electron
|
||||||
|
|
||||||
|
This tutorial will walk you through building a basic Node.js native addon that can be used in Electron applications. We'll focus on concepts common to all platforms, using C++ as the implementation language. Once you complete this tutorial common to all native Node.js addons, you can move on to one of our platform-specific tutorials.
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
This tutorial assumes you have Node.js and npm installed, as well as the basic tools necessary for compiling code on your platform (like Visual Studio on Windows, Xcode on macOS, or GCC/Clang on Linux). You can find detailed instructions in the [`node-gyp` readme](https://github.com/nodejs/node-gyp?tab=readme-ov-file).
|
||||||
|
|
||||||
|
### Requirements: macOS
|
||||||
|
|
||||||
|
To build native Node.js addons on macOS, you'll need the Xcode Command Line Tools. These provide the necessary compilers and build tools (namely, `clang`, `clang++`, and `make`). The following command will prompt you to install the Command Line Tools if they aren't already installed.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
xcode-select --install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Requirements: Windows
|
||||||
|
|
||||||
|
The official Node.js installer offers the optional installation of "Tools for Native Modules", which installs everything required for the basic compilation of C++ modules - specifically, Python 3 and the "Visual Studio Desktop development with C++" workload. Alternatively, you can use `chocolatey`, `winget`, or the Windows Store.
|
||||||
|
|
||||||
|
### Requirements: Linux
|
||||||
|
|
||||||
|
* [A supported version of Python](https://devguide.python.org/versions/)
|
||||||
|
* `make`
|
||||||
|
* A proper C/C++ compiler toolchain, like [GCC](https://gcc.gnu.org)
|
||||||
|
|
||||||
|
## 1) Creating a package
|
||||||
|
|
||||||
|
First, create a new Node.js package that will contain your native addon:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir my-native-addon
|
||||||
|
cd my-native-addon
|
||||||
|
npm init -y
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates a basic `package.json` file. Next, we'll install the necessary dependencies:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm install node-addon-api bindings
|
||||||
|
```
|
||||||
|
|
||||||
|
* `node-addon-api`: This is a C++ wrapper for the low-level Node.js API that makes it easier to build addons. It provides a C++ object-oriented API that's more convenient and safer to use than the raw C-style API.
|
||||||
|
* `bindings`: A helper module that simplifies the process of loading your compiled native addon. It handles finding your compiled `.node` file automatically.
|
||||||
|
|
||||||
|
Now, let's update our `package.json` to include the appropriate build scripts. We will explain what these specifically do further below.
|
||||||
|
|
||||||
|
```json title='package.json'
|
||||||
|
{
|
||||||
|
"name": "my-native-addon",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "A native addon for Electron",
|
||||||
|
"main": "js/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"clean": "node -e \"require('fs').rmSync('build', { recursive: true, force: true })\"",
|
||||||
|
"build": "node-gyp configure && node-gyp build"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"bindings": "^1.5.0",
|
||||||
|
"node-addon-api": "^8.3.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"node-gyp": "^11.1.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
These scripts will:
|
||||||
|
|
||||||
|
* `clean`: Remove the build directory, allowing for a fresh build
|
||||||
|
* `build`: Run the standard node-gyp build process to compile your addon
|
||||||
|
|
||||||
|
## 2) Setting up the build system
|
||||||
|
|
||||||
|
Node.js addons use a build system called `node-gyp`, which is a cross-platform command-line tool written in Node.js. It compiles native addon modules for Node.js using platform-specific build tools behind the scenes:
|
||||||
|
|
||||||
|
* On Windows: Visual Studio
|
||||||
|
* On macOS: Xcode or command-line tools
|
||||||
|
* On Linux: GCC or similar compilers
|
||||||
|
|
||||||
|
### Configuring `node-gyp`
|
||||||
|
|
||||||
|
The `binding.gyp` file is a JSON-like configuration file that tells node-gyp how to build your native addon. It's similar to a make file or a project file but in a platform-independent format. Let's create a basic `binding.gyp` file:
|
||||||
|
|
||||||
|
```json title='binding.gyp'
|
||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"target_name": "my_addon",
|
||||||
|
"sources": [
|
||||||
|
"src/my_addon.cc",
|
||||||
|
"src/cpp_code.cc"
|
||||||
|
],
|
||||||
|
"include_dirs": [
|
||||||
|
"<!@(node -p \"require('node-addon-api').include\")",
|
||||||
|
"include"
|
||||||
|
],
|
||||||
|
"dependencies": [
|
||||||
|
"<!(node -p \"require('node-addon-api').gyp\")"
|
||||||
|
],
|
||||||
|
"defines": [
|
||||||
|
"NODE_ADDON_API_CPP_EXCEPTIONS"
|
||||||
|
],
|
||||||
|
"cflags!": ["-fno-exceptions"],
|
||||||
|
"cflags_cc!": ["-fno-exceptions"],
|
||||||
|
"xcode_settings": {
|
||||||
|
"GCC_ENABLE_CPP_EXCEPTIONS": "YES",
|
||||||
|
"CLANG_CXX_LIBRARY": "libc++",
|
||||||
|
"MACOSX_DEPLOYMENT_TARGET": "10.14"
|
||||||
|
},
|
||||||
|
"msvs_settings": {
|
||||||
|
"VCCLCompilerTool": {
|
||||||
|
"ExceptionHandling": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's break down this configuration:
|
||||||
|
|
||||||
|
* `target_name`: The name of your addon. This determines the filename of the compiled module (my_addon.node).
|
||||||
|
* `sources`: List of source files to compile. We'll have two files: the main addon file and our actual C++ implementation.
|
||||||
|
* `include_dirs`: Directories to search for header files. The cryptic-looking line `<!@(node -p \"require('node-addon-api').include\")` runs a Node.js command to get the path to the node-addon-api include directory.
|
||||||
|
* `dependencies`: The `node-addon-api` dependency. Similar to the include dirs, this executes a Node.js command to get the proper configuration.
|
||||||
|
* `defines`: Preprocessor definitions. Here we're enabling C++ exceptions for node-addon-api.
|
||||||
|
Platform-specific settings:
|
||||||
|
* `cflags`! and cflags_cc!: Compiler flags for Unix-like systems
|
||||||
|
* `xcode_settings`: Settings specific to macOS/Xcode compiler
|
||||||
|
* `msvs_settings`: Settings specific to Microsoft Visual Studio on Windows
|
||||||
|
|
||||||
|
Now, create the directory structure for our project:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir src
|
||||||
|
mkdir include
|
||||||
|
mkdir js
|
||||||
|
```
|
||||||
|
|
||||||
|
This creates:
|
||||||
|
|
||||||
|
* `src/`: Where our source files will go
|
||||||
|
* `include/`: For header files
|
||||||
|
* `js/`: For our JavaScript wrapper
|
||||||
|
|
||||||
|
## 3) "Hello World" from C++
|
||||||
|
|
||||||
|
Let's start by defining our C++ interface in a header file. Create `include/cpp_code.h`:
|
||||||
|
|
||||||
|
```cpp
|
||||||
|
#pragma once
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace cpp_code {
|
||||||
|
// A simple function that takes a string input and returns a string
|
||||||
|
std::string hello_world(const std::string& input);
|
||||||
|
} // namespace cpp_code
|
||||||
|
```
|
||||||
|
|
||||||
|
The `#pragma once` directive is a header guard that prevents the file from being included multiple times in the same compilation unit. The actual function declaration is inside a namespace to avoid potential name conflicts.
|
||||||
|
|
||||||
|
Next, let's implement the function in `src/cpp_code.cc`:
|
||||||
|
|
||||||
|
```cpp title='src/cpp_code.cc'
|
||||||
|
#include <string>
|
||||||
|
#include "../include/cpp_code.h"
|
||||||
|
|
||||||
|
namespace cpp_code {
|
||||||
|
std::string hello_world(const std::string& input) {
|
||||||
|
// Simply concatenate strings and return
|
||||||
|
return "Hello from C++! You said: " + input;
|
||||||
|
}
|
||||||
|
} // namespace cpp_code
|
||||||
|
```
|
||||||
|
|
||||||
|
This is a simple implementation that just adds some text to the input string and returns it.
|
||||||
|
|
||||||
|
Now, let's create the addon code that bridges our C++ code with the Node.js/JavaScript world. Create `src/my_addon.cc`:
|
||||||
|
|
||||||
|
```cpp title='src/my_addon.cc'
|
||||||
|
#include <napi.h>
|
||||||
|
#include <string>
|
||||||
|
#include "../include/cpp_code.h"
|
||||||
|
|
||||||
|
// Create a class that will be exposed to JavaScript
|
||||||
|
class MyAddon : public Napi::ObjectWrap<MyAddon> {
|
||||||
|
public:
|
||||||
|
// This static method defines the class for JavaScript
|
||||||
|
static Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
||||||
|
// Define the JavaScript class with method(s)
|
||||||
|
Napi::Function func = DefineClass(env, "MyAddon", {
|
||||||
|
InstanceMethod("helloWorld", &MyAddon::HelloWorld)
|
||||||
|
});
|
||||||
|
|
||||||
|
// Create a persistent reference to the constructor
|
||||||
|
Napi::FunctionReference* constructor = new Napi::FunctionReference();
|
||||||
|
*constructor = Napi::Persistent(func);
|
||||||
|
env.SetInstanceData(constructor);
|
||||||
|
|
||||||
|
// Set the constructor on the exports object
|
||||||
|
exports.Set("MyAddon", func);
|
||||||
|
return exports;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Constructor
|
||||||
|
MyAddon(const Napi::CallbackInfo& info)
|
||||||
|
: Napi::ObjectWrap<MyAddon>(info) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Method that will be exposed to JavaScript
|
||||||
|
Napi::Value HelloWorld(const Napi::CallbackInfo& info) {
|
||||||
|
Napi::Env env = info.Env();
|
||||||
|
|
||||||
|
// Validate arguments (expecting one string)
|
||||||
|
if (info.Length() < 1 || !info[0].IsString()) {
|
||||||
|
Napi::TypeError::New(env, "Expected string argument").ThrowAsJavaScriptException();
|
||||||
|
return env.Null();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert JavaScript string to C++ string
|
||||||
|
std::string input = info[0].As<Napi::String>();
|
||||||
|
|
||||||
|
// Call our C++ function
|
||||||
|
std::string result = cpp_code::hello_world(input);
|
||||||
|
|
||||||
|
// Convert C++ string back to JavaScript string and return
|
||||||
|
return Napi::String::New(env, result);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize the addon
|
||||||
|
Napi::Object Init(Napi::Env env, Napi::Object exports) {
|
||||||
|
return MyAddon::Init(env, exports);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register the initialization function
|
||||||
|
NODE_API_MODULE(my_addon, Init)
|
||||||
|
```
|
||||||
|
|
||||||
|
Let's break down this code:
|
||||||
|
|
||||||
|
1. We define a `MyAddon` class that inherits from `Napi::ObjectWrap<MyAddon>`, which handles wrapping our C++ class for JavaScript.
|
||||||
|
2. The `Init` static method:
|
||||||
|
2.1 Defines a JavaScript class with a method called `helloWorld`
|
||||||
|
2.2 Creates a persistent reference to the constructor (to prevent garbage collection)
|
||||||
|
2.3 Exports the class constructor
|
||||||
|
3. The constructor simply passes its arguments to the parent class.
|
||||||
|
4. The `HelloWorld` method:
|
||||||
|
4.1 Gets the Napi environment
|
||||||
|
4.2 Validates input arguments (expecting a string)
|
||||||
|
4.3 Converts the JavaScript string to a C++ string
|
||||||
|
4.4 Calls our C++ function
|
||||||
|
4.5 Converts the result back to a JavaScript string and returns it
|
||||||
|
5. We define an initialization function and register it with NODE_API_MODULE macro, which makes our module loadable by Node.js.
|
||||||
|
|
||||||
|
Now, let's create a JavaScript wrapper to make the addon easier to use. Create `js/index.js`:
|
||||||
|
|
||||||
|
```js title='js/index.js' @ts-expect-error=[5]
|
||||||
|
const EventEmitter = require('events')
|
||||||
|
|
||||||
|
// Load the native addon using the 'bindings' module
|
||||||
|
// This will look for the compiled .node file in various places
|
||||||
|
const bindings = require('bindings')
|
||||||
|
const native = bindings('my_addon')
|
||||||
|
|
||||||
|
// Create a nice JavaScript wrapper
|
||||||
|
class MyNativeAddon extends EventEmitter {
|
||||||
|
constructor () {
|
||||||
|
super()
|
||||||
|
|
||||||
|
// Create an instance of our C++ class
|
||||||
|
this.addon = new native.MyAddon()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrap the C++ method with a nicer JavaScript API
|
||||||
|
helloWorld (input = '') {
|
||||||
|
if (typeof input !== 'string') {
|
||||||
|
throw new TypeError('Input must be a string')
|
||||||
|
}
|
||||||
|
return this.addon.helloWorld(input)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Export a singleton instance
|
||||||
|
if (process.platform === 'win32' || process.platform === 'darwin' || process.platform === 'linux') {
|
||||||
|
module.exports = new MyNativeAddon()
|
||||||
|
} else {
|
||||||
|
// Provide a fallback for unsupported platforms
|
||||||
|
console.warn('Native addon not supported on this platform')
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
helloWorld: (input) => `Hello from JS! You said: ${input}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
This JavaScript wrapper:
|
||||||
|
|
||||||
|
1. Uses `bindings` to load our compiled native addon
|
||||||
|
1. Creates a class that extends EventEmitter (useful for future extensions that might emit events)
|
||||||
|
1. Instantiates our C++ class and provides a simpler API
|
||||||
|
1. Adds some input validation on the JavaScript side
|
||||||
|
1. Exports a singleton instance of our wrapper
|
||||||
|
1. Handles unsupported platforms gracefully
|
||||||
|
|
||||||
|
### Building and testing the addon
|
||||||
|
|
||||||
|
Now we can build our native addon:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
This will run `node-gyp configure` and `node-gyp build` to compile our C++ code into a `.node` file.
|
||||||
|
Let's create a simple test script to verify everything works. Create `test.js` in the project root:
|
||||||
|
|
||||||
|
```js title='test.js' @ts-expect-error=[2]
|
||||||
|
// Load our addon
|
||||||
|
const myAddon = require('./js')
|
||||||
|
|
||||||
|
// Try the helloWorld function
|
||||||
|
const result = myAddon.helloWorld('This is a test')
|
||||||
|
|
||||||
|
// Should print: "Hello from C++! You said: This is a test"
|
||||||
|
console.log(result)
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the test:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
node test.js
|
||||||
|
```
|
||||||
|
|
||||||
|
If everything works correctly, you should see:
|
||||||
|
|
||||||
|
```txt
|
||||||
|
Hello from C++! You said: This is a test
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using the addon in Electron
|
||||||
|
|
||||||
|
To use this addon in an Electron application, you would:
|
||||||
|
|
||||||
|
1. Include it as a dependency in your Electron project
|
||||||
|
1. Build it targeting your specific Electron version. `electron-forge` handles this step automatically for you - for more details, see [Native Node Modules](./using-native-node-modules.md).
|
||||||
|
1. Import and use it just like any other module in a process that has Node.js enabled.
|
||||||
|
|
||||||
|
```js @ts-expect-error=[2]
|
||||||
|
// In your main process
|
||||||
|
const myAddon = require('my-native-addon')
|
||||||
|
console.log(myAddon.helloWorld('Electron'))
|
||||||
|
```
|
||||||
|
|
||||||
|
## References and further learning
|
||||||
|
|
||||||
|
Native addon development can be written in several languages beyond C++. Rust can be used with crates like [`napi-rs`](https://github.com/napi-rs/napi-rs), [`neon`](https://neon-rs.dev/), or [`node-bindgen`](https://github.com/infinyon/node-bindgen). Objective-C/Swift can be used through Objective-C++ on macOS.
|
||||||
|
|
||||||
|
The specific implementation details differ significantly by platform, especially when accessing platform-specific APIs or UI frameworks, like Windows' Win32 API, COM components, UWP/WinRT - or macOS's Cocoa, AppKit, or ObjectiveC runtime.
|
||||||
|
|
||||||
|
This means that you'll likely use two groups of references for your native code: First, on the Node.js side, use the [N-API documentation](https://nodejs.org/api/n-api.html) to learn about creating and exposing complex structures to JavaScript - like asynchronous thread-safe function calls or creating JavaScript-native objects (`error`, `promise`, etc). Secondly, on the side of the technology you're working with, you'll likely be looking at their lower-level documentation:
|
||||||
|
|
||||||
|
* [Microsoft C++, C, and Assembler documentation](https://learn.microsoft.com/en-us/cpp/?view=msvc-170)
|
||||||
|
* [C++/WinRT](https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/)
|
||||||
|
* [MSVC-170 C++ Documentation](https://learn.microsoft.com/en-us/cpp/cpp/?view=msvc-170)
|
||||||
|
* [Apple Developer Documentation](https://developer.apple.com/documentation)
|
||||||
|
* [Programming with Objective-C](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011210)
|
||||||
@@ -22,12 +22,9 @@ In `preload.js` use the [`contextBridge`][] to inject a method `window.electron.
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
const { contextBridge, ipcRenderer } = require('electron')
|
const { contextBridge, ipcRenderer } = require('electron')
|
||||||
const path = require('node:path')
|
|
||||||
|
|
||||||
contextBridge.exposeInMainWorld('electron', {
|
contextBridge.exposeInMainWorld('electron', {
|
||||||
startDrag: (fileName) => {
|
startDrag: (fileName) => ipcRenderer.send('ondragstart', fileName)
|
||||||
ipcRenderer.send('ondragstart', path.join(process.cwd(), fileName))
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,25 @@ if (navigationHistory.canGoToOffset(2)) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Restoring history
|
||||||
|
|
||||||
|
A common flow is that you want to restore the history of a webContents - for instance to implement an "undo close tab" feature. To do so, you can call `navigationHistory.restore({ index, entries })`. This will restore the webContent's navigation history and the webContents location in said history, meaning that `goBack()` and `goForward()` navigate you through the stack as expected.
|
||||||
|
|
||||||
|
```js @ts-type={navigationHistory:Electron.NavigationHistory}
|
||||||
|
|
||||||
|
const firstWindow = new BrowserWindow()
|
||||||
|
|
||||||
|
// Later, you want a second window to have the same history and navigation position
|
||||||
|
async function restore () {
|
||||||
|
const entries = firstWindow.webContents.navigationHistory.getAllEntries()
|
||||||
|
const index = firstWindow.webContents.navigationHistory.getActiveIndex()
|
||||||
|
|
||||||
|
const secondWindow = new BrowserWindow()
|
||||||
|
await secondWindow.webContents.navigationHistory.restore({ index, entries })
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
Here's a full example that you can open with Electron Fiddle:
|
Here's a full example that you can open with Electron Fiddle:
|
||||||
|
|
||||||
```fiddle docs/fiddles/features/navigation-history
|
```fiddle docs/fiddles/features/navigation-history
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user