Compare commits

...

349 Commits

Author SHA1 Message Date
Electron Bot
cb408dbb5b Bump v6.1.12 2020-05-18 11:24:01 -07:00
Pedro Pontes
70dd6c1bdf chore: cherry-pick 1288aa12369e from angle (#23563) 2020-05-18 10:46:51 +09:00
Andrey Belenko
45089c847b chore: cherry-pick 7101418f85a0 from chromium (#23530)
Co-authored-by: Andrey Belenko <anbelen@microsoft.com>
2020-05-14 13:26:41 -07:00
Andrey Belenko
fc417894f3 chore: cherry-pick 86c02c5dcd37 from chromium (#23526)
Co-authored-by: Andrey Belenko <anbelen@microsoft.com>
2020-05-13 15:57:55 -07:00
trop[bot]
32af89963e build: use correct v8_context_snapshot_generator in mksnapshot zip (#23541)
Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-05-13 09:42:02 -04:00
Cheng Zhao
1bf5703e73 chore: cherry-pick e89fe66d0473 from Chromium (#23516) 2020-05-13 17:07:24 +09:00
Cheng Zhao
c821657a7b chore: cherry-pick 67864c214770 from Chromium (#23519) 2020-05-13 14:43:00 +09:00
Pedro Pontes
f4324fbd6a chore: cherry-pick 38990b7d56e6 from chromium (#23505)
* chore: cherry-pick 38990b7d56e6 from chromium

* update patches

Co-authored-by: Electron Bot <anonymous@electronjs.org>
2020-05-12 10:39:14 -07:00
Jeremy Apthorp
f2297c81dd chore: cherry-pick 826a4af58b3d from chromium (#23464) 2020-05-08 11:42:12 -07:00
Jeremy Apthorp
12ea5a028d chore: cherry-pick 686d1bfbcb8f from chromium (#23458) 2020-05-08 11:20:17 -07:00
Jeremy Apthorp
f452b9f9ac chore: cherry-pick b69991a9b701 from chromium (#23432) 2020-05-08 11:16:10 -07:00
Jeremy Apthorp
ae8956064d style: use build/include_directory for NOLINT (#23459) 2020-05-07 14:14:54 -07:00
Electron Bot
ee20443741 Bump v6.1.11 2020-05-01 11:12:34 -07:00
trop[bot]
c4b90afab8 ci: make sure msedge isn't running at end of woa test (#23359)
Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-04-30 17:02:27 -04:00
Samuel Attard
d0a326c1d6 fix: do not mutate ipc instances across contexts (#23241) 2020-04-22 17:36:59 -07:00
Samuel Attard
dac2137420 fix: do not allow child windows to specify their own preload script (#23228) 2020-04-22 16:01:35 -07:00
Jeremy Apthorp
b355d722dc build: improve patch filename remembering (#23185)
* build: improve patch filename remembering (#23070)

* update patches

Co-authored-by: Electron Bot <anonymous@electronjs.org>
2020-04-21 17:02:28 -07:00
Samuel Attard
890bd47caf fix: backport V8 promise context fix (#23186) 2020-04-20 18:00:32 -07:00
Electron Bot
4c09496cf0 Bump v6.1.10 2020-04-14 07:45:39 -07:00
Pedro Pontes
8af46e4ed7 fix: backport d82a02c837d3 from webrtc. (#23038)
ACM: Corrected temporary buffer size

This CL corrects the temporary buffers size in the
pre-processing of the capture audio before encoding.

As part of this it removes the ACM-specific hardcoding
of the size and instead ensures that the size of the
temporary buffer matches that of the AudioFrame.

Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-04-14 10:35:13 -04:00
Samuel Attard
cbc0112991 build: auto-generate the codesigning cert used for macOS CI testing runs (#23004)
* build: auto-generate the codesigning cert used for macOS CI testing runs (#17668)

* build: auto-generate the codesigning cert used for macOS CI testing runs

* build: give the cert ALL the trust values

* chore: also import public key

* idek

* lint

Co-authored-by: Jeremy Apthorp <jeremya@chromium.org>
2020-04-14 08:31:55 -04:00
Pedro Pontes
0f67fac1ad fix: backport b52f7fb5933a from WebRTC. (#23045)
[DirectX] Fix vector allocation for raw data handling.

std::vector::reserve has the effect to reserve space in memory but does
not affect the result of size(), which keeps on returning 0. If size is
0, however, data() might either return null or not [1].

This CL fixes the use of reserve() in favour of resize() which
effectively allocates the memory in the vector and updates its size.
This way size() returns a value bigger than 0 and data() returns a valid
pointer.

[1] https://en.cppreference.com/w/cpp/container/vector/data

Fixed: chromium:1059764
Change-Id: Ida3dbe643710c6895f09b9da87b0075b7d7b28df
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/170470
Reviewed-by: Jamie Walch <jamiewalch@chromium.org>
Commit-Queue: Armando Miraglia <armax@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30836}
2020-04-14 08:30:34 -04:00
Jeremy Apthorp
18877923b3 fix: cherry-pick 2aac556145af from v8 (#23060) 2020-04-13 13:30:44 -07:00
Jeremy Apthorp
61137132ba fix: cherry-pick 09d14728ca251 from v8 (#23046) 2020-04-10 13:28:58 -07:00
Jeremy Apthorp
16af7fdc20 chore: cherry-pick 913247c378d5 from chromium (#23012) 2020-04-10 10:29:58 -07:00
Jeremy Apthorp
9ca060df7f chore: cherry-pick 4c57222340cf from chromium (#23010) 2020-04-09 16:39:00 -07:00
Jeremy Apthorp
2ef57ce93d chore: cherry-pick 3ac8883297e1 from chromium (#23014) 2020-04-09 14:01:36 -07:00
Jeremy Apthorp
65eca25a63 chore: cherry-pick 728c6deeffe1 from chromium (#22982) 2020-04-09 12:34:10 -07:00
John Kleinschmidt
bbed4b1f71 build: Update patches for 6-1-x (#23058) 2020-04-09 13:54:55 -04:00
Jeremy Apthorp
61d0fa5147 chore: cherry-pick 3030db702eee from chromium (#22987)
Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-04-09 11:40:40 -04:00
Jeremy Apthorp
fb9b281515 chore: cherry-pick d4564dcc2520 from chromium (#22980) 2020-04-08 17:48:09 -07:00
Jeremy Apthorp
9a058fb766 ci: auto-3way patches and detect changes (#23034) 2020-04-08 15:32:17 -07:00
Jeremy Apthorp
15c60bafe7 chore: cherry-pick adc8f05aa3ab from chromium (#22978) 2020-04-08 13:31:59 -07:00
Jeremy Apthorp
4ae22e003b chore: cherry-pick a0a48e0132bc from chromium (#22984)
* chore: cherry-pick a0a48e0132bc from chromium

* resolve conflict
2020-04-08 10:54:23 -04:00
Jeremy Apthorp
a1d039c0a8 chore: cherry-pick b5950ad76471 from chromium (#22946) 2020-04-07 11:33:43 -07:00
trop[bot]
63b6f49d1f build: set merge=union for .patches (#22989)
Co-authored-by: Jeremy Apthorp <nornagon@nornagon.net>
2020-04-07 09:55:14 -07:00
Jeremy Apthorp
bdabef56d4 chore: cherry-pick db71a0afc1d0 from chromium (#22944)
* chore: cherry-pick db71a0afc1d0 from chromium

* fixup patch
2020-04-03 09:16:54 -07:00
Jeremy Apthorp
6c90f5c73a chore: cherry-pick fd211b44535c from chromium (#22870) 2020-04-01 11:00:38 -07:00
Samuel Attard
bc6cc1a1f9 Revert "fix: better window hierarchy checks"
This reverts commit bdd19d9b28.
2020-03-23 19:36:39 -07:00
Electron Bot
4f8bc49ea0 Revert "Bump v6.1.10"
This reverts commit b945793011.
2020-03-23 15:53:05 -07:00
Electron Bot
b945793011 Bump v6.1.10 2020-03-23 15:26:54 -07:00
Electron Bot
78d92f5349 Revert "Bump v6.1.10"
This reverts commit 19c0ff75fc.
2020-03-23 14:45:17 -07:00
Electron Bot
19c0ff75fc Bump v6.1.10 2020-03-23 14:19:48 -07:00
Samuel Attard
bdd19d9b28 fix: better window hierarchy checks 2020-03-23 14:09:20 -07:00
Electron Bot
26ee9476de Bump v6.1.9 2020-02-27 16:06:08 -08:00
Jeremy Apthorp
2c01ed5529 fix: OOB access in ReadableStream::Close (#22436)
* fix: OOB access in ReadableStream::Close

* fix patches
2020-02-27 15:53:28 -08:00
Samuel Attard
2b3d4b4cdf fix: backport v8 patch for type inference issue (#22429) 2020-02-27 14:06:03 -08:00
Jeremy Apthorp
3b4c04dbaf fix: backport fix for icu crash (#22422) 2020-02-27 13:34:28 -08:00
trop[bot]
3b1a452406 ci: update to CircleCI v2 config and APIs (#22330)
* build: update release build endpoint from /jobs to /job (#21232)

(cherry picked from commit 41f1569c46)

* chore: workflows and pipeline state were split in the circle API (#21441)

(cherry picked from commit ec0edb757a)

* ci: Update to CircleCI v2 config and APIs

This reverts commit e6807b387c.

* fixup config.yml

* Add needed script

* Fixup circleci config

* Partial backport of e9114b3c00

Needed for v2 circleci changes.

* Manually run update-external-binaries.py

* Use new cache key

* Move update external binaries to separate step

* Fix debug builds

* Download external binaries for release

Co-authored-by: Samuel Attard <samuel.r.attard@gmail.com>
Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-02-26 14:04:06 -08:00
Robo
062c3ec700 fix: crash in seccomp-bpf sandbox with glibc 2.31 (#22339)
* fix: crash with seccomp-bpf sandbox on linux with glibc 2.31

Backports https://chromium-review.googlesource.com/c/chromium/src/+/1935715

* ci: trigger
2020-02-26 10:52:33 -08:00
Electron Bot
e5966bad8a Bump v6.1.8 2020-02-21 05:27:02 -08:00
John Kleinschmidt
2156a6b23c ci: fix ELECTRON_OUT_DIR (#22314)
(cherry picked from commit 1dcc9bf46b)

Co-authored-by: Jeremy Apthorp <nornagon@nornagon.net>
2020-02-20 20:53:12 -05:00
John Kleinschmidt
38ed0e5a47 Revert "Bump v6.1.8"
This reverts commit 831e060caf.
2020-02-20 19:22:28 -05:00
Electron Bot
831e060caf Bump v6.1.8 2020-02-20 14:30:33 -08:00
trop[bot]
a7ddb0ea45 build: only strip binaries on linux (#22287)
Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-02-19 18:26:30 -05:00
trop[bot]
9b52ee4e86 build: preserve timestamps when stripping files (#22094) (#22260)
* build: preserve timestamps when stripping files

Resolves an issue where the binaries in mksnapshot.zip were not getting stripped.

Co-authored-by: Jeremy Apthorp <nornagon@nornagon.net>
(cherry picked from commit 5e49aafe55)

Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-02-18 14:36:19 -05:00
trop[bot]
6773a51ec3 ci: strip mksnapshot binaries on Linux (#22226)
Related to #21086.

Co-authored-by: Alexey Kuzmin <alex.s.kuzmin@gmail.com>
2020-02-18 12:51:51 -05:00
trop[bot]
2327947ed6 fix: don't include breakpad_symbols dir in dsym.zip (#22219)
Co-authored-by: John Kleinschmidt <jkleinsc@github.com>
2020-02-18 12:22:22 -05:00
Shelley Vohr
dca6516c10 fix: crash when restoring minimized hidden window (#22153) 2020-02-12 21:54:38 +00:00
Shelley Vohr
f27fde70ef fix: highlight buttons correctly when defaultId passed (#22150) 2020-02-11 23:42:38 +00:00
Shelley Vohr
1498f7c24b fix: keep references to active menus created by api Menu (#22152)
Without this such menus would be destroyed by js garbage collector even
when they are still displayed.

Co-authored-by: CezaryKulakowski <50166166+CezaryKulakowski@users.noreply.github.com>
2020-02-11 19:42:35 +00:00
Erick Zhao
dde1ddade9 fix: fire close event upon closing modal BrowserWindow in macOS (#19014) (#22125)
* fix: emit close event from modal on macOS

* fix: Move fn call to correct spot

* refactor: call notify fn directly
2020-02-10 14:08:10 -08:00
trop[bot]
2ca6450c73 fix: About Panel credits should be dark mode aware (#21925)
* fix: about panel credits should be dark mode aware

* use textColor for automatic adaptability

Co-authored-by: Shelley Vohr <codebytere@github.com>
2020-01-28 17:05:13 +09:00
Shelley Vohr
e020754249 fix: window.print() only working once (#21913) 2020-01-28 09:45:58 +09:00
Robo
15ea59bbb3 fix: font rendering with hi-dpi display transitions on Catalina (#21878)
* fix: font rendering with hi-dpi transitions on Catalina

Backports https://chromium-review.googlesource.com/c/chromium/src/+/1902508

* chore: update patches
2020-01-27 15:30:26 -08:00
Cheng Zhao
7a65aebcfd fix: call SetCanActivate in setFocusable (#21856) 2020-01-22 14:45:15 +09:00
Robo
dffecfaf59 Fix memory leak in generator functions (#21774)
Backports https://chromium-review.googlesource.com/c/v8/v8/+/1967317
2020-01-15 09:57:20 +09:00
Milan Burda
eff5cee15b fix: load window-setup in sandboxed renderer (#21697) 2020-01-13 10:24:44 +09:00
Shelley Vohr
03d5ae2f93 fix: MediaKey globalShortcuts not working on macOS (#21690) 2020-01-10 12:45:41 -08:00
trop[bot]
b142266292 fix: Notification crash in before-quit (#21718) 2020-01-10 09:07:50 -08:00
trop[bot]
7dd6a185db refactor: throw error for getLastCrashReport if crashReporter not started (#21684) 2020-01-07 09:15:31 -05:00
Electron Bot
47ee65c66c Bump v6.1.7 2019-12-16 16:40:10 -08:00
Milan Burda
530fc1e2a4 refactor: export internalWindowOpen from guest-window-manager (#21498) (#21543) 2019-12-16 16:38:06 -08:00
Milan Burda
32aca15962 fix: enforce parent-child relationship in custom postMessage() handler (#21529) 2019-12-16 08:13:17 -08:00
trop[bot]
8c531ed424 fix: quit after Chromium is fully started (#21506)
* fix: quit when chromium is fully started

* test: remove hacks on app.quit

* chore: RunUntilIdle is unnecessary
2019-12-16 09:45:12 +09:00
Cheng Zhao
cbe447e27a fix: disable more private macOS APIs in MAS build (6-1-x) (#20970)
* fix: add patch to disable remote layer APIs

* fix: add patch to disable remote accessibility APIs

* fix: add patch to disable private window frame APIs

* fix: add patch to disable NSURLFileTypeMappings API
2019-12-13 11:18:15 +09:00
Electron Bot
19c705ab80 Bump v6.1.6 2019-12-11 08:30:56 -08:00
trop[bot]
42b4433fe4 fix: restore accessibility window title on macOS (#21465)
Electron's `AtomNSWindow` implements `accessibilityAttributeValue` to
provide various accessibility info to the OS, including window titles.

Chromium 75 changed to Apple's newer accessibility API for window titles
in the super class that `AtomNSWindow` inherits from. macOS still
supports both the old and new style APIs, but it will prefer the new
style if it is implemented.  This means the Electron window title is
being ignored because the newer API at the Chromium level has taken
precedence.

By implementing the newer accessibility API in `AtomNSWindow`, this
restores correct accessibility window titles in macOS Electron apps.

This is a regression has been present since Electron 6.0.0 (the first
release including the Chromium change above).
2019-12-10 21:05:04 -05:00
Milan Burda
8c8d3d2974 chore: remove unused shell/common/crash_reporter/win/crash_service.cc (#21349) (#21378) 2019-12-10 10:02:01 +09:00
Birunthan Mohanathas
5c0319e00e fix: Fix compositor recycling when creating new BrowserView (6-1-x) (#21396)
Backport of #21372. This also backports a tiny bit of #19988.

Notes: Fix flicker when switching between BrowserViews after creating new BrowserView
2019-12-06 11:35:26 -08:00
trop[bot]
9743d70131 fix: backgroundThrottling rwh assignment (#21359)
* fix: backgroundThrottling rwh assignment

* fix: disable DOM timer throttling

* chore: fix typo
2019-12-02 18:36:55 -08:00
Jeremy Apthorp
ba2841ccee ci: generate debug symbols on Linux (#18676) (#21280) 2019-11-27 16:39:46 +09:00
Electron Bot
6f62f91822 Bump v6.1.5 2019-11-20 15:42:47 -08:00
John Kleinschmidt
469d1cc1d6 ci: use system python to download external binaries (#21234)
* ci: use system python to download external binaries on MacOS

* ci: manually download external binaries for all OS
2019-11-20 18:36:50 -05:00
Cheng Zhao
0b2c61a10f fix: retain menu when popuping (#21226) 2019-11-20 14:02:21 -05:00
trop[bot]
3e52002406 spec: skip flaky <webview>.capturePage() test on Windows (#21210) 2019-11-20 12:17:46 -05:00
Robo
86755f4353 fix: focus with OOPIF embedded inside <webview> (#21221) 2019-11-20 09:05:18 -08:00
John Kleinschmidt
25c87c0c26 build: use older depot_tools for 6-1-x (#21184) (#21215)
* build: use python3 to download external binaries (#21184)

* build: use python3 to download external binaries

* Update config.py

(cherry picked from commit d34ba76eb6)

* update for python3

* Update all the print

* Revert "build: use python3 to download external binaries (#21184)"

This reverts commit 0f4ebda10f.

* Revert "Update all the print"

This reverts commit 64a423bdbe.

* Revert "update for python3"

This reverts commit 349ccafa43.

* Use older depot_tools for 6-1-x
2019-11-19 23:17:59 -08:00
Robo
1f64aaf171 fix: disable Touch Bar typing suggestions with autocorrect=off and spellcheck=false (#21191)
Backports https://chromium-review.googlesource.com/c/chromium/src/+/1917603
and relevant bits from https://chromium-review.googlesource.com/c/chromium/src/+/1652661
2019-11-19 14:31:20 -05:00
Robo
7a5e281ae1 fix: allow chromium to handle WM_NCCALCSIZE for frameless windows (#21164) (#21206) 2019-11-19 13:27:14 -05:00
Robo
511bfd226c fix: crash with v8 Data.toLocale* api with inavlid locales (#21188)
Backports https://chromium-review.googlesource.com/c/v8/v8/+/1769479
2019-11-18 21:35:45 -08:00
Robo
73b97d6109 fix: backport libuv patch for uv_spawn() ENOMEM on empty env (#21141) 2019-11-18 10:19:38 -08:00
Robo
bd96771ea9 fix: incorrect size of windows on differently scaled monitors (#21137)
* Revert "fix: handle WM_GETMINMAXINFO instead of letting chromium do it (#19928) (#20001)"

This reverts commit fb82bfa707.

* fix: don't reset the width and height when correcting window placement
2019-11-18 09:58:29 -08:00
Milan Burda
988c57369a fix: NativeImage serialization of <webview>.capturePage() result (#20825) (#21105) 2019-11-14 10:36:07 +00:00
loc
3d10d4c7e0 fix: allow iframe-initiated HTML fullscreen to exit while in macOS fullscreen (6-1-x) (#21020)
* fix: explicitly resize the contents when exiting html fullscreen while in OS fullscreen

* test: ensure HTML fullscreen toggles while in OS fullscreen
2019-11-07 10:30:37 -05:00
trop[bot]
503c86bf89 fixes widget host fetching from render view host (#21014) 2019-11-06 16:22:59 -08:00
trop[bot]
66ee417697 fix: Fix broken globalShortcuts.registerAll() on non-macOS platforms (#20982)
This was a regression in #16125, which unintentionally put
`GlobalShortcutListener::RegisterAccelerator` into a
`#if defined(OS_MACOSX)` block.

Notes: Fix broken `globalShortcut.registerAll()` on Windows and Linux
2019-11-06 13:37:57 -08:00
Electron Bot
a5b474e824 Bump v6.1.4 2019-11-04 16:13:02 -08:00
Robo
1591e1320a fix: backport patch for webaudio (#20924)
* fix: backport patch for webaudio

* chore: update patches
2019-11-01 16:34:07 -07:00
Electron Bot
4c25b619a6 Bump v6.1.3 2019-11-01 08:58:29 -07:00
trop[bot]
c2c25f1ee3 build: do not try to run non existent VSTS release builds (#20876) 2019-10-31 10:55:28 -04:00
John Kleinschmidt
8cf8c8fe63 docs: Update the sccache name (#20462) (#20862)
(cherry picked from commit b3e7657159)
2019-10-31 09:55:39 +09:00
Birunthan Mohanathas
61fdda3e8f fix: Disable compositor recycling only for attached views (6-1-x) (#20834)
Backport of #20829

Notes: Fix flicker when switching between `BrowserView`s
2019-10-30 16:55:30 -04:00
Milan Burda
4a5f89d5c7 fix: properly generate requestID in webContents.printToPDF() (#20769) (#20811) 2019-10-30 14:38:09 +09:00
Milan Burda
36fd0e9b37 fix: pass frameId to v8Util.setRemoteCallbackFreer() (#20732) (#20815) 2019-10-30 14:36:06 +09:00
Milan Burda
512736542b fix: send ELECTRON_BROWSER_CONTEXT_RELEASE asynchronously (#20632) (#20716) 2019-10-29 11:34:11 +09:00
Shelley Vohr
b144900c00 fix: prevent menu gc during popup (#20786) 2019-10-28 18:35:58 -07:00
Electron Bot
dabaa7557a Bump v6.1.2 2019-10-24 12:06:16 -07:00
trop[bot]
c6a794d738 chore: update build_bring_back_node_with_ltcg_configuration.patch (#20709)
* chore: update build_bring_back_node_with_ltcg_configuration.patch

set default value for node_with_ltcg=true

* fix: move ltcg definition to Release configuration
2019-10-23 16:33:38 -07:00
Electron Bot
aa863bc323 Bump v6.1.1 2019-10-23 11:13:59 -07:00
Jeremy Apthorp
e3a79d6c52 fix: properly free remote objects (6-1-x) (#20694) 2019-10-23 10:31:59 -07:00
loc
14ba3ac63e chore: remove unused member variable (#20690) 2019-10-23 09:12:18 +09:00
loc
6a07825c47 fix: don't hang on SendSync if ElectronBrowser receiver is destroyed (6-0-x) (#20547) 2019-10-22 14:29:10 -07:00
Electron Bot
70b5e673bb Bump v6.1.0 2019-10-21 15:45:49 -07:00
trop[bot]
6359db712a fix: backport libuv patch for fs.mkdir/mkdirSync on invlaid names (#20665)
Backports https://github.com/libuv/libuv/pull/2375
2019-10-21 15:44:05 -07:00
Samuel Attard
268cd3939c feat: add a new contextBridge module (#20639)
* feat: add a new contextBridge module (#20307)

* feat: add a new contextBridge module

* chore: fix docs linting

* feat: add support for function arguments being proxied

* chore: ensure that contextBridge can only be used when contextIsolation is enabled

* docs: getReverseBinding can be null

* docs: fix broken links in md file

* feat: add support for promises in function parameters

* fix: linting failure for explicit constructor

* Update atom_api_context_bridge.cc

* chore: update docs and API design as per feedback

* refactor: remove reverse bindings and handle GC'able functions across the bridge

* chore: only expose debugGC in testing builds

* fix: do not proxy promises as objects

* spec: add complete spec coverage for contextBridge

* spec: add tests for null/undefined and the anti-overwrite logic

* chore: fix linting

* spec: add complex nested back-and-forth function calling

* fix: expose contextBridge in sandboxed renderers

* refactor: improve security of default_app using the new contextBridge module

* s/bindAPIInMainWorld/exposeInMainWorld

* chore: sorry for this commit, its a big one, I fixed like everything and refactored a lot

* chore: remove PassedValueCache as it is unused now

Values transferred from context A to context B are now cachde in the RenderFramePersistenceStore

* chore: move to anonymous namespace

* refactor: remove PassValueToOtherContextWithCache

* chore: remove commented unused code blocks

* chore: remove .only

* chore: remote commented code

* refactor: extract RenderFramePersistenceStore

* spec: ensure it works with numbered keys

* fix: handle number keys correctly

* fix: sort out the linter

* spec: update default_app asar spec for removed file

* refactor: change signatures to return v8 objects directly rather than the mate dictionary handle

* refactor: use the v8 serializer to support cloneable buffers and other object types

* chore: fix linting

* fix: handle hash collisions with a linked list in the map

* fix: enforce a recursion limit on the context bridge

* chore: fix linting

* chore: remove TODO

* chore: adapt for PR feedback

* chore: remove .only

* chore: clean up docs and clean up the proxy map when objects are released

* chore: ensure we cache object values that are cloned through the V8 serializer

* docs: mark contextBridge as experimental (#20638)

* docs: mark contextBridge as experimental

This commit didn't make it to the original PR, quick addition here

* Update context-bridge.md

* chore: touch up the differences between master and 6-0-x

* chore: add v8 serializer converter, cherry picked from 2fad53e66b

* chore: support converting OnceCallback to V8 (#17941)

* chore: fixup tests

* chore: fix linting

* chore: add patch for mojo message constructor
2019-10-21 13:58:03 -07:00
Samuel Attard
3ca62d9432 chore: manually bump version to 6.1.0-beta.0 in prep for 6.1.0 2019-10-21 13:01:18 -07:00
Milan Burda
9901700a91 test: skip desktopCapturer / remote module tests when the features are disabled (#20566) (#20577) 2019-10-21 15:40:21 -04:00
Robo
d5b088bc26 fix: add patch to node for native module size issue on windows (#20614) (#20627) 2019-10-18 12:57:08 -04:00
trop[bot]
a12de693b0 ci: add macOS debug builds (#20572)
* ci: add macOS debug builds

* Fix mac debug builds

* Remove ninja status as it is not available in 6-0-x
2019-10-15 09:14:25 -07:00
trop[bot]
e257981a6d spec: allow "Yu Gothic" as a Japanese sans-serif font on Windows (#20569) 2019-10-14 12:38:01 -07:00
Milan Burda
ffb96acab0 fix: when building with enable_plugins=false (#20354) (#20508) 2019-10-10 14:12:28 +02:00
Robo
fd0b57f219 fix: backport chromium patches to fix touchpad scrolling on windows (#20488)
Backports https://chromium-review.googlesource.com/c/chromium/src/+/1689922
and https://chromium-review.googlesource.com/c/chromium/src/+/1753661
2019-10-09 13:41:06 -07:00
Electron Bot
1e50380fab Bump v6.0.12 2019-10-08 12:43:31 -07:00
trop[bot]
31ba6c203e fix: properly free IsolateData in node_main (#20475) 2019-10-08 15:33:32 -04:00
Shelley Vohr
03d16f37d2 fix: enable worker threads in ELECTRON_RUN_AS_NODE (#20457) 2019-10-08 11:59:28 -04:00
Robo
e501930d38 fix: fs.watch() behavior change in node >= 10.16.0 (#20429)
This reverts the patch from https://github.com/electron/node/pull/100
which never got merged due to reasons outlined in https://github.com/libuv/libuv/pull/2313

* Adds new patches that backports https://github.com/libuv/libuv/pull/2459
  and https://github.com/libuv/libuv/pull/2460

Based on https://github.com/nodejs/node/issues/29460
2019-10-07 13:05:14 -07:00
Joshua Westerheide
28eb7b0532 feat: add env variable to skip binary download on npm install (backport) (#20438)
* feat: add env variable to skip binary download on npm install

* docs: add "Skip binary download" section to install tutorial
2019-10-07 13:04:00 -04:00
Shelley Vohr
15e611a0ff docs: clarify dock.bounce usage (#20458) 2019-10-07 17:15:48 +02:00
trop[bot]
3176e323e4 fix: recentDocuments menu role on macOS (#20409) 2019-10-03 08:59:09 +02:00
Milan Burda
99a0581d0d fix: allow paths to asar archives to contain the .asar extension in directories (#20342) (#20402) 2019-10-02 18:03:18 +09:00
Electron Bot
4e417e21b8 Bump v6.0.11 2019-10-01 12:08:35 -07:00
trop[bot]
e472efbea2 fix: correctly crash when there is no crashReporter (#20396)
* fix: correctly crash when there is no crashReporter

* test: correctly crash when there is crashReporter
2019-10-01 15:06:23 -04:00
Birunthan Mohanathas
886e636b13 fix: Make the --disable-color-correct-rendering switch work again (backport) (#20358) 2019-09-30 10:46:41 -07:00
trop[bot]
0450ee9524 fix: correct 'Entire screen' to ' Entire Screen' (#20301) 2019-09-20 07:44:21 -07:00
trop[bot]
ce31dc3591 ci: actually kill leftover processes on WOA testing (#20292)
* ci: only kill WOA processes if they are running

(cherry picked from commit 844752cd97)

* ci: actually kill leftover processes on WOA testing

(cherry picked from commit a76d2d8e53)
2019-09-20 10:20:19 -04:00
Shelley Vohr
15c89c8262 fix: crash when exiting simple fullscreen on macOS (#20144) (#20282) 2019-09-19 14:29:35 -04:00
Shelley Vohr
dbd72b2265 docs: improve and add examples for clipboard (#20224) (#20283)
* docs: improve and add examples for clipboard

* address feedback from jkleinsc review
2019-09-19 09:57:09 -04:00
Electron Bot
10a9e9c043 Bump v6.0.10 2019-09-18 12:48:43 -07:00
trop[bot]
690271e38c build: add WOA node headers to checksum file (#20260) 2019-09-18 10:21:46 -07:00
trop[bot]
fc7ef4cc1c fix: strip chrome-sandbox typo (#20257) 2019-09-18 09:43:52 -07:00
Samuel Attard
f2d1abd0e3 fix: Add more checks in MojoCdmService. (#20219)
Applies b7b305f338%5E%21/
2019-09-17 13:53:04 -04:00
Samuel Attard
e3be323962 docs: remove dash that broke the return type parser (#20246) 2019-09-17 10:49:07 -04:00
Electron Bot
407747b48c Bump v6.0.9 2019-09-11 10:30:11 -07:00
trop[bot]
17b8b551ac build: handle arm64 node headers (#20194)
* build: handle arm64 node headers

(cherry picked from commit ff1f224d96)

* node.lib for arm64 needs to go to specific dir
2019-09-10 21:56:07 -04:00
Electron Bot
4bcbe55828 Bump v6.0.8 2019-09-09 09:12:33 -07:00
trop[bot]
8f84626531 build: get all the release assets when looking for one to delete (#20165)
* build: get all the release assets when looking for one to delete

yeah we totally have more than 30....

* Update upload-to-github.js
2019-09-09 09:10:04 -07:00
Electron Bot
69d3a694f4 chore: bump chromium in DEPS to 76.0.3809.146 (#20149) 2019-09-06 09:11:54 -07:00
trop[bot]
3925c098fb fix: ensure modeL_ exists before calling delegate methods (#20115)
This is a speculative fix for a crash we are seeing in `menuDidClose`.  We
can't repro the crash but the traces have it happening in this method
and just by reading through the impl the only part that jumps out as
Might Crash is this `model_` call.  Other methods in the menu controller
check `model_` before using it so it probably makes sense to do that here
as well.
2019-09-06 07:54:38 -07:00
trop[bot]
75dd6e5a71 build: don't wait until job requests return in case some jobs fail to return (#20135) 2019-09-05 14:01:25 -04:00
Electron Bot
204c111da1 chore: bump chromium in DEPS to 76.0.3809.145 (#20130) 2019-09-05 10:30:17 -07:00
John Kleinschmidt
ed9b96ce9e ci: test on woa hardware (6-0-x) (#20092)
* ci: test on woa hardware

* ci: run tests on WOA hardware (#20031)

* ci: run tests on WOA hardware

* Temporarily disable test until #20008 is resolved

* deterministically run tests in sorted order

(cherry picked from commit bedc5f7da9)

* Disable test on WOA until #20008 is resolved

* use request instead of blur to detect openExternal success

* use blur event on mac, sigh

* oh, right, still gotta open an actual url

* Try to track down GPUinfo failure

* Make function async

* Check exitCode

* Try to resolve bad exit code on GPUInfo test

* Add logging to figure out failures on BrowserWindow.moveTop()

* Revert "Add logging to figure out failures on BrowserWindow.moveTop()"

This reverts commit e21ace30dc.

* Disable test until #20110 is resolved

* fix lint issue
2019-09-04 19:22:38 -04:00
Eugene
0f27712e8f fix: allow unsandboxed renderers to request new privileges (6-0-x) (#20023) 2019-09-04 14:53:19 -07:00
trop[bot]
b2da0b883d build: add WOA release to list of releases (#20113)
* build: add WOA release to list of releases

* Add job count info for sudowoodo

* Add verification of all assets

* Fix linting and add logic to wait before printing out results
2019-09-04 14:32:50 -07:00
Robo
4662ab9b63 fix: crash with --inspect-brk when running under ELECTRON_RUN_AS_NODE (#20098)
* fix: ensure that the node env is not bootstrapped before running inspector

* fix: ensure we wait for the inspect to disconnect

This re-orders our node clean up so that we free the environment before
the task runner is cleaned up as node uses the task runner during clean
up.  It also calls WaitForDisconnect() to ensure that inspector agents
are notified that the context is going down.

* chore: update spec to catch SIGABRT
2019-09-04 12:45:50 -07:00
Electron Bot
e070bd7bdb chore: bump chromium in DEPS to 76.0.3809.144 (#20108) 2019-09-04 08:24:33 -07:00
trop[bot]
a8ec0de153 Revert "fix: make sure that menu bar gets focus even when you click an item to focus it first (#19710)" (#20035)
This reverts commit 27b2747b61.
2019-09-03 23:19:26 -07:00
Electron Bot
34c6e05a82 chore: bump chromium to 76.0.3809.143 (6-0-x) (#20061)
* chore: bump chromium in DEPS to 76.0.3809.140

* chore: bump chromium in DEPS to 76.0.3809.141

* chore: bump chromium in DEPS to 76.0.3809.142

* chore: bump chromium in DEPS to 76.0.3809.143
2019-09-03 17:01:43 -07:00
trop[bot]
97798a4aad fix: strip chrome_sandbox executable (#20081) 2019-09-03 09:49:07 -07:00
trop[bot]
837948759f fix: honor cursor blink rate (#20046)
* fix: honor cursor blink rate on macOS

* fix: honor cursor blink rate on Linux

* fix: honor cursor blink rate on Windows

* refactor: clean up os_win cursor blink logic

* remove unneeded include
2019-09-03 16:22:25 +09:00
Electron Bot
8b6fa783f4 Bump v6.0.7 2019-08-30 16:48:26 -07:00
trop[bot]
ed7ae42c10 fix: ensure that the "top" coordinate of the inner frame is correct (#20052)
On multi-monitor setups where the monitors are not all origined at 0 on
the Y coordinate (E.g. vertical stacked monitors) the maximize
calculation was incorrect as it assumed top was "0".  This instead
adjusts the math to calculate the correct top value.
2019-08-30 16:44:51 -07:00
Electron Bot
828038d5f6 chore: bump chromium in DEPS to 76.0.3809.139 (#20042) 2019-08-30 15:15:54 -07:00
Electron Bot
f1a914c0ba Bump v6.0.6 2019-08-29 13:38:36 -07:00
Electron Bot
5eff97c890 chore: bump chromium in DEPS to 76.0.3809.138 (#20024) 2019-08-29 08:59:51 -07:00
Charles Kerr
0039e604a2 fix: i18n of gtk msgbox buttons (#20007)
* fix: i18n of gtk msgbox buttons

Manually backport #19904. See that PR for details.

* fix: make linter happy

* fix: make linter happy
2019-08-29 15:54:31 +09:00
Electron Bot
26176eb108 chore: bump chromium in DEPS to 76.0.3809.137 (#20004) 2019-08-28 08:11:47 -07:00
Heilig Benedek
fb82bfa707 fix: handle WM_GETMINMAXINFO instead of letting chromium do it (#19928) (#20001)
* fix: remove WM_GETMINMAXINFO workaround since it's no longer needed

* fix: handle WM_GETMINMAXINFO ourselves

* fix: remove part of the chromium WM_GETMINMAXINFO handler
2019-08-28 09:32:26 -05:00
Electron Bot
9b724dca49 Bump v6.0.5 2019-08-27 11:39:08 -07:00
Shelley Vohr
b52a2aedf1 fix: add default media usage strings to info.plist (#19949) 2019-08-27 11:37:04 -07:00
Electron Bot
8e671dafc1 chore: bump chromium in DEPS to 76.0.3809.136 (#19981) 2019-08-27 08:33:46 -07:00
Richard Townsend
0491abf4cc fix: work around a null scoped_ptr dereference (#19366)
This happens occasionally when running the test suite and indicates
that the callback's been reset or the underlying reference has been
released. To workaround, print a warning.
2019-08-27 10:57:18 -04:00
Jaime Bernardo
1655976841 fix: extern Parse impl for Windows debug builds (#19958)
Applies a patch to node.
Externs node::options_parser::Parse implementation for
node::DebugOptions to fix the Windows Debug build.
2019-08-27 07:53:52 -07:00
trop[bot]
0b5a7379f2 fix: don't call SetBounds on restore (#19956) 2019-08-27 07:51:59 -07:00
trop[bot]
a5ed8fb65e fix: ensure that reloads retain modified window background colors (#19973) 2019-08-27 07:50:39 -07:00
Richard Townsend
bb631892b2 fix: crash reporting on Windows on Arm (#19391)
* feat: cherry-pick V8 unwinding support

This commit backports [1] (originally written by @ThomsonTan) into V8
7.6. With this patch in place, calls made from JS into the atom core
which crash electron.exe will now generate crash dumps on Windows on
Arm rather than silently dying.

[1] https://chromium-review.googlesource.com/c/v8/v8/+/1701133/11

* feat: backport crashpad cpu capture context

Backport of [1] (originally written by @kaadam) to Chromium 76's
crashpad. This lets you see the register values within the crash dump.

[1]
https://chromium-review.googlesource.com/c/crashpad/crashpad/+/1632749

* build: make win on arm patches only apply for win on arm builds

* Update .patches

* Update .patches

* Update DEPS

* fix: update the patch to the as-landed version

* fix: remove accidental revert of crashpad_pid_check.patch
2019-08-27 10:43:27 -04:00
Heilig Benedek
64026ded95 fix: adjust window size in NCCALCSIZE instead of adding insets (#19944) 2019-08-26 10:07:35 -07:00
Electron Bot
e6178f83fe chore: bump chromium to 76.0.3809.135 (6-0-x) (#19935)
* chore: bump chromium in DEPS to 76.0.3809.134

* chore: bump chromium in DEPS to 76.0.3809.135
2019-08-26 12:54:19 -04:00
John Kleinschmidt
ee5403d3ec build: start building Windows on Arm builds (#19910)
* build: start building Windows on Arm builds (#19780)

(cherry picked from commit 4bc7b3b1a4)

* Update manifest to include 6-0-x file
2019-08-26 09:54:32 -04:00
trop[bot]
6b77e2ee14 fix: command-line scheme switch values' spillover (#19940) 2019-08-25 23:03:19 -07:00
Electron Bot
075b085cb4 chore: bump chromium in DEPS to 76.0.3809.133 (#19922) 2019-08-25 00:30:02 -07:00
Electron Bot
cbd017572a Bump v6.0.4 2019-08-23 14:06:09 -07:00
Samuel Attard
3f0c863225 Revert "Bump v6.0.4"
This reverts commit 783614a94c.
2019-08-23 14:04:46 -07:00
trop[bot]
a459cee938 build: use a lower process count for publish builds with no sccache (#19915) 2019-08-23 14:01:55 -07:00
Electron Bot
783614a94c Bump v6.0.4 2019-08-23 12:05:24 -07:00
Cheng Zhao
db1395628a fix: notify views of content view size change (#19888) 2019-08-23 12:02:54 -07:00
Shelley Vohr
5e33a5e778 fix: ensure child_process.fork() doesn't modify main process env (#19845) 2019-08-23 12:01:46 -07:00
Electron Bot
ce502b19ba chore: bump chromium in DEPS to 76.0.3809.131 (#19909) 2019-08-23 12:41:29 -04:00
Samuel Attard
1cfd7160dc fix: remove white screen flicker by disabling compositor recycling (#19900) 2019-08-23 01:14:39 -07:00
Electron Bot
339174dca0 chore: bump chromium in DEPS to 76.0.3809.130 (#19885) 2019-08-22 10:54:35 -07:00
Electron Bot
6964a8cd72 chore: bump chromium in DEPS to 76.0.3809.129 (#19864) 2019-08-21 11:18:27 -07:00
trop[bot]
51a97917e0 build: ninja count should be 2*cores + 2 (#19867) 2019-08-21 08:53:03 -07:00
trop[bot]
3ca1cd4dd4 fix: trim branch name before comparing to master (#19856) 2019-08-20 20:11:52 -07:00
trop[bot]
c2c0ee7a73 docs: update documentation under tutorials (#19843) 2019-08-20 11:08:51 -07:00
Electron Bot
739f620152 chore: bump chromium in DEPS to 76.0.3809.128 (#19840) 2019-08-20 08:28:04 -07:00
Electron Bot
fb379c3b6a Bump v6.0.3 2019-08-19 14:23:16 -07:00
Electron Bot
237688abb3 chore: bump chromium to 76.0.3809.126 (6-0-x) (#19791)
* chore: bump chromium in DEPS to 76.0.3809.123

* chore: bump chromium in DEPS to 76.0.3809.124

* chore: bump chromium in DEPS to 76.0.3809.125

* chore: bump chromium in DEPS to 76.0.3809.126
2019-08-19 14:20:15 -07:00
Shelley Vohr
94070cec53 ci: upgrades-wg owns DEPS (#19834) 2019-08-19 14:12:33 -07:00
Pedro Pontes
e8ef52bc1d fix: always use new site instance for a new navigation (backport). (#19826) 2019-08-19 13:20:22 -07:00
Micha Hanselmann
2f9876a3f9 docs: add exemplary fiddle for launch in fiddle feat (#19759) (#19786)
* add fit-screen

* new url format

* nit
2019-08-19 13:10:29 -07:00
Samuel Attard
5ca94a8715 fix: disable LayoutNG to prevent random crashes in selection calcuations (#19808)
* fix: disable LayoutNG to prevent random crashes in selection calcuations

* Update atom_browser_main_parts.cc
2019-08-16 17:01:29 -07:00
trop[bot]
ffd1d6d8ad docs: add missing return desc (#19799) 2019-08-16 13:26:19 -07:00
trop[bot]
33c86527e8 MessageBoxOptions.icon should allow string (#19798) 2019-08-16 13:25:41 -07:00
Charles Kerr
871f123080 fix: i18n gtk dialog buttons (#19760)
manual backport of https://github.com/electron/electron/pull/19756
2019-08-16 08:57:54 -07:00
trop[bot]
3dcf66839e fix: make sure that menu bar gets focus even when you click an item to focus it first (#19764) 2019-08-15 10:30:05 -07:00
Electron Bot
78a2237add chore: bump chromium in DEPS to 76.0.3809.120 (#19774) 2019-08-15 10:03:19 -07:00
Richard Townsend
be68c062d7 chore: update the compiler again (#19383)
This WoA-specific change updates the compiler to one that produces
CodeView debug symbols, which means that Visual Studio can display the
values of variables whilst debugging.
2019-08-15 10:08:37 -04:00
Erick Zhao
dbf8872817 fix: normalize behavior of win.setOpacity() for invalid number values across operating systems (#19723)
* fix: normalize behavior of `win.setOpacity()` for invalid number values across operating systems

* expect -> assert

* assert 2

* fix `this` scoping

* fix equality

* tests
2019-08-14 18:10:06 -07:00
Electron Bot
a50e3b3f5f chore: bump chromium in DEPS to 76.0.3809.119 (#19754) 2019-08-14 18:01:18 -07:00
Cheng Zhao
063bcb68f2 chore: revert activation if the uv_loop on incoming IPC messages (#19739)
This reverts commit c0e9761b4b.
2019-08-14 07:55:39 -07:00
Electron Bot
364e8b1a1d chore: bump chromium to 76.0.3809.118 (6-0-x) (#19696)
* chore: bump chromium in DEPS to 76.0.3809.113

* chore: bump chromium in DEPS to 76.0.3809.114

* chore: bump chromium in DEPS to 76.0.3809.115

* chore: bump chromium in DEPS to 76.0.3809.116

* chore: bump chromium in DEPS to 76.0.3809.118
2019-08-13 20:23:28 -07:00
trop[bot]
779f285777 fix: avoid losing focus on inputs when opening menu (Windows/Linux) (#19708)
* remove cause of issue

* remove comment
2019-08-12 20:58:10 -07:00
Electron Bot
4e1a5a210a Bump v6.0.2 2019-08-12 12:53:48 -07:00
Cheng Zhao
98d78f2fb5 fix: don't handle browser messages before document element is created (6-0-x) (#19719)
* fix: don't handle browser messages before document element is created

* fix: bind ElectronApiServiceImpl later

DidCreateDocumentElement is called before the ElectronApiServiceImpl
gets bound.

* chore: add comment
2019-08-12 10:45:36 -07:00
Shelley Vohr
a8e70a8546 docs: update hasShadow for win and linux (#19675) (#19692) 2019-08-12 09:46:02 -07:00
Micha Hanselmann
1ca76e8e74 fix: return correct bounds on will-resize (#19639) (#19704) 2019-08-09 14:51:09 -07:00
Electron Bot
16757d16e7 chore: bump chromium to 76.0.3809.110 (6-0-x) (#19684)
* chore: bump chromium in DEPS to 76.0.3809.110

* Update patches
2019-08-08 13:50:24 -07:00
Shelley Vohr
d2b2b97c29 fix: crash on window.print() (#19677) 2019-08-08 07:52:06 -07:00
Electron Bot
6bc7bc11d8 chore: bump chromium in DEPS to 76.0.3809.108 (#19665) 2019-08-07 13:24:24 -04:00
Electron Bot
f3d4daa9e5 Bump v6.0.1 2019-08-06 14:10:50 -07:00
Erick Zhao
6c0157aa29 fix: handle edge behavior for about panel on Linux (#19635) 2019-08-06 12:45:16 -07:00
Electron Bot
a9e0aa22a4 chore: bump chromium in DEPS to 76.0.3809.102 (#19649) 2019-08-06 11:53:41 -07:00
trop[bot]
56160e990e fix: clearRecentDocuments role on Windows (#19637)
* fix: clear recent documents on windows

* chore: don't check for version < win 7
2019-08-05 20:56:23 -07:00
trop[bot]
ab83309c7a fix: make child windows not crash when ipc messages are received (#19633)
* fix: make child windows not crash when ipc messages are received

This also adds a path forward for apps using child windows with
nodeIntegration to migrate into a non-leaky way of doing it.

1. Ensure that if ipcNative is missing we don't crash rather log that it
is missing
2. Add a hidden option `--enable-node-leakage-in-renderers` (temporary
measure) to allow app devs to opt in to leaking node in child windows
3. Bypasses the Opener() check if renderer process reuse is enabled
(which would prevent the leak anyway)

So the path forward is: it no longer crashes --> folks use the hidden
option --> folks opt in to renderer process reuse.

* Apply suggestions from code review

Co-Authored-By: Jeremy Apthorp <jeremya@chromium.org>

* Update shell/renderer/atom_renderer_client.cc

Co-Authored-By: Jeremy Apthorp <jeremya@chromium.org>
2019-08-05 15:10:52 -07:00
Electron Bot
c474ff101c chore: bump chromium to 76.0.3809.98 (6-0-x) (#19593)
* chore: bump chromium in DEPS to 76.0.3809.95

* chore: bump chromium in DEPS to 76.0.3809.96

* chore: bump chromium in DEPS to 76.0.3809.97

* chore: bump chromium in DEPS to 76.0.3809.98
2019-08-05 12:55:34 -04:00
trop[bot]
54902e848f fix zoom button when alwaysOnTop set (#19351) 2019-08-05 09:06:23 -07:00
Shelley Vohr
7bec7e6cee doc: add missing MenuItem roles (#19329) (#19573) 2019-08-01 14:05:32 -07:00
Shelley Vohr
55224e385e fix: set size of GTK about panel icon (#18957) (#19572) 2019-08-01 14:04:02 -07:00
Shelley Vohr
75fecf4e4f fix: throw on invalid webRequest filters (#19337) (#19570)
Closes #11371.

Previously, we didn't consider the return value of the webRequest URLPattern mate converter, which meant that when the pattern wasn't correctly parsed owing to invalid filter specification users would not be made aware of that fact and would just think that the filtering itself had failed. This corrects that error by moving the business logic of url pattern parsing out of the converter and into the function itself so that granular and specific errors can be thrown.

There's also no real reason that i'm aware of not to allow wider breadth of filters by letting users use a wildcard for effective TLD, so I also overrode that (default for the 1-arg Parse is not to allow that).

Finally, I added some examples of url filter types for users to reference.
2019-08-01 14:03:27 -07:00
Micha Hanselmann
f2f483fedb test: add test for invalid cookie url (#19568) 2019-08-01 14:02:41 -07:00
Micha Hanselmann
5614ae4241 fix: make process.uptime() return the correct time (#19567) 2019-08-01 14:02:24 -07:00
Electron Bot
55abf1f3a1 chore: bump chromium in DEPS to 76.0.3809.94 (#19564) 2019-08-01 12:17:38 -04:00
John Kleinschmidt
0f78f8a66c fix: use WeakPtr to detect deletion (#19560)
(cherry picked from commit 77c24d8b66)
2019-08-01 08:05:45 -07:00
Shelley Vohr
fa4a26a1db fix: throw better error on getPath('logs') (#19514) (#19545) 2019-07-31 15:52:47 -07:00
trop[bot]
7ba29f1fa8 fix: set default dock bounce type (#19546) 2019-07-31 09:42:07 -07:00
Electron Bot
2f148fdaf4 chore: bump chromium in DEPS to 76.0.3809.91 (#19540) 2019-07-31 12:11:11 -04:00
Erick Zhao
19c31c684a docs: update badges (#18955) (#19537) 2019-07-31 08:07:04 -04:00
Electron Bot
c61a20c390 chore: bump chromium in DEPS to 76.0.3809.90 (#19531) 2019-07-30 13:24:55 -07:00
trop[bot]
4ae3031faf fix: remove TLS destruction (#19428)
Building with dchecks_always_on=true in release configuration seems to
introduce flakiness because the TLS is double-freed. Amending the check
seems to fix the flakiness.
2019-07-30 13:12:13 -07:00
Shelley Vohr
72fee2ed78 fix: correctly emit BrowserWindow alwaysOnTop status (#19534) 2019-07-30 11:24:35 -07:00
trop[bot]
cba1a946d5 fix: tray.displayBalloon() does not work with custom icon on Windows (#19528) 2019-07-30 09:22:10 -07:00
trop[bot]
c55bc8106f chore: omit superceded Chromium updates from notes (#19406)
* feat: omit superceded Chromium updates from notes

* chore: simplify changed code
2019-07-29 19:42:06 -07:00
Micha Hanselmann
261f7fd3be i really wanna do this (#19517) 2019-07-29 16:57:14 -07:00
trop[bot]
53894d5ac2 add desc (#19508) 2019-07-29 14:51:36 -07:00
trop[bot]
c006a6db66 fix: clearing of the backgroundColor property on TouchBarButton (#19471) 2019-07-29 14:51:13 -07:00
trop[bot]
a306fdf512 fix: emit swipe event on macOS (#19354) 2019-07-29 14:50:03 -07:00
Electron Bot
825bd6d45e Bump v6.0.0 2019-07-29 11:15:07 -07:00
Milan Burda
922a4d9ba6 fix: refactoring regression in LocationProxy (#19494) 2019-07-29 11:13:00 -07:00
Electron Bot
f20d497f1c chore: bump chromium to 76.0.3809.88 (6-0-x) (#19487)
* chore: bump chromium in DEPS to 76.0.3809.85

* chore: bump chromium in DEPS to 76.0.3809.87

* chore: bump chromium in DEPS to 76.0.3809.88
2019-07-29 10:09:43 -07:00
trop[bot]
855bd92f6e fix: use GetAuraColor to get theme dependant menu bg color (#19505) 2019-07-29 12:52:57 -04:00
trop[bot]
60d36e1b74 fix: remove .pdb from symbol file names (#19504)
* fix: remove .pdb from symbol file names

* Update dump_syms.py
2019-07-29 09:36:48 -07:00
Electron Bot
9788089efb chore: bump chromium to 76.0.3809.83 (6-0-x) (#19450)
* chore: bump chromium in DEPS to 76.0.3809.82

* chore: bump chromium in DEPS to 76.0.3809.83
2019-07-26 16:12:41 -07:00
trop[bot]
c0e9761b4b fix: activate the uv_loop on incoming IPC messages (#19467)
* fix: activate the uv_loop on incoming IPC messages

* chore: guess at a fix for process not being defined
2019-07-26 15:28:49 -07:00
trop[bot]
7e6617be18 spec: don't run codesigning spec on forks (#19433) 2019-07-26 09:33:31 -04:00
John Kleinschmidt
38b6a7bf4f build: unify YARN_VERSION variable usage and ensure CI uses yarn not npm (#19404)
* ci: Use yarn instead of npm for lint

* build: unify YARN_VERSION variable usage and ensure CI uses yarn not npm (#18607)

* build: unify YARN_VERSION variable usage and ensure CI uses yarn not npm

* chore: use a JS helper so that it can work on windows

* chore: make script/yarn without node_modules installed

(cherry picked from commit a45afddb75)
2019-07-24 14:00:43 -04:00
Electron Bot
0aec64960b chore: bump chromium to 76.0.3809.80 (6-0-x) (#19381)
* chore: bump chromium in DEPS to 76.0.3809.78

* chore: update patches

* [Mac] Create a new helper process variant for the GPU.

https://chromium-review.googlesource.com/c/chromium/src/+/1709936

* chore: bump chromium in DEPS to 76.0.3809.80
2019-07-24 10:49:37 -07:00
Electron Bot
eab462f7cf chore: bump chromium to 76.0.3809.77 (6-0-x) (#19357)
* chore: bump chromium in DEPS to 76.0.3809.75

* chore: bump chromium in DEPS to 76.0.3809.76

* chore: bump chromium in DEPS to 76.0.3809.77
2019-07-22 13:09:29 -07:00
Electron Bot
5ccdb8c7cd Bump v6.0.0-beta.15 2019-07-19 13:42:43 -07:00
Electron Bot
dc38746b24 chore: bump chromium in DEPS to 76.0.3809.74 (#19343) 2019-07-19 13:41:16 -07:00
Electron Bot
66c2bd2a02 chore: bump chromium to 76.0.3809.73 (6-0-x) (#19324)
* chore: bump chromium in DEPS to 76.0.3809.73

* build: handle new helper apps for renderer and plugin bundles

* build: update symbol generation logic for all helpers
2019-07-18 21:43:56 -07:00
Samuel Attard
cbfd276917 fix: bootstrap the node environment after we setup the InspectorAgent (#19317) (#19332) 2019-07-18 18:12:28 -07:00
Micha Hanselmann
450a83d0f7 refactor: use NativeTheme dark mode detection on macOS 10.14+ (#19309) 2019-07-17 14:32:11 -07:00
Electron Bot
b7408e61d2 chore: bump chromium in DEPS to 76.0.3809.70 (#19304) 2019-07-17 08:21:23 -07:00
Electron Bot
9d333a72e1 Bump v6.0.0-beta.14 2019-07-17 08:19:14 -07:00
Milan Burda
c5f4fe09aa fix: don't execute preload scripts for internal <iframe> in <webview> (#19260) (#19298) 2019-07-17 08:17:57 -07:00
Samuel Attard
38f2d11c39 feat: update to node 12.4 (#19270) (#19281)
* feat: update to node 12.4 (#19270)

This points our node repo at upstream (nodejs/node) and uses the base node tag as the target ref.  We then use our existing patch system and patch files to apply our changes on top of node.  This unifies how we patch upstream repos and makes our node patches easier to reason, view, understand and most importantly reduce.

This also upgrades Electron 6 to Node 12.4

Notes: Upgraded to Node 12.4

* chore: cherry pick changes required for node 12.4 from #18924
2019-07-16 12:46:12 -07:00
Electron Bot
3c852e79e6 chore: bump chromium in DEPS to 76.0.3809.68 (#19278) 2019-07-16 07:54:42 -07:00
trop[bot]
019e60517f fix: serialize messages being sent over chrome message ports (#19252)
Chrome appears to serialize these messages (see #19070) so we should as
well to be consistent and to avoid bugs with Uint8/16 arrays

Fixes #19070
2019-07-15 22:15:31 -07:00
trop[bot]
fb51509153 fix: <webview> not working in scriptable popups (#19218) 2019-07-16 11:40:51 +09:00
Electron Bot
f3b9f58b7f chore: bump chromium to 76.0.3809.67 (6-0-x) (#19225)
* chore: bump chromium in DEPS to 76.0.3809.64

* chore: bump chromium in DEPS to 76.0.3809.65

* chore: bump chromium in DEPS to 76.0.3809.66

* chore: bump chromium in DEPS to 76.0.3809.67
2019-07-15 14:39:48 -07:00
trop[bot]
a49307bc55 fix: exit non-silently when running as root on Linux (#19255)
* check for sandbox param on root

* add IsSandboxEnabled
2019-07-15 14:26:56 -05:00
Cheng Zhao
742292f082 fix: do not wait on promise returned by remote APIs (6-0-x) (#19190)
* fix: make <webview>.loadURL async

* docs: webview.loadURL returns Promise
2019-07-15 13:15:17 -05:00
trop[bot]
bb0f4fdbdf fix: add support for prefers-color-scheme CSS query (#19250)
The wiring to update prefs when you toggle between dark mode and light mode exists in the content layer but the actual value setting is done in either //chrome or in shell.  We need to set the preferred_color_scheme pref value in order for the CSS query to work correctly.  The DarkModeObserver in content will automatically regenerate prefs when dark mode is toggled.

Fixes #15540
2019-07-15 07:58:51 -07:00
trop[bot]
5e2ca967c9 chore: revert key -> main change in window delegate listener (#19221)
* chore: revert key -> main

* chore: comment out test that will fail

* more context on commented out test

* remove commented test
2019-07-14 10:55:36 +09:00
trop[bot]
c8029d1696 docs: specify possible values for ProcessMetric.type (#19224) 2019-07-12 17:46:41 -05:00
Electron Bot
08aa86e55e chore: bump chromium to 76.0.3809.63 (6-0-x) (#19195)
* chore: bump chromium in DEPS to 76.0.3809.62

* chore: bump chromium in DEPS to 76.0.3809.63
2019-07-11 14:05:13 -05:00
Micha Hanselmann
825c082535 chore: deprecate setHighlightMode (#19211) 2019-07-11 13:48:39 -05:00
Micha Hanselmann
4a073e4f7e refactor: improve function deprecation module (#19012) (#19199)
* add removeFunction to deprecation module

* clarify deprecate api

* throw error

* change error msg
2019-07-11 17:10:52 +09:00
Electron Bot
adffa99e05 Bump v6.0.0-beta.13 2019-07-10 11:04:56 -07:00
Alexandre Lacheze
51f03033a4 docs: precise that node integration is enabled in natively opened window if nodeIntegrationInSubFrames is true (#19142) 2019-07-10 10:37:28 -05:00
trop[bot]
733251866c fix: use binding.ipc instead of binding.sendTo which is undefined (#19106) 2019-07-10 10:35:55 -05:00
trop[bot]
41a7d9e42b ci: do not use the MOCHA_FILE env variable (#19180)
It is not used in a expected way anyway.
2019-07-10 10:35:35 -05:00
trop[bot]
ddbbf34433 remove non-existent event (#19169) 2019-07-10 10:34:27 -05:00
Milan Burda
6f65dec6a2 ci: add check for dist zip file changes (#19172) 2019-07-09 16:01:16 -05:00
Electron Bot
a66657112c chore: bump chromium in DEPS to 76.0.3809.60 (#19165) 2019-07-09 12:54:07 -07:00
Jeremy Apthorp
f5c3394930 fix: dump correct breakpad symbols on macOS (#19155) 2019-07-09 09:47:11 +09:00
Electron Bot
84bae64def chore: bump chromium to 76.0.3809.59 (6-0-x) (#19134) 2019-07-08 16:03:40 -07:00
Milan Burda
4185b93abb Revert "feat: only allow bundled preload scripts (#17308)" (#19132)
This reverts commit 8cf15cc931.
2019-07-08 11:33:54 +09:00
trop[bot]
b1e9f50fad fix: check parent-child relationship in canAccessWindow (#19118) 2019-07-05 11:20:08 -07:00
Electron Bot
6bd901d9ca chore: bump chromium to 76.0.3809.56 (6-0-x) (#19111)
* chore: bump chromium in DEPS to 76.0.3809.55

* chore: bump chromium in DEPS to 76.0.3809.56
2019-07-05 11:13:16 -07:00
trop[bot]
1c2b8f8d9a fix: handle no env in externsion world set up (#19105)
Previously when GetEnvironment returned null this extension setup
crashed.
2019-07-03 16:36:30 -07:00
Electron Bot
cb9b288d8b Bump v6.0.0-beta.12 2019-07-03 14:08:45 -07:00
Shelley Vohr
69fe33a2b1 Revert "Bump v6.0.0-beta.12"
This reverts commit 8a285f29ed.
2019-07-03 14:06:12 -07:00
Electron Bot
52b42546ed chore: bump chromium in DEPS to 76.0.3809.54 (#19095) 2019-07-03 08:36:42 -07:00
Electron Bot
8a285f29ed Bump v6.0.0-beta.12 2019-07-02 11:25:31 -07:00
Shelley Vohr
92df6cc36c fix: only check darkMode effectiveAppearance in 10.15 (#19013) 2019-07-02 11:04:30 -07:00
Electron Bot
ab91656148 chore: bump chromium in DEPS to 76.0.3809.52 (#19079) 2019-07-02 10:44:16 -07:00
Electron Bot
1fb1e5b2b2 Revert "Bump v6.0.0-beta.12"
This reverts commit 54908b56e5.
2019-07-02 10:17:31 -07:00
Electron Bot
54908b56e5 Bump v6.0.0-beta.12 2019-07-02 10:11:38 -07:00
Shelley Vohr
48bc247ef7 fix: silent printing mode (#19037) 2019-07-02 10:03:00 -07:00
trop[bot]
19d9955125 fix: Correct modal focus behavior on macOS (#19062)
* wip: wish i could hack the main window focus away

* main -> key

* remove useless code

* test: Add focus event spec

* test: more robust spec

* test: simplify test

* duplicate non-firing macOS event listener 😳

* destroy 🚨
2019-07-01 16:39:45 -07:00
Electron Bot
24d79d9e5c chore: bump chromium in DEPS to 76.0.3809.51 (#19057) 2019-07-01 12:14:15 -07:00
Electron Bot
27d0a4d33d chore: bump chromium in DEPS to 76.0.3809.50 (#19054) 2019-06-30 21:38:51 -07:00
Electron Bot
48226f71ad chore: bump chromium to 76.0.3809.49 (6-0-x) (#19030)
* chore: bump chromium in DEPS to 76.0.3809.48

* chore: bump chromium in DEPS to 76.0.3809.49
2019-06-29 18:46:41 -07:00
Shelley Vohr
a4acc16e10 fix: make tray not block main process (#18880) (#18969)
* fix: make tray not block main process

* make AtomMenuModel refcounted
2019-06-28 14:10:45 -05:00
trop[bot]
d8dd94e3a3 fix: delay emitting screen events by a tick to avoid re-entrancy crash (#19022) 2019-06-28 16:23:19 +09:00
Electron Bot
eb48dcf0a3 chore: bump chromium in DEPS to 76.0.3809.47 (#19010) 2019-06-27 16:34:00 -07:00
Samuel Attard
adfe537e32 docs: fix heading level for power-monitor docs (#19015) 2019-06-27 13:21:09 -07:00
Electron Bot
0d5d54cbae chore: bump chromium in DEPS to 76.0.3809.45 (#18991) 2019-06-26 08:47:25 -07:00
Electron Bot
988ad92415 chore: bump chromium in DEPS to 76.0.3809.43 (#18974) 2019-06-25 23:57:02 -07:00
Electron Bot
5dbcdbc3d8 Bump v6.0.0-beta.11 2019-06-25 14:13:13 -07:00
trop[bot]
212c6b1266 fix: override the timers module impls to activate the uv loop (#18961) 2019-06-24 14:22:57 -07:00
trop[bot]
74b06ab677 fix: make isDarkMode correctly detect dark mode in the auto setting on catalina (#18958) 2019-06-24 13:27:35 -07:00
Electron Bot
9a1c952ab6 chore: bump chromium to 76.0.3809.42 (6-0-x) (#18919)
* chore: bump chromium in DEPS to 76.0.3809.38

* chore: bump chromium in DEPS to 76.0.3809.39

* chore: bump chromium in DEPS to 76.0.3809.40

* chore: bump chromium in DEPS to 76.0.3809.42
2019-06-24 15:15:27 -04:00
Electron Bot
f36f90b60f Bump v6.0.0-beta.10 2019-06-21 15:05:57 -07:00
Micha Hanselmann
a603a4dde8 fix: sanitize invalid custom protocol headers (#18927)
* fix: sanitize invalid custom protocol headers (#18854)

* lint fix
2019-06-21 15:00:05 -07:00
trop[bot]
3e033b4f27 chore: account for remotes in branch parsing (#18931) 2019-06-21 14:03:40 -07:00
trop[bot]
03be4c67d5 fix: delay handling occlusion events to avoid flicker on macOS (#18885)
* chore: add debounce on the updateWebContentsVisibility method to ensure quick changes in occlusion do not result in flickering

* chore: update old patch headers

* chore: update patches for E6 without host refactor
2019-06-21 09:20:08 -07:00
John Kleinschmidt
b20fe76db7 chore: use manual invocation of npx yarn (#18902)
* chore: Revert "build: use yarn to install arm modules (#18802)"

This reverts commit 97bec607fe.
script/yarn.js doesn't exist in 5-0-x or 6-0-x

* chore: use manual invocation of npx yarn
2019-06-21 08:57:05 -07:00
trop[bot]
503da640f7 fix: app.getAppPath() returning default-app path for files or directories without package.json (#18888) 2019-06-21 08:54:21 -07:00
trop[bot]
bd48dfe3cc chore: fix branch trimming for blast-off releases (#18909) 2019-06-21 01:02:54 -07:00
Jeremy Apthorp
9b47f587a6 fix: bundle swiftshader and ANGLE libraries on mac (#18904) 2019-06-20 11:12:02 -07:00
trop[bot]
3a186dad5d refactor: session.{clearCache,getCacheSize} nws13n (#18897) 2019-06-20 10:11:13 -07:00
Electron Bot
7959f2e887 chore: bump chromium to 76.0.3809.37 (6-0-x) (#18828)
* chore: bump chromium in DEPS to 76.0.3809.32

* chore: bump chromium in DEPS to 76.0.3809.33

* chore: update patches

* chore: bump chromium in DEPS to 76.0.3809.37

* chore: fix render_view_host_view_base.patch
2019-06-20 09:58:56 -07:00
trop[bot]
4868c95425 fix: building with enable_run_as_node disabled (#18892) 2019-06-19 23:48:04 -07:00
Samuel Attard
7fa41e3302 chore: roll node to fix http2 memory leak (#18882) 2019-06-19 12:33:05 -07:00
Electron Bot
f3346437be Bump v6.0.0-beta.9 2019-06-18 13:21:18 -07:00
Shelley Vohr
6de6d7f6c0 docs: add example on handling the webPrefs change (#18856)
* docs: add example on handling the webPrefs change

Fixes #17967

* Update breaking-changes.md
2019-06-18 10:35:27 -07:00
Shelley Vohr
eb15be06e3 fix: use is_valid for cookie url validation (#18770) (#18843)
Use is_valid instead of is_empty to validate url on cookies.set().
2019-06-18 09:53:10 -07:00
trop[bot]
7748decc60 chore: fix current branch fetch on master (#18862) 2019-06-18 08:34:50 -07:00
Shelley Vohr
d75750ab01 fix: use effectiveAppearance to check dark mode on mojave and above (#18666) (#18845)
* fix: use effectiveAppearance to check dark mode on mojave and above

* chore: add forward declarations for dark appearance
2019-06-17 15:54:31 -07:00
Shelley Vohr
152781226e fix: callback values for printing cancellation and success (#18803) 2019-06-17 11:33:30 -07:00
trop[bot]
7e3bbb6ace build: get current release branch from commit (#18833)
* chore: get current release branch from commit

* love too lint
2019-06-17 07:54:17 -07:00
Shelley Vohr
3c3eb2f65d docs: better explain supported release line levels (#18800) (#18838) 2019-06-17 07:53:24 -07:00
trop[bot]
5a83d9e64d feat: provide the frame URL with permission requests and checks (#18772)
* feat: provide the frame URL with permission requests and checks

Also provides a handy isMainFrame property to determine if it is an
iframe making the request

* chore: refactor to use base::Value

* chore: use Set<Type>Key over SetPath

* chore: fix lint
2019-06-15 16:26:21 +09:00
trop[bot]
97bec607fe build: use yarn to install arm modules (#18802) 2019-06-15 16:16:13 +09:00
trop[bot]
b56ca98b72 docs: add specific options for MenuItem.role (#18807) 2019-06-14 23:29:34 -07:00
Electron Bot
eeccdc2d5c Bump v6.0.0-beta.8 2019-06-14 09:22:25 -07:00
Milan Burda
47827ed45c fix: crash in BrowserWindow destructor after win.webContents.destroy() (#18686) (#18793) 2019-06-14 09:18:38 -07:00
Cheng Zhao
d3f7bdd0b3 fix: use crashpad on Windows (#18483) (#18766) 2019-06-13 18:51:56 -07:00
trop[bot]
438c50bf14 docs: fully document MenuItem instance properties (#18784)
* document menuItem instance properties

* correct some types

* add correct click documentation
2019-06-13 18:45:05 -07:00
trop[bot]
33d860bcea fix: reject the executeJavaScript promise when it fails to execute the script (#18714)
* fix: reject the executeJavaScript promise when it fails to execute the script

Closes #9102

* Update atom/renderer/api/atom_api_web_frame.cc

Co-Authored-By: Jeremy Apthorp <nornagon@nornagon.net>

* Update atom/renderer/api/atom_api_web_frame.cc

Co-Authored-By: Jeremy Apthorp <nornagon@nornagon.net>

* fix: missing semicolon
2019-06-13 16:13:06 -07:00
trop[bot]
2401a2afe9 fix: HTML fullscreen request for sub frames (#18775)
Don't re-enter fullscreen if there is a pending operation,
for subframe fullscreen request `EnterFullScreenModeForTab`
will be called for both the frame in question as well as
the outer webContents hosting it.
2019-06-13 15:23:43 -07:00
Electron Bot
852f0be0b2 chore: bump chromium in DEPS to 76.0.3809.26 (#18768) 2019-06-13 13:47:13 -07:00
Samuel Attard
18ec438eaf feat: Add option to conditionally disable site instance patches (#18554)
* feat: Add option to conditionally disable site instance patches (#18396)

* chore: allow conditional disable of the site instance override patches at runtime

* feat: add app.allowRendererProcessReuse property to allow runtime disable of site instance overrides

spec: add tests for the new allowRendererProcessReuse property

feat: add console warnings / errors for loading non context-aware native modules
  * Only error if the patch is disabled
  * Warn all the time, this will ship in Electron 7

* chore: do not warn in about context aware in v6

* chore: update patches
2019-06-13 10:23:02 -07:00
trop[bot]
f7042c8d1b fix: correct isDownloadable docs to match impl (#18747) 2019-06-12 14:16:50 -07:00
Electron Bot
bc73f93e6c chore: bump chromium in DEPS to 76.0.3809.23 (#18742) 2019-06-12 13:21:35 -07:00
trop[bot]
7091508678 fix: remove lingering data when notifications autodismiss on Windows 7 (#18740) 2019-06-12 21:43:30 +09:00
Alexandre Lacheze
6d9d66b88a fix: lost window.opener after cross-origin navigation (#18624)
* SiteInstance::CreateRelatedSiteInstance and use it

* Introduce and use a NetworkSandbox and introduce a test for window.opener on x-site navigation
2019-06-11 14:34:52 -07:00
481 changed files with 22158 additions and 3995 deletions

File diff suppressed because it is too large Load Diff

1
.gitattributes vendored
View File

@@ -1,3 +1,4 @@
# `git apply` and friends don't understand CRLF, even on windows. Force those
# files to be checked out with LF endings even if core.autocrlf is true.
*.patch text eol=lf
patches/**/.patches merge=union

14
.github/CODEOWNERS vendored
View File

@@ -4,17 +4,19 @@
# https://git-scm.com/docs/gitignore
# Most stuff in here is owned by the Community & Safety WG...
/.github/* @electron/wg-community
/.github/* @electron/wg-community
# ...except the Admin WG maintains this file.
/.github/CODEOWNERS @electron/wg-admin
/.github/CODEOWNERS @electron/wg-admin
# Upgrades WG
/patches/ @electron/wg-upgrades
/patches/ @electron/wg-upgrades
DEPS @electron/wg-upgrades
# Docs & Tooling WG
/default_app/ @electron/wg-docs-tools
/docs/ @electron/wg-docs-tools
/default_app/ @electron/wg-docs-tools
/docs/ @electron/wg-docs-tools
# Releases WG
/npm/ @electron/wg-releases
/npm/ @electron/wg-releases

296
BUILD.gn
View File

@@ -1,6 +1,7 @@
import("//build/config/locales.gni")
import("//build/config/ui.gni")
import("//build/config/win/manifest.gni")
import("//content/public/app/mac_helpers.gni")
import("//pdf/features.gni")
import("//printing/buildflags/buildflags.gni")
import("//third_party/ffmpeg/ffmpeg_options.gni")
@@ -10,6 +11,7 @@ import("//tools/grit/repack.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.gni")
import("//v8/gni/snapshot_toolchain.gni")
import("build/asar.gni")
import("build/extract_symbols.gni")
import("build/js_wrap.gni")
import("build/npm.gni")
import("build/tsc.gni")
@@ -21,6 +23,7 @@ import("filenames.gni")
if (is_mac) {
import("//build/config/mac/rules.gni")
import("//third_party/icu/config.gni")
import("//ui/gl/features.gni")
import("//v8/gni/v8.gni")
}
@@ -231,7 +234,7 @@ action("atom_js2c") {
"$target_gen_dir/js2c/asar_init.js",
]
inputs = sources
inputs = sources + [ "//third_party/electron_node/tools/js2c.py" ]
outputs = [
"$root_gen_dir/atom_natives.cc",
]
@@ -546,21 +549,14 @@ static_library("electron_lib") {
if (is_mac) {
deps += [
"//components/remote_cocoa/app_shim",
"//third_party/crashpad/crashpad/client",
"//content/common:mac_helpers",
"//ui/accelerated_widget_mac",
]
sources += [
"atom/browser/ui/views/autofill_popup_view.cc",
"atom/browser/ui/views/autofill_popup_view.h",
]
include_dirs += [
# NOTE(nornagon): other chromium files use the full path to include
# crashpad; this is just here for compatibility between GN and GYP, so that
# the #includes can be agnostic about where crashpad is vendored.
"//third_party/crashpad",
]
if (is_mas_build) {
deps -= [ "//third_party/crashpad/crashpad/client" ]
sources += [ "atom/browser/api/atom_api_app_mas.mm" ]
sources -= [
"atom/browser/auto_updater_mac.mm",
@@ -590,10 +586,14 @@ static_library("electron_lib") {
"//chrome/browser/ui/libgtkui",
"//dbus",
"//device/bluetooth",
"//third_party/breakpad:client",
"//ui/events/devices/x11",
"//ui/events/platform/x11",
"//ui/views/controls/webview",
"//ui/wm",
]
configs += [ ":gio_unix" ]
include_dirs += [ "//third_party/breakpad" ]
defines += [
# Disable warnings for g_settings_list_schemas.
"GLIB_DISABLE_DEPRECATION_WARNINGS",
@@ -604,20 +604,23 @@ static_library("electron_lib") {
if (is_win) {
libs += [ "dwmapi.lib" ]
deps += [
"//third_party/breakpad:breakpad_handler",
"//third_party/breakpad:breakpad_sender",
"//ui/native_theme:native_theme_browser",
"//ui/wm/public",
]
public_deps += [ "//sandbox/win:sandbox" ]
}
if (is_linux || is_win) {
deps += [
"//third_party/breakpad:client",
"//ui/views/controls/webview",
"//ui/wm",
"//ui/wm/public",
]
include_dirs += [ "//third_party/breakpad" ]
public_deps += [
"//sandbox/win:sandbox",
"//third_party/crashpad/crashpad/handler",
]
}
if ((is_mac && !is_mas_build) || is_win) {
sources += [
"atom/common/crash_reporter/crash_reporter_crashpad.cc",
"atom/common/crash_reporter/crash_reporter_crashpad.h",
]
deps += [ "//third_party/crashpad/crashpad/client" ]
}
if (enable_pdf) {
@@ -654,9 +657,7 @@ static_library("electron_lib") {
}
if (enable_desktop_capturer) {
if (is_component_build && is_win) {
# On windows the implementation relies on unexported
# DxgiDuplicatorController class.
if (is_component_build && !is_linux) {
deps += [ "//third_party/webrtc/modules/desktop_capture" ]
}
sources += [
@@ -712,6 +713,7 @@ if (is_mac) {
electron_helper_name = "$electron_product_name Helper"
electron_login_helper_name = "$electron_product_name Login Helper"
electron_framework_version = "A"
electron_version = read_file("ELECTRON_VERSION", "trim string")
mac_xib_bundle_data("electron_xibs") {
sources = [
@@ -759,6 +761,50 @@ if (is_mac) {
group("electron_framework_libraries") {
}
}
if (use_egl) {
# Add the ANGLE .dylibs in the Libraries directory of the Framework.
bundle_data("electron_angle_binaries") {
sources = [
"$root_out_dir/egl_intermediates/libEGL.dylib",
"$root_out_dir/egl_intermediates/libGLESv2.dylib",
]
outputs = [
"{{bundle_contents_dir}}/Libraries/{{source_file_part}}",
]
public_deps = [
"//ui/gl:angle_library_copy",
]
}
# Add the SwiftShader .dylibs in the Libraries directory of the Framework.
bundle_data("electron_swiftshader_binaries") {
sources = [
"$root_out_dir/egl_intermediates/libswiftshader_libEGL.dylib",
"$root_out_dir/egl_intermediates/libswiftshader_libGLESv2.dylib",
]
outputs = [
"{{bundle_contents_dir}}/Libraries/{{source_file_part}}",
]
public_deps = [
"//ui/gl:swiftshader_library_copy",
]
}
}
group("electron_angle_library") {
if (use_egl) {
deps = [
":electron_angle_binaries",
]
}
}
group("electron_swiftshader_library") {
if (use_egl) {
deps = [
":electron_swiftshader_binaries",
]
}
}
bundle_data("electron_crashpad_helper") {
sources = [
@@ -785,8 +831,10 @@ if (is_mac) {
":electron_lib",
]
deps = [
":electron_angle_library",
":electron_framework_libraries",
":electron_framework_resources",
":electron_swiftshader_library",
":electron_xibs",
]
if (!is_mas_build) {
@@ -794,7 +842,6 @@ if (is_mac) {
}
info_plist = "atom/common/resources/mac/Info.plist"
electron_version = read_file("ELECTRON_VERSION", "trim string")
extra_substitutions = [
"ATOM_BUNDLE_ID=$electron_mac_bundle_id.framework",
"ELECTRON_VERSION=$electron_version",
@@ -834,35 +881,48 @@ if (is_mac) {
}
}
mac_app_bundle("electron_helper_app") {
output_name = electron_helper_name
deps = [
":electron_framework+link",
]
if (!is_mas_build) {
deps += [ "//sandbox/mac:seatbelt" ]
}
defines = [ "HELPER_EXECUTABLE" ]
sources = filenames.app_sources
include_dirs = [ "." ]
info_plist = "atom/renderer/resources/mac/Info.plist"
extra_substitutions = [ "ATOM_BUNDLE_ID=$electron_mac_bundle_id.helper" ]
ldflags = [
"-rpath",
"@executable_path/../../..",
]
if (is_component_build) {
ldflags += [
"-rpath",
"@executable_path/../../../../../..",
template("electron_helper_app") {
mac_app_bundle(target_name) {
assert(defined(invoker.helper_name_suffix))
output_name = electron_helper_name + invoker.helper_name_suffix
deps = [
":electron_framework+link",
]
if (!is_mas_build) {
deps += [ "//sandbox/mac:seatbelt" ]
}
defines = [ "HELPER_EXECUTABLE" ]
sources = filenames.app_sources
sources += [ "atom/common/atom_constants.cc" ]
include_dirs = [ "." ]
info_plist = "atom/renderer/resources/mac/Info.plist"
extra_substitutions = [ "ATOM_BUNDLE_ID=$electron_mac_bundle_id.helper" ]
ldflags = [
"-rpath",
"@executable_path/../../..",
]
if (is_component_build) {
ldflags += [
"-rpath",
"@executable_path/../../../../../..",
]
}
}
}
foreach(helper_params, content_mac_helpers) {
_helper_target = helper_params[0]
_helper_bundle_id = helper_params[1]
_helper_suffix = helper_params[2]
electron_helper_app("electron_helper_app_${_helper_target}") {
helper_name_suffix = _helper_suffix
}
}
bundle_data("electron_app_framework_bundle_data") {
sources = [
"$root_out_dir/$electron_framework_name.framework",
"$root_out_dir/$electron_helper_name.app",
]
if (!is_mas_build) {
sources += [
@@ -876,8 +936,13 @@ if (is_mac) {
]
public_deps = [
":electron_framework+link",
":electron_helper_app",
]
foreach(helper_params, content_mac_helpers) {
sources +=
[ "$root_out_dir/${electron_helper_name}${helper_params[2]}.app" ]
public_deps += [ ":electron_helper_app_${helper_params[0]}" ]
}
}
mac_app_bundle("electron_login_helper") {
@@ -951,6 +1016,7 @@ if (is_mac) {
mac_app_bundle("electron_app") {
output_name = electron_product_name
sources = filenames.app_sources
sources += [ "atom/common/atom_constants.cc" ]
include_dirs = [ "." ]
deps = [
":electron_app_framework_bundle_data",
@@ -966,6 +1032,85 @@ if (is_mac) {
"@executable_path/../Frameworks",
]
}
if (enable_dsyms) {
extract_symbols("electron_framework_syms") {
binary = "$root_out_dir/$electron_framework_name.framework/Versions/$electron_framework_version/$electron_framework_name"
symbol_dir = "$root_out_dir/breakpad_symbols"
dsym_file = "$root_out_dir/$electron_framework_name.dSYM/Contents/Resources/DWARF/$electron_framework_name"
deps = [
":electron_framework",
]
}
foreach(helper_params, content_mac_helpers) {
_helper_target = helper_params[0]
_helper_bundle_id = helper_params[1]
_helper_suffix = helper_params[2]
extract_symbols("electron_helper_syms_${_helper_target}") {
binary = "$root_out_dir/$electron_helper_name${_helper_suffix}.app/Contents/MacOS/$electron_helper_name${_helper_suffix}"
symbol_dir = "$root_out_dir/breakpad_symbols"
dsym_file = "$root_out_dir/$electron_helper_name${_helper_suffix}.dSYM/Contents/Resources/DWARF/$electron_helper_name${_helper_suffix}"
deps = [
":electron_helper_app_${_helper_target}",
]
}
}
extract_symbols("electron_app_syms") {
binary = "$root_out_dir/$electron_product_name.app/Contents/MacOS/$electron_product_name"
symbol_dir = "$root_out_dir/breakpad_symbols"
dsym_file = "$root_out_dir/$electron_product_name.dSYM/Contents/Resources/DWARF/$electron_product_name"
deps = [
":electron_app",
]
}
extract_symbols("swiftshader_egl_syms") {
binary = "$root_out_dir/libswiftshader_libEGL.dylib"
symbol_dir = "$root_out_dir/breakpad_symbols"
dsym_file = "$root_out_dir/libswiftshader_libEGL.dylib.dSYM/Contents/Resources/DWARF/libswiftshader_libEGL.dylib"
deps = [
"//third_party/swiftshader/src/OpenGL/libEGL:swiftshader_libEGL",
]
}
extract_symbols("swiftshader_gles_syms") {
binary = "$root_out_dir/libswiftshader_libGLESv2.dylib"
symbol_dir = "$root_out_dir/breakpad_symbols"
dsym_file = "$root_out_dir/libswiftshader_libGLESv2.dylib.dSYM/Contents/Resources/DWARF/libswiftshader_libGLESv2.dylib"
deps = [
"//third_party/swiftshader/src/OpenGL/libGLESv2:swiftshader_libGLESv2",
]
}
extract_symbols("crashpad_handler_syms") {
binary = "$root_out_dir/crashpad_handler"
symbol_dir = "$root_out_dir/breakpad_symbols"
dsym_file = "$root_out_dir/crashpad_handler.dSYM/Contents/Resources/DWARF/crashpad_handler"
deps = [
"//third_party/crashpad/crashpad/handler:crashpad_handler",
]
}
group("electron_symbols") {
deps = [
":crashpad_handler_syms",
":electron_app_syms",
":electron_framework_syms",
":swiftshader_egl_syms",
":swiftshader_gles_syms",
]
foreach(helper_params, content_mac_helpers) {
_helper_target = helper_params[0]
deps += [ ":electron_helper_syms_${_helper_target}" ]
}
}
} else {
group("electron_symbols") {
}
}
} else {
windows_manifest("electron_app_manifest") {
sources = [
@@ -1054,6 +1199,49 @@ if (is_mac) {
}
}
}
if (is_official_build) {
if (is_linux) {
_target_executable_suffix = ""
_target_shared_library_suffix = ".so"
} else if (is_win) {
_target_executable_suffix = ".exe"
_target_shared_library_suffix = ".dll"
}
extract_symbols("electron_app_symbols") {
binary = "$root_out_dir/$electron_project_name$_target_executable_suffix"
symbol_dir = "$root_out_dir/breakpad_symbols"
deps = [
":electron_app",
]
}
extract_symbols("swiftshader_egl_symbols") {
binary = "$root_out_dir/swiftshader/libEGL$_target_shared_library_suffix"
symbol_dir = "$root_out_dir/breakpad_symbols"
deps = [
"//third_party/swiftshader/src/OpenGL/libEGL:swiftshader_libEGL",
]
}
extract_symbols("swiftshader_gles_symbols") {
binary =
"$root_out_dir/swiftshader/libGLESv2$_target_shared_library_suffix"
symbol_dir = "$root_out_dir/breakpad_symbols"
deps = [
"//third_party/swiftshader/src/OpenGL/libGLESv2:swiftshader_libGLESv2",
]
}
group("electron_symbols") {
deps = [
":electron_app_symbols",
":swiftshader_egl_symbols",
":swiftshader_gles_symbols",
]
}
}
}
template("dist_zip") {
@@ -1160,12 +1348,18 @@ dist_zip("electron_chromedriver_zip") {
]
}
mksnapshot_deps = [
":licenses",
"//tools/v8_context_snapshot:v8_context_snapshot_generator($v8_snapshot_toolchain)",
"//v8:mksnapshot($v8_snapshot_toolchain)",
]
group("electron_mksnapshot") {
public_deps = mksnapshot_deps
}
dist_zip("electron_mksnapshot_zip") {
data_deps = [
"//v8:mksnapshot($v8_snapshot_toolchain)",
"//tools/v8_context_snapshot:v8_context_snapshot_generator",
":licenses",
]
data_deps = mksnapshot_deps
outputs = [
"$root_build_dir/mksnapshot.zip",
]

42
DEPS
View File

@@ -10,9 +10,9 @@ gclient_gn_args = [
vars = {
'chromium_version':
'76.0.3809.22',
'76.0.3809.146',
'node_version':
'a86a4a160dc520c61a602c949a32a1bc4c0fc633',
'v12.4.0',
'boto_version': 'f7574aa6cc2c819430c1f05e9a1a1a666ef8169b',
'pyyaml_version': '3.12',
@@ -21,6 +21,7 @@ vars = {
'boto_git': 'https://github.com/boto',
'chromium_git': 'https://chromium.googlesource.com',
'electron_git': 'https://github.com/electron',
'nodejs_git': 'https://github.com/nodejs',
'requests_git': 'https://github.com/kennethreitz',
'yaml_git': 'https://github.com/yaml',
@@ -30,6 +31,9 @@ vars = {
# To be able to build clean Chromium from sources.
'apply_patches': True,
# Apply the patches specific to windows on arm64
'apply_win_arm64_patches': False,
# Python interface to Amazon Web Services. Is used for releases only.
'checkout_boto': False,
@@ -43,9 +47,11 @@ vars = {
# Python "requests" module is used for releases only.
'checkout_requests': False,
# To allow running hooks without parsing the DEPS tree
'process_deps': True,
# It is always needed for normal Electron builds,
# but might be impossible for custom in-house builds.
'download_external_binaries': True,
'download_external_binaries': False,
'checkout_nacl':
False,
@@ -64,30 +70,30 @@ vars = {
deps = {
'src': {
'url': (Var("chromium_git")) + '/chromium/src.git@' + (Var("chromium_version")),
'condition': 'checkout_chromium',
'condition': 'checkout_chromium and process_deps',
},
'src/third_party/electron_node': {
'url': (Var("electron_git")) + '/node.git@' + (Var("node_version")),
'condition': 'checkout_node',
'url': (Var("nodejs_git")) + '/node.git@' + (Var("node_version")),
'condition': 'checkout_node and process_deps',
},
'src/electron/vendor/pyyaml': {
'url': (Var("yaml_git")) + '/pyyaml.git@' + (Var("pyyaml_version")),
'condition': 'checkout_pyyaml',
'condition': 'checkout_pyyaml and process_deps',
},
'src/electron/vendor/boto': {
'url': Var('boto_git') + '/boto.git' + '@' + Var('boto_version'),
'condition': 'checkout_boto',
'condition': 'checkout_boto and process_deps',
},
'src/electron/vendor/requests': {
'url': Var('requests_git') + '/requests.git' + '@' + Var('requests_version'),
'condition': 'checkout_requests',
'condition': 'checkout_requests and process_deps',
},
}
hooks = [
{
'name': 'patch_chromium',
'condition': 'checkout_chromium and apply_patches',
'condition': '(checkout_chromium and apply_patches) and process_deps',
'pattern': 'src/electron',
'action': [
'python',
@@ -95,6 +101,16 @@ hooks = [
'src/electron/patches/common/config.json',
],
},
{
'name': 'patch_chromium',
'condition': '(checkout_chromium and apply_patches) and apply_win_arm64_patches',
'pattern': 'src/electron',
'action': [
'python',
'src/electron/script/apply_all_patches.py',
'src/electron/patches/win_arm64/config.json',
],
},
{
'name': 'electron_external_binaries',
'pattern': 'src/electron/script/update-external-binaries.py',
@@ -116,7 +132,7 @@ hooks = [
{
'name': 'setup_boto',
'pattern': 'src/electron',
'condition': 'checkout_boto',
'condition': 'checkout_boto and process_deps',
'action': [
'python',
'-c',
@@ -126,7 +142,7 @@ hooks = [
{
'name': 'setup_requests',
'pattern': 'src/electron',
'condition': 'checkout_requests',
'condition': 'checkout_requests and process_deps',
'action': [
'python',
'-c',
@@ -138,3 +154,5 @@ hooks = [
recursedeps = [
'src',
]
# Touch DEPS to bust cache

View File

@@ -1 +1 @@
6.0.0-beta.7
6.1.12

View File

@@ -2,10 +2,8 @@
[![CircleCI Build Status](https://circleci.com/gh/electron/electron/tree/master.svg?style=shield)](https://circleci.com/gh/electron/electron/tree/master)
[![AppVeyor Build Status](https://windows-ci.electronjs.org/api/projects/status/nilyf07hcef14dvj/branch/master?svg=true)](https://windows-ci.electronjs.org/project/AppVeyor/electron/branch/master)
[![Azure Pipelines Build Status](https://github.visualstudio.com/electron/_apis/build/status/electron-builds/electron-osx-testing?branchName=master)](https://github.visualstudio.com/electron/_build/latest?definitionId=36)
[![AppVeyor Build Status](https://ci.appveyor.com/api/projects/status/4lggi9dpjc1qob7k/branch/master?svg=true)](https://ci.appveyor.com/project/electron-bot/electron-ljo26/branch/master)
[![devDependency Status](https://david-dm.org/electron/electron/dev-status.svg)](https://david-dm.org/electron/electron?type=dev)
[![Join the Electron Community on Slack](https://atom-slack.herokuapp.com/badge.svg)](https://atom-slack.herokuapp.com/)
:memo: Available Translations: 🇨🇳 🇹🇼 🇧🇷 🇪🇸 🇰🇷 🇯🇵 🇷🇺 🇫🇷 🇹🇭 🇳🇱 🇹🇷 🇮🇩 🇺🇦 🇨🇿 🇮🇹 🇵🇱.
View these docs in other languages at [electron/i18n](https://github.com/electron/i18n/tree/master/content/).

View File

@@ -28,7 +28,6 @@ build_cloud: libcc-20
image: libcc-20-vs2017-15.9
environment:
GIT_CACHE_PATH: C:\Users\electron\libcc_cache
DISABLE_CRASH_REPORTER_TESTS: true
ELECTRON_OUT_DIR: Default
ELECTRON_ENABLE_STACK_DUMPING: 1
build_script:
@@ -45,7 +44,7 @@ build_script:
- ps: $env:SCCACHE_PATH="$pwd\src\electron\external_binaries\sccache.exe"
- ps: >-
if ($env:GN_CONFIG -eq 'release') {
$env:GCLIENT_EXTRA_ARGS="--custom-var=checkout_boto=True --custom-var=checkout_requests=True"
$env:GCLIENT_EXTRA_ARGS="$env:GCLIENT_EXTRA_ARGS --custom-var=checkout_boto=True --custom-var=checkout_requests=True"
}
- >-
gclient config
@@ -54,6 +53,8 @@ build_script:
%GCLIENT_EXTRA_ARGS%
"https://github.com/electron/electron"
- gclient sync --with_branch_heads --with_tags --reset
# Manually run update-external-binaries.py with system python
- python src/electron/script/update-external-binaries.py
- cd src
- ps: $env:BUILD_CONFIG_PATH="//electron/build/args/%GN_CONFIG%.gn"
- gn gen out/Default "--args=import(\"%BUILD_CONFIG_PATH%\") %GN_EXTRA_ARGS%"
@@ -71,21 +72,27 @@ build_script:
- appveyor PushArtifact out/Default/dist.zip
- appveyor PushArtifact out/Default/chromedriver.zip
- appveyor PushArtifact out/ffmpeg/ffmpeg.zip
- 7z a node_headers.zip out\Default\gen\node_headers
- appveyor PushArtifact node_headers.zip
- appveyor PushArtifact out/Default/mksnapshot.zip
- appveyor PushArtifact out/Default/electron.lib
- ps: >-
if ($env:GN_CONFIG -eq 'release') {
ninja -C out/Default third_party/breakpad:dump_syms
# Needed for msdia140.dll on 64-bit windows
$env:Path += ";$pwd\third_party\llvm-build\Release+Asserts\bin"
ninja -C out/Default electron:electron_symbols
}
- if "%GN_CONFIG%"=="release" ( python electron\script\dump-symbols.py -d %cd%\out\Default\breakpad_symbols -v)
- ps: >-
if ($env:GN_CONFIG -eq 'release') {
python electron\script\zip-symbols.py
appveyor PushArtifact out/Default/symbols.zip
}
- python electron/script/zip_manifests/check-zip-manifest.py out/Default/dist.zip electron/script/zip_manifests/dist_zip.win.%TARGET_ARCH%.manifest
test_script:
# Workaround for https://github.com/appveyor/ci/issues/2420
- set "PATH=%PATH%;C:\Program Files\Git\mingw64\libexec\git-core"
- ps: >-
if ((-Not (Test-Path Env:\ELECTRON_RELEASE)) -And ($env:GN_CONFIG -in "testing", "release")) {
if ((-Not (Test-Path Env:\TEST_WOA)) -And (-Not (Test-Path Env:\ELECTRON_RELEASE)) -And ($env:GN_CONFIG -in "testing", "release")) {
$env:RUN_TESTS="true"
}
- ps: >-
@@ -96,7 +103,7 @@ test_script:
echo "Skipping tests for $env:GN_CONFIG build"
}
- cd electron
- if "%RUN_TESTS%"=="true" ( echo Running test suite & npm run test -- --ci --enable-logging)
- if "%RUN_TESTS%"=="true" ( echo Running test suite & node script/yarn test -- --ci --enable-logging)
- 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 )
- echo "About to verify mksnapshot"
@@ -113,4 +120,6 @@ deploy_script:
Write-Output "Uploading Electron release distribution to github releases"
& python script\upload.py
}
} elseif (Test-Path Env:\TEST_WOA) {
node script/ci-release-build.js --job=electron-woa-testing --ci=VSTS --armTest --appveyorJobId=$env:APPVEYOR_JOB_ID $env:APPVEYOR_REPO_BRANCH
}

View File

@@ -5,6 +5,7 @@
#include "atom/app/atom_content_client.h"
#include <string>
#include <utility>
#include <vector>
#include "atom/common/options_switches.h"
@@ -14,14 +15,13 @@
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "content/public/common/content_constants.h"
#include "content/public/common/pepper_plugin_info.h"
#include "electron/buildflags/buildflags.h"
#include "ppapi/shared_impl/ppapi_permissions.h"
#include "ppapi/buildflags/buildflags.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "url/url_constants.h"
// In SHARED_INTERMEDIATE_DIR.
#include "widevine_cdm_version.h" // NOLINT(build/include)
#include "widevine_cdm_version.h" // NOLINT(build/include_directory)
#if defined(WIDEVINE_CDM_AVAILABLE)
#include "base/native_library.h"
@@ -34,6 +34,11 @@
#include "pdf/pdf.h"
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
#if BUILDFLAG(ENABLE_PLUGINS)
#include "content/public/common/pepper_plugin_info.h"
#include "ppapi/shared_impl/ppapi_permissions.h"
#endif // BUILDFLAG(ENABLE_PLUGINS)
namespace atom {
namespace {
@@ -140,6 +145,7 @@ void AddPepperFlashFromCommandLine(
}
#endif // BUILDFLAG(ENABLE_PEPPER_FLASH)
#if BUILDFLAG(ENABLE_PLUGINS)
void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
#if BUILDFLAG(ENABLE_PDF_VIEWER)
content::PepperPluginInfo pdf_info;
@@ -160,15 +166,21 @@ void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
plugins->push_back(pdf_info);
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)
}
#endif // BUILDFLAG(ENABLE_PLUGINS)
void ConvertStringWithSeparatorToVector(std::vector<std::string>* vec,
const char* separator,
const char* cmd_switch) {
void AppendDelimitedSwitchToVector(const base::StringPiece cmd_switch,
std::vector<std::string>* append_me) {
auto* command_line = base::CommandLine::ForCurrentProcess();
auto string_with_separator = command_line->GetSwitchValueASCII(cmd_switch);
if (!string_with_separator.empty())
*vec = base::SplitString(string_with_separator, separator,
base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
auto switch_value = command_line->GetSwitchValueASCII(cmd_switch);
if (!switch_value.empty()) {
constexpr base::StringPiece delimiter(",", 1);
auto tokens =
base::SplitString(switch_value, delimiter, base::TRIM_WHITESPACE,
base::SPLIT_WANT_NONEMPTY);
append_me->reserve(append_me->size() + tokens.size());
std::move(std::begin(tokens), std::end(tokens),
std::back_inserter(*append_me));
}
}
} // namespace
@@ -200,30 +212,19 @@ base::RefCountedMemory* AtomContentClient::GetDataResourceBytes(
}
void AtomContentClient::AddAdditionalSchemes(Schemes* schemes) {
std::vector<std::string> splited;
ConvertStringWithSeparatorToVector(&splited, ",",
switches::kServiceWorkerSchemes);
for (const std::string& scheme : splited)
schemes->service_worker_schemes.push_back(scheme);
AppendDelimitedSwitchToVector(switches::kServiceWorkerSchemes,
&schemes->service_worker_schemes);
AppendDelimitedSwitchToVector(switches::kStandardSchemes,
&schemes->standard_schemes);
AppendDelimitedSwitchToVector(switches::kSecureSchemes,
&schemes->secure_schemes);
AppendDelimitedSwitchToVector(switches::kBypassCSPSchemes,
&schemes->csp_bypassing_schemes);
AppendDelimitedSwitchToVector(switches::kCORSSchemes,
&schemes->cors_enabled_schemes);
schemes->service_worker_schemes.push_back(url::kFileScheme);
ConvertStringWithSeparatorToVector(&splited, ",", switches::kStandardSchemes);
for (const std::string& scheme : splited)
schemes->standard_schemes.push_back(scheme);
schemes->standard_schemes.push_back("chrome-extension");
ConvertStringWithSeparatorToVector(&splited, ",", switches::kSecureSchemes);
for (const std::string& scheme : splited)
schemes->secure_schemes.push_back(scheme);
ConvertStringWithSeparatorToVector(&splited, ",",
switches::kBypassCSPSchemes);
for (const std::string& scheme : splited)
schemes->csp_bypassing_schemes.push_back(scheme);
ConvertStringWithSeparatorToVector(&splited, ",", switches::kCORSSchemes);
for (const std::string& scheme : splited)
schemes->cors_enabled_schemes.push_back(scheme);
}
void AtomContentClient::AddPepperPlugins(
@@ -232,7 +233,9 @@ void AtomContentClient::AddPepperPlugins(
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
AddPepperFlashFromCommandLine(command_line, plugins);
#endif // BUILDFLAG(ENABLE_PEPPER_FLASH)
#if BUILDFLAG(ENABLE_PLUGINS)
ComputeBuiltInPlugins(plugins);
#endif // BUILDFLAG(ENABLE_PLUGINS)
}
void AtomContentClient::AddContentDecryptionModules(

View File

@@ -4,6 +4,7 @@
#include "atom/app/atom_main.h"
#include <algorithm>
#include <cstdlib>
#include <memory>
#include <vector>
@@ -39,6 +40,7 @@
#include "atom/app/node_main.h"
#include "atom/common/atom_command_line.h"
#include "atom/common/atom_constants.h"
#include "base/at_exit.h"
#include "base/i18n/icu_util.h"
#include "electron/buildflags/buildflags.h"
@@ -49,10 +51,6 @@
namespace {
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
const char kRunAsNode[] = "ELECTRON_RUN_AS_NODE";
#endif
ALLOW_UNUSED_TYPE bool IsEnvSet(const char* name) {
#if defined(OS_WIN)
size_t required_size;
@@ -86,6 +84,11 @@ void FixStdioStreams() {
} // namespace
#if defined(OS_WIN)
namespace crash_reporter {
extern const char kCrashpadProcess[];
}
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
struct Arguments {
int argc = 0;
@@ -122,7 +125,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
#endif
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
bool run_as_node = IsEnvSet(kRunAsNode);
bool run_as_node = IsEnvSet(atom::kRunAsNode);
#else
bool run_as_node = false;
#endif
@@ -131,30 +134,11 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
if (run_as_node || !IsEnvSet("ELECTRON_NO_ATTACH_CONSOLE"))
base::RouteStdioToConsole(false);
#ifndef DEBUG
// Chromium has its own TLS subsystem which supports automatic destruction
// of thread-local data, and also depends on memory allocation routines
// provided by the CRT. The problem is that the auto-destruction mechanism
// uses a hidden feature of the OS loader which calls a callback on thread
// exit, but only after all loaded DLLs have been detached. Since the CRT is
// also a DLL, it happens that by the time Chromium's `OnThreadExit` function
// is called, the heap functions, though still in memory, no longer perform
// their duties, and when Chromium calls `free` on its buffer, it triggers
// an access violation error.
// We work around this problem by invoking Chromium's `OnThreadExit` in time
// from within the CRT's atexit facility, ensuring the heap functions are
// still active. The second invocation from the OS loader will be a no-op.
extern void NTAPI OnThreadExit(PVOID module, DWORD reason, PVOID reserved);
atexit([]() { OnThreadExit(nullptr, DLL_THREAD_DETACH, nullptr); });
#endif
std::vector<char*> argv(arguments.argc);
std::transform(arguments.argv, arguments.argv + arguments.argc, argv.begin(),
[](auto& a) { return _strdup(base::WideToUTF8(a).c_str()); });
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
if (run_as_node) {
std::vector<char*> argv(arguments.argc);
std::transform(
arguments.argv, arguments.argv + arguments.argc, argv.begin(),
[](auto& a) { return _strdup(base::WideToUTF8(a).c_str()); });
base::AtExitManager atexit_manager;
base::i18n::InitializeICU();
auto ret = atom::NodeMain(argv.size(), argv.data());
@@ -163,8 +147,11 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
}
#endif
if (IsEnvSet("ELECTRON_INTERNAL_CRASH_SERVICE")) {
return crash_service::Main(cmd);
base::CommandLine::Init(argv.size(), argv.data());
const base::CommandLine& cmd_line = *base::CommandLine::ForCurrentProcess();
if (cmd_line.GetSwitchValueASCII("type") ==
crash_reporter::kCrashpadProcess) {
return crash_service::Main(&argv);
}
if (!atom::CheckCommandLineArguments(arguments.argc, arguments.argv))
@@ -187,7 +174,7 @@ int main(int argc, char* argv[]) {
FixStdioStreams();
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
if (IsEnvSet(kRunAsNode)) {
if (IsEnvSet(atom::kRunAsNode)) {
base::i18n::InitializeICU();
base::AtExitManager atexit_manager;
return atom::NodeMain(argc, argv);
@@ -208,7 +195,7 @@ int main(int argc, char* argv[]) {
FixStdioStreams();
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
if (IsEnvSet(kRunAsNode)) {
if (IsEnvSet(atom::kRunAsNode)) {
return AtomInitializeICUandStartNode(argc, argv);
}
#endif

View File

@@ -49,6 +49,9 @@
#if defined(OS_WIN)
#include "base/win/win_util.h"
#if defined(_WIN64)
#include "atom/common/crash_reporter/crash_reporter_win.h"
#endif
#endif
namespace atom {
@@ -62,6 +65,11 @@ bool IsBrowserProcess(base::CommandLine* cmd) {
return process_type.empty();
}
bool IsSandboxEnabled(base::CommandLine* command_line) {
return command_line->HasSwitch(switches::kEnableSandbox) ||
!command_line->HasSwitch(service_manager::switches::kNoSandbox);
}
// Returns true if this subprocess type needs the ResourceBundle initialized
// and resources loaded.
bool SubprocessNeedsResourceBundle(const std::string& process_type) {
@@ -133,6 +141,10 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
logging::LoggingSettings settings;
#if defined(OS_WIN)
#if defined(_WIN64)
crash_reporter::CrashReporterWin::SetUnhandledExceptionFilter();
#endif
// On Windows the terminal returns immediately, so we add a new line to
// prevent output in the same line as the prompt.
if (IsBrowserProcess(command_line))
@@ -192,6 +204,14 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
base::win::PinUser32();
#endif
#if defined(OS_LINUX)
// Check for --no-sandbox parameter when running as root.
if (getuid() == 0 && IsSandboxEnabled(command_line))
LOG(FATAL) << "Running as root without --"
<< service_manager::switches::kNoSandbox
<< " is not supported. See https://crbug.com/638180.";
#endif
content_client_ = std::make_unique<AtomContentClient>();
SetContentClient(content_client_.get());
@@ -268,10 +288,9 @@ content::ContentBrowserClient* AtomMainDelegate::CreateContentBrowserClient() {
content::ContentRendererClient*
AtomMainDelegate::CreateContentRendererClient() {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(
switches::kEnableSandbox) ||
!base::CommandLine::ForCurrentProcess()->HasSwitch(
service_manager::switches::kNoSandbox)) {
auto* command_line = base::CommandLine::ForCurrentProcess();
if (IsSandboxEnabled(command_line)) {
renderer_client_.reset(new AtomSandboxedRendererClient);
} else {
renderer_client_.reset(new AtomRendererClient);

View File

@@ -14,6 +14,7 @@
#include "base/mac/scoped_nsautorelease_pool.h"
#include "base/path_service.h"
#include "base/strings/sys_string_conversions.h"
#include "content/common/mac_helpers.h"
#include "content/public/common/content_paths.h"
namespace atom {
@@ -26,10 +27,26 @@ base::FilePath GetFrameworksPath() {
base::FilePath GetHelperAppPath(const base::FilePath& frameworks_path,
const std::string& name) {
return frameworks_path.Append(name + " Helper.app")
// Figure out what helper we are running
base::FilePath path;
base::PathService::Get(base::FILE_EXE, &path);
std::string helper_name = "Helper";
if (base::EndsWith(path.value(), content::kMacHelperSuffix_renderer,
base::CompareCase::SENSITIVE)) {
helper_name += content::kMacHelperSuffix_renderer;
} else if (base::EndsWith(path.value(), content::kMacHelperSuffix_gpu,
base::CompareCase::SENSITIVE)) {
helper_name += content::kMacHelperSuffix_gpu;
} else if (base::EndsWith(path.value(), content::kMacHelperSuffix_plugin,
base::CompareCase::SENSITIVE)) {
helper_name += content::kMacHelperSuffix_plugin;
}
return frameworks_path.Append(name + " " + helper_name + ".app")
.Append("Contents")
.Append("MacOS")
.Append(name + " Helper");
.Append(name + " " + helper_name);
}
} // namespace

View File

@@ -25,6 +25,10 @@
#include "gin/v8_initializer.h"
#include "native_mate/dictionary.h"
#if defined(_WIN64)
#include "atom/common/crash_reporter/crash_reporter_win.h"
#endif
namespace atom {
int NodeMain(int argc, char* argv[]) {
@@ -43,6 +47,17 @@ int NodeMain(int argc, char* argv[]) {
feature_list->InitializeFromCommandLine("", "");
base::FeatureList::SetInstance(std::move(feature_list));
#if defined(_WIN64)
crash_reporter::CrashReporterWin::SetUnhandledExceptionFilter();
#endif
// Explicitly register electron's builtin modules.
NodeBindings::RegisterBuiltinModules();
int exec_argc;
const char** exec_argv;
node::Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
gin::V8Initializer::LoadV8Snapshot(
gin::V8Initializer::V8SnapshotFileType::kWithAdditionalContext);
gin::V8Initializer::LoadV8Natives();
@@ -53,21 +68,21 @@ int NodeMain(int argc, char* argv[]) {
// Initialize gin::IsolateHolder.
JavascriptEnvironment gin_env(loop);
// Explicitly register electron's builtin modules.
NodeBindings::RegisterBuiltinModules();
node::IsolateData* isolate_data =
node::CreateIsolateData(gin_env.isolate(), loop, gin_env.platform());
CHECK_NE(nullptr, isolate_data);
int exec_argc;
const char** exec_argv;
node::Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
node::Environment* env = node::CreateEnvironment(
node::CreateIsolateData(gin_env.isolate(), loop, gin_env.platform()),
gin_env.context(), argc, argv, exec_argc, exec_argv);
node::Environment* env =
node::CreateEnvironment(isolate_data, gin_env.context(), argc, argv,
exec_argc, exec_argv, false);
CHECK_NE(nullptr, env);
// Enable support for v8 inspector.
NodeDebugger node_debugger(env);
node_debugger.Start();
node::BootstrapEnvironment(env);
mate::Dictionary process(gin_env.isolate(), env->process_object());
#if defined(OS_WIN)
process.SetMethod("log", &ElectronBindings::Log);
@@ -103,12 +118,16 @@ int NodeMain(int argc, char* argv[]) {
node_debugger.Stop();
exit_code = node::EmitExit(env);
env->set_can_call_into_js(false);
node::RunAtExit(env);
gin_env.platform()->DrainTasks(env->isolate());
gin_env.platform()->CancelPendingDelayedTasks(env->isolate());
gin_env.platform()->UnregisterIsolate(env->isolate());
v8::Isolate* isolate = env->isolate();
node::FreeEnvironment(env);
node::FreeIsolateData(isolate_data);
gin_env.platform()->DrainTasks(isolate);
gin_env.platform()->CancelPendingDelayedTasks(isolate);
gin_env.platform()->UnregisterIsolate(isolate);
}
// According to "src/gin/shell/gin_main.cc":

View File

@@ -10,7 +10,7 @@
#include "base/callback.h"
#include "base/location.h"
#include "base/single_thread_task_runner.h"
#include "uv.h" // NOLINT(build/include)
#include "uv.h" // NOLINT(build/include_directory)
namespace atom {

View File

@@ -860,8 +860,15 @@ base::FilePath App::GetPath(mate::Arguments* args, const std::string& name) {
int key = GetPathConstant(name);
if (key >= 0)
succeed = base::PathService::Get(key, &path);
if (!succeed)
args->ThrowError("Failed to get '" + name + "' path");
if (!succeed) {
if (name == "logs") {
args->ThrowError("Failed to get '" + name +
"' path: setAppLogsPath() must be called first.");
} else {
args->ThrowError("Failed to get '" + name + "' path");
}
}
return path;
}
@@ -1279,6 +1286,13 @@ std::string App::GetUserAgentFallback() {
return AtomBrowserClient::Get()->GetUserAgent();
}
void App::SetBrowserClientCanUseCustomSiteInstance(bool should_disable) {
AtomBrowserClient::Get()->SetCanUseCustomSiteInstance(should_disable);
}
bool App::CanBrowserClientUseCustomSiteInstance() {
return AtomBrowserClient::Get()->CanUseCustomSiteInstance();
}
#if defined(OS_MACOSX)
bool App::MoveToApplicationsFolder(mate::Arguments* args) {
return ui::cocoa::AtomBundleMover::Move(args);
@@ -1288,8 +1302,11 @@ bool App::IsInApplicationsFolder() {
return ui::cocoa::AtomBundleMover::IsCurrentAppInApplicationsFolder();
}
int DockBounce(const std::string& type) {
int DockBounce(mate::Arguments* args) {
int request_id = -1;
std::string type = "informational";
args->GetNext(&type);
if (type == "critical")
request_id = Browser::Get()->DockBounce(Browser::BOUNCE_CRITICAL);
else if (type == "informational")
@@ -1441,7 +1458,10 @@ void App::BuildPrototype(v8::Isolate* isolate,
#endif
.SetProperty("userAgentFallback", &App::GetUserAgentFallback,
&App::SetUserAgentFallback)
.SetMethod("enableSandbox", &App::EnableSandbox);
.SetMethod("enableSandbox", &App::EnableSandbox)
.SetProperty("allowRendererProcessReuse",
&App::CanBrowserClientUseCustomSiteInstance,
&App::SetBrowserClientCanUseCustomSiteInstance);
}
} // namespace api

View File

@@ -212,6 +212,8 @@ class App : public AtomBrowserClient::Delegate,
void EnableSandbox(mate::Arguments* args);
void SetUserAgentFallback(const std::string& user_agent);
std::string GetUserAgentFallback();
void SetBrowserClientCanUseCustomSiteInstance(bool should_disable);
bool CanBrowserClientUseCustomSiteInstance();
#if defined(OS_MACOSX)
bool MoveToApplicationsFolder(mate::Arguments* args);

View File

@@ -67,7 +67,7 @@ BrowserWindow::BrowserWindow(v8::Isolate* isolate,
}
web_contents_.Reset(isolate, web_contents.ToV8());
api_web_contents_ = web_contents.get();
api_web_contents_ = web_contents->GetWeakPtr();
api_web_contents_->AddObserver(this);
Observe(api_web_contents_->web_contents());
@@ -85,8 +85,7 @@ BrowserWindow::BrowserWindow(v8::Isolate* isolate,
InitWith(isolate, wrapper);
#if defined(OS_MACOSX)
if (!window()->has_frame())
OverrideNSWindowContentView(web_contents->managed_web_contents());
OverrideNSWindowContentView(web_contents->managed_web_contents());
#endif
// Init window after everything has been setup.
@@ -94,7 +93,9 @@ BrowserWindow::BrowserWindow(v8::Isolate* isolate,
}
BrowserWindow::~BrowserWindow() {
api_web_contents_->RemoveObserver(this);
// FIXME This is a hack rather than a proper fix preventing shutdown crashes.
if (api_web_contents_)
api_web_contents_->RemoveObserver(this);
// Note that the OnWindowClosed will not be called after the destructor runs,
// since the window object is managed by the TopLevelWindow class.
if (web_contents())
@@ -308,6 +309,16 @@ void BrowserWindow::SetBackgroundColor(const std::string& color_name) {
auto* view = web_contents()->GetRenderWidgetHostView();
if (view)
view->SetBackgroundColor(ParseHexColor(color_name));
// Also update the web preferences object otherwise the view will be reset on
// the next load URL call
if (api_web_contents_) {
auto* web_preferences =
WebContentsPreferences::From(api_web_contents_->web_contents());
if (web_preferences) {
web_preferences->preference()->SetStringKey(options::kBackgroundColor,
color_name);
}
}
}
void BrowserWindow::SetBrowserView(v8::Local<v8::Value> value) {

View File

@@ -116,7 +116,7 @@ class BrowserWindow : public TopLevelWindow,
#endif
v8::Global<v8::Value> web_contents_;
api::WebContents* api_web_contents_;
base::WeakPtr<api::WebContents> api_web_contents_;
base::WeakPtrFactory<BrowserWindow> weak_factory_;

View File

@@ -291,7 +291,7 @@ void SetCookieOnIO(scoped_refptr<net::URLRequestContextGetter> getter,
EXCLUDE_FAILURE_TO_STORE);
return;
}
if (url.is_empty()) {
if (!url.is_valid()) {
std::move(completion_callback)
.Run(net::CanonicalCookie::CookieInclusionStatus::
EXCLUDE_INVALID_DOMAIN);

View File

@@ -73,19 +73,13 @@ bool GlobalShortcut::RegisterAll(
std::vector<ui::Accelerator> registered;
for (auto& accelerator : accelerators) {
#if defined(OS_MACOSX)
if (RegisteringMediaKeyForUntrustedClient(accelerator))
return false;
GlobalShortcutListener* listener = GlobalShortcutListener::GetInstance();
if (!listener->RegisterAccelerator(accelerator, this)) {
if (!Register(accelerator, callback)) {
// unregister all shortcuts if any failed
UnregisterSome(registered);
return false;
}
#endif
registered.push_back(accelerator);
accelerator_callback_map_[accelerator] = callback;
}
return true;
}

View File

@@ -61,7 +61,7 @@ struct Converter<in_app_purchase::Product> {
dict.Set("formattedPrice", val.formattedPrice);
// Downloadable Content Information
dict.Set("isDownloadable", val.downloadable);
dict.Set("isDownloadable", val.isDownloadable);
return dict.GetHandle();
}

View File

@@ -4,16 +4,26 @@
#include "atom/browser/api/atom_api_menu.h"
#include <map>
#include <utility>
#include "atom/browser/native_window.h"
#include "atom/common/native_mate_converters/accelerator_converter.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/once_callback.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "atom/common/node_includes.h"
#include "native_mate/constructor.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
namespace {
// We need this map to keep references to currently opened menus.
// Without this menus would be destroyed by js garbage collector
// even when they are still displayed.
std::map<uint32_t, v8::Global<v8::Object>> g_menus;
} // unnamed namespace
namespace atom {
namespace api {
@@ -192,13 +202,25 @@ bool Menu::WorksWhenHiddenAt(int index) const {
}
void Menu::OnMenuWillClose() {
g_menus.erase(weak_map_id());
Emit("menu-will-close");
}
void Menu::OnMenuWillShow() {
g_menus[weak_map_id()] = v8::Global<v8::Object>(isolate(), GetWrapper());
Emit("menu-will-show");
}
base::OnceClosure Menu::BindSelfToClosure(base::OnceClosure callback) {
// return ((callback, ref) => { callback() }).bind(null, callback, this)
v8::Global<v8::Value> ref(isolate(), GetWrapper());
return base::BindOnce(
[](base::OnceClosure callback, v8::Global<v8::Value> ref) {
std::move(callback).Run();
},
std::move(callback), std::move(ref));
}
// static
void Menu::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) {

View File

@@ -11,6 +11,7 @@
#include "atom/browser/api/atom_api_top_level_window.h"
#include "atom/browser/api/trackable_object.h"
#include "atom/browser/ui/atom_menu_model.h"
#include "atom/common/api/locker.h"
#include "base/callback.h"
namespace atom {
@@ -60,7 +61,7 @@ class Menu : public mate::TrackableObject<Menu>,
int x,
int y,
int positioning_item,
const base::Closure& callback) = 0;
base::OnceClosure callback) = 0;
virtual void ClosePopupAt(int32_t window_id) = 0;
std::unique_ptr<AtomMenuModel> model_;
@@ -70,6 +71,11 @@ class Menu : public mate::TrackableObject<Menu>,
void OnMenuWillClose() override;
void OnMenuWillShow() override;
protected:
// Returns a new callback which keeps references of the JS wrapper until the
// passed |callback| is called.
base::OnceClosure BindSelfToClosure(base::OnceClosure callback);
private:
void InsertItemAt(int index, int command_id, const base::string16& label);
void InsertSeparatorAt(int index);

View File

@@ -27,19 +27,19 @@ class MenuMac : public Menu {
int x,
int y,
int positioning_item,
const base::Closure& callback) override;
base::OnceClosure callback) override;
void PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
int32_t window_id,
int x,
int y,
int positioning_item,
base::Closure callback);
base::OnceClosure callback);
void ClosePopupAt(int32_t window_id) override;
private:
friend class Menu;
void OnClosed(int32_t window_id, base::Closure callback);
void OnClosed(int32_t window_id, base::OnceClosure callback);
scoped_nsobject<AtomMenuController> menu_controller_;

View File

@@ -36,15 +36,20 @@ void MenuMac::PopupAt(TopLevelWindow* window,
int x,
int y,
int positioning_item,
const base::Closure& callback) {
base::OnceClosure callback) {
NativeWindow* native_window = window->window();
if (!native_window)
return;
auto popup = base::Bind(&MenuMac::PopupOnUI, weak_factory_.GetWeakPtr(),
native_window->GetWeakPtr(), window->weak_map_id(), x,
y, positioning_item, callback);
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, popup);
// Make sure the Menu object would not be garbage-collected until the callback
// has run.
base::OnceClosure callback_with_ref = BindSelfToClosure(std::move(callback));
auto popup =
base::BindOnce(&MenuMac::PopupOnUI, weak_factory_.GetWeakPtr(),
native_window->GetWeakPtr(), window->weak_map_id(), x, y,
positioning_item, std::move(callback_with_ref));
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, std::move(popup));
}
void MenuMac::PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
@@ -52,16 +57,17 @@ void MenuMac::PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
int x,
int y,
int positioning_item,
base::Closure callback) {
base::OnceClosure callback) {
if (!native_window)
return;
NSWindow* nswindow = native_window->GetNativeWindow().GetNativeNSWindow();
auto close_callback = base::Bind(
&MenuMac::OnClosed, weak_factory_.GetWeakPtr(), window_id, callback);
popup_controllers_[window_id] = base::scoped_nsobject<AtomMenuController>([
[AtomMenuController alloc] initWithModel:model()
useDefaultAccelerator:NO]);
base::OnceClosure close_callback =
base::BindOnce(&MenuMac::OnClosed, weak_factory_.GetWeakPtr(), window_id,
std::move(callback));
popup_controllers_[window_id] = base::scoped_nsobject<AtomMenuController>(
[[AtomMenuController alloc] initWithModel:model()
useDefaultAccelerator:NO]);
NSMenu* menu = [popup_controllers_[window_id] menu];
NSView* view = [nswindow contentView];
@@ -96,7 +102,7 @@ void MenuMac::PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
if (rightmostMenuPoint > screenRight)
position.x = position.x - [menu size].width;
[popup_controllers_[window_id] setCloseCallback:close_callback];
[popup_controllers_[window_id] setCloseCallback:std::move(close_callback)];
// Make sure events can be pumped while the menu is up.
base::MessageLoopCurrent::ScopedNestableTaskAllower allow;
@@ -127,17 +133,17 @@ void MenuMac::ClosePopupAt(int32_t window_id) {
}
}
void MenuMac::OnClosed(int32_t window_id, base::Closure callback) {
void MenuMac::OnClosed(int32_t window_id, base::OnceClosure callback) {
popup_controllers_.erase(window_id);
callback.Run();
std::move(callback).Run();
}
// static
void Menu::SetApplicationMenu(Menu* base_menu) {
MenuMac* menu = static_cast<MenuMac*>(base_menu);
base::scoped_nsobject<AtomMenuController> menu_controller([
[AtomMenuController alloc] initWithModel:menu->model_.get()
useDefaultAccelerator:YES]);
base::scoped_nsobject<AtomMenuController> menu_controller(
[[AtomMenuController alloc] initWithModel:menu->model_.get()
useDefaultAccelerator:YES]);
NSRunLoop* currentRunLoop = [NSRunLoop currentRunLoop];
[currentRunLoop cancelPerformSelector:@selector(setMainMenu:)

View File

@@ -5,6 +5,7 @@
#include "atom/browser/api/atom_api_menu_views.h"
#include <memory>
#include <utility>
#include "atom/browser/native_window_views.h"
#include "atom/browser/unresponsive_suppressor.h"
@@ -25,7 +26,7 @@ void MenuViews::PopupAt(TopLevelWindow* window,
int x,
int y,
int positioning_item,
const base::Closure& callback) {
base::OnceClosure callback) {
auto* native_window = static_cast<NativeWindowViews*>(window->window());
if (!native_window)
return;
@@ -44,12 +45,21 @@ void MenuViews::PopupAt(TopLevelWindow* window,
// Don't emit unresponsive event when showing menu.
atom::UnresponsiveSuppressor suppressor;
// Make sure the Menu object would not be garbage-collected until the callback
// has run.
base::OnceClosure callback_with_ref = BindSelfToClosure(std::move(callback));
// Show the menu.
//
// Note that while views::MenuRunner accepts RepeatingCallback as close
// callback, it is fine passing OnceCallback to it because we reset the
// menu runner immediately when the menu is closed.
int32_t window_id = window->weak_map_id();
auto close_callback = base::Bind(
&MenuViews::OnClosed, weak_factory_.GetWeakPtr(), window_id, callback);
auto close_callback = base::AdaptCallbackForRepeating(
base::BindOnce(&MenuViews::OnClosed, weak_factory_.GetWeakPtr(),
window_id, std::move(callback_with_ref)));
menu_runners_[window_id] =
std::make_unique<MenuRunner>(model(), flags, close_callback);
std::make_unique<MenuRunner>(model(), flags, std::move(close_callback));
menu_runners_[window_id]->RunMenuAt(
native_window->widget(), NULL, gfx::Rect(location, gfx::Size()),
views::MenuAnchorPosition::kTopLeft, ui::MENU_SOURCE_MOUSE);
@@ -69,9 +79,9 @@ void MenuViews::ClosePopupAt(int32_t window_id) {
}
}
void MenuViews::OnClosed(int32_t window_id, base::Closure callback) {
void MenuViews::OnClosed(int32_t window_id, base::OnceClosure callback) {
menu_runners_.erase(window_id);
callback.Run();
std::move(callback).Run();
}
// static

View File

@@ -27,11 +27,11 @@ class MenuViews : public Menu {
int x,
int y,
int positioning_item,
const base::Closure& callback) override;
base::OnceClosure callback) override;
void ClosePopupAt(int32_t window_id) override;
private:
void OnClosed(int32_t window_id, base::Closure callback);
void OnClosed(int32_t window_id, base::OnceClosure callback);
// window ID -> open context menu
std::map<int32_t, std::unique_ptr<views::MenuRunner>> menu_runners_;

View File

@@ -189,6 +189,7 @@ void Notification::NotificationClosed() {
void Notification::Close() {
if (notification_) {
notification_->Dismiss();
notification_->set_delegate(nullptr);
notification_.reset();
}
}

View File

@@ -51,6 +51,19 @@ std::vector<std::string> MetricsToArray(uint32_t metrics) {
return array;
}
void DelayEmit(Screen* screen,
const base::StringPiece& name,
const display::Display& display) {
screen->Emit(name, display);
}
void DelayEmitWithMetrics(Screen* screen,
const base::StringPiece& name,
const display::Display& display,
const std::vector<std::string>& metrics) {
screen->Emit(name, display, metrics);
}
} // namespace
Screen::Screen(v8::Isolate* isolate, display::Screen* screen)
@@ -100,16 +113,23 @@ static gfx::Rect DIPToScreenRect(atom::NativeWindow* window,
#endif
void Screen::OnDisplayAdded(const display::Display& new_display) {
Emit("display-added", new_display);
base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this), "display-added",
new_display));
}
void Screen::OnDisplayRemoved(const display::Display& old_display) {
Emit("display-removed", old_display);
base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
FROM_HERE, base::Bind(&DelayEmit, base::Unretained(this),
"display-removed", old_display));
}
void Screen::OnDisplayMetricsChanged(const display::Display& display,
uint32_t changed_metrics) {
Emit("display-metrics-changed", display, MetricsToArray(changed_metrics));
base::ThreadTaskRunnerHandle::Get()->PostNonNestableTask(
FROM_HERE, base::Bind(&DelayEmitWithMetrics, base::Unretained(this),
"display-metrics-changed", display,
MetricsToArray(changed_metrics)));
}
// static

View File

@@ -50,8 +50,6 @@
#include "native_mate/object_template_builder.h"
#include "net/base/completion_repeating_callback.h"
#include "net/base/load_flags.h"
#include "net/disk_cache/disk_cache.h"
#include "net/dns/host_cache.h" // nogncheck
#include "net/http/http_auth_handler_factory.h"
#include "net/http/http_auth_preferences.h"
#include "net/http/http_cache.h"
@@ -210,73 +208,6 @@ const char kPersistPrefix[] = "persist:";
// Referenced session objects.
std::map<uint32_t, v8::Global<v8::Object>> g_sessions;
void ResolveOrRejectPromiseInUI(util::Promise promise, int net_error) {
if (net_error != net::OK) {
std::string err_msg = net::ErrorToString(net_error);
util::Promise::RejectPromise(std::move(promise), std::move(err_msg));
} else {
util::Promise::ResolveEmptyPromise(std::move(promise));
}
}
// Callback of HttpCache::GetBackend.
void OnGetBackend(disk_cache::Backend** backend_ptr,
Session::CacheAction action,
const util::CopyablePromise& promise,
int result) {
if (result != net::OK) {
std::string err_msg =
"Failed to retrieve cache backend: " + net::ErrorToString(result);
util::Promise::RejectPromise(promise.GetPromise(), std::move(err_msg));
} else if (backend_ptr && *backend_ptr) {
if (action == Session::CacheAction::CLEAR) {
auto success =
(*backend_ptr)
->DoomAllEntries(base::BindOnce(&ResolveOrRejectPromiseInUI,
promise.GetPromise()));
if (success != net::ERR_IO_PENDING)
ResolveOrRejectPromiseInUI(promise.GetPromise(), success);
} else if (action == Session::CacheAction::STATS) {
base::StringPairs stats;
(*backend_ptr)->GetStats(&stats);
for (const auto& stat : stats) {
if (stat.first == "Current size") {
int current_size;
base::StringToInt(stat.second, &current_size);
util::Promise::ResolvePromise<int>(promise.GetPromise(),
current_size);
break;
}
}
}
}
}
void DoCacheActionInIO(
const scoped_refptr<net::URLRequestContextGetter>& context_getter,
Session::CacheAction action,
util::Promise promise) {
auto* request_context = context_getter->GetURLRequestContext();
auto* http_cache = request_context->http_transaction_factory()->GetCache();
if (!http_cache) {
std::string err_msg =
"Failed to retrieve cache: " + net::ErrorToString(net::ERR_FAILED);
util::Promise::RejectPromise(std::move(promise), std::move(err_msg));
return;
}
// Call GetBackend and make the backend's ptr accessable in OnGetBackend.
using BackendPtr = disk_cache::Backend*;
auto** backend_ptr = new BackendPtr(nullptr);
net::CompletionRepeatingCallback on_get_backend =
base::Bind(&OnGetBackend, base::Owned(backend_ptr), action,
util::CopyablePromise(promise));
int rv = http_cache->GetBackend(backend_ptr, on_get_backend);
if (rv != net::ERR_IO_PENDING)
on_get_backend.Run(net::OK);
}
void SetCertVerifyProcInIO(
const scoped_refptr<net::URLRequestContextGetter>& context_getter,
const AtomCertVerifier::VerifyProc& proc) {
@@ -438,17 +369,39 @@ v8::Local<v8::Promise> Session::ResolveProxy(mate::Arguments* args) {
return handle;
}
template <Session::CacheAction action>
v8::Local<v8::Promise> Session::DoCacheAction() {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
util::Promise promise(isolate);
v8::Local<v8::Promise> handle = promise.GetHandle();
v8::Local<v8::Promise> Session::GetCacheSize() {
auto* isolate = v8::Isolate::GetCurrent();
auto promise = util::Promise(isolate);
auto handle = promise.GetHandle();
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(&DoCacheActionInIO,
WrapRefCounted(browser_context_->GetRequestContext()),
action, std::move(promise)));
content::BrowserContext::GetDefaultStoragePartition(browser_context_.get())
->GetNetworkContext()
->ComputeHttpCacheSize(base::Time(), base::Time::Max(),
base::BindOnce(
[](util::Promise promise, bool is_upper_bound,
int64_t size_or_error) {
if (size_or_error < 0) {
promise.RejectWithErrorMessage(
net::ErrorToString(size_or_error));
} else {
promise.Resolve(size_or_error);
}
},
std::move(promise)));
return handle;
}
v8::Local<v8::Promise> Session::ClearCache() {
auto* isolate = v8::Isolate::GetCurrent();
auto promise = util::Promise(isolate);
auto handle = promise.GetHandle();
content::BrowserContext::GetDefaultStoragePartition(browser_context_.get())
->GetNetworkContext()
->ClearHttpCache(base::Time(), base::Time::Max(), nullptr,
base::BindOnce(util::Promise::ResolveEmptyPromise,
std::move(promise)));
return handle;
}
@@ -559,6 +512,10 @@ void WrapVerifyProc(base::Callback<void(const VerifyRequestParams& request,
base::Callback<void(int)>)> proc,
const VerifyRequestParams& request,
base::OnceCallback<void(int)> cb) {
if (proc.is_null()) {
LOG(ERROR) << "WrapVerifyProc (proc=null)";
return;
}
proc.Run(request, base::AdaptCallbackForRepeating(std::move(cb)));
}
@@ -581,11 +538,6 @@ void Session::SetCertVerifyProc(v8::Local<v8::Value> val,
void Session::SetPermissionRequestHandler(v8::Local<v8::Value> val,
mate::Arguments* args) {
using StatusCallback =
base::RepeatingCallback<void(blink::mojom::PermissionStatus)>;
using RequestHandler =
base::Callback<void(content::WebContents*, content::PermissionType,
StatusCallback, const base::DictionaryValue&)>;
auto* permission_manager = static_cast<AtomPermissionManager*>(
browser_context()->GetPermissionControllerDelegate());
if (val->IsNull()) {
@@ -593,6 +545,11 @@ void Session::SetPermissionRequestHandler(v8::Local<v8::Value> val,
AtomPermissionManager::RequestHandler());
return;
}
using StatusCallback =
base::RepeatingCallback<void(blink::mojom::PermissionStatus)>;
using RequestHandler =
base::Callback<void(content::WebContents*, content::PermissionType,
StatusCallback, const base::Value&)>;
auto handler = std::make_unique<RequestHandler>();
if (!mate::ConvertFromV8(args->isolate(), val, handler.get())) {
args->ThrowError("Must pass null or function");
@@ -602,7 +559,7 @@ void Session::SetPermissionRequestHandler(v8::Local<v8::Value> val,
[](RequestHandler* handler, content::WebContents* web_contents,
content::PermissionType permission_type,
AtomPermissionManager::StatusCallback callback,
const base::DictionaryValue& details) {
const base::Value& details) {
handler->Run(web_contents, permission_type,
base::AdaptCallbackForRepeating(std::move(callback)),
details);
@@ -812,8 +769,8 @@ void Session::BuildPrototype(v8::Isolate* isolate,
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.MakeDestroyable()
.SetMethod("resolveProxy", &Session::ResolveProxy)
.SetMethod("getCacheSize", &Session::DoCacheAction<CacheAction::STATS>)
.SetMethod("clearCache", &Session::DoCacheAction<CacheAction::CLEAR>)
.SetMethod("getCacheSize", &Session::GetCacheSize)
.SetMethod("clearCache", &Session::ClearCache)
.SetMethod("clearStorageData", &Session::ClearStorageData)
.SetMethod("flushStorageData", &Session::FlushStorageData)
.SetMethod("setProxy", &Session::SetProxy)

View File

@@ -63,8 +63,8 @@ class Session : public mate::TrackableObject<Session>,
// Methods.
v8::Local<v8::Promise> ResolveProxy(mate::Arguments* args);
template <CacheAction action>
v8::Local<v8::Promise> DoCacheAction();
v8::Local<v8::Promise> GetCacheSize();
v8::Local<v8::Promise> ClearCache();
v8::Local<v8::Promise> ClearStorageData(mate::Arguments* args);
void FlushStorageData();
v8::Local<v8::Promise> SetProxy(mate::Arguments* args);

View File

@@ -25,6 +25,7 @@
#include "base/values.h"
#include "native_mate/object_template_builder.h"
#include "net/base/mac/url_conversions.h"
#include "ui/native_theme/native_theme.h"
namespace mate {
template <>
@@ -625,6 +626,9 @@ void SystemPreferences::RemoveUserDefault(const std::string& name) {
}
bool SystemPreferences::IsDarkMode() {
if (@available(macOS 10.15, *)) {
return ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeEnabled();
}
NSString* mode = [[NSUserDefaults standardUserDefaults]
stringForKey:@"AppleInterfaceStyle"];
return [mode isEqualToString:@"Dark"];

View File

@@ -198,7 +198,7 @@ void Tray::DisplayBalloon(mate::Arguments* args,
#if defined(OS_WIN)
tray_icon_->DisplayBalloon(
icon.IsEmpty() ? NULL : icon->GetHICON(GetSystemMetrics(SM_CXSMICON)),
icon.IsEmpty() ? NULL : icon->GetHICON(GetSystemMetrics(SM_CXICON)),
title, content);
#else
tray_icon_->DisplayBalloon(icon.IsEmpty() ? gfx::Image() : icon->image(),

View File

@@ -35,7 +35,6 @@
#include "atom/common/color_util.h"
#include "atom/common/mouse_util.h"
#include "atom/common/native_mate_converters/blink_converter.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/content_converter.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/gfx_converter.h"
@@ -43,6 +42,7 @@
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/net_converter.h"
#include "atom/common/native_mate_converters/network_converter.h"
#include "atom/common/native_mate_converters/once_callback.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "atom/common/node_includes.h"
@@ -85,6 +85,7 @@
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
#include "net/url_request/url_request_context.h"
#include "ppapi/buildflags/buildflags.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "third_party/blink/public/mojom/frame/find_in_page.mojom.h"
#include "third_party/blink/public/platform/web_cursor_info.h"
@@ -99,6 +100,12 @@
#if !defined(OS_MACOSX)
#include "ui/aura/window.h"
#else
#include "ui/base/cocoa/defaults_utils.h"
#endif
#if defined(OS_LINUX)
#include "ui/views/linux_ui/linux_ui.h"
#endif
#if defined(OS_LINUX) || defined(OS_WIN)
@@ -268,7 +275,9 @@ struct WebContents::FrameDispatchHelper {
WebContents::WebContents(v8::Isolate* isolate,
content::WebContents* web_contents)
: content::WebContentsObserver(web_contents), type_(REMOTE) {
: content::WebContentsObserver(web_contents),
type_(REMOTE),
weak_factory_(this) {
web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent(),
false);
Init(isolate);
@@ -283,7 +292,9 @@ WebContents::WebContents(v8::Isolate* isolate,
WebContents::WebContents(v8::Isolate* isolate,
std::unique_ptr<content::WebContents> web_contents,
Type type)
: content::WebContentsObserver(web_contents.get()), type_(type) {
: content::WebContentsObserver(web_contents.get()),
type_(type),
weak_factory_(this) {
DCHECK(type != REMOTE) << "Can't take ownership of a remote WebContents";
auto session = Session::CreateFrom(isolate, GetBrowserContext());
session_.Reset(isolate, session.ToV8());
@@ -291,8 +302,8 @@ WebContents::WebContents(v8::Isolate* isolate,
mate::Dictionary::CreateEmpty(isolate));
}
WebContents::WebContents(v8::Isolate* isolate,
const mate::Dictionary& options) {
WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
: weak_factory_(this) {
// Read options.
options.Get("backgroundThrottling", &background_throttling_);
@@ -319,6 +330,12 @@ WebContents::WebContents(v8::Isolate* isolate,
// Whether to enable DevTools.
options.Get("devTools", &enable_devtools_);
// BrowserViews are not attached to a window initially so they should start
// off as hidden. This is also important for compositor recycling. See:
// https://github.com/electron/electron/pull/21372
bool initially_shown = type_ != Type::BROWSER_VIEW;
options.Get(options::kShow, &initially_shown);
// Obtain the session.
std::string partition;
mate::Handle<api::Session> session;
@@ -371,6 +388,7 @@ WebContents::WebContents(v8::Isolate* isolate,
#endif
} else {
content::WebContents::CreateParams params(session->browser_context());
params.initially_hidden = !initially_shown;
web_contents = content::WebContents::Create(params);
}
@@ -415,6 +433,25 @@ void WebContents::InitWithSessionAndOptions(
prefs->subpixel_rendering = params->subpixel_rendering;
#endif
// Honor the system's cursor blink rate settings
#if defined(OS_MACOSX)
base::TimeDelta interval;
if (ui::TextInsertionCaretBlinkPeriod(&interval))
prefs->caret_blink_interval = interval;
#elif defined(OS_LINUX)
views::LinuxUI* linux_ui = views::LinuxUI::instance();
if (linux_ui)
prefs->caret_blink_interval = linux_ui->GetCursorBlinkInterval();
#elif defined(OS_WIN)
const auto system_msec = ::GetCaretBlinkTime();
if (system_msec != 0) {
prefs->caret_blink_interval =
(system_msec == INFINITE)
? base::TimeDelta()
: base::TimeDelta::FromMilliseconds(system_msec);
}
#endif
// Save the preferences in C++.
new WebContentsPreferences(web_contents(), options);
@@ -766,11 +803,20 @@ void WebContents::BeforeUnloadFired(bool proceed,
}
void WebContents::RenderViewCreated(content::RenderViewHost* render_view_host) {
auto* const impl = content::RenderWidgetHostImpl::FromID(
render_view_host->GetProcess()->GetID(),
render_view_host->GetRoutingID());
if (impl)
impl->disable_hidden_ = !background_throttling_;
if (!background_throttling_)
render_view_host->SetSchedulerThrottling(false);
}
void WebContents::RenderFrameCreated(
content::RenderFrameHost* render_frame_host) {
auto* rwhv = render_frame_host->GetView();
if (!rwhv)
return;
auto* rwh_impl =
static_cast<content::RenderWidgetHostImpl*>(rwhv->GetRenderWidgetHost());
if (rwh_impl)
rwh_impl->disable_hidden_ = !background_throttling_;
}
void WebContents::RenderViewHostChanged(content::RenderViewHost* old_host,
@@ -804,10 +850,12 @@ void WebContents::RenderProcessGone(base::TerminationStatus status) {
void WebContents::PluginCrashed(const base::FilePath& plugin_path,
base::ProcessId plugin_pid) {
#if BUILDFLAG(ENABLE_PLUGINS)
content::WebPluginInfo info;
auto* plugin_service = content::PluginService::GetInstance();
plugin_service->GetPluginInfoByPath(plugin_path, &info);
Emit("plugin-crashed", info.name, info.version);
#endif // BUILDFLAG(ENABLE_PLUIGNS)
}
void WebContents::MediaStartedPlaying(const MediaPlayerInfo& video_type,
@@ -837,6 +885,10 @@ void WebContents::OnInterfaceRequestFromFrame(
registry_.TryBindInterface(interface_name, interface_pipe, render_frame_host);
}
void WebContents::DidAcquireFullscreen(content::RenderFrameHost* rfh) {
set_fullscreen_frame(rfh);
}
void WebContents::DocumentLoadedInFrame(
content::RenderFrameHost* render_frame_host) {
if (!render_frame_host->GetParent())
@@ -1191,31 +1243,24 @@ void WebContents::NavigationEntryCommitted(
void WebContents::SetBackgroundThrottling(bool allowed) {
background_throttling_ = allowed;
auto* contents = web_contents();
if (!contents) {
auto* rfh = web_contents()->GetMainFrame();
if (!rfh)
return;
}
auto* render_view_host = contents->GetRenderViewHost();
if (!render_view_host) {
auto* rwhv = rfh->GetView();
if (!rwhv)
return;
}
auto* render_process_host = render_view_host->GetProcess();
if (!render_process_host) {
auto* rwh_impl =
static_cast<content::RenderWidgetHostImpl*>(rwhv->GetRenderWidgetHost());
if (!rwh_impl)
return;
}
auto* render_widget_host_impl = content::RenderWidgetHostImpl::FromID(
render_process_host->GetID(), render_view_host->GetRoutingID());
if (!render_widget_host_impl) {
return;
}
rwh_impl->disable_hidden_ = !background_throttling_;
web_contents()->GetRenderViewHost()->SetSchedulerThrottling(allowed);
render_widget_host_impl->disable_hidden_ = !background_throttling_;
if (render_widget_host_impl->is_hidden()) {
render_widget_host_impl->WasShown(base::nullopt);
if (rwh_impl->is_hidden()) {
rwh_impl->WasShown(base::nullopt);
}
}

View File

@@ -116,6 +116,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype);
base::WeakPtr<WebContents> GetWeakPtr() { return weak_factory_.GetWeakPtr(); }
// Destroy the managed content::WebContents instance.
//
// Note: The |async| should only be |true| when users are expecting to use the
@@ -411,7 +413,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
// content::WebContentsObserver:
void BeforeUnloadFired(bool proceed,
const base::TimeTicks& proceed_time) override;
void RenderViewCreated(content::RenderViewHost*) override;
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override;
void RenderViewHostChanged(content::RenderViewHost* old_host,
content::RenderViewHost* new_host) override;
void RenderViewDeleted(content::RenderViewHost*) override;
@@ -455,6 +458,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
mojo::ScopedMessagePipeHandle* interface_pipe) override;
void DidAcquireFullscreen(content::RenderFrameHost* rfh) override;
// InspectableWebContentsDelegate:
void DevToolsReloadPage() override;
@@ -558,6 +562,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
std::map<content::RenderFrameHost*, std::vector<mojo::BindingId>>
frame_to_bindings_map_;
base::WeakPtrFactory<WebContents> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(WebContents);
};

View File

@@ -4,6 +4,7 @@
#include "atom/browser/api/atom_api_web_request.h"
#include <set>
#include <string>
#include <utility>
@@ -20,23 +21,6 @@
using content::BrowserThread;
namespace mate {
template <>
struct Converter<URLPattern> {
static bool FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
URLPattern* out) {
std::string pattern;
if (!ConvertFromV8(isolate, val, &pattern))
return false;
*out = URLPattern(URLPattern::SCHEME_ALL);
return out->Parse(pattern) == URLPattern::ParseResult::kSuccess;
}
};
} // namespace mate
namespace atom {
namespace api {
@@ -84,7 +68,25 @@ void WebRequest::SetListener(Method method, Event type, mate::Arguments* args) {
// { urls }.
URLPatterns patterns;
mate::Dictionary dict;
args->GetNext(&dict) && dict.Get("urls", &patterns);
std::set<std::string> filter_patterns;
if (args->GetNext(&dict) && !dict.Get("urls", &filter_patterns)) {
args->ThrowError(
"onBeforeRequest parameter 'filter' must have property 'urls'.");
return;
}
URLPattern pattern(URLPattern::SCHEME_ALL);
for (const std::string& filter_pattern : filter_patterns) {
const URLPattern::ParseResult result = pattern.Parse(filter_pattern);
if (result == URLPattern::ParseResult::kSuccess) {
patterns.insert(pattern);
} else {
const char* error_type = URLPattern::GetParseResultString(result);
args->ThrowError("Invalid url pattern " + filter_pattern + ": " +
error_type);
}
}
// Function or null.
v8::Local<v8::Value> value;

View File

@@ -78,8 +78,13 @@
#include "services/network/public/cpp/resource_request_body.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/resource/resource_bundle.h"
#include "ui/native_theme/native_theme.h"
#include "v8/include/v8.h"
#if defined(OS_WIN)
#include "sandbox/win/src/sandbox_policy.h"
#endif
#if defined(USE_NSS_CERTS)
#include "net/ssl/client_cert_store_nss.h"
#elif defined(OS_WIN)
@@ -109,6 +114,11 @@
#include "chrome/browser/printing/printing_message_filter.h"
#endif // BUILDFLAG(ENABLE_PRINTING)
#if defined(OS_MACOSX)
#include "content/common/mac_helpers.h"
#include "content/public/common/child_process_host.h"
#endif
using content::BrowserThread;
namespace atom {
@@ -388,6 +398,11 @@ void AtomBrowserClient::OverrideWebkitPrefs(content::RenderViewHost* host,
prefs->default_maximum_page_scale_factor = 1.f;
prefs->navigate_on_drag_drop = false;
ui::NativeTheme* native_theme = ui::NativeTheme::GetInstanceForNativeUi();
prefs->preferred_color_scheme = native_theme->SystemDarkModeEnabled()
? blink::PreferredColorScheme::kDark
: blink::PreferredColorScheme::kLight;
SetFontDefaults(prefs);
// Custom preferences of guest page.
@@ -397,12 +412,21 @@ void AtomBrowserClient::OverrideWebkitPrefs(content::RenderViewHost* host,
web_preferences->OverrideWebkitPrefs(prefs);
}
void AtomBrowserClient::SetCanUseCustomSiteInstance(bool should_disable) {
disable_process_restart_tricks_ = should_disable;
}
bool AtomBrowserClient::CanUseCustomSiteInstance() {
return disable_process_restart_tricks_;
}
content::ContentBrowserClient::SiteInstanceForNavigationType
AtomBrowserClient::ShouldOverrideSiteInstanceForNavigation(
content::RenderFrameHost* current_rfh,
content::RenderFrameHost* speculative_rfh,
content::BrowserContext* browser_context,
const GURL& url,
bool has_navigation_started,
bool has_response_started,
content::SiteInstance** affinity_site_instance) const {
if (g_suppress_renderer_process_restart) {
@@ -437,6 +461,13 @@ AtomBrowserClient::ShouldOverrideSiteInstanceForNavigation(
return SiteInstanceForNavigationType::FORCE_CURRENT;
}
if (!has_navigation_started) {
// If the navigation didn't start yet, ignore any candidate site instance.
// If such instance exists, it belongs to a previous navigation still
// taking place. Fixes https://github.com/electron/electron/issues/17576.
return SiteInstanceForNavigationType::FORCE_NEW;
}
return SiteInstanceForNavigationType::FORCE_CANDIDATE_OR_NEW;
}
@@ -457,11 +488,28 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
int process_id) {
// Make sure we're about to launch a known executable
{
base::FilePath child_path;
base::PathService::Get(content::CHILD_PROCESS_EXE, &child_path);
base::ThreadRestrictions::ScopedAllowIO allow_io;
CHECK(base::MakeAbsoluteFilePath(command_line->GetProgram()) == child_path);
base::FilePath child_path;
base::FilePath program =
base::MakeAbsoluteFilePath(command_line->GetProgram());
#if defined(OS_MACOSX)
auto renderer_child_path = content::ChildProcessHost::GetChildPath(
content::ChildProcessHost::CHILD_RENDERER);
auto gpu_child_path = content::ChildProcessHost::GetChildPath(
content::ChildProcessHost::CHILD_GPU);
auto plugin_child_path = content::ChildProcessHost::GetChildPath(
content::ChildProcessHost::CHILD_PLUGIN);
if (program != renderer_child_path && program != gpu_child_path &&
program != plugin_child_path) {
child_path = content::ChildProcessHost::GetChildPath(
content::ChildProcessHost::CHILD_NORMAL);
CHECK_EQ(program, child_path)
<< "Aborted from launching unexpected helper executable";
}
#else
base::PathService::Get(content::CHILD_PROCESS_EXE, &child_path);
CHECK_EQ(program, child_path);
#endif
}
std::string process_type =
@@ -503,6 +551,10 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
web_preferences->AppendCommandLineSwitches(command_line);
SessionPreferences::AppendExtraCommandLineSwitches(
web_contents->GetBrowserContext(), command_line);
if (CanUseCustomSiteInstance()) {
command_line->AppendSwitch(
switches::kDisableElectronSiteInstanceOverrides);
}
}
}
@@ -895,6 +947,18 @@ void AtomBrowserClient::SetUserAgent(const std::string& user_agent) {
user_agent_override_ = user_agent;
}
#if defined(OS_WIN)
bool AtomBrowserClient::PreSpawnRenderer(sandbox::TargetPolicy* policy) {
// Allow crashpad to communicate via named pipe.
sandbox::ResultCode result = policy->AddRule(
sandbox::TargetPolicy::SUBSYS_FILES,
sandbox::TargetPolicy::FILES_ALLOW_ANY, L"\\??\\pipe\\crashpad_*");
if (result != sandbox::SBOX_ALL_OK)
return false;
return true;
}
#endif // defined(OS_WIN)
std::string AtomBrowserClient::GetApplicationLocale() {
if (BrowserThread::CurrentlyOn(BrowserThread::IO))
return g_io_thread_application_locale.Get();

View File

@@ -67,6 +67,9 @@ class AtomBrowserClient : public content::ContentBrowserClient,
std::string GetUserAgent() const override;
void SetUserAgent(const std::string& user_agent);
void SetCanUseCustomSiteInstance(bool should_disable);
bool CanUseCustomSiteInstance() override;
protected:
void RenderProcessWillLaunch(
content::RenderProcessHost* host,
@@ -81,6 +84,7 @@ class AtomBrowserClient : public content::ContentBrowserClient,
content::RenderFrameHost* speculative_rfh,
content::BrowserContext* browser_context,
const GURL& url,
bool has_navigation_started,
bool has_request_started,
content::SiteInstance** affinity_site_instance) const override;
void RegisterPendingSiteInstance(
@@ -159,6 +163,9 @@ class AtomBrowserClient : public content::ContentBrowserClient,
network::mojom::NetworkService* network_service) override;
bool ShouldBypassCORB(int render_process_id) const override;
std::string GetProduct() const override;
#if defined(OS_WIN)
bool PreSpawnRenderer(sandbox::TargetPolicy* policy) override;
#endif
// content::RenderProcessHostObserver:
void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
@@ -234,6 +241,8 @@ class AtomBrowserClient : public content::ContentBrowserClient,
std::string user_agent_override_ = "";
bool disable_process_restart_tricks_ = false;
DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient);
};

View File

@@ -48,6 +48,7 @@
#include "services/device/public/mojom/constants.mojom.h"
#include "services/network/public/cpp/features.h"
#include "services/service_manager/public/cpp/connector.h"
#include "third_party/blink/public/common/features.h"
#include "ui/base/idle/idle.h"
#include "ui/base/material_design/material_design_controller.h"
#include "ui/base/ui_base_switches.h"
@@ -209,6 +210,9 @@ void AtomBrowserMainParts::InitializeFeatureList() {
// when node integration is enabled.
disable_features +=
std::string(",") + features::kSpareRendererForSitePerProcess.name;
// Disable LayoutNG as it still isn't fully enabled in Chrome and currently
// is still causing crashes during every day use such as text selection.
disable_features += std::string(",") + blink::features::kLayoutNG.name;
auto feature_list = std::make_unique<base::FeatureList>();
feature_list->InitializeFromCommandLine(enable_features, disable_features);
base::FeatureList::SetInstance(std::move(feature_list));
@@ -302,13 +306,44 @@ void AtomBrowserMainParts::PostEarlyInitialization() {
node_bindings_->Initialize();
// Create the global environment.
node::Environment* env = node_bindings_->CreateEnvironment(
js_env_->context(), js_env_->platform());
js_env_->context(), js_env_->platform(), false);
node_env_.reset(new NodeEnvironment(env));
/**
* 🚨 🚨 🚨 🚨 🚨 🚨 🚨 🚨 🚨
* UNSAFE ENVIRONMENT BLOCK BEGINS
*
* DO NOT USE node::Environment inside this block, bad things will happen
* and you won't be able to figure out why. Just don't touch it, the only
* thing that can use it is NodeDebugger and that is ONLY allowed to access
* the inspector agent.
*
* This is unsafe because the environment is not yet bootstrapped, it's a race
* condition where we can't bootstrap before intializing the inspector agent.
*
* Long term we should figure out how to get node to initialize the inspector
* agent in the correct place without us splitting the bootstrap up, but for
* now this works.
* 🚨 🚨 🚨 🚨 🚨 🚨 🚨 🚨 🚨
*/
// Enable support for v8 inspector
node_debugger_.reset(new NodeDebugger(env));
node_debugger_->Start();
// Only run the node bootstrapper after we have initialized the inspector
// TODO(MarshallOfSound): Figured out a better way to init the inspector
// before bootstrapping
node::BootstrapEnvironment(env);
/**
* ✅ ✅ ✅ ✅ ✅ ✅ ✅
* UNSAFE ENVIRONMENT BLOCK ENDS
*
* Do whatever you want now with that env, it's safe again
* ✅ ✅ ✅ ✅ ✅ ✅ ✅
*/
// Add Electron extended APIs.
electron_bindings_->BindTo(js_env_->isolate(), env->process_object());

View File

@@ -188,12 +188,13 @@ int AtomPermissionManager::RequestPermissionsWithDetails(
const auto callback =
base::BindRepeating(&AtomPermissionManager::OnPermissionResponse,
base::Unretained(this), request_id, i);
if (details == nullptr) {
request_handler_.Run(web_contents, permission, callback,
base::DictionaryValue());
} else {
request_handler_.Run(web_contents, permission, callback, *details);
}
auto mutable_details =
details == nullptr ? base::DictionaryValue() : details->Clone();
mutable_details.SetStringKey(
"requestingUrl", render_frame_host->GetLastCommittedURL().spec());
mutable_details.SetBoolKey("isMainFrame",
render_frame_host->GetParent() == nullptr);
request_handler_.Run(web_contents, permission, callback, mutable_details);
}
return request_id;
@@ -246,8 +247,14 @@ bool AtomPermissionManager::CheckPermissionWithDetails(
}
auto* web_contents =
content::WebContents::FromRenderFrameHost(render_frame_host);
auto mutable_details =
details == nullptr ? base::DictionaryValue() : details->Clone();
mutable_details.SetStringKey("requestingUrl",
render_frame_host->GetLastCommittedURL().spec());
mutable_details.SetBoolKey("isMainFrame",
render_frame_host->GetParent() == nullptr);
return check_handler_.Run(web_contents, permission, requesting_origin,
*details);
mutable_details);
}
blink::mojom::PermissionStatus

View File

@@ -32,11 +32,11 @@ class AtomPermissionManager : public content::PermissionControllerDelegate {
using RequestHandler = base::Callback<void(content::WebContents*,
content::PermissionType,
StatusCallback,
const base::DictionaryValue&)>;
const base::Value&)>;
using CheckHandler = base::Callback<bool(content::WebContents*,
content::PermissionType,
const GURL& requesting_origin,
const base::DictionaryValue&)>;
const base::Value&)>;
// Handler to dispatch permission requests in JS.
void SetPermissionRequestHandler(const RequestHandler& handler);

View File

@@ -25,6 +25,21 @@
namespace atom {
namespace {
// Call |quit| after Chromium is fully started.
//
// This is important for quitting immediately in the "ready" event, when
// certain initialization task may still be pending, and quitting at that time
// could end up with crash on exit.
void RunQuitClosure(base::OnceClosure quit) {
// On Linux/Windows the "ready" event is emitted in "PreMainMessageLoopRun",
// make sure we quit after message loop has run for once.
base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, std::move(quit));
}
} // namespace
Browser::LoginItemSettings::LoginItemSettings() = default;
Browser::LoginItemSettings::~LoginItemSettings() = default;
Browser::LoginItemSettings::LoginItemSettings(const LoginItemSettings& other) =
@@ -93,7 +108,7 @@ void Browser::Shutdown() {
observer.OnQuit();
if (quit_main_message_loop_) {
std::move(quit_main_message_loop_).Run();
RunQuitClosure(std::move(quit_main_message_loop_));
} else {
// There is no message loop available so we are in early stage, wait until
// the quit_main_message_loop_ is available.
@@ -195,7 +210,7 @@ void Browser::PreMainMessageLoopRun() {
void Browser::SetMainMessageLoopQuitClosure(base::OnceClosure quit_closure) {
if (is_shutdown_)
std::move(quit_closure).Run();
RunQuitClosure(std::move(quit_closure));
else
quit_main_message_loop_ = std::move(quit_closure);
}

View File

@@ -149,7 +149,8 @@ bool Browser::IsEmojiPanelSupported() {
void Browser::ShowAboutPanel() {
std::string app_name, version, copyright, icon_path, website;
GtkAboutDialog* dialog = GTK_ABOUT_DIALOG(gtk_about_dialog_new());
GtkWidget* dialogWidget = gtk_about_dialog_new();
GtkAboutDialog* dialog = GTK_ABOUT_DIALOG(dialogWidget);
if (about_panel_options_.GetString("applicationName", &app_name))
gtk_about_dialog_set_program_name(dialog, app_name.c_str());
@@ -161,7 +162,12 @@ void Browser::ShowAboutPanel() {
gtk_about_dialog_set_website(dialog, website.c_str());
if (about_panel_options_.GetString("iconPath", &icon_path)) {
GError* error = nullptr;
GdkPixbuf* icon = gdk_pixbuf_new_from_file(icon_path.c_str(), &error);
constexpr int width = 64; // width of about panel icon in pixels
constexpr int height = 64; // height of about panel icon in pixels
// set preserve_aspect_ratio to true
GdkPixbuf* icon = gdk_pixbuf_new_from_file_at_size(icon_path.c_str(), width,
height, &error);
if (error != nullptr) {
g_warning("%s", error->message);
g_clear_error(&error);
@@ -172,7 +178,7 @@ void Browser::ShowAboutPanel() {
}
gtk_dialog_run(GTK_DIALOG(dialog));
g_clear_object(&dialog);
gtk_widget_destroy(dialogWidget);
}
void Browser::SetAboutPanelOptions(const base::DictionaryValue& options) {

View File

@@ -386,11 +386,18 @@ void Browser::ShowAboutPanel() {
NSDictionary* options = DictionaryValueToNSDictionary(about_panel_options_);
// Credits must be a NSAttributedString instead of NSString
id credits = options[@"Credits"];
NSString* credits = (NSString*)options[@"Credits"];
if (credits != nil) {
NSMutableDictionary* mutable_options = [options mutableCopy];
mutable_options[@"Credits"] = [[[NSAttributedString alloc]
initWithString:(NSString*)credits] autorelease];
base::scoped_nsobject<NSMutableDictionary> mutable_options(
[options mutableCopy]);
base::scoped_nsobject<NSAttributedString> creditString(
[[NSAttributedString alloc]
initWithString:credits
attributes:@{
NSForegroundColorAttributeName : [NSColor textColor]
}]);
[mutable_options setValue:creditString forKey:@"Credits"];
options = [NSDictionary dictionaryWithDictionary:mutable_options];
}

View File

@@ -96,9 +96,6 @@ void Browser::Focus() {
}
void Browser::AddRecentDocument(const base::FilePath& path) {
if (base::win::GetVersion() < base::win::Version::WIN7)
return;
CComPtr<IShellItem> item;
HRESULT hr = SHCreateItemFromParsingName(path.value().c_str(), NULL,
IID_PPV_ARGS(&item));
@@ -111,13 +108,7 @@ void Browser::AddRecentDocument(const base::FilePath& path) {
}
void Browser::ClearRecentDocuments() {
CComPtr<IApplicationDestinations> destinations;
if (FAILED(destinations.CoCreateInstance(CLSID_ApplicationDestinations, NULL,
CLSCTX_INPROC_SERVER)))
return;
if (FAILED(destinations->SetAppID(GetAppUserModelID())))
return;
destinations->RemoveAllDestinations();
SHAddToRecentDocs(SHARD_APPIDINFO, nullptr);
}
void Browser::SetAppUserModelID(const base::string16& name) {

View File

@@ -328,9 +328,12 @@ void CommonWebContentsDelegate::EnterFullscreenModeForTab(
const blink::WebFullscreenOptions& options) {
if (!owner_window_)
return;
if (IsFullscreenForTabOrPending(source)) {
DCHECK_EQ(fullscreen_frame_, source->GetFocusedFrame());
return;
}
SetHtmlApiFullscreen(true);
owner_window_->NotifyWindowEnterHtmlFullScreen();
source->GetRenderViewHost()->GetWidget()->SynchronizeVisualProperties();
}
void CommonWebContentsDelegate::ExitFullscreenModeForTab(
@@ -339,7 +342,13 @@ void CommonWebContentsDelegate::ExitFullscreenModeForTab(
return;
SetHtmlApiFullscreen(false);
owner_window_->NotifyWindowLeaveHtmlFullScreen();
source->GetRenderViewHost()->GetWidget()->SynchronizeVisualProperties();
if (native_fullscreen_) {
// Explicitly trigger a view resize, as the size is not actually changing if
// the browser is fullscreened, too. Chrome does this indirectly from
// `chrome/browser/ui/exclusive_access/fullscreen_controller.cc`.
source->GetRenderViewHost()->GetWidget()->SynchronizeVisualProperties();
}
}
bool CommonWebContentsDelegate::IsFullscreenForTabOrPending(

View File

@@ -68,6 +68,10 @@ class CommonWebContentsDelegate : public content::WebContentsDelegate,
bool is_html_fullscreen() const { return html_fullscreen_; }
void set_fullscreen_frame(content::RenderFrameHost* rfh) {
fullscreen_frame_ = rfh;
}
protected:
#if BUILDFLAG(ENABLE_OSR)
virtual OffScreenWebContentsView* GetOffScreenWebContentsView() const;
@@ -203,6 +207,9 @@ class CommonWebContentsDelegate : public content::WebContentsDelegate,
scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
// Stores the frame thats currently in fullscreen, nullptr if there is none.
content::RenderFrameHost* fullscreen_frame_ = nullptr;
base::WeakPtrFactory<CommonWebContentsDelegate> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(CommonWebContentsDelegate);

View File

@@ -30,7 +30,7 @@ JavascriptEnvironment::JavascriptEnvironment(uv_loop_t* event_loop)
isolate_scope_(isolate_),
locker_(isolate_),
handle_scope_(isolate_),
context_(isolate_, v8::Context::New(isolate_)),
context_(isolate_, node::NewContext(isolate_)),
context_scope_(v8::Local<v8::Context>::New(isolate_, context_)) {}
JavascriptEnvironment::~JavascriptEnvironment() = default;

View File

@@ -9,7 +9,7 @@
#include "base/macros.h"
#include "gin/public/isolate_holder.h"
#include "uv.h" // NOLINT(build/include)
#include "uv.h" // NOLINT(build/include_directory)
namespace node {
class Environment;

View File

@@ -29,7 +29,7 @@ struct Product {
std::string formattedPrice;
// Downloadable Content Information
bool downloadable = false;
bool isDownloadable = false;
Product(const Product&);
Product();

View File

@@ -146,9 +146,7 @@
}
// Downloadable Content Information
if (product.downloadable == true) {
productStruct.downloadable = true;
}
productStruct.isDownloadable = [product downloadable];
return productStruct;
}

View File

@@ -21,7 +21,6 @@
@class AtomPreviewItem;
@class AtomTouchBar;
@class CustomWindowButtonView;
@class FullSizeContentView;
namespace atom {
@@ -158,7 +157,7 @@ class NativeWindowMac : public NativeWindow {
AtomTouchBar* touch_bar() const { return touch_bar_.get(); }
bool zoom_to_page_width() const { return zoom_to_page_width_; }
bool fullscreen_window_title() const { return fullscreen_window_title_; }
bool simple_fullscreen() const { return always_simple_fullscreen_; }
bool always_simple_fullscreen() const { return always_simple_fullscreen_; }
protected:
// views::WidgetDelegate:
@@ -182,10 +181,12 @@ class NativeWindowMac : public NativeWindow {
// Event monitor for scroll wheel event.
id wheel_event_monitor_;
// The view that will fill the whole frameless window.
base::scoped_nsobject<FullSizeContentView> container_view_;
// The NSView that used as contentView of window.
//
// For frameless window it would fill the whole window.
base::scoped_nsobject<NSView> container_view_;
// The view that fills the client area.
// The views::View that fills the client area.
std::unique_ptr<RootViewMac> root_view_;
bool is_kiosk_ = false;

View File

@@ -22,6 +22,7 @@
#include "atom/common/options_switches.h"
#include "base/mac/mac_util.h"
#include "base/mac/scoped_cftyperef.h"
#include "base/numerics/ranges.h"
#include "base/strings/sys_string_conversions.h"
#include "components/remote_cocoa/app_shim/bridged_native_widget_impl.h"
#include "content/public/browser/browser_accessibility_state.h"
@@ -30,8 +31,59 @@
#include "ui/gfx/skia_util.h"
#include "ui/gl/gpu_switching_manager.h"
#include "ui/views/background.h"
#include "ui/views/cocoa/bridged_native_widget_host_impl.h"
#include "ui/views/widget/widget.h"
// This view would inform Chromium to resize the hosted views::View.
//
// The overrided methods should behave the same with BridgedContentView.
@interface ElectronAdapatedContentView : NSView {
@private
views::BridgedNativeWidgetHostImpl* bridge_host_;
}
@end
@implementation ElectronAdapatedContentView
- (id)initWithShell:(atom::NativeWindowMac*)shell {
if ((self = [self init])) {
bridge_host_ = views::BridgedNativeWidgetHostImpl::GetFromNativeWindow(
shell->GetNativeWindow());
}
return self;
}
- (void)viewDidMoveToWindow {
// When this view is added to a window, AppKit calls setFrameSize before it is
// added to the window, so the behavior in setFrameSize is not triggered.
NSWindow* window = [self window];
if (window)
[self setFrameSize:NSZeroSize];
}
- (void)setFrameSize:(NSSize)newSize {
// The size passed in here does not always use
// -[NSWindow contentRectForFrameRect]. The following ensures that the
// contentView for a frameless window can extend over the titlebar of the new
// window containing it, since AppKit requires a titlebar to give frameless
// windows correct shadows and rounded corners.
NSWindow* window = [self window];
if (window && [window contentView] == self) {
newSize = [window contentRectForFrameRect:[window frame]].size;
// Ensure that the window geometry be updated on the host side before the
// view size is updated.
bridge_host_->bridge_impl()->UpdateWindowGeometry();
}
[super setFrameSize:newSize];
// The OnViewSizeChanged is marked private in derived class.
static_cast<remote_cocoa::mojom::BridgedNativeWidgetHost*>(bridge_host_)
->OnViewSizeChanged(gfx::Size(newSize.width, newSize.height));
}
@end
// This view always takes the size of its superview. It is intended to be used
// as a NSWindow's contentView. It is needed because NSWindow's implementation
// explicitly resizes the contentView at inopportune times.
@@ -493,6 +545,8 @@ void NativeWindowMac::Close() {
// When this is a sheet showing, performClose won't work.
if (is_modal() && parent() && IsVisible()) {
[parent()->GetNativeWindow().GetNativeNSWindow() endSheet:window_];
// Manually emit close event (not triggered from close fn)
NotifyWindowCloseButtonClicked();
CloseImmediately();
return;
}
@@ -825,6 +879,7 @@ void NativeWindowMac::SetAlwaysOnTop(bool top,
int relativeLevel,
std::string* error) {
int windowLevel = NSNormalWindowLevel;
bool level_changed = top != widget()->IsAlwaysOnTop();
CGWindowLevel maxWindowLevel = CGWindowLevelForKey(kCGMaximumWindowLevelKey);
CGWindowLevel minWindowLevel = CGWindowLevelForKey(kCGMinimumWindowLevelKey);
@@ -851,12 +906,22 @@ void NativeWindowMac::SetAlwaysOnTop(bool top,
NSInteger newLevel = windowLevel + relativeLevel;
if (newLevel >= minWindowLevel && newLevel <= maxWindowLevel) {
was_maximizable_ = IsMaximizable();
[window_ setLevel:newLevel];
// Set level will make the zoom button revert to default, probably
// a bug of Cocoa or macOS.
[[window_ standardWindowButton:NSWindowZoomButton]
setEnabled:was_maximizable_];
} else {
*error = std::string([[NSString
stringWithFormat:@"relativeLevel must be between %d and %d",
minWindowLevel, maxWindowLevel] UTF8String]);
}
// This must be notified at the very end or IsAlwaysOnTop
// will not yet have been updated to reflect the new status
if (level_changed)
NativeWindow::NotifyWindowAlwaysOnTopChanged();
}
bool NativeWindowMac::IsAlwaysOnTop() {
@@ -1036,7 +1101,8 @@ bool NativeWindowMac::HasShadow() {
}
void NativeWindowMac::SetOpacity(const double opacity) {
[window_ setAlphaValue:opacity];
const double boundedOpacity = base::ClampToRange(opacity, 0.0, 1.0);
[window_ setAlphaValue:boundedOpacity];
}
double NativeWindowMac::GetOpacity() {
@@ -1483,10 +1549,15 @@ void NativeWindowMac::OverrideNSWindowContentView() {
// `BridgedContentView` as content view, which does not support draggable
// regions. In order to make draggable regions work, we have to replace the
// content view with a simple NSView.
container_view_.reset([[FullSizeContentView alloc] init]);
if (has_frame()) {
container_view_.reset(
[[ElectronAdapatedContentView alloc] initWithShell:this]);
} else {
container_view_.reset([[FullSizeContentView alloc] init]);
[container_view_ setFrame:[[[window_ contentView] superview] bounds]];
}
[container_view_
setAutoresizingMask:NSViewWidthSizable | NSViewHeightSizable];
[container_view_ setFrame:[[[window_ contentView] superview] bounds]];
[window_ setContentView:container_view_];
AddContentViewLayers(IsMinimizable(), IsClosable());
}

View File

@@ -25,6 +25,7 @@
#include "atom/common/draggable_region.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/options_switches.h"
#include "base/numerics/ranges.h"
#include "base/strings/utf_string_conversions.h"
#include "content/public/browser/browser_thread.h"
#include "native_mate/dictionary.h"
@@ -301,7 +302,6 @@ NativeWindowViews::NativeWindowViews(const mate::Dictionary& options,
last_window_state_ = ui::SHOW_STATE_FULLSCREEN;
else
last_window_state_ = ui::SHOW_STATE_NORMAL;
last_normal_bounds_ = GetBounds();
#endif
#if defined(OS_LINUX)
@@ -754,10 +754,14 @@ void NativeWindowViews::SetAlwaysOnTop(bool top,
const std::string& level,
int relativeLevel,
std::string* error) {
if (top != widget()->IsAlwaysOnTop())
NativeWindow::NotifyWindowAlwaysOnTopChanged();
bool level_changed = top != widget()->IsAlwaysOnTop();
widget()->SetAlwaysOnTop(top);
// This must be notified at the very end or IsAlwaysOnTop
// will not yet have been updated to reflect the new status
if (level_changed)
NativeWindow::NotifyWindowAlwaysOnTopChanged();
}
bool NativeWindowViews::IsAlwaysOnTop() {
@@ -862,6 +866,7 @@ bool NativeWindowViews::HasShadow() {
void NativeWindowViews::SetOpacity(const double opacity) {
#if defined(OS_WIN)
const double boundedOpacity = base::ClampToRange(opacity, 0.0, 1.0);
HWND hwnd = GetAcceleratedWidget();
if (!layered_) {
LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
@@ -869,9 +874,11 @@ void NativeWindowViews::SetOpacity(const double opacity) {
::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
layered_ = true;
}
::SetLayeredWindowAttributes(hwnd, 0, opacity * 255, LWA_ALPHA);
::SetLayeredWindowAttributes(hwnd, 0, boundedOpacity * 255, LWA_ALPHA);
opacity_ = boundedOpacity;
#else
opacity_ = 1.0; // setOpacity unsupported on Linux
#endif
opacity_ = opacity;
}
double NativeWindowViews::GetOpacity() {
@@ -915,6 +922,7 @@ void NativeWindowViews::SetContentProtection(bool enable) {
}
void NativeWindowViews::SetFocusable(bool focusable) {
widget()->widget_delegate()->SetCanActivate(focusable);
#if defined(OS_WIN)
LONG ex_style = ::GetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE);
if (focusable)

View File

@@ -241,23 +241,6 @@ class NativeWindowViews : public NativeWindow,
gfx::Rect last_normal_placement_bounds_;
// There's an issue with restore on Windows, that sometimes causes the Window
// to receive the wrong size (#2498). To circumvent that, we keep tabs on the
// size of the window while in the normal state (not maximized, minimized or
// fullscreen), so we restore it correctly.
gfx::Rect last_normal_bounds_;
gfx::Rect last_normal_bounds_before_move_;
// last_normal_bounds_ may or may not require update on WM_MOVE. When a
// window is maximized, it is moved (WM_MOVE) to maximum size first and then
// sized (WM_SIZE). In this case, last_normal_bounds_ should not update. We
// keep last_normal_bounds_candidate_ as a candidate which will become valid
// last_normal_bounds_ if the moves are consecutive with no WM_SIZE event in
// between.
gfx::Rect last_normal_bounds_candidate_;
bool consecutive_moves_;
// In charge of running taskbar related APIs.
TaskbarHost taskbar_host_;
@@ -280,6 +263,9 @@ class NativeWindowViews : public NativeWindow,
bool forwarding_mouse_messages_ = false;
HWND legacy_window_ = NULL;
bool layered_ = false;
// Whether to block Chromium from handling window messages.
bool block_chromium_message_handler_ = false;
#endif
// Handles unhandled keyboard messages coming back from the renderer process.

View File

@@ -143,153 +143,28 @@ bool IsScreenReaderActive() {
return screenReader && UiaClientsAreListening();
}
// We use "enum" instead of "enum class" because we need to do bitwise compare.
enum AppbarAutohideEdge {
TOP = 1 << 0,
LEFT = 1 << 1,
BOTTOM = 1 << 2,
RIGHT = 1 << 3,
};
// The thickness of an auto-hide taskbar in pixel.
constexpr int kAutoHideTaskbarThicknessPx = 2;
// Code is copied from chrome_views_delegate_win.cc.
bool MonitorHasAutohideTaskbarForEdge(UINT edge, HMONITOR monitor) {
APPBARDATA taskbar_data = {sizeof(APPBARDATA), NULL, 0, edge};
taskbar_data.hWnd = ::GetForegroundWindow();
// MSDN documents an ABM_GETAUTOHIDEBAREX, which supposedly takes a monitor
// rect and returns autohide bars on that monitor. This sounds like a good
// idea for multi-monitor systems. Unfortunately, it appears to not work at
// least some of the time (erroneously returning NULL) and there's almost no
// online documentation or other sample code using it that suggests ways to
// address this problem. We do the following:-
// 1. Use the ABM_GETAUTOHIDEBAR message. If it works, i.e. returns a valid
// window we are done.
// 2. If the ABM_GETAUTOHIDEBAR message does not work we query the auto hide
// state of the taskbar and then retrieve its position. That call returns
// the edge on which the taskbar is present. If it matches the edge we
// are looking for, we are done.
// NOTE: This call spins a nested run loop.
HWND taskbar = reinterpret_cast<HWND>(
SHAppBarMessage(ABM_GETAUTOHIDEBAR, &taskbar_data));
if (!::IsWindow(taskbar)) {
APPBARDATA taskbar_data = {sizeof(APPBARDATA), 0, 0, 0};
unsigned int taskbar_state = SHAppBarMessage(ABM_GETSTATE, &taskbar_data);
if (!(taskbar_state & ABS_AUTOHIDE))
return false;
taskbar_data.hWnd = ::FindWindow(L"Shell_TrayWnd", NULL);
if (!::IsWindow(taskbar_data.hWnd))
return false;
SHAppBarMessage(ABM_GETTASKBARPOS, &taskbar_data);
if (taskbar_data.uEdge == edge)
taskbar = taskbar_data.hWnd;
}
// There is a potential race condition here:
// 1. A maximized chrome window is fullscreened.
// 2. It is switched back to maximized.
// 3. In the process the window gets a WM_NCCACLSIZE message which calls us to
// get the autohide state.
// 4. The worker thread is invoked. It calls the API to get the autohide
// state. On Windows versions earlier than Windows 7, taskbars could
// easily be always on top or not.
// This meant that we only want to look for taskbars which have the topmost
// bit set. However this causes problems in cases where the window on the
// main thread is still in the process of switching away from fullscreen.
// In this case the taskbar might not yet have the topmost bit set.
// 5. The main thread resumes and does not leave space for the taskbar and
// hence it does not pop when hovered.
//
// To address point 4 above, it is best to not check for the WS_EX_TOPMOST
// window style on the taskbar, as starting from Windows 7, the topmost
// style is always set. We don't support XP and Vista anymore.
if (::IsWindow(taskbar)) {
if (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONEAREST) == monitor)
return true;
// In some cases like when the autohide taskbar is on the left of the
// secondary monitor, the MonitorFromWindow call above fails to return the
// correct monitor the taskbar is on. We fallback to MonitorFromPoint for
// the cursor position in that case, which seems to work well.
POINT cursor_pos = {0};
GetCursorPos(&cursor_pos);
if (MonitorFromPoint(cursor_pos, MONITOR_DEFAULTTONEAREST) == monitor)
return true;
}
return false;
}
int GetAppbarAutohideEdges(HWND hwnd) {
HMONITOR monitor = MonitorFromWindow(hwnd, MONITOR_DEFAULTTONULL);
if (!monitor)
return 0;
int edges = 0;
if (MonitorHasAutohideTaskbarForEdge(ABE_LEFT, monitor))
edges |= AppbarAutohideEdge::LEFT;
if (MonitorHasAutohideTaskbarForEdge(ABE_TOP, monitor))
edges |= AppbarAutohideEdge::TOP;
if (MonitorHasAutohideTaskbarForEdge(ABE_RIGHT, monitor))
edges |= AppbarAutohideEdge::RIGHT;
if (MonitorHasAutohideTaskbarForEdge(ABE_BOTTOM, monitor))
edges |= AppbarAutohideEdge::BOTTOM;
return edges;
}
} // namespace
std::set<NativeWindowViews*> NativeWindowViews::forwarding_windows_;
HHOOK NativeWindowViews::mouse_hook_ = NULL;
void NativeWindowViews::Maximize() {
int autohide_edges = 0;
if (!has_frame())
autohide_edges = GetAppbarAutohideEdges(GetAcceleratedWidget());
// Only use Maximize() when:
// 1. window has WS_THICKFRAME style;
// 2. and window is not frameless when there is autohide taskbar.
if ((::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME) &&
(has_frame() || autohide_edges == 0)) {
if (::GetWindowLong(GetAcceleratedWidget(), GWL_STYLE) & WS_THICKFRAME) {
if (IsVisible())
widget()->Maximize();
else
widget()->native_widget_private()->Show(ui::SHOW_STATE_MAXIMIZED,
gfx::Rect());
return;
} else {
restore_bounds_ = GetBounds();
auto display =
display::Screen::GetScreen()->GetDisplayNearestPoint(GetPosition());
SetBounds(display.work_area(), false);
}
gfx::Insets insets;
if (!has_frame()) {
// When taskbar is autohide, we need to leave some space so the window
// isn't treated as a "fullscreen app", which would cause the taskbars
// to disappear.
//
// This trick comes from hwnd_message_handler.cc. While Chromium already
// does this for normal window, somehow it is not applying the trick when
// using frameless window, and we have to do it ourselves.
float scale_factor =
display::win::ScreenWin::GetScaleFactorForHWND(GetAcceleratedWidget());
int thickness = std::ceil(kAutoHideTaskbarThicknessPx / scale_factor);
if (autohide_edges & AppbarAutohideEdge::LEFT)
insets.set_left(-thickness);
if (autohide_edges & AppbarAutohideEdge::TOP)
insets.set_top(-thickness);
if (autohide_edges & AppbarAutohideEdge::RIGHT)
insets.set_right(thickness);
if (autohide_edges & AppbarAutohideEdge::BOTTOM)
insets.set_bottom(thickness);
}
restore_bounds_ = GetBounds();
auto display =
display::Screen::GetScreen()->GetDisplayNearestPoint(GetPosition());
gfx::Rect bounds = display.work_area();
bounds.Inset(insets);
SetBounds(bounds, false);
}
bool NativeWindowViews::ExecuteWindowsCommand(int command_id) {
@@ -305,6 +180,14 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
LRESULT* result) {
NotifyWindowMessage(message, w_param, l_param);
// See code below for why blocking Chromium from handling messages.
if (block_chromium_message_handler_) {
// Handle the message with default proc.
*result = DefWindowProc(GetAcceleratedWidget(), message, w_param, l_param);
// Tell Chromium to ignore this message.
return true;
}
switch (message) {
// Screen readers send WM_GETOBJECT in order to get the accessibility
// object, so take this opportunity to push Chromium into accessible
@@ -346,37 +229,25 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
// use the proper display to calculate the scale factor to use.
if (!last_normal_placement_bounds_.IsEmpty() &&
GetWindowPlacement(GetAcceleratedWidget(), &wp)) {
last_normal_placement_bounds_.set_size(gfx::Size(0, 0));
wp.rcNormalPosition = last_normal_placement_bounds_.ToRECT();
// When calling SetWindowPlacement, Chromium would do window messages
// handling. But since we are already in PreHandleMSG this would cause
// crash in Chromium under some cases.
//
// We work around the crash by prevent Chromium from handling window
// messages until the SetWindowPlacement call is done.
//
// See https://github.com/electron/electron/issues/21614 for more.
block_chromium_message_handler_ = true;
SetWindowPlacement(GetAcceleratedWidget(), &wp);
block_chromium_message_handler_ = false;
last_normal_placement_bounds_ = gfx::Rect();
}
return false;
}
case WM_NCCALCSIZE: {
if (!has_frame() && w_param == TRUE) {
NCCALCSIZE_PARAMS* params =
reinterpret_cast<NCCALCSIZE_PARAMS*>(l_param);
RECT PROPOSED = params->rgrc[0];
RECT BEFORE = params->rgrc[1];
// We need to call the default to have cascade and tile windows
// working
// (https://github.com/rossy/borderless-window/blob/master/borderless-window.c#L239),
// but we need to provide the proposed original value as suggested in
// https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/
DefWindowProcW(GetAcceleratedWidget(), WM_NCCALCSIZE, w_param, l_param);
params->rgrc[0] = PROPOSED;
params->rgrc[1] = BEFORE;
return true;
} else {
return false;
}
}
case WM_COMMAND:
// Handle thumbar button click message.
if (HIWORD(w_param) == THBN_CLICKED)
@@ -396,10 +267,6 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
case WM_SIZE: {
// Handle window state change.
HandleSizeEvent(w_param, l_param);
consecutive_moves_ = false;
last_normal_bounds_before_move_ = last_normal_bounds_;
return false;
}
case WM_MOVING: {
@@ -415,15 +282,6 @@ bool NativeWindowViews::PreHandleMSG(UINT message,
}
return false;
}
case WM_MOVE: {
if (last_window_state_ == ui::SHOW_STATE_NORMAL) {
if (consecutive_moves_)
last_normal_bounds_ = last_normal_bounds_candidate_;
last_normal_bounds_candidate_ = GetBounds();
consecutive_moves_ = true;
}
return false;
}
case WM_ENDSESSION: {
if (w_param) {
NotifyWindowEndSession();
@@ -453,26 +311,7 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {
// window state and notify the user accordingly.
switch (w_param) {
case SIZE_MAXIMIZED: {
// Frameless maximized windows are size compensated by Windows for a
// border that's not actually there, so we must conter-compensate.
// https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/
if (!has_frame()) {
float scale_factor = display::win::ScreenWin::GetScaleFactorForHWND(
GetAcceleratedWidget());
int border =
GetSystemMetrics(SM_CXFRAME) + GetSystemMetrics(SM_CXPADDEDBORDER);
if (!thick_frame_) {
border -= GetSystemMetrics(SM_CXBORDER);
}
root_view_->SetInsets(gfx::Insets(border).Scale(1.0f / scale_factor));
}
last_window_state_ = ui::SHOW_STATE_MAXIMIZED;
if (consecutive_moves_) {
last_normal_bounds_ = last_normal_bounds_before_move_;
}
NotifyWindowMaximize();
break;
}
@@ -489,36 +328,22 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {
NotifyWindowMinimize();
break;
case SIZE_RESTORED:
if (last_window_state_ == ui::SHOW_STATE_NORMAL) {
// Window was resized so we save it's new size.
last_normal_bounds_ = GetBounds();
last_normal_bounds_before_move_ = last_normal_bounds_;
} else {
switch (last_window_state_) {
case ui::SHOW_STATE_MAXIMIZED:
switch (last_window_state_) {
case ui::SHOW_STATE_MAXIMIZED:
last_window_state_ = ui::SHOW_STATE_NORMAL;
NotifyWindowUnmaximize();
break;
case ui::SHOW_STATE_MINIMIZED:
if (IsFullscreen()) {
last_window_state_ = ui::SHOW_STATE_FULLSCREEN;
NotifyWindowEnterFullScreen();
} else {
last_window_state_ = ui::SHOW_STATE_NORMAL;
root_view_->SetInsets(gfx::Insets(0));
NotifyWindowUnmaximize();
break;
case ui::SHOW_STATE_MINIMIZED:
if (IsFullscreen()) {
last_window_state_ = ui::SHOW_STATE_FULLSCREEN;
NotifyWindowEnterFullScreen();
} else {
last_window_state_ = ui::SHOW_STATE_NORMAL;
// When the window is restored we resize it to the previous known
// normal size.
if (has_frame()) {
SetBounds(last_normal_bounds_, false);
}
NotifyWindowRestore();
}
break;
default:
break;
}
NotifyWindowRestore();
}
break;
default:
break;
}
break;
}

View File

@@ -38,6 +38,20 @@ void BeforeStartInUI(base::WeakPtr<URLRequestAsyncAsarJob> job,
error = net::ERR_NOT_IMPLEMENTED;
}
// sanitize custom headers
if (request_options && request_options->is_dict()) {
const base::Value* headersDict = request_options->FindDictKey("headers");
if (headersDict) {
for (const auto& iter : headersDict->DictItems()) {
if (!iter.second.is_string()) {
args->ThrowError("Value of '" + iter.first +
"' header has to be a string");
return;
}
}
}
}
base::PostTaskWithTraits(
FROM_HERE, {content::BrowserThread::IO},
base::BindOnce(&URLRequestAsyncAsarJob::StartAsync, job,

View File

@@ -37,13 +37,13 @@ void NodeDebugger::Start() {
}
node::DebugOptions options;
node::options_parser::DebugOptionsParser options_parser;
std::vector<std::string> exec_args;
std::vector<std::string> v8_args;
std::vector<std::string> errors;
options_parser.Parse(&args, &exec_args, &v8_args, &options,
node::options_parser::kDisallowedInEnvironment, &errors);
node::options_parser::Parse(&args, &exec_args, &v8_args, &options,
node::options_parser::kDisallowedInEnvironment,
&errors);
if (!errors.empty()) {
// TODO(jeremy): what's the appropriate behaviour here?
@@ -60,8 +60,10 @@ void NodeDebugger::Start() {
void NodeDebugger::Stop() {
auto* inspector = env_->inspector_agent();
if (inspector && inspector->IsListening())
if (inspector && inspector->IsListening()) {
inspector->WaitForDisconnect();
inspector->Stop();
}
}
} // namespace atom

View File

@@ -270,10 +270,16 @@ LRESULT DesktopNotificationController::Toast::WndProc(HWND hwnd,
case WM_MOUSEACTIVATE:
return MA_NOACTIVATE;
case WM_TIMER:
case WM_TIMER: {
if (wparam == TimerID_AutoDismiss) {
Get(hwnd)->AutoDismiss();
auto* inst = Get(hwnd);
Notification notification(inst->data_);
inst->data_->controller->OnNotificationDismissed(notification);
inst->AutoDismiss();
}
}
return 0;
case WM_LBUTTONDOWN: {

View File

@@ -47,8 +47,12 @@ void Win32Notification::Show(const NotificationOptions& options) {
if (existing) {
existing->tag_.clear();
this->notification_ref_ = std::move(existing->notification_ref_);
this->notification_ref_.Set(options.title, options.msg, image);
// Need to remove the entry in the notifications set that
// NotificationPresenter is holding
existing->Destroy();
} else {
this->notification_ref_ =
presenter->AddNotification(options.title, options.msg, image);

View File

@@ -17,9 +17,9 @@
<key>CFBundleIconFile</key>
<string>electron.icns</string>
<key>CFBundleVersion</key>
<string>6.0.0-beta.7</string>
<string>6.1.12</string>
<key>CFBundleShortVersionString</key>
<string>6.0.0-beta.7</string>
<string>6.1.12</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSMinimumSystemVersion</key>
@@ -32,5 +32,9 @@
<true/>
<key>NSHighResolutionCapable</key>
<true/>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs access to the microphone</string>
<key>NSCameraUsageDescription</key>
<string>This app needs access to the camera</string>
</dict>
</plist>

View File

@@ -50,8 +50,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 6,0,0,7
PRODUCTVERSION 6,0,0,7
FILEVERSION 6,1,12,0
PRODUCTVERSION 6,1,12,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -68,12 +68,12 @@ BEGIN
BEGIN
VALUE "CompanyName", "GitHub, Inc."
VALUE "FileDescription", "Electron"
VALUE "FileVersion", "6.0.0"
VALUE "FileVersion", "6.1.12"
VALUE "InternalName", "electron.exe"
VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved."
VALUE "OriginalFilename", "electron.exe"
VALUE "ProductName", "Electron"
VALUE "ProductVersion", "6.0.0"
VALUE "ProductVersion", "6.1.12"
VALUE "SquirrelAwareVersion", "1"
END
END

View File

@@ -28,7 +28,7 @@ class AtomMenuModel;
base::scoped_nsobject<NSMenu> menu_;
BOOL isMenuOpen_;
BOOL useDefaultAccelerator_;
base::Callback<void()> closeCallback;
base::OnceClosure closeCallback;
}
@property(nonatomic, assign) atom::AtomMenuModel* model;
@@ -37,7 +37,7 @@ class AtomMenuModel;
// to the contents of the model after calling this will not be noticed.
- (id)initWithModel:(atom::AtomMenuModel*)model useDefaultAccelerator:(BOOL)use;
- (void)setCloseCallback:(const base::Callback<void()>&)callback;
- (void)setCloseCallback:(base::OnceClosure)callback;
// Populate current NSMenu with |model|.
- (void)populateWithModel:(atom::AtomMenuModel*)model;

View File

@@ -118,19 +118,21 @@ static base::scoped_nsobject<NSMenu> recentDocumentsMenuSwap_;
[super dealloc];
}
- (void)setCloseCallback:(const base::Callback<void()>&)callback {
closeCallback = callback;
- (void)setCloseCallback:(base::OnceClosure)callback {
closeCallback = std::move(callback);
}
- (void)populateWithModel:(atom::AtomMenuModel*)model {
if (!menu_)
return;
// Locate & retain the recent documents menu item
if (!recentDocumentsMenuItem_) {
// Locate & retain the recent documents menu item
recentDocumentsMenuItem_.reset(
[[[[[NSApp mainMenu] itemWithTitle:@"Electron"] submenu]
itemWithTitle:@"Open Recent"] retain]);
base::string16 title = base::ASCIIToUTF16("Open Recent");
NSString* openTitle = l10n_util::FixUpWindowsStyleLabel(title);
recentDocumentsMenuItem_.reset([[[[[NSApp mainMenu]
itemWithTitle:@"Electron"] submenu] itemWithTitle:openTitle] retain]);
}
model_ = model;
@@ -151,7 +153,8 @@ static base::scoped_nsobject<NSMenu> recentDocumentsMenuSwap_;
isMenuOpen_ = NO;
model_->MenuWillClose();
if (!closeCallback.is_null()) {
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, closeCallback);
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
std::move(closeCallback));
}
}
}
@@ -193,8 +196,17 @@ static base::scoped_nsobject<NSMenu> recentDocumentsMenuSwap_;
// Replaces the item's submenu instance with the singleton recent documents
// menu. Previously replaced menu items will be recovered.
- (void)replaceSubmenuShowingRecentDocuments:(NSMenuItem*)item {
NSMenu* recentDocumentsMenu =
[[[recentDocumentsMenuItem_ submenu] retain] autorelease];
NSMenu* recentDocumentsMenu = [recentDocumentsMenuItem_ submenu];
if (!recentDocumentsMenu) {
base::string16 title = base::ASCIIToUTF16("Clear Menu");
NSString* clearTitle = l10n_util::FixUpWindowsStyleLabel(title);
recentDocumentsMenu = [[[NSMenu alloc] initWithTitle:@""] autorelease];
[recentDocumentsMenu
addItem:[[[NSMenuItem alloc]
initWithTitle:clearTitle
action:@selector(clearRecentDocuments:)
keyEquivalent:@""] autorelease]];
}
// Remove menu items in recent documents back to swap menu
[self moveMenuItems:recentDocumentsMenu to:recentDocumentsMenuSwap_];
@@ -211,6 +223,9 @@ static base::scoped_nsobject<NSMenu> recentDocumentsMenuSwap_;
// Replace submenu
[item setSubmenu:recentDocumentsMenu];
DCHECK_EQ([item action], @selector(submenuAction:));
DCHECK_EQ([item target], recentDocumentsMenu);
// Remember the new menu item that carries the recent documents menu
recentDocumentsMenuItem_.reset([item retain]);
}
@@ -372,11 +387,13 @@ static base::scoped_nsobject<NSMenu> recentDocumentsMenuSwap_;
- (void)menuDidClose:(NSMenu*)menu {
if (isMenuOpen_) {
isMenuOpen_ = NO;
model_->MenuWillClose();
if (model_)
model_->MenuWillClose();
// Post async task so that itemSelected runs before the close callback
// deletes the controller from the map which deallocates it
if (!closeCallback.is_null()) {
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, closeCallback);
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI},
std::move(closeCallback));
}
}
}

View File

@@ -99,8 +99,6 @@ bool ScopedDisableResize::disable_resize_ = false;
}
- (id)accessibilityAttributeValue:(NSString*)attribute {
if ([attribute isEqual:NSAccessibilityTitleAttribute])
return base::SysUTF8ToNSString(shell_->GetTitle());
if ([attribute isEqual:NSAccessibilityEnabledAttribute])
return [NSNumber numberWithBool:YES];
if (![attribute isEqualToString:@"AXChildren"])
@@ -121,6 +119,10 @@ bool ScopedDisableResize::disable_resize_ = false;
return [children filteredArrayUsingPredicate:predicate];
}
- (NSString*)accessibilityTitle {
return base::SysUTF8ToNSString(shell_->GetTitle());
}
- (BOOL)canBecomeMainWindow {
return !self.disableKeyOrMainWindow;
}
@@ -174,8 +176,14 @@ bool ScopedDisableResize::disable_resize_ = false;
}
- (void)toggleFullScreenMode:(id)sender {
if (shell_->simple_fullscreen())
shell_->SetSimpleFullScreen(!shell_->IsSimpleFullScreen());
bool is_simple_fs = shell_->IsSimpleFullScreen();
bool always_simple_fs = shell_->always_simple_fullscreen();
// If we're in simple fullscreen mode and trying to exit it
// we need to ensure we exit it properly to prevent a crash
// with NSWindowStyleMaskTitled mode
if (is_simple_fs || always_simple_fs)
shell_->SetSimpleFullScreen(!is_simple_fs);
else
[super toggleFullScreen:sender];
}

View File

@@ -10,6 +10,7 @@
#include "atom/browser/ui/cocoa/atom_touch_bar.h"
#include "base/mac/mac_util.h"
#include "components/remote_cocoa/app_shim/bridged_native_widget_impl.h"
#include "ui/gfx/mac/coordinate_conversion.h"
#include "ui/views/cocoa/bridged_native_widget_host_impl.h"
#include "ui/views/widget/native_widget_mac.h"
@@ -116,8 +117,10 @@
{
bool prevent_default = false;
gfx::Rect new_bounds(gfx::Point(sender.frame.origin), gfx::Size(newSize));
shell_->NotifyWindowWillResize(new_bounds, &prevent_default);
NSRect new_bounds = NSMakeRect(sender.frame.origin.x, sender.frame.origin.y,
newSize.width, newSize.height);
shell_->NotifyWindowWillResize(gfx::ScreenRectFromNSRect(new_bounds),
&prevent_default);
if (prevent_default) {
return sender.frame.size;
}

View File

@@ -353,8 +353,11 @@ static NSString* const ImageScrubberItemIdentifier = @"scrubber.image.item";
NSButton* button = (NSButton*)item.view;
std::string backgroundColor;
if (settings.Get("backgroundColor", &backgroundColor)) {
if (settings.Get("backgroundColor", &backgroundColor) &&
!backgroundColor.empty()) {
button.bezelColor = [self colorFromHexColorString:backgroundColor];
} else {
button.bezelColor = nil;
}
std::string label;

View File

@@ -3,8 +3,7 @@
// found in the LICENSE file.
#include "atom/browser/ui/file_dialog.h"
#include <glib/gi18n.h> // _() macro
#include "atom/browser/ui/util_gtk.h"
#include "atom/browser/native_window_views.h"
#include "atom/browser/unresponsive_suppressor.h"
@@ -46,18 +45,18 @@ class FileChooserDialog {
FileChooserDialog(GtkFileChooserAction action, const DialogSettings& settings)
: parent_(static_cast<atom::NativeWindowViews*>(settings.parent_window)),
filters_(settings.filters) {
const char* confirm_text = _("_OK");
const char* confirm_text = util_gtk::kOkLabel;
if (!settings.button_label.empty())
confirm_text = settings.button_label.c_str();
else if (action == GTK_FILE_CHOOSER_ACTION_SAVE)
confirm_text = _("_Save");
confirm_text = util_gtk::kSaveLabel;
else if (action == GTK_FILE_CHOOSER_ACTION_OPEN)
confirm_text = _("_Open");
confirm_text = util_gtk::kOpenLabel;
dialog_ = gtk_file_chooser_dialog_new(
settings.title.c_str(), NULL, action, _("_Cancel"), GTK_RESPONSE_CANCEL,
confirm_text, GTK_RESPONSE_ACCEPT, NULL);
settings.title.c_str(), NULL, action, util_gtk::kCancelLabel,
GTK_RESPONSE_CANCEL, confirm_text, GTK_RESPONSE_ACCEPT, NULL);
if (parent_) {
parent_->SetEnabled(false);
libgtkui::SetGtkTransientForAura(dialog_, parent_->GetNativeWindow());

View File

@@ -25,6 +25,8 @@ namespace atom {
class InspectableWebContentsDelegate;
class InspectableWebContentsView;
// TODO(zcbenz): Remove this abstract wrapper and rename
// InspectableWebContentsImpl to InspectableWebContents instead.
class InspectableWebContents {
public:
// The returned InspectableWebContents takes ownership of the passed-in

View File

@@ -3,11 +3,11 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE-CHROMIUM file.
#include "atom/browser/ui/inspectable_web_contents_impl.h"
#include <memory>
#include <utility>
#include "atom/browser/ui/inspectable_web_contents_impl.h"
#include "atom/browser/ui/inspectable_web_contents_delegate.h"
#include "atom/browser/ui/inspectable_web_contents_view.h"
#include "atom/browser/ui/inspectable_web_contents_view_delegate.h"
@@ -75,6 +75,9 @@ const char kTitleFormat[] = "Developer Tools - %s";
const size_t kMaxMessageChunkSize = IPC::Channel::kMaximumMessageSize / 4;
// Stores all instances of InspectableWebContentsImpl.
InspectableWebContentsImpl::List g_web_contents_instances_;
base::Value RectToDictionary(const gfx::Rect& bounds) {
base::Value dict(base::Value::Type::DICTIONARY);
dict.SetKey("x", base::Value(bounds.x()));
@@ -227,6 +230,12 @@ class InspectableWebContentsImpl::NetworkResourceLoader
InspectableWebContentsView* CreateInspectableContentsView(
InspectableWebContentsImpl* inspectable_web_contents_impl);
// static
const InspectableWebContentsImpl::List& InspectableWebContentsImpl::GetAll() {
return g_web_contents_instances_;
}
// static
void InspectableWebContentsImpl::RegisterPrefs(PrefRegistrySimple* registry) {
registry->RegisterDictionaryPref(kDevToolsBoundsPref,
RectToDictionary(gfx::Rect(0, 0, 800, 600)));
@@ -270,9 +279,11 @@ InspectableWebContentsImpl::InspectableWebContentsImpl(
display.y() + (display.height() - devtools_bounds_.height()) / 2);
}
}
g_web_contents_instances_.push_back(this);
}
InspectableWebContentsImpl::~InspectableWebContentsImpl() {
g_web_contents_instances_.remove(this);
// Unsubscribe from devtools and Clean up resources.
if (GetDevToolsWebContents()) {
if (managed_devtools_web_contents_)

View File

@@ -6,6 +6,7 @@
#ifndef ATOM_BROWSER_UI_INSPECTABLE_WEB_CONTENTS_IMPL_H_
#define ATOM_BROWSER_UI_INSPECTABLE_WEB_CONTENTS_IMPL_H_
#include <list>
#include <map>
#include <memory>
#include <set>
@@ -38,6 +39,9 @@ class InspectableWebContentsImpl
public content::WebContentsDelegate,
public DevToolsEmbedderMessageDispatcher::Delegate {
public:
using List = std::list<InspectableWebContentsImpl*>;
static const List& GetAll();
static void RegisterPrefs(PrefRegistrySimple* pref_registry);
InspectableWebContentsImpl(content::WebContents* web_contents,

View File

@@ -9,6 +9,7 @@
#include "atom/browser/browser.h"
#include "atom/browser/native_window_observer.h"
#include "atom/browser/native_window_views.h"
#include "atom/browser/ui/util_gtk.h"
#include "atom/browser/unresponsive_suppressor.h"
#include "base/callback.h"
#include "base/strings/string_util.h"
@@ -127,13 +128,13 @@ class GtkMessageBox : public NativeWindowObserver {
const char* TranslateToStock(int id, const std::string& text) {
const std::string lower = base::ToLowerASCII(text);
if (lower == "cancel")
return _("_Cancel");
return util_gtk::kCancelLabel;
if (lower == "no")
return _("_No");
return util_gtk::kNoLabel;
if (lower == "ok")
return _("_OK");
return util_gtk::kOkLabel;
if (lower == "yes")
return _("_Yes");
return util_gtk::kYesLabel;
return text.c_str();
}
@@ -235,8 +236,8 @@ void ShowMessageBox(NativeWindow* parent,
void ShowErrorBox(const base::string16& title, const base::string16& content) {
if (Browser::Get()->is_ready()) {
GtkMessageBox(nullptr, MESSAGE_BOX_TYPE_ERROR, {"OK"}, -1, 0, "Error",
base::UTF16ToUTF8(title).c_str(),
GtkMessageBox(nullptr, MESSAGE_BOX_TYPE_ERROR, {util_gtk::kOkLabel}, -1, 0,
"Error", base::UTF16ToUTF8(title).c_str(),
base::UTF16ToUTF8(content).c_str(), "", false,
gfx::ImageSkia())
.RunSynchronous();

View File

@@ -61,7 +61,9 @@ NSAlert* CreateNSAlert(NativeWindow* parent_window,
int button_count = static_cast<int>([ns_buttons count]);
if (default_id >= 0 && default_id < button_count) {
// Focus the button at default_id if the user opted to do so.
// Highlight the button at default_id
[[ns_buttons objectAtIndex:default_id] highlight:YES];
// The first button added gets set as the default selected.
// So remove that default, and make the requested button the default.
[[ns_buttons objectAtIndex:0] setKeyEquivalent:@""];

View File

@@ -30,6 +30,7 @@ class TrayIconCocoa : public TrayIcon, public AtomMenuModel::Observer {
void SetHighlightMode(TrayIcon::HighlightMode mode) override;
void SetIgnoreDoubleClickEvents(bool ignore) override;
bool GetIgnoreDoubleClickEvents() override;
void PopUpOnUI(AtomMenuModel* menu_model);
void PopUpContextMenu(const gfx::Point& pos,
AtomMenuModel* menu_model) override;
void SetContextMenu(AtomMenuModel* menu_model) override;
@@ -49,6 +50,8 @@ class TrayIconCocoa : public TrayIcon, public AtomMenuModel::Observer {
// Used for unregistering observer.
AtomMenuModel* menu_model_ = nullptr; // weak ref.
base::WeakPtrFactory<TrayIconCocoa> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(TrayIconCocoa);
};

View File

@@ -4,13 +4,20 @@
#include "atom/browser/ui/tray_icon_cocoa.h"
#include "atom/browser/mac/atom_application.h"
#include "atom/browser/ui/cocoa/NSString+ANSI.h"
#include "atom/browser/ui/cocoa/atom_menu_controller.h"
#include "base/mac/sdk_forward_declarations.h"
#include "base/message_loop/message_loop.h"
#include "base/strings/sys_string_conversions.h"
#include "base/task/post_task.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "ui/display/screen.h"
#include "ui/events/cocoa/cocoa_event_utils.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/mac/coordinate_conversion.h"
#include "ui/native_theme/native_theme.h"
namespace {
@@ -143,6 +150,9 @@ const CGFloat kVerticalTitleMargin = 2;
}
- (BOOL)isDarkMode {
if (@available(macOS 10.15, *)) {
return ui::NativeTheme::GetInstanceForNativeUi()->SystemDarkModeEnabled();
}
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
NSString* mode = [defaults stringForKey:@"AppleInterfaceStyle"];
return mode && [mode isEqualToString:@"Dark"];
@@ -324,13 +334,17 @@ const CGFloat kVerticalTitleMargin = 2;
}
- (void)popUpContextMenu:(atom::AtomMenuModel*)menu_model {
// Make sure events can be pumped while the menu is up.
base::MessageLoopCurrent::ScopedNestableTaskAllower allow;
// Show a custom menu.
if (menu_model) {
base::scoped_nsobject<AtomMenuController> menuController([
[AtomMenuController alloc] initWithModel:menu_model
useDefaultAccelerator:NO]);
base::scoped_nsobject<AtomMenuController> menuController(
[[AtomMenuController alloc] initWithModel:menu_model
useDefaultAccelerator:NO]);
forceHighlight_ = YES; // Should highlight when showing menu.
[self setNeedsDisplay:YES];
[statusItem_ popUpStatusItemMenu:[menuController menu]];
forceHighlight_ = NO;
[self setNeedsDisplay:YES];
@@ -338,8 +352,12 @@ const CGFloat kVerticalTitleMargin = 2;
}
if (menuController_ && ![menuController_ isMenuOpen]) {
// Ensure the UI can update while the menu is fading out.
base::ScopedPumpMessagesInPrivateModes pump_private;
// Redraw the tray icon to show highlight if it is enabled.
[self setNeedsDisplay:YES];
[statusItem_ popUpStatusItemMenu:[menuController_ menu]];
// The popUpStatusItemMenu returns only after the showing menu is closed.
// When it returns, we need to redraw the tray icon to not show highlight.
@@ -437,7 +455,7 @@ const CGFloat kVerticalTitleMargin = 2;
namespace atom {
TrayIconCocoa::TrayIconCocoa() {
TrayIconCocoa::TrayIconCocoa() : weak_factory_(this) {
status_item_view_.reset([[StatusItemView alloc] initWithIcon:this]);
}
@@ -479,9 +497,16 @@ bool TrayIconCocoa::GetIgnoreDoubleClickEvents() {
return [status_item_view_ getIgnoreDoubleClickEvents];
}
void TrayIconCocoa::PopUpOnUI(AtomMenuModel* menu_model) {
[status_item_view_ popUpContextMenu:menu_model];
}
void TrayIconCocoa::PopUpContextMenu(const gfx::Point& pos,
AtomMenuModel* menu_model) {
[status_item_view_ popUpContextMenu:menu_model];
base::PostTaskWithTraits(
FROM_HERE, {content::BrowserThread::UI},
base::BindOnce(&TrayIconCocoa::PopUpOnUI, weak_factory_.GetWeakPtr(),
base::Unretained(menu_model)));
}
void TrayIconCocoa::SetContextMenu(AtomMenuModel* menu_model) {

View File

@@ -0,0 +1,36 @@
// Copyright (c) 2019 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include "atom/browser/ui/util_gtk.h"
#include <gtk/gtk.h>
namespace util_gtk {
// Copied from L40-L55 in
// https://cs.chromium.org/chromium/src/chrome/browser/ui/libgtkui/select_file_dialog_impl_gtk.cc
#if GTK_CHECK_VERSION(3, 90, 0)
// GTK stock items have been deprecated. The docs say to switch to using the
// strings "_Open", etc. However this breaks i18n. We could supply our own
// internationalized strings, but the "_" in these strings is significant: it's
// the keyboard shortcut to select these actions. TODO: Provide
// internationalized strings when GTK provides support for it.
const char* const kCancelLabel = "_Cancel";
const char* const kNoLabel = "_No";
const char* const kOkLabel = "_OK";
const char* const kOpenLabel = "_Open";
const char* const kSaveLabel = "_Save";
const char* const kYesLabel = "_Yes";
#else
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
const char* const kCancelLabel = GTK_STOCK_CANCEL;
const char* const kNoLabel = GTK_STOCK_NO;
const char* const kOkLabel = GTK_STOCK_OK;
const char* const kOpenLabel = GTK_STOCK_OPEN;
const char* const kSaveLabel = GTK_STOCK_SAVE;
const char* const kYesLabel = GTK_STOCK_YES;
G_GNUC_END_IGNORE_DEPRECATIONS
#endif
} // namespace util_gtk

View File

@@ -0,0 +1,21 @@
// Copyright (c) 2019 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef ATOM_BROWSER_UI_UTIL_GTK_H_
#define ATOM_BROWSER_UI_UTIL_GTK_H_
namespace util_gtk {
/* These are `const char*` rather than the project-preferred `const char[]`
because they must fit the type of an external dependency */
extern const char* const kCancelLabel;
extern const char* const kNoLabel;
extern const char* const kOkLabel;
extern const char* const kOpenLabel;
extern const char* const kSaveLabel;
extern const char* const kYesLabel;
} // namespace util_gtk
#endif // ATOM_BROWSER_UI_UTIL_GTK_H_

View File

@@ -53,22 +53,7 @@ void ViewsDelegate::NotifyMenuItemFocused(const base::string16& menu_name,
int item_count,
bool has_submenu) {}
#if defined(OS_WIN)
HICON ViewsDelegate::GetDefaultWindowIcon() const {
// Use current exe's icon as default window icon.
return LoadIcon(GetModuleHandle(NULL),
MAKEINTRESOURCE(1 /* IDR_MAINFRAME */));
}
HICON ViewsDelegate::GetSmallWindowIcon() const {
return GetDefaultWindowIcon();
}
bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow window) const {
return false;
}
#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
#if defined(OS_LINUX) && !defined(OS_CHROMEOS)
gfx::ImageSkia* ViewsDelegate::GetDefaultWindowIcon() const {
return NULL;
}

View File

@@ -5,6 +5,7 @@
#ifndef ATOM_BROWSER_UI_VIEWS_ATOM_VIEWS_DELEGATE_H_
#define ATOM_BROWSER_UI_VIEWS_ATOM_VIEWS_DELEGATE_H_
#include <map>
#include <string>
#include "base/compiler_specific.h"
@@ -37,6 +38,8 @@ class ViewsDelegate : public views::ViewsDelegate {
HICON GetDefaultWindowIcon() const override;
HICON GetSmallWindowIcon() const override;
bool IsWindowInMetro(gfx::NativeWindow window) const override;
int GetAppbarAutohideEdges(HMONITOR monitor,
base::OnceClosure callback) override;
#elif defined(OS_LINUX) && !defined(OS_CHROMEOS)
gfx::ImageSkia* GetDefaultWindowIcon() const override;
#endif
@@ -50,6 +53,24 @@ class ViewsDelegate : public views::ViewsDelegate {
bool WindowManagerProvidesTitleBar(bool maximized) override;
private:
#if defined(OS_WIN)
using AppbarAutohideEdgeMap = std::map<HMONITOR, int>;
// Callback on main thread with the edges. |returned_edges| is the value that
// was returned from the call to GetAutohideEdges() that initiated the lookup.
void OnGotAppbarAutohideEdges(base::OnceClosure callback,
HMONITOR monitor,
int returned_edges,
int edges);
AppbarAutohideEdgeMap appbar_autohide_edge_map_;
// If true we're in the process of notifying a callback from
// GetAutohideEdges().start a new query.
bool in_autohide_edges_callback_ = false;
base::WeakPtrFactory<ViewsDelegate> weak_factory_{this};
#endif
DISALLOW_COPY_AND_ASSIGN(ViewsDelegate);
};

View File

@@ -0,0 +1,156 @@
// Copyright (c) 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE-CHROMIUM file.
#include "atom/browser/ui/views/atom_views_delegate.h"
#include <dwmapi.h>
#include <shellapi.h>
#include <utility>
#include "base/bind.h"
#include "base/task/post_task.h"
namespace {
bool MonitorHasAutohideTaskbarForEdge(UINT edge, HMONITOR monitor) {
APPBARDATA taskbar_data = {sizeof(APPBARDATA), NULL, 0, edge};
taskbar_data.hWnd = ::GetForegroundWindow();
// MSDN documents an ABM_GETAUTOHIDEBAREX, which supposedly takes a monitor
// rect and returns autohide bars on that monitor. This sounds like a good
// idea for multi-monitor systems. Unfortunately, it appears to not work at
// least some of the time (erroneously returning NULL) and there's almost no
// online documentation or other sample code using it that suggests ways to
// address this problem. We do the following:-
// 1. Use the ABM_GETAUTOHIDEBAR message. If it works, i.e. returns a valid
// window we are done.
// 2. If the ABM_GETAUTOHIDEBAR message does not work we query the auto hide
// state of the taskbar and then retrieve its position. That call returns
// the edge on which the taskbar is present. If it matches the edge we
// are looking for, we are done.
// NOTE: This call spins a nested run loop.
HWND taskbar = reinterpret_cast<HWND>(
SHAppBarMessage(ABM_GETAUTOHIDEBAR, &taskbar_data));
if (!::IsWindow(taskbar)) {
APPBARDATA taskbar_data = {sizeof(APPBARDATA), 0, 0, 0};
unsigned int taskbar_state = SHAppBarMessage(ABM_GETSTATE, &taskbar_data);
if (!(taskbar_state & ABS_AUTOHIDE))
return false;
taskbar_data.hWnd = ::FindWindow(L"Shell_TrayWnd", NULL);
if (!::IsWindow(taskbar_data.hWnd))
return false;
SHAppBarMessage(ABM_GETTASKBARPOS, &taskbar_data);
if (taskbar_data.uEdge == edge)
taskbar = taskbar_data.hWnd;
}
// There is a potential race condition here:
// 1. A maximized chrome window is fullscreened.
// 2. It is switched back to maximized.
// 3. In the process the window gets a WM_NCCACLSIZE message which calls us to
// get the autohide state.
// 4. The worker thread is invoked. It calls the API to get the autohide
// state. On Windows versions earlier than Windows 7, taskbars could
// easily be always on top or not.
// This meant that we only want to look for taskbars which have the topmost
// bit set. However this causes problems in cases where the window on the
// main thread is still in the process of switching away from fullscreen.
// In this case the taskbar might not yet have the topmost bit set.
// 5. The main thread resumes and does not leave space for the taskbar and
// hence it does not pop when hovered.
//
// To address point 4 above, it is best to not check for the WS_EX_TOPMOST
// window style on the taskbar, as starting from Windows 7, the topmost
// style is always set. We don't support XP and Vista anymore.
if (::IsWindow(taskbar)) {
if (MonitorFromWindow(taskbar, MONITOR_DEFAULTTONEAREST) == monitor)
return true;
// In some cases like when the autohide taskbar is on the left of the
// secondary monitor, the MonitorFromWindow call above fails to return the
// correct monitor the taskbar is on. We fallback to MonitorFromPoint for
// the cursor position in that case, which seems to work well.
POINT cursor_pos = {0};
GetCursorPos(&cursor_pos);
if (MonitorFromPoint(cursor_pos, MONITOR_DEFAULTTONEAREST) == monitor)
return true;
}
return false;
}
int GetAppbarAutohideEdgesOnWorkerThread(HMONITOR monitor) {
DCHECK(monitor);
int edges = 0;
if (MonitorHasAutohideTaskbarForEdge(ABE_LEFT, monitor))
edges |= views::ViewsDelegate::EDGE_LEFT;
if (MonitorHasAutohideTaskbarForEdge(ABE_TOP, monitor))
edges |= views::ViewsDelegate::EDGE_TOP;
if (MonitorHasAutohideTaskbarForEdge(ABE_RIGHT, monitor))
edges |= views::ViewsDelegate::EDGE_RIGHT;
if (MonitorHasAutohideTaskbarForEdge(ABE_BOTTOM, monitor))
edges |= views::ViewsDelegate::EDGE_BOTTOM;
return edges;
}
} // namespace
namespace atom {
HICON ViewsDelegate::GetDefaultWindowIcon() const {
// Use current exe's icon as default window icon.
return LoadIcon(GetModuleHandle(NULL),
MAKEINTRESOURCE(1 /* IDR_MAINFRAME */));
}
HICON ViewsDelegate::GetSmallWindowIcon() const {
return GetDefaultWindowIcon();
}
bool ViewsDelegate::IsWindowInMetro(gfx::NativeWindow window) const {
return false;
}
int ViewsDelegate::GetAppbarAutohideEdges(HMONITOR monitor,
base::OnceClosure callback) {
// Initialize the map with EDGE_BOTTOM. This is important, as if we return an
// initial value of 0 (no auto-hide edges) then we'll go fullscreen and
// windows will automatically remove WS_EX_TOPMOST from the appbar resulting
// in us thinking there is no auto-hide edges. By returning at least one edge
// we don't initially go fullscreen until we figure out the real auto-hide
// edges.
if (!appbar_autohide_edge_map_.count(monitor))
appbar_autohide_edge_map_[monitor] = EDGE_BOTTOM;
// We use the SHAppBarMessage API to get the taskbar autohide state. This API
// spins a modal loop which could cause callers to be reentered. To avoid
// that we retrieve the taskbar state in a worker thread.
if (monitor && !in_autohide_edges_callback_) {
// TODO(robliao): Annotate this task with .WithCOM() once supported.
// https://crbug.com/662122
base::PostTaskWithTraitsAndReplyWithResult(
FROM_HERE, {base::MayBlock(), base::TaskPriority::USER_BLOCKING},
base::BindOnce(&GetAppbarAutohideEdgesOnWorkerThread, monitor),
base::BindOnce(&ViewsDelegate::OnGotAppbarAutohideEdges,
weak_factory_.GetWeakPtr(), std::move(callback), monitor,
appbar_autohide_edge_map_[monitor]));
}
return appbar_autohide_edge_map_[monitor];
}
void ViewsDelegate::OnGotAppbarAutohideEdges(base::OnceClosure callback,
HMONITOR monitor,
int returned_edges,
int edges) {
appbar_autohide_edge_map_[monitor] = edges;
if (returned_edges == edges)
return;
base::AutoReset<bool> in_callback_setter(&in_autohide_edges_callback_, true);
std::move(callback).Run();
}
} // namespace atom

View File

@@ -12,6 +12,7 @@
#include "atom/common/keyboard_util.h"
#include "ui/aura/window.h"
#include "ui/base/models/menu_model.h"
#include "ui/native_theme/common_theme.h"
#include "ui/views/background.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/widget/widget.h"
@@ -274,9 +275,6 @@ void MenuBar::OnMenuButtonClicked(views::Button* source,
return;
}
GetFocusManager()->SetFocusedViewWithReason(
source, views::FocusManager::kReasonFocusTraversal);
// Deleted in MenuDelegate::OnMenuClosed
MenuDelegate* menu_delegate = new MenuDelegate(this);
menu_delegate->RunMenu(menu_model_->GetSubmenuModelAt(id), source,
@@ -297,12 +295,9 @@ void MenuBar::RefreshColorCache() {
"GtkMenuBar#menubar GtkMenuItem#menuitem:disabled GtkLabel");
#else
background_color_ =
theme->GetSystemColor(ui::NativeTheme::kColorId_MenuBackgroundColor);
ui::GetAuraColor(ui::NativeTheme::kColorId_MenuBackgroundColor, theme);
#endif
}
#if defined(OS_WIN)
background_color_ = color_utils::GetSysSkColor(COLOR_MENUBAR);
#endif
}
void MenuBar::OnThemeChanged() {

View File

@@ -175,18 +175,14 @@ void RootView::Layout() {
return;
const auto menu_bar_bounds =
menu_bar_visible_
? gfx::Rect(insets_.left(), insets_.top(),
size().width() - insets_.width(), kMenuBarHeight)
: gfx::Rect();
menu_bar_visible_ ? gfx::Rect(0, 0, size().width(), kMenuBarHeight)
: gfx::Rect();
if (menu_bar_)
menu_bar_->SetBoundsRect(menu_bar_bounds);
window_->content_view()->SetBoundsRect(
gfx::Rect(insets_.left(),
menu_bar_visible_ ? menu_bar_bounds.bottom() : insets_.top(),
size().width() - insets_.width(),
size().height() - menu_bar_bounds.height() - insets_.height()));
gfx::Rect(0, menu_bar_visible_ ? menu_bar_bounds.bottom() : 0,
size().width(), size().height() - menu_bar_bounds.height()));
}
gfx::Size RootView::GetMinimumSize() const {
@@ -223,11 +219,4 @@ void RootView::UnregisterAcceleratorsWithFocusManager() {
focus_manager->UnregisterAccelerators(this);
}
void RootView::SetInsets(const gfx::Insets& insets) {
if (insets != insets_) {
insets_ = insets;
Layout();
}
}
} // namespace atom

View File

@@ -40,8 +40,6 @@ class RootView : public views::View {
// Register/Unregister accelerators supported by the menu model.
void RegisterAcceleratorsWithFocusManager(AtomMenuModel* menu_model);
void UnregisterAcceleratorsWithFocusManager();
void SetInsets(const gfx::Insets& insets);
gfx::Insets insets() const { return insets_; }
// views::View:
void Layout() override;
@@ -59,8 +57,6 @@ class RootView : public views::View {
bool menu_bar_visible_ = false;
bool menu_bar_alt_pressed_ = false;
gfx::Insets insets_;
// Map from accelerator to menu item's command id.
accelerator_util::AcceleratorTable accelerator_table_;

View File

@@ -4,6 +4,8 @@
#include "atom/browser/ui/win/atom_desktop_window_tree_host_win.h"
#include "ui/base/win/hwnd_metrics.h"
namespace atom {
AtomDesktopWindowTreeHostWin::AtomDesktopWindowTreeHostWin(
@@ -29,4 +31,17 @@ bool AtomDesktopWindowTreeHostWin::HasNativeFrame() const {
return true;
}
bool AtomDesktopWindowTreeHostWin::GetClientAreaInsets(gfx::Insets* insets,
HMONITOR monitor) const {
if (IsMaximized() && !native_window_view_->has_frame()) {
// Windows automatically adds a standard width border to all sides when a
// window is maximized.
int frame_thickness = ui::GetFrameThickness(monitor) - 1;
*insets = gfx::Insets(frame_thickness, frame_thickness, frame_thickness,
frame_thickness);
return true;
}
return false;
}
} // namespace atom

View File

@@ -25,6 +25,8 @@ class AtomDesktopWindowTreeHostWin : public views::DesktopWindowTreeHostWin {
LPARAM l_param,
LRESULT* result) override;
bool HasNativeFrame() const override;
bool GetClientAreaInsets(gfx::Insets* insets,
HMONITOR monitor) const override;
private:
NativeWindowViews* native_window_view_; // weak ref

View File

@@ -147,8 +147,6 @@ WebContentsPreferences::WebContentsPreferences(
#endif
SetDefaultBoolIfUndefined(options::kOffscreen, false);
SetDefaults();
// If this is a <webview> tag, and the embedder is offscreen-rendered, then
// this WebContents is also offscreen-rendered.
int guest_instance_id = 0;
@@ -166,7 +164,7 @@ WebContentsPreferences::WebContentsPreferences(
}
}
last_preference_ = preference_.Clone();
SetDefaults();
}
WebContentsPreferences::~WebContentsPreferences() {
@@ -178,6 +176,8 @@ void WebContentsPreferences::SetDefaults() {
if (IsEnabled(options::kSandbox)) {
SetBool(options::kNativeWindowOpen, true);
}
last_preference_ = preference_.Clone();
}
bool WebContentsPreferences::SetDefaultBoolIfUndefined(

View File

@@ -10,6 +10,8 @@ interface ElectronRenderer {
mojo_base.mojom.ListValue arguments,
int32 sender_id);
UpdateCrashpadPipeName(string pipe_name);
TakeHeapSnapshot(handle file) => (bool success);
};

View File

@@ -7,6 +7,7 @@
#include <vector>
#include "atom/common/asar/archive.h"
#include "atom/common/asar/asar_util.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/node_includes.h"
@@ -14,7 +15,7 @@
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
#include "native_mate/wrappable.h"
#include "third_party/electron_node/src/node_native_module.h"
#include "third_party/electron_node/src/node_native_module_env.h"
namespace {
@@ -122,17 +123,32 @@ void InitAsarSupport(v8::Isolate* isolate, v8::Local<v8::Value> require) {
std::vector<v8::Local<v8::String>> asar_init_params = {
node::FIXED_ONE_BYTE_STRING(isolate, "require")};
std::vector<v8::Local<v8::Value>> asar_init_args = {require};
node::per_process::native_module_loader.CompileAndCall(
node::native_module::NativeModuleEnv::CompileAndCall(
isolate->GetCurrentContext(), "electron/js2c/asar_init",
&asar_init_params, &asar_init_args, nullptr);
}
v8::Local<v8::Value> SplitPath(v8::Isolate* isolate,
const base::FilePath& path) {
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
base::FilePath asar_path, file_path;
if (asar::GetAsarArchivePath(path, &asar_path, &file_path, true)) {
dict.Set("isAsar", true);
dict.Set("asarPath", asar_path);
dict.Set("filePath", file_path);
} else {
dict.Set("isAsar", false);
}
return dict.GetHandle();
}
void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Value> unused,
v8::Local<v8::Context> context,
void* priv) {
mate::Dictionary dict(context->GetIsolate(), exports);
dict.SetMethod("createArchive", &Archive::Create);
dict.SetMethod("splitPath", &SplitPath);
dict.SetMethod("initAsarSupport", &InitAsarSupport);
}

View File

@@ -15,7 +15,7 @@
#include "base/process/process_metrics.h"
#include "base/strings/string16.h"
#include "native_mate/arguments.h"
#include "uv.h" // NOLINT(build/include)
#include "uv.h" // NOLINT(build/include_directory)
#include "v8/include/v8.h"
namespace mate {

View File

@@ -16,19 +16,23 @@ namespace atom {
// static
void RemoteCallbackFreer::BindTo(v8::Isolate* isolate,
v8::Local<v8::Object> target,
int frame_id,
const std::string& context_id,
int object_id,
content::WebContents* web_contents) {
new RemoteCallbackFreer(isolate, target, context_id, object_id, web_contents);
new RemoteCallbackFreer(isolate, target, frame_id, context_id, object_id,
web_contents);
}
RemoteCallbackFreer::RemoteCallbackFreer(v8::Isolate* isolate,
v8::Local<v8::Object> target,
int frame_id,
const std::string& context_id,
int object_id,
content::WebContents* web_contents)
: ObjectLifeMonitor(isolate, target),
content::WebContentsObserver(web_contents),
frame_id_(frame_id),
context_id_(context_id),
object_id_(object_id) {}
@@ -40,10 +44,15 @@ void RemoteCallbackFreer::RunDestructor() {
int32_t sender_id = 0;
args.AppendString(context_id_);
args.AppendInteger(object_id_);
auto* frame_host = web_contents()->GetMainFrame();
if (frame_host) {
auto frames = web_contents()->GetAllFrames();
auto iter = std::find_if(frames.begin(), frames.end(), [this](auto* f) {
return f->GetRoutingID() == frame_id_;
});
if (iter != frames.end() && (*iter)->IsRenderFrameLive()) {
mojom::ElectronRendererAssociatedPtr electron_ptr;
frame_host->GetRemoteAssociatedInterfaces()->GetInterface(
(*iter)->GetRemoteAssociatedInterfaces()->GetInterface(
mojo::MakeRequest(&electron_ptr));
electron_ptr->Message(true /* internal */, false /* send_to_all */, channel,
args.Clone(), sender_id);

View File

@@ -17,6 +17,7 @@ class RemoteCallbackFreer : public ObjectLifeMonitor,
public:
static void BindTo(v8::Isolate* isolate,
v8::Local<v8::Object> target,
int frame_id,
const std::string& context_id,
int object_id,
content::WebContents* web_conents);
@@ -24,6 +25,7 @@ class RemoteCallbackFreer : public ObjectLifeMonitor,
protected:
RemoteCallbackFreer(v8::Isolate* isolate,
v8::Local<v8::Object> target,
int frame_id,
const std::string& context_id,
int object_id,
content::WebContents* web_conents);
@@ -35,6 +37,7 @@ class RemoteCallbackFreer : public ObjectLifeMonitor,
void RenderViewDeleted(content::RenderViewHost*) override;
private:
int frame_id_;
std::string context_id_;
int object_id_;

View File

@@ -9,7 +9,7 @@
#include "base/values.h"
#include "content/public/renderer/render_frame.h"
#include "electron/atom/common/api/api.mojom.h"
#include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
#include "services/service_manager/public/cpp/interface_provider.h"
#include "third_party/blink/public/web/web_local_frame.h"
using blink::WebLocalFrame;
@@ -77,8 +77,8 @@ void RemoteObjectFreer::RunDestructor() {
if (ref_mapper_[context_id_].empty())
ref_mapper_.erase(context_id_);
mojom::ElectronBrowserAssociatedPtr electron_ptr;
render_frame->GetRemoteAssociatedInterfaces()->GetInterface(
mojom::ElectronBrowserPtr electron_ptr;
render_frame->GetRemoteInterfaces()->GetInterface(
mojo::MakeRequest(&electron_ptr));
electron_ptr->Message(true, channel, args.Clone());
}

View File

@@ -13,6 +13,7 @@
#include "base/lazy_instance.h"
#include "base/stl_util.h"
#include "base/threading/thread_local.h"
#include "base/threading/thread_restrictions.h"
namespace asar {
@@ -25,6 +26,17 @@ base::LazyInstance<base::ThreadLocalPointer<ArchiveMap>>::Leaky
const base::FilePath::CharType kAsarExtension[] = FILE_PATH_LITERAL(".asar");
std::map<base::FilePath, bool> g_is_directory_cache;
bool IsDirectoryCached(const base::FilePath& path) {
auto it = g_is_directory_cache.find(path);
if (it != g_is_directory_cache.end()) {
return it->second;
}
base::ThreadRestrictions::ScopedAllowIO allow_io;
return g_is_directory_cache[path] = base::DirectoryExists(path);
}
} // namespace
std::shared_ptr<Archive> GetOrCreateAsarArchive(const base::FilePath& path) {
@@ -47,11 +59,12 @@ void ClearArchives() {
bool GetAsarArchivePath(const base::FilePath& full_path,
base::FilePath* asar_path,
base::FilePath* relative_path) {
base::FilePath* relative_path,
bool allow_root) {
base::FilePath iter = full_path;
while (true) {
base::FilePath dirname = iter.DirName();
if (iter.MatchesExtension(kAsarExtension))
if (iter.MatchesExtension(kAsarExtension) && !IsDirectoryCached(iter))
break;
else if (iter == dirname)
return false;
@@ -59,7 +72,8 @@ bool GetAsarArchivePath(const base::FilePath& full_path,
}
base::FilePath tail;
if (!iter.AppendRelativePath(full_path, &tail))
if (!((allow_root && iter == full_path) ||
iter.AppendRelativePath(full_path, &tail)))
return false;
*asar_path = iter;

View File

@@ -25,7 +25,8 @@ void ClearArchives();
// Separates the path to Archive out.
bool GetAsarArchivePath(const base::FilePath& full_path,
base::FilePath* asar_path,
base::FilePath* relative_path);
base::FilePath* relative_path,
bool allow_root = false);
// Same with base::ReadFileToString but supports asar Archive.
bool ReadFileToString(const base::FilePath& path, std::string* contents);

View File

@@ -5,7 +5,7 @@
#include "atom/common/atom_command_line.h"
#include "base/command_line.h"
#include "uv.h" // NOLINT(build/include)
#include "uv.h" // NOLINT(build/include_directory)
namespace atom {

View File

@@ -27,6 +27,14 @@ const char kSecureProtocolDescription[] =
"The connection to this site is using a strong protocol version "
"and cipher suite.";
#if defined(OS_WIN)
const char kCrashpadPipeName[] = "ELECTRON_CRASHPAD_PIPE_NAME";
#endif
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
const char kRunAsNode[] = "ELECTRON_RUN_AS_NODE";
#endif
#if BUILDFLAG(ENABLE_PDF_VIEWER)
const char kPdfPluginMimeType[] = "application/x-google-chrome-pdf";
const char kPdfPluginPath[] = "chrome://pdf-viewer/";

View File

@@ -5,6 +5,7 @@
#ifndef ATOM_COMMON_ATOM_CONSTANTS_H_
#define ATOM_COMMON_ATOM_CONSTANTS_H_
#include "build/build_config.h"
#include "electron/buildflags/buildflags.h"
namespace atom {
@@ -26,6 +27,15 @@ extern const char kValidCertificateDescription[];
extern const char kSecureProtocol[];
extern const char kSecureProtocolDescription[];
#if defined(OS_WIN)
// Crashpad pipe name.
extern const char kCrashpadPipeName[];
#endif
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
extern const char kRunAsNode[];
#endif
#if BUILDFLAG(ENABLE_PDF_VIEWER)
// The MIME type used for the PDF plugin.
extern const char kPdfPluginMimeType[];

View File

@@ -6,10 +6,10 @@
#define ATOM_COMMON_ATOM_VERSION_H_
#define ATOM_MAJOR_VERSION 6
#define ATOM_MINOR_VERSION 0
#define ATOM_PATCH_VERSION 0
#define ATOM_MINOR_VERSION 1
#define ATOM_PATCH_VERSION 12
// clang-format off
#define ATOM_PRE_RELEASE_VERSION -beta.7
// #define ATOM_PRE_RELEASE_VERSION
// clang-format on
#ifndef ATOM_STRINGIFY

View File

@@ -4,10 +4,14 @@
#include "atom/common/crash_reporter/crash_reporter.h"
#include <memory>
#include "atom/browser/browser.h"
#include "atom/common/atom_constants.h"
#include "atom/common/atom_version.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "base/command_line.h"
#include "base/environment.h"
#include "base/files/file_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_split.h"
@@ -16,13 +20,31 @@
namespace crash_reporter {
const char kCrashpadProcess[] = "crash-handler";
const char kCrashesDirectoryKey[] = "crashes-directory";
CrashReporter::CrashReporter() {
auto* cmd = base::CommandLine::ForCurrentProcess();
is_browser_ = cmd->GetSwitchValueASCII(switches::kProcessType).empty();
#if BUILDFLAG(ENABLE_RUN_AS_NODE)
bool run_as_node = base::Environment::Create()->HasVar(atom::kRunAsNode);
#else
bool run_as_node = false;
#endif
if (run_as_node) {
process_type_ = "node";
} else {
auto* cmd = base::CommandLine::ForCurrentProcess();
process_type_ = cmd->GetSwitchValueASCII(switches::kProcessType);
}
// process_type_ will be empty for browser process
}
CrashReporter::~CrashReporter() {}
bool CrashReporter::IsInitialized() {
return is_initialized_;
}
void CrashReporter::Start(const std::string& product_name,
const std::string& company_name,
const std::string& submit_url,
@@ -30,15 +52,19 @@ void CrashReporter::Start(const std::string& product_name,
bool upload_to_server,
bool skip_system_crash_handler,
const StringMap& extra_parameters) {
is_initialized_ = true;
SetUploadParameters(extra_parameters);
InitBreakpad(product_name, ATOM_VERSION_STRING, company_name, submit_url,
crashes_dir, upload_to_server, skip_system_crash_handler);
Init(product_name, company_name, submit_url, crashes_dir, upload_to_server,
skip_system_crash_handler);
}
void CrashReporter::SetUploadParameters(const StringMap& parameters) {
upload_parameters_ = parameters;
upload_parameters_["process_type"] = is_browser_ ? "browser" : "renderer";
upload_parameters_["process_type"] =
process_type_.empty() ? "browser" : process_type_;
upload_parameters_["prod"] = ATOM_PRODUCT_NAME;
upload_parameters_["ver"] = ATOM_VERSION_STRING;
// Setting platform dependent parameters.
SetUploadParameters();
@@ -74,13 +100,12 @@ CrashReporter::GetUploadedReports(const base::FilePath& crashes_dir) {
return result;
}
void CrashReporter::InitBreakpad(const std::string& product_name,
const std::string& version,
const std::string& company_name,
const std::string& submit_url,
const base::FilePath& crashes_dir,
bool auto_submit,
bool skip_system_crash_handler) {}
void CrashReporter::Init(const std::string& product_name,
const std::string& company_name,
const std::string& submit_url,
const base::FilePath& crashes_dir,
bool auto_submit,
bool skip_system_crash_handler) {}
void CrashReporter::SetUploadParameters() {}

View File

@@ -16,6 +16,9 @@
namespace crash_reporter {
extern const char kCrashpadProcess[];
extern const char kCrashesDirectoryKey[];
class CrashReporter {
public:
typedef std::map<std::string, std::string> StringMap;
@@ -24,6 +27,7 @@ class CrashReporter {
static CrashReporter* GetInstance();
static void StartInstance(const mate::Dictionary& options);
bool IsInitialized();
void Start(const std::string& product_name,
const std::string& company_name,
const std::string& submit_url,
@@ -46,19 +50,19 @@ class CrashReporter {
CrashReporter();
virtual ~CrashReporter();
virtual void InitBreakpad(const std::string& product_name,
const std::string& version,
const std::string& company_name,
const std::string& submit_url,
const base::FilePath& crashes_dir,
bool upload_to_server,
bool skip_system_crash_handler);
virtual void Init(const std::string& product_name,
const std::string& company_name,
const std::string& submit_url,
const base::FilePath& crashes_dir,
bool upload_to_server,
bool skip_system_crash_handler);
virtual void SetUploadParameters();
StringMap upload_parameters_;
bool is_browser_;
std::string process_type_;
private:
bool is_initialized_ = false;
void SetUploadParameters(const StringMap& parameters);
DISALLOW_COPY_AND_ASSIGN(CrashReporter);

Some files were not shown because too many files have changed in this diff Show More