mirror of
https://github.com/electron/electron.git
synced 2026-02-26 03:01:17 -05:00
Compare commits
305 Commits
roller/nod
...
v11.3.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1631fc9b0c | ||
|
|
cc0848a86e | ||
|
|
c7a2b32c5a | ||
|
|
18cfdb1c82 | ||
|
|
1105931d0a | ||
|
|
234309497e | ||
|
|
6fa2ab2edd | ||
|
|
527c767107 | ||
|
|
15468432c8 | ||
|
|
af34655cb7 | ||
|
|
111b737ae4 | ||
|
|
e33df2c7b6 | ||
|
|
f30018b4b0 | ||
|
|
795200a838 | ||
|
|
64d4e5969f | ||
|
|
be670059a6 | ||
|
|
5d64c42801 | ||
|
|
5b81463423 | ||
|
|
92df786066 | ||
|
|
59aaa65381 | ||
|
|
715ffe4e51 | ||
|
|
51bb0ad36d | ||
|
|
4636dfe68e | ||
|
|
e3f6b2b082 | ||
|
|
968db9285f | ||
|
|
19f8ea37a5 | ||
|
|
99eb8ac059 | ||
|
|
3bcdc276e1 | ||
|
|
85dad8fb18 | ||
|
|
5f60640ddc | ||
|
|
f9e6e6eff9 | ||
|
|
7695f3f1ee | ||
|
|
3492077f33 | ||
|
|
0933c6796c | ||
|
|
137f45750f | ||
|
|
a0175137fb | ||
|
|
90eee5f909 | ||
|
|
a09dada8e4 | ||
|
|
805e442ff8 | ||
|
|
02a1b42db3 | ||
|
|
5c44dc2a0a | ||
|
|
210c406ab1 | ||
|
|
15a96413b6 | ||
|
|
13e017c861 | ||
|
|
bb1299bbb5 | ||
|
|
42d15f0536 | ||
|
|
70526f8070 | ||
|
|
47640eaa9a | ||
|
|
1f5a8b6894 | ||
|
|
b1f438245f | ||
|
|
a73d563390 | ||
|
|
6a1ef337a7 | ||
|
|
63677086c2 | ||
|
|
8805b996e0 | ||
|
|
47adc0a2b7 | ||
|
|
1559dc74da | ||
|
|
207dbb8d4e | ||
|
|
3bda527e83 | ||
|
|
e3b76f71de | ||
|
|
6be5244111 | ||
|
|
f398ba08a9 | ||
|
|
aa4f3550fd | ||
|
|
095de8114e | ||
|
|
5737bac6f4 | ||
|
|
c95eda8420 | ||
|
|
7fb97f041b | ||
|
|
b4ea9e0fc8 | ||
|
|
19b7336fc3 | ||
|
|
f809e74905 | ||
|
|
f6eb88ac08 | ||
|
|
56e926ce23 | ||
|
|
5e0e91510a | ||
|
|
9bfd5d4a4b | ||
|
|
8afd7877f6 | ||
|
|
bf0b82dc8e | ||
|
|
122d8910d5 | ||
|
|
cb281b7954 | ||
|
|
91cfa96c80 | ||
|
|
a21ed83751 | ||
|
|
c0b48658d8 | ||
|
|
c68f0f04d0 | ||
|
|
a2b61f9b97 | ||
|
|
fc478f4e96 | ||
|
|
b710412e7b | ||
|
|
9a7bda51a3 | ||
|
|
615e467a15 | ||
|
|
f8a900fdde | ||
|
|
c188ed065d | ||
|
|
dcd216984f | ||
|
|
e012f61aee | ||
|
|
50e3a2ae20 | ||
|
|
b4413e9398 | ||
|
|
25df0f5d31 | ||
|
|
6b91371b6e | ||
|
|
8e6d332e96 | ||
|
|
eebd7cfa05 | ||
|
|
a4d73be9c5 | ||
|
|
0e9214a82b | ||
|
|
24c7365bef | ||
|
|
686aefb2cd | ||
|
|
0e0a1421fd | ||
|
|
c4e8c0fd0e | ||
|
|
101a2282ab | ||
|
|
429400040e | ||
|
|
ca7528a2d0 | ||
|
|
d58812b517 | ||
|
|
5942c84288 | ||
|
|
f920463b47 | ||
|
|
296cba563e | ||
|
|
90a96c0b73 | ||
|
|
2c325cd654 | ||
|
|
c26b78bbc0 | ||
|
|
6951c09b61 | ||
|
|
fe21892974 | ||
|
|
0fd6a8ca83 | ||
|
|
de12232df5 | ||
|
|
d12674f9f1 | ||
|
|
75cdd02697 | ||
|
|
08b7f5a569 | ||
|
|
a5077e2586 | ||
|
|
4fa9122151 | ||
|
|
56fa037a46 | ||
|
|
13a9e15a27 | ||
|
|
badc01c2d8 | ||
|
|
b0862a6e63 | ||
|
|
18cde2ef04 | ||
|
|
e6c94854a0 | ||
|
|
94d8b7d4c1 | ||
|
|
c0769d77e5 | ||
|
|
2a6c3bb7d1 | ||
|
|
d892fde98b | ||
|
|
edb6723157 | ||
|
|
9dda9a894a | ||
|
|
90ab868b50 | ||
|
|
4dc98f1347 | ||
|
|
2189ddb14e | ||
|
|
680569e404 | ||
|
|
e119699ae2 | ||
|
|
63e6f08768 | ||
|
|
b14c57e30c | ||
|
|
8a68a304e0 | ||
|
|
60cef385d5 | ||
|
|
4f281e3d31 | ||
|
|
eb2710e483 | ||
|
|
7a15dca09c | ||
|
|
387a15f582 | ||
|
|
38fab63863 | ||
|
|
1b156c53fd | ||
|
|
e4f3f9e1db | ||
|
|
612acc04b0 | ||
|
|
717271095e | ||
|
|
76e54ae0c8 | ||
|
|
0c21ce02c1 | ||
|
|
01fa45fc50 | ||
|
|
832ce14bda | ||
|
|
07318e5146 | ||
|
|
79dff5f782 | ||
|
|
9c9e40294e | ||
|
|
5b617a7f39 | ||
|
|
ff717d4a93 | ||
|
|
51bced4ee3 | ||
|
|
b0fd7cf430 | ||
|
|
a56c1d3f2f | ||
|
|
98b6403e3b | ||
|
|
e9c12688e6 | ||
|
|
8d88d1e2ed | ||
|
|
2e730fe48b | ||
|
|
88de23b241 | ||
|
|
3faa2c2a46 | ||
|
|
cab14277b8 | ||
|
|
ce243f8172 | ||
|
|
da4790d944 | ||
|
|
4088566a4d | ||
|
|
ac425c0cf3 | ||
|
|
ccb471e5d5 | ||
|
|
f44880f065 | ||
|
|
7ec001486e | ||
|
|
dd3fbae447 | ||
|
|
e9710f6a77 | ||
|
|
699a771288 | ||
|
|
f679dd8ad7 | ||
|
|
9f1b913793 | ||
|
|
9328725e93 | ||
|
|
cea757f59c | ||
|
|
d93cb942fc | ||
|
|
4d280ed483 | ||
|
|
bb69770267 | ||
|
|
d4112d38de | ||
|
|
b1eec448f0 | ||
|
|
becfe25528 | ||
|
|
a461001677 | ||
|
|
aa15eeed78 | ||
|
|
6daac26f49 | ||
|
|
3551c81cc5 | ||
|
|
2b1004919d | ||
|
|
d200b9192a | ||
|
|
c2e8704683 | ||
|
|
0b2862b184 | ||
|
|
d959222bb8 | ||
|
|
e5550e5bad | ||
|
|
8546f98a87 | ||
|
|
7a6965087c | ||
|
|
2558455be4 | ||
|
|
65fdfc1e16 | ||
|
|
139e20367f | ||
|
|
e84aa04bb5 | ||
|
|
7a06ae575e | ||
|
|
460594480f | ||
|
|
6e676c3695 | ||
|
|
e6fa69bfd2 | ||
|
|
df3fa7ddb7 | ||
|
|
c090fbfd11 | ||
|
|
6d99158379 | ||
|
|
bb11bdce36 | ||
|
|
ca163f9cf7 | ||
|
|
5598025884 | ||
|
|
df82bbab43 | ||
|
|
ed5fd9c910 | ||
|
|
0ac14ce30c | ||
|
|
3793cfc0ff | ||
|
|
1c8377967d | ||
|
|
485612ae68 | ||
|
|
4016def2d0 | ||
|
|
c35a67f31e | ||
|
|
fd5896919b | ||
|
|
7a669cbbb0 | ||
|
|
8acf548c62 | ||
|
|
dc9282d6ff | ||
|
|
a4cb3e2af9 | ||
|
|
1eea063c3a | ||
|
|
583e2b76d9 | ||
|
|
ca215070e9 | ||
|
|
9852e1f190 | ||
|
|
9ce7d133d8 | ||
|
|
c157521bd0 | ||
|
|
309df5a99d | ||
|
|
f298d4d54f | ||
|
|
ca227ede76 | ||
|
|
7120698f1f | ||
|
|
5eb225b5ae | ||
|
|
71c26dab90 | ||
|
|
f8ee8b2ee2 | ||
|
|
639fb15dc4 | ||
|
|
c6fa081558 | ||
|
|
dcbca5448a | ||
|
|
0667110350 | ||
|
|
e089cab8cd | ||
|
|
634b76e5a2 | ||
|
|
11c20477e4 | ||
|
|
fca920de40 | ||
|
|
ce5660db36 | ||
|
|
f8bdaa04d8 | ||
|
|
08ebf7c03b | ||
|
|
9f164607b7 | ||
|
|
d88ce0be9c | ||
|
|
e17b770690 | ||
|
|
ff97c5255b | ||
|
|
2ab7143b69 | ||
|
|
96f258b866 | ||
|
|
e6d5fc23a7 | ||
|
|
fe1b40ce9e | ||
|
|
fb7f783ee1 | ||
|
|
9ff208f898 | ||
|
|
a8dc3ae5c2 | ||
|
|
07ec50b547 | ||
|
|
8bdff7acbc | ||
|
|
a66ba564fd | ||
|
|
0f4f5ac32c | ||
|
|
4e080c4b15 | ||
|
|
7e40dc2237 | ||
|
|
e2b90ee28c | ||
|
|
69ded48ce4 | ||
|
|
a22dfc813f | ||
|
|
c1d04d8e49 | ||
|
|
80efb6d9da | ||
|
|
51a35f8b4d | ||
|
|
b88396cf00 | ||
|
|
35d2727de0 | ||
|
|
23c32766e5 | ||
|
|
db492c3178 | ||
|
|
86cc6a7b44 | ||
|
|
2ed7f0f4fc | ||
|
|
9e9cc8f606 | ||
|
|
1e1d35fb87 | ||
|
|
119cd24a7f | ||
|
|
138fa6cdf3 | ||
|
|
7745e48498 | ||
|
|
b62e00f0ae | ||
|
|
ad876ac1b1 | ||
|
|
c35ec6bc34 | ||
|
|
a08b3682c3 | ||
|
|
c3ad33c28b | ||
|
|
59f9e417d4 | ||
|
|
7931c8abfd | ||
|
|
622f5f84cf | ||
|
|
c8944df576 | ||
|
|
3efbee2061 | ||
|
|
aafada554f | ||
|
|
56e81665fb | ||
|
|
e68f086d95 | ||
|
|
74edd99570 | ||
|
|
63720fd603 | ||
|
|
d6bea2a681 | ||
|
|
5b53a08132 | ||
|
|
09e33b3420 |
@@ -69,7 +69,7 @@ parameters:
|
|||||||
# Build machines configs.
|
# Build machines configs.
|
||||||
docker-image: &docker-image
|
docker-image: &docker-image
|
||||||
docker:
|
docker:
|
||||||
- image: electronjs/build:d09fd95029bd8c1c73069888231b29688ef385ed
|
- image: electron.azurecr.io/build:4cec2c5ab66765caa724e37bae2bffb9b29722a5
|
||||||
|
|
||||||
machine-linux-medium: &machine-linux-medium
|
machine-linux-medium: &machine-linux-medium
|
||||||
<<: *docker-image
|
<<: *docker-image
|
||||||
@@ -85,17 +85,17 @@ machine-linux-2xlarge: &machine-linux-2xlarge
|
|||||||
|
|
||||||
machine-mac: &machine-mac
|
machine-mac: &machine-mac
|
||||||
macos:
|
macos:
|
||||||
xcode: "11.5.0"
|
xcode: "12.2.0"
|
||||||
|
|
||||||
machine-mac-large: &machine-mac-large
|
machine-mac-large: &machine-mac-large
|
||||||
resource_class: large
|
resource_class: large
|
||||||
macos:
|
macos:
|
||||||
xcode: "11.5.0"
|
xcode: "12.2.0"
|
||||||
|
|
||||||
machine-mac-large-arm: &machine-mac-large-arm
|
machine-mac-large-arm: &machine-mac-large-arm
|
||||||
resource_class: large
|
resource_class: large
|
||||||
macos:
|
macos:
|
||||||
xcode: "12.0.0-large"
|
xcode: "12.2.0"
|
||||||
|
|
||||||
# Build configurations options.
|
# Build configurations options.
|
||||||
env-testing-build: &env-testing-build
|
env-testing-build: &env-testing-build
|
||||||
@@ -107,6 +107,7 @@ env-release-build: &env-release-build
|
|||||||
STRIP_BINARIES: true
|
STRIP_BINARIES: true
|
||||||
GENERATE_SYMBOLS: true
|
GENERATE_SYMBOLS: true
|
||||||
CHECK_DIST_MANIFEST: '1'
|
CHECK_DIST_MANIFEST: '1'
|
||||||
|
IS_RELEASE: true
|
||||||
|
|
||||||
env-headless-testing: &env-headless-testing
|
env-headless-testing: &env-headless-testing
|
||||||
DISPLAY: ':99.0'
|
DISPLAY: ':99.0'
|
||||||
@@ -256,23 +257,34 @@ step-gclient-sync: &step-gclient-sync
|
|||||||
"$CIRCLE_REPOSITORY_URL"
|
"$CIRCLE_REPOSITORY_URL"
|
||||||
|
|
||||||
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 gclient sync --with_branch_heads --with_tags
|
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 gclient sync --with_branch_heads --with_tags
|
||||||
# Re-export all the patches to check if there were changes.
|
if [ "$IS_RELEASE" != "true" ]; then
|
||||||
python src/electron/script/export_all_patches.py src/electron/patches/config.json
|
# Re-export all the patches to check if there were changes.
|
||||||
cd src/electron
|
python src/electron/script/export_all_patches.py src/electron/patches/config.json
|
||||||
git update-index --refresh || true
|
cd src/electron
|
||||||
if ! git diff-index --quiet HEAD --; then
|
git update-index --refresh || true
|
||||||
# There are changes to the patches. Make a git commit with the updated patches
|
if ! git diff-index --quiet HEAD --; then
|
||||||
git add patches
|
# There are changes to the patches. Make a git commit with the updated patches
|
||||||
GIT_COMMITTER_NAME="Electron Bot" GIT_COMMITTER_EMAIL="anonymous@electronjs.org" git commit -m "update patches" --author="Electron Bot <anonymous@electronjs.org>"
|
git add patches
|
||||||
# Export it
|
GIT_COMMITTER_NAME="Electron Bot" GIT_COMMITTER_EMAIL="electron@github.com" git commit -m "update patches" --author="Electron Bot <electron@github.com>"
|
||||||
mkdir -p ../../patches
|
# Export it
|
||||||
git format-patch -1 --stdout --keep-subject --no-stat --full-index > ../../patches/update-patches.patch
|
mkdir -p ../../patches
|
||||||
echo
|
git format-patch -1 --stdout --keep-subject --no-stat --full-index > ../../patches/update-patches.patch
|
||||||
echo "======================================================================"
|
if (node ./script/push-patch.js 2> /dev/null > /dev/null); then
|
||||||
echo "There were changes to the patches when applying."
|
echo
|
||||||
echo "Check the CI artifacts for a patch you can apply to fix it."
|
echo "======================================================================"
|
||||||
echo "======================================================================"
|
echo "Changes to the patches when applying, we have auto-pushed the diff to the current branch"
|
||||||
exit 1
|
echo "A new CI job will kick off shortly"
|
||||||
|
echo "======================================================================"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo
|
||||||
|
echo "======================================================================"
|
||||||
|
echo "There were changes to the patches when applying."
|
||||||
|
echo "Check the CI artifacts for a patch you can apply to fix it."
|
||||||
|
echo "======================================================================"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -299,10 +311,10 @@ step-setup-goma-for-build: &step-setup-goma-for-build
|
|||||||
name: Setup Goma
|
name: Setup Goma
|
||||||
command: |
|
command: |
|
||||||
echo 'export USE_GOMA=true' >> $BASH_ENV
|
echo 'export USE_GOMA=true' >> $BASH_ENV
|
||||||
if [ "`uname`" == "Linux" ]; then
|
echo 'export NUMBER_OF_NINJA_PROCESSES=300' >> $BASH_ENV
|
||||||
echo 'export NUMBER_OF_NINJA_PROCESSES=300' >> $BASH_ENV
|
if [ "`uname`" == "Darwin" ]; then
|
||||||
else
|
echo 'ulimit -n 10000' >> $BASH_ENV
|
||||||
echo 'export NUMBER_OF_NINJA_PROCESSES=25' >> $BASH_ENV
|
echo 'sudo launchctl limit maxfiles 65536 200000' >> $BASH_ENV
|
||||||
fi
|
fi
|
||||||
if [ ! -z "$RAW_GOMA_AUTH" ]; then
|
if [ ! -z "$RAW_GOMA_AUTH" ]; then
|
||||||
echo $RAW_GOMA_AUTH > ~/.goma_oauth2_config
|
echo $RAW_GOMA_AUTH > ~/.goma_oauth2_config
|
||||||
@@ -311,7 +323,7 @@ step-setup-goma-for-build: &step-setup-goma-for-build
|
|||||||
cd build-tools
|
cd build-tools
|
||||||
npm install
|
npm install
|
||||||
mkdir third_party
|
mkdir third_party
|
||||||
node -e "require('./src/utils/goma.js').downloadAndPrepare()"
|
node -e "require('./src/utils/goma.js').downloadAndPrepare({ gomaOneForAll: true })"
|
||||||
node -e "require('./src/utils/goma.js').ensure()"
|
node -e "require('./src/utils/goma.js').ensure()"
|
||||||
echo 'export GN_GOMA_FILE='`node -e "console.log(require('./src/utils/goma.js').gnFilePath)"` >> $BASH_ENV
|
echo 'export GN_GOMA_FILE='`node -e "console.log(require('./src/utils/goma.js').gnFilePath)"` >> $BASH_ENV
|
||||||
echo 'export LOCAL_GOMA_DIR='`node -e "console.log(require('./src/utils/goma.js').dir)"` >> $BASH_ENV
|
echo 'export LOCAL_GOMA_DIR='`node -e "console.log(require('./src/utils/goma.js').dir)"` >> $BASH_ENV
|
||||||
@@ -320,15 +332,17 @@ step-setup-goma-for-build: &step-setup-goma-for-build
|
|||||||
step-restore-brew-cache: &step-restore-brew-cache
|
step-restore-brew-cache: &step-restore-brew-cache
|
||||||
restore_cache:
|
restore_cache:
|
||||||
paths:
|
paths:
|
||||||
- /usr/local/Homebrew
|
- /usr/local/Cellar/gnu-tar
|
||||||
|
- /usr/local/bin/gtar
|
||||||
keys:
|
keys:
|
||||||
- v1-brew-cache-{{ arch }}
|
- v4-brew-cache-{{ arch }}
|
||||||
|
|
||||||
step-save-brew-cache: &step-save-brew-cache
|
step-save-brew-cache: &step-save-brew-cache
|
||||||
save_cache:
|
save_cache:
|
||||||
paths:
|
paths:
|
||||||
- /usr/local/Homebrew
|
- /usr/local/Cellar/gnu-tar
|
||||||
key: v1-brew-cache-{{ arch }}
|
- /usr/local/bin/gtar
|
||||||
|
key: v4-brew-cache-{{ arch }}
|
||||||
name: Persisting brew cache
|
name: Persisting brew cache
|
||||||
|
|
||||||
step-get-more-space-on-mac: &step-get-more-space-on-mac
|
step-get-more-space-on-mac: &step-get-more-space-on-mac
|
||||||
@@ -468,8 +482,10 @@ step-install-gnutar-on-mac: &step-install-gnutar-on-mac
|
|||||||
name: Install gnu-tar on macos
|
name: Install gnu-tar on macos
|
||||||
command: |
|
command: |
|
||||||
if [ "`uname`" == "Darwin" ]; then
|
if [ "`uname`" == "Darwin" ]; then
|
||||||
brew update
|
if [ ! -d /usr/local/Cellar/gnu-tar/ ]; then
|
||||||
brew install gnu-tar
|
brew update
|
||||||
|
brew install gnu-tar
|
||||||
|
fi
|
||||||
ln -fs /usr/local/bin/gtar /usr/local/bin/tar
|
ln -fs /usr/local/bin/gtar /usr/local/bin/tar
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -572,6 +588,9 @@ step-electron-dist-build: &step-electron-dist-build
|
|||||||
if [ x"$MAS_BUILD" == x"true" ]; then
|
if [ x"$MAS_BUILD" == x"true" ]; then
|
||||||
target_os=mac_mas
|
target_os=mac_mas
|
||||||
fi
|
fi
|
||||||
|
if [ "$TARGET_ARCH" == "arm64" ]; then
|
||||||
|
target_cpu=arm64
|
||||||
|
fi
|
||||||
elif [ "`uname`" == "Linux" ]; then
|
elif [ "`uname`" == "Linux" ]; then
|
||||||
target_os=linux
|
target_os=linux
|
||||||
if [ x"$TARGET_ARCH" == x ]; then
|
if [ x"$TARGET_ARCH" == x ]; then
|
||||||
@@ -659,10 +678,10 @@ step-electron-publish: &step-electron-publish
|
|||||||
cd src/electron
|
cd src/electron
|
||||||
if [ "$UPLOAD_TO_S3" == "1" ]; then
|
if [ "$UPLOAD_TO_S3" == "1" ]; then
|
||||||
echo 'Uploading Electron release distribution to S3'
|
echo 'Uploading Electron release distribution to S3'
|
||||||
script/release/uploaders/upload.py --upload_to_s3
|
script/release/uploaders/upload.py --verbose --upload_to_s3
|
||||||
else
|
else
|
||||||
echo 'Uploading Electron release distribution to Github releases'
|
echo 'Uploading Electron release distribution to Github releases'
|
||||||
script/release/uploaders/upload.py
|
script/release/uploaders/upload.py --verbose
|
||||||
fi
|
fi
|
||||||
|
|
||||||
step-persist-data-for-tests: &step-persist-data-for-tests
|
step-persist-data-for-tests: &step-persist-data-for-tests
|
||||||
@@ -764,14 +783,20 @@ step-setup-linux-for-headless-testing: &step-setup-linux-for-headless-testing
|
|||||||
|
|
||||||
step-show-sccache-stats: &step-show-sccache-stats
|
step-show-sccache-stats: &step-show-sccache-stats
|
||||||
run:
|
run:
|
||||||
|
shell: /bin/bash
|
||||||
name: Check sccache/goma stats after build
|
name: Check sccache/goma stats after build
|
||||||
command: |
|
command: |
|
||||||
if [ "$SCCACHE_PATH" != "" ]; then
|
if [ "$SCCACHE_PATH" != "" ]; then
|
||||||
$SCCACHE_PATH -s
|
$SCCACHE_PATH -s
|
||||||
fi
|
fi
|
||||||
if [ "$USE_GOMA" == "true" ]; then
|
if [ "$USE_GOMA" == "true" ]; then
|
||||||
|
set +e
|
||||||
|
set +o pipefail
|
||||||
$LOCAL_GOMA_DIR/goma_ctl.py stat
|
$LOCAL_GOMA_DIR/goma_ctl.py stat
|
||||||
|
$LOCAL_GOMA_DIR/diagnose_goma_log.py
|
||||||
|
true
|
||||||
fi
|
fi
|
||||||
|
when: always
|
||||||
|
|
||||||
step-mksnapshot-build: &step-mksnapshot-build
|
step-mksnapshot-build: &step-mksnapshot-build
|
||||||
run:
|
run:
|
||||||
@@ -909,6 +934,8 @@ step-ninja-summary: &step-ninja-summary
|
|||||||
run:
|
run:
|
||||||
name: Print ninja summary
|
name: Print ninja summary
|
||||||
command: |
|
command: |
|
||||||
|
set +e
|
||||||
|
set +o pipefail
|
||||||
python depot_tools/post_build_ninja_summary.py -C src/out/Default
|
python depot_tools/post_build_ninja_summary.py -C src/out/Default
|
||||||
|
|
||||||
step-ninja-report: &step-ninja-report
|
step-ninja-report: &step-ninja-report
|
||||||
@@ -1135,7 +1162,6 @@ steps-checkout-and-save-cache: &steps-checkout-and-save-cache
|
|||||||
- *step-maybe-early-exit-doc-only-change
|
- *step-maybe-early-exit-doc-only-change
|
||||||
- *step-depot-tools-get
|
- *step-depot-tools-get
|
||||||
- *step-depot-tools-add-to-path
|
- *step-depot-tools-add-to-path
|
||||||
- *step-restore-brew-cache
|
|
||||||
- *step-get-more-space-on-mac
|
- *step-get-more-space-on-mac
|
||||||
- *step-install-gnutar-on-mac
|
- *step-install-gnutar-on-mac
|
||||||
|
|
||||||
@@ -1799,7 +1825,7 @@ jobs:
|
|||||||
|
|
||||||
# Layer 2: Builds.
|
# Layer 2: Builds.
|
||||||
linux-x64-testing:
|
linux-x64-testing:
|
||||||
<<: *machine-linux-xlarge
|
<<: *machine-linux-2xlarge
|
||||||
environment:
|
environment:
|
||||||
<<: *env-global
|
<<: *env-global
|
||||||
<<: *env-testing-build
|
<<: *env-testing-build
|
||||||
@@ -1879,7 +1905,7 @@ jobs:
|
|||||||
checkout: false
|
checkout: false
|
||||||
|
|
||||||
linux-ia32-testing:
|
linux-ia32-testing:
|
||||||
<<: *machine-linux-xlarge
|
<<: *machine-linux-2xlarge
|
||||||
environment:
|
environment:
|
||||||
<<: *env-global
|
<<: *env-global
|
||||||
<<: *env-ia32
|
<<: *env-ia32
|
||||||
@@ -1945,7 +1971,7 @@ jobs:
|
|||||||
checkout: false
|
checkout: false
|
||||||
|
|
||||||
linux-arm-testing:
|
linux-arm-testing:
|
||||||
<<: *machine-linux-xlarge
|
<<: *machine-linux-2xlarge
|
||||||
environment:
|
environment:
|
||||||
<<: *env-global
|
<<: *env-global
|
||||||
<<: *env-arm
|
<<: *env-arm
|
||||||
@@ -2012,7 +2038,7 @@ jobs:
|
|||||||
checkout: false
|
checkout: false
|
||||||
|
|
||||||
linux-arm64-testing:
|
linux-arm64-testing:
|
||||||
<<: *machine-linux-xlarge
|
<<: *machine-linux-2xlarge
|
||||||
environment:
|
environment:
|
||||||
<<: *env-global
|
<<: *env-global
|
||||||
<<: *env-arm64
|
<<: *env-arm64
|
||||||
|
|||||||
10
.gitattributes
vendored
10
.gitattributes
vendored
@@ -2,3 +2,13 @@
|
|||||||
# files to be checked out with LF endings even if core.autocrlf is true.
|
# files to be checked out with LF endings even if core.autocrlf is true.
|
||||||
*.patch text eol=lf
|
*.patch text eol=lf
|
||||||
patches/**/.patches merge=union
|
patches/**/.patches merge=union
|
||||||
|
|
||||||
|
# Source code and markdown files should always use LF as line ending.
|
||||||
|
*.cc text eol=lf
|
||||||
|
*.mm text eol=lf
|
||||||
|
*.h text eol=lf
|
||||||
|
*.js text eol=lf
|
||||||
|
*.ts text eol=lf
|
||||||
|
*.py text eol=lf
|
||||||
|
*.ps1 text eol=lf
|
||||||
|
*.md text eol=lf
|
||||||
|
|||||||
116
BUILD.gn
116
BUILD.gn
@@ -325,7 +325,6 @@ source_set("electron_lib") {
|
|||||||
"//base/allocator:buildflags",
|
"//base/allocator:buildflags",
|
||||||
"//chrome/app:command_ids",
|
"//chrome/app:command_ids",
|
||||||
"//chrome/app/resources:platform_locale_settings",
|
"//chrome/app/resources:platform_locale_settings",
|
||||||
"//chrome/services/printing/public/mojom",
|
|
||||||
"//components/certificate_transparency",
|
"//components/certificate_transparency",
|
||||||
"//components/language/core/browser",
|
"//components/language/core/browser",
|
||||||
"//components/net_log",
|
"//components/net_log",
|
||||||
@@ -372,6 +371,7 @@ source_set("electron_lib") {
|
|||||||
"//third_party/libyuv",
|
"//third_party/libyuv",
|
||||||
"//third_party/webrtc_overrides:webrtc_component",
|
"//third_party/webrtc_overrides:webrtc_component",
|
||||||
"//third_party/widevine/cdm:headers",
|
"//third_party/widevine/cdm:headers",
|
||||||
|
"//third_party/zlib/google:zip",
|
||||||
"//ui/base/idle",
|
"//ui/base/idle",
|
||||||
"//ui/events:dom_keycode_converter",
|
"//ui/events:dom_keycode_converter",
|
||||||
"//ui/gl",
|
"//ui/gl",
|
||||||
@@ -405,44 +405,26 @@ source_set("electron_lib") {
|
|||||||
defines += [ "GDK_DISABLE_DEPRECATION_WARNINGS" ]
|
defines += [ "GDK_DISABLE_DEPRECATION_WARNINGS" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
extra_source_filters = []
|
|
||||||
if (!is_linux) {
|
|
||||||
extra_source_filters += [
|
|
||||||
"*\bx/*",
|
|
||||||
"*_x11.h",
|
|
||||||
"*_x11.cc",
|
|
||||||
"*_gtk.h",
|
|
||||||
"*_gtk.cc",
|
|
||||||
"*\blibrary_loaders/*",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
if (!is_win) {
|
|
||||||
extra_source_filters += [
|
|
||||||
"*\bwin_*.h",
|
|
||||||
"*\bwin_*.cc",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
if (!is_posix) {
|
|
||||||
extra_source_filters += [
|
|
||||||
"*_posix.cc",
|
|
||||||
"*_posix.h",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
if (is_mac) {
|
|
||||||
extra_source_filters += [
|
|
||||||
"*_views.cc",
|
|
||||||
"*_views.h",
|
|
||||||
"*\bviews/*",
|
|
||||||
]
|
|
||||||
}
|
|
||||||
if (!is_mas_build) {
|
if (!is_mas_build) {
|
||||||
deps += [ "//components/crash/core/app" ]
|
deps += [ "//components/crash/core/app" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
set_sources_assignment_filter(
|
|
||||||
sources_assignment_filter + extra_source_filters)
|
|
||||||
sources = filenames.lib_sources
|
sources = filenames.lib_sources
|
||||||
set_sources_assignment_filter(sources_assignment_filter)
|
if (is_win) {
|
||||||
|
sources += filenames.lib_sources_win
|
||||||
|
}
|
||||||
|
if (is_mac) {
|
||||||
|
sources += filenames.lib_sources_mac
|
||||||
|
}
|
||||||
|
if (is_posix) {
|
||||||
|
sources += filenames.lib_sources_posix
|
||||||
|
}
|
||||||
|
if (is_linux) {
|
||||||
|
sources += filenames.lib_sources_linux
|
||||||
|
}
|
||||||
|
if (!is_mac) {
|
||||||
|
sources += filenames.lib_sources_views
|
||||||
|
}
|
||||||
|
|
||||||
if (is_component_build) {
|
if (is_component_build) {
|
||||||
defines += [ "NODE_SHARED_MODE" ]
|
defines += [ "NODE_SHARED_MODE" ]
|
||||||
@@ -531,7 +513,9 @@ source_set("electron_lib") {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
configs += [ ":gio_unix" ]
|
configs += [ ":gio_unix" ]
|
||||||
configs += [ "//build/config/linux:x11" ]
|
if (use_x11) {
|
||||||
|
deps += [ "//ui/gfx/x" ]
|
||||||
|
}
|
||||||
defines += [
|
defines += [
|
||||||
# Disable warnings for g_settings_list_schemas.
|
# Disable warnings for g_settings_list_schemas.
|
||||||
"GLIB_DISABLE_DEPRECATION_WARNINGS",
|
"GLIB_DISABLE_DEPRECATION_WARNINGS",
|
||||||
@@ -587,7 +571,6 @@ source_set("electron_lib") {
|
|||||||
sources += [
|
sources += [
|
||||||
"shell/browser/osr/osr_host_display_client.cc",
|
"shell/browser/osr/osr_host_display_client.cc",
|
||||||
"shell/browser/osr/osr_host_display_client.h",
|
"shell/browser/osr/osr_host_display_client.h",
|
||||||
"shell/browser/osr/osr_host_display_client_mac.mm",
|
|
||||||
"shell/browser/osr/osr_render_widget_host_view.cc",
|
"shell/browser/osr/osr_render_widget_host_view.cc",
|
||||||
"shell/browser/osr/osr_render_widget_host_view.h",
|
"shell/browser/osr/osr_render_widget_host_view.h",
|
||||||
"shell/browser/osr/osr_video_consumer.cc",
|
"shell/browser/osr/osr_video_consumer.cc",
|
||||||
@@ -596,8 +579,13 @@ source_set("electron_lib") {
|
|||||||
"shell/browser/osr/osr_view_proxy.h",
|
"shell/browser/osr/osr_view_proxy.h",
|
||||||
"shell/browser/osr/osr_web_contents_view.cc",
|
"shell/browser/osr/osr_web_contents_view.cc",
|
||||||
"shell/browser/osr/osr_web_contents_view.h",
|
"shell/browser/osr/osr_web_contents_view.h",
|
||||||
"shell/browser/osr/osr_web_contents_view_mac.mm",
|
|
||||||
]
|
]
|
||||||
|
if (is_mac) {
|
||||||
|
sources += [
|
||||||
|
"shell/browser/osr/osr_host_display_client_mac.mm",
|
||||||
|
"shell/browser/osr/osr_web_contents_view_mac.mm",
|
||||||
|
]
|
||||||
|
}
|
||||||
deps += [
|
deps += [
|
||||||
"//components/viz/service",
|
"//components/viz/service",
|
||||||
"//services/viz/public/mojom",
|
"//services/viz/public/mojom",
|
||||||
@@ -632,7 +620,10 @@ source_set("electron_lib") {
|
|||||||
"shell/renderer/printing/print_render_frame_helper_delegate.cc",
|
"shell/renderer/printing/print_render_frame_helper_delegate.cc",
|
||||||
"shell/renderer/printing/print_render_frame_helper_delegate.h",
|
"shell/renderer/printing/print_render_frame_helper_delegate.h",
|
||||||
]
|
]
|
||||||
deps += [ "//components/printing/common:mojo_interfaces" ]
|
deps += [
|
||||||
|
"//chrome/services/printing/public/mojom",
|
||||||
|
"//components/printing/common:mojo_interfaces",
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if (enable_electron_extensions) {
|
if (enable_electron_extensions) {
|
||||||
@@ -670,6 +661,14 @@ source_set("electron_lib") {
|
|||||||
"shell/browser/electron_pdf_web_contents_helper_client.h",
|
"shell/browser/electron_pdf_web_contents_helper_client.h",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (is_win && enable_win_dark_mode_window_ui) {
|
||||||
|
sources += [
|
||||||
|
"shell/browser/win/dark_mode.cc",
|
||||||
|
"shell/browser/win/dark_mode.h",
|
||||||
|
]
|
||||||
|
libs += [ "uxtheme.lib" ]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
electron_paks("packed_resources") {
|
electron_paks("packed_resources") {
|
||||||
@@ -695,10 +694,10 @@ if (is_mac) {
|
|||||||
action("fake_v8_context_snapshot_generator") {
|
action("fake_v8_context_snapshot_generator") {
|
||||||
script = "build/fake_v8_context_snapshot_generator.py"
|
script = "build/fake_v8_context_snapshot_generator.py"
|
||||||
args = [
|
args = [
|
||||||
rebase_path("$root_out_dir/v8_context_snapshot.bin"),
|
rebase_path("$root_out_dir/$v8_context_snapshot_filename"),
|
||||||
rebase_path("$root_out_dir/fake/v8_context_snapshot.bin"),
|
rebase_path("$root_out_dir/fake/$v8_context_snapshot_filename"),
|
||||||
]
|
]
|
||||||
outputs = [ "$root_out_dir/fake/v8_context_snapshot.bin" ]
|
outputs = [ "$root_out_dir/fake/$v8_context_snapshot_filename" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
bundle_data("electron_framework_resources") {
|
bundle_data("electron_framework_resources") {
|
||||||
@@ -712,10 +711,10 @@ if (is_mac) {
|
|||||||
public_deps += [ "//v8" ]
|
public_deps += [ "//v8" ]
|
||||||
if (use_v8_context_snapshot) {
|
if (use_v8_context_snapshot) {
|
||||||
if (use_prebuilt_v8_context_snapshot) {
|
if (use_prebuilt_v8_context_snapshot) {
|
||||||
sources += [ "$root_out_dir/fake/v8_context_snapshot.bin" ]
|
sources += [ "$root_out_dir/fake/$v8_context_snapshot_filename" ]
|
||||||
public_deps += [ ":fake_v8_context_snapshot_generator" ]
|
public_deps += [ ":fake_v8_context_snapshot_generator" ]
|
||||||
} else {
|
} else {
|
||||||
sources += [ "$root_out_dir/v8_context_snapshot.bin" ]
|
sources += [ "$root_out_dir/$v8_context_snapshot_filename" ]
|
||||||
public_deps += [ "//tools/v8_context_snapshot" ]
|
public_deps += [ "//tools/v8_context_snapshot" ]
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1138,22 +1137,37 @@ if (is_mac) {
|
|||||||
"//components/crash/core/app:run_as_crashpad_handler",
|
"//components/crash/core/app:run_as_crashpad_handler",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
ldflags = []
|
||||||
|
|
||||||
libs = [
|
libs = [
|
||||||
"comctl32.lib",
|
"comctl32.lib",
|
||||||
"uiautomationcore.lib",
|
"uiautomationcore.lib",
|
||||||
"wtsapi32.lib",
|
"wtsapi32.lib",
|
||||||
]
|
]
|
||||||
|
|
||||||
configs += [ "//build/config/win:windowed" ]
|
configs += [
|
||||||
|
"//build/config/win:windowed",
|
||||||
ldflags = [
|
"//build/config/win:delayloads",
|
||||||
# Windows 7 doesn't have these DLLs.
|
|
||||||
# TODO: are there other DLLs we need to list here to be win7
|
|
||||||
# compatible?
|
|
||||||
"/DELAYLOAD:api-ms-win-core-winrt-l1-1-0.dll",
|
|
||||||
"/DELAYLOAD:api-ms-win-core-winrt-string-l1-1-0.dll",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (target_cpu == "arm64") {
|
||||||
|
configs -= [ "//build/config/win:cfi_linker" ]
|
||||||
|
ldflags += [ "/guard:cf,nolongjmp" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (current_cpu == "x86") {
|
||||||
|
# Set the initial stack size to 0.5MiB, instead of the 1.5MiB needed by
|
||||||
|
# Chrome's main thread. This saves significant memory on threads (like
|
||||||
|
# those in the Windows thread pool, and others) whose stack size we can
|
||||||
|
# only control through this setting. Because Chrome's main thread needs
|
||||||
|
# a minimum 1.5 MiB stack, the main thread (in 32-bit builds only) uses
|
||||||
|
# fibers to switch to a 1.5 MiB stack before running any other code.
|
||||||
|
ldflags += [ "/STACK:0x80000" ]
|
||||||
|
} else {
|
||||||
|
# Increase the initial stack size. The default is 1MB, this is 8MB.
|
||||||
|
ldflags += [ "/STACK:0x800000" ]
|
||||||
|
}
|
||||||
|
|
||||||
# This is to support renaming of electron.exe. node-gyp has hard-coded
|
# This is to support renaming of electron.exe. node-gyp has hard-coded
|
||||||
# executable names which it will recognise as node. This module definition
|
# executable names which it will recognise as node. This module definition
|
||||||
# file claims that the electron executable is in fact named "node.exe",
|
# file claims that the electron executable is in fact named "node.exe",
|
||||||
|
|||||||
4
DEPS
4
DEPS
@@ -14,13 +14,13 @@ gclient_gn_args = [
|
|||||||
|
|
||||||
vars = {
|
vars = {
|
||||||
'chromium_version':
|
'chromium_version':
|
||||||
'b04584161e07d4ac110045b7647fa8a81f5f0709',
|
'87.0.4280.141',
|
||||||
'node_version':
|
'node_version':
|
||||||
'v12.18.3',
|
'v12.18.3',
|
||||||
'nan_version':
|
'nan_version':
|
||||||
'2c4ee8a32a299eada3cd6e468bbd0a473bfea96d',
|
'2c4ee8a32a299eada3cd6e468bbd0a473bfea96d',
|
||||||
'squirrel.mac_version':
|
'squirrel.mac_version':
|
||||||
'44468f858ce0d25c27bd5e674abfa104e0119738',
|
'a3a5b3f03b824441c014893b18f99a103b2603e9',
|
||||||
|
|
||||||
'boto_version': 'f7574aa6cc2c819430c1f05e9a1a1a666ef8169b',
|
'boto_version': 'f7574aa6cc2c819430c1f05e9a1a1a666ef8169b',
|
||||||
'pyyaml_version': '3.12',
|
'pyyaml_version': '3.12',
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
11.0.0-nightly.20200826
|
11.3.0
|
||||||
@@ -28,15 +28,12 @@ The preferred method is to install Electron as a development dependency in your
|
|||||||
app:
|
app:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
npm install electron --save-dev [--save-exact]
|
npm install electron --save-dev
|
||||||
```
|
```
|
||||||
|
|
||||||
The `--save-exact` flag is recommended for Electron prior to version 2, as it does not follow semantic
|
|
||||||
versioning. As of version 2.0.0, Electron follows semver, so you don't need `--save-exact` flag. For info on how to manage Electron versions in your apps, see
|
|
||||||
[Electron versioning](docs/tutorial/electron-versioning.md).
|
|
||||||
|
|
||||||
For more installation options and troubleshooting tips, see
|
For more installation options and troubleshooting tips, see
|
||||||
[installation](docs/tutorial/installation.md).
|
[installation](docs/tutorial/installation.md). For info on how to manage Electron versions in your apps, see
|
||||||
|
[Electron versioning](docs/tutorial/electron-versioning.md).
|
||||||
|
|
||||||
## Quick start & Electron Fiddle
|
## Quick start & Electron Fiddle
|
||||||
|
|
||||||
|
|||||||
30
appveyor.yml
30
appveyor.yml
@@ -53,7 +53,9 @@ build_script:
|
|||||||
} else {
|
} else {
|
||||||
node script/yarn.js install --frozen-lockfile
|
node script/yarn.js install --frozen-lockfile
|
||||||
|
|
||||||
if ($(node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER --prBranch=$env:APPVEYOR_REPO_BRANCH;$LASTEXITCODE -eq 0)) {
|
$result = node script/doc-only-change.js --prNumber=$env:APPVEYOR_PULL_REQUEST_NUMBER --prBranch=$env:APPVEYOR_REPO_BRANCH
|
||||||
|
Write-Output $result
|
||||||
|
if ($result.ExitCode -eq 0) {
|
||||||
Write-warning "Skipping build for doc only change"; Exit-AppveyorBuild
|
Write-warning "Skipping build for doc only change"; Exit-AppveyorBuild
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -99,6 +101,11 @@ build_script:
|
|||||||
} else {
|
} else {
|
||||||
# update external binaries
|
# update external binaries
|
||||||
python src/electron/script/update-external-binaries.py
|
python src/electron/script/update-external-binaries.py
|
||||||
|
# update angle
|
||||||
|
cd src\third_party\angle
|
||||||
|
git remote set-url origin https://chromium.googlesource.com/angle/angle.git
|
||||||
|
git fetch
|
||||||
|
cd ..\..\..
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
# file does not exist, gclient sync, then zip
|
# file does not exist, gclient sync, then zip
|
||||||
@@ -114,14 +121,16 @@ build_script:
|
|||||||
if ($env:SAVE_GCLIENT_SRC -eq 'true') {
|
if ($env:SAVE_GCLIENT_SRC -eq 'true') {
|
||||||
# archive current source for future use
|
# archive current source for future use
|
||||||
# only run on x64/woa to avoid contention saving
|
# only run on x64/woa to avoid contention saving
|
||||||
if ($(7z a $zipfile src -xr!android_webview -xr!electron -xr'!*\.git' -xr!third_party\WebKit\LayoutTests! -xr!third_party\blink\web_tests -xr!third_party\blink\perf_tests -slp -t7z -mmt=30;$LASTEXITCODE -ne 0)) {
|
$(7z a $zipfile src -xr!android_webview -xr!electron -xr'!*\.git' -xr!third_party\WebKit\LayoutTests! -xr!third_party\blink\web_tests -xr!third_party\blink\perf_tests -slp -t7z -mmt=30)
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Write-warning "Could not save source to shared drive; continuing anyway"
|
Write-warning "Could not save source to shared drive; continuing anyway"
|
||||||
}
|
}
|
||||||
# build time generation of file gen/angle/commit.h depends on
|
# build time generation of file gen/angle/angle_commit.h depends on
|
||||||
# third_party/angle/.git/HEAD.
|
# third_party/angle/.git
|
||||||
# https://chromium-review.googlesource.com/c/angle/angle/+/2074924
|
# https://chromium-review.googlesource.com/c/angle/angle/+/2074924
|
||||||
if ($(7z a $zipfile src\third_party\angle\.git\HEAD;$LASTEXITCODE -ne 0)) {
|
$(7z a $zipfile src\third_party\angle\.git)
|
||||||
Write-warning "Failed to add third_party\angle\.git\HEAD; continuing anyway"
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
Write-warning "Failed to add third_party\angle\.git; continuing anyway"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
- ps: >-
|
- ps: >-
|
||||||
@@ -134,7 +143,7 @@ build_script:
|
|||||||
cd build-tools
|
cd build-tools
|
||||||
npm install
|
npm install
|
||||||
mkdir third_party
|
mkdir third_party
|
||||||
node -e "require('./src/utils/goma.js').downloadAndPrepare()"
|
node -e "require('./src/utils/goma.js').downloadAndPrepare({ gomaOneForAll: true })"
|
||||||
$env:GN_GOMA_FILE = node -e "console.log(require('./src/utils/goma.js').gnFilePath)"
|
$env:GN_GOMA_FILE = node -e "console.log(require('./src/utils/goma.js').gnFilePath)"
|
||||||
$env:LOCAL_GOMA_DIR = node -e "console.log(require('./src/utils/goma.js').dir)"
|
$env:LOCAL_GOMA_DIR = node -e "console.log(require('./src/utils/goma.js').dir)"
|
||||||
cd ..
|
cd ..
|
||||||
@@ -205,7 +214,8 @@ test_script:
|
|||||||
echo "Skipping tests for $env:GN_CONFIG build"
|
echo "Skipping tests for $env:GN_CONFIG build"
|
||||||
}
|
}
|
||||||
- cd electron
|
- cd electron
|
||||||
- if "%RUN_TESTS%"=="true" ( echo Running test suite & node script/yarn test -- --trace-uncaught --enable-logging)
|
# CalculateNativeWinOcclusion is disabled due to https://bugs.chromium.org/p/chromium/issues/detail?id=1139022
|
||||||
|
- if "%RUN_TESTS%"=="true" ( echo Running test suite & node script/yarn test -- --trace-uncaught --enable-logging --disable-features=CalculateNativeWinOcclusion )
|
||||||
- cd ..
|
- cd ..
|
||||||
- if "%RUN_TESTS%"=="true" ( echo Verifying non proprietary ffmpeg & python electron\script\verify-ffmpeg.py --build-dir out\Default --source-root %cd% --ffmpeg-path out\ffmpeg )
|
- if "%RUN_TESTS%"=="true" ( 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 "About to verify mksnapshot"
|
||||||
@@ -219,10 +229,10 @@ deploy_script:
|
|||||||
if (Test-Path Env:\ELECTRON_RELEASE) {
|
if (Test-Path Env:\ELECTRON_RELEASE) {
|
||||||
if (Test-Path Env:\UPLOAD_TO_S3) {
|
if (Test-Path Env:\UPLOAD_TO_S3) {
|
||||||
Write-Output "Uploading Electron release distribution to s3"
|
Write-Output "Uploading Electron release distribution to s3"
|
||||||
& python script\release\uploaders\upload.py --upload_to_s3
|
& python script\release\uploaders\upload.py --verbose --upload_to_s3
|
||||||
} else {
|
} else {
|
||||||
Write-Output "Uploading Electron release distribution to github releases"
|
Write-Output "Uploading Electron release distribution to github releases"
|
||||||
& python script\release\uploaders\upload.py
|
& python script\release\uploaders\upload.py --verbose
|
||||||
}
|
}
|
||||||
} elseif (Test-Path Env:\TEST_WOA) {
|
} elseif (Test-Path Env:\TEST_WOA) {
|
||||||
node script/release/ci-release-build.js --job=electron-woa-testing --ci=VSTS --armTest --appveyorJobId=$env:APPVEYOR_JOB_ID $env:APPVEYOR_REPO_BRANCH
|
node script/release/ci-release-build.js --job=electron-woa-testing --ci=VSTS --armTest --appveyorJobId=$env:APPVEYOR_JOB_ID $env:APPVEYOR_REPO_BRANCH
|
||||||
|
|||||||
@@ -63,7 +63,8 @@ steps:
|
|||||||
set npm_config_nodedir=%cd%\out\Default\gen\node_headers
|
set npm_config_nodedir=%cd%\out\Default\gen\node_headers
|
||||||
set npm_config_arch=arm64
|
set npm_config_arch=arm64
|
||||||
cd electron
|
cd electron
|
||||||
node script/yarn test -- --enable-logging --verbose
|
# CalculateNativeWinOcclusion is disabled due to https://bugs.chromium.org/p/chromium/issues/detail?id=1139022
|
||||||
|
node script/yarn test -- --enable-logging --verbose --disable-features=CalculateNativeWinOcclusion
|
||||||
displayName: 'Run Electron tests'
|
displayName: 'Run Electron tests'
|
||||||
env:
|
env:
|
||||||
ELECTRON_OUT_DIR: Default
|
ELECTRON_OUT_DIR: Default
|
||||||
@@ -92,6 +93,6 @@ steps:
|
|||||||
condition: always()
|
condition: always()
|
||||||
|
|
||||||
- powershell: |
|
- powershell: |
|
||||||
Remove-Item -path $env:APPDATA/Electron* -Recurse
|
Remove-Item -path $env:APPDATA/Electron* -Recurse -Force -ErrorAction Ignore
|
||||||
displayName: 'Delete user app data directories'
|
displayName: 'Delete user app data directories'
|
||||||
condition: always()
|
condition: always()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ is_electron_build = true
|
|||||||
root_extra_deps = [ "//electron" ]
|
root_extra_deps = [ "//electron" ]
|
||||||
|
|
||||||
# Registry of NMVs --> https://github.com/nodejs/node/blob/master/doc/abi_version_registry.json
|
# Registry of NMVs --> https://github.com/nodejs/node/blob/master/doc/abi_version_registry.json
|
||||||
node_module_version = 82
|
node_module_version = 85
|
||||||
|
|
||||||
v8_promise_internal_field_count = 1
|
v8_promise_internal_field_count = 1
|
||||||
v8_typed_array_max_size_in_heap = 0
|
v8_typed_array_max_size_in_heap = 0
|
||||||
|
|||||||
@@ -10,10 +10,9 @@ config.output = {
|
|||||||
filename: path.basename(outPath)
|
filename: path.basename(outPath)
|
||||||
};
|
};
|
||||||
|
|
||||||
const { wrapInitWithProfilingTimeout } = config;
|
const { wrapInitWithProfilingTimeout, wrapInitWithTryCatch, ...webpackConfig } = config;
|
||||||
delete config.wrapInitWithProfilingTimeout;
|
|
||||||
|
|
||||||
webpack(config, (err, stats) => {
|
webpack(webpackConfig, (err, stats) => {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error(err);
|
console.error(err);
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
@@ -21,9 +20,17 @@ webpack(config, (err, stats) => {
|
|||||||
console.error(stats.toString('normal'));
|
console.error(stats.toString('normal'));
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else {
|
} else {
|
||||||
|
let contents = fs.readFileSync(outPath, 'utf8');
|
||||||
|
if (wrapInitWithTryCatch) {
|
||||||
|
contents = `try {
|
||||||
|
${contents}
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Electron ${webpackConfig.output.filename} script failed to run');
|
||||||
|
console.error(err);
|
||||||
|
}`;
|
||||||
|
}
|
||||||
if (wrapInitWithProfilingTimeout) {
|
if (wrapInitWithProfilingTimeout) {
|
||||||
const contents = fs.readFileSync(outPath, 'utf8');
|
contents = `function ___electron_webpack_init__() {
|
||||||
const newContents = `function ___electron_webpack_init__() {
|
|
||||||
${contents}
|
${contents}
|
||||||
};
|
};
|
||||||
if ((globalThis.process || binding.process).argv.includes("--profile-electron-init")) {
|
if ((globalThis.process || binding.process).argv.includes("--profile-electron-init")) {
|
||||||
@@ -31,8 +38,8 @@ if ((globalThis.process || binding.process).argv.includes("--profile-electron-in
|
|||||||
} else {
|
} else {
|
||||||
___electron_webpack_init__();
|
___electron_webpack_init__();
|
||||||
}`;
|
}`;
|
||||||
fs.writeFileSync(outPath, newContents);
|
|
||||||
}
|
}
|
||||||
|
fs.writeFileSync(outPath, contents);
|
||||||
process.exit(0);
|
process.exit(0);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -69,7 +69,8 @@ module.exports = ({
|
|||||||
loadElectronFromAlternateTarget,
|
loadElectronFromAlternateTarget,
|
||||||
targetDeletesNodeGlobals,
|
targetDeletesNodeGlobals,
|
||||||
target,
|
target,
|
||||||
wrapInitWithProfilingTimeout
|
wrapInitWithProfilingTimeout,
|
||||||
|
wrapInitWithTryCatch
|
||||||
}) => {
|
}) => {
|
||||||
let entry = path.resolve(electronRoot, 'lib', target, 'init.ts');
|
let entry = path.resolve(electronRoot, 'lib', target, 'init.ts');
|
||||||
if (!fs.existsSync(entry)) {
|
if (!fs.existsSync(entry)) {
|
||||||
@@ -87,6 +88,7 @@ module.exports = ({
|
|||||||
filename: `${target}.bundle.js`
|
filename: `${target}.bundle.js`
|
||||||
},
|
},
|
||||||
wrapInitWithProfilingTimeout,
|
wrapInitWithProfilingTimeout,
|
||||||
|
wrapInitWithTryCatch,
|
||||||
resolve: {
|
resolve: {
|
||||||
alias: {
|
alias: {
|
||||||
'@electron/internal': path.resolve(electronRoot, 'lib'),
|
'@electron/internal': path.resolve(electronRoot, 'lib'),
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
module.exports = require('./webpack.config.base')({
|
module.exports = require('./webpack.config.base')({
|
||||||
target: 'isolated_renderer',
|
target: 'isolated_renderer',
|
||||||
alwaysHasNode: false
|
alwaysHasNode: false,
|
||||||
|
wrapInitWithTryCatch: true
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ module.exports = require('./webpack.config.base')({
|
|||||||
target: 'renderer',
|
target: 'renderer',
|
||||||
alwaysHasNode: true,
|
alwaysHasNode: true,
|
||||||
targetDeletesNodeGlobals: true,
|
targetDeletesNodeGlobals: true,
|
||||||
wrapInitWithProfilingTimeout: true
|
wrapInitWithProfilingTimeout: true,
|
||||||
|
wrapInitWithTryCatch: true
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
module.exports = require('./webpack.config.base')({
|
module.exports = require('./webpack.config.base')({
|
||||||
target: 'sandboxed_renderer',
|
target: 'sandboxed_renderer',
|
||||||
alwaysHasNode: false,
|
alwaysHasNode: false,
|
||||||
wrapInitWithProfilingTimeout: true
|
wrapInitWithProfilingTimeout: true,
|
||||||
|
wrapInitWithTryCatch: true
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,5 +2,6 @@ module.exports = require('./webpack.config.base')({
|
|||||||
target: 'worker',
|
target: 'worker',
|
||||||
loadElectronFromAlternateTarget: 'renderer',
|
loadElectronFromAlternateTarget: 'renderer',
|
||||||
alwaysHasNode: true,
|
alwaysHasNode: true,
|
||||||
targetDeletesNodeGlobals: true
|
targetDeletesNodeGlobals: true,
|
||||||
|
wrapInitWithTryCatch: true
|
||||||
});
|
});
|
||||||
|
|||||||
21
build/zip.py
21
build/zip.py
@@ -13,27 +13,30 @@ EXTENSIONS_TO_SKIP = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
PATHS_TO_SKIP = [
|
PATHS_TO_SKIP = [
|
||||||
'angledata', #Skipping because it is an output of //ui/gl that we don't need
|
# Skip because it is an output of //ui/gl that we don't need.
|
||||||
'./libVkICD_mock_', #Skipping because these are outputs that we don't need
|
'angledata',
|
||||||
'./VkICD_mock_', #Skipping because these are outputs that we don't need
|
# Skip because these are outputs that we don't need.
|
||||||
|
'./libVkICD_mock_',
|
||||||
# Skipping because its an output of create_bundle from //build/config/mac/rules.gni
|
# Skip because these are outputs that we don't need.
|
||||||
|
'./VkICD_mock_',
|
||||||
|
# Skip because its an output of create_bundle from //build/config/mac/rules.gni
|
||||||
# that we don't need
|
# that we don't need
|
||||||
'Electron.dSYM',
|
'Electron.dSYM',
|
||||||
|
# Refs https://chromium-review.googlesource.com/c/angle/angle/+/2425197.
|
||||||
|
# Remove this when Angle themselves remove the file: https://issuetracker.google.com/issues/168736059
|
||||||
|
'gen/angle/angle_commit.h',
|
||||||
# //chrome/browser:resources depends on this via
|
# //chrome/browser:resources depends on this via
|
||||||
# //chrome/browser/resources/ssl/ssl_error_assistant, but we don't need to
|
# //chrome/browser/resources/ssl/ssl_error_assistant, but we don't need to
|
||||||
# ship it.
|
# ship it.
|
||||||
'pyproto',
|
'pyproto',
|
||||||
|
|
||||||
# On Windows, this binary doesn't exist (the crashpad handler is built-in).
|
# On Windows, this binary doesn't exist (the crashpad handler is built-in).
|
||||||
# On MacOS, the binary is called 'chrome_crashpad_handler' and is inside the
|
# On MacOS, the binary is called 'chrome_crashpad_handler' and is inside the
|
||||||
# app bundle.
|
# app bundle.
|
||||||
# On Linux, we don't use crashpad, but this binary is still built for some
|
# On Linux, we don't use crashpad, but this binary is still built for some
|
||||||
# reason. Exclude it from the zip.
|
# reason. Exclude it from the zip.
|
||||||
'./crashpad_handler',
|
'./crashpad_handler',
|
||||||
|
# Skip because these are outputs that we don't need.
|
||||||
'resources/inspector', #Skipping because these are outputs that we don't need
|
'resources/inspector',
|
||||||
]
|
]
|
||||||
|
|
||||||
def skip_path(dep, dist_zip, target_cpu):
|
def skip_path(dep, dist_zip, target_cpu):
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ buildflag_header("buildflags") {
|
|||||||
"ENABLE_ELECTRON_EXTENSIONS=$enable_electron_extensions",
|
"ENABLE_ELECTRON_EXTENSIONS=$enable_electron_extensions",
|
||||||
"ENABLE_BUILTIN_SPELLCHECKER=$enable_builtin_spellchecker",
|
"ENABLE_BUILTIN_SPELLCHECKER=$enable_builtin_spellchecker",
|
||||||
"ENABLE_PICTURE_IN_PICTURE=$enable_picture_in_picture",
|
"ENABLE_PICTURE_IN_PICTURE=$enable_picture_in_picture",
|
||||||
|
"ENABLE_WIN_DARK_MODE_WINDOW_UI=$enable_win_dark_mode_window_ui",
|
||||||
"OVERRIDE_LOCATION_PROVIDER=$enable_fake_location_provider",
|
"OVERRIDE_LOCATION_PROVIDER=$enable_fake_location_provider",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,4 +36,7 @@ declare_args() {
|
|||||||
|
|
||||||
# Enable Spellchecker support
|
# Enable Spellchecker support
|
||||||
enable_builtin_spellchecker = true
|
enable_builtin_spellchecker = true
|
||||||
|
|
||||||
|
# Undocumented Windows dark mode API
|
||||||
|
enable_win_dark_mode_window_ui = false
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,18 +26,10 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/devtools/devtools_file_system_indexer.h",
|
"//chrome/browser/devtools/devtools_file_system_indexer.h",
|
||||||
"//chrome/browser/extensions/global_shortcut_listener.cc",
|
"//chrome/browser/extensions/global_shortcut_listener.cc",
|
||||||
"//chrome/browser/extensions/global_shortcut_listener.h",
|
"//chrome/browser/extensions/global_shortcut_listener.h",
|
||||||
"//chrome/browser/extensions/global_shortcut_listener_mac.h",
|
|
||||||
"//chrome/browser/extensions/global_shortcut_listener_mac.mm",
|
|
||||||
"//chrome/browser/extensions/global_shortcut_listener_win.cc",
|
|
||||||
"//chrome/browser/extensions/global_shortcut_listener_win.h",
|
|
||||||
"//chrome/browser/icon_loader.cc",
|
"//chrome/browser/icon_loader.cc",
|
||||||
"//chrome/browser/icon_loader.h",
|
"//chrome/browser/icon_loader.h",
|
||||||
"//chrome/browser/icon_loader_mac.mm",
|
|
||||||
"//chrome/browser/icon_loader_win.cc",
|
|
||||||
"//chrome/browser/icon_manager.cc",
|
"//chrome/browser/icon_manager.cc",
|
||||||
"//chrome/browser/icon_manager.h",
|
"//chrome/browser/icon_manager.h",
|
||||||
"//chrome/browser/media/webrtc/system_media_capture_permissions_mac.h",
|
|
||||||
"//chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm",
|
|
||||||
"//chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc",
|
"//chrome/browser/net/chrome_mojo_proxy_resolver_factory.cc",
|
||||||
"//chrome/browser/net/chrome_mojo_proxy_resolver_factory.h",
|
"//chrome/browser/net/chrome_mojo_proxy_resolver_factory.h",
|
||||||
"//chrome/browser/net/proxy_config_monitor.cc",
|
"//chrome/browser/net/proxy_config_monitor.cc",
|
||||||
@@ -57,14 +49,32 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/ssl/tls_deprecation_config.cc",
|
"//chrome/browser/ssl/tls_deprecation_config.cc",
|
||||||
"//chrome/browser/ui/views/autofill/autofill_popup_view_utils.cc",
|
"//chrome/browser/ui/views/autofill/autofill_popup_view_utils.cc",
|
||||||
"//chrome/browser/ui/views/autofill/autofill_popup_view_utils.h",
|
"//chrome/browser/ui/views/autofill/autofill_popup_view_utils.h",
|
||||||
"//chrome/browser/win/chrome_process_finder.cc",
|
|
||||||
"//chrome/browser/win/chrome_process_finder.h",
|
|
||||||
"//chrome/child/v8_crashpad_support_win.cc",
|
|
||||||
"//chrome/child/v8_crashpad_support_win.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",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if (is_mac) {
|
||||||
|
sources += [
|
||||||
|
"//chrome/browser/extensions/global_shortcut_listener_mac.h",
|
||||||
|
"//chrome/browser/extensions/global_shortcut_listener_mac.mm",
|
||||||
|
"//chrome/browser/icon_loader_mac.mm",
|
||||||
|
"//chrome/browser/media/webrtc/system_media_capture_permissions_mac.h",
|
||||||
|
"//chrome/browser/media/webrtc/system_media_capture_permissions_mac.mm",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_win) {
|
||||||
|
sources += [
|
||||||
|
"//chrome/browser/extensions/global_shortcut_listener_win.cc",
|
||||||
|
"//chrome/browser/extensions/global_shortcut_listener_win.h",
|
||||||
|
"//chrome/browser/icon_loader_win.cc",
|
||||||
|
"//chrome/browser/win/chrome_process_finder.cc",
|
||||||
|
"//chrome/browser/win/chrome_process_finder.h",
|
||||||
|
"//chrome/child/v8_crashpad_support_win.cc",
|
||||||
|
"//chrome/child/v8_crashpad_support_win.h",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
public_deps = [
|
public_deps = [
|
||||||
"//chrome/common",
|
"//chrome/common",
|
||||||
"//chrome/common:version_header",
|
"//chrome/common:version_header",
|
||||||
@@ -124,10 +134,17 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/platform_util.h",
|
"//chrome/browser/platform_util.h",
|
||||||
"//chrome/browser/ui/browser_dialogs.h",
|
"//chrome/browser/ui/browser_dialogs.h",
|
||||||
"//chrome/browser/ui/color_chooser.h",
|
"//chrome/browser/ui/color_chooser.h",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper.cc",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper.h",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper_view.cc",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper_view.h",
|
||||||
]
|
]
|
||||||
|
|
||||||
if (use_aura) {
|
if (use_aura) {
|
||||||
sources += [ "//chrome/browser/platform_util_aura.cc" ]
|
sources += [
|
||||||
|
"//chrome/browser/platform_util_aura.cc",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper_view_aura.cc",
|
||||||
|
]
|
||||||
|
|
||||||
if (!is_win) {
|
if (!is_win) {
|
||||||
sources += [
|
sources += [
|
||||||
@@ -144,6 +161,8 @@ static_library("chrome") {
|
|||||||
"//chrome/browser/media/webrtc/window_icon_util_mac.mm",
|
"//chrome/browser/media/webrtc/window_icon_util_mac.mm",
|
||||||
"//chrome/browser/ui/cocoa/color_chooser_mac.h",
|
"//chrome/browser/ui/cocoa/color_chooser_mac.h",
|
||||||
"//chrome/browser/ui/cocoa/color_chooser_mac.mm",
|
"//chrome/browser/ui/cocoa/color_chooser_mac.mm",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper_view_mac.h",
|
||||||
|
"//chrome/browser/ui/views/eye_dropper/eye_dropper_view_mac.mm",
|
||||||
]
|
]
|
||||||
deps += [
|
deps += [
|
||||||
"//components/remote_cocoa/app_shim",
|
"//components/remote_cocoa/app_shim",
|
||||||
@@ -266,6 +285,17 @@ static_library("chrome") {
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!is_mas_build) {
|
||||||
|
sources += [ "//chrome/browser/hang_monitor/hang_crash_dump.h" ]
|
||||||
|
if (is_mac) {
|
||||||
|
sources += [ "//chrome/browser/hang_monitor/hang_crash_dump_mac.cc" ]
|
||||||
|
} else if (is_win) {
|
||||||
|
sources += [ "//chrome/browser/hang_monitor/hang_crash_dump_win.cc" ]
|
||||||
|
} else {
|
||||||
|
sources += [ "//chrome/browser/hang_monitor/hang_crash_dump.cc" ]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
source_set("plugins") {
|
source_set("plugins") {
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ net::NSSCertDatabase* GetNSSCertDatabaseForResourceContext(
|
|||||||
// Linux has only a single persistent slot compared to ChromeOS's separate
|
// Linux has only a single persistent slot compared to ChromeOS's separate
|
||||||
// public and private slot.
|
// public and private slot.
|
||||||
// Redirect any slot usage to this persistent slot on Linux.
|
// Redirect any slot usage to this persistent slot on Linux.
|
||||||
|
crypto::EnsureNSSInit();
|
||||||
g_nss_cert_database = new net::NSSCertDatabase(
|
g_nss_cert_database = new net::NSSCertDatabase(
|
||||||
crypto::ScopedPK11Slot(PK11_GetInternalKeySlot()) /* public slot */,
|
crypto::ScopedPK11Slot(PK11_GetInternalKeySlot()) /* public slot */,
|
||||||
crypto::ScopedPK11Slot(PK11_GetInternalKeySlot()) /* private slot */);
|
crypto::ScopedPK11Slot(PK11_GetInternalKeySlot()) /* private slot */);
|
||||||
|
|||||||
@@ -826,10 +826,9 @@ ProcessSingleton::NotifyResult ProcessSingleton::NotifyOtherProcessWithTimeout(
|
|||||||
to_send.append(current_dir.value());
|
to_send.append(current_dir.value());
|
||||||
|
|
||||||
const std::vector<std::string>& argv = electron::ElectronCommandLine::argv();
|
const std::vector<std::string>& argv = electron::ElectronCommandLine::argv();
|
||||||
for (std::vector<std::string>::const_iterator it = argv.begin();
|
for (const auto& arg : argv) {
|
||||||
it != argv.end(); ++it) {
|
|
||||||
to_send.push_back(kTokenDelimiter);
|
to_send.push_back(kTokenDelimiter);
|
||||||
to_send.append(*it);
|
to_send.append(arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send the message
|
// Send the message
|
||||||
|
|||||||
@@ -122,8 +122,7 @@ void GlobalMenuBarRegistrarX11::OnNameOwnerChanged(GObject* /* ignored */,
|
|||||||
GParamSpec* /* ignored */) {
|
GParamSpec* /* ignored */) {
|
||||||
// If the name owner changed, we need to reregister all the live x11::Window
|
// If the name owner changed, we need to reregister all the live x11::Window
|
||||||
// with the system.
|
// with the system.
|
||||||
for (std::set<x11::Window>::const_iterator it = live_windows_.begin();
|
for (const auto& window : live_windows_) {
|
||||||
it != live_windows_.end(); ++it) {
|
RegisterXWindow(window);
|
||||||
RegisterXWindow(*it);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -148,6 +148,7 @@ These individual tutorials expand on topics discussed in the guide above.
|
|||||||
|
|
||||||
### Modules for the Renderer Process (Web Page):
|
### Modules for the Renderer Process (Web Page):
|
||||||
|
|
||||||
|
* [contextBridge](api/context-bridge.md)
|
||||||
* [desktopCapturer](api/desktop-capturer.md)
|
* [desktopCapturer](api/desktop-capturer.md)
|
||||||
* [ipcRenderer](api/ipc-renderer.md)
|
* [ipcRenderer](api/ipc-renderer.md)
|
||||||
* [remote](api/remote.md)
|
* [remote](api/remote.md)
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ In most cases, you should do everything in the `ready` event handler.
|
|||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
* `launchInfo` unknown _macOS_
|
* `event` Event
|
||||||
|
* `launchInfo` Record<string, any> _macOS_
|
||||||
|
|
||||||
Emitted once, when Electron has finished initializing. On macOS, `launchInfo`
|
Emitted once, when Electron has finished initializing. On macOS, `launchInfo`
|
||||||
holds the `userInfo` of the `NSUserNotification` that was used to open the
|
holds the `userInfo` of the `NSUserNotification` that was used to open the
|
||||||
@@ -402,7 +403,7 @@ Returns:
|
|||||||
* `killed` - Process was sent a SIGTERM or otherwise killed externally
|
* `killed` - Process was sent a SIGTERM or otherwise killed externally
|
||||||
* `crashed` - Process crashed
|
* `crashed` - Process crashed
|
||||||
* `oom` - Process ran out of memory
|
* `oom` - Process ran out of memory
|
||||||
* `launch-failure` - Process never successfully launched
|
* `launch-failed` - Process never successfully launched
|
||||||
* `integrity-failure` - Windows code integrity checks failed
|
* `integrity-failure` - Windows code integrity checks failed
|
||||||
|
|
||||||
Emitted when the renderer process unexpectedly disappears. This is normally
|
Emitted when the renderer process unexpectedly disappears. This is normally
|
||||||
@@ -428,7 +429,7 @@ Returns:
|
|||||||
* `killed` - Process was sent a SIGTERM or otherwise killed externally
|
* `killed` - Process was sent a SIGTERM or otherwise killed externally
|
||||||
* `crashed` - Process crashed
|
* `crashed` - Process crashed
|
||||||
* `oom` - Process ran out of memory
|
* `oom` - Process ran out of memory
|
||||||
* `launch-failure` - Process never successfully launched
|
* `launch-failed` - Process never successfully launched
|
||||||
* `integrity-failure` - Windows code integrity checks failed
|
* `integrity-failure` - Windows code integrity checks failed
|
||||||
* `exitCode` Number - The exit code for the process
|
* `exitCode` Number - The exit code for the process
|
||||||
(e.g. status from waitpid if on posix, from GetExitCodeProcess on Windows).
|
(e.g. status from waitpid if on posix, from GetExitCodeProcess on Windows).
|
||||||
@@ -501,7 +502,7 @@ Returns:
|
|||||||
Emitted when `desktopCapturer.getSources()` is called in the renderer process of `webContents`.
|
Emitted when `desktopCapturer.getSources()` is called in the renderer process of `webContents`.
|
||||||
Calling `event.preventDefault()` will make it return empty sources.
|
Calling `event.preventDefault()` will make it return empty sources.
|
||||||
|
|
||||||
### Event: 'remote-require'
|
### Event: 'remote-require' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -513,7 +514,7 @@ Emitted when `remote.require()` is called in the renderer process of `webContent
|
|||||||
Calling `event.preventDefault()` will prevent the module from being returned.
|
Calling `event.preventDefault()` will prevent the module from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
### Event: 'remote-get-global'
|
### Event: 'remote-get-global' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -525,7 +526,7 @@ Emitted when `remote.getGlobal()` is called in the renderer process of `webConte
|
|||||||
Calling `event.preventDefault()` will prevent the global from being returned.
|
Calling `event.preventDefault()` will prevent the global from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
### Event: 'remote-get-builtin'
|
### Event: 'remote-get-builtin' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -537,7 +538,7 @@ Emitted when `remote.getBuiltin()` is called in the renderer process of `webCont
|
|||||||
Calling `event.preventDefault()` will prevent the module from being returned.
|
Calling `event.preventDefault()` will prevent the module from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
### Event: 'remote-get-current-window'
|
### Event: 'remote-get-current-window' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -548,7 +549,7 @@ Emitted when `remote.getCurrentWindow()` is called in the renderer process of `w
|
|||||||
Calling `event.preventDefault()` will prevent the object from being returned.
|
Calling `event.preventDefault()` will prevent the object from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
### Event: 'remote-get-current-web-contents'
|
### Event: 'remote-get-current-web-contents' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -1340,7 +1341,7 @@ systems Application folder. Use in combination with `app.moveToApplicationsFolde
|
|||||||
### `app.moveToApplicationsFolder([options])` _macOS_
|
### `app.moveToApplicationsFolder([options])` _macOS_
|
||||||
|
|
||||||
* `options` Object (optional)
|
* `options` Object (optional)
|
||||||
* `conflictHandler` Function<Boolean> (optional) - A handler for potential conflict in move failure.
|
* `conflictHandler` Function\<Boolean> (optional) - A handler for potential conflict in move failure.
|
||||||
* `conflictType` String - The type of move conflict encountered by the handler; can be `exists` or `existsAndRunning`, where `exists` means that an app of the same name is present in the Applications directory and `existsAndRunning` means both that it exists and that it's presently running.
|
* `conflictType` String - The type of move conflict encountered by the handler; can be `exists` or `existsAndRunning`, where `exists` means that an app of the same name is present in the Applications directory and `existsAndRunning` means both that it exists and that it's presently running.
|
||||||
|
|
||||||
Returns `Boolean` - Whether the move was successful. Please note that if
|
Returns `Boolean` - Whether the move was successful. Please note that if
|
||||||
@@ -1484,3 +1485,12 @@ which native modules you can use in the renderer process. For more information
|
|||||||
on the direction Electron is going with renderer process restarts and usage of
|
on the direction Electron is going with renderer process restarts and usage of
|
||||||
native modules in the renderer process please check out this
|
native modules in the renderer process please check out this
|
||||||
[Tracking Issue](https://github.com/electron/electron/issues/18397).
|
[Tracking Issue](https://github.com/electron/electron/issues/18397).
|
||||||
|
|
||||||
|
### `app.runningUnderRosettaTranslation` _macOS_ _Readonly_
|
||||||
|
|
||||||
|
A `Boolean` which when `true` indicates that the app is currently running
|
||||||
|
under the [Rosetta Translator Environment](https://en.wikipedia.org/wiki/Rosetta_(software)).
|
||||||
|
|
||||||
|
You can use this property to prompt users to download the arm64 version of
|
||||||
|
your application when they are running the x64 version under Rosetta
|
||||||
|
incorrectly.
|
||||||
|
|||||||
@@ -8,9 +8,6 @@ Process: [Main](../glossary.md#main-process)
|
|||||||
// In the main process.
|
// In the main process.
|
||||||
const { BrowserWindow } = require('electron')
|
const { BrowserWindow } = require('electron')
|
||||||
|
|
||||||
// Or use `remote` from the renderer process.
|
|
||||||
// const { BrowserWindow } = require('electron').remote
|
|
||||||
|
|
||||||
const win = new BrowserWindow({ width: 800, height: 600 })
|
const win = new BrowserWindow({ width: 800, height: 600 })
|
||||||
|
|
||||||
// Load a remote URL
|
// Load a remote URL
|
||||||
@@ -541,6 +538,12 @@ Note that this is only emitted when the window is being resized manually. Resizi
|
|||||||
|
|
||||||
Emitted after the window has been resized.
|
Emitted after the window has been resized.
|
||||||
|
|
||||||
|
#### Event: 'resized' _macOS_ _Windows_
|
||||||
|
|
||||||
|
Emitted once when the window has finished being resized.
|
||||||
|
|
||||||
|
This is usually emitted when the window has been resized manually. On macOS, resizing the window with `setBounds`/`setSize` and setting the `animate` parameter to `true` will also emit this event once resizing has finished.
|
||||||
|
|
||||||
#### Event: 'will-move' _macOS_ _Windows_
|
#### Event: 'will-move' _macOS_ _Windows_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
@@ -556,12 +559,12 @@ Note that this is only emitted when the window is being resized manually. Resizi
|
|||||||
|
|
||||||
Emitted when the window is being moved to a new position.
|
Emitted when the window is being moved to a new position.
|
||||||
|
|
||||||
__Note__: On macOS this event is an alias of `moved`.
|
#### Event: 'moved' _macOS_ _Windows_
|
||||||
|
|
||||||
#### Event: 'moved' _macOS_
|
|
||||||
|
|
||||||
Emitted once when the window is moved to a new position.
|
Emitted once when the window is moved to a new position.
|
||||||
|
|
||||||
|
__Note__: On macOS this event is an alias of `move`.
|
||||||
|
|
||||||
#### Event: 'enter-full-screen'
|
#### Event: 'enter-full-screen'
|
||||||
|
|
||||||
Emitted when the window enters a full-screen state.
|
Emitted when the window enters a full-screen state.
|
||||||
@@ -670,6 +673,20 @@ 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_
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
|
||||||
|
* `event` Event
|
||||||
|
* `point` [Point](structures/point.md) - The screen coordinates the context menu was triggered at
|
||||||
|
|
||||||
|
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
|
||||||
|
of your window. This is the window titlebar or any area you have declared
|
||||||
|
as `-webkit-app-region: drag` in a frameless window.
|
||||||
|
|
||||||
|
Calling `event.preventDefault()` will prevent the menu from being displayed.
|
||||||
|
|
||||||
### Static Methods
|
### Static Methods
|
||||||
|
|
||||||
The `BrowserWindow` class has the following static methods:
|
The `BrowserWindow` class has the following static methods:
|
||||||
@@ -713,7 +730,7 @@ The method will also not return if the extension's manifest is missing or incomp
|
|||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
**Note:** This method is deprecated. Instead, use
|
**Note:** This method is deprecated. Instead, use
|
||||||
[`ses.loadExtension(path)`](session.md#sesloadextensionpath).
|
[`ses.loadExtension(path)`](session.md#sesloadextensionpath-options).
|
||||||
|
|
||||||
#### `BrowserWindow.removeExtension(name)` _Deprecated_
|
#### `BrowserWindow.removeExtension(name)` _Deprecated_
|
||||||
|
|
||||||
@@ -755,7 +772,7 @@ The method will also not return if the extension's manifest is missing or incomp
|
|||||||
is emitted.
|
is emitted.
|
||||||
|
|
||||||
**Note:** This method is deprecated. Instead, use
|
**Note:** This method is deprecated. Instead, use
|
||||||
[`ses.loadExtension(path)`](session.md#sesloadextensionpath).
|
[`ses.loadExtension(path)`](session.md#sesloadextensionpath-options).
|
||||||
|
|
||||||
#### `BrowserWindow.removeDevToolsExtension(name)` _Deprecated_
|
#### `BrowserWindow.removeDevToolsExtension(name)` _Deprecated_
|
||||||
|
|
||||||
@@ -1029,7 +1046,7 @@ Returns `Boolean` - Whether the window is in simple (pre-Lion) fullscreen mode.
|
|||||||
|
|
||||||
Returns `Boolean` - Whether the window is in normal state (not maximized, not minimized, not in fullscreen mode).
|
Returns `Boolean` - Whether the window is in normal state (not maximized, not minimized, not in fullscreen mode).
|
||||||
|
|
||||||
#### `win.setAspectRatio(aspectRatio[, extraSize])` _macOS_ _Linux_
|
#### `win.setAspectRatio(aspectRatio[, extraSize])`
|
||||||
|
|
||||||
* `aspectRatio` Float - The aspect ratio to maintain for some portion of the
|
* `aspectRatio` Float - The aspect ratio to maintain for some portion of the
|
||||||
content view.
|
content view.
|
||||||
@@ -1050,6 +1067,9 @@ the player itself we would call this function with arguments of 16/9 and
|
|||||||
are within the content view--only that they exist. Sum any extra width and
|
are within the content view--only that they exist. Sum any extra width and
|
||||||
height areas you have within the overall content view.
|
height areas you have within the overall content view.
|
||||||
|
|
||||||
|
The aspect ratio is not respected when window is resized programmingly with
|
||||||
|
APIs like `win.setSize`.
|
||||||
|
|
||||||
#### `win.setBackgroundColor(backgroundColor)`
|
#### `win.setBackgroundColor(backgroundColor)`
|
||||||
|
|
||||||
* `backgroundColor` String - Window's background color as a hexadecimal value,
|
* `backgroundColor` String - Window's background color as a hexadecimal value,
|
||||||
@@ -1829,6 +1849,13 @@ Replacement API for setBrowserView supporting work with multi browser views.
|
|||||||
|
|
||||||
* `browserView` [BrowserView](browser-view.md)
|
* `browserView` [BrowserView](browser-view.md)
|
||||||
|
|
||||||
|
#### `win.setTopBrowserView(browserView)` _Experimental_
|
||||||
|
|
||||||
|
* `browserView` [BrowserView](browser-view.md)
|
||||||
|
|
||||||
|
Raises `browserView` above other `BrowserView`s attached to `win`.
|
||||||
|
Throws an error if `browserView` is not attached to `win`.
|
||||||
|
|
||||||
#### `win.getBrowserViews()` _Experimental_
|
#### `win.getBrowserViews()` _Experimental_
|
||||||
|
|
||||||
Returns `BrowserView[]` - an array of all BrowserViews that have been attached
|
Returns `BrowserView[]` - an array of all BrowserViews that have been attached
|
||||||
|
|||||||
@@ -198,6 +198,14 @@ logging level for all code in the source files under a `foo/bar` directory.
|
|||||||
|
|
||||||
This switch only works when `--enable-logging` is also passed.
|
This switch only works when `--enable-logging` is also passed.
|
||||||
|
|
||||||
|
### --force_high_performance_gpu
|
||||||
|
|
||||||
|
Force using discrete GPU when there are multiple GPUs available.
|
||||||
|
|
||||||
|
### --force_low_power_gpu
|
||||||
|
|
||||||
|
Force using integrated GPU when there are multiple GPUs available.
|
||||||
|
|
||||||
## Node.js Flags
|
## Node.js Flags
|
||||||
|
|
||||||
Electron supports some of the [CLI flags][node-cli] supported by Node.js.
|
Electron supports some of the [CLI flags][node-cli] supported by Node.js.
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const { app, contentTracing } = require('electron')
|
|||||||
app.whenReady().then(() => {
|
app.whenReady().then(() => {
|
||||||
(async () => {
|
(async () => {
|
||||||
await contentTracing.startRecording({
|
await contentTracing.startRecording({
|
||||||
include_categories: ['*']
|
included_categories: ['*']
|
||||||
})
|
})
|
||||||
console.log('Tracing started')
|
console.log('Tracing started')
|
||||||
await new Promise(resolve => setTimeout(resolve, 5000))
|
await new Promise(resolve => setTimeout(resolve, 5000))
|
||||||
|
|||||||
@@ -72,50 +72,6 @@ const constraints = {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
This example shows how to capture a video from a [WebContents](web-contents.md)
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// In the renderer process.
|
|
||||||
const { desktopCapturer, remote } = require('electron')
|
|
||||||
|
|
||||||
desktopCapturer.getMediaSourceIdForWebContents(remote.getCurrentWebContents().id).then(async mediaSourceId => {
|
|
||||||
try {
|
|
||||||
const stream = await navigator.mediaDevices.getUserMedia({
|
|
||||||
audio: {
|
|
||||||
mandatory: {
|
|
||||||
chromeMediaSource: 'tab',
|
|
||||||
chromeMediaSourceId: mediaSourceId
|
|
||||||
}
|
|
||||||
},
|
|
||||||
video: {
|
|
||||||
mandatory: {
|
|
||||||
chromeMediaSource: 'tab',
|
|
||||||
chromeMediaSourceId: mediaSourceId,
|
|
||||||
minWidth: 1280,
|
|
||||||
maxWidth: 1280,
|
|
||||||
minHeight: 720,
|
|
||||||
maxHeight: 720
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
handleStream(stream)
|
|
||||||
} catch (e) {
|
|
||||||
handleError(e)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
function handleStream (stream) {
|
|
||||||
const video = document.querySelector('video')
|
|
||||||
video.srcObject = stream
|
|
||||||
video.onloadedmetadata = (e) => video.play()
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleError (e) {
|
|
||||||
console.log(e)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
|
|
||||||
The `desktopCapturer` module has the following methods:
|
The `desktopCapturer` module has the following methods:
|
||||||
@@ -138,15 +94,6 @@ Returns `Promise<DesktopCapturerSource[]>` - Resolves with an array of [`Desktop
|
|||||||
**Note** Capturing the screen contents requires user consent on macOS 10.15 Catalina or higher,
|
**Note** Capturing the screen contents requires user consent on macOS 10.15 Catalina or higher,
|
||||||
which can detected by [`systemPreferences.getMediaAccessStatus`].
|
which can detected by [`systemPreferences.getMediaAccessStatus`].
|
||||||
|
|
||||||
### `desktopCapturer.getMediaSourceIdForWebContents(webContentsId)`
|
|
||||||
|
|
||||||
* `webContentsId` number - Id of the WebContents to get stream of
|
|
||||||
|
|
||||||
Returns `Promise<string>` - Resolves with the identifier of a WebContents stream, this identifier can be
|
|
||||||
used with [`navigator.mediaDevices.getUserMedia`].
|
|
||||||
The identifier is **only valid for 10 seconds**.
|
|
||||||
The identifier may be empty if not requested from a renderer process.
|
|
||||||
|
|
||||||
[`navigator.mediaDevices.getUserMedia`]: https://developer.mozilla.org/en/docs/Web/API/MediaDevices/getUserMedia
|
[`navigator.mediaDevices.getUserMedia`]: https://developer.mozilla.org/en/docs/Web/API/MediaDevices/getUserMedia
|
||||||
[`systemPreferences.getMediaAccessStatus`]: system-preferences.md#systempreferencesgetmediaaccessstatusmediatype-macos
|
[`systemPreferences.getMediaAccessStatus`]: system-preferences.md#systempreferencesgetmediaaccessstatusmediatype-macos
|
||||||
|
|
||||||
|
|||||||
@@ -11,14 +11,6 @@ const { dialog } = require('electron')
|
|||||||
console.log(dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }))
|
console.log(dialog.showOpenDialog({ properties: ['openFile', 'multiSelections'] }))
|
||||||
```
|
```
|
||||||
|
|
||||||
The Dialog is opened from Electron's main thread. If you want to use the dialog
|
|
||||||
object from a renderer process, remember to access it using the remote:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const { dialog } = require('electron').remote
|
|
||||||
console.log(dialog)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
|
|
||||||
The `dialog` module has the following methods:
|
The `dialog` module has the following methods:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ extension capabilities.
|
|||||||
|
|
||||||
Electron only supports loading unpacked extensions (i.e., `.crx` files do not
|
Electron only supports loading unpacked extensions (i.e., `.crx` files do not
|
||||||
work). Extensions are installed per-`session`. To load an extension, call
|
work). Extensions are installed per-`session`. To load an extension, call
|
||||||
[`ses.loadExtension`](session.md#sesloadextensionpath):
|
[`ses.loadExtension`](session.md#sesloadextensionpath-options):
|
||||||
|
|
||||||
```js
|
```js
|
||||||
const { session } = require('electron')
|
const { session } = require('electron')
|
||||||
@@ -102,3 +102,21 @@ The following methods of `chrome.tabs` are supported:
|
|||||||
> **Note:** In Chrome, passing `-1` as a tab ID signifies the "currently active
|
> **Note:** In Chrome, passing `-1` as a tab ID signifies the "currently active
|
||||||
> tab". Since Electron has no such concept, passing `-1` as a tab ID is not
|
> tab". Since Electron has no such concept, passing `-1` as a tab ID is not
|
||||||
> supported and will raise an error.
|
> supported and will raise an error.
|
||||||
|
|
||||||
|
### `chrome.management`
|
||||||
|
|
||||||
|
The following methods of `chrome.management` are supported:
|
||||||
|
|
||||||
|
- `chrome.management.getAll`
|
||||||
|
- `chrome.management.get`
|
||||||
|
- `chrome.management.getSelf`
|
||||||
|
- `chrome.management.getPermissionWarningsById`
|
||||||
|
- `chrome.management.getPermissionWarningsByManifest`
|
||||||
|
- `chrome.management.onEnabled`
|
||||||
|
- `chrome.management.onDisabled`
|
||||||
|
|
||||||
|
### `chrome.webRequest`
|
||||||
|
|
||||||
|
All features of this API are supported.
|
||||||
|
|
||||||
|
> **NOTE:** Electron's [`webRequest`](web-request.md) module takes precedence over `chrome.webRequest` if there are conflicting handlers.
|
||||||
|
|||||||
@@ -112,13 +112,19 @@ optional parameter can be used to forward mouse move messages to the web page,
|
|||||||
allowing events such as `mouseleave` to be emitted:
|
allowing events such as `mouseleave` to be emitted:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const win = require('electron').remote.getCurrentWindow()
|
const { ipcRenderer } = require('electron')
|
||||||
const el = document.getElementById('clickThroughElement')
|
const el = document.getElementById('clickThroughElement')
|
||||||
el.addEventListener('mouseenter', () => {
|
el.addEventListener('mouseenter', () => {
|
||||||
win.setIgnoreMouseEvents(true, { forward: true })
|
ipcRenderer.send('set-ignore-mouse-events', true, { forward: true })
|
||||||
})
|
})
|
||||||
el.addEventListener('mouseleave', () => {
|
el.addEventListener('mouseleave', () => {
|
||||||
win.setIgnoreMouseEvents(false)
|
ipcRenderer.send('set-ignore-mouse-events', false)
|
||||||
|
})
|
||||||
|
|
||||||
|
// Main process
|
||||||
|
const { ipcMain } = require('electron')
|
||||||
|
ipcMain.on('set-ignore-mouse-events', (event, ...args) => {
|
||||||
|
BrowserWindow.fromWebContents(event.sender).setIgnoreMouseEvents(...args)
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ with the operating system so that you can customize the operations for various
|
|||||||
shortcuts.
|
shortcuts.
|
||||||
|
|
||||||
**Note:** The shortcut is global; it will work even if the app does
|
**Note:** The shortcut is global; it will work even if the app does
|
||||||
not have the keyboard focus. You should not use this module until 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.
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ Removes listeners of the specified `channel`.
|
|||||||
### `ipcMain.handle(channel, listener)`
|
### `ipcMain.handle(channel, listener)`
|
||||||
|
|
||||||
* `channel` String
|
* `channel` String
|
||||||
* `listener` Function<Promise<void> | any>
|
* `listener` Function<Promise\<void> | any>
|
||||||
* `event` IpcMainInvokeEvent
|
* `event` IpcMainInvokeEvent
|
||||||
* `...args` any[]
|
* `...args` any[]
|
||||||
|
|
||||||
@@ -123,7 +123,7 @@ WebContents is the source of the invoke request.
|
|||||||
### `ipcMain.handleOnce(channel, listener)`
|
### `ipcMain.handleOnce(channel, listener)`
|
||||||
|
|
||||||
* `channel` String
|
* `channel` String
|
||||||
* `listener` Function<Promise<void> | any>
|
* `listener` Function<Promise\<void> | any>
|
||||||
* `event` IpcMainInvokeEvent
|
* `event` IpcMainInvokeEvent
|
||||||
* `...args` any[]
|
* `...args` any[]
|
||||||
|
|
||||||
|
|||||||
@@ -61,9 +61,13 @@ Algorithm][SCA], just like [`window.postMessage`][], so prototype chains will no
|
|||||||
included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
||||||
throw an exception.
|
throw an exception.
|
||||||
|
|
||||||
> **NOTE**: Sending non-standard JavaScript types such as DOM objects or
|
> **NOTE:** Sending non-standard JavaScript types such as DOM objects or
|
||||||
> special Electron objects is deprecated, and will begin throwing an exception
|
> special Electron objects will throw an exception.
|
||||||
> starting with Electron 9.
|
>
|
||||||
|
> Since the main process does not have support for DOM objects such as
|
||||||
|
> `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over
|
||||||
|
> Electron's IPC to the main process, as the main process would have no way to decode
|
||||||
|
> them. Attempting to send such objects over IPC will result in an error.
|
||||||
|
|
||||||
The main process handles it by listening for `channel` with the
|
The main process handles it by listening for `channel` with the
|
||||||
[`ipcMain`](ipc-main.md) module.
|
[`ipcMain`](ipc-main.md) module.
|
||||||
@@ -85,9 +89,13 @@ Algorithm][SCA], just like [`window.postMessage`][], so prototype chains will no
|
|||||||
included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
||||||
throw an exception.
|
throw an exception.
|
||||||
|
|
||||||
> **NOTE**: Sending non-standard JavaScript types such as DOM objects or
|
> **NOTE:** Sending non-standard JavaScript types such as DOM objects or
|
||||||
> special Electron objects is deprecated, and will begin throwing an exception
|
> special Electron objects will throw an exception.
|
||||||
> starting with Electron 9.
|
>
|
||||||
|
> Since the main process does not have support for DOM objects such as
|
||||||
|
> `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over
|
||||||
|
> Electron's IPC to the main process, as the main process would have no way to decode
|
||||||
|
> them. Attempting to send such objects over IPC will result in an error.
|
||||||
|
|
||||||
The main process should listen for `channel` with
|
The main process should listen for `channel` with
|
||||||
[`ipcMain.handle()`](ipc-main.md#ipcmainhandlechannel-listener).
|
[`ipcMain.handle()`](ipc-main.md#ipcmainhandlechannel-listener).
|
||||||
@@ -123,9 +131,13 @@ Algorithm][SCA], just like [`window.postMessage`][], so prototype chains will no
|
|||||||
included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
||||||
throw an exception.
|
throw an exception.
|
||||||
|
|
||||||
> **NOTE**: Sending non-standard JavaScript types such as DOM objects or
|
> **NOTE:** Sending non-standard JavaScript types such as DOM objects or
|
||||||
> special Electron objects is deprecated, and will begin throwing an exception
|
> special Electron objects will throw an exception.
|
||||||
> starting with Electron 9.
|
>
|
||||||
|
> Since the main process does not have support for DOM objects such as
|
||||||
|
> `ImageBitmap`, `File`, `DOMMatrix` and so on, such objects cannot be sent over
|
||||||
|
> Electron's IPC to the main process, as the main process would have no way to decode
|
||||||
|
> them. Attempting to send such objects over IPC will result in an error.
|
||||||
|
|
||||||
The main process handles it by listening for `channel` with [`ipcMain`](ipc-main.md) module,
|
The main process handles it by listening for `channel` with [`ipcMain`](ipc-main.md) module,
|
||||||
and replies by setting `event.returnValue`.
|
and replies by setting `event.returnValue`.
|
||||||
|
|||||||
@@ -22,8 +22,10 @@ Sets `menu` as the application menu on macOS. On Windows and Linux, the
|
|||||||
Also on Windows and Linux, you can use a `&` in the top-level item name to
|
Also on Windows and Linux, you can use a `&` in the top-level item name to
|
||||||
indicate which letter should get a generated accelerator. For example, using
|
indicate which letter should get a generated accelerator. For example, using
|
||||||
`&File` for the file menu would result in a generated `Alt-F` accelerator that
|
`&File` for the file menu would result in a generated `Alt-F` accelerator that
|
||||||
opens the associated menu. The indicated character in the button label gets an
|
opens the associated menu. The indicated character in the button label then gets an
|
||||||
underline. The `&` character is not displayed on the button label.
|
underline, and the `&` character is not displayed on the button label.
|
||||||
|
|
||||||
|
In order to escape the `&` character in an item name, add a proceeding `&`. For example, `&&File` would result in `&File` displayed on the button label.
|
||||||
|
|
||||||
Passing `null` will suppress the default menu. On Windows and Linux,
|
Passing `null` will suppress the default menu. On Windows and Linux,
|
||||||
this has the additional effect of removing the menu bar from the window.
|
this has the additional effect of removing the menu bar from the window.
|
||||||
@@ -141,13 +143,7 @@ can have a submenu.
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
The `Menu` class is only available in the main process, but you can also use it
|
An example of creating the application menu with the simple template API:
|
||||||
in the render process via the [`remote`](remote.md) module.
|
|
||||||
|
|
||||||
### Main process
|
|
||||||
|
|
||||||
An example of creating the application menu in the main process with the
|
|
||||||
simple template API:
|
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
const { app, Menu } = require('electron')
|
const { app, Menu } = require('electron')
|
||||||
@@ -257,26 +253,36 @@ Menu.setApplicationMenu(menu)
|
|||||||
|
|
||||||
### Render process
|
### Render process
|
||||||
|
|
||||||
Below is an example of creating a menu dynamically in a web page
|
To create menus initiated by the renderer process, send the required
|
||||||
(render process) by using the [`remote`](remote.md) module, and showing it when
|
information to the main process using IPC and have the main process display the
|
||||||
the user right clicks the page:
|
menu on behalf of the renderer.
|
||||||
|
|
||||||
```html
|
Below is an example of showing a menu when the user right clicks the page:
|
||||||
<!-- index.html -->
|
|
||||||
<script>
|
|
||||||
const { remote } = require('electron')
|
|
||||||
const { Menu, MenuItem } = remote
|
|
||||||
|
|
||||||
const menu = new Menu()
|
|
||||||
menu.append(new MenuItem({ label: 'MenuItem1', click() { console.log('item 1 clicked') } }))
|
|
||||||
menu.append(new MenuItem({ type: 'separator' }))
|
|
||||||
menu.append(new MenuItem({ label: 'MenuItem2', type: 'checkbox', checked: true }))
|
|
||||||
|
|
||||||
|
```js
|
||||||
|
// renderer
|
||||||
window.addEventListener('contextmenu', (e) => {
|
window.addEventListener('contextmenu', (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
menu.popup({ window: remote.getCurrentWindow() })
|
ipcRenderer.send('show-context-menu')
|
||||||
}, false)
|
})
|
||||||
</script>
|
|
||||||
|
ipcRenderer.on('context-menu-command', (e, command) => {
|
||||||
|
// ...
|
||||||
|
})
|
||||||
|
|
||||||
|
// main
|
||||||
|
ipcMain.on('show-context-menu', (event) => {
|
||||||
|
const template = [
|
||||||
|
{
|
||||||
|
label: 'Menu Item 1',
|
||||||
|
click: () => { event.sender.send('context-menu-command', 'menu-item-1') }
|
||||||
|
},
|
||||||
|
{ type: 'separator' },
|
||||||
|
{ label: 'Menu Item 2', type: 'checkbox', checked: true }
|
||||||
|
]
|
||||||
|
const menu = Menu.buildFromTemplate(template)
|
||||||
|
menu.popup(BrowserWindow.fromWebContents(event.sender))
|
||||||
|
})
|
||||||
```
|
```
|
||||||
|
|
||||||
## Notes on macOS Application Menu
|
## Notes on macOS Application Menu
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ Process: [Main](../glossary.md#main-process)
|
|||||||
|
|
||||||
The `powerMonitor` module emits the following events:
|
The `powerMonitor` module emits the following events:
|
||||||
|
|
||||||
### Event: 'suspend'
|
### Event: 'suspend' _macOS_ _Windows_
|
||||||
|
|
||||||
Emitted when the system is suspending.
|
Emitted when the system is suspending.
|
||||||
|
|
||||||
### Event: 'resume'
|
### Event: 'resume' _macOS_ _Windows_
|
||||||
|
|
||||||
Emitted when system is resuming.
|
Emitted when system is resuming.
|
||||||
|
|
||||||
### Event: 'on-ac' _Windows_
|
### Event: 'on-ac' _macOS_ _Windows_
|
||||||
|
|
||||||
Emitted when the system changes to AC power.
|
Emitted when the system changes to AC power.
|
||||||
|
|
||||||
### Event: 'on-battery' _Windows_
|
### Event: 'on-battery' _macOS_ _Windows_
|
||||||
|
|
||||||
Emitted when system changes to battery power.
|
Emitted when system changes to battery power.
|
||||||
|
|
||||||
|
|||||||
@@ -88,26 +88,17 @@ and preload.js:
|
|||||||
|
|
||||||
```js
|
```js
|
||||||
// This file is loaded whenever a javascript context is created. It runs in a
|
// This file is loaded whenever a javascript context is created. It runs in a
|
||||||
// private scope that can access a subset of Electron renderer APIs. We must be
|
// private scope that can access a subset of Electron renderer APIs. Without
|
||||||
// careful to not leak any objects into the global scope!
|
// contextIsolation enabled, it's possible to accidentally leak privileged
|
||||||
const { ipcRenderer, remote } = require('electron')
|
// globals like ipcRenderer to web content.
|
||||||
const fs = remote.require('fs')
|
const { ipcRenderer } = require('electron')
|
||||||
|
|
||||||
// read a configuration file using the `fs` module
|
|
||||||
const buf = fs.readFileSync('allowed-popup-urls.json')
|
|
||||||
const allowedUrls = JSON.parse(buf.toString('utf8'))
|
|
||||||
|
|
||||||
const defaultWindowOpen = window.open
|
const defaultWindowOpen = window.open
|
||||||
|
|
||||||
function customWindowOpen (url, ...args) {
|
window.open = function customWindowOpen (url, ...args) {
|
||||||
if (allowedUrls.indexOf(url) === -1) {
|
ipcRenderer.send('report-window-open', location.origin, url, args)
|
||||||
ipcRenderer.sendSync('blocked-popup-notification', location.origin, url)
|
return defaultWindowOpen(url + '?from_electron=1', ...args)
|
||||||
return null
|
|
||||||
}
|
|
||||||
return defaultWindowOpen(url, ...args)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
window.open = customWindowOpen
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Important things to notice in the preload script:
|
Important things to notice in the preload script:
|
||||||
@@ -115,8 +106,6 @@ Important things to notice in the preload script:
|
|||||||
- Even though the sandboxed renderer doesn't have Node.js running, it still has
|
- Even though the sandboxed renderer doesn't have Node.js running, it still has
|
||||||
access to a limited node-like environment: `Buffer`, `process`, `setImmediate`,
|
access to a limited node-like environment: `Buffer`, `process`, `setImmediate`,
|
||||||
`clearImmediate` and `require` are available.
|
`clearImmediate` and `require` are available.
|
||||||
- The preload script can indirectly access all APIs from the main process through the
|
|
||||||
`remote` and `ipcRenderer` modules.
|
|
||||||
- The preload script must be contained in a single script, but it is possible to have
|
- The preload script must be contained in a single script, but it is possible to have
|
||||||
complex preload code composed with multiple modules by using a tool like
|
complex preload code composed with multiple modules by using a tool like
|
||||||
webpack or browserify. An example of using browserify is below.
|
webpack or browserify. An example of using browserify is below.
|
||||||
@@ -144,15 +133,12 @@ following modules:
|
|||||||
- `desktopCapturer`
|
- `desktopCapturer`
|
||||||
- `ipcRenderer`
|
- `ipcRenderer`
|
||||||
- `nativeImage`
|
- `nativeImage`
|
||||||
- `remote`
|
|
||||||
- `webFrame`
|
- `webFrame`
|
||||||
- `events`
|
- `events`
|
||||||
- `timers`
|
- `timers`
|
||||||
- `url`
|
- `url`
|
||||||
|
|
||||||
More may be added as needed to expose more Electron APIs in the sandbox, but any
|
More may be added as needed to expose more Electron APIs in the sandbox.
|
||||||
module in the main process can already be used through
|
|
||||||
`electron.remote.require`.
|
|
||||||
|
|
||||||
## Rendering untrusted content
|
## Rendering untrusted content
|
||||||
|
|
||||||
|
|||||||
@@ -349,6 +349,7 @@ win.webContents.session.setCertificateVerifyProc((request, callback) => {
|
|||||||
* `handler` Function | null
|
* `handler` Function | null
|
||||||
* `webContents` [WebContents](web-contents.md) - WebContents requesting the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin.
|
* `webContents` [WebContents](web-contents.md) - WebContents requesting the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin.
|
||||||
* `permission` String - The type of requested permission.
|
* `permission` String - The type of requested permission.
|
||||||
|
* `clipboard-read` - Request access to read from the clipboard.
|
||||||
* `media` - Request access to media devices such as camera, microphone and speakers.
|
* `media` - Request access to media devices such as camera, microphone and speakers.
|
||||||
* `mediaKeySystem` - Request access to DRM protected content.
|
* `mediaKeySystem` - Request access to DRM protected content.
|
||||||
* `geolocation` - Request access to user's current location.
|
* `geolocation` - Request access to user's current location.
|
||||||
@@ -384,7 +385,7 @@ session.fromPartition('some-partition').setPermissionRequestHandler((webContents
|
|||||||
|
|
||||||
#### `ses.setPermissionCheckHandler(handler)`
|
#### `ses.setPermissionCheckHandler(handler)`
|
||||||
|
|
||||||
* `handler` Function<Boolean> | null
|
* `handler` Function\<Boolean> | null
|
||||||
* `webContents` [WebContents](web-contents.md) - WebContents checking the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin.
|
* `webContents` [WebContents](web-contents.md) - WebContents checking the permission. Please note that if the request comes from a subframe you should use `requestingUrl` to check the request origin.
|
||||||
* `permission` String - Enum of 'media'.
|
* `permission` String - Enum of 'media'.
|
||||||
* `requestingOrigin` String - The origin URL of the permission check
|
* `requestingOrigin` String - The origin URL of the permission check
|
||||||
@@ -567,9 +568,13 @@ will not work on non-persistent (in-memory) sessions.
|
|||||||
|
|
||||||
**Note:** On macOS and Windows 10 this word will be removed from the OS custom dictionary as well
|
**Note:** On macOS and Windows 10 this word will be removed from the OS custom dictionary as well
|
||||||
|
|
||||||
#### `ses.loadExtension(path)`
|
#### `ses.loadExtension(path[, options])`
|
||||||
|
|
||||||
* `path` String - Path to a directory containing an unpacked Chrome extension
|
* `path` String - Path to a directory containing an unpacked Chrome extension
|
||||||
|
* `options` Object (optional)
|
||||||
|
* `allowFileAccess` Boolean - Whether to allow the extension to read local files over `file://`
|
||||||
|
protocol and inject content scripts into `file://` pages. This is required e.g. for loading
|
||||||
|
devtools extensions on `file://` URLs. Defaults to false.
|
||||||
|
|
||||||
Returns `Promise<Extension>` - resolves when the extension is loaded.
|
Returns `Promise<Extension>` - resolves when the extension is loaded.
|
||||||
|
|
||||||
@@ -592,7 +597,11 @@ const { app, session } = require('electron')
|
|||||||
const path = require('path')
|
const path = require('path')
|
||||||
|
|
||||||
app.on('ready', async () => {
|
app.on('ready', async () => {
|
||||||
await session.defaultSession.loadExtension(path.join(__dirname, 'react-devtools'))
|
await session.defaultSession.loadExtension(
|
||||||
|
path.join(__dirname, 'react-devtools'),
|
||||||
|
// allowFileAccess is required to load the devtools extension on file:// URLs.
|
||||||
|
{ allowFileAccess: true }
|
||||||
|
)
|
||||||
// Note that in order to use the React DevTools extension, you'll need to
|
// Note that in order to use the React DevTools extension, you'll need to
|
||||||
// download and unzip a copy of the extension.
|
// download and unzip a copy of the extension.
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
# IpcMainEvent Object extends `Event`
|
# IpcMainEvent Object extends `Event`
|
||||||
|
|
||||||
|
* `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
|
||||||
* `sender` WebContents - Returns the `webContents` that sent the message
|
* `sender` WebContents - Returns the `webContents` that sent the message
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
# IpcMainInvokeEvent Object extends `Event`
|
# IpcMainInvokeEvent Object extends `Event`
|
||||||
|
|
||||||
|
* `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 - Returns the `webContents` that sent the message
|
* `sender` WebContents - Returns the `webContents` that sent the message
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
# StreamProtocolResponse Object
|
|
||||||
|
|
||||||
* `statusCode` Number (optional) - The HTTP response code.
|
|
||||||
* `headers` Record<String, String | String[]> (optional) - An object containing the response headers.
|
|
||||||
* `data` ReadableStream | null - A Node.js readable stream representing the response body.
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# StringProtocolResponse Object
|
|
||||||
|
|
||||||
* `mimeType` String (optional) - MIME type of the response.
|
|
||||||
* `charset` String (optional) - Charset of the response.
|
|
||||||
* `data` String | null - A string representing the response body.
|
|
||||||
@@ -9,7 +9,7 @@ the [native modules](../tutorial/using-native-node-modules.md)).
|
|||||||
Electron also provides some extra built-in modules for developing native
|
Electron also provides some extra built-in modules for developing native
|
||||||
desktop applications. Some modules are only available in the main process, some
|
desktop applications. Some modules are only available in the main process, some
|
||||||
are only available in the renderer process (web page), and some can be used in
|
are only available in the renderer process (web page), and some can be used in
|
||||||
both processes.
|
either process type.
|
||||||
|
|
||||||
The basic rule is: if a module is [GUI][gui] or low-level system related, then
|
The basic rule is: if a module is [GUI][gui] or low-level system related, then
|
||||||
it should be only available in the main process. You need to be familiar with
|
it should be only available in the main process. You need to be familiar with
|
||||||
@@ -29,15 +29,15 @@ app.whenReady().then(() => {
|
|||||||
```
|
```
|
||||||
|
|
||||||
The renderer process is no different than a normal web page, except for the
|
The renderer process is no different than a normal web page, except for the
|
||||||
extra ability to use node modules:
|
extra ability to use node modules if `nodeIntegration` is enabled:
|
||||||
|
|
||||||
```html
|
```html
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
<html>
|
<html>
|
||||||
<body>
|
<body>
|
||||||
<script>
|
<script>
|
||||||
const { app } = require('electron').remote
|
const fs = require('fs')
|
||||||
console.log(app.getVersion())
|
console.log(fs.readFileSync(__filename, 'utf8'))
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -42,7 +42,8 @@ returns `null`.
|
|||||||
|
|
||||||
* `id` Integer
|
* `id` Integer
|
||||||
|
|
||||||
Returns `WebContents` - A WebContents instance with the given ID.
|
Returns `WebContents` | undefined - A WebContents instance with the given ID, or
|
||||||
|
`undefined` if there is no WebContents associated with the given ID.
|
||||||
|
|
||||||
## Class: WebContents
|
## Class: WebContents
|
||||||
|
|
||||||
@@ -364,7 +365,7 @@ Returns:
|
|||||||
* `killed` - Process was sent a SIGTERM or otherwise killed externally
|
* `killed` - Process was sent a SIGTERM or otherwise killed externally
|
||||||
* `crashed` - Process crashed
|
* `crashed` - Process crashed
|
||||||
* `oom` - Process ran out of memory
|
* `oom` - Process ran out of memory
|
||||||
* `launch-failure` - Process never successfully launched
|
* `launch-failed` - Process never successfully launched
|
||||||
* `integrity-failure` - Windows code integrity checks failed
|
* `integrity-failure` - Windows code integrity checks failed
|
||||||
|
|
||||||
Emitted when the renderer process unexpectedly disappears. This is normally
|
Emitted when the renderer process unexpectedly disappears. This is normally
|
||||||
@@ -784,7 +785,7 @@ Returns:
|
|||||||
Emitted when `desktopCapturer.getSources()` is called in the renderer process.
|
Emitted when `desktopCapturer.getSources()` is called in the renderer process.
|
||||||
Calling `event.preventDefault()` will make it return empty sources.
|
Calling `event.preventDefault()` will make it return empty sources.
|
||||||
|
|
||||||
#### Event: 'remote-require'
|
#### Event: 'remote-require' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -795,7 +796,7 @@ Emitted when `remote.require()` is called in the renderer process.
|
|||||||
Calling `event.preventDefault()` will prevent the module from being returned.
|
Calling `event.preventDefault()` will prevent the module from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
#### Event: 'remote-get-global'
|
#### Event: 'remote-get-global' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -806,7 +807,7 @@ Emitted when `remote.getGlobal()` is called in the renderer process.
|
|||||||
Calling `event.preventDefault()` will prevent the global from being returned.
|
Calling `event.preventDefault()` will prevent the global from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
#### Event: 'remote-get-builtin'
|
#### Event: 'remote-get-builtin' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -817,7 +818,7 @@ Emitted when `remote.getBuiltin()` is called in the renderer process.
|
|||||||
Calling `event.preventDefault()` will prevent the module from being returned.
|
Calling `event.preventDefault()` will prevent the module from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
#### Event: 'remote-get-current-window'
|
#### Event: 'remote-get-current-window' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -827,7 +828,7 @@ Emitted when `remote.getCurrentWindow()` is called in the renderer process.
|
|||||||
Calling `event.preventDefault()` will prevent the object from being returned.
|
Calling `event.preventDefault()` will prevent the object from being returned.
|
||||||
Custom value can be returned by setting `event.returnValue`.
|
Custom value can be returned by setting `event.returnValue`.
|
||||||
|
|
||||||
#### Event: 'remote-get-current-web-contents'
|
#### Event: 'remote-get-current-web-contents' _Deprecated_
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
|
|
||||||
@@ -998,6 +999,34 @@ Navigates to the specified offset from the "current entry".
|
|||||||
|
|
||||||
Returns `Boolean` - Whether the renderer process has crashed.
|
Returns `Boolean` - Whether the renderer process has crashed.
|
||||||
|
|
||||||
|
#### `contents.forcefullyCrashRenderer()`
|
||||||
|
|
||||||
|
Forcefully terminates the renderer process that is currently hosting this
|
||||||
|
`webContents`. This will cause the `render-process-gone` event to be emitted
|
||||||
|
with the `reason=killed || reason=crashed`. Please note that some webContents share renderer
|
||||||
|
processes and therefore calling this method may also crash the host process
|
||||||
|
for other webContents as well.
|
||||||
|
|
||||||
|
Calling `reload()` immediately after calling this
|
||||||
|
method will force the reload to occur in a new process. This should be used
|
||||||
|
when this process is unstable or unusable, for instance in order to recover
|
||||||
|
from the `unresponsive` event.
|
||||||
|
|
||||||
|
```js
|
||||||
|
contents.on('unresponsive', async () => {
|
||||||
|
const { response } = await dialog.showMessageBox({
|
||||||
|
message: 'App X has become unresponsive',
|
||||||
|
title: 'Do you want to try forcefully reloading the app?',
|
||||||
|
buttons: ['OK', 'Cancel'],
|
||||||
|
cancelId: 1
|
||||||
|
})
|
||||||
|
if (response === 0) {
|
||||||
|
contents.forcefullyCrashRenderer()
|
||||||
|
contents.reload()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
#### `contents.setUserAgent(userAgent)`
|
#### `contents.setUserAgent(userAgent)`
|
||||||
|
|
||||||
* `userAgent` String
|
* `userAgent` String
|
||||||
@@ -1296,9 +1325,9 @@ Returns [`PrinterInfo[]`](structures/printer-info.md)
|
|||||||
* `pagesPerSheet` Number (optional) - The number of pages to print per page sheet.
|
* `pagesPerSheet` Number (optional) - The number of pages to print per page sheet.
|
||||||
* `collate` Boolean (optional) - Whether the web page should be collated.
|
* `collate` Boolean (optional) - Whether the web page should be collated.
|
||||||
* `copies` Number (optional) - The number of copies of the web page to print.
|
* `copies` Number (optional) - The number of copies of the web page to print.
|
||||||
* `pageRanges` Record<string, number> (optional) - The page range to print.
|
* `pageRanges` Object[] (optional) - The page range to print. On macOS, only one range is honored.
|
||||||
* `from` Number - the start page.
|
* `from` Number - Index of the first page to print (0-based).
|
||||||
* `to` Number - the end page.
|
* `to` Number - Index of the last page to print (inclusive) (0-based).
|
||||||
* `duplexMode` String (optional) - Set the duplex mode of the printed web page. Can be `simplex`, `shortEdge`, or `longEdge`.
|
* `duplexMode` String (optional) - Set the duplex mode of the printed web page. Can be `simplex`, `shortEdge`, or `longEdge`.
|
||||||
* `dpi` Record<string, number> (optional)
|
* `dpi` Record<string, number> (optional)
|
||||||
* `horizontal` Number (optional) - The horizontal dpi.
|
* `horizontal` Number (optional) - The horizontal dpi.
|
||||||
@@ -1324,10 +1353,10 @@ Example usage:
|
|||||||
const options = {
|
const options = {
|
||||||
silent: true,
|
silent: true,
|
||||||
deviceName: 'My-Printer',
|
deviceName: 'My-Printer',
|
||||||
pageRanges: {
|
pageRanges: [{
|
||||||
from: 0,
|
from: 0,
|
||||||
to: 1
|
to: 1
|
||||||
}
|
}]
|
||||||
}
|
}
|
||||||
win.webContents.print(options, (success, errorType) => {
|
win.webContents.print(options, (success, errorType) => {
|
||||||
if (!success) console.log(errorType)
|
if (!success) console.log(errorType)
|
||||||
@@ -1345,8 +1374,8 @@ win.webContents.print(options, (success, errorType) => {
|
|||||||
default margin, 1 for no margin, and 2 for minimum margin.
|
default margin, 1 for no margin, and 2 for minimum margin.
|
||||||
* `scaleFactor` Number (optional) - The scale factor of the web page. Can range from 0 to 100.
|
* `scaleFactor` Number (optional) - The scale factor of the web page. Can range from 0 to 100.
|
||||||
* `pageRanges` Record<string, number> (optional) - The page range to print.
|
* `pageRanges` Record<string, number> (optional) - The page range to print.
|
||||||
* `from` Number - zero-based index of the first page to print.
|
* `from` Number - Index of the first page to print (0-based).
|
||||||
* `to` Number - zero-based index of the last page to print (inclusive).
|
* `to` Number - Index of the last page to print (inclusive) (0-based).
|
||||||
* `pageSize` String | Size (optional) - Specify page size of the generated PDF. Can be `A3`,
|
* `pageSize` String | Size (optional) - Specify page size of the generated PDF. Can be `A3`,
|
||||||
`A4`, `A5`, `Legal`, `Letter`, `Tabloid` or an Object containing `height` and `width` in microns.
|
`A4`, `A5`, `Legal`, `Letter`, `Tabloid` or an Object containing `height` and `width` in microns.
|
||||||
* `printBackground` Boolean (optional) - Whether to print CSS backgrounds.
|
* `printBackground` Boolean (optional) - Whether to print CSS backgrounds.
|
||||||
@@ -1453,7 +1482,7 @@ An example of showing devtools in a `<webview>` tag:
|
|||||||
<webview id="browser" src="https://github.com"></webview>
|
<webview id="browser" src="https://github.com"></webview>
|
||||||
<webview id="devtools" src="about:blank"></webview>
|
<webview id="devtools" src="about:blank"></webview>
|
||||||
<script>
|
<script>
|
||||||
const { webContents } = require('electron').remote
|
const { ipcRenderer } = require('electron')
|
||||||
const emittedOnce = (element, eventName) => new Promise(resolve => {
|
const emittedOnce = (element, eventName) => new Promise(resolve => {
|
||||||
element.addEventListener(eventName, event => resolve(event), { once: true })
|
element.addEventListener(eventName, event => resolve(event), { once: true })
|
||||||
})
|
})
|
||||||
@@ -1462,16 +1491,26 @@ An example of showing devtools in a `<webview>` tag:
|
|||||||
const browserReady = emittedOnce(browserView, 'dom-ready')
|
const browserReady = emittedOnce(browserView, 'dom-ready')
|
||||||
const devtoolsReady = emittedOnce(devtoolsView, 'dom-ready')
|
const devtoolsReady = emittedOnce(devtoolsView, 'dom-ready')
|
||||||
Promise.all([browserReady, devtoolsReady]).then(() => {
|
Promise.all([browserReady, devtoolsReady]).then(() => {
|
||||||
const browser = webContents.fromId(browserView.getWebContentsId())
|
const targetId = browserView.getWebContentsId()
|
||||||
const devtools = webContents.fromId(devtoolsView.getWebContentsId())
|
const devtoolsId = devtoolsView.getWebContentsId()
|
||||||
browser.setDevToolsWebContents(devtools)
|
ipcRenderer.send('open-devtools', targetId, devtoolsId)
|
||||||
browser.openDevTools()
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Main process
|
||||||
|
const { ipcMain, webContents } = require('electron')
|
||||||
|
ipcMain.on('open-devtools', (event, targetContentsId, devtoolsContentsId) => {
|
||||||
|
const target = webContents.fromId(targetContentsId)
|
||||||
|
const devtools = webContents.fromId(devtoolsContentsId)
|
||||||
|
target.setDevToolsWebContents(devtools)
|
||||||
|
target.openDevTools()
|
||||||
|
})
|
||||||
|
```
|
||||||
|
|
||||||
An example of showing devtools in a `BrowserWindow`:
|
An example of showing devtools in a `BrowserWindow`:
|
||||||
|
|
||||||
```js
|
```js
|
||||||
@@ -1556,8 +1595,7 @@ included. Sending Functions, Promises, Symbols, WeakMaps, or WeakSets will
|
|||||||
throw an exception.
|
throw an exception.
|
||||||
|
|
||||||
> **NOTE**: Sending non-standard JavaScript types such as DOM objects or
|
> **NOTE**: Sending non-standard JavaScript types such as DOM objects or
|
||||||
> special Electron objects is deprecated, and will begin throwing an exception
|
> special Electron objects will throw an exception.
|
||||||
> starting with Electron 9.
|
|
||||||
|
|
||||||
The renderer process can handle the message by listening to `channel` with the
|
The renderer process can handle the message by listening to `channel` with the
|
||||||
[`ipcRenderer`](ipc-renderer.md) module.
|
[`ipcRenderer`](ipc-renderer.md) module.
|
||||||
@@ -1593,7 +1631,9 @@ app.whenReady().then(() => {
|
|||||||
|
|
||||||
#### `contents.sendToFrame(frameId, channel, ...args)`
|
#### `contents.sendToFrame(frameId, channel, ...args)`
|
||||||
|
|
||||||
* `frameId` Integer
|
* `frameId` Integer | [number, number] - the ID of the frame to send to, or a
|
||||||
|
pair of `[processId, frameId]` if the frame is in a different process to the
|
||||||
|
main frame.
|
||||||
* `channel` String
|
* `channel` String
|
||||||
* `...args` any[]
|
* `...args` any[]
|
||||||
|
|
||||||
@@ -1603,9 +1643,8 @@ Send an asynchronous message to a specific frame in a renderer process via
|
|||||||
chains will not be included. Sending Functions, Promises, Symbols, WeakMaps, or
|
chains will not be included. Sending Functions, Promises, Symbols, WeakMaps, or
|
||||||
WeakSets will throw an exception.
|
WeakSets will throw an exception.
|
||||||
|
|
||||||
> **NOTE**: Sending non-standard JavaScript types such as DOM objects or
|
> **NOTE:** Sending non-standard JavaScript types such as DOM objects or
|
||||||
> special Electron objects is deprecated, and will begin throwing an exception
|
> special Electron objects will throw an exception.
|
||||||
> starting with Electron 9.
|
|
||||||
|
|
||||||
The renderer process can handle the message by listening to `channel` with the
|
The renderer process can handle the message by listening to `channel` with the
|
||||||
[`ipcRenderer`](ipc-renderer.md) module.
|
[`ipcRenderer`](ipc-renderer.md) module.
|
||||||
@@ -1767,7 +1806,7 @@ Returns `Boolean` - If *offscreen rendering* is enabled returns whether it is cu
|
|||||||
* `fps` Integer
|
* `fps` Integer
|
||||||
|
|
||||||
If *offscreen rendering* is enabled sets the frame rate to the specified number.
|
If *offscreen rendering* is enabled sets the frame rate to the specified number.
|
||||||
Only values between 1 and 60 are accepted.
|
Only values between 1 and 240 are accepted.
|
||||||
|
|
||||||
#### `contents.getFrameRate()`
|
#### `contents.getFrameRate()`
|
||||||
|
|
||||||
@@ -1865,7 +1904,7 @@ The zoom factor is the zoom percent divided by 100, so 300% = 3.0.
|
|||||||
#### `contents.frameRate`
|
#### `contents.frameRate`
|
||||||
|
|
||||||
An `Integer` property that sets the frame rate of the web contents to the specified number.
|
An `Integer` property that sets the frame rate of the web contents to the specified number.
|
||||||
Only values between 1 and 60 are accepted.
|
Only values between 1 and 240 are accepted.
|
||||||
|
|
||||||
Only applicable if *offscreen rendering* is enabled.
|
Only applicable if *offscreen rendering* is enabled.
|
||||||
|
|
||||||
|
|||||||
@@ -137,7 +137,7 @@ This option is disabled by default in the guest page.
|
|||||||
```
|
```
|
||||||
|
|
||||||
A `Boolean`. When this attribute is `false` the guest page in `webview` will not have access
|
A `Boolean`. When this attribute is `false` the guest page in `webview` will not have access
|
||||||
to the [`remote`](remote.md) module. The remote module is available by default.
|
to the [`remote`](remote.md) module. The remote module is unavailable by default.
|
||||||
|
|
||||||
### `plugins`
|
### `plugins`
|
||||||
|
|
||||||
@@ -560,9 +560,9 @@ Stops any `findInPage` request for the `webview` with the provided `action`.
|
|||||||
* `pagesPerSheet` Number (optional) - The number of pages to print per page sheet.
|
* `pagesPerSheet` Number (optional) - The number of pages to print per page sheet.
|
||||||
* `collate` Boolean (optional) - Whether the web page should be collated.
|
* `collate` Boolean (optional) - Whether the web page should be collated.
|
||||||
* `copies` Number (optional) - The number of copies of the web page to print.
|
* `copies` Number (optional) - The number of copies of the web page to print.
|
||||||
* `pageRanges` Record<string, number> (optional) - The page range to print.
|
* `pageRanges` Object[] (optional) - The page range to print.
|
||||||
* `from` Number - zero-based index of the first page to print.
|
* `from` Number - Index of the first page to print (0-based).
|
||||||
* `to` Number - zero-based index of the last page to print (inclusive).
|
* `to` Number - Index of the last page to print (inclusive) (0-based).
|
||||||
* `duplexMode` String (optional) - Set the duplex mode of the printed web page. Can be `simplex`, `shortEdge`, or `longEdge`.
|
* `duplexMode` String (optional) - Set the duplex mode of the printed web page. Can be `simplex`, `shortEdge`, or `longEdge`.
|
||||||
* `dpi` Record<string, number> (optional)
|
* `dpi` Record<string, number> (optional)
|
||||||
* `horizontal` Number (optional) - The horizontal dpi.
|
* `horizontal` Number (optional) - The horizontal dpi.
|
||||||
@@ -588,8 +588,8 @@ Prints `webview`'s web page. Same as `webContents.print([options])`.
|
|||||||
and `width` in microns.
|
and `width` in microns.
|
||||||
* `scaleFactor` Number (optional) - The scale factor of the web page. Can range from 0 to 100.
|
* `scaleFactor` Number (optional) - The scale factor of the web page. Can range from 0 to 100.
|
||||||
* `pageRanges` Record<string, number> (optional) - The page range to print.
|
* `pageRanges` Record<string, number> (optional) - The page range to print.
|
||||||
* `from` Number - the first page to print.
|
* `from` Number - Index of the first page to print (0-based).
|
||||||
* `to` Number - the last page to print (inclusive).
|
* `to` Number - Index of the last page to print (inclusive) (0-based).
|
||||||
* `pageSize` String | Size (optional) - Specify page size of the generated PDF. Can be `A3`,
|
* `pageSize` String | Size (optional) - Specify page size of the generated PDF. Can be `A3`,
|
||||||
`A4`, `A5`, `Legal`, `Letter`, `Tabloid` or an Object containing `height`
|
`A4`, `A5`, `Legal`, `Letter`, `Tabloid` or an Object containing `height`
|
||||||
* `printBackground` Boolean (optional) - Whether to print CSS backgrounds.
|
* `printBackground` Boolean (optional) - Whether to print CSS backgrounds.
|
||||||
@@ -968,4 +968,4 @@ Emitted when DevTools is closed.
|
|||||||
Emitted when DevTools is focused / opened.
|
Emitted when DevTools is focused / opened.
|
||||||
|
|
||||||
[runtime-enabled-features]: https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/runtime_enabled_features.json5?l=70
|
[runtime-enabled-features]: https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/runtime_enabled_features.json5?l=70
|
||||||
[chrome-webview]: https://developer.chrome.com/apps/tags/webview
|
[chrome-webview]: https://developer.chrome.com/docs/extensions/reference/webviewTag/
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
# Breaking changes (NetworkService) (Draft)
|
|
||||||
|
|
||||||
This document describes changes to Electron APIs after migrating network code
|
|
||||||
to NetworkService API.
|
|
||||||
|
|
||||||
We don't currently have an estimate of when we will enable `NetworkService` by
|
|
||||||
default in Electron, but as Chromium is already removing non-`NetworkService`
|
|
||||||
code, we might switch before Electron 10.
|
|
||||||
|
|
||||||
The content of this document should be moved to `breaking-changes.md` once we have
|
|
||||||
determined when to enable `NetworkService` in Electron.
|
|
||||||
|
|
||||||
## Planned Breaking API Changes
|
|
||||||
|
|
||||||
### `protocol.unregisterProtocol`
|
|
||||||
### `protocol.uninterceptProtocol`
|
|
||||||
|
|
||||||
The APIs are now synchronous and the optional callback is no longer needed.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// Deprecated
|
|
||||||
protocol.unregisterProtocol(scheme, () => { /* ... */ })
|
|
||||||
// Replace with
|
|
||||||
protocol.unregisterProtocol(scheme)
|
|
||||||
```
|
|
||||||
|
|
||||||
### `protocol.registerFileProtocol`
|
|
||||||
### `protocol.registerBufferProtocol`
|
|
||||||
### `protocol.registerStringProtocol`
|
|
||||||
### `protocol.registerHttpProtocol`
|
|
||||||
### `protocol.registerStreamProtocol`
|
|
||||||
### `protocol.interceptFileProtocol`
|
|
||||||
### `protocol.interceptStringProtocol`
|
|
||||||
### `protocol.interceptBufferProtocol`
|
|
||||||
### `protocol.interceptHttpProtocol`
|
|
||||||
### `protocol.interceptStreamProtocol`
|
|
||||||
|
|
||||||
The APIs are now synchronous and the optional callback is no longer needed.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// Deprecated
|
|
||||||
protocol.registerFileProtocol(scheme, handler, () => { /* ... */ })
|
|
||||||
// Replace with
|
|
||||||
protocol.registerFileProtocol(scheme, handler)
|
|
||||||
```
|
|
||||||
|
|
||||||
The registered or intercepted protocol does not have effect on current page
|
|
||||||
until navigation happens.
|
|
||||||
|
|
||||||
### `protocol.isProtocolHandled`
|
|
||||||
|
|
||||||
This API is deprecated and users should use `protocol.isProtocolRegistered`
|
|
||||||
and `protocol.isProtocolIntercepted` instead.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// Deprecated
|
|
||||||
protocol.isProtocolHandled(scheme).then(() => { /* ... */ })
|
|
||||||
// Replace with
|
|
||||||
const isRegistered = protocol.isProtocolRegistered(scheme)
|
|
||||||
const isIntercepted = protocol.isProtocolIntercepted(scheme)
|
|
||||||
```
|
|
||||||
@@ -133,6 +133,54 @@ const w = new BrowserWindow({
|
|||||||
We [recommend moving away from the remote
|
We [recommend moving away from the remote
|
||||||
module](https://medium.com/@nornagon/electrons-remote-module-considered-harmful-70d69500f31).
|
module](https://medium.com/@nornagon/electrons-remote-module-considered-harmful-70d69500f31).
|
||||||
|
|
||||||
|
### `protocol.unregisterProtocol`
|
||||||
|
### `protocol.uninterceptProtocol`
|
||||||
|
|
||||||
|
The APIs are now synchronous and the optional callback is no longer needed.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Deprecated
|
||||||
|
protocol.unregisterProtocol(scheme, () => { /* ... */ })
|
||||||
|
// Replace with
|
||||||
|
protocol.unregisterProtocol(scheme)
|
||||||
|
```
|
||||||
|
|
||||||
|
### `protocol.registerFileProtocol`
|
||||||
|
### `protocol.registerBufferProtocol`
|
||||||
|
### `protocol.registerStringProtocol`
|
||||||
|
### `protocol.registerHttpProtocol`
|
||||||
|
### `protocol.registerStreamProtocol`
|
||||||
|
### `protocol.interceptFileProtocol`
|
||||||
|
### `protocol.interceptStringProtocol`
|
||||||
|
### `protocol.interceptBufferProtocol`
|
||||||
|
### `protocol.interceptHttpProtocol`
|
||||||
|
### `protocol.interceptStreamProtocol`
|
||||||
|
|
||||||
|
The APIs are now synchronous and the optional callback is no longer needed.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Deprecated
|
||||||
|
protocol.registerFileProtocol(scheme, handler, () => { /* ... */ })
|
||||||
|
// Replace with
|
||||||
|
protocol.registerFileProtocol(scheme, handler)
|
||||||
|
```
|
||||||
|
|
||||||
|
The registered or intercepted protocol does not have effect on current page
|
||||||
|
until navigation happens.
|
||||||
|
|
||||||
|
### `protocol.isProtocolHandled`
|
||||||
|
|
||||||
|
This API is deprecated and users should use `protocol.isProtocolRegistered`
|
||||||
|
and `protocol.isProtocolIntercepted` instead.
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
// Deprecated
|
||||||
|
protocol.isProtocolHandled(scheme).then(() => { /* ... */ })
|
||||||
|
// Replace with
|
||||||
|
const isRegistered = protocol.isProtocolRegistered(scheme)
|
||||||
|
const isIntercepted = protocol.isProtocolIntercepted(scheme)
|
||||||
|
```
|
||||||
|
|
||||||
## Planned Breaking API Changes (9.0)
|
## Planned Breaking API Changes (9.0)
|
||||||
|
|
||||||
### Default Changed: Loading non-context-aware native modules in the renderer process is disabled by default
|
### Default Changed: Loading non-context-aware native modules in the renderer process is disabled by default
|
||||||
@@ -147,6 +195,45 @@ you should plan to update your native modules to be context aware.
|
|||||||
|
|
||||||
For more detailed information see [#18397](https://github.com/electron/electron/issues/18397).
|
For more detailed information see [#18397](https://github.com/electron/electron/issues/18397).
|
||||||
|
|
||||||
|
### Deprecated: `BrowserWindow` extension APIs
|
||||||
|
|
||||||
|
The following extension APIs have been deprecated:
|
||||||
|
* `BrowserWindow.addExtension(path)`
|
||||||
|
* `BrowserWindow.addDevToolsExtension(path)`
|
||||||
|
* `BrowserWindow.removeExtension(name)`
|
||||||
|
* `BrowserWindow.removeDevToolsExtension(name)`
|
||||||
|
* `BrowserWindow.getExtensions()`
|
||||||
|
* `BrowserWindow.getDevToolsExtensions()`
|
||||||
|
|
||||||
|
Use the session APIs instead:
|
||||||
|
* `ses.loadExtension(path)`
|
||||||
|
* `ses.removeExtension(extension_id)`
|
||||||
|
* `ses.getAllExtensions()`
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated in Electron 9
|
||||||
|
BrowserWindow.addExtension(path)
|
||||||
|
BrowserWindow.addDevToolsExtension(path)
|
||||||
|
// Replace with
|
||||||
|
session.defaultSession.loadExtension(path)
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated in Electron 9
|
||||||
|
BrowserWindow.removeExtension(name)
|
||||||
|
BrowserWindow.removeDevToolsExtension(name)
|
||||||
|
// Replace with
|
||||||
|
session.defaultSession.removeExtension(extension_id)
|
||||||
|
```
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated in Electron 9
|
||||||
|
BrowserWindow.getExtensions()
|
||||||
|
BrowserWindow.getDevToolsExtensions()
|
||||||
|
// Replace with
|
||||||
|
session.defaultSession.getAllExtensions()
|
||||||
|
```
|
||||||
|
|
||||||
### Removed: `<webview>.getWebContents()`
|
### Removed: `<webview>.getWebContents()`
|
||||||
|
|
||||||
This API, which was deprecated in Electron 8.0, is now removed.
|
This API, which was deprecated in Electron 8.0, is now removed.
|
||||||
@@ -290,6 +377,52 @@ in Electron 8.x, and cease to exist in Electron 9.x. The layout zoom level
|
|||||||
limits are now fixed at a minimum of 0.25 and a maximum of 5.0, as defined
|
limits are now fixed at a minimum of 0.25 and a maximum of 5.0, as defined
|
||||||
[here](https://chromium.googlesource.com/chromium/src/+/938b37a6d2886bf8335fc7db792f1eb46c65b2ae/third_party/blink/common/page/page_zoom.cc#11).
|
[here](https://chromium.googlesource.com/chromium/src/+/938b37a6d2886bf8335fc7db792f1eb46c65b2ae/third_party/blink/common/page/page_zoom.cc#11).
|
||||||
|
|
||||||
|
### Deprecated events in `systemPreferences`
|
||||||
|
|
||||||
|
The following `systemPreferences` events have been deprecated:
|
||||||
|
* `inverted-color-scheme-changed`
|
||||||
|
* `high-contrast-color-scheme-changed`
|
||||||
|
|
||||||
|
Use the new `updated` event on the `nativeTheme` module instead.
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated
|
||||||
|
systemPreferences.on('inverted-color-scheme-changed', () => { /* ... */ })
|
||||||
|
systemPreferences.on('high-contrast-color-scheme-changed', () => { /* ... */ })
|
||||||
|
|
||||||
|
// Replace with
|
||||||
|
nativeTheme.on('updated', () => { /* ... */ })
|
||||||
|
```
|
||||||
|
|
||||||
|
### Deprecated: methods in `systemPreferences`
|
||||||
|
|
||||||
|
The following `systemPreferences` methods have been deprecated:
|
||||||
|
* `systemPreferences.isDarkMode()`
|
||||||
|
* `systemPreferences.isInvertedColorScheme()`
|
||||||
|
* `systemPreferences.isHighContrastColorScheme()`
|
||||||
|
|
||||||
|
Use the following `nativeTheme` properties instead:
|
||||||
|
* `nativeTheme.shouldUseDarkColors`
|
||||||
|
* `nativeTheme.shouldUseInvertedColorScheme`
|
||||||
|
* `nativeTheme.shouldUseHighContrastColors`
|
||||||
|
|
||||||
|
```js
|
||||||
|
// Deprecated
|
||||||
|
systemPreferences.isDarkMode()
|
||||||
|
// Replace with
|
||||||
|
nativeTheme.shouldUseDarkColors
|
||||||
|
|
||||||
|
// Deprecated
|
||||||
|
systemPreferences.isInvertedColorScheme()
|
||||||
|
// Replace with
|
||||||
|
nativeTheme.shouldUseInvertedColorScheme
|
||||||
|
|
||||||
|
// Deprecated
|
||||||
|
systemPreferences.isHighContrastColorScheme()
|
||||||
|
// Replace with
|
||||||
|
nativeTheme.shouldUseHighContrastColors
|
||||||
|
```
|
||||||
|
|
||||||
## Planned Breaking API Changes (7.0)
|
## Planned Breaking API Changes (7.0)
|
||||||
|
|
||||||
### Deprecated: Atom.io Node Headers URL
|
### Deprecated: Atom.io Node Headers URL
|
||||||
|
|||||||
@@ -177,12 +177,12 @@ $ gn gen out/Testing-x86 --args='... target_cpu = "x86"'
|
|||||||
|
|
||||||
Not all combinations of source and target CPU/OS are supported by Chromium.
|
Not all combinations of source and target CPU/OS are supported by Chromium.
|
||||||
|
|
||||||
<table>
|
| Host | Target | Status |
|
||||||
<tr><th>Host</th><th>Target</th><th>Status</th></tr>
|
|-------------|---------------|----------------------|
|
||||||
<tr><td>Windows x64</td><td>Windows arm64</td><td>Experimental</td>
|
| Windows x64 | Windows arm64 | Experimental |
|
||||||
<tr><td>Windows x64</td><td>Windows x86</td><td>Automatically tested</td></tr>
|
| Windows x64 | Windows x86 | Automatically tested |
|
||||||
<tr><td>Linux x64</td><td>Linux x86</td><td>Automatically tested</td></tr>
|
| Linux x64 | Linux x86 | Automatically tested |
|
||||||
</table>
|
|
||||||
|
|
||||||
If you test other combinations and find them to work, please update this document :)
|
If you test other combinations and find them to work, please update this document :)
|
||||||
|
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ $ pip install pyobjc
|
|||||||
If you're developing Electron and don't plan to redistribute your
|
If you're developing Electron and don't plan to redistribute your
|
||||||
custom Electron build, you may skip this section.
|
custom Electron build, you may skip this section.
|
||||||
|
|
||||||
Official Electron builds are built with [Xcode 9.4.1](http://adcdownload.apple.com/Developer_Tools/Xcode_9.4.1/Xcode_9.4.1.xip), and the macOS 10.13 SDK. Building with a newer SDK works too, but the releases currently use the 10.13 SDK.
|
Official Electron builds are built with [Xcode 12.2](https://download.developer.apple.com/Developer_Tools/Xcode_12.2/Xcode_12.2.xip), and the macOS 11.0 SDK. Building with a newer SDK works too, but the releases currently use the 11.0 SDK.
|
||||||
|
|
||||||
## Building Electron
|
## Building Electron
|
||||||
|
|
||||||
|
|||||||
@@ -69,8 +69,7 @@ way of figuring out which is which.
|
|||||||
### Which Process Should I Attach to?
|
### Which Process Should I Attach to?
|
||||||
|
|
||||||
Code executed within the main process (that is, code found in or eventually run
|
Code executed within the main process (that is, code found in or eventually run
|
||||||
by your main JavaScript file) as well as code called using the remote
|
by your main JavaScript file) will run inside the main process, while other
|
||||||
(`require('electron').remote`) will run inside the main process, while other
|
|
||||||
code will execute inside its respective renderer process.
|
code will execute inside its respective renderer process.
|
||||||
|
|
||||||
You can be attached to multiple programs when you are debugging, but only one
|
You can be attached to multiple programs when you are debugging, but only one
|
||||||
|
|||||||
@@ -43,8 +43,8 @@ SRV*c:\code\symbols\*https://msdl.microsoft.com/download/symbols;SRV*c:\code\sym
|
|||||||
|
|
||||||
## Using the symbol server in Visual Studio
|
## Using the symbol server in Visual Studio
|
||||||
|
|
||||||
<img src='https://mdn.mozillademos.org/files/733/symbol-server-vc8express-menu.jpg'>
|

|
||||||
<img src='https://mdn.mozillademos.org/files/2497/2005_options.gif'>
|

|
||||||
|
|
||||||
## Troubleshooting: Symbols will not load
|
## Troubleshooting: Symbols will not load
|
||||||
|
|
||||||
|
|||||||
18
docs/fiddles/features/drag-and-drop/index.html
Normal file
18
docs/fiddles/features/drag-and-drop/index.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
<a href="#" id="drag">Drag me</a>
|
||||||
|
<script src="renderer.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
41
docs/fiddles/features/drag-and-drop/main.js
Normal file
41
docs/fiddles/features/drag-and-drop/main.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
const { app, BrowserWindow, ipcMain, nativeImage, NativeImage } = require('electron')
|
||||||
|
const fs = require('fs');
|
||||||
|
const http = require('http');
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
const iconName = 'iconForDragAndDrop.png';
|
||||||
|
const icon = fs.createWriteStream(`${process.cwd()}/${iconName}`);
|
||||||
|
http.get('http://img.icons8.com/ios/452/drag-and-drop.png', (response) => {
|
||||||
|
response.pipe(icon);
|
||||||
|
});
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
|
ipcMain.on('ondragstart', (event, filePath) => {
|
||||||
|
event.sender.startDrag({
|
||||||
|
file: filePath,
|
||||||
|
icon: `${process.cwd()}/${iconName}`
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
9
docs/fiddles/features/drag-and-drop/renderer.js
Normal file
9
docs/fiddles/features/drag-and-drop/renderer.js
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
const { ipcRenderer } = require('electron')
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
document.getElementById('drag').ondragstart = (event) => {
|
||||||
|
const fileName = 'drag-and-drop.md'
|
||||||
|
fs.writeFileSync(fileName, '# Test drag and drop');
|
||||||
|
event.preventDefault()
|
||||||
|
ipcRenderer.send('ondragstart', process.cwd() + `/${fileName}`)
|
||||||
|
}
|
||||||
16
docs/fiddles/features/keyboard-shortcuts/global/index.html
Normal file
16
docs/fiddles/features/keyboard-shortcuts/global/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
31
docs/fiddles/features/keyboard-shortcuts/global/main.js
Normal file
31
docs/fiddles/features/keyboard-shortcuts/global/main.js
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
const { app, BrowserWindow, globalShortcut } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
globalShortcut.register('Alt+CommandOrControl+I', () => {
|
||||||
|
console.log('Electron loves global shortcuts!')
|
||||||
|
})
|
||||||
|
}).then(createWindow)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
const win = new BrowserWindow({ width: 800, height: 600, webPreferences: { nodeIntegration: true } })
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
win.webContents.on('before-input-event', (event, input) => {
|
||||||
|
if (input.control && input.key.toLowerCase() === 'i') {
|
||||||
|
console.log('Pressed Control+I')
|
||||||
|
event.preventDefault()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
16
docs/fiddles/features/keyboard-shortcuts/local/index.html
Normal file
16
docs/fiddles/features/keyboard-shortcuts/local/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
39
docs/fiddles/features/keyboard-shortcuts/local/main.js
Normal file
39
docs/fiddles/features/keyboard-shortcuts/local/main.js
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
const { app, BrowserWindow, Menu, MenuItem } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
const menu = new Menu()
|
||||||
|
menu.append(new MenuItem({
|
||||||
|
label: 'Electron',
|
||||||
|
submenu: [{
|
||||||
|
role: 'help',
|
||||||
|
accelerator: process.platform === 'darwin' ? 'Alt+Cmd+I' : 'Alt+Shift+I',
|
||||||
|
click: () => { console.log('Electron rocks!') }
|
||||||
|
}]
|
||||||
|
}))
|
||||||
|
|
||||||
|
Menu.setApplicationMenu(menu)
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
19
docs/fiddles/features/macos-dark-mode/index.html
Normal file
19
docs/fiddles/features/macos-dark-mode/index.html
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
<link rel="stylesheet" type="text/css" href="./styles.css">
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>Current theme source: <strong id="theme-source">System</strong></p>
|
||||||
|
|
||||||
|
<button id="toggle-dark-mode">Toggle Dark Mode</button>
|
||||||
|
<button id="reset-to-system">Reset to System Theme</button>
|
||||||
|
|
||||||
|
<script src="renderer.js"></script>
|
||||||
|
</body>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
40
docs/fiddles/features/macos-dark-mode/main.js
Normal file
40
docs/fiddles/features/macos-dark-mode/main.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
const { app, BrowserWindow, ipcMain, nativeTheme } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
|
||||||
|
ipcMain.handle('dark-mode:toggle', () => {
|
||||||
|
if (nativeTheme.shouldUseDarkColors) {
|
||||||
|
nativeTheme.themeSource = 'light'
|
||||||
|
} else {
|
||||||
|
nativeTheme.themeSource = 'dark'
|
||||||
|
}
|
||||||
|
return nativeTheme.shouldUseDarkColors
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.handle('dark-mode:system', () => {
|
||||||
|
nativeTheme.themeSouce = 'system'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
11
docs/fiddles/features/macos-dark-mode/renderer.js
Normal file
11
docs/fiddles/features/macos-dark-mode/renderer.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
const { ipcRenderer } = require('electron')
|
||||||
|
|
||||||
|
document.getElementById('toggle-dark-mode').addEventListener('click', async () => {
|
||||||
|
const isDarkMode = await ipcRenderer.invoke('dark-mode:toggle')
|
||||||
|
document.getElementById('theme-source').innerHTML = isDarkMode ? 'Dark' : 'Light'
|
||||||
|
})
|
||||||
|
|
||||||
|
document.getElementById('reset-to-system').addEventListener('click', async () => {
|
||||||
|
await ipcRenderer.invoke('dark-mode:system')
|
||||||
|
document.getElementById('theme-source').innerHTML = 'System'
|
||||||
|
})
|
||||||
7
docs/fiddles/features/macos-dark-mode/styles.css
Normal file
7
docs/fiddles/features/macos-dark-mode/styles.css
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
@media (prefers-color-scheme: dark) {
|
||||||
|
body { background: #333; color: white; }
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
body { background: #ddd; color: black; }
|
||||||
|
}
|
||||||
16
docs/fiddles/features/macos-dock-menu/index.html
Normal file
16
docs/fiddles/features/macos-dock-menu/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
43
docs/fiddles/features/macos-dock-menu/main.js
Normal file
43
docs/fiddles/features/macos-dock-menu/main.js
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
const { app, BrowserWindow, Menu } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
const dockMenu = Menu.buildFromTemplate([
|
||||||
|
{
|
||||||
|
label: 'New Window',
|
||||||
|
click () { console.log('New Window') }
|
||||||
|
}, {
|
||||||
|
label: 'New Window with Settings',
|
||||||
|
submenu: [
|
||||||
|
{ label: 'Basic' },
|
||||||
|
{ label: 'Pro' }
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{ label: 'New Command...' }
|
||||||
|
])
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
app.dock.setMenu(dockMenu)
|
||||||
|
}).then(createWindow)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
16
docs/fiddles/features/notifications/main/index.html
Normal file
16
docs/fiddles/features/notifications/main/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
35
docs/fiddles/features/notifications/main/main.js
Normal file
35
docs/fiddles/features/notifications/main/main.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
const { app, BrowserWindow, Notification } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
function showNotification () {
|
||||||
|
const notification = {
|
||||||
|
title: 'Basic Notification',
|
||||||
|
body: 'Notification from the Main process'
|
||||||
|
}
|
||||||
|
new Notification(notification).show()
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow).then(showNotification)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
17
docs/fiddles/features/notifications/renderer/index.html
Normal file
17
docs/fiddles/features/notifications/renderer/index.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
<script src="renderer.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
27
docs/fiddles/features/notifications/renderer/main.js
Normal file
27
docs/fiddles/features/notifications/renderer/main.js
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
7
docs/fiddles/features/notifications/renderer/renderer.js
Normal file
7
docs/fiddles/features/notifications/renderer/renderer.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const myNotification = new Notification('Title', {
|
||||||
|
body: 'Notification from the Renderer process'
|
||||||
|
})
|
||||||
|
|
||||||
|
myNotification.onclick = () => {
|
||||||
|
console.log('Notification clicked')
|
||||||
|
}
|
||||||
15
docs/fiddles/features/offscreen-rendering/index.html
Normal file
15
docs/fiddles/features/offscreen-rendering/index.html
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
28
docs/fiddles/features/offscreen-rendering/main.js
Normal file
28
docs/fiddles/features/offscreen-rendering/main.js
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
const fs = require('fs')
|
||||||
|
|
||||||
|
app.disableHardwareAcceleration()
|
||||||
|
|
||||||
|
let win
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
win = new BrowserWindow({ webPreferences: { offscreen: true } })
|
||||||
|
win.loadURL('https://github.com')
|
||||||
|
win.webContents.on('paint', (event, dirty, image) => {
|
||||||
|
fs.writeFileSync('ex.png', image.toPNG())
|
||||||
|
})
|
||||||
|
win.webContents.setFrameRate(60)
|
||||||
|
console.log(`The screenshot has been successfully saved to ${process.cwd()}/ex.png`)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
17
docs/fiddles/features/online-detection/main/index.html
Normal file
17
docs/fiddles/features/online-detection/main/index.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
<script src="renderer.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
24
docs/fiddles/features/online-detection/main/main.js
Normal file
24
docs/fiddles/features/online-detection/main/main.js
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
const { app, BrowserWindow, ipcMain } = require('electron')
|
||||||
|
|
||||||
|
let onlineStatusWindow
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
onlineStatusWindow = new BrowserWindow({ width: 0, height: 0, show: false, webPreferences: { nodeIntegration: true } })
|
||||||
|
onlineStatusWindow.loadURL(`file://${__dirname}/index.html`)
|
||||||
|
})
|
||||||
|
|
||||||
|
ipcMain.on('online-status-changed', (event, status) => {
|
||||||
|
console.log(status)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
7
docs/fiddles/features/online-detection/main/renderer.js
Normal file
7
docs/fiddles/features/online-detection/main/renderer.js
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
const { ipcRenderer } = require('electron')
|
||||||
|
const updateOnlineStatus = () => { ipcRenderer.send('online-status-changed', navigator.onLine ? 'online' : 'offline') }
|
||||||
|
|
||||||
|
window.addEventListener('online', updateOnlineStatus)
|
||||||
|
window.addEventListener('offline', updateOnlineStatus)
|
||||||
|
|
||||||
|
updateOnlineStatus()
|
||||||
17
docs/fiddles/features/online-detection/renderer/index.html
Normal file
17
docs/fiddles/features/online-detection/renderer/index.html
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
<script src="renderer.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
20
docs/fiddles/features/online-detection/renderer/main.js
Normal file
20
docs/fiddles/features/online-detection/renderer/main.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
|
let onlineStatusWindow
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
onlineStatusWindow = new BrowserWindow({ width: 0, height: 0, show: false })
|
||||||
|
onlineStatusWindow.loadURL(`file://${__dirname}/index.html`)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
const alertOnlineStatus = () => { window.alert(navigator.onLine ? 'online' : 'offline') }
|
||||||
|
|
||||||
|
window.addEventListener('online', alertOnlineStatus)
|
||||||
|
window.addEventListener('offline', alertOnlineStatus)
|
||||||
|
|
||||||
|
alertOnlineStatus()
|
||||||
16
docs/fiddles/features/progress-bar/index.html
Normal file
16
docs/fiddles/features/progress-bar/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
30
docs/fiddles/features/progress-bar/main.js
Normal file
30
docs/fiddles/features/progress-bar/main.js
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
win.setProgressBar(0.5)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
16
docs/fiddles/features/recent-documents/index.html
Normal file
16
docs/fiddles/features/recent-documents/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
34
docs/fiddles/features/recent-documents/main.js
Normal file
34
docs/fiddles/features/recent-documents/main.js
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
const fileName = 'recently-used.md'
|
||||||
|
fs.writeFile(fileName, 'Lorem Ipsum', () => {
|
||||||
|
app.addRecentDocument(path.join(process.cwd(), `${fileName}`))
|
||||||
|
})
|
||||||
|
|
||||||
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
app.clearRecentDocuments()
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
16
docs/fiddles/features/represented-file/index.html
Normal file
16
docs/fiddles/features/represented-file/index.html
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>Hello World!</title>
|
||||||
|
<meta http-equiv="Content-Security-Policy" content="script-src 'self' 'unsafe-inline';" />
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>Hello World!</h1>
|
||||||
|
<p>
|
||||||
|
We are using node <script>document.write(process.versions.node)</script>,
|
||||||
|
Chrome <script>document.write(process.versions.chrome)</script>,
|
||||||
|
and Electron <script>document.write(process.versions.electron)</script>.
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
33
docs/fiddles/features/represented-file/main.js
Normal file
33
docs/fiddles/features/represented-file/main.js
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
const os = require('os');
|
||||||
|
|
||||||
|
function createWindow () {
|
||||||
|
const win = new BrowserWindow({
|
||||||
|
width: 800,
|
||||||
|
height: 600,
|
||||||
|
webPreferences: {
|
||||||
|
nodeIntegration: true
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
win.loadFile('index.html')
|
||||||
|
}
|
||||||
|
|
||||||
|
app.whenReady().then(() => {
|
||||||
|
const win = new BrowserWindow()
|
||||||
|
|
||||||
|
win.setRepresentedFilename(os.homedir())
|
||||||
|
win.setDocumentEdited(true)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('window-all-closed', () => {
|
||||||
|
if (process.platform !== 'darwin') {
|
||||||
|
app.quit()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
app.on('activate', () => {
|
||||||
|
if (BrowserWindow.getAllWindows().length === 0) {
|
||||||
|
createWindow()
|
||||||
|
}
|
||||||
|
})
|
||||||
@@ -1,7 +1,11 @@
|
|||||||
const { BrowserWindow, app } = require('electron')
|
const { BrowserWindow, app, screen, ipcMain } = require('electron')
|
||||||
|
|
||||||
let mainWindow = null
|
let mainWindow = null
|
||||||
|
|
||||||
|
ipcMain.handle('get-screen-size', () => {
|
||||||
|
return screen.getPrimaryDisplay().workAreaSize
|
||||||
|
})
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
const windowOptions = {
|
const windowOptions = {
|
||||||
width: 600,
|
width: 600,
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
const { desktopCapturer } = require('electron')
|
const { desktopCapturer, shell, ipcRenderer } = require('electron')
|
||||||
const { screen, shell } = require('electron').remote
|
|
||||||
|
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const os = require('os')
|
const os = require('os')
|
||||||
@@ -8,9 +7,9 @@ const path = require('path')
|
|||||||
const screenshot = document.getElementById('screen-shot')
|
const screenshot = document.getElementById('screen-shot')
|
||||||
const screenshotMsg = document.getElementById('screenshot-path')
|
const screenshotMsg = document.getElementById('screenshot-path')
|
||||||
|
|
||||||
screenshot.addEventListener('click', (event) => {
|
screenshot.addEventListener('click', async (event) => {
|
||||||
screenshotMsg.textContent = 'Gathering screens...'
|
screenshotMsg.textContent = 'Gathering screens...'
|
||||||
const thumbSize = determineScreenShotSize()
|
const thumbSize = await determineScreenShotSize()
|
||||||
const options = { types: ['screen'], thumbnailSize: thumbSize }
|
const options = { types: ['screen'], thumbnailSize: thumbSize }
|
||||||
|
|
||||||
desktopCapturer.getSources(options, (error, sources) => {
|
desktopCapturer.getSources(options, (error, sources) => {
|
||||||
@@ -33,8 +32,8 @@ screenshot.addEventListener('click', (event) => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
function determineScreenShotSize () {
|
async function determineScreenShotSize () {
|
||||||
const screenSize = screen.getPrimaryDisplay().workAreaSize
|
const screenSize = await ipcRenderer.invoke('get-screen-size')
|
||||||
const maxDimension = Math.max(screenSize.width, screenSize.height)
|
const maxDimension = Math.max(screenSize.width, screenSize.height)
|
||||||
return {
|
return {
|
||||||
width: maxDimension * window.devicePixelRatio,
|
width: maxDimension * window.devicePixelRatio,
|
||||||
|
|||||||
@@ -1,95 +1,95 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
mainWindow.loadFile('index.html')
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.webContents.openDevTools()
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on('closed', function () {
|
mainWindow.on('closed', function () {
|
||||||
// Dereference the window object, usually you would store windows
|
// Dereference the window object, usually you would store windows
|
||||||
// in an array if your app supports multi windows, this is the time
|
// in an array if your app supports multi windows, this is the time
|
||||||
// when you should delete the corresponding element.
|
// when you should delete the corresponding element.
|
||||||
mainWindow = null
|
mainWindow = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.whenReady().then(createWindow)
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on('window-all-closed', function () {
|
app.on('window-all-closed', function () {
|
||||||
// On macOS it is common for applications and their menu bar
|
// On macOS it is common for applications and their menu bar
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it is common to re-create a window in the app when the
|
// On macOS it is common to re-create a window in the app when the
|
||||||
// dock icon is clicked and there are no other windows open.
|
// dock icon is clicked and there are no other windows open.
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null) {
|
||||||
createWindow()
|
createWindow()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('open-error-dialog', event => {
|
ipcMain.on('open-error-dialog', event => {
|
||||||
dialog.showErrorBox('An Error Message', 'Demonstrating an error message.')
|
dialog.showErrorBox('An Error Message', 'Demonstrating an error message.')
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('open-information-dialog', event => {
|
ipcMain.on('open-information-dialog', event => {
|
||||||
const options = {
|
const options = {
|
||||||
type: 'info',
|
type: 'info',
|
||||||
title: 'Information',
|
title: 'Information',
|
||||||
message: "This is an information dialog. Isn't it nice?",
|
message: "This is an information dialog. Isn't it nice?",
|
||||||
buttons: ['Yes', 'No']
|
buttons: ['Yes', 'No']
|
||||||
}
|
}
|
||||||
dialog.showMessageBox(options, index => {
|
dialog.showMessageBox(options, index => {
|
||||||
event.sender.send('information-dialog-selection', index)
|
event.sender.send('information-dialog-selection', index)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('open-file-dialog', event => {
|
ipcMain.on('open-file-dialog', event => {
|
||||||
dialog.showOpenDialog(
|
dialog.showOpenDialog(
|
||||||
{
|
{
|
||||||
properties: ['openFile', 'openDirectory']
|
properties: ['openFile', 'openDirectory']
|
||||||
},
|
},
|
||||||
files => {
|
files => {
|
||||||
if (files) {
|
if (files) {
|
||||||
event.sender.send('selected-directory', files)
|
event.sender.send('selected-directory', files)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('save-dialog', event => {
|
ipcMain.on('save-dialog', event => {
|
||||||
const options = {
|
const options = {
|
||||||
title: 'Save an Image',
|
title: 'Save an Image',
|
||||||
filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]
|
filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]
|
||||||
}
|
}
|
||||||
dialog.showSaveDialog(options, filename => {
|
dialog.showSaveDialog(options, filename => {
|
||||||
event.sender.send('saved-file', filename)
|
event.sender.send('saved-file', filename)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
const { ipcRenderer, shell } = require('electron')
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
const links = document.querySelectorAll('a[href]')
|
const links = document.querySelectorAll('a[href]')
|
||||||
const errorBtn = document.getElementById('error-dialog')
|
const errorBtn = document.getElementById('error-dialog')
|
||||||
|
|
||||||
errorBtn.addEventListener('click', event => {
|
errorBtn.addEventListener('click', event => {
|
||||||
ipcRenderer.send('open-error-dialog')
|
ipcRenderer.send('open-error-dialog')
|
||||||
})
|
})
|
||||||
|
|
||||||
Array.prototype.forEach.call(links, (link) => {
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
const url = link.getAttribute('href')
|
const url = link.getAttribute('href')
|
||||||
if (url.indexOf('http') === 0) {
|
if (url.indexOf('http') === 0) {
|
||||||
link.addEventListener('click', (e) => {
|
link.addEventListener('click', (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
shell.openExternal(url)
|
shell.openExternal(url)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1,70 +1,70 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
mainWindow.loadFile('index.html')
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.webContents.openDevTools()
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on('closed', function () {
|
mainWindow.on('closed', function () {
|
||||||
// Dereference the window object, usually you would store windows
|
// Dereference the window object, usually you would store windows
|
||||||
// in an array if your app supports multi windows, this is the time
|
// in an array if your app supports multi windows, this is the time
|
||||||
// when you should delete the corresponding element.
|
// when you should delete the corresponding element.
|
||||||
mainWindow = null
|
mainWindow = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.whenReady().then(createWindow)
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on('window-all-closed', function () {
|
app.on('window-all-closed', function () {
|
||||||
// On macOS it is common for applications and their menu bar
|
// On macOS it is common for applications and their menu bar
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it is common to re-create a window in the app when the
|
// On macOS it is common to re-create a window in the app when the
|
||||||
// dock icon is clicked and there are no other windows open.
|
// dock icon is clicked and there are no other windows open.
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null) {
|
||||||
createWindow()
|
createWindow()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
ipcMain.on('open-information-dialog', event => {
|
ipcMain.on('open-information-dialog', event => {
|
||||||
const options = {
|
const options = {
|
||||||
type: 'info',
|
type: 'info',
|
||||||
title: 'Information',
|
title: 'Information',
|
||||||
message: "This is an information dialog. Isn't it nice?",
|
message: "This is an information dialog. Isn't it nice?",
|
||||||
buttons: ['Yes', 'No']
|
buttons: ['Yes', 'No']
|
||||||
}
|
}
|
||||||
dialog.showMessageBox(options, index => {
|
dialog.showMessageBox(options, index => {
|
||||||
event.sender.send('information-dialog-selection', index)
|
event.sender.send('information-dialog-selection', index)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|||||||
@@ -1,25 +1,25 @@
|
|||||||
const { ipcRenderer, shell } = require('electron')
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
const informationBtn = document.getElementById('information-dialog')
|
const informationBtn = document.getElementById('information-dialog')
|
||||||
const links = document.querySelectorAll('a[href]')
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
|
||||||
informationBtn.addEventListener('click', event => {
|
informationBtn.addEventListener('click', event => {
|
||||||
ipcRenderer.send('open-information-dialog')
|
ipcRenderer.send('open-information-dialog')
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcRenderer.on('information-dialog-selection', (event, index) => {
|
ipcRenderer.on('information-dialog-selection', (event, index) => {
|
||||||
let message = 'You selected '
|
let message = 'You selected '
|
||||||
if (index === 0) message += 'yes.'
|
if (index === 0) message += 'yes.'
|
||||||
else message += 'no.'
|
else message += 'no.'
|
||||||
document.getElementById('info-selection').innerHTML = message
|
document.getElementById('info-selection').innerHTML = message
|
||||||
})
|
})
|
||||||
|
|
||||||
Array.prototype.forEach.call(links, (link) => {
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
const url = link.getAttribute('href')
|
const url = link.getAttribute('href')
|
||||||
if (url.indexOf('http') === 0) {
|
if (url.indexOf('http') === 0) {
|
||||||
link.addEventListener('click', (e) => {
|
link.addEventListener('click', (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
shell.openExternal(url)
|
shell.openExternal(url)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1,70 +1,70 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
mainWindow.loadFile('index.html')
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.webContents.openDevTools()
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on('closed', function () {
|
mainWindow.on('closed', function () {
|
||||||
// Dereference the window object, usually you would store windows
|
// Dereference the window object, usually you would store windows
|
||||||
// in an array if your app supports multi windows, this is the time
|
// in an array if your app supports multi windows, this is the time
|
||||||
// when you should delete the corresponding element.
|
// when you should delete the corresponding element.
|
||||||
mainWindow = null
|
mainWindow = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.whenReady().then(createWindow)
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on('window-all-closed', function () {
|
app.on('window-all-closed', function () {
|
||||||
// On macOS it is common for applications and their menu bar
|
// On macOS it is common for applications and their menu bar
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it is common to re-create a window in the app when the
|
// On macOS it is common to re-create a window in the app when the
|
||||||
// dock icon is clicked and there are no other windows open.
|
// dock icon is clicked and there are no other windows open.
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null) {
|
||||||
createWindow()
|
createWindow()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
ipcMain.on('open-file-dialog', event => {
|
ipcMain.on('open-file-dialog', event => {
|
||||||
dialog.showOpenDialog(
|
dialog.showOpenDialog(
|
||||||
{
|
{
|
||||||
properties: ['openFile', 'openDirectory']
|
properties: ['openFile', 'openDirectory']
|
||||||
},
|
},
|
||||||
files => {
|
files => {
|
||||||
if (files) {
|
if (files) {
|
||||||
event.sender.send('selected-directory', files)
|
event.sender.send('selected-directory', files)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|||||||
@@ -1,22 +1,22 @@
|
|||||||
const { ipcRenderer, shell } = require('electron')
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
const selectDirBtn = document.getElementById('select-directory')
|
const selectDirBtn = document.getElementById('select-directory')
|
||||||
const links = document.querySelectorAll('a[href]')
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
|
||||||
selectDirBtn.addEventListener('click', event => {
|
selectDirBtn.addEventListener('click', event => {
|
||||||
ipcRenderer.send('open-file-dialog')
|
ipcRenderer.send('open-file-dialog')
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcRenderer.on('selected-directory', (event, path) => {
|
ipcRenderer.on('selected-directory', (event, path) => {
|
||||||
document.getElementById('selected-file').innerHTML = `You selected: ${path}`
|
document.getElementById('selected-file').innerHTML = `You selected: ${path}`
|
||||||
})
|
})
|
||||||
|
|
||||||
Array.prototype.forEach.call(links, (link) => {
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
const url = link.getAttribute('href')
|
const url = link.getAttribute('href')
|
||||||
if (url.indexOf('http') === 0) {
|
if (url.indexOf('http') === 0) {
|
||||||
link.addEventListener('click', (e) => {
|
link.addEventListener('click', (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
shell.openExternal(url)
|
shell.openExternal(url)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,66 +1,66 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
const { app, BrowserWindow, ipcMain, dialog } = require('electron')
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
mainWindow.loadFile('index.html')
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.webContents.openDevTools()
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on('closed', function () {
|
mainWindow.on('closed', function () {
|
||||||
// Dereference the window object, usually you would store windows
|
// Dereference the window object, usually you would store windows
|
||||||
// in an array if your app supports multi windows, this is the time
|
// in an array if your app supports multi windows, this is the time
|
||||||
// when you should delete the corresponding element.
|
// when you should delete the corresponding element.
|
||||||
mainWindow = null
|
mainWindow = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.whenReady().then(createWindow)
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on('window-all-closed', function () {
|
app.on('window-all-closed', function () {
|
||||||
// On macOS it is common for applications and their menu bar
|
// On macOS it is common for applications and their menu bar
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it is common to re-create a window in the app when the
|
// On macOS it is common to re-create a window in the app when the
|
||||||
// dock icon is clicked and there are no other windows open.
|
// dock icon is clicked and there are no other windows open.
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null) {
|
||||||
createWindow()
|
createWindow()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcMain.on('save-dialog', event => {
|
ipcMain.on('save-dialog', event => {
|
||||||
const options = {
|
const options = {
|
||||||
title: 'Save an Image',
|
title: 'Save an Image',
|
||||||
filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]
|
filters: [{ name: 'Images', extensions: ['jpg', 'png', 'gif'] }]
|
||||||
}
|
}
|
||||||
dialog.showSaveDialog(options, filename => {
|
dialog.showSaveDialog(options, filename => {
|
||||||
event.sender.send('saved-file', filename)
|
event.sender.send('saved-file', filename)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|||||||
@@ -1,23 +1,23 @@
|
|||||||
const { ipcRenderer, shell } = require('electron')
|
const { ipcRenderer, shell } = require('electron')
|
||||||
|
|
||||||
const saveBtn = document.getElementById('save-dialog')
|
const saveBtn = document.getElementById('save-dialog')
|
||||||
const links = document.querySelectorAll('a[href]')
|
const links = document.querySelectorAll('a[href]')
|
||||||
|
|
||||||
saveBtn.addEventListener('click', event => {
|
saveBtn.addEventListener('click', event => {
|
||||||
ipcRenderer.send('save-dialog')
|
ipcRenderer.send('save-dialog')
|
||||||
})
|
})
|
||||||
|
|
||||||
ipcRenderer.on('saved-file', (event, path) => {
|
ipcRenderer.on('saved-file', (event, path) => {
|
||||||
if (!path) path = 'No path'
|
if (!path) path = 'No path'
|
||||||
document.getElementById('file-saved').innerHTML = `Path selected: ${path}`
|
document.getElementById('file-saved').innerHTML = `Path selected: ${path}`
|
||||||
})
|
})
|
||||||
|
|
||||||
Array.prototype.forEach.call(links, (link) => {
|
Array.prototype.forEach.call(links, (link) => {
|
||||||
const url = link.getAttribute('href')
|
const url = link.getAttribute('href')
|
||||||
if (url.indexOf('http') === 0) {
|
if (url.indexOf('http') === 0) {
|
||||||
link.addEventListener('click', (e) => {
|
link.addEventListener('click', (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
shell.openExternal(url)
|
shell.openExternal(url)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -1,56 +1,56 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow } = require('electron')
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
mainWindow.loadFile('index.html')
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.webContents.openDevTools()
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on('closed', function () {
|
mainWindow.on('closed', function () {
|
||||||
// Dereference the window object, usually you would store windows
|
// Dereference the window object, usually you would store windows
|
||||||
// in an array if your app supports multi windows, this is the time
|
// in an array if your app supports multi windows, this is the time
|
||||||
// when you should delete the corresponding element.
|
// when you should delete the corresponding element.
|
||||||
mainWindow = null
|
mainWindow = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.whenReady().then(createWindow)
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on('window-all-closed', function () {
|
app.on('window-all-closed', function () {
|
||||||
// On macOS it is common for applications and their menu bar
|
// On macOS it is common for applications and their menu bar
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it is common to re-create a window in the app when the
|
// On macOS it is common to re-create a window in the app when the
|
||||||
// dock icon is clicked and there are no other windows open.
|
// dock icon is clicked and there are no other windows open.
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null) {
|
||||||
createWindow()
|
createWindow()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
const { shell } = require('electron')
|
const { shell } = require('electron')
|
||||||
const os = require('os')
|
const os = require('os')
|
||||||
|
|
||||||
const exLinksBtn = document.getElementById('open-ex-links')
|
const exLinksBtn = document.getElementById('open-ex-links')
|
||||||
const fileManagerBtn = document.getElementById('open-file-manager')
|
const fileManagerBtn = document.getElementById('open-file-manager')
|
||||||
|
|
||||||
fileManagerBtn.addEventListener('click', (event) => {
|
fileManagerBtn.addEventListener('click', (event) => {
|
||||||
shell.showItemInFolder(os.homedir())
|
shell.showItemInFolder(os.homedir())
|
||||||
})
|
})
|
||||||
|
|
||||||
exLinksBtn.addEventListener('click', (event) => {
|
exLinksBtn.addEventListener('click', (event) => {
|
||||||
shell.openExternal('https://electronjs.org')
|
shell.openExternal('https://electronjs.org')
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,56 +1,56 @@
|
|||||||
// Modules to control application life and create native browser window
|
// Modules to control application life and create native browser window
|
||||||
const { app, BrowserWindow } = require('electron')
|
const { app, BrowserWindow } = require('electron')
|
||||||
|
|
||||||
// Keep a global reference of the window object, if you don't, the window will
|
// Keep a global reference of the window object, if you don't, the window will
|
||||||
// be closed automatically when the JavaScript object is garbage collected.
|
// be closed automatically when the JavaScript object is garbage collected.
|
||||||
let mainWindow
|
let mainWindow
|
||||||
|
|
||||||
function createWindow () {
|
function createWindow () {
|
||||||
// Create the browser window.
|
// Create the browser window.
|
||||||
mainWindow = new BrowserWindow({
|
mainWindow = new BrowserWindow({
|
||||||
width: 800,
|
width: 800,
|
||||||
height: 600,
|
height: 600,
|
||||||
webPreferences: {
|
webPreferences: {
|
||||||
nodeIntegration: true
|
nodeIntegration: true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// and load the index.html of the app.
|
// and load the index.html of the app.
|
||||||
mainWindow.loadFile('index.html')
|
mainWindow.loadFile('index.html')
|
||||||
|
|
||||||
// Open the DevTools.
|
// Open the DevTools.
|
||||||
// mainWindow.webContents.openDevTools()
|
// mainWindow.webContents.openDevTools()
|
||||||
|
|
||||||
// Emitted when the window is closed.
|
// Emitted when the window is closed.
|
||||||
mainWindow.on('closed', function () {
|
mainWindow.on('closed', function () {
|
||||||
// Dereference the window object, usually you would store windows
|
// Dereference the window object, usually you would store windows
|
||||||
// in an array if your app supports multi windows, this is the time
|
// in an array if your app supports multi windows, this is the time
|
||||||
// when you should delete the corresponding element.
|
// when you should delete the corresponding element.
|
||||||
mainWindow = null
|
mainWindow = null
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// This method will be called when Electron has finished
|
// This method will be called when Electron has finished
|
||||||
// initialization and is ready to create browser windows.
|
// initialization and is ready to create browser windows.
|
||||||
// Some APIs can only be used after this event occurs.
|
// Some APIs can only be used after this event occurs.
|
||||||
app.whenReady().then(createWindow)
|
app.whenReady().then(createWindow)
|
||||||
|
|
||||||
// Quit when all windows are closed.
|
// Quit when all windows are closed.
|
||||||
app.on('window-all-closed', function () {
|
app.on('window-all-closed', function () {
|
||||||
// On macOS it is common for applications and their menu bar
|
// On macOS it is common for applications and their menu bar
|
||||||
// to stay active until the user quits explicitly with Cmd + Q
|
// to stay active until the user quits explicitly with Cmd + Q
|
||||||
if (process.platform !== 'darwin') {
|
if (process.platform !== 'darwin') {
|
||||||
app.quit()
|
app.quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
app.on('activate', function () {
|
app.on('activate', function () {
|
||||||
// On macOS it is common to re-create a window in the app when the
|
// On macOS it is common to re-create a window in the app when the
|
||||||
// dock icon is clicked and there are no other windows open.
|
// dock icon is clicked and there are no other windows open.
|
||||||
if (mainWindow === null) {
|
if (mainWindow === null) {
|
||||||
createWindow()
|
createWindow()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
// In this file you can include the rest of your app's specific main process
|
// In this file you can include the rest of your app's specific main process
|
||||||
// code. You can also put them in separate files and require them here.
|
// code. You can also put them in separate files and require them here.
|
||||||
|
|||||||
@@ -1,29 +1,29 @@
|
|||||||
const basicNotification = {
|
const basicNotification = {
|
||||||
title: 'Basic Notification',
|
title: 'Basic Notification',
|
||||||
body: 'Short message part'
|
body: 'Short message part'
|
||||||
}
|
}
|
||||||
|
|
||||||
const notification = {
|
const notification = {
|
||||||
title: 'Notification with image',
|
title: 'Notification with image',
|
||||||
body: 'Short message plus a custom image',
|
body: 'Short message plus a custom image',
|
||||||
icon: 'https://via.placeholder.com/150'
|
icon: 'https://via.placeholder.com/150'
|
||||||
}
|
}
|
||||||
|
|
||||||
const basicNotificationButton = document.getElementById('basic-noti')
|
const basicNotificationButton = document.getElementById('basic-noti')
|
||||||
const notificationButton = document.getElementById('advanced-noti')
|
const notificationButton = document.getElementById('advanced-noti')
|
||||||
|
|
||||||
notificationButton.addEventListener('click', () => {
|
notificationButton.addEventListener('click', () => {
|
||||||
const myNotification = new window.Notification(notification.title, notification)
|
const myNotification = new window.Notification(notification.title, notification)
|
||||||
|
|
||||||
myNotification.onclick = () => {
|
myNotification.onclick = () => {
|
||||||
console.log('Notification clicked')
|
console.log('Notification clicked')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
basicNotificationButton.addEventListener('click', () => {
|
basicNotificationButton.addEventListener('click', () => {
|
||||||
const myNotification = new window.Notification(basicNotification.title, basicNotification)
|
const myNotification = new window.Notification(basicNotification.title, basicNotification)
|
||||||
|
|
||||||
myNotification.onclick = () => {
|
myNotification.onclick = () => {
|
||||||
console.log('Notification clicked')
|
console.log('Notification clicked')
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user