Compare commits

...

145 Commits

Author SHA1 Message Date
Electron Bot
75609f784c Bump v7.0.0-nightly.20190521 2019-05-21 09:39:02 -07:00
Samuel Attard
a8ff6899d4 fix: correctly support the webkitdirectory input attr (#18343)
Fixes #839

The implementation here was loosely inspired by the implentation in
//chrome found in their FileSelectHelper.  I.e. That's where the usage
of net::DirectoryLister comes frome.

Refs: https://cs.chromium.org/chromium/src/chrome/browser/file_select_helper.cc
2019-05-21 11:18:22 -05:00
Milan Burda
1941a46825 docs: clarify that 'second-instance' is only emitted when the second instance calls app.requestSingleInstanceLock() (#18272) 2019-05-21 10:56:36 -05:00
Shelley Vohr
e39c76bfe1 fix: reverse saveDialog cancellation bool (#18366) 2019-05-21 10:51:59 -05:00
Shelley Vohr
1a2ab11c90 fix: set window to null when no window is passed (#18240)
* fix: set window to null when no window is passed

* add new specs for dialog

* fix process blocking for showMessageBox
2019-05-21 09:08:22 -05:00
Samuel Attard
e73a0e6cc6 docs: replace the atom.io headers URL with electronjs.org (#18328) 2019-05-21 16:17:07 +09:00
Charles Kerr
d1207e9d8f docs: use "Breaking Changes" as the changes doc's title (#18326)
* Use "Breaking Changes" as the changes doc's title.

Multiple people have commented that this important page is difficult
to find, in part because people search for "Breaking" or "Changes" or
"Breaking Changes" rather than "API Contract".

This PR changes the name to "Breaking Changes" so that it'll show up
on electronjs.org/docs/.

It also adds a backwards-friendly link so people still searching for
"API Contract" will get a redirect. I'm not sure if this is necessary --
the actual URL of https://electronjs.org/docs/api/breaking-changes is
unchanged -- would especially welcome feedback on this part.

* fixup! Use "Breaking Changes" as the changes doc's title.

* fixup! Use "Breaking Changes" as the changes doc's title.
2019-05-21 16:15:57 +09:00
John Kleinschmidt
b7357d5750 refactor: remove no longer needed dependency (#18340)
* refactor: remove no longer needed dependency

* Updated yarn.lock
2019-05-21 15:53:40 +09:00
mscdex
f106ea0029 chore: remove extra colon in Issue Details (#18359) 2019-05-21 15:45:03 +09:00
Lucas Gabriel Schneider
286fdaa53c fix: docs/api/browser-window.md: fix typo (#18367) 2019-05-21 15:42:27 +09:00
Andrey
204e3808d2 docs: add parentheses + change lower case to upper case in some places (#18368)
* fix: add parentheses

Add parentheses to the end `app.showAboutPanel`, because this is method.

* fix: change 'Promise<string>' to 'Promise<String>'

Change `Promise<string>` to `Promise<String>`, because this is class name.

* docs: change lower case to upper case

Change lower case in word `menu` to upper case - `Menu`, because it's method.
2019-05-21 15:41:41 +09:00
Milan Burda
e81afed66d chore: remove dead code (#18370) 2019-05-21 15:36:22 +09:00
Charles Kerr
cac50608d6 Fix atom::PATH_END so it's greater than PATH_START. (#18339)
Previously the enum list ended with entries copied values
from base::PATH_ entries, so the subsequent entry (PATH_END)
had a value in (base::PATH_START..base::PATH_END].

This only a correctness patch. atom::PATH_END doesn't appear
to be used anywhere and it was the only atom::PATH_ enum
bitten by this.
2019-05-21 15:35:01 +09:00
Cheng Zhao
340014a9d3 fix: leave space for autohide taskbar for frameless maximized window (#18321) 2019-05-20 19:50:03 -05:00
Milan Burda
c1cccfc082 chore: remove duplicate internal deprecations module (just use deprecate) (#18352) 2019-05-21 00:40:49 +02:00
Nitish Sakhawalkar
9c21c66b97 fix: Windows logger path (#18199)
Windows debug isn't logging because of a DCHECK failure during startup. This changes the logger initialization to use the absolute path, so that logging works again.
2019-05-20 10:41:30 -07:00
Milan Burda
5a7b56b042 chore: finish replacing assert with expect in tests (#18215)
* spec: replace assert with expect in api-browser-view-spec.js

* spec: replace assert with expect in api-touch-bar-spec.js

* spec: replace assert with expect in api-web-frame-spec.js

* spec: replace assert with expect in api-web-contents-view-spec.js

* spec: replace assert with expect in security-warnings-spec.js

* spec: replace assert with expect in api-menu-item-spec.js

* spec: replace assert with expect in api-web-request-spec.js

* spec: replace assert with expect in api-remote-spec.js

* spec: replace assert with expect in api-session-spec.js

* spec: replace assert with expect in api-system-preferences-spec.js

* spec: replace assert with expect in api-browser-window-spec.js

* spec: replace assert with expect in webview-spec.js

* spec: replace assert with expect in api-net-spec.js

* spec: replace assert with expect in api-protocol-spec.js

* spec: replace assert with expect api-web-contents-spec.js

* spec: replace assert with expect in api-shell-spec.js

* spec: replace assert with expect in modules-spec.js

* spec: replace assert with expect in chromium-spec.js

* spec: replace assert with expect in api-crash-reporter-spec.js

* spec: replace assert with expect in asar-spec.js

* spec: rename assert-helpers to expect-helpers

* address PR feedback
2019-05-20 12:04:18 -05:00
Milan Burda
dbb8617214 docs: update sandbox-option.md (#18275)
Co-Authored-By: Mark Lee <malept@users.noreply.github.com>
2019-05-20 17:34:57 +02:00
Milan Burda
89105e7e57 refactor: address TODO for WebContents type parsing (#18158) 2019-05-20 12:55:46 +02:00
Milan Burda
7e2cbf528e docs: link to better list of icons for nativeImage.createFromNamedImage() (#18336) 2019-05-18 22:00:08 +02:00
Milan Burda
af0ad4454e refactor: add invoke helpers in window-setup (#18233) 2019-05-18 20:52:29 +02:00
Milan Burda
2b4ad2cb09 feat: add 'gpu-info-update' event to app (#18250) 2019-05-18 10:06:48 +09:00
Shelley Vohr
111baba29c chore: update codeowners for release scripts (#18246) 2019-05-16 09:39:01 -04:00
Milan Burda
76783e2a90 fix: 'page-title-updated' event forwarding + documentation (#18270) 2019-05-16 12:33:16 +03:00
Samuel Attard
2a08bfbcc6 docs: update type for responseHeaders in the webRequest module (#18302)
Fixes #18298
2019-05-15 18:20:37 -07:00
Cheng Zhao
2ad62cedc3 feat: migrate protocol module to NetworkService (Part 7) (#18290)
* fix: make IsProtocolHandled return true for builtin schemes

* fix: return ERR_NOT_IMPLEMENTED for wrong arg

* Initial work of AsarURLLoader

* Put normal file logics in AsarURLLoader

* Implement asar file reading

* Don't change URL for unpacked file

* Fix cpplint warning
2019-05-15 08:29:58 +09:00
Samuel Attard
fde3137b90 fix: update the FileSelectHelper to support the new promise API (#18288)
* fix: update the FileSelectHelper to support the new promise API

Fixes #18254

So it turns out we've successfully introduced a way to write
non-typesafe C++.

This fixes two things:
* Uses the object the promise resolves
* Ensures we attach the Then handler before moving the promise

* fix: also fix misuse of Promise::Then in the download manager
2019-05-14 15:46:53 -07:00
Milan Burda
d027be05a6 refactor: combine bitmask flags property (replace '+' with '|' operator) (#18271) 2019-05-14 18:49:46 +03:00
Milan Burda
6609138959 feat: add webContents 'zoom-changed' event (#17747) 2019-05-14 09:40:40 +03:00
John Kleinschmidt
23b0487e9b docs: add missing image (#18235) 2019-05-13 16:55:41 -04:00
Jeremy Apthorp
367868613f docs: explicitly list supported versions (#18243) 2019-05-13 12:17:47 -07:00
Jeremy Apthorp
78d45a17c8 fix: default enable_negotiate_port to false (#18251) 2019-05-13 11:28:01 -07:00
Milan Burda
3a5e6f2551 feat: allow setting working directory in app.setUserTasks() / app.setJumpList() (#18148) 2019-05-13 19:17:12 +03:00
Cheng Zhao
326215e1f1 feat: migrate protocol module to NetworkService (Part 6) (#18223)
* fix: start node strem asyncly

* fix: headers value may be a list

* fix: simply destruct on finish/error

* fix: class may destruct immediately after subscribing "data"

* fix: send meaningful error

* fix: must always provide a response body

* fix: handle the case when one write can not write all data

* fix: handle connection error
2019-05-11 15:15:01 +09:00
Nitish Sakhawalkar
85c24c0b47 chore: Add patch to partially revert chromium crashpad change (#17978)
This adds a patch to support functionality that we were using but chromium changed it. Electron uses breakpad on windows, chromium uses crashpad (which is newer). So this patch is needed until we update electron to use crashpad for windows.
2019-05-10 10:35:17 -07:00
Cheng Zhao
8de9ba6df6 chore: run protocol tests in separate WebContents (#18202) 2019-05-10 09:51:44 +09:00
Milan Burda
019b31d084 chore: remove deprecated APIs (#18159) 2019-05-09 14:48:10 -04:00
Jeremy Apthorp
96e19f1cc4 docs: fix name of Backtrace in crash reporter docs (#18180) 2019-05-09 10:30:37 -07:00
Jeremy Apthorp
be484ee8a4 docs: note session.clearAuthCache planned change for 7.0 (#18185)
* docs: note session.clearAuthCache planned change for 7.0

* Update breaking-changes.md
2019-05-09 10:58:01 -04:00
Shelley Vohr
b3fcc080d5 fix: destroy tray on current tick (#18196)
This code was originally added in #6448 to handle an edge case crash in 10.9, and we no longer support 10.9 and therefore no longer need to account for this case.

It addressed the crash, but also created a race condition whereby when a new tray is created the old tray's destroy wouldn't have been fully completed and therefore a new one would be spawned. This fixes that by destroying the tray on the current tick once more.
2019-05-08 15:40:30 -07:00
Shelley Vohr
8759e30f04 build: linux needs java on GN (#18211)
The linux builds fails with ./bin/sh java not found unless this is installed.
2019-05-08 15:28:55 -07:00
Shelley Vohr
6e29611788 build: fix linux release builds on CircleCI (#18201) 2019-05-08 07:27:03 -07:00
Shelley Vohr
6770a8c64a build: remove deprecated octokit auth calls (#18205) 2019-05-07 18:48:40 -07:00
John Kleinschmidt
e63f527e76 docs: add FAQ entry about subpixel anti-aliased text (#18101)
* docs: add FAQ entry about subpixel anti-aliased text

Co-Authored-By: Nils-Hero Lindemann <nilsherolindemann@gmail.com>

* Fix linting errors

Co-Authored-By: Nils-Hero Lindemann <nilsherolindemann@gmail.com>

* Fix image link

Co-Authored-By: Nils-Hero Lindemann <nilsherolindemann@gmail.com>
2019-05-07 12:49:08 -07:00
Shelley Vohr
0ab3d7a0be fix: crash on systemPreferences.getAccentColor() (#18144) 2019-05-07 08:26:34 -07:00
Milan Burda
d79dc056bc refactor: eliminate duplicate code in asar.js (#18146) 2019-05-07 06:54:35 -07:00
Shelley Vohr
02710ef574 refactor: make templateImage a property on nativeImage (#18124)
* refactor: make templateImage a property on nativeImage

* Update docs/api/native-image.md

Co-Authored-By: codebytere <codebytere@github.com>

* fix nativeImage prototype deprecation

* update for new property name

* Update docs/api/native-image.md

Co-Authored-By: codebytere <codebytere@github.com>
2019-05-07 06:52:07 -07:00
Shelley Vohr
cfb6e847a0 refactor: allow embedder overriding of internal FS calls (#17906) (#18183) 2019-05-07 06:44:32 -07:00
Milan Burda
91e3421525 refactor: use base::size() for array sizes (#18155) 2019-05-07 09:19:14 -04:00
Bobby Galli
175fae722a docs: added BugSplat to list of hosted solutions (#18162) 2019-05-06 19:37:24 -07:00
Cheng Zhao
237f74a01f feat: migrate protocol module to NetworkService (Part 5) (#18170)
* fix: always have head.headers available

* fix: use StringDataPipeProducer to write string

It can handle large strings correctly.

* fix: override RegisterNonNetworkSubresourceURLLoaderFactories

* fix: add dummy uninterceptProtocol implementation

* fix: jquery error handler can pass empty string

For some errors jquery would pass empty string in the error handler,
which makes tests pass when they should fail.

* chore: fix cpplint warnings

* fix: guard RegisterNonNetworkSubresourceURLLoaderFactories call

It may be called even when NetworkService is not enabled.

* test: disable protocol.interceptHttpProtocol test
2019-05-07 11:33:05 +09:00
Samuel Attard
a96b6e2c96 build: move to the new docs parser (#18103)
* build: move to the new docs parser

* chore: remove the bad getTitle param doc

* build: update parser/ts gen deps + fix some docs issues highlighted by GH desktop

* chore: apply suggestions from code review

Co-Authored-By: MarshallOfSound <samuel.r.attard@gmail.com>

* chore: update docs for accidentally removed things

* chore: update docs/api/command-line.md

Co-Authored-By: MarshallOfSound <samuel.r.attard@gmail.com>
2019-05-06 08:29:01 -07:00
Shelley Vohr
9ec59cbc6c docs: clarify clipboard type options (#18107) 2019-05-06 08:11:47 -07:00
Samuel Attard
636273b6cb fix: do not mark navigations interupted with same-document navigations as aborted (#18109)
* fix: do not mark navigations interupted with same-document navigations as aborted

* spec: add tests for the loadURL promise
2019-05-03 16:19:50 -07:00
Samuel Attard
99d4537075 chore: remove v8 reverts now that nan is updated (#18130) 2019-05-03 14:41:23 -07:00
Jeremy Apthorp
cb13d7a0a8 refactor: session.clearAuthCache nws13n (#17970) 2019-05-03 14:30:25 -07:00
Shelley Vohr
6d96f30ed3 refactor: make shell.OpenExternal async (#17135) 2019-05-03 13:53:45 -07:00
Shelley Vohr
0755857a0c chore: convert more files away from base::Bind (#18121)
* chore: convert more files away from base::Bind

* use BindOnce for JsAsker
2019-05-03 12:08:41 -07:00
Milan Burda
c25c31e018 refactor: convert C++ enums to C++11 enum classes (#18087) 2019-05-03 14:11:41 -04:00
Joshua Westerheide
a59dc56fa6 feat: add env variable to skip binary download on npm install (#17627)
* feat: add env variable to skip binary download on npm install

* docs: add "Skip binary download" section to install tutorial
2019-05-03 10:17:15 -07:00
Cheng Zhao
0a6eb8afca feat: migrate protocol module to NetworkService (Part 4) (#18084)
* Parse stream protocol handler

* Pipe node stream to mojo

* Merge the parser for headers

* Add ToDict helper to simplify code

* Simplify dispatching logic

* Add an experimental API for returning any type of response

* Fix subscribing event

* URL loaders' lifetime is independent of the factory

* HandleError helper is no longer needed

* Rename "SendResponse" => "StartLoading" to follow naming conventions

* Delete when connection error happens

* Fix cpplint warning
2019-05-03 09:48:51 +09:00
Shelley Vohr
cc00fa8874 chore: convert base::Bind instances across some files (#18112) 2019-05-03 08:49:26 +09:00
Michelle Tilley
4808f30538 fix: revert to previous documentation folder structure (#18127) 2019-05-02 15:17:17 -07:00
Shelley Vohr
c278043511 chore: retry octokit calls several times on fail (#18085) 2019-05-02 15:08:45 -07:00
Electron Bot
5f28f89c9c chore: bump chromium in DEPS to 84c40395c741fa24ccbd9fc2c5828e2e97472952 (#18117) 2019-05-02 12:49:54 -07:00
Shelley Vohr
55a7f92297 chore: convert more module and helper files from bind (#18069) 2019-05-02 08:32:33 -07:00
Milan Burda
2dd108e9c9 fix: fs.promises does not work with asar paths (#18092) 2019-05-02 21:06:01 +09:00
Milan Burda
9585818a90 chore: add clang-format and limited linting for Objective-C sources (#18104) 2019-05-02 21:05:37 +09:00
Milan Burda
8785e9007c chore: add native_mate to lint:cpp (#18100) 2019-05-02 11:45:23 +09:00
Stewart Lord
d507ba68a7 fix: honor extensionId arg in chrome.runtime.connect (#16998)
The first argument to chrome.runtime.connect is extensionId, not connectInfo.
2019-05-02 11:42:04 +09:00
Samuel Attard
d4f5ebefe6 feat: allow setting of global fallback user agent (#18016)
* feat: allow setting of global fallback user agent

* spec: add tests for app.set/getUserAgentFallback
2019-05-01 16:34:42 -07:00
Sofia Nguy
649d7c0d9e docs: update 6.0.0 release dates (#17923) 2019-05-01 16:11:46 -07:00
Jeremy Apthorp
3949f0bd50 refactor: convert crash reporter to gin (#17952) 2019-05-01 15:19:11 -07:00
bughit
493af7f84c document the loadURL promise pre-attached rejection handler (#18043) 2019-05-01 14:04:21 -07:00
John Kleinschmidt
e736d04e7f build: use https to download from GitHub for external binaries (#17928)
fixes #17926
2019-05-01 13:49:29 -07:00
Shelley Vohr
f316c8470c chore: convert session base::Bind instances (#18038)
Convert instances of base::Bind to base::BindOnce and base::BindRepeating as applicable in the session module as well as in Autofill popups.
2019-05-01 13:45:08 -07:00
Electron Bot
61effac72a chore: bump chromium to c75fbfd03652 (master) (#18090)
https://chromium-review.googlesource.com/c/chromium/src/+/1532361
2019-05-01 13:42:49 -07:00
Jeremy Apthorp
dd3913fada refactor: convert powerSaveBlocker to gin (#18073) 2019-05-01 13:24:01 -07:00
Samuel Attard
913bd4c832 fix: correctly parse default_app path on windows (#18086) 2019-05-01 13:00:09 -07:00
Samuel Attard
496d796833 build: free up space before running macos ci (#18083)
* build: free up space before running macos ci

* build: also delete 14GB of src/.git for bonus space
2019-05-01 12:31:01 -07:00
Milan Burda
1abe658ef4 chore: clang-format (#18088)
* chore: clang-format

* chore: remove obsolete native_mate_files.gypi
2019-05-01 12:27:55 -07:00
Milan Burda
d2cebc62d1 docs: fix webContents 'new-window' event handler sample (#18067) 2019-05-01 10:49:42 -07:00
Milan Burda
b333ce2628 docs: remove incorrectly added let for the win variable (#18052) 2019-05-01 10:45:58 -07:00
Shelley Vohr
5ed11aa1f3 docs: remove obsolete releasing document (#18072) 2019-05-01 09:14:14 -07:00
Milan Burda
6f5c850d60 refactor: add emitCustomEvent() helper (#17960) 2019-05-01 09:07:57 -04:00
Samuel Attard
aebad6fd21 test: remove stray console.log for test suite (#18078) 2019-04-30 17:56:20 -07:00
Electron Bot
2616911f7a chore: bump chromium to 7dff37844cb3 (master) (#18059) 2019-04-30 17:18:22 -07:00
Shelley Vohr
00358545a9 fix: explicitly focus window on win.show() (#18046) 2019-04-30 16:43:45 -07:00
Samuel Attard
67b3fbca89 fix: ensure the inspector agent is shutdown before cleaning up the node env (#18028)
* fix: ensure the inspector agent is shutdown before cleaning up the node env

* spec: add tests to ensure clean shutdown with connected inspector agent

* Update node_debugger.cc
2019-04-30 15:44:40 -07:00
Samuel Attard
4e5a0946c7 build: fix master build by updating the yarn.lock after race merge (#18074) 2019-04-30 15:42:09 -07:00
Jeremy Apthorp
24bf2c29e4 refactor: session.{clearCache,getCacheSize} nws13n (#17969) 2019-04-30 15:09:17 -07:00
Samuel Attard
98c51dd660 build: ensure consistent lock files across multiple machines (#17955)
* build: ensure consistent package-lock across multiple machines

* build: fix linting errors and use npm ci instead of npm install

* build: use a yarn.lock and yarn instead of package-lock and npm

* chore: replace package-lock.json files with yarn.lock

* chore: replace last instance of `npm install`
2019-04-30 13:59:47 -07:00
Shelley Vohr
8d83518f9a refactor: make name a prop on app (#17701)
Update app.name to be a property on app.
2019-04-30 13:55:33 -07:00
Samuel Attard
f2d41b7812 build: fix issues for stable release we fixed in 5-0-x (#18064)
* build: fix release notes generation

* build: fix bump-version script for stable releases
2019-04-30 11:36:39 -07:00
Milan Burda
fcf0af15de feat: support ELECTRON_DEFAULT_ERROR_MODE in the GPU process (#17728) 2019-04-30 12:45:48 -04:00
Shelley Vohr
d87b3ead76 chore: remove promisification deprecation callbacks (#17907)
* chore: remove promisification deprecation callbacks

* update docs

* fix smoke test

* fix executejs issue

* cleanup leftovers

* fix webContents.executeJavaScript tests

* cleanup WebContents.prototype.takeHeapSnapshot

* fix "sets arbitrary webContents as devtools" test

* fix executeJavaScriptInFrame related tests
2019-04-30 07:08:32 -07:00
Jeremy Apthorp
fdf5f838f4 refactor: native_mate => gin (cookies API) (#18036)
* convert cookie converters to gin

* event_emitter GetWrapper
2019-04-30 06:45:05 -07:00
Milan Burda
e9d88e965e chore: disable Vulkan validation layers (#17985) 2019-04-30 06:41:59 -07:00
Cheng Zhao
277f93653e feat: migrate protocol module to NetworkService (Part 3) (#18030)
* Implement http protocol handler

* File protocol handler also accepts options

* Http protocol should inherit headers by default

* Only inherit necessary headers

* Slightly reorder logics
2019-04-30 09:47:04 +09:00
Shelley Vohr
7b55ee9d36 refactor: allow requiring modules with no side effects (#17496) 2019-04-30 09:46:08 +09:00
Shelley Vohr
4ee201c56e chore: convert View APIs away from base::Bind (#18035) 2019-04-30 09:40:39 +09:00
Samuel Attard
4a3771ff7f build: add support for Electron trace events (#17920) 2019-04-29 15:28:30 -07:00
pathim
cc1e8ecef6 docs: Correct doc for registerFileProtocol (#18022)
In the registerFileProtocol docs the "headers" argument of the callback was described as being a list. In fact is has to be an Object mapping header-entries to values. This can be seen in Line 326 of `/spec/api-protocol-spec.js` [fe618631f1/spec/api-protocol-spec.js (L326)].
2019-04-29 15:26:55 -07:00
Milan Burda
2fd3029040 docs: update nodeIntegration section for new defaults (#17715) 2019-04-29 14:29:27 -07:00
Samuel Attard
77a4946069 refactor: rewire the desktop capturer API to remove race conditions (#18029)
We now create a new instance of atom::api::DesktopCapturer for every
request instead of weirdly re-using the same instance and queuing
requests.  This means there is now a 1:1 relationship between request
and DesktopCapturer so there isn't a race condition between the observer
for one request calling back before the observer of another.  This is an
issue ever since the backing APIs moved to worker threads.

This also does a few things to ensure memory management
* Only ever listen to one event per-request, after that we wipe the emit
function to ignore all future events
* Ensures we clean up the window_capturer_, screen_capturer_ and
captured_sources_ in native land once the request is over.

This _in theory_ fixes a flake we've been seeing on CI where we try to
resolve the promise for a request that no longerr exists.
2019-04-29 13:21:28 -07:00
Shelley Vohr
8b79776b5e chore: disable release notes GH Action (#18039) 2019-04-29 13:03:59 -07:00
Milan Burda
9714a91392 refactor: use fs.promises API, which is stable since Node 12 (#17999) 2019-04-29 11:18:03 -07:00
Milan Burda
7574f91f31 refactor: natively promisify WebContents.prototype.takeHeapSnapshot (#18000) 2019-04-29 10:11:11 -07:00
Milan Burda
18b77a4de6 chore: rename atom-binding-setup.ts to electron-binding-setup.ts (#17949) 2019-04-29 10:57:32 -04:00
Cheng Zhao
6f83977f47 feat: migrate protocol module to NetworkService (Part 2) (#17965)
* Pass protocol type and handler to factory

* Add converter for network::ResourceRequest

* Implement Buffer and String protocol handler

* Implement file protocol
2019-04-29 11:37:45 +09:00
Shelley Vohr
fe618631f1 chore: convert some more files from base::Bind (#17968) 2019-04-28 10:03:06 +09:00
Shelley Vohr
72baff1c88 chore: add base workflow file (#18006) 2019-04-27 17:53:08 -07:00
Shelley Vohr
e7ef374899 chore: update base::Bind in app module (#17925)
* chore: update base::Bind in app module

* fix lint
2019-04-26 21:42:56 -07:00
Samuel Attard
68f448ee73 build: rebase patches to fix master build (#17991) 2019-04-26 13:44:08 -07:00
Samuel Attard
84212b8e8b docs: add example on handling the webPrefs change (#17971)
* docs: add example on handling the webPrefs change

Fixes #17967

* Update breaking-changes.md
2019-04-26 13:30:45 -07:00
Samuel Attard
d673865881 build: notify MC of failures to allow easy reruns (#17981) 2019-04-26 12:35:43 -07:00
Xin Tan
2e7ad1a527 docs: add information about contributing (#17961)
Add information about contributing and link CONTRIBUTING.md to this page.
2019-04-26 08:12:21 -07:00
Cheng Zhao
a4fcc32799 feat: upgrade to Node 12 (#17838)
* fix: add boringssl backport to support node upgrade

* fix: Update node_includes.h, add DCHECK macros

* fix: Update node Debug Options parser usage

* fix: Fix asar setup

* fix: using v8Util in isolated context

* fix: make "process" available in preload scripts

* fix: use proper options parser and remove setting of _breakFirstLine

_breakFirstLine was being set on the process, but that has changed in node 12 and so is no longer needed. Node will handle it properly when --inspect-brk is provided

* chore: update node dep sha

* fix: process.binding => _linkedBinding in sandboxed isolated preload

* fix: make original-fs work with streams

* build: override node module version

* fix: use _linkedBinding in content_script/init.js

* chore: update node ref in DEPS

* build: node_module_version should be 73
2019-04-26 18:55:12 +09:00
Shelley Vohr
e1acfffaf8 docs: remove outdated refs to protocol.registerStandardSchemes (#17959) 2019-04-25 15:56:59 -07:00
Shelley Vohr
075b818a8e fixes (#17363) 2019-04-25 15:44:54 -07:00
Shelley Vohr
6530c99cfa docs: add azure vm spinup tutorial (#17958) 2019-04-25 15:42:45 -07:00
Shelley Vohr
2108044bdb docs: move organizational info docs to new directory (#17865)
* docs: move organizational info docs to new directory

* fix some markdown lint issues
2019-04-25 15:14:19 -07:00
Shelley Vohr
c2c3a04628 fix: crash when failed to get devices in desktopCapturer (#17557)
* fix: crash when failed to get devices in desktopCapturer

* return after emit
2019-04-25 15:12:38 -07:00
Robo
2ad942323c refactor: session.clearHostResolverCache with network service (#17935) 2019-04-25 10:51:48 -07:00
Richard Townsend
a2e5cb82fc build: fix a symbol linkage error for WoA (#17947)
When dcheck_always_on=true, electron's unusual configuration creates
some problems, which this patch works around.
2019-04-25 08:21:39 -07:00
Cheng Zhao
3142d5ca00 chore: support converting OnceCallback to V8 (#17941) 2019-04-25 09:40:27 +09:00
Jeremy Apthorp
93d9dafacc refactor: migrate cookie api to network service (#17932) 2019-04-24 12:49:30 -07:00
Shelley Vohr
02c7b92095 chore: Bind=>BindRepeating for constructors (#17924) 2019-04-24 11:29:59 -07:00
Mark Lee
aed0b1ee54 docs: clean up the native module tutorial (#17624) 2019-04-24 10:32:37 -07:00
Samuel Attard
4588fc2232 build: update ts generator (#17929) 2019-04-24 09:57:09 -07:00
Milan Burda
f7a38ec72a fix: permission handler regression in default app (#17927) 2019-04-24 09:54:53 -07:00
nixxquality
4556433f3b docs: fully document MenuItem instance properties (#17479)
* document menuItem instance properties

* correct some types

* add correct click documentation
2019-04-24 09:53:15 -07:00
Milan Burda
253d049ac9 chore: remove deprecated app.enableMixedSandbox() (#17894) 2019-04-23 21:07:40 -07:00
Robo
9b779657fb fix: allow access to the profile dir in mac network sandbox (nws13n) (#17931) 2019-04-24 09:31:36 +09:00
Robo
e1e055a837 fix: allow creating service for temporary partitions (nws13n) (#17930) 2019-04-24 09:30:53 +09:00
Jeremy Apthorp
53c453567f refactor: initialize feature list earlier (#17922) 2019-04-23 15:18:12 -07:00
Cheng Zhao
132137081a feat: migrate protocol module to NetworkService (Part 1) (#17899) 2019-04-23 14:39:20 -07:00
Jeremy Apthorp
341592119f build: actually run import-patches on gclient sync (#17885) 2019-04-23 10:28:26 -07:00
Milan Burda
bb9e92a5d9 refactor: add missing constants for options (#17897) 2019-04-23 09:14:18 -07:00
Milan Burda
0b0f677432 docs: make gclient config command Windows friendly (#17900) 2019-04-23 05:11:35 -04:00
Shelley Vohr
316abe21f9 fix: crash when run from SMB network share (#17886) 2019-04-22 19:28:48 -07:00
Samuel Attard
e9114b3c00 build: optimize the happy path when syncing on CI (#17827)
* build: optimize the happy path when syncing on CI

This adds a new cache for the "src" directory that is only ever used if
the cache key matches exactly.  If there is no exact match we fall back
to the old strategy of using the git cache.

On the happy path this can make the checkout on linux/macOS take around
5-6 minutes which is **significantly** faster than the original 15-18
minutes.

* build: sort readdir result to ensure stability

* build: increment cache key

* Update config.yml

* build: ensure that the cleanly checked out Electron has had hooks run on it

* build: do not remove deps/v8

* build: ensure clean git directory when generating deps hash

* chore: add comments to caching logic

* Update .circleci/config.yml

Co-Authored-By: MarshallOfSound <samuel.r.attard@gmail.com>
2019-04-22 15:36:59 -07:00
Sofia Nguy
df269ecb24 docs: edit Release Timelines doc format and add title (#17903)
* docs: edit title and doc format

* lint error - trailing spaces

* trailing s p a c e
2019-04-22 17:53:51 -04:00
Sofia Nguy
0c24ac9ae7 docs: Update AFP info (#17904) 2019-04-22 17:53:03 -04:00
Electron Bot
716cb28430 chore: bump chromium to 1e9f9a24aa12 (master) (#17880)
* chore: bump chromium in DEPS to 1e9f9a24aa12bea9cf194a82a7e249bd1242ec4f

* chore: update patches

* Make WebContents' theme color a base::Optional<SkColor>

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

* update autofill patch for incorrect header includes

* Move Shell messages to web_test and rename to BlinkTest.

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

* Make PlatformNotificationServiceImpl a KeyedService.

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

* Move MediaPlayerId to its own file.

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

* Remove net/base/completion_callback.h, which is no longer used

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

* AW NS: support file scheme cookies

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

* Remove SecurityInfo and adapt remaining consumers

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

* Remove deprecated type-specific number to string conversion functions

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

* DevTools: Adding new performance histograms for launch of top 4 tools

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

* Update include paths for //base/hash/hash.h

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

* build: Disable ensure_gn_version gclient hook for mac CI checkout

* update patches

* use maybe version of v8::String::NewFromTwoByte

* bump appveyor image version

* fix mac ci hopefully

* Convert enum to enum class for MenuAnchorPosition

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

* use maybe version of ToObject

* RenderViewHost::GetProcess is no longer const

* Unrefcount AuthChallengeInfo

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

* MenuButtonController takes Button rather than MenuButton

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

* add //ui/views_bridge_mac to deps to fix link error

* forward declare views::Button in atom::MenuDelegate

* more v8 patches

* base/{=> hash}/md5.h

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

* gfx::{PlatformFontWin => win}::*

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

* fix v8 patches

* [base] Rename TaskScheduler to ThreadPool

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

* use internal_config_base for bytecode_builtins_list_generator

avoids windows link errors

* FIXME: temporarily disable v8/breakpad integration

* FIXME: temporarily disable prevent-will-redirect test

* FIXME: disable neon on aarch64 pending crbug.com/953815

* update to account for WebCursor refactor

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

* enable stack dumping on appveyor

* Revert "FIXME: disable neon on aarch64 pending crbug.com/953815"

This reverts commit 57f082026b.

* fix: remove const qualifiers to match upstream

* fix: remove const qualifiers to match upstream in cc files as well

* don't throw an error when testing if an object is an object

* use non-deprecated Buffer constructor

* Remove net::CookieSameSite::DEFAULT_MODE enum value

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

* depend on modded dbus-native to work around buffer deprecation

https://github.com/sidorares/dbus-native/pull/262

* revert clang roll to fix arm build on linux

* fixup! depend on modded dbus-native to work around buffer deprecation

need more coffee

* update coffee-script

* robustify verify-mksnapshot w.r.t. command-line parameters

* Revert "robustify verify-mksnapshot w.r.t. command-line parameters"

This reverts commit a49af01411.

* fix mksnapshot by matching args

* update patches

* TMP: enable rdp on appveyor

* Changed ContentBrowserClient::CreateQuotaPermissionContext() to return scoped_refptr.

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

* Make content::ResourceType an enum class.

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

* fixup! Make content::ResourceType an enum class.

* turn off rdp

* use net::CompletionRepeatingCallback instead of base::Callback<void(int)>

* remove disable_ensure_gn_version_gclient_hook.patch

* copy repeating callback instead of std::move

* fix lint

* add completion_repeating_callback.h include
2019-04-20 10:20:37 -07:00
507 changed files with 16937 additions and 23286 deletions

View File

@@ -143,13 +143,16 @@ step-gclient-sync: &step-gclient-sync
run:
name: Gclient sync
command: |
gclient config \
--name "src/electron" \
--unmanaged \
$GCLIENT_EXTRA_ARGS \
"$CIRCLE_REPOSITORY_URL"
# If we did not restore a complete sync then we need to sync for realz
if [ ! -s "src/electron/.circle-sync-done" ]; then
gclient config \
--name "src/electron" \
--unmanaged \
$GCLIENT_EXTRA_ARGS \
"$CIRCLE_REPOSITORY_URL"
gclient sync --with_branch_heads --with_tags
gclient sync --with_branch_heads --with_tags
fi
step-setup-env-for-build: &step-setup-env-for-build
run:
@@ -176,6 +179,22 @@ step-restore-brew-cache: &step-restore-brew-cache
keys:
- v1-brew-cache-{{ arch }}
step-get-more-space-on-mac: &step-get-more-space-on-mac
run:
name: Free up space on MacOS
command: |
if [ "`uname`" == "Darwin" ]; then
sudo rm -rf /Library/Developer/CoreSimulator
fi
step-delete-git-directories: &step-delete-git-directories
run:
name: Delete src/.git directory on MacOS to free space
command: |
if [ "`uname`" == "Darwin" ]; then
sudo rm -rf src/.git
fi
# On macOS the npm install command during gclient sync was run on a linux
# machine and therefore installed a slightly different set of dependencies
# Notably "fsevents" is a macOS only dependency, we rerun npm install once
@@ -535,36 +554,85 @@ steps-checkout: &steps-checkout
- *step-depot-tools-get
- *step-depot-tools-add-to-path
- *step-restore-brew-cache
- *step-get-more-space-on-mac
- *step-install-gnutar-on-mac
- run:
name: Generate DEPS Hash
command: node src/electron/script/generate-deps-hash.js
- run:
name: Touch Sync Done
command: touch src/electron/.circle-sync-done
# Restore exact src cache based on the hash of DEPS and patches/*
# If no cache is matched EXACTLY then the .circle-sync-done file is empty
# If a cache is matched EXACTLY then the .circle-sync-done file contains "done"
- restore_cache:
paths:
- ./src
keys:
- v5-src-cache-{{ arch }}-{{ checksum "src/electron/.depshash" }}
name: Restoring src cache
# Restore exact or closest git cache based on the hash of DEPS and .circle-sync-done
# If the src cache was restored above then this will match an empty cache
# If the src cache was not restored above then this will match a close git cache
- restore_cache:
paths:
- ~/.gclient-cache
keys:
- v1-gclient-cache-{{ arch }}-{{ checksum "src/electron/DEPS" }}
- v1-gclient-cache-{{ arch }}-
- v2-gclient-cache-{{ arch }}-{{ checksum "src/electron/.circle-sync-done" }}-{{ checksum "src/electron/DEPS" }}
- v2-gclient-cache-{{ arch }}-{{ checksum "src/electron/.circle-sync-done" }}
name: Conditionally restoring git cache
- run:
name: Set GIT_CACHE_PATH to make gclient to use the cache
command: |
# CircleCI does not support interpolation when setting environment variables.
# https://circleci.com/docs/2.0/env-vars/#setting-an-environment-variable-in-a-shell-command
echo 'export GIT_CACHE_PATH="$HOME/.gclient-cache"' >> $BASH_ENV
# This sync call only runs if .circle-sync-done is an EMPTY file
- *step-gclient-sync
# Persist the git cache based on the hash of DEPS and .circle-sync-done
# If the src cache was restored above then this will persist an empty cache
- save_cache:
paths:
- ~/.gclient-cache
key: v1-gclient-cache-{{ arch }}-{{ checksum "src/electron/DEPS" }}
key: v2-gclient-cache-{{ arch }}-{{ checksum "src/electron/.circle-sync-done" }}-{{ checksum "src/electron/DEPS" }}
name: Persisting git cache
# These next few steps reset Electron to the correct commit regardless of which cache was restored
- run:
name: Wipe Electron
command: rm -rf src/electron
- *step-checkout-electron
- run:
name: Run Electron Only Hooks
command: gclient runhooks --spec="solutions=[{'name':'src/electron','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':False},'managed':False}]"
- run:
name: Generate DEPS Hash
command: (cd src/electron && git checkout .) && node src/electron/script/generate-deps-hash.js
# Mark the sync as done for future cache saving
- run:
name: Mark Sync Done
command: echo DONE > src/electron/.circle-sync-done
# Minimize the size of the cache
- run:
name: Remove some unused data to avoid storing it in the workspace/cache
command: |
rm -rf src/android_webview
rm -rf src/ios
rm -rf src/third_party/blink/web_tests
rm -rf src/third_party/blink/perf_tests
rm -rf src/third_party/hunspell_dictionaries
rm -rf src/third_party/WebKit/LayoutTests
# Save the src cache based on the deps hash
- save_cache:
paths:
- ./src
key: v5-src-cache-{{ arch }}-{{ checksum "src/electron/.depshash" }}
name: Persisting src cache
- save_cache:
paths:
- /usr/local/Homebrew
key: v1-brew-cache-{{ arch }}
- run:
name: Remove some unused data to avoid storing it in the workspace
command: |
rm -rf src/android_webview
rm -rf src/ios
rm -rf src/third_party/WebKit/LayoutTests
name: Persisting brew cache
- persist_to_workspace:
root: .
paths:
@@ -651,9 +719,11 @@ steps-electron-build-for-publish: &steps-electron-build-for-publish
- *step-depot-tools-get
- *step-depot-tools-add-to-path
- *step-restore-brew-cache
- *step-get-more-space-on-mac
- *step-gclient-sync
- *step-setup-env-for-build
- *step-gn-gen-default
- *step-delete-git-directories
# Electron app
- *step-electron-build

View File

@@ -16,7 +16,8 @@
}],
"prefer-const": ["error", {
"destructuring": "all"
}]
}],
"node/no-deprecated-api": 0
},
"parserOptions": {
"ecmaVersion": 6,

20
.github/CODEOWNERS vendored
View File

@@ -4,17 +4,27 @@
# 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
# Docs & Tooling WG
/default_app/ @electron/wg-docs-tools
/docs/ @electron/wg-docs-tools
/docs/ @electron/wg-docs-tools
# Releases WG
/npm/ @electron/wg-releases
/npm/ @electron/wg-releases
/script/release-notes @electron/wg-releases
/script/prepare-release.js @electron/wg-releases
/script/bump-version.js @electron/wg-releases
/script/ci-release-build.js @electron/wg-releases
/script/release.js @electron/wg-releases
/script/upload-to-github.js @electron/wg-releases
/script/release-artifact-cleanup.js @electron/wg-releases
/script/get-last-major-for-master.js @electron/wg-releases
/script/find-release.js @electron/wg-releases
/script/download-circleci-artifacts.js @electron/wg-releases

View File

@@ -20,7 +20,7 @@ about: Create a report to help us improve Electron
* <!-- (output of `node_modules/.bin/electron --version`) e.g. 4.0.3 -->
* **Operating System:**
* <!-- (Platform and Version) e.g. macOS 10.13.6 / Windows 10 (1803) / Ubuntu 18.04 x64 -->
* **Last Known Working Electron version:**:
* **Last Known Working Electron version:**
* <!-- (if applicable) e.g. 3.1.0 -->
### Expected Behavior

10
.github/main.workflow vendored Normal file
View File

@@ -0,0 +1,10 @@
workflow "Clerk" {
#TODO(codebytere): make this work properly on pull_request
on = "repository_dispatch"
resolves = "Check release notes"
}
action "Check release notes" {
uses = "electron/clerk@master"
secrets = [ "GITHUB_TOKEN" ]
}

5
.gitignore vendored
View File

@@ -37,7 +37,7 @@
/vendor/pyyaml
node_modules/
SHASUMS256.txt
**/yarn.lock
**/package-lock.json
compile_commands.json
.envrc
@@ -62,3 +62,6 @@ spec/.hash
# If someone runs tsc this is where stuff will end up
ts-gen
# Used to accelerate CI builds
.depshash

View File

@@ -64,7 +64,7 @@ config("branding") {
npm_action("build_electron_definitions") {
script = "gn-typescript-definitions"
args = [ rebase_path("$target_gen_dir/tsc/typings/electron.d.ts") ]
inputs = auto_filenames.api_docs + [ "package-lock.json" ]
inputs = auto_filenames.api_docs + [ "yarn.lock" ]
outputs = [
"$target_gen_dir/tsc/typings/electron.d.ts",
@@ -436,6 +436,7 @@ static_library("electron_lib") {
"//content/public/browser",
"//content/public/child",
"//content/public/common:service_names",
"//content/public/gpu",
"//content/public/renderer",
"//content/public/utility",
"//device/bluetooth",
@@ -547,6 +548,7 @@ static_library("electron_lib") {
deps += [
"//third_party/crashpad/crashpad/client",
"//ui/accelerated_widget_mac",
"//ui/views_bridge_mac",
]
sources += [
"atom/browser/ui/views/autofill_popup_view.cc",
@@ -1067,6 +1069,7 @@ template("dist_zip") {
"deps",
"data_deps",
"data",
"testonly",
])
write_runtime_deps = _runtime_deps_file
}
@@ -1076,7 +1079,11 @@ template("dist_zip") {
deps = [
":$_runtime_deps_target",
]
forward_variables_from(invoker, [ "outputs" ])
forward_variables_from(invoker,
[
"outputs",
"testonly",
])
args = rebase_path(outputs + [ _runtime_deps_file ], root_build_dir) + [
target_cpu,
target_os,
@@ -1144,6 +1151,7 @@ dist_zip("electron_ffmpeg_zip") {
}
dist_zip("electron_chromedriver_zip") {
testonly = true
data_deps = [
"//chrome/test/chromedriver",
":licenses",

28
DEPS
View File

@@ -10,9 +10,9 @@ gclient_gn_args = [
vars = {
'chromium_version':
'75.0.3740.3',
'84c40395c741fa24ccbd9fc2c5828e2e97472952',
'node_version':
'2dc0f8811b2b295c08d797b8a11b030234c98502',
'a86a4a160dc520c61a602c949a32a1bc4c0fc633',
'boto_version': 'f7574aa6cc2c819430c1f05e9a1a1a666ef8169b',
'pyyaml_version': '3.12',
@@ -24,6 +24,9 @@ vars = {
'requests_git': 'https://github.com/kennethreitz',
'yaml_git': 'https://github.com/yaml',
# KEEP IN SYNC WITH spec-runner FILE
'yarn_version': '1.15.2',
# To be able to build clean Chromium from sources.
'apply_patches': True,
@@ -40,6 +43,9 @@ 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,
@@ -61,30 +67,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',
'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',
@@ -107,13 +113,13 @@ hooks = [
'action': [
'python',
'-c',
'import os, subprocess; os.chdir(os.path.join("src", "electron")); subprocess.check_call(["python", "script/lib/npm.py", "install"]);',
'import os, subprocess; os.chdir(os.path.join("src", "electron")); subprocess.check_call(["python", "script/lib/npx.py", "yarn@' + (Var("yarn_version")) + '", "install", "--frozen-lockfile"]);',
],
},
{
'name': 'setup_boto',
'pattern': 'src/electron',
'condition': 'checkout_boto',
'condition': 'checkout_boto and process_deps',
'action': [
'python',
'-c',
@@ -123,7 +129,7 @@ hooks = [
{
'name': 'setup_requests',
'pattern': 'src/electron',
'condition': 'checkout_requests',
'condition': 'checkout_requests and process_deps',
'action': [
'python',
'-c',

View File

@@ -1 +1 @@
6.0.0-nightly.20190404
7.0.0-nightly.20190521

View File

@@ -93,6 +93,10 @@ const child = proc.spawn(electron)
Find documentation translations in [electron/i18n](https://github.com/electron/i18n).
## Contributing
If you are interested in reporting/fixing issues and contributing directly to the code base, please see [CONTRIBUTING.md](CONTRIBUTING.md) for more information on what we're looking for and how to get started.
## Community
Info on reporting bugs, getting help, finding third-party tools and sample apps,

View File

@@ -23,13 +23,28 @@
# https://www.appveyor.com/docs/build-configuration/#secure-variables
# https://www.appveyor.com/docs/build-configuration/#custom-environment-variables
# Uncomment these lines to enable RDP
#on_finish:
# - ps: $blockRdp = $true; iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
version: 1.0.{build}
build_cloud: libcc-20
image: libcc-20-vs2017-15.7.4
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
notifications:
- provider: Webhook
url: https://electron-mission-control.herokuapp.com/rest/appveyor-hook
method: POST
headers:
x-mission-control-secret:
secure: 90BLVPcqhJPG7d24v0q/RRray6W3wDQ8uVQlQjOHaBWkw1i8FoA1lsjr2C/v1dVok+tS2Pi6KxDctPUkwIb4T27u4RhvmcPzQhVpfwVJAG9oNtq+yKN7vzHfg7k/pojEzVdJpQLzeJGcSrZu7VY39Q==
on_build_success: false
on_build_failure: true
on_build_status_changed: false
build_script:
- ps: >-
if(($env:APPVEYOR_PULL_REQUEST_HEAD_REPO_NAME -split "/")[0] -eq ($env:APPVEYOR_REPO_NAME -split "/")[0]) {
@@ -38,7 +53,7 @@ build_script:
- echo "Building $env:GN_CONFIG build"
- git config --global core.longpaths true
- cd ..
- md src
- ps: if (Test-Path src\electron) { Remove-Item src\electron -Recurse }
- ps: Move-Item $env:APPVEYOR_BUILD_FOLDER -Destination src\electron
- ps: $env:CHROMIUM_BUILDTOOLS_PATH="$pwd\src\buildtools"
- ps: $env:SCCACHE_PATH="$pwd\src\electron\external_binaries\sccache.exe"
@@ -52,7 +67,7 @@ build_script:
--unmanaged
%GCLIENT_EXTRA_ARGS%
"https://github.com/electron/electron"
- gclient sync --with_branch_heads --with_tags
- gclient sync --with_branch_heads --with_tags --reset
- 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%"

View File

@@ -1,3 +1,7 @@
// Copyright (c) 2017 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#import <Cocoa/Cocoa.h>
int main(int argc, char* argv[]) {

View File

@@ -14,6 +14,8 @@
#include "atom/app/atom_content_client.h"
#include "atom/browser/atom_browser_client.h"
#include "atom/browser/atom_gpu_client.h"
#include "atom/browser/feature_list.h"
#include "atom/browser/relauncher.h"
#include "atom/common/options_switches.h"
#include "atom/renderer/atom_renderer_client.h"
@@ -136,7 +138,10 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
#if defined(DEBUG)
// Print logging to debug.log on Windows
settings.logging_dest = logging::LOG_TO_ALL;
settings.log_file = L"debug.log";
base::FilePath log_filename;
base::PathService::Get(base::DIR_EXE, &log_filename);
log_filename = log_filename.AppendASCII("debug.log");
settings.log_file = log_filename.value().c_str();
settings.lock_log = logging::LOCK_LOG_FILE;
settings.delete_old = logging::DELETE_OLD_LOG_FILE;
#else
@@ -247,6 +252,10 @@ void AtomMainDelegate::PreSandboxStartup() {
}
void AtomMainDelegate::PreCreateMainMessageLoop() {
// This is initialized early because the service manager reads some feature
// flags and we need to make sure the feature list is initialized before the
// service manager reads the features.
InitializeFeatureList();
#if defined(OS_MACOSX)
RegisterAtomCrApp();
#endif
@@ -257,6 +266,11 @@ content::ContentBrowserClient* AtomMainDelegate::CreateContentBrowserClient() {
return browser_client_.get();
}
content::ContentGpuClient* AtomMainDelegate::CreateContentGpuClient() {
gpu_client_.reset(new AtomGpuClient);
return gpu_client_.get();
}
content::ContentRendererClient*
AtomMainDelegate::CreateContentRendererClient() {
if (base::CommandLine::ForCurrentProcess()->HasSwitch(

View File

@@ -27,6 +27,7 @@ class AtomMainDelegate : public content::ContentMainDelegate {
void PreCreateMainMessageLoop() override;
void PostEarlyInitialization(bool is_running_tests) override;
content::ContentBrowserClient* CreateContentBrowserClient() override;
content::ContentGpuClient* CreateContentGpuClient() override;
content::ContentRendererClient* CreateContentRendererClient() override;
content::ContentUtilityClient* CreateContentUtilityClient() override;
int RunProcess(
@@ -48,6 +49,7 @@ class AtomMainDelegate : public content::ContentMainDelegate {
std::unique_ptr<content::ContentBrowserClient> browser_client_;
std::unique_ptr<content::ContentClient> content_client_;
std::unique_ptr<content::ContentGpuClient> gpu_client_;
std::unique_ptr<content::ContentRendererClient> renderer_client_;
std::unique_ptr<content::ContentUtilityClient> utility_client_;

View File

@@ -4,6 +4,8 @@
#include "atom/app/atom_main_delegate.h"
#include <string>
#include "atom/browser/mac/atom_application.h"
#include "atom/common/application_info.h"
#include "atom/common/mac/main_application_bundle.h"

View File

@@ -18,7 +18,7 @@
#include "atom/common/node_includes.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "base/task/task_scheduler/task_scheduler.h"
#include "base/task/thread_pool/thread_pool.h"
#include "base/threading/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/isolate_holder.h"
@@ -48,7 +48,7 @@ int NodeMain(int argc, char* argv[]) {
gin::V8Initializer::LoadV8Natives();
// V8 requires a task scheduler apparently
base::TaskScheduler::CreateAndStartWithDefaultParams("Electron");
base::ThreadPool::CreateAndStartWithDefaultParams("Electron");
// Initialize gin::IsolateHolder.
JavascriptEnvironment gin_env(loop);
@@ -101,6 +101,7 @@ int NodeMain(int argc, char* argv[]) {
}
} while (more == true);
node_debugger.Stop();
exit_code = node::EmitExit(env);
node::RunAtExit(env);
gin_env.platform()->DrainTasks(env->isolate());
@@ -112,10 +113,10 @@ int NodeMain(int argc, char* argv[]) {
// According to "src/gin/shell/gin_main.cc":
//
// gin::IsolateHolder waits for tasks running in TaskScheduler in its
// destructor and thus must be destroyed before TaskScheduler starts skipping
// gin::IsolateHolder waits for tasks running in ThreadPool in its
// destructor and thus must be destroyed before ThreadPool starts skipping
// CONTINUE_ON_SHUTDOWN tasks.
base::TaskScheduler::GetInstance()->Shutdown();
base::ThreadPool::GetInstance()->Shutdown();
v8::V8::Dispose();

View File

@@ -24,6 +24,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/value_converter.h"
#include "atom/common/node_includes.h"
#include "atom/common/options_switches.h"
@@ -84,6 +85,7 @@ struct Converter<Browser::UserTask> {
return false;
dict.Get("arguments", &(out->arguments));
dict.Get("description", &(out->description));
dict.Get("workingDirectory", &(out->working_dir));
return true;
}
};
@@ -157,6 +159,7 @@ struct Converter<JumpListItem> {
dict.Get("args", &(out->arguments));
dict.Get("description", &(out->description));
dict.Get("workingDirectory", &(out->working_dir));
return true;
case JumpListItem::Type::SEPARATOR:
@@ -183,6 +186,7 @@ struct Converter<JumpListItem> {
dict.Set("iconPath", val.icon_path);
dict.Set("iconIndex", val.icon_index);
dict.Set("description", val.description);
dict.Set("workingDirectory", val.working_dir);
break;
case JumpListItem::Type::SEPARATOR:
@@ -426,7 +430,7 @@ int GetPathConstant(const std::string& name) {
}
bool NotificationCallbackWrapper(
const base::Callback<
const base::RepeatingCallback<
void(const base::CommandLine::StringVector& command_line,
const base::FilePath& current_directory)>& callback,
const base::CommandLine::StringVector& cmd,
@@ -485,7 +489,7 @@ void OnClientCertificateSelected(
if (cert->EqualsExcludingChain((*identities)[i]->certificate())) {
net::ClientCertIdentity::SelfOwningAcquirePrivateKey(
std::move((*identities)[i]),
base::Bind(&GotPrivateKey, delegate, std::move(cert)));
base::BindRepeating(&GotPrivateKey, delegate, std::move(cert)));
break;
}
}
@@ -529,9 +533,9 @@ int ImportIntoCertStore(CertificateManagerModel* model,
}
#endif
void OnIconDataAvailable(util::Promise promise, gfx::Image* icon) {
if (icon && !icon->IsEmpty()) {
promise.Resolve(*icon);
void OnIconDataAvailable(util::Promise promise, gfx::Image icon) {
if (!icon.IsEmpty()) {
promise.Resolve(icon);
} else {
promise.RejectWithErrorMessage("Failed to get file icon.");
}
@@ -670,10 +674,11 @@ void App::OnLogin(scoped_refptr<LoginHandler> login_handler,
bool prevent_default = false;
content::WebContents* web_contents = login_handler->GetWebContents();
if (web_contents) {
prevent_default = Emit(
"login", WebContents::FromOrCreate(isolate(), web_contents),
request_details, login_handler->auth_info(),
base::Bind(&PassLoginInformation, base::RetainedRef(login_handler)));
prevent_default =
Emit("login", WebContents::FromOrCreate(isolate(), web_contents),
request_details, *login_handler->auth_info(),
base::BindOnce(&PassLoginInformation,
base::RetainedRef(login_handler)));
}
// Default behavior is to always cancel the auth.
@@ -721,7 +726,7 @@ void App::AllowCertificateError(
content::ResourceType resource_type,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(content::CertificateRequestResultType)>&
const base::RepeatingCallback<void(content::CertificateRequestResultType)>&
callback) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
@@ -755,8 +760,8 @@ void App::SelectClientCertificate(
Emit("select-client-certificate",
WebContents::FromOrCreate(isolate(), web_contents),
cert_request_info->host_and_port.ToString(), std::move(client_certs),
base::Bind(&OnClientCertificateSelected, isolate(), shared_delegate,
shared_identities));
base::BindOnce(&OnClientCertificateSelected, isolate(),
shared_delegate, shared_identities));
// Default to first certificate from the platform store.
if (!prevent_default) {
@@ -764,10 +769,14 @@ void App::SelectClientCertificate(
(*shared_identities)[0]->certificate();
net::ClientCertIdentity::SelfOwningAcquirePrivateKey(
std::move((*shared_identities)[0]),
base::Bind(&GotPrivateKey, shared_delegate, std::move(cert)));
base::BindRepeating(&GotPrivateKey, shared_delegate, std::move(cert)));
}
}
void App::OnGpuInfoUpdate() {
Emit("gpu-info-update");
}
void App::OnGpuProcessCrashed(base::TerminationStatus status) {
Emit("gpu-process-crashed",
status == base::TERMINATION_STATUS_PROCESS_WAS_KILLED);
@@ -947,10 +956,10 @@ bool App::RequestSingleInstanceLock() {
base::FilePath user_dir;
base::PathService::Get(DIR_USER_DATA, &user_dir);
auto cb = base::Bind(&App::OnSecondInstance, base::Unretained(this));
auto cb = base::BindRepeating(&App::OnSecondInstance, base::Unretained(this));
process_singleton_.reset(new ProcessSingleton(
user_dir, base::Bind(NotificationCallbackWrapper, cb)));
user_dir, base::BindRepeating(NotificationCallbackWrapper, cb)));
switch (process_singleton_->NotifyOtherProcessOrCreate()) {
case ProcessSingleton::NotifyResult::LOCK_ERROR:
@@ -1056,30 +1065,31 @@ Browser::LoginItemSettings App::GetLoginItemSettings(mate::Arguments* args) {
#if defined(USE_NSS_CERTS)
void App::ImportCertificate(const base::DictionaryValue& options,
const net::CompletionCallback& callback) {
net::CompletionRepeatingCallback callback) {
auto browser_context = AtomBrowserContext::From("", false);
if (!certificate_manager_model_) {
auto copy = base::DictionaryValue::From(
base::Value::ToUniquePtrValue(options.Clone()));
CertificateManagerModel::Create(
browser_context.get(),
base::Bind(&App::OnCertificateManagerModelCreated,
base::Unretained(this), base::Passed(&copy), callback));
base::BindRepeating(&App::OnCertificateManagerModelCreated,
base::Unretained(this), base::Passed(&copy),
callback));
return;
}
int rv = ImportIntoCertStore(certificate_manager_model_.get(), options);
callback.Run(rv);
std::move(callback).Run(rv);
}
void App::OnCertificateManagerModelCreated(
std::unique_ptr<base::DictionaryValue> options,
const net::CompletionCallback& callback,
net::CompletionOnceCallback callback,
std::unique_ptr<CertificateManagerModel> model) {
certificate_manager_model_ = std::move(model);
int rv =
ImportIntoCertStore(certificate_manager_model_.get(), *(options.get()));
callback.Run(rv);
std::move(callback).Run(rv);
}
#endif
@@ -1268,6 +1278,14 @@ void App::EnableSandbox(mate::Arguments* args) {
command_line->AppendSwitch(switches::kEnableSandbox);
}
void App::SetUserAgentFallback(const std::string& user_agent) {
AtomBrowserClient::Get()->SetUserAgent(user_agent);
}
std::string App::GetUserAgentFallback() {
return AtomBrowserClient::Get()->GetUserAgent();
}
#if defined(OS_MACOSX)
bool App::MoveToApplicationsFolder(mate::Arguments* args) {
return ui::cocoa::AtomBundleMover::Move(args);
@@ -1280,9 +1298,9 @@ bool App::IsInApplicationsFolder() {
int DockBounce(const std::string& type) {
int request_id = -1;
if (type == "critical")
request_id = Browser::Get()->DockBounce(Browser::BOUNCE_CRITICAL);
request_id = Browser::Get()->DockBounce(Browser::BounceType::CRITICAL);
else if (type == "informational")
request_id = Browser::Get()->DockBounce(Browser::BOUNCE_INFORMATIONAL);
request_id = Browser::Get()->DockBounce(Browser::BounceType::INFORMATIONAL);
return request_id;
}
@@ -1297,20 +1315,25 @@ v8::Local<v8::Value> App::GetDockAPI(v8::Isolate* isolate) {
auto browser = base::Unretained(Browser::Get());
mate::Dictionary dock_obj = mate::Dictionary::CreateEmpty(isolate);
dock_obj.SetMethod("bounce", &DockBounce);
dock_obj.SetMethod("cancelBounce",
base::Bind(&Browser::DockCancelBounce, browser));
dock_obj.SetMethod("downloadFinished",
base::Bind(&Browser::DockDownloadFinished, browser));
dock_obj.SetMethod("setBadge",
base::Bind(&Browser::DockSetBadgeText, browser));
dock_obj.SetMethod("getBadge",
base::Bind(&Browser::DockGetBadgeText, browser));
dock_obj.SetMethod("hide", base::Bind(&Browser::DockHide, browser));
dock_obj.SetMethod("show", base::Bind(&Browser::DockShow, browser));
dock_obj.SetMethod(
"cancelBounce",
base::BindRepeating(&Browser::DockCancelBounce, browser));
dock_obj.SetMethod(
"downloadFinished",
base::BindRepeating(&Browser::DockDownloadFinished, browser));
dock_obj.SetMethod(
"setBadge", base::BindRepeating(&Browser::DockSetBadgeText, browser));
dock_obj.SetMethod(
"getBadge", base::BindRepeating(&Browser::DockGetBadgeText, browser));
dock_obj.SetMethod("hide",
base::BindRepeating(&Browser::DockHide, browser));
dock_obj.SetMethod("show",
base::BindRepeating(&Browser::DockShow, browser));
dock_obj.SetMethod("isVisible",
base::Bind(&Browser::DockIsVisible, browser));
base::BindRepeating(&Browser::DockIsVisible, browser));
dock_obj.SetMethod("setMenu", &DockSetMenu);
dock_obj.SetMethod("setIcon", base::Bind(&Browser::DockSetIcon, browser));
dock_obj.SetMethod("setIcon",
base::BindRepeating(&Browser::DockSetIcon, browser));
dock_.Reset(isolate, dock_obj.GetHandle());
}
@@ -1329,70 +1352,84 @@ void App::BuildPrototype(v8::Isolate* isolate,
prototype->SetClassName(mate::StringToV8(isolate, "App"));
auto browser = base::Unretained(Browser::Get());
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.SetMethod("quit", base::Bind(&Browser::Quit, browser))
.SetMethod("exit", base::Bind(&Browser::Exit, browser))
.SetMethod("focus", base::Bind(&Browser::Focus, browser))
.SetMethod("getVersion", base::Bind(&Browser::GetVersion, browser))
.SetMethod("setVersion", base::Bind(&Browser::SetVersion, browser))
.SetMethod("getName", base::Bind(&Browser::GetName, browser))
.SetMethod("setName", base::Bind(&Browser::SetName, browser))
.SetMethod("isReady", base::Bind(&Browser::is_ready, browser))
.SetMethod("whenReady", base::Bind(&Browser::WhenReady, browser))
.SetMethod("quit", base::BindRepeating(&Browser::Quit, browser))
.SetMethod("exit", base::BindRepeating(&Browser::Exit, browser))
.SetMethod("focus", base::BindRepeating(&Browser::Focus, browser))
.SetMethod("getVersion",
base::BindRepeating(&Browser::GetVersion, browser))
.SetMethod("setVersion",
base::BindRepeating(&Browser::SetVersion, browser))
.SetMethod("_getName", base::BindRepeating(&Browser::GetName, browser))
.SetMethod("_setName", base::BindRepeating(&Browser::SetName, browser))
.SetMethod("isReady", base::BindRepeating(&Browser::is_ready, browser))
.SetMethod("whenReady", base::BindRepeating(&Browser::WhenReady, browser))
.SetMethod("addRecentDocument",
base::Bind(&Browser::AddRecentDocument, browser))
base::BindRepeating(&Browser::AddRecentDocument, browser))
.SetMethod("clearRecentDocuments",
base::Bind(&Browser::ClearRecentDocuments, browser))
base::BindRepeating(&Browser::ClearRecentDocuments, browser))
.SetMethod("setAppUserModelId",
base::Bind(&Browser::SetAppUserModelID, browser))
.SetMethod("isDefaultProtocolClient",
base::Bind(&Browser::IsDefaultProtocolClient, browser))
.SetMethod("setAsDefaultProtocolClient",
base::Bind(&Browser::SetAsDefaultProtocolClient, browser))
.SetMethod("removeAsDefaultProtocolClient",
base::Bind(&Browser::RemoveAsDefaultProtocolClient, browser))
.SetMethod("setBadgeCount", base::Bind(&Browser::SetBadgeCount, browser))
.SetMethod("getBadgeCount", base::Bind(&Browser::GetBadgeCount, browser))
base::BindRepeating(&Browser::SetAppUserModelID, browser))
.SetMethod(
"isDefaultProtocolClient",
base::BindRepeating(&Browser::IsDefaultProtocolClient, browser))
.SetMethod(
"setAsDefaultProtocolClient",
base::BindRepeating(&Browser::SetAsDefaultProtocolClient, browser))
.SetMethod(
"removeAsDefaultProtocolClient",
base::BindRepeating(&Browser::RemoveAsDefaultProtocolClient, browser))
.SetMethod("_setBadgeCount",
base::BindRepeating(&Browser::SetBadgeCount, browser))
.SetMethod("_getBadgeCount",
base::BindRepeating(&Browser::GetBadgeCount, browser))
.SetMethod("getLoginItemSettings", &App::GetLoginItemSettings)
.SetMethod("setLoginItemSettings",
base::Bind(&Browser::SetLoginItemSettings, browser))
base::BindRepeating(&Browser::SetLoginItemSettings, browser))
.SetMethod("isEmojiPanelSupported",
base::Bind(&Browser::IsEmojiPanelSupported, browser))
base::BindRepeating(&Browser::IsEmojiPanelSupported, browser))
.SetProperty("badgeCount",
base::BindRepeating(&Browser::GetBadgeCount, browser),
base::BindRepeating(&Browser::SetBadgeCount, browser))
.SetProperty("name", base::BindRepeating(&Browser::GetName, browser),
base::BindRepeating(&Browser::SetName, browser))
#if defined(OS_MACOSX)
.SetMethod("hide", base::Bind(&Browser::Hide, browser))
.SetMethod("show", base::Bind(&Browser::Show, browser))
.SetMethod("hide", base::BindRepeating(&Browser::Hide, browser))
.SetMethod("show", base::BindRepeating(&Browser::Show, browser))
.SetMethod("setUserActivity",
base::Bind(&Browser::SetUserActivity, browser))
base::BindRepeating(&Browser::SetUserActivity, browser))
.SetMethod("getCurrentActivityType",
base::Bind(&Browser::GetCurrentActivityType, browser))
.SetMethod("invalidateCurrentActivity",
base::Bind(&Browser::InvalidateCurrentActivity, browser))
base::BindRepeating(&Browser::GetCurrentActivityType, browser))
.SetMethod(
"invalidateCurrentActivity",
base::BindRepeating(&Browser::InvalidateCurrentActivity, browser))
.SetMethod("updateCurrentActivity",
base::Bind(&Browser::UpdateCurrentActivity, browser))
base::BindRepeating(&Browser::UpdateCurrentActivity, browser))
// TODO(juturu): Remove in 2.0, deprecate before then with warnings
.SetMethod("moveToApplicationsFolder", &App::MoveToApplicationsFolder)
.SetMethod("isInApplicationsFolder", &App::IsInApplicationsFolder)
#endif
#if defined(OS_MACOSX) || defined(OS_LINUX)
.SetMethod("setAboutPanelOptions",
base::Bind(&Browser::SetAboutPanelOptions, browser))
base::BindRepeating(&Browser::SetAboutPanelOptions, browser))
.SetMethod("showAboutPanel",
base::Bind(&Browser::ShowAboutPanel, browser))
base::BindRepeating(&Browser::ShowAboutPanel, browser))
#endif
#if defined(OS_MACOSX) || defined(OS_WIN)
.SetMethod("showEmojiPanel",
base::Bind(&Browser::ShowEmojiPanel, browser))
base::BindRepeating(&Browser::ShowEmojiPanel, browser))
.SetProperty("accessibilitySupportEnabled",
&App::IsAccessibilitySupportEnabled,
&App::SetAccessibilitySupportEnabled)
#endif
#if defined(OS_WIN)
.SetMethod("setUserTasks", base::Bind(&Browser::SetUserTasks, browser))
.SetMethod("setUserTasks",
base::BindRepeating(&Browser::SetUserTasks, browser))
.SetMethod("getJumpListSettings", &App::GetJumpListSettings)
.SetMethod("setJumpList", &App::SetJumpList)
#endif
#if defined(OS_LINUX)
.SetMethod("isUnityRunning",
base::Bind(&Browser::IsUnityRunning, browser))
base::BindRepeating(&Browser::IsUnityRunning, browser))
#endif
.SetMethod("setAppPath", &App::SetAppPath)
.SetMethod("getAppPath", &App::GetAppPath)
@@ -1428,6 +1465,8 @@ void App::BuildPrototype(v8::Isolate* isolate,
#if defined(OS_MACOSX)
.SetProperty("dock", &App::GetDockAPI)
#endif
.SetProperty("userAgentFallback", &App::GetUserAgentFallback,
&App::SetUserAgentFallback)
.SetMethod("enableSandbox", &App::EnableSandbox);
}

View File

@@ -27,7 +27,8 @@
#include "content/public/browser/render_process_host.h"
#include "native_mate/dictionary.h"
#include "native_mate/handle.h"
#include "net/base/completion_callback.h"
#include "net/base/completion_once_callback.h"
#include "net/base/completion_repeating_callback.h"
#include "net/ssl/client_cert_identity.h"
#if defined(USE_NSS_CERTS)
@@ -68,7 +69,7 @@ class App : public AtomBrowserClient::Delegate,
public content::BrowserChildProcessObserver {
public:
using FileIconCallback =
base::Callback<void(v8::Local<v8::Value>, const gfx::Image&)>;
base::RepeatingCallback<void(v8::Local<v8::Value>, const gfx::Image&)>;
static mate::Handle<App> Create(v8::Isolate* isolate);
@@ -78,7 +79,7 @@ class App : public AtomBrowserClient::Delegate,
#if defined(USE_NSS_CERTS)
void OnCertificateManagerModelCreated(
std::unique_ptr<base::DictionaryValue> options,
const net::CompletionCallback& callback,
net::CompletionOnceCallback callback,
std::unique_ptr<CertificateManagerModel> model);
#endif
@@ -132,8 +133,8 @@ class App : public AtomBrowserClient::Delegate,
content::ResourceType resource_type,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(content::CertificateRequestResultType)>&
callback) override;
const base::RepeatingCallback<
void(content::CertificateRequestResultType)>& callback) override;
void SelectClientCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
@@ -156,6 +157,7 @@ class App : public AtomBrowserClient::Delegate,
bool* no_javascript_access) override;
// content::GpuDataManagerObserver:
void OnGpuInfoUpdate() override;
void OnGpuProcessCrashed(base::TerminationStatus status) override;
// content::BrowserChildProcessObserver:
@@ -199,7 +201,7 @@ class App : public AtomBrowserClient::Delegate,
Browser::LoginItemSettings GetLoginItemSettings(mate::Arguments* args);
#if defined(USE_NSS_CERTS)
void ImportCertificate(const base::DictionaryValue& options,
const net::CompletionCallback& callback);
net::CompletionRepeatingCallback callback);
#endif
v8::Local<v8::Promise> GetFileIcon(const base::FilePath& path,
mate::Arguments* args);
@@ -209,6 +211,8 @@ class App : public AtomBrowserClient::Delegate,
v8::Local<v8::Promise> GetGPUInfo(v8::Isolate* isolate,
const std::string& info_type);
void EnableSandbox(mate::Arguments* args);
void SetUserAgentFallback(const std::string& user_agent);
std::string GetUserAgentFallback();
#if defined(OS_MACOSX)
bool MoveToApplicationsFolder(mate::Arguments* args);
@@ -218,7 +222,7 @@ class App : public AtomBrowserClient::Delegate,
#endif
#if defined(MAS_BUILD)
base::Callback<void()> StartAccessingSecurityScopedResource(
base::RepeatingCallback<void()> StartAccessingSecurityScopedResource(
mate::Arguments* args);
#endif

View File

@@ -33,6 +33,6 @@ void App::SetAppLogsPath(mate::Arguments* args) {
}
}
} // namespace atom
} // namespace api
} // namespace atom

View File

@@ -4,6 +4,8 @@
#include "atom/browser/api/atom_api_app.h"
#include <string>
#import <Cocoa/Cocoa.h>
#include "base/strings/sys_string_conversions.h"
@@ -19,13 +21,13 @@ void OnStopAccessingSecurityScopedResource(NSURL* bookmarkUrl) {
}
// Get base64 encoded NSData, create a bookmark for it and start accessing it.
base::Callback<void()> App::StartAccessingSecurityScopedResource(
base::RepeatingCallback<void()> App::StartAccessingSecurityScopedResource(
mate::Arguments* args) {
std::string data;
args->GetNext(&data);
NSString* base64str = base::SysUTF8ToNSString(data);
NSData* bookmarkData =
[[NSData alloc] initWithBase64EncodedString:base64str options:0];
NSData* bookmarkData = [[NSData alloc] initWithBase64EncodedString:base64str
options:0];
// Create bookmarkUrl from NSData.
BOOL isStale = false;
@@ -55,9 +57,10 @@ base::Callback<void()> App::StartAccessingSecurityScopedResource(
[bookmarkUrl retain];
// Return a js callback which will close the bookmark.
return base::Bind(&OnStopAccessingSecurityScopedResource, bookmarkUrl);
return base::BindRepeating(&OnStopAccessingSecurityScopedResource,
bookmarkUrl);
}
} // namespace atom
} // namespace api
} // namespace atom

View File

@@ -64,11 +64,17 @@ void AutoUpdater::OnError(const std::string& message,
auto errorObject =
error->ToObject(isolate()->GetCurrentContext()).ToLocalChecked();
auto context = isolate()->GetCurrentContext();
// add two new params for better error handling
errorObject->Set(mate::StringToV8(isolate(), "code"),
v8::Integer::New(isolate(), code));
errorObject->Set(mate::StringToV8(isolate(), "domain"),
mate::StringToV8(isolate(), domain));
errorObject
->Set(context, mate::StringToV8(isolate(), "code"),
v8::Integer::New(isolate(), code))
.Check();
errorObject
->Set(context, mate::StringToV8(isolate(), "domain"),
mate::StringToV8(isolate(), domain))
.Check();
mate::EmitEvent(isolate(), GetWrapper(), "error", errorObject, message);
}
@@ -91,7 +97,8 @@ void AutoUpdater::OnUpdateDownloaded(const std::string& release_notes,
const std::string& url) {
Emit("update-downloaded", release_notes, release_name, release_date, url,
// Keep compatibility with old APIs.
base::Bind(&AutoUpdater::QuitAndInstall, base::Unretained(this)));
base::BindRepeating(&AutoUpdater::QuitAndInstall,
base::Unretained(this)));
}
void AutoUpdater::OnWindowAllClosed() {

View File

@@ -68,7 +68,7 @@ void BrowserView::Init(v8::Isolate* isolate,
const mate::Dictionary& options) {
mate::Dictionary web_preferences = mate::Dictionary::CreateEmpty(isolate);
options.Get(options::kWebPreferences, &web_preferences);
web_preferences.Set("isBrowserView", true);
web_preferences.Set("type", "browserView");
mate::Handle<class WebContents> web_contents =
WebContents::Create(isolate, web_preferences);
@@ -165,7 +165,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
BrowserView::SetConstructor(isolate, base::Bind(&BrowserView::New));
BrowserView::SetConstructor(isolate, base::BindRepeating(&BrowserView::New));
mate::Dictionary browser_view(isolate, BrowserView::GetConstructor(isolate)
->GetFunction(context)

View File

@@ -392,8 +392,8 @@ void BrowserWindow::ScheduleUnresponsiveEvent(int ms) {
if (!window_unresponsive_closure_.IsCancelled())
return;
window_unresponsive_closure_.Reset(
base::Bind(&BrowserWindow::NotifyWindowUnresponsive, GetWeakPtr()));
window_unresponsive_closure_.Reset(base::BindRepeating(
&BrowserWindow::NotifyWindowUnresponsive, GetWeakPtr()));
base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
FROM_HERE, window_unresponsive_closure_.callback(),
base::TimeDelta::FromMilliseconds(ms));
@@ -474,8 +474,9 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("BrowserWindow", mate::CreateConstructor<BrowserWindow>(
isolate, base::Bind(&BrowserWindow::New)));
dict.Set("BrowserWindow",
mate::CreateConstructor<BrowserWindow>(
isolate, base::BindRepeating(&BrowserWindow::New)));
}
} // namespace

View File

@@ -4,6 +4,9 @@
#include "atom/browser/api/atom_api_browser_window.h"
#include <memory>
#include <vector>
#import <Cocoa/Cocoa.h>
#include "atom/browser/native_browser_view.h"

View File

@@ -53,7 +53,7 @@ struct Converter<base::trace_event::TraceConfig> {
namespace {
using CompletionCallback = base::Callback<void(const base::FilePath&)>;
using CompletionCallback = base::RepeatingCallback<void(const base::FilePath&)>;
scoped_refptr<TracingController::TraceDataEndpoint> GetTraceDataEndpoint(
const base::FilePath& path,
@@ -68,7 +68,7 @@ scoped_refptr<TracingController::TraceDataEndpoint> GetTraceDataEndpoint(
LOG(ERROR) << "Creating temporary file failed";
return TracingController::CreateFileEndpoint(
result_file_path, base::Bind(callback, result_file_path));
result_file_path, base::BindRepeating(callback, result_file_path));
}
v8::Local<v8::Promise> StopRecording(v8::Isolate* isolate,
@@ -79,9 +79,10 @@ v8::Local<v8::Promise> StopRecording(v8::Isolate* isolate,
// TODO(zcbenz): Remove the use of CopyablePromise when the
// CreateFileEndpoint API accepts OnceCallback.
TracingController::GetInstance()->StopTracing(GetTraceDataEndpoint(
path, base::Bind(atom::util::CopyablePromise::ResolveCopyablePromise<
const base::FilePath&>,
atom::util::CopyablePromise(promise))));
path,
base::BindRepeating(atom::util::CopyablePromise::ResolveCopyablePromise<
const base::FilePath&>,
atom::util::CopyablePromise(promise))));
return handle;
}

View File

@@ -12,14 +12,14 @@
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "base/task/post_task.h"
#include "base/time/time.h"
#include "base/values.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
#include "content/public/browser/storage_partition.h"
#include "gin/dictionary.h"
#include "gin/object_template_builder.h"
#include "net/cookies/canonical_cookie.h"
#include "net/cookies/cookie_store.h"
#include "net/cookies/cookie_util.h"
@@ -28,24 +28,13 @@
using content::BrowserThread;
namespace mate {
template <>
struct Converter<atom::api::Cookies::Error> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
atom::api::Cookies::Error val) {
if (val == atom::api::Cookies::SUCCESS)
return v8::Null(isolate);
else
return v8::Exception::Error(StringToV8(isolate, "Setting cookie failed"));
}
};
namespace gin {
template <>
struct Converter<net::CanonicalCookie> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const net::CanonicalCookie& val) {
mate::Dictionary dict(isolate, v8::Object::New(isolate));
gin::Dictionary dict(isolate, v8::Object::New(isolate));
dict.Set("name", val.Name());
dict.Set("value", val.Value());
dict.Set("domain", val.Domain());
@@ -56,7 +45,7 @@ struct Converter<net::CanonicalCookie> {
dict.Set("session", !val.IsPersistent());
if (val.IsPersistent())
dict.Set("expirationDate", val.ExpiryDate().ToDoubleT());
return dict.GetHandle();
return ConvertToV8(isolate, dict).As<v8::Object>();
}
};
@@ -68,22 +57,22 @@ struct Converter<network::mojom::CookieChangeCause> {
switch (val) {
case network::mojom::CookieChangeCause::INSERTED:
case network::mojom::CookieChangeCause::EXPLICIT:
return mate::StringToV8(isolate, "explicit");
return gin::StringToV8(isolate, "explicit");
case network::mojom::CookieChangeCause::OVERWRITE:
return mate::StringToV8(isolate, "overwrite");
return gin::StringToV8(isolate, "overwrite");
case network::mojom::CookieChangeCause::EXPIRED:
return mate::StringToV8(isolate, "expired");
return gin::StringToV8(isolate, "expired");
case network::mojom::CookieChangeCause::EVICTED:
return mate::StringToV8(isolate, "evicted");
return gin::StringToV8(isolate, "evicted");
case network::mojom::CookieChangeCause::EXPIRED_OVERWRITE:
return mate::StringToV8(isolate, "expired-overwrite");
return gin::StringToV8(isolate, "expired-overwrite");
default:
return mate::StringToV8(isolate, "unknown");
return gin::StringToV8(isolate, "unknown");
}
}
};
} // namespace mate
} // namespace gin
namespace atom {
@@ -113,203 +102,60 @@ bool MatchesDomain(std::string filter, const std::string& domain) {
}
// Returns whether |cookie| matches |filter|.
bool MatchesCookie(const base::DictionaryValue* filter,
bool MatchesCookie(const base::Value& filter,
const net::CanonicalCookie& cookie) {
std::string str;
bool b;
if (filter->GetString("name", &str) && str != cookie.Name())
const std::string* str;
if ((str = filter.FindStringKey("name")) && *str != cookie.Name())
return false;
if (filter->GetString("path", &str) && str != cookie.Path())
if ((str = filter.FindStringKey("path")) && *str != cookie.Path())
return false;
if (filter->GetString("domain", &str) && !MatchesDomain(str, cookie.Domain()))
if ((str = filter.FindStringKey("domain")) &&
!MatchesDomain(*str, cookie.Domain()))
return false;
if (filter->GetBoolean("secure", &b) && b != cookie.IsSecure())
base::Optional<bool> secure_filter = filter.FindBoolKey("secure");
if (secure_filter && *secure_filter == cookie.IsSecure())
return false;
if (filter->GetBoolean("session", &b) && b != !cookie.IsPersistent())
base::Optional<bool> session_filter = filter.FindBoolKey("session");
if (session_filter && *session_filter != !cookie.IsPersistent())
return false;
return true;
}
// Helper to returns the CookieStore.
inline net::CookieStore* GetCookieStore(
scoped_refptr<net::URLRequestContextGetter> getter) {
return getter->GetURLRequestContext()->cookie_store();
}
// Remove cookies from |list| not matching |filter|, and pass it to |callback|.
void FilterCookies(std::unique_ptr<base::DictionaryValue> filter,
void FilterCookies(const base::Value& filter,
util::Promise promise,
const net::CookieList& list,
const net::CookieStatusList& excluded_list) {
net::CookieList result;
for (const auto& cookie : list) {
if (MatchesCookie(filter.get(), cookie))
if (MatchesCookie(filter, cookie))
result.push_back(cookie);
}
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(util::Promise::ResolvePromise<const net::CookieList&>,
std::move(promise), std::move(result)));
promise.Resolve(gin::ConvertToV8(promise.isolate(), result));
}
// Receives cookies matching |filter| in IO thread.
void GetCookiesOnIO(scoped_refptr<net::URLRequestContextGetter> getter,
std::unique_ptr<base::DictionaryValue> filter,
util::Promise promise) {
std::string url;
filter->GetString("url", &url);
auto filtered_callback =
base::BindOnce(FilterCookies, std::move(filter), std::move(promise));
// Empty url will match all url cookies.
if (url.empty())
GetCookieStore(getter)->GetAllCookiesAsync(std::move(filtered_callback));
else
GetCookieStore(getter)->GetAllCookiesForURLAsync(
GURL(url), std::move(filtered_callback));
}
// Removes cookie with |url| and |name| in IO thread.
void RemoveCookieOnIO(scoped_refptr<net::URLRequestContextGetter> getter,
const GURL& url,
const std::string& name,
util::Promise promise) {
net::CookieDeletionInfo cookie_info;
cookie_info.url = url;
cookie_info.name = name;
GetCookieStore(getter)->DeleteAllMatchingInfoAsync(
std::move(cookie_info),
base::BindOnce(
[](util::Promise promise, uint32_t num_deleted) {
util::Promise::ResolveEmptyPromise(std::move(promise));
},
std::move(promise)));
}
// Callback of SetCookie.
void OnSetCookie(util::Promise promise,
net::CanonicalCookie::CookieInclusionStatus status) {
std::string errmsg;
std::string InclusionStatusToString(
net::CanonicalCookie::CookieInclusionStatus status) {
switch (status) {
case net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_HTTP_ONLY:
errmsg = "Failed to create httponly cookie";
break;
return "Failed to create httponly cookie";
case net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_SECURE_ONLY:
errmsg = "Cannot create a secure cookie from an insecure URL";
break;
return "Cannot create a secure cookie from an insecure URL";
case net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE:
errmsg = "Failed to parse cookie";
break;
return "Failed to parse cookie";
case net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN:
errmsg = "Failed to get cookie domain";
break;
return "Failed to get cookie domain";
case net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_INVALID_PREFIX:
errmsg = "Failed because the cookie violated prefix rules.";
break;
return "Failed because the cookie violated prefix rules.";
case net::CanonicalCookie::CookieInclusionStatus::
EXCLUDE_NONCOOKIEABLE_SCHEME:
errmsg = "Cannot set cookie for current scheme";
break;
return "Cannot set cookie for current scheme";
case net::CanonicalCookie::CookieInclusionStatus::INCLUDE:
errmsg = "";
break;
return "";
default:
errmsg = "Setting cookie failed";
break;
return "Setting cookie failed";
}
if (errmsg.empty()) {
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(util::Promise::ResolveEmptyPromise, std::move(promise)));
} else {
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(util::Promise::RejectPromise, std::move(promise),
std::move(errmsg)));
}
}
// Flushes cookie store in IO thread.
void FlushCookieStoreOnIOThread(
scoped_refptr<net::URLRequestContextGetter> getter,
util::Promise promise) {
GetCookieStore(getter)->FlushStore(
base::BindOnce(util::Promise::ResolveEmptyPromise, std::move(promise)));
}
// Sets cookie with |details| in IO thread.
void SetCookieOnIO(scoped_refptr<net::URLRequestContextGetter> getter,
std::unique_ptr<base::DictionaryValue> details,
util::Promise promise) {
std::string url_string, name, value, domain, path;
bool secure = false;
bool http_only = false;
double creation_date;
double expiration_date;
double last_access_date;
details->GetString("url", &url_string);
details->GetString("name", &name);
details->GetString("value", &value);
details->GetString("domain", &domain);
details->GetString("path", &path);
details->GetBoolean("secure", &secure);
details->GetBoolean("httpOnly", &http_only);
base::Time creation_time;
if (details->GetDouble("creationDate", &creation_date)) {
creation_time = (creation_date == 0)
? base::Time::UnixEpoch()
: base::Time::FromDoubleT(creation_date);
}
base::Time expiration_time;
if (details->GetDouble("expirationDate", &expiration_date)) {
expiration_time = (expiration_date == 0)
? base::Time::UnixEpoch()
: base::Time::FromDoubleT(expiration_date);
}
base::Time last_access_time;
if (details->GetDouble("lastAccessDate", &last_access_date)) {
last_access_time = (last_access_date == 0)
? base::Time::UnixEpoch()
: base::Time::FromDoubleT(last_access_date);
}
GURL url(url_string);
std::unique_ptr<net::CanonicalCookie> canonical_cookie(
net::CanonicalCookie::CreateSanitizedCookie(
url, name, value, domain, path, creation_time, expiration_time,
last_access_time, secure, http_only,
net::CookieSameSite::DEFAULT_MODE, net::COOKIE_PRIORITY_DEFAULT));
auto completion_callback = base::BindOnce(OnSetCookie, std::move(promise));
if (!canonical_cookie || !canonical_cookie->IsCanonical()) {
std::move(completion_callback)
.Run(net::CanonicalCookie::CookieInclusionStatus::
EXCLUDE_FAILURE_TO_STORE);
return;
}
if (url.is_empty()) {
std::move(completion_callback)
.Run(net::CanonicalCookie::CookieInclusionStatus::
EXCLUDE_INVALID_DOMAIN);
return;
}
if (name.empty()) {
std::move(completion_callback)
.Run(net::CanonicalCookie::CookieInclusionStatus::
EXCLUDE_FAILURE_TO_STORE);
return;
}
net::CookieOptions options;
if (http_only) {
options.set_include_httponly();
}
GetCookieStore(getter)->SetCanonicalCookieAsync(
std::move(canonical_cookie), url.scheme(), options,
std::move(completion_callback));
}
} // namespace
@@ -319,7 +165,8 @@ Cookies::Cookies(v8::Isolate* isolate, AtomBrowserContext* browser_context)
Init(isolate);
cookie_change_subscription_ =
browser_context_->cookie_change_notifier()->RegisterCookieChangeCallback(
base::Bind(&Cookies::OnCookieChanged, base::Unretained(this)));
base::BindRepeating(&Cookies::OnCookieChanged,
base::Unretained(this)));
}
Cookies::~Cookies() {}
@@ -328,13 +175,33 @@ v8::Local<v8::Promise> Cookies::Get(const base::DictionaryValue& filter) {
util::Promise promise(isolate());
v8::Local<v8::Promise> handle = promise.GetHandle();
auto copy = base::DictionaryValue::From(
base::Value::ToUniquePtrValue(filter.Clone()));
auto* getter = browser_context_->GetRequestContext();
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(GetCookiesOnIO, base::RetainedRef(getter), std::move(copy),
std::move(promise)));
std::string url_string;
filter.GetString("url", &url_string);
GURL url(url_string);
auto callback =
base::BindOnce(FilterCookies, filter.Clone(), std::move(promise));
auto* storage_partition = content::BrowserContext::GetDefaultStoragePartition(
browser_context_.get());
auto* manager = storage_partition->GetCookieManagerForBrowserProcess();
if (url.is_empty()) {
// GetAllCookies has a different callback signature than GetCookieList, but
// can be treated as the same, just returning no excluded cookies.
// |AddCookieStatusList| takes a |GetCookieListCallback| and returns a
// callback that calls the input callback with an empty excluded list.
manager->GetAllCookies(
net::cookie_util::AddCookieStatusList(std::move(callback)));
} else {
net::CookieOptions options;
options.set_include_httponly();
options.set_same_site_cookie_context(
net::CookieOptions::SameSiteCookieContext::SAME_SITE_STRICT);
options.set_do_not_update_access_time();
manager->GetCookieList(url, options, std::move(callback));
}
return handle;
}
@@ -344,11 +211,21 @@ v8::Local<v8::Promise> Cookies::Remove(const GURL& url,
util::Promise promise(isolate());
v8::Local<v8::Promise> handle = promise.GetHandle();
auto* getter = browser_context_->GetRequestContext();
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(RemoveCookieOnIO, base::RetainedRef(getter), url, name,
std::move(promise)));
auto cookie_deletion_filter = network::mojom::CookieDeletionFilter::New();
cookie_deletion_filter->url = url;
cookie_deletion_filter->cookie_name = name;
auto* storage_partition = content::BrowserContext::GetDefaultStoragePartition(
browser_context_.get());
auto* manager = storage_partition->GetCookieManagerForBrowserProcess();
manager->DeleteCookies(
std::move(cookie_deletion_filter),
base::BindOnce(
[](util::Promise promise, uint32_t num_deleted) {
util::Promise::ResolveEmptyPromise(std::move(promise));
},
std::move(promise)));
return handle;
}
@@ -357,13 +234,72 @@ v8::Local<v8::Promise> Cookies::Set(const base::DictionaryValue& details) {
util::Promise promise(isolate());
v8::Local<v8::Promise> handle = promise.GetHandle();
auto copy = base::DictionaryValue::From(
base::Value::ToUniquePtrValue(details.Clone()));
auto* getter = browser_context_->GetRequestContext();
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(SetCookieOnIO, base::RetainedRef(getter), std::move(copy),
std::move(promise)));
const std::string* url_string = details.FindStringKey("url");
const std::string* name = details.FindStringKey("name");
const std::string* value = details.FindStringKey("value");
const std::string* domain = details.FindStringKey("domain");
const std::string* path = details.FindStringKey("path");
bool secure = details.FindBoolKey("secure").value_or(false);
bool http_only = details.FindBoolKey("httpOnly").value_or(false);
base::Optional<double> creation_date = details.FindDoubleKey("creationDate");
base::Optional<double> expiration_date =
details.FindDoubleKey("expirationDate");
base::Optional<double> last_access_date =
details.FindDoubleKey("lastAccessDate");
base::Time creation_time = creation_date
? base::Time::FromDoubleT(*creation_date)
: base::Time::UnixEpoch();
base::Time expiration_time = expiration_date
? base::Time::FromDoubleT(*expiration_date)
: base::Time::UnixEpoch();
base::Time last_access_time = last_access_date
? base::Time::FromDoubleT(*last_access_date)
: base::Time::UnixEpoch();
GURL url(url_string ? *url_string : "");
if (url.is_empty()) {
promise.RejectWithErrorMessage(InclusionStatusToString(
net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN));
return handle;
}
if (!name || name->empty()) {
promise.RejectWithErrorMessage(InclusionStatusToString(
net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE));
return handle;
}
auto canonical_cookie = net::CanonicalCookie::CreateSanitizedCookie(
url, *name, value ? *value : "", domain ? *domain : "", path ? *path : "",
creation_time, expiration_time, last_access_time, secure, http_only,
net::CookieSameSite::NO_RESTRICTION, net::COOKIE_PRIORITY_DEFAULT);
if (!canonical_cookie || !canonical_cookie->IsCanonical()) {
promise.RejectWithErrorMessage(InclusionStatusToString(
net::CanonicalCookie::CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE));
return handle;
}
net::CookieOptions options;
if (http_only) {
options.set_include_httponly();
}
auto* storage_partition = content::BrowserContext::GetDefaultStoragePartition(
browser_context_.get());
auto* manager = storage_partition->GetCookieManagerForBrowserProcess();
manager->SetCanonicalCookie(
*canonical_cookie, url.scheme(), options,
base::BindOnce(
[](util::Promise promise,
net::CanonicalCookie::CookieInclusionStatus status) {
auto errmsg = InclusionStatusToString(status);
if (errmsg.empty()) {
promise.Resolve();
} else {
promise.RejectWithErrorMessage(errmsg);
}
},
std::move(promise)));
return handle;
}
@@ -372,29 +308,32 @@ v8::Local<v8::Promise> Cookies::FlushStore() {
util::Promise promise(isolate());
v8::Local<v8::Promise> handle = promise.GetHandle();
auto* getter = browser_context_->GetRequestContext();
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(FlushCookieStoreOnIOThread, base::RetainedRef(getter),
std::move(promise)));
auto* storage_partition = content::BrowserContext::GetDefaultStoragePartition(
browser_context_.get());
auto* manager = storage_partition->GetCookieManagerForBrowserProcess();
manager->FlushCookieStore(
base::BindOnce(util::Promise::ResolveEmptyPromise, std::move(promise)));
return handle;
}
void Cookies::OnCookieChanged(const CookieDetails* details) {
Emit("changed", *(details->cookie), details->cause, details->removed);
Emit("changed", gin::ConvertToV8(isolate(), *(details->cookie)),
gin::ConvertToV8(isolate(), details->cause),
gin::ConvertToV8(isolate(), details->removed));
}
// static
mate::Handle<Cookies> Cookies::Create(v8::Isolate* isolate,
AtomBrowserContext* browser_context) {
return mate::CreateHandle(isolate, new Cookies(isolate, browser_context));
gin::Handle<Cookies> Cookies::Create(v8::Isolate* isolate,
AtomBrowserContext* browser_context) {
return gin::CreateHandle(isolate, new Cookies(isolate, browser_context));
}
// static
void Cookies::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) {
prototype->SetClassName(mate::StringToV8(isolate, "Cookies"));
prototype->SetClassName(gin::StringToV8(isolate, "Cookies"));
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.SetMethod("get", &Cookies::Get)
.SetMethod("remove", &Cookies::Remove)

View File

@@ -12,7 +12,7 @@
#include "atom/browser/net/cookie_details.h"
#include "atom/common/promise_util.h"
#include "base/callback_list.h"
#include "native_mate/handle.h"
#include "gin/handle.h"
#include "net/cookies/canonical_cookie.h"
namespace base {
@@ -31,13 +31,8 @@ namespace api {
class Cookies : public mate::TrackableObject<Cookies> {
public:
enum Error {
SUCCESS,
FAILED,
};
static mate::Handle<Cookies> Create(v8::Isolate* isolate,
AtomBrowserContext* browser_context);
static gin::Handle<Cookies> Create(v8::Isolate* isolate,
AtomBrowserContext* browser_context);
// mate::TrackableObject:
static void BuildPrototype(v8::Isolate* isolate,

View File

@@ -165,8 +165,12 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaList* list) {
std::vector<std::string> device_names;
// Crucially, this list of device names will be in the same order as
// |media_list_sources|.
webrtc::DxgiDuplicatorController::Instance()->GetDeviceNames(
&device_names);
if (!webrtc::DxgiDuplicatorController::Instance()->GetDeviceNames(
&device_names)) {
Emit("error", "Failed to get sources.");
return;
}
int device_name_index = 0;
for (auto& source : screen_sources) {
const auto& device_name = device_names[device_name_index++];
@@ -176,13 +180,13 @@ void DesktopCapturer::UpdateSourcesList(DesktopMediaList* list) {
const int64_t device_id =
display::win::DisplayInfo::DeviceIdFromDeviceName(
wide_device_name.c_str());
source.display_id = base::Int64ToString(device_id);
source.display_id = base::NumberToString(device_id);
}
}
#elif defined(OS_MACOSX)
// On Mac, the IDs across the APIs match.
for (auto& source : screen_sources) {
source.display_id = base::Int64ToString(source.media_list_source.id.id);
source.display_id = base::NumberToString(source.media_list_source.id.id);
}
#endif // defined(OS_WIN)
// TODO(ajmacd): Add Linux support. The IDs across APIs differ but Chrome
@@ -222,7 +226,7 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("desktopCapturer", atom::api::DesktopCapturer::Create(isolate));
dict.SetMethod("createDesktopCapturer", &atom::api::DesktopCapturer::Create);
}
} // namespace

View File

@@ -241,7 +241,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
Menu::SetConstructor(isolate, base::Bind(&Menu::New));
Menu::SetConstructor(isolate, base::BindRepeating(&Menu::New));
mate::Dictionary dict(isolate, exports);
dict.Set(

View File

@@ -4,6 +4,9 @@
#import "atom/browser/api/atom_api_menu_mac.h"
#include <string>
#include <utility>
#include "atom/browser/native_window.h"
#include "atom/browser/unresponsive_suppressor.h"
#include "atom/common/node_includes.h"
@@ -41,10 +44,11 @@ void MenuMac::PopupAt(TopLevelWindow* 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);
auto popup =
base::BindOnce(&MenuMac::PopupOnUI, weak_factory_.GetWeakPtr(),
native_window->GetWeakPtr(), window->weak_map_id(), x, y,
positioning_item, callback);
base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, std::move(popup));
}
void MenuMac::PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
@@ -57,11 +61,11 @@ void MenuMac::PopupOnUI(const base::WeakPtr<NativeWindow>& native_window,
return;
NSWindow* nswindow = native_window->GetNativeWindow().GetNativeNSWindow();
auto close_callback = base::Bind(
auto close_callback = base::BindRepeating(
&MenuMac::OnClosed, weak_factory_.GetWeakPtr(), window_id, callback);
popup_controllers_[window_id] = base::scoped_nsobject<AtomMenuController>([
[AtomMenuController alloc] initWithModel:model()
useDefaultAccelerator:NO]);
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];
@@ -135,9 +139,9 @@ void MenuMac::OnClosed(int32_t window_id, base::Closure callback) {
// 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

@@ -46,13 +46,13 @@ void MenuViews::PopupAt(TopLevelWindow* window,
// Show the menu.
int32_t window_id = window->weak_map_id();
auto close_callback = base::Bind(
auto close_callback = base::BindRepeating(
&MenuViews::OnClosed, weak_factory_.GetWeakPtr(), window_id, callback);
menu_runners_[window_id] =
std::make_unique<MenuRunner>(model(), flags, close_callback);
menu_runners_[window_id]->RunMenuAt(
native_window->widget(), NULL, gfx::Rect(location, gfx::Size()),
views::MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_MOUSE);
views::MenuAnchorPosition::kTopLeft, ui::MENU_SOURCE_MOUSE);
}
void MenuViews::ClosePopupAt(int32_t window_id) {

View File

@@ -51,7 +51,7 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
URLRequest::SetConstructor(isolate, base::Bind(URLRequest::New));
URLRequest::SetConstructor(isolate, base::BindRepeating(URLRequest::New));
mate::Dictionary dict(isolate, exports);
dict.Set("net", Net::Create(isolate));

View File

@@ -110,7 +110,7 @@ void NetLog::OnNewState(const base::DictionaryValue& state) {
for (auto& promise : stop_callback_queue_) {
// TODO(zcbenz): Remove the use of CopyablePromise when the
// GetFilePathToCompletedLog API accepts OnceCallback.
net_log_writer_->GetFilePathToCompletedLog(base::Bind(
net_log_writer_->GetFilePathToCompletedLog(base::BindRepeating(
util::CopyablePromise::ResolveCopyablePromise<const base::FilePath&>,
util::CopyablePromise(promise)));
}

View File

@@ -258,7 +258,8 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
Notification::SetConstructor(isolate, base::Bind(&Notification::New));
Notification::SetConstructor(isolate,
base::BindRepeating(&Notification::New));
mate::Dictionary dict(isolate, exports);
dict.Set("Notification", Notification::GetConstructor(isolate)

View File

@@ -37,11 +37,11 @@ namespace api {
PowerMonitor::PowerMonitor(v8::Isolate* isolate) {
#if defined(OS_LINUX)
SetShutdownHandler(
base::Bind(&PowerMonitor::ShouldShutdown, base::Unretained(this)));
SetShutdownHandler(base::BindRepeating(&PowerMonitor::ShouldShutdown,
base::Unretained(this)));
#elif defined(OS_MACOSX)
Browser::Get()->SetShutdownHandler(
base::Bind(&PowerMonitor::ShouldShutdown, base::Unretained(this)));
Browser::Get()->SetShutdownHandler(base::BindRepeating(
&PowerMonitor::ShouldShutdown, base::Unretained(this)));
#endif
base::PowerMonitor::Get()->AddObserver(this);
Init(isolate);
@@ -101,9 +101,10 @@ int PowerMonitor::GetSystemIdleTime() {
// static
v8::Local<v8::Value> PowerMonitor::Create(v8::Isolate* isolate) {
if (!Browser::Get()->is_ready()) {
isolate->ThrowException(v8::Exception::Error(mate::StringToV8(
isolate,
"Cannot require \"powerMonitor\" module before app is ready")));
isolate->ThrowException(v8::Exception::Error(
mate::StringToV8(isolate,
"The 'powerMonitor' module can't be used before the "
"app 'ready' event")));
return v8::Null(isolate);
}
@@ -139,7 +140,8 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("powerMonitor", PowerMonitor::Create(isolate));
dict.Set("createPowerMonitor",
base::BindRepeating(&PowerMonitor::Create, isolate));
dict.Set("PowerMonitor", PowerMonitor::GetConstructor(isolate)
->GetFunction(context)
.ToLocalChecked());

View File

@@ -4,7 +4,9 @@
#include "atom/browser/api/atom_api_power_monitor.h"
#include <ApplicationServices/ApplicationServices.h>
#include <vector>
#import <ApplicationServices/ApplicationServices.h>
#import <Cocoa/Cocoa.h>
@interface MacLockMonitor : NSObject {

View File

@@ -7,15 +7,17 @@
#include <string>
#include "atom/common/node_includes.h"
#include "base/bind_helpers.h"
#include "base/task/post_task.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/public/common/service_manager_connection.h"
#include "native_mate/dictionary.h"
#include "gin/dictionary.h"
#include "gin/function_template.h"
#include "services/device/public/mojom/constants.mojom.h"
#include "services/device/public/mojom/wake_lock_provider.mojom.h"
#include "services/service_manager/public/cpp/connector.h"
namespace mate {
namespace gin {
template <>
struct Converter<device::mojom::WakeLockType> {
@@ -35,17 +37,17 @@ struct Converter<device::mojom::WakeLockType> {
}
};
} // namespace mate
} // namespace gin
namespace atom {
namespace api {
gin::WrapperInfo PowerSaveBlocker::kWrapperInfo = {gin::kEmbedderNativeGin};
PowerSaveBlocker::PowerSaveBlocker(v8::Isolate* isolate)
: current_lock_type_(device::mojom::WakeLockType::kPreventAppSuspension),
is_wake_lock_active_(false) {
Init(isolate);
}
is_wake_lock_active_(false) {}
PowerSaveBlocker::~PowerSaveBlocker() {}
@@ -118,16 +120,13 @@ bool PowerSaveBlocker::IsStarted(int id) {
}
// static
mate::Handle<PowerSaveBlocker> PowerSaveBlocker::Create(v8::Isolate* isolate) {
return mate::CreateHandle(isolate, new PowerSaveBlocker(isolate));
gin::Handle<PowerSaveBlocker> PowerSaveBlocker::Create(v8::Isolate* isolate) {
return gin::CreateHandle(isolate, new PowerSaveBlocker(isolate));
}
// static
void PowerSaveBlocker::BuildPrototype(
v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) {
prototype->SetClassName(mate::StringToV8(isolate, "PowerSaveBlocker"));
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
gin::ObjectTemplateBuilder PowerSaveBlocker::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return gin::Wrappable<PowerSaveBlocker>::GetObjectTemplateBuilder(isolate)
.SetMethod("start", &PowerSaveBlocker::Start)
.SetMethod("stop", &PowerSaveBlocker::Stop)
.SetMethod("isStarted", &PowerSaveBlocker::IsStarted);
@@ -144,7 +143,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
gin::Dictionary dict(isolate, exports);
dict.Set("powerSaveBlocker", atom::api::PowerSaveBlocker::Create(isolate));
}

View File

@@ -8,24 +8,24 @@
#include <map>
#include <memory>
#include "atom/browser/api/trackable_object.h"
#include "native_mate/handle.h"
#include "gin/handle.h"
#include "gin/object_template_builder.h"
#include "gin/wrappable.h"
#include "services/device/public/mojom/wake_lock.mojom.h"
namespace mate {
class Dictionary;
}
namespace atom {
namespace api {
class PowerSaveBlocker : public mate::TrackableObject<PowerSaveBlocker> {
class PowerSaveBlocker : public gin::Wrappable<PowerSaveBlocker> {
public:
static mate::Handle<PowerSaveBlocker> Create(v8::Isolate* isolate);
static gin::Handle<PowerSaveBlocker> Create(v8::Isolate* isolate);
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype);
// gin::Wrappable
gin::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
static gin::WrapperInfo kWrapperInfo;
protected:
explicit PowerSaveBlocker(v8::Isolate* isolate);

View File

@@ -164,9 +164,9 @@ Protocol::ProtocolError Protocol::UnregisterProtocolInIO(
const std::string& scheme) {
auto* job_factory = request_context_getter->job_factory();
if (!job_factory->HasProtocolHandler(scheme))
return PROTOCOL_NOT_REGISTERED;
return ProtocolError::NOT_REGISTERED;
job_factory->SetProtocolHandler(scheme, nullptr);
return PROTOCOL_OK;
return ProtocolError::OK;
}
bool IsProtocolHandledInIO(
@@ -209,8 +209,8 @@ Protocol::ProtocolError Protocol::UninterceptProtocolInIO(
scoped_refptr<URLRequestContextGetter> request_context_getter,
const std::string& scheme) {
return request_context_getter->job_factory()->UninterceptProtocol(scheme)
? PROTOCOL_OK
: PROTOCOL_NOT_INTERCEPTED;
? ProtocolError::OK
: ProtocolError::NOT_INTERCEPTED;
}
void Protocol::OnIOCompleted(const CompletionCallback& callback,
@@ -222,7 +222,7 @@ void Protocol::OnIOCompleted(const CompletionCallback& callback,
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
if (error == PROTOCOL_OK) {
if (error == ProtocolError::OK) {
callback.Run(v8::Null(isolate()));
} else {
std::string str = ErrorCodeToString(error);
@@ -232,15 +232,15 @@ void Protocol::OnIOCompleted(const CompletionCallback& callback,
std::string Protocol::ErrorCodeToString(ProtocolError error) {
switch (error) {
case PROTOCOL_FAIL:
case ProtocolError::FAIL:
return "Failed to manipulate protocol factory";
case PROTOCOL_REGISTERED:
case ProtocolError::REGISTERED:
return "The scheme has been registered";
case PROTOCOL_NOT_REGISTERED:
case ProtocolError::NOT_REGISTERED:
return "The scheme has not been registered";
case PROTOCOL_INTERCEPTED:
case ProtocolError::INTERCEPTED:
return "The scheme has been intercepted";
case PROTOCOL_NOT_INTERCEPTED:
case ProtocolError::NOT_INTERCEPTED:
return "The scheme has not been intercepted";
default:
return "Unexpected error";

View File

@@ -56,13 +56,13 @@ class Protocol : public mate::TrackableObject<Protocol> {
private:
// Possible errors.
enum ProtocolError {
PROTOCOL_OK, // no error
PROTOCOL_FAIL, // operation failed, should never occur
PROTOCOL_REGISTERED,
PROTOCOL_NOT_REGISTERED,
PROTOCOL_INTERCEPTED,
PROTOCOL_NOT_INTERCEPTED,
enum class ProtocolError {
OK, // no error
FAIL, // operation failed, should never occur
REGISTERED,
NOT_REGISTERED,
INTERCEPTED,
NOT_INTERCEPTED,
};
// The protocol handler that will create a protocol handler for certain
@@ -118,13 +118,13 @@ class Protocol : public mate::TrackableObject<Protocol> {
const Handler& handler) {
auto* job_factory = request_context_getter->job_factory();
if (job_factory->IsHandledProtocol(scheme))
return PROTOCOL_REGISTERED;
return ProtocolError::REGISTERED;
auto protocol_handler = std::make_unique<CustomProtocolHandler<RequestJob>>(
isolate, request_context_getter.get(), handler);
if (job_factory->SetProtocolHandler(scheme, std::move(protocol_handler)))
return PROTOCOL_OK;
return ProtocolError::OK;
else
return PROTOCOL_FAIL;
return ProtocolError::FAIL;
}
// Unregister the protocol handler that handles |scheme|.
@@ -159,15 +159,15 @@ class Protocol : public mate::TrackableObject<Protocol> {
const Handler& handler) {
auto* job_factory = request_context_getter->job_factory();
if (!job_factory->IsHandledProtocol(scheme))
return PROTOCOL_NOT_REGISTERED;
return ProtocolError::NOT_REGISTERED;
// It is possible a protocol is handled but can not be intercepted.
if (!job_factory->HasProtocolHandler(scheme))
return PROTOCOL_FAIL;
return ProtocolError::FAIL;
auto protocol_handler = std::make_unique<CustomProtocolHandler<RequestJob>>(
isolate, request_context_getter.get(), handler);
if (!job_factory->InterceptProtocol(scheme, std::move(protocol_handler)))
return PROTOCOL_INTERCEPTED;
return PROTOCOL_OK;
return ProtocolError::INTERCEPTED;
return ProtocolError::OK;
}
// Restore the |scheme| to its original protocol handler.

View File

@@ -0,0 +1,153 @@
// 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/api/atom_api_protocol_ns.h"
#include <memory>
#include "atom/browser/atom_browser_context.h"
#include "atom/common/native_mate_converters/net_converter.h"
#include "atom/common/native_mate_converters/once_callback.h"
#include "atom/common/promise_util.h"
#include "base/stl_util.h"
namespace atom {
namespace api {
namespace {
const char* kBuiltinSchemes[] = {
"about", "file", "http", "https", "data", "filesystem",
};
// Convert error code to string.
std::string ErrorCodeToString(ProtocolError error) {
switch (error) {
case ProtocolError::REGISTERED:
return "The scheme has been registered";
case ProtocolError::NOT_REGISTERED:
return "The scheme has not been registered";
case ProtocolError::INTERCEPTED:
return "The scheme has been intercepted";
case ProtocolError::NOT_INTERCEPTED:
return "The scheme has not been intercepted";
default:
return "Unexpected error";
}
}
void Noop() {}
} // namespace
ProtocolNS::ProtocolNS(v8::Isolate* isolate,
AtomBrowserContext* browser_context) {
Init(isolate);
AttachAsUserData(browser_context);
}
ProtocolNS::~ProtocolNS() = default;
void ProtocolNS::RegisterURLLoaderFactories(
content::ContentBrowserClient::NonNetworkURLLoaderFactoryMap* factories) {
for (const auto& it : handlers_) {
factories->emplace(it.first, std::make_unique<AtomURLLoaderFactory>(
it.second.first, it.second.second));
}
}
ProtocolError ProtocolNS::RegisterProtocol(ProtocolType type,
const std::string& scheme,
const ProtocolHandler& handler) {
ProtocolError error = ProtocolError::OK;
if (!base::ContainsKey(handlers_, scheme))
handlers_[scheme] = std::make_pair(type, handler);
else
error = ProtocolError::REGISTERED;
return error;
}
void ProtocolNS::UnregisterProtocol(const std::string& scheme,
mate::Arguments* args) {
ProtocolError error = ProtocolError::OK;
if (base::ContainsKey(handlers_, scheme))
handlers_.erase(scheme);
else
error = ProtocolError::NOT_REGISTERED;
HandleOptionalCallback(args, error);
}
bool ProtocolNS::IsProtocolRegistered(const std::string& scheme) {
return base::ContainsKey(handlers_, scheme);
}
void ProtocolNS::UninterceptProtocol(const std::string& scheme,
mate::Arguments* args) {
HandleOptionalCallback(args, ProtocolError::NOT_INTERCEPTED);
}
v8::Local<v8::Promise> ProtocolNS::IsProtocolHandled(
const std::string& scheme) {
util::Promise promise(isolate());
promise.Resolve(IsProtocolRegistered(scheme) ||
// The |isProtocolHandled| should return true for builtin
// schemes, however with NetworkService it is impossible to
// know which schemes are registered until a real network
// request is sent.
// So we have to test against a hard-coded builtin schemes
// list make it work with old code. We should deprecate this
// API with the new |isProtocolRegistered| API.
base::ContainsValue(kBuiltinSchemes, scheme));
return promise.GetHandle();
}
void ProtocolNS::HandleOptionalCallback(mate::Arguments* args,
ProtocolError error) {
CompletionCallback callback;
if (args->GetNext(&callback)) {
if (error == ProtocolError::OK)
callback.Run(v8::Null(args->isolate()));
else
callback.Run(v8::Exception::Error(
mate::StringToV8(isolate(), ErrorCodeToString(error))));
}
}
// static
mate::Handle<ProtocolNS> ProtocolNS::Create(
v8::Isolate* isolate,
AtomBrowserContext* browser_context) {
return mate::CreateHandle(isolate, new ProtocolNS(isolate, browser_context));
}
// static
void ProtocolNS::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) {
prototype->SetClassName(mate::StringToV8(isolate, "Protocol"));
mate::ObjectTemplateBuilder(isolate, prototype->PrototypeTemplate())
.SetMethod("registerStringProtocol",
&ProtocolNS::RegisterProtocolFor<ProtocolType::kString>)
.SetMethod("registerBufferProtocol",
&ProtocolNS::RegisterProtocolFor<ProtocolType::kBuffer>)
.SetMethod("registerFileProtocol",
&ProtocolNS::RegisterProtocolFor<ProtocolType::kFile>)
.SetMethod("registerHttpProtocol",
&ProtocolNS::RegisterProtocolFor<ProtocolType::kHttp>)
.SetMethod("registerStreamProtocol",
&ProtocolNS::RegisterProtocolFor<ProtocolType::kStream>)
.SetMethod("registerProtocol",
&ProtocolNS::RegisterProtocolFor<ProtocolType::kFree>)
.SetMethod("unregisterProtocol", &ProtocolNS::UnregisterProtocol)
.SetMethod("isProtocolRegistered", &ProtocolNS::IsProtocolRegistered)
.SetMethod("isProtocolHandled", &ProtocolNS::IsProtocolHandled)
.SetMethod("interceptStringProtocol", &Noop)
.SetMethod("interceptBufferProtocol", &Noop)
.SetMethod("interceptFileProtocol", &Noop)
.SetMethod("interceptHttpProtocol", &Noop)
.SetMethod("interceptStreamProtocol", &Noop)
.SetMethod("uninterceptProtocol", &ProtocolNS::UninterceptProtocol);
}
} // namespace api
} // namespace atom

View File

@@ -0,0 +1,83 @@
// 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_API_ATOM_API_PROTOCOL_NS_H_
#define ATOM_BROWSER_API_ATOM_API_PROTOCOL_NS_H_
#include <map>
#include <string>
#include <utility>
#include "atom/browser/api/trackable_object.h"
#include "atom/browser/net/atom_url_loader_factory.h"
#include "content/public/browser/content_browser_client.h"
#include "native_mate/dictionary.h"
#include "native_mate/handle.h"
namespace atom {
class AtomBrowserContext;
namespace api {
// Possible errors.
enum class ProtocolError {
OK, // no error
REGISTERED,
NOT_REGISTERED,
INTERCEPTED,
NOT_INTERCEPTED,
};
// Protocol implementation based on network services.
class ProtocolNS : public mate::TrackableObject<ProtocolNS> {
public:
static mate::Handle<ProtocolNS> Create(v8::Isolate* isolate,
AtomBrowserContext* browser_context);
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype);
// Used by AtomBrowserClient for creating URLLoaderFactory.
void RegisterURLLoaderFactories(
content::ContentBrowserClient::NonNetworkURLLoaderFactoryMap* factories);
private:
ProtocolNS(v8::Isolate* isolate, AtomBrowserContext* browser_context);
~ProtocolNS() override;
// Callback types.
using CompletionCallback = base::Callback<void(v8::Local<v8::Value>)>;
// JS APIs.
ProtocolError RegisterProtocol(ProtocolType type,
const std::string& scheme,
const ProtocolHandler& handler);
void UnregisterProtocol(const std::string& scheme, mate::Arguments* args);
bool IsProtocolRegistered(const std::string& scheme);
void UninterceptProtocol(const std::string& scheme, mate::Arguments* args);
// Old async version of IsProtocolRegistered.
v8::Local<v8::Promise> IsProtocolHandled(const std::string& scheme);
// Helper for converting old registration APIs to new RegisterProtocol API.
template <ProtocolType type>
void RegisterProtocolFor(const std::string& scheme,
const ProtocolHandler& handler,
mate::Arguments* args) {
HandleOptionalCallback(args, RegisterProtocol(type, scheme, handler));
}
// Be compatible with old interface, which accepts optional callback.
void HandleOptionalCallback(mate::Arguments* args, ProtocolError error);
// scheme => (type, handler).
std::map<std::string, std::pair<ProtocolType, ProtocolHandler>> handlers_;
};
} // namespace api
} // namespace atom
#endif // ATOM_BROWSER_API_ATOM_API_PROTOCOL_NS_H_

View File

@@ -64,9 +64,9 @@ void RenderProcessPreferences::BuildPrototype(
// static
mate::Handle<RenderProcessPreferences>
RenderProcessPreferences::ForAllWebContents(v8::Isolate* isolate) {
return mate::CreateHandle(isolate,
new RenderProcessPreferences(
isolate, base::Bind(&IsWebContents, isolate)));
return mate::CreateHandle(
isolate, new RenderProcessPreferences(
isolate, base::BindRepeating(&IsWebContents, isolate)));
}
} // namespace api

View File

@@ -116,7 +116,8 @@ void Screen::OnDisplayMetricsChanged(const display::Display& display,
v8::Local<v8::Value> Screen::Create(v8::Isolate* isolate) {
if (!Browser::Get()->is_ready()) {
isolate->ThrowException(v8::Exception::Error(mate::StringToV8(
isolate, "Cannot require \"screen\" module before app is ready")));
isolate,
"The 'screen' module can't be used before the app 'ready' event")));
return v8::Null(isolate);
}
@@ -162,7 +163,7 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("screen", Screen::Create(isolate));
dict.Set("createScreen", base::BindRepeating(&Screen::Create, isolate));
dict.Set(
"Screen",
Screen::GetConstructor(isolate)->GetFunction(context).ToLocalChecked());

View File

@@ -14,6 +14,7 @@
#include "atom/browser/api/atom_api_download_item.h"
#include "atom/browser/api/atom_api_net_log.h"
#include "atom/browser/api/atom_api_protocol.h"
#include "atom/browser/api/atom_api_protocol_ns.h"
#include "atom/browser/api/atom_api_web_request.h"
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/atom_browser_main_parts.h"
@@ -48,9 +49,8 @@
#include "content/public/browser/storage_partition.h"
#include "native_mate/dictionary.h"
#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"
@@ -58,6 +58,7 @@
#include "net/url_request/static_http_user_agent_settings.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
#include "services/network/public/cpp/features.h"
#include "ui/base/l10n/l10n_util.h"
using content::BrowserThread;
@@ -71,15 +72,6 @@ struct ClearStorageDataOptions {
uint32_t quota_types = StoragePartition::QUOTA_MANAGED_STORAGE_MASK_ALL;
};
struct ClearAuthCacheOptions {
std::string type;
GURL origin;
std::string realm;
base::string16 username;
base::string16 password;
net::HttpAuth::Scheme auth_scheme;
};
uint32_t GetStorageMask(const std::vector<std::string>& storage_types) {
uint32_t storage_mask = 0;
for (const auto& it : storage_types) {
@@ -120,18 +112,6 @@ uint32_t GetQuotaMask(const std::vector<std::string>& quota_types) {
return quota_mask;
}
net::HttpAuth::Scheme GetAuthSchemeFromString(const std::string& scheme) {
if (scheme == "basic")
return net::HttpAuth::AUTH_SCHEME_BASIC;
if (scheme == "digest")
return net::HttpAuth::AUTH_SCHEME_DIGEST;
if (scheme == "ntlm")
return net::HttpAuth::AUTH_SCHEME_NTLM;
if (scheme == "negotiate")
return net::HttpAuth::AUTH_SCHEME_NEGOTIATE;
return net::HttpAuth::AUTH_SCHEME_MAX;
}
void SetUserAgentInIO(scoped_refptr<net::URLRequestContextGetter> getter,
const std::string& accept_lang,
const std::string& user_agent) {
@@ -163,26 +143,6 @@ struct Converter<ClearStorageDataOptions> {
}
};
template <>
struct Converter<ClearAuthCacheOptions> {
static bool FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
ClearAuthCacheOptions* out) {
mate::Dictionary options;
if (!ConvertFromV8(isolate, val, &options))
return false;
options.Get("type", &out->type);
options.Get("origin", &out->origin);
options.Get("realm", &out->realm);
options.Get("username", &out->username);
options.Get("password", &out->password);
std::string scheme;
if (options.Get("scheme", &scheme))
out->auth_scheme = GetAuthSchemeFromString(scheme);
return true;
}
};
template <>
struct Converter<atom::VerifyRequestParams> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
@@ -209,73 +169,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::CompletionCallback 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) {
@@ -284,48 +177,6 @@ void SetCertVerifyProcInIO(
->SetVerifyProc(proc);
}
void ClearHostResolverCacheInIO(
const scoped_refptr<net::URLRequestContextGetter>& context_getter,
util::Promise promise) {
auto* request_context = context_getter->GetURLRequestContext();
auto* cache = request_context->host_resolver()->GetHostCache();
if (cache) {
cache->clear();
DCHECK_EQ(0u, cache->size());
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(util::Promise::ResolveEmptyPromise, std::move(promise)));
}
}
void ClearAuthCacheInIO(
const scoped_refptr<net::URLRequestContextGetter>& context_getter,
const ClearAuthCacheOptions& options,
util::Promise promise) {
auto* request_context = context_getter->GetURLRequestContext();
auto* network_session =
request_context->http_transaction_factory()->GetSession();
if (network_session) {
if (options.type == "password") {
auto* auth_cache = network_session->http_auth_cache();
if (!options.origin.is_empty()) {
auth_cache->Remove(
options.origin, options.realm, options.auth_scheme,
net::AuthCredentials(options.username, options.password));
} else {
auth_cache->ClearAllEntries();
}
} else if (options.type == "clientCertificate") {
auto* client_auth_cache = network_session->ssl_client_auth_cache();
client_auth_cache->Remove(net::HostPortPair::FromURL(options.origin));
}
network_session->CloseAllConnections();
}
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(util::Promise::ResolveEmptyPromise, std::move(promise)));
}
void AllowNTLMCredentialsForDomainsInIO(
const scoped_refptr<net::URLRequestContextGetter>& context_getter,
const std::string& domains) {
@@ -365,8 +216,9 @@ void DestroyGlobalHandle(v8::Isolate* isolate,
v8::HandleScope handle_scope(isolate);
if (!global_handle.IsEmpty()) {
v8::Local<v8::Value> local_handle = global_handle.Get(isolate);
if (local_handle->IsObject()) {
v8::Local<v8::Object> object = local_handle->ToObject(isolate);
v8::Local<v8::Object> object;
if (local_handle->IsObject() &&
local_handle->ToObject(isolate->GetCurrentContext()).ToLocal(&object)) {
void* ptr = object->GetAlignedPointerFromInternalField(0);
if (!ptr)
return;
@@ -429,24 +281,45 @@ v8::Local<v8::Promise> Session::ResolveProxy(mate::Arguments* args) {
args->GetNext(&url);
browser_context_->GetResolveProxyHelper()->ResolveProxy(
url,
base::Bind(util::CopyablePromise::ResolveCopyablePromise<std::string>,
util::CopyablePromise(promise)));
url, base::BindOnce(util::Promise::ResolvePromise<std::string>,
std::move(promise)));
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;
}
@@ -470,8 +343,7 @@ v8::Local<v8::Promise> Session::ClearStorageData(mate::Arguments* args) {
storage_partition->ClearData(
options.storage_types, options.quota_types, options.origin, base::Time(),
base::Time::Max(),
base::Bind(util::CopyablePromise::ResolveEmptyCopyablePromise,
util::CopyablePromise(promise)));
base::BindOnce(util::Promise::ResolveEmptyPromise, std::move(promise)));
return handle;
}
@@ -553,17 +425,18 @@ void Session::DisableNetworkEmulation() {
network_emulation_token_, network::mojom::NetworkConditions::New());
}
void WrapVerifyProc(base::Callback<void(const VerifyRequestParams& request,
base::Callback<void(int)>)> proc,
const VerifyRequestParams& request,
base::OnceCallback<void(int)> cb) {
void WrapVerifyProc(
base::RepeatingCallback<void(const VerifyRequestParams& request,
base::RepeatingCallback<void(int)>)> proc,
const VerifyRequestParams& request,
base::OnceCallback<void(int)> cb) {
proc.Run(request, base::AdaptCallbackForRepeating(std::move(cb)));
}
void Session::SetCertVerifyProc(v8::Local<v8::Value> val,
mate::Arguments* args) {
base::Callback<void(const VerifyRequestParams& request,
base::Callback<void(int)>)>
base::RepeatingCallback<void(const VerifyRequestParams& request,
base::RepeatingCallback<void(int)>)>
proc;
if (!(val->IsNull() || mate::ConvertFromV8(args->isolate(), val, &proc))) {
args->ThrowError("Must pass null or function");
@@ -574,7 +447,7 @@ void Session::SetCertVerifyProc(v8::Local<v8::Value> val,
FROM_HERE, {BrowserThread::IO},
base::BindOnce(&SetCertVerifyProcInIO,
WrapRefCounted(browser_context_->GetRequestContext()),
base::Bind(&WrapVerifyProc, proc)));
base::BindRepeating(&WrapVerifyProc, proc)));
}
void Session::SetPermissionRequestHandler(v8::Local<v8::Value> val,
@@ -606,30 +479,26 @@ v8::Local<v8::Promise> Session::ClearHostResolverCache(mate::Arguments* args) {
util::Promise promise(isolate);
v8::Local<v8::Promise> handle = promise.GetHandle();
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(&ClearHostResolverCacheInIO,
WrapRefCounted(browser_context_->GetRequestContext()),
std::move(promise)));
content::BrowserContext::GetDefaultStoragePartition(browser_context_.get())
->GetNetworkContext()
->ClearHostCache(nullptr,
base::BindOnce(util::Promise::ResolveEmptyPromise,
std::move(promise)));
return handle;
}
v8::Local<v8::Promise> Session::ClearAuthCache(mate::Arguments* args) {
v8::Isolate* isolate = args->isolate();
v8::Local<v8::Promise> Session::ClearAuthCache() {
auto* isolate = v8::Isolate::GetCurrent();
util::Promise promise(isolate);
v8::Local<v8::Promise> handle = promise.GetHandle();
ClearAuthCacheOptions options;
if (!args->GetNext(&options)) {
promise.RejectWithErrorMessage("Must specify options object");
return handle;
}
content::BrowserContext::GetDefaultStoragePartition(browser_context_.get())
->GetNetworkContext()
->ClearHttpAuthCache(base::Time(),
base::BindOnce(util::Promise::ResolveEmptyPromise,
std::move(promise)));
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::IO},
base::BindOnce(&ClearAuthCacheInIO,
WrapRefCounted(browser_context_->GetRequestContext()),
options, std::move(promise)));
return handle;
}
@@ -698,7 +567,7 @@ void Session::CreateInterruptedDownload(const mate::Dictionary& options) {
}
auto* download_manager =
content::BrowserContext::GetDownloadManager(browser_context());
download_manager->GetDelegate()->GetNextId(base::Bind(
download_manager->GetDelegate()->GetNextId(base::BindRepeating(
&DownloadIdCallback, download_manager, path, url_chain, mime_type, offset,
length, last_modified, etag, base::Time::FromDoubleT(start_time)));
}
@@ -726,8 +595,12 @@ v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) {
v8::Local<v8::Value> Session::Protocol(v8::Isolate* isolate) {
if (protocol_.IsEmpty()) {
auto handle = atom::api::Protocol::Create(isolate, browser_context());
protocol_.Reset(isolate, handle.ToV8());
v8::Local<v8::Value> handle;
if (base::FeatureList::IsEnabled(network::features::kNetworkService))
handle = ProtocolNS::Create(isolate, browser_context()).ToV8();
else
handle = Protocol::Create(isolate, browser_context()).ToV8();
protocol_.Reset(isolate, handle);
}
return v8::Local<v8::Value>::New(isolate, protocol_);
}
@@ -791,8 +664,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

@@ -15,7 +15,6 @@
#include "base/values.h"
#include "content/public/browser/download_manager.h"
#include "native_mate/handle.h"
#include "net/base/completion_callback.h"
class GURL;
@@ -64,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);
@@ -78,7 +77,7 @@ class Session : public mate::TrackableObject<Session>,
void SetPermissionCheckHandler(v8::Local<v8::Value> val,
mate::Arguments* args);
v8::Local<v8::Promise> ClearHostResolverCache(mate::Arguments* args);
v8::Local<v8::Promise> ClearAuthCache(mate::Arguments* args);
v8::Local<v8::Promise> ClearAuthCache();
void AllowNTLMCredentialsForDomains(const std::string& domains);
void SetUserAgent(const std::string& user_agent, mate::Arguments* args);
std::string GetUserAgent();

View File

@@ -5,6 +5,9 @@
#include "atom/browser/api/atom_api_system_preferences.h"
#include <map>
#include <memory>
#include <string>
#include <utility>
#import <AVFoundation/AVFoundation.h>
#import <Cocoa/Cocoa.h>
@@ -13,6 +16,7 @@
#include "atom/browser/mac/atom_application.h"
#include "atom/browser/mac/dict_util.h"
#include "atom/browser/ui/cocoa/NSColor+Hex.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "base/mac/scoped_cftyperef.h"
@@ -111,21 +115,6 @@ std::string ConvertAuthorizationStatus(AVAuthorizationStatusMac status) {
}
}
// Convert color to RGBA value like "aabbccdd"
std::string ToRGBA(NSColor* color) {
return base::StringPrintf(
"%02X%02X%02X%02X", (int)(color.redComponent * 0xFF),
(int)(color.greenComponent * 0xFF), (int)(color.blueComponent * 0xFF),
(int)(color.alphaComponent * 0xFF));
}
// Convert color to RGB hex value like "#ABCDEF"
std::string ToRGBHex(NSColor* color) {
return base::StringPrintf("#%02X%02X%02X", (int)(color.redComponent * 0xFF),
(int)(color.greenComponent * 0xFF),
(int)(color.blueComponent * 0xFF));
}
} // namespace
void SystemPreferences::PostNotification(const std::string& name,
@@ -405,7 +394,7 @@ std::string SystemPreferences::GetAccentColor() {
if (@available(macOS 10.14, *))
sysColor = [NSColor controlAccentColor];
return ToRGBA(sysColor);
return base::SysNSStringToUTF8([sysColor RGBAValue]);
}
std::string SystemPreferences::GetSystemColor(const std::string& color,
@@ -434,7 +423,7 @@ std::string SystemPreferences::GetSystemColor(const std::string& color,
return "";
}
return ToRGBHex(sysColor);
return base::SysNSStringToUTF8([sysColor hexadecimalValue]);
}
bool SystemPreferences::CanPromptTouchID() {
@@ -587,7 +576,7 @@ std::string SystemPreferences::GetColor(const std::string& color,
return "";
}
return ToRGBHex(sysColor);
return base::SysNSStringToUTF8([sysColor hexadecimalValue]);
}
std::string SystemPreferences::GetMediaAccessStatus(

View File

@@ -648,10 +648,11 @@ void TopLevelWindow::SetFocusable(bool focusable) {
}
void TopLevelWindow::SetMenu(v8::Isolate* isolate, v8::Local<v8::Value> value) {
auto context = isolate->GetCurrentContext();
mate::Handle<Menu> menu;
if (value->IsObject() &&
gin::V8ToString(
isolate, value->ToObject(isolate)->GetConstructorName()) == "Menu" &&
v8::Local<v8::Object> object;
if (value->IsObject() && value->ToObject(context).ToLocal(&object) &&
gin::V8ToString(isolate, object->GetConstructorName()) == "Menu" &&
mate::ConvertFromV8(isolate, value, &menu) && !menu.IsEmpty()) {
menu_.Reset(isolate, menu.ToV8());
window_->SetMenu(menu->model());
@@ -736,15 +737,15 @@ void TopLevelWindow::SetProgressBar(double progress, mate::Arguments* args) {
std::string mode;
args->GetNext(&options) && options.Get("mode", &mode);
NativeWindow::ProgressState state = NativeWindow::PROGRESS_NORMAL;
NativeWindow::ProgressState state = NativeWindow::ProgressState::kNormal;
if (mode == "error")
state = NativeWindow::PROGRESS_ERROR;
state = NativeWindow::ProgressState::kError;
else if (mode == "paused")
state = NativeWindow::PROGRESS_PAUSED;
state = NativeWindow::ProgressState::kPaused;
else if (mode == "indeterminate")
state = NativeWindow::PROGRESS_INDETERMINATE;
state = NativeWindow::ProgressState::kIndeterminate;
else if (mode == "none")
state = NativeWindow::PROGRESS_NONE;
state = NativeWindow::ProgressState::kNone;
window_->SetProgressBar(progress, state);
}
@@ -1189,7 +1190,8 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
TopLevelWindow::SetConstructor(isolate, base::Bind(&TopLevelWindow::New));
TopLevelWindow::SetConstructor(isolate,
base::BindRepeating(&TopLevelWindow::New));
mate::Dictionary constructor(isolate, TopLevelWindow::GetConstructor(isolate)
->GetFunction(context)

View File

@@ -25,18 +25,19 @@ struct Converter<atom::TrayIcon::HighlightMode> {
static bool FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
atom::TrayIcon::HighlightMode* out) {
using HighlightMode = atom::TrayIcon::HighlightMode;
std::string mode;
if (ConvertFromV8(isolate, val, &mode)) {
if (mode == "always") {
*out = atom::TrayIcon::HighlightMode::ALWAYS;
*out = HighlightMode::ALWAYS;
return true;
}
if (mode == "selection") {
*out = atom::TrayIcon::HighlightMode::SELECTION;
*out = HighlightMode::SELECTION;
return true;
}
if (mode == "never") {
*out = atom::TrayIcon::HighlightMode::NEVER;
*out = HighlightMode::NEVER;
return true;
}
}
@@ -59,11 +60,7 @@ Tray::Tray(v8::Isolate* isolate,
InitWith(isolate, wrapper);
}
Tray::~Tray() {
// Destroy the native tray in next tick.
base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE,
tray_icon_.release());
}
Tray::~Tray() = default;
// static
mate::WrappableBase* Tray::New(mate::Handle<NativeImage> image,
@@ -262,7 +259,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
Tray::SetConstructor(isolate, base::Bind(&Tray::New));
Tray::SetConstructor(isolate, base::BindRepeating(&Tray::New));
mate::Dictionary dict(isolate, exports);
dict.Set(

View File

@@ -9,9 +9,9 @@
#include "atom/browser/api/atom_api_session.h"
#include "atom/browser/net/atom_url_request.h"
#include "atom/common/api/event_emitter_caller.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/net_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/dictionary.h"
@@ -354,7 +354,7 @@ void URLRequest::OnReceivedRedirect(
}
void URLRequest::OnAuthenticationRequired(
scoped_refptr<const net::AuthChallengeInfo> auth_info) {
const net::AuthChallengeInfo& auth_info) {
if (request_state_.Canceled() || request_state_.Closed()) {
return;
}
@@ -364,8 +364,8 @@ void URLRequest::OnAuthenticationRequired(
return;
}
Emit("login", auth_info.get(),
base::Bind(&AtomURLRequest::PassLoginInformation, atom_request_));
Emit("login", auth_info,
base::BindOnce(&AtomURLRequest::PassLoginInformation, atom_request_));
}
void URLRequest::OnResponseStarted(

View File

@@ -105,8 +105,7 @@ class URLRequest : public mate::EventEmitter<URLRequest> {
const std::string& method,
const GURL& url,
scoped_refptr<net::HttpResponseHeaders> response_headers);
void OnAuthenticationRequired(
scoped_refptr<const net::AuthChallengeInfo> auth_info);
void OnAuthenticationRequired(const net::AuthChallengeInfo& auth_info);
void OnResponseStarted(
scoped_refptr<net::HttpResponseHeaders> response_headers);
void OnResponseData(scoped_refptr<const net::IOBufferWithSize> data);

View File

@@ -73,7 +73,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Local<v8::Context> context,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
View::SetConstructor(isolate, base::Bind(&View::New));
View::SetConstructor(isolate, base::BindRepeating(&View::New));
mate::Dictionary constructor(
isolate,

View File

@@ -35,14 +35,15 @@
#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"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/map_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"
@@ -86,6 +87,7 @@
#include "net/url_request/url_request_context.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"
#include "third_party/blink/public/platform/web_input_event.h"
#include "ui/display/screen.h"
#include "ui/events/base_event_utils.h"
@@ -266,7 +268,7 @@ struct WebContents::FrameDispatchHelper {
WebContents::WebContents(v8::Isolate* isolate,
content::WebContents* web_contents)
: content::WebContentsObserver(web_contents), type_(REMOTE) {
: content::WebContentsObserver(web_contents), type_(Type::REMOTE) {
web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent(),
false);
Init(isolate);
@@ -282,7 +284,8 @@ WebContents::WebContents(v8::Isolate* isolate,
std::unique_ptr<content::WebContents> web_contents,
Type type)
: content::WebContentsObserver(web_contents.get()), type_(type) {
DCHECK(type != REMOTE) << "Can't take ownership of a remote WebContents";
DCHECK(type != Type::REMOTE)
<< "Can't take ownership of a remote WebContents";
auto session = Session::CreateFrom(isolate, GetBrowserContext());
session_.Reset(isolate, session.ToV8());
InitWithSessionAndOptions(isolate, std::move(web_contents), session,
@@ -294,21 +297,13 @@ WebContents::WebContents(v8::Isolate* isolate,
// Read options.
options.Get("backgroundThrottling", &background_throttling_);
// FIXME(zcbenz): We should read "type" parameter for better design, but
// on Windows we have encountered a compiler bug that if we read "type"
// from |options| and then set |type_|, a memory corruption will happen
// and Electron will soon crash.
// Remvoe this after we upgraded to use VS 2015 Update 3.
// Get type
options.Get("type", &type_);
bool b = false;
if (options.Get("isGuest", &b) && b)
type_ = WEB_VIEW;
else if (options.Get("isBackgroundPage", &b) && b)
type_ = BACKGROUND_PAGE;
else if (options.Get("isBrowserView", &b) && b)
type_ = BROWSER_VIEW;
#if BUILDFLAG(ENABLE_OSR)
else if (options.Get(options::kOffscreen, &b) && b)
type_ = OFF_SCREEN;
if (options.Get(options::kOffscreen, &b) && b)
type_ = Type::OFF_SCREEN;
#endif
// Init embedder earlier
@@ -343,7 +338,8 @@ WebContents::WebContents(v8::Isolate* isolate,
#if BUILDFLAG(ENABLE_OSR)
if (embedder_ && embedder_->IsOffScreen()) {
auto* view = new OffScreenWebContentsView(
false, base::Bind(&WebContents::OnPaint, base::Unretained(this)));
false,
base::BindRepeating(&WebContents::OnPaint, base::Unretained(this)));
params.view = view;
params.delegate_view = view;
@@ -360,7 +356,8 @@ WebContents::WebContents(v8::Isolate* isolate,
content::WebContents::CreateParams params(session->browser_context());
auto* view = new OffScreenWebContentsView(
transparent, base::Bind(&WebContents::OnPaint, base::Unretained(this)));
transparent,
base::BindRepeating(&WebContents::OnPaint, base::Unretained(this)));
params.view = view;
params.delegate_view = view;
@@ -455,12 +452,12 @@ WebContents::~WebContents() {
RenderViewDeleted(web_contents()->GetRenderViewHost());
if (type_ == WEB_VIEW) {
if (type_ == Type::WEB_VIEW) {
DCHECK(!web_contents()->GetOuterWebContents())
<< "Should never manually destroy an attached webview";
// For webview simply destroy the WebContents immediately.
DestroyWebContents(false /* async */);
} else if (type_ == BROWSER_WINDOW && owner_window()) {
} else if (type_ == Type::BROWSER_WINDOW && owner_window()) {
// For BrowserWindow we should close the window and clean up everything
// before WebContents is destroyed.
for (ExtendedWebContentsObserver& observer : observers_)
@@ -490,12 +487,14 @@ void WebContents::DestroyWebContents(bool async) {
ResetManagedWebContents(async);
}
bool WebContents::DidAddMessageToConsole(content::WebContents* source,
int32_t level,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) {
return Emit("console-message", level, message, line_no, source_id);
bool WebContents::DidAddMessageToConsole(
content::WebContents* source,
blink::mojom::ConsoleMessageLevel level,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) {
return Emit("console-message", static_cast<int32_t>(level), message, line_no,
source_id);
}
void WebContents::OnCreateWindow(
@@ -505,7 +504,7 @@ void WebContents::OnCreateWindow(
WindowOpenDisposition disposition,
const std::vector<std::string>& features,
const scoped_refptr<network::ResourceRequestBody>& body) {
if (type_ == BROWSER_WINDOW || type_ == OFF_SCREEN)
if (type_ == Type::BROWSER_WINDOW || type_ == Type::OFF_SCREEN)
Emit("-new-window", target_url, frame_name, disposition, features, body,
referrer);
else
@@ -537,7 +536,7 @@ void WebContents::AddNewContents(
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
auto api_web_contents =
CreateAndTake(isolate(), std::move(new_contents), BROWSER_WINDOW);
CreateAndTake(isolate(), std::move(new_contents), Type::BROWSER_WINDOW);
if (Emit("-add-new-contents", api_web_contents, disposition, user_gesture,
initial_rect.x(), initial_rect.y(), initial_rect.width(),
initial_rect.height(), tracker->url, tracker->frame_name)) {
@@ -550,7 +549,7 @@ content::WebContents* WebContents::OpenURLFromTab(
content::WebContents* source,
const content::OpenURLParams& params) {
if (params.disposition != WindowOpenDisposition::CURRENT_TAB) {
if (type_ == BROWSER_WINDOW || type_ == OFF_SCREEN)
if (type_ == Type::BROWSER_WINDOW || type_ == Type::OFF_SCREEN)
Emit("-new-window", params.url, "", params.disposition);
else
Emit("new-window", params.url, "", params.disposition);
@@ -572,7 +571,7 @@ content::WebContents* WebContents::OpenURLFromTab(
void WebContents::BeforeUnloadFired(content::WebContents* tab,
bool proceed,
bool* proceed_to_fire_unload) {
if (type_ == BROWSER_WINDOW || type_ == OFF_SCREEN)
if (type_ == Type::BROWSER_WINDOW || type_ == Type::OFF_SCREEN)
*proceed_to_fire_unload = proceed;
else
*proceed_to_fire_unload = true;
@@ -606,7 +605,7 @@ void WebContents::UpdateTargetURL(content::WebContents* source,
bool WebContents::HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) {
if (type_ == WEB_VIEW && embedder_) {
if (type_ == Type::WEB_VIEW && embedder_) {
// Send the unhandled keyboard events back to the embedder.
return embedder_->HandleKeyboardEvent(source, event);
} else {
@@ -629,14 +628,19 @@ content::KeyboardEventProcessingResult WebContents::PreHandleKeyboardEvent(
return content::KeyboardEventProcessingResult::NOT_HANDLED;
}
void WebContents::ContentsZoomChange(bool zoom_in) {
Emit("zoom-changed", zoom_in ? "in" : "out");
}
void WebContents::EnterFullscreenModeForTab(
content::WebContents* source,
const GURL& origin,
const blink::WebFullscreenOptions& options) {
auto* permission_helper =
WebContentsPermissionHelper::FromWebContents(source);
auto callback = base::Bind(&WebContents::OnEnterFullscreenModeForTab,
base::Unretained(this), source, origin, options);
auto callback =
base::BindRepeating(&WebContents::OnEnterFullscreenModeForTab,
base::Unretained(this), source, origin, options);
permission_helper->RequestFullscreenPermission(callback);
}
@@ -675,8 +679,9 @@ bool WebContents::HandleContextMenu(content::RenderFrameHost* render_frame_host,
const content::ContextMenuParams& params) {
if (params.custom_context.is_pepper_menu) {
Emit("pepper-context-menu", std::make_pair(params, web_contents()),
base::Bind(&content::WebContents::NotifyContextMenuClosed,
base::Unretained(web_contents()), params.custom_context));
base::BindOnce(&content::WebContents::NotifyContextMenuClosed,
base::Unretained(web_contents()),
params.custom_context));
} else {
Emit("context-menu", std::make_pair(params, web_contents()));
}
@@ -807,20 +812,20 @@ void WebContents::PluginCrashed(const base::FilePath& plugin_path,
}
void WebContents::MediaStartedPlaying(const MediaPlayerInfo& video_type,
const MediaPlayerId& id) {
const content::MediaPlayerId& id) {
Emit("media-started-playing");
}
void WebContents::MediaStoppedPlaying(
const MediaPlayerInfo& video_type,
const MediaPlayerId& id,
const content::MediaPlayerId& id,
content::WebContentsObserver::MediaStoppedReason reason) {
Emit("media-paused");
}
void WebContents::DidChangeThemeColor(SkColor theme_color) {
if (theme_color != SK_ColorTRANSPARENT) {
Emit("did-change-theme-color", atom::ToRGBHex(theme_color));
void WebContents::DidChangeThemeColor(base::Optional<SkColor> theme_color) {
if (theme_color) {
Emit("did-change-theme-color", atom::ToRGBHex(theme_color.value()));
} else {
Emit("did-change-theme-color", nullptr);
}
@@ -1192,7 +1197,7 @@ void WebContents::SetBackgroundThrottling(bool allowed) {
return;
}
const auto* render_view_host = contents->GetRenderViewHost();
auto* render_view_host = contents->GetRenderViewHost();
if (!render_view_host) {
return;
}
@@ -1386,14 +1391,14 @@ v8::Local<v8::Promise> WebContents::SavePage(
}
void WebContents::OpenDevTools(mate::Arguments* args) {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
if (!enable_devtools_)
return;
std::string state;
if (type_ == WEB_VIEW || !owner_window()) {
if (type_ == Type::WEB_VIEW || !owner_window()) {
state = "detach";
}
bool activate = true;
@@ -1409,21 +1414,21 @@ void WebContents::OpenDevTools(mate::Arguments* args) {
}
void WebContents::CloseDevTools() {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
managed_web_contents()->CloseDevTools();
}
bool WebContents::IsDevToolsOpened() {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return false;
return managed_web_contents()->IsDevToolsViewShowing();
}
bool WebContents::IsDevToolsFocused() {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return false;
return managed_web_contents()->GetView()->IsDevToolsViewFocused();
@@ -1431,7 +1436,7 @@ bool WebContents::IsDevToolsFocused() {
void WebContents::EnableDeviceEmulation(
const blink::WebDeviceEmulationParams& params) {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
auto* frame_host = web_contents()->GetMainFrame();
@@ -1446,7 +1451,7 @@ void WebContents::EnableDeviceEmulation(
}
void WebContents::DisableDeviceEmulation() {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
auto* frame_host = web_contents()->GetMainFrame();
@@ -1468,7 +1473,7 @@ void WebContents::ToggleDevTools() {
}
void WebContents::InspectElement(int x, int y) {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
if (!enable_devtools_)
@@ -1480,7 +1485,7 @@ void WebContents::InspectElement(int x, int y) {
}
void WebContents::InspectSharedWorker() {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
if (!enable_devtools_)
@@ -1497,7 +1502,7 @@ void WebContents::InspectSharedWorker() {
}
void WebContents::InspectServiceWorker() {
if (type_ == REMOTE)
if (type_ == Type::REMOTE)
return;
if (!enable_devtools_)
@@ -1697,7 +1702,7 @@ bool WebContents::IsFocused() const {
if (!view)
return false;
if (GetType() != BACKGROUND_PAGE) {
if (GetType() != Type::BACKGROUND_PAGE) {
auto* window = web_contents()->GetNativeView()->GetToplevelWindow();
if (window && !window->IsVisible())
return false;
@@ -1915,10 +1920,9 @@ v8::Local<v8::Promise> WebContents::CapturePage(mate::Arguments* args) {
}
void WebContents::OnCursorChange(const content::WebCursor& cursor) {
content::CursorInfo info;
cursor.GetCursorInfo(&info);
const content::CursorInfo& info = cursor.info();
if (cursor.IsCustom()) {
if (info.type == blink::WebCursorInfo::kTypeCustom) {
Emit("cursor-changed", CursorTypeToString(info),
gfx::Image::CreateFrom1xBitmap(info.custom_image),
info.image_scale_factor,
@@ -1930,7 +1934,7 @@ void WebContents::OnCursorChange(const content::WebCursor& cursor) {
}
bool WebContents::IsGuest() const {
return type_ == WEB_VIEW;
return type_ == Type::WEB_VIEW;
}
void WebContents::AttachToIframe(content::WebContents* embedder_web_contents,
@@ -1941,7 +1945,7 @@ void WebContents::AttachToIframe(content::WebContents* embedder_web_contents,
bool WebContents::IsOffScreen() const {
#if BUILDFLAG(ENABLE_OSR)
return type_ == OFF_SCREEN;
return type_ == Type::OFF_SCREEN;
#else
return false;
#endif
@@ -2153,21 +2157,23 @@ void WebContents::GrantOriginAccess(const GURL& url) {
url::Origin::Create(url));
}
void WebContents::TakeHeapSnapshot(const base::FilePath& file_path,
base::Callback<void(bool)> callback) {
base::ThreadRestrictions::ScopedAllowIO allow_io;
v8::Local<v8::Promise> WebContents::TakeHeapSnapshot(
const base::FilePath& file_path) {
util::Promise promise(isolate());
v8::Local<v8::Promise> handle = promise.GetHandle();
base::ThreadRestrictions::ScopedAllowIO allow_io;
base::File file(file_path,
base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
if (!file.IsValid()) {
std::move(callback).Run(false);
return;
promise.RejectWithErrorMessage("takeHeapSnapshot failed");
return handle;
}
auto* frame_host = web_contents()->GetMainFrame();
if (!frame_host) {
std::move(callback).Run(false);
return;
promise.RejectWithErrorMessage("takeHeapSnapshot failed");
return handle;
}
// This dance with `base::Owned` is to ensure that the interface stays alive
@@ -2179,10 +2185,17 @@ void WebContents::TakeHeapSnapshot(const base::FilePath& file_path,
auto* raw_ptr = electron_ptr.get();
(*raw_ptr)->TakeHeapSnapshot(
mojo::WrapPlatformFile(file.TakePlatformFile()),
base::BindOnce([](mojom::ElectronRendererAssociatedPtr* ep,
base::Callback<void(bool)> callback,
bool success) { callback.Run(success); },
base::Owned(std::move(electron_ptr)), callback));
base::BindOnce(
[](mojom::ElectronRendererAssociatedPtr* ep, util::Promise promise,
bool success) {
if (success) {
promise.Resolve();
} else {
promise.RejectWithErrorMessage("takeHeapSnapshot failed");
}
},
base::Owned(std::move(electron_ptr)), std::move(promise)));
return handle;
}
// static
@@ -2245,7 +2258,6 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
.SetMethod("beginFrameSubscription", &WebContents::BeginFrameSubscription)
.SetMethod("endFrameSubscription", &WebContents::EndFrameSubscription)
.SetMethod("startDrag", &WebContents::StartDrag)
.SetMethod("isGuest", &WebContents::IsGuest)
.SetMethod("attachToIframe", &WebContents::AttachToIframe)
.SetMethod("detachFromOuterFrame", &WebContents::DetachFromOuterFrame)
.SetMethod("isOffscreen", &WebContents::IsOffScreen)
@@ -2288,7 +2300,7 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
.SetMethod("getWebRTCIPHandlingPolicy",
&WebContents::GetWebRTCIPHandlingPolicy)
.SetMethod("_grantOriginAccess", &WebContents::GrantOriginAccess)
.SetMethod("_takeHeapSnapshot", &WebContents::TakeHeapSnapshot)
.SetMethod("takeHeapSnapshot", &WebContents::TakeHeapSnapshot)
.SetProperty("id", &WebContents::ID)
.SetProperty("session", &WebContents::Session)
.SetProperty("hostWebContents", &WebContents::HostWebContents)

View File

@@ -80,7 +80,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
public content::WebContentsObserver,
public mojom::ElectronBrowser {
public:
enum Type {
enum class Type {
BACKGROUND_PAGE, // A DevTools extension background page.
BROWSER_WINDOW, // Used by BrowserWindow.
BROWSER_VIEW, // Used by BrowserView.
@@ -294,8 +294,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
// the specified URL.
void GrantOriginAccess(const GURL& url);
void TakeHeapSnapshot(const base::FilePath& file_path,
base::Callback<void(bool)>);
v8::Local<v8::Promise> TakeHeapSnapshot(const base::FilePath& file_path);
// Properties.
int32_t ID() const;
@@ -337,7 +336,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
// content::WebContentsDelegate:
bool DidAddMessageToConsole(content::WebContents* source,
int32_t level,
blink::mojom::ConsoleMessageLevel level,
const base::string16& message,
int32_t line_no,
const base::string16& source_id) override;
@@ -370,6 +369,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) override;
void ContentsZoomChange(bool zoom_in) override;
void EnterFullscreenModeForTab(
content::WebContents* source,
const GURL& origin,
@@ -445,12 +445,12 @@ class WebContents : public mate::TrackableObject<WebContents>,
void PluginCrashed(const base::FilePath& plugin_path,
base::ProcessId plugin_pid) override;
void MediaStartedPlaying(const MediaPlayerInfo& video_type,
const MediaPlayerId& id) override;
const content::MediaPlayerId& id) override;
void MediaStoppedPlaying(
const MediaPlayerInfo& video_type,
const MediaPlayerId& id,
const content::MediaPlayerId& id,
content::WebContentsObserver::MediaStoppedReason reason) override;
void DidChangeThemeColor(SkColor theme_color) override;
void DidChangeThemeColor(base::Optional<SkColor> theme_color) override;
void OnInterfaceRequestFromFrame(
content::RenderFrameHost* render_frame_host,
const std::string& interface_name,
@@ -535,7 +535,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
WebContentsZoomController* zoom_controller_ = nullptr;
// The type of current WebContents.
Type type_ = BROWSER_WINDOW;
Type type_ = Type::BROWSER_WINDOW;
// Request id used for findInPage request.
uint32_t request_id_ = 0;

View File

@@ -16,7 +16,7 @@ bool WebContents::IsFocused() const {
if (!view)
return false;
if (GetType() != BACKGROUND_PAGE) {
if (GetType() != Type::BACKGROUND_PAGE) {
auto window = [web_contents()->GetNativeView().GetNativeNSView() window];
// On Mac the render widget host view does not lose focus when the window
// loses focus so check if the top level window is the key window.

View File

@@ -124,8 +124,9 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("WebContentsView", mate::CreateConstructor<WebContentsView>(
isolate, base::Bind(&WebContentsView::New)));
dict.Set("WebContentsView",
mate::CreateConstructor<WebContentsView>(
isolate, base::BindRepeating(&WebContentsView::New)));
}
} // namespace

View File

@@ -52,7 +52,10 @@ void Event::FrameDeleted(content::RenderFrameHost* rfh) {
}
void Event::PreventDefault(v8::Isolate* isolate) {
GetWrapper()->Set(StringToV8(isolate, "defaultPrevented"), v8::True(isolate));
GetWrapper()
->Set(isolate->GetCurrentContext(),
StringToV8(isolate, "defaultPrevented"), v8::True(isolate))
.Check();
}
bool Event::SendReply(const base::ListValue& result) {

View File

@@ -46,30 +46,33 @@ class EventEmitter : public Wrappable<T> {
v8::Local<v8::Object> GetWrapper() const {
return Wrappable<T>::GetWrapper();
}
v8::MaybeLocal<v8::Object> GetWrapper(v8::Isolate* isolate) const {
return Wrappable<T>::GetWrapper(isolate);
}
// this.emit(name, event, args...);
template <typename... Args>
bool EmitCustomEvent(const base::StringPiece& name,
v8::Local<v8::Object> event,
const Args&... args) {
Args&&... args) {
return EmitWithEvent(
name, internal::CreateCustomEvent(isolate(), GetWrapper(), event),
args...);
std::forward<Args>(args)...);
}
// this.emit(name, new Event(flags), args...);
template <typename... Args>
bool EmitWithFlags(const base::StringPiece& name,
int flags,
const Args&... args) {
return EmitCustomEvent(
name, internal::CreateEventFromFlags(isolate(), flags), args...);
bool EmitWithFlags(const base::StringPiece& name, int flags, Args&&... args) {
return EmitCustomEvent(name,
internal::CreateEventFromFlags(isolate(), flags),
std::forward<Args>(args)...);
}
// this.emit(name, new Event(), args...);
template <typename... Args>
bool Emit(const base::StringPiece& name, const Args&... args) {
return EmitWithSender(name, nullptr, base::nullopt, args...);
bool Emit(const base::StringPiece& name, Args&&... args) {
return EmitWithSender(name, nullptr, base::nullopt,
std::forward<Args>(args)...);
}
// this.emit(name, new Event(sender, message), args...);
@@ -79,7 +82,7 @@ class EventEmitter : public Wrappable<T> {
content::RenderFrameHost* sender,
base::Optional<atom::mojom::ElectronBrowser::MessageSyncCallback>
callback,
const Args&... args) {
Args&&... args) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
v8::Local<v8::Object> wrapper = GetWrapper();
@@ -88,7 +91,7 @@ class EventEmitter : public Wrappable<T> {
}
v8::Local<v8::Object> event = internal::CreateJSEvent(
isolate(), wrapper, sender, std::move(callback));
return EmitWithEvent(name, event, args...);
return EmitWithEvent(name, event, std::forward<Args>(args)...);
}
protected:
@@ -99,13 +102,19 @@ class EventEmitter : public Wrappable<T> {
template <typename... Args>
bool EmitWithEvent(const base::StringPiece& name,
v8::Local<v8::Object> event,
const Args&... args) {
Args&&... args) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
EmitEvent(isolate(), GetWrapper(), name, event, args...);
return event->Get(StringToV8(isolate(), "defaultPrevented"))
->BooleanValue(isolate());
EmitEvent(isolate(), GetWrapper(), name, event,
std::forward<Args>(args)...);
auto context = isolate()->GetCurrentContext();
v8::Local<v8::Value> defaultPrevented;
if (event->Get(context, StringToV8(isolate(), "defaultPrevented"))
.ToLocal(&defaultPrevented)) {
return defaultPrevented->BooleanValue(isolate());
}
return false;
}
DISALLOW_COPY_AND_ASSIGN(EventEmitter);

View File

@@ -28,9 +28,9 @@ StreamSubscriber::StreamSubscriber(
DCHECK(ui_task_runner->RunsTasksInCurrentSequence());
auto weak_self = weak_factory_.GetWeakPtr();
On("data", base::Bind(&StreamSubscriber::OnData, weak_self));
On("end", base::Bind(&StreamSubscriber::OnEnd, weak_self));
On("error", base::Bind(&StreamSubscriber::OnError, weak_self));
On("data", base::BindRepeating(&StreamSubscriber::OnData, weak_self));
On("end", base::BindRepeating(&StreamSubscriber::OnEnd, weak_self));
On("error", base::BindRepeating(&StreamSubscriber::OnError, weak_self));
}
StreamSubscriber::~StreamSubscriber() {
@@ -80,20 +80,20 @@ void StreamSubscriber::OnData(mate::Arguments* args) {
// Pass the data to the URLJob in IO thread.
std::vector<char> buffer(data, data + length);
base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::IO},
base::Bind(&atom::URLRequestStreamJob::OnData,
url_job_, base::Passed(&buffer)));
base::BindOnce(&atom::URLRequestStreamJob::OnData,
url_job_, base::Passed(&buffer)));
}
void StreamSubscriber::OnEnd(mate::Arguments* args) {
base::PostTaskWithTraits(
FROM_HERE, {content::BrowserThread::IO},
base::Bind(&atom::URLRequestStreamJob::OnEnd, url_job_));
base::BindOnce(&atom::URLRequestStreamJob::OnEnd, url_job_));
}
void StreamSubscriber::OnError(mate::Arguments* args) {
base::PostTaskWithTraits(FROM_HERE, {content::BrowserThread::IO},
base::Bind(&atom::URLRequestStreamJob::OnError,
url_job_, net::ERR_FAILED));
base::BindOnce(&atom::URLRequestStreamJob::OnError,
url_job_, net::ERR_FAILED));
}
void StreamSubscriber::RemoveAllListeners() {

View File

@@ -40,7 +40,7 @@ class StreamSubscriber
friend class base::RefCountedDeleteOnSequence<StreamSubscriber>;
using JSHandlersMap = std::map<std::string, v8::Global<v8::Value>>;
using EventCallback = base::Callback<void(mate::Arguments* args)>;
using EventCallback = base::RepeatingCallback<void(mate::Arguments* args)>;
~StreamSubscriber();

View File

@@ -78,7 +78,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("BoxLayout", mate::CreateConstructor<BoxLayout>(
isolate, base::Bind(&BoxLayout::New)));
isolate, base::BindRepeating(&BoxLayout::New)));
}
} // namespace

View File

@@ -50,8 +50,8 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("Button",
mate::CreateConstructor<Button>(isolate, base::Bind(&Button::New)));
dict.Set("Button", mate::CreateConstructor<Button>(
isolate, base::BindRepeating(&Button::New)));
}
} // namespace

View File

@@ -71,7 +71,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("LabelButton", mate::CreateConstructor<LabelButton>(
isolate, base::Bind(&LabelButton::New)));
isolate, base::BindRepeating(&LabelButton::New)));
}
} // namespace

View File

@@ -53,8 +53,9 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("LayoutManager", mate::CreateConstructor<LayoutManager>(
isolate, base::Bind(&LayoutManager::New)));
dict.Set("LayoutManager",
mate::CreateConstructor<LayoutManager>(
isolate, base::BindRepeating(&LayoutManager::New)));
}
} // namespace

View File

@@ -47,8 +47,9 @@ void Initialize(v8::Local<v8::Object> exports,
void* priv) {
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("MdTextButton", mate::CreateConstructor<MdTextButton>(
isolate, base::Bind(&MdTextButton::New)));
dict.Set("MdTextButton",
mate::CreateConstructor<MdTextButton>(
isolate, base::BindRepeating(&MdTextButton::New)));
}
} // namespace

View File

@@ -51,7 +51,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("ResizeArea", mate::CreateConstructor<ResizeArea>(
isolate, base::Bind(&ResizeArea::New)));
isolate, base::BindRepeating(&ResizeArea::New)));
}
} // namespace

View File

@@ -58,7 +58,7 @@ void Initialize(v8::Local<v8::Object> exports,
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.Set("TextField", mate::CreateConstructor<TextField>(
isolate, base::Bind(&TextField::New)));
isolate, base::BindRepeating(&TextField::New)));
}
} // namespace

View File

@@ -81,8 +81,8 @@ void AtomBlobReader::BlobReadHelper::Read() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
storage::BlobReader::Status size_status = blob_reader_->CalculateSize(
base::Bind(&AtomBlobReader::BlobReadHelper::DidCalculateSize,
base::Unretained(this)));
base::BindOnce(&AtomBlobReader::BlobReadHelper::DidCalculateSize,
base::Unretained(this)));
if (size_status != storage::BlobReader::Status::IO_PENDING)
DidCalculateSize(net::OK);
}
@@ -100,8 +100,8 @@ void AtomBlobReader::BlobReadHelper::DidCalculateSize(int result) {
scoped_refptr<net::IOBuffer> blob_data =
new net::IOBuffer(static_cast<size_t>(total_size));
auto callback =
base::Bind(&AtomBlobReader::BlobReadHelper::DidReadBlobData,
base::Unretained(this), base::RetainedRef(blob_data));
base::BindRepeating(&AtomBlobReader::BlobReadHelper::DidReadBlobData,
base::Unretained(this), base::RetainedRef(blob_data));
storage::BlobReader::Status read_status =
blob_reader_->Read(blob_data.get(), total_size, &bytes_read, callback);
if (read_status != storage::BlobReader::Status::IO_PENDING)

View File

@@ -14,10 +14,12 @@
#include "atom/app/manifests.h"
#include "atom/browser/api/atom_api_app.h"
#include "atom/browser/api/atom_api_protocol.h"
#include "atom/browser/api/atom_api_protocol_ns.h"
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/atom_navigation_throttle.h"
#include "atom/browser/atom_paths.h"
#include "atom/browser/atom_quota_permission_context.h"
#include "atom/browser/atom_resource_dispatcher_host_delegate.h"
#include "atom/browser/atom_speech_recognition_manager_delegate.h"
@@ -534,7 +536,7 @@ std::string AtomBrowserClient::GetGeolocationApiKey() {
return api_key;
}
content::QuotaPermissionContext*
scoped_refptr<content::QuotaPermissionContext>
AtomBrowserClient::CreateQuotaPermissionContext() {
return new AtomQuotaPermissionContext;
}
@@ -746,7 +748,7 @@ content::BrowserMainParts* AtomBrowserClient::CreateBrowserMainParts(
void AtomBrowserClient::WebNotificationAllowed(
int render_process_id,
const base::Callback<void(bool, bool)>& callback) {
const base::RepeatingCallback<void(bool, bool)>& callback) {
content::WebContents* web_contents =
WebContentsPreferences::GetWebContentsFromProcessID(render_process_id);
if (!web_contents) {
@@ -792,14 +794,10 @@ void AtomBrowserClient::RenderProcessExited(
}
void OnOpenExternal(const GURL& escaped_url, bool allowed) {
if (allowed)
if (allowed) {
platform_util::OpenExternal(
#if defined(OS_WIN)
base::UTF8ToUTF16(escaped_url.spec()),
#else
escaped_url,
#endif
platform_util::OpenExternalOptions());
escaped_url, platform_util::OpenExternalOptions(), base::DoNothing());
}
}
void HandleExternalProtocolInUI(
@@ -867,7 +865,8 @@ NotificationPresenter* AtomBrowserClient::GetNotificationPresenter() {
}
content::PlatformNotificationService*
AtomBrowserClient::GetPlatformNotificationService() {
AtomBrowserClient::GetPlatformNotificationService(
content::BrowserContext* browser_context) {
if (!notification_service_) {
notification_service_.reset(new PlatformNotificationService(this));
}
@@ -900,6 +899,15 @@ void AtomBrowserClient::OnNetworkServiceCreated(
network_service);
}
std::vector<base::FilePath>
AtomBrowserClient::GetNetworkContextsParentDirectory() {
base::FilePath user_data_dir;
base::PathService::Get(DIR_USER_DATA, &user_data_dir);
DCHECK(!user_data_dir.empty());
return {user_data_dir};
}
bool AtomBrowserClient::ShouldBypassCORB(int render_process_id) const {
// This is called on the network thread.
base::AutoLock auto_lock(process_preferences_lock_);
@@ -912,7 +920,42 @@ std::string AtomBrowserClient::GetProduct() const {
}
std::string AtomBrowserClient::GetUserAgent() const {
return GetApplicationUserAgent();
if (user_agent_override_.empty())
return GetApplicationUserAgent();
return user_agent_override_;
}
void AtomBrowserClient::SetUserAgent(const std::string& user_agent) {
user_agent_override_ = user_agent;
}
void AtomBrowserClient::RegisterNonNetworkNavigationURLLoaderFactories(
int frame_tree_node_id,
NonNetworkURLLoaderFactoryMap* factories) {
content::WebContents* web_contents =
content::WebContents::FromFrameTreeNodeId(frame_tree_node_id);
api::ProtocolNS* protocol = api::ProtocolNS::FromWrappedClass(
v8::Isolate::GetCurrent(), web_contents->GetBrowserContext());
if (protocol)
protocol->RegisterURLLoaderFactories(factories);
}
void AtomBrowserClient::RegisterNonNetworkSubresourceURLLoaderFactories(
int render_process_id,
int render_frame_id,
NonNetworkURLLoaderFactoryMap* factories) {
// Chromium may call this even when NetworkService is not enabled.
if (!base::FeatureList::IsEnabled(network::features::kNetworkService))
return;
content::RenderFrameHost* frame_host =
content::RenderFrameHost::FromID(render_process_id, render_frame_id);
content::WebContents* web_contents =
content::WebContents::FromRenderFrameHost(frame_host);
api::ProtocolNS* protocol = api::ProtocolNS::FromWrappedClass(
v8::Isolate::GetCurrent(), web_contents->GetBrowserContext());
if (protocol)
protocol->RegisterURLLoaderFactories(factories);
}
std::string AtomBrowserClient::GetApplicationLocale() {

View File

@@ -64,6 +64,9 @@ class AtomBrowserClient : public content::ContentBrowserClient,
// content::ContentBrowserClient:
bool ShouldEnableStrictSiteIsolation() override;
std::string GetUserAgent() const override;
void SetUserAgent(const std::string& user_agent);
protected:
void RenderProcessWillLaunch(
content::RenderProcessHost* host,
@@ -90,7 +93,8 @@ class AtomBrowserClient : public content::ContentBrowserClient,
base::CommandLine* command_line) override;
void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override;
std::string GetGeolocationApiKey() override;
content::QuotaPermissionContext* CreateQuotaPermissionContext() override;
scoped_refptr<content::QuotaPermissionContext> CreateQuotaPermissionContext()
override;
content::GeneratedCodeCacheSettings GetGeneratedCodeCacheSettings(
content::BrowserContext* context) override;
void AllowCertificateError(
@@ -144,8 +148,8 @@ class AtomBrowserClient : public content::ContentBrowserClient,
net::NetLog* GetNetLog() override;
content::MediaObserver* GetMediaObserver() override;
content::DevToolsManagerDelegate* GetDevToolsManagerDelegate() override;
content::PlatformNotificationService* GetPlatformNotificationService()
override;
content::PlatformNotificationService* GetPlatformNotificationService(
content::BrowserContext* browser_context) override;
content::BrowserMainParts* CreateBrowserMainParts(
const content::MainFunctionParams&) override;
base::FilePath GetDefaultDownloadDirectory() override;
@@ -153,9 +157,16 @@ class AtomBrowserClient : public content::ContentBrowserClient,
GetSystemSharedURLLoaderFactory() override;
void OnNetworkServiceCreated(
network::mojom::NetworkService* network_service) override;
std::vector<base::FilePath> GetNetworkContextsParentDirectory() override;
bool ShouldBypassCORB(int render_process_id) const override;
std::string GetProduct() const override;
std::string GetUserAgent() const override;
void RegisterNonNetworkNavigationURLLoaderFactories(
int frame_tree_node_id,
NonNetworkURLLoaderFactoryMap* factories) override;
void RegisterNonNetworkSubresourceURLLoaderFactories(
int render_process_id,
int render_frame_id,
NonNetworkURLLoaderFactoryMap* factories) override;
// content::RenderProcessHostObserver:
void RenderProcessHostDestroyed(content::RenderProcessHost* host) override;
@@ -231,6 +242,8 @@ class AtomBrowserClient : public content::ContentBrowserClient,
mutable base::Lock process_preferences_lock_;
std::map<int, ProcessPreferences> process_preferences_;
std::string user_agent_override_ = "";
DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient);
};

View File

@@ -7,6 +7,7 @@
#include <utility>
#include "atom/browser/atom_blob_reader.h"
#include "atom/browser/atom_browser_client.h"
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/atom_download_manager_delegate.h"
#include "atom/browser/atom_paths.h"
@@ -67,7 +68,7 @@ AtomBrowserContext::AtomBrowserContext(const std::string& partition,
storage_policy_(new SpecialStoragePolicy),
in_memory_(in_memory),
weak_factory_(this) {
user_agent_ = GetApplicationUserAgent();
user_agent_ = AtomBrowserClient::Get()->GetUserAgent();
// Read options.
base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();

View File

@@ -19,6 +19,7 @@
#include "atom/browser/atom_web_ui_controller_factory.h"
#include "atom/browser/browser.h"
#include "atom/browser/browser_process_impl.h"
#include "atom/browser/feature_list.h"
#include "atom/browser/javascript_environment.h"
#include "atom/browser/media/media_capture_devices_dispatcher.h"
#include "atom/browser/node_debugger.h"
@@ -76,7 +77,7 @@
#include "ui/base/l10n/l10n_util.h"
#include "ui/base/l10n/l10n_util_win.h"
#include "ui/display/win/dpi.h"
#include "ui/gfx/platform_font_win.h"
#include "ui/gfx/system_fonts_win.h"
#include "ui/strings/grit/app_locale_settings.h"
#endif
@@ -102,7 +103,7 @@ void Erase(T* container, typename T::iterator iter) {
#if defined(OS_WIN)
// gfx::Font callbacks
void AdjustUIFont(gfx::PlatformFontWin::FontAdjustment* font_adjustment) {
void AdjustUIFont(gfx::win::FontAdjustment* font_adjustment) {
l10n_util::NeedOverrideDefaultUIFont(&font_adjustment->font_family_override,
&font_adjustment->font_scale);
font_adjustment->font_scale *= display::win::GetAccessibilityFontScale();
@@ -150,7 +151,7 @@ void OverrideLinuxAppDataPath() {
int BrowserX11ErrorHandler(Display* d, XErrorEvent* error) {
if (!g_in_x11_io_error_handler && base::ThreadTaskRunnerHandle::IsSet()) {
base::ThreadTaskRunnerHandle::Get()->PostTask(
FROM_HERE, base::Bind(&ui::LogErrorEventDescription, d, *error));
FROM_HERE, base::BindOnce(&ui::LogErrorEventDescription, d, *error));
}
return 0;
}
@@ -197,23 +198,6 @@ int X11EmptyIOErrorHandler(Display* d) {
} // namespace
void AtomBrowserMainParts::InitializeFeatureList() {
auto* cmd_line = base::CommandLine::ForCurrentProcess();
auto enable_features =
cmd_line->GetSwitchValueASCII(::switches::kEnableFeatures);
auto disable_features =
cmd_line->GetSwitchValueASCII(::switches::kDisableFeatures);
// Disable creation of spare renderer process with site-per-process mode,
// it interferes with our process preference tracking for non sandboxed mode.
// Can be reenabled when our site instance policy is aligned with chromium
// when node integration is enabled.
disable_features +=
std::string(",") + features::kSpareRendererForSitePerProcess.name;
auto feature_list = std::make_unique<base::FeatureList>();
feature_list->InitializeFromCommandLine(enable_features, disable_features);
base::FeatureList::SetInstance(std::move(feature_list));
}
// static
AtomBrowserMainParts* AtomBrowserMainParts::self_ = nullptr;
@@ -221,7 +205,8 @@ AtomBrowserMainParts::AtomBrowserMainParts(
const content::MainFunctionParams& params)
: fake_browser_process_(new BrowserProcessImpl),
browser_(new Browser),
node_bindings_(NodeBindings::Create(NodeBindings::BROWSER)),
node_bindings_(
NodeBindings::Create(NodeBindings::BrowserEnvironment::BROWSER)),
electron_bindings_(new ElectronBindings(uv_default_loop())),
main_function_params_(params) {
DCHECK(!self_) << "Cannot have two AtomBrowserMainParts";
@@ -271,7 +256,6 @@ void AtomBrowserMainParts::RegisterDestructionCallback(
}
int AtomBrowserMainParts::PreEarlyInitialization() {
InitializeFeatureList();
field_trial_list_ = std::make_unique<base::FieldTrialList>(nullptr);
#if defined(USE_X11)
views::LinuxUI::SetInstance(BuildGtkUi());
@@ -380,11 +364,11 @@ void AtomBrowserMainParts::ToolkitInitialized() {
#endif
#if defined(OS_WIN)
gfx::PlatformFontWin::SetAdjustFontCallback(&AdjustUIFont);
gfx::PlatformFontWin::SetGetMinimumFontSizeCallback(&GetMinimumFontSize);
gfx::win::SetAdjustFontCallback(&AdjustUIFont);
gfx::win::SetGetMinimumFontSizeCallback(&GetMinimumFontSize);
wchar_t module_name[MAX_PATH] = {0};
if (GetModuleFileName(NULL, module_name, MAX_PATH))
if (GetModuleFileName(NULL, module_name, base::size(module_name)))
ui::CursorLoaderWin::SetCursorResourceModule(module_name);
#endif
@@ -410,8 +394,8 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
// Start idle gc.
gc_timer_.Start(FROM_HERE, base::TimeDelta::FromMinutes(1),
base::Bind(&v8::Isolate::LowMemoryNotification,
base::Unretained(js_env_->isolate())));
base::BindRepeating(&v8::Isolate::LowMemoryNotification,
base::Unretained(js_env_->isolate())));
content::WebUIControllerFactory::RegisterFactory(
AtomWebUIControllerFactory::GetInstance());
@@ -469,6 +453,7 @@ void AtomBrowserMainParts::PostMainMessageLoopRun() {
ui::SetX11ErrorHandlers(X11EmptyErrorHandler, X11EmptyIOErrorHandler);
#endif
node_debugger_->Stop();
js_env_->OnMessageLoopDestroying();
#if defined(OS_MACOSX)

View File

@@ -87,7 +87,6 @@ class AtomBrowserMainParts : public content::BrowserMainParts {
void PostDestroyThreads() override;
private:
void InitializeFeatureList();
void PreMainMessageLoopStartCommon();
#if defined(OS_POSIX)

View File

@@ -41,8 +41,26 @@ void AtomBrowserMainParts::InitializeMainNib() {
auto application = [principalClass sharedApplication];
NSString* mainNibName = [infoDictionary objectForKey:@"NSMainNibFile"];
auto mainNib = [[NSNib alloc] initWithNibNamed:mainNibName
bundle:base::mac::FrameworkBundle()];
NSNib* mainNib;
@try {
mainNib = [[NSNib alloc] initWithNibNamed:mainNibName
bundle:base::mac::FrameworkBundle()];
// Handle failure of initWithNibNamed on SMB shares
// TODO(codebytere): Remove when
// https://bugs.chromium.org/p/chromium/issues/detail?id=932935 is fixed
} @catch (NSException* exception) {
NSString* nibPath =
[NSString stringWithFormat:@"Resources/%@.nib", mainNibName];
nibPath = [base::mac::FrameworkBundle().bundlePath
stringByAppendingPathComponent:nibPath];
NSData* data = [NSData dataWithContentsOfFile:nibPath];
mainNib = [[NSNib alloc] initWithNibData:data
bundle:base::mac::FrameworkBundle()];
}
[mainNib instantiateWithOwner:application topLevelObjects:nil];
[mainNib release];
}

View File

@@ -136,10 +136,10 @@ void ShutdownDetector::ThreadMain() {
bytes_read += ret;
} while (bytes_read < sizeof(signal));
VLOG(1) << "Handling shutdown for signal " << signal << ".";
base::Closure task =
base::Bind(&Browser::Quit, base::Unretained(Browser::Get()));
if (!base::PostTaskWithTraits(FROM_HERE, {BrowserThread::UI}, task)) {
if (!base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::BindOnce(&Browser::Quit, base::Unretained(Browser::Get())))) {
// Without a UI thread to post the exit task to, there aren't many
// options. Raise the signal again. The default handler will pick it up
// and cause an ungraceful exit.

View File

@@ -124,11 +124,11 @@ void AtomDownloadManagerDelegate::OnDownloadPathGenerated(
v8::Isolate* isolate = v8::Isolate::GetCurrent();
atom::util::Promise dialog_promise(isolate);
auto dialog_callback =
base::Bind(&AtomDownloadManagerDelegate::OnDownloadSaveDialogDone,
base::Unretained(this), download_id, callback);
base::BindOnce(&AtomDownloadManagerDelegate::OnDownloadSaveDialogDone,
base::Unretained(this), download_id, callback);
ignore_result(dialog_promise.Then(std::move(dialog_callback)));
file_dialog::ShowSaveDialog(settings, std::move(dialog_promise));
ignore_result(dialog_promise.Then(dialog_callback));
} else {
callback.Run(path, download::DownloadItem::TARGET_DISPOSITION_PROMPT,
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path,
@@ -136,54 +136,48 @@ void AtomDownloadManagerDelegate::OnDownloadPathGenerated(
}
}
#if defined(MAS_BUILD)
void AtomDownloadManagerDelegate::OnDownloadSaveDialogDone(
uint32_t download_id,
const content::DownloadTargetCallback& download_callback,
bool result,
const base::FilePath& path,
const std::string& bookmark)
#else
void AtomDownloadManagerDelegate::OnDownloadSaveDialogDone(
uint32_t download_id,
const content::DownloadTargetCallback& download_callback,
bool result,
const base::FilePath& path)
#endif
{
mate::Dictionary result) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
auto* item = download_manager_->GetDownload(download_id);
if (!item)
return;
if (result) {
// Remember the last selected download directory.
AtomBrowserContext* browser_context = static_cast<AtomBrowserContext*>(
download_manager_->GetBrowserContext());
browser_context->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory,
path.DirName());
bool canceled = true;
result.Get("canceled", &canceled);
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
api::DownloadItem* download_item =
api::DownloadItem::FromWrappedClass(isolate, item);
if (download_item)
download_item->SetSavePath(path);
base::FilePath path;
if (!canceled) {
if (result.Get("filePath", &path)) {
// Remember the last selected download directory.
AtomBrowserContext* browser_context = static_cast<AtomBrowserContext*>(
download_manager_->GetBrowserContext());
browser_context->prefs()->SetFilePath(prefs::kDownloadDefaultDirectory,
path.DirName());
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
api::DownloadItem* download_item =
api::DownloadItem::FromWrappedClass(isolate, item);
if (download_item)
download_item->SetSavePath(path);
}
}
// Running the DownloadTargetCallback with an empty FilePath signals that the
// download should be cancelled. If user cancels the file save dialog, run
// the callback with empty FilePath.
const base::FilePath download_path = result ? path : base::FilePath();
const auto interrupt_reason =
download_path.empty() ? download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED
: download::DOWNLOAD_INTERRUPT_REASON_NONE;
download_callback.Run(download_path,
download::DownloadItem::TARGET_DISPOSITION_PROMPT,
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
download_path, interrupt_reason);
path.empty() ? download::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED
: download::DOWNLOAD_INTERRUPT_REASON_NONE;
download_callback.Run(path, download::DownloadItem::TARGET_DISPOSITION_PROMPT,
download::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path,
interrupt_reason);
}
void AtomDownloadManagerDelegate::Shutdown() {

View File

@@ -45,20 +45,10 @@ class AtomDownloadManagerDelegate : public content::DownloadManagerDelegate {
const content::DownloadTargetCallback& callback,
const base::FilePath& default_path);
#if defined(MAS_BUILD)
void OnDownloadSaveDialogDone(
uint32_t download_id,
const content::DownloadTargetCallback& download_callback,
bool result,
const base::FilePath& path,
const std::string& bookmark);
#else
void OnDownloadSaveDialogDone(
uint32_t download_id,
const content::DownloadTargetCallback& download_callback,
bool result,
const base::FilePath& path);
#endif
mate::Dictionary result);
content::DownloadManager* download_manager_;
base::WeakPtrFactory<AtomDownloadManagerDelegate> weak_ptr_factory_;

View File

@@ -0,0 +1,25 @@
// 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/atom_gpu_client.h"
#include "base/environment.h"
#if defined(OS_WIN)
#include <windows.h>
#endif
namespace atom {
AtomGpuClient::AtomGpuClient() = default;
void AtomGpuClient::PreCreateMessageLoop() {
#if defined(OS_WIN)
auto env = base::Environment::Create();
if (env->HasVar("ELECTRON_DEFAULT_ERROR_MODE"))
SetErrorMode(GetErrorMode() & ~SEM_NOGPFAULTERRORBOX);
#endif
}
} // namespace atom

View File

@@ -0,0 +1,25 @@
// 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_ATOM_GPU_CLIENT_H_
#define ATOM_BROWSER_ATOM_GPU_CLIENT_H_
#include "content/public/gpu/content_gpu_client.h"
namespace atom {
class AtomGpuClient : public content::ContentGpuClient {
public:
AtomGpuClient();
// content::ContentGpuClient:
void PreCreateMessageLoop() override;
private:
DISALLOW_COPY_AND_ASSIGN(AtomGpuClient);
};
} // namespace atom
#endif // ATOM_BROWSER_ATOM_GPU_CLIENT_H_

View File

@@ -92,8 +92,8 @@ void AtomJavaScriptDialogManager::RunJavaScriptDialog(
}
atom::ShowMessageBox(
window, atom::MessageBoxType::MESSAGE_BOX_TYPE_NONE, buttons, default_id,
cancel_id, atom::MessageBoxOptions::MESSAGE_BOX_NONE, "",
window, atom::MessageBoxType::kNone, buttons, default_id, cancel_id,
atom::MessageBoxOptions::MESSAGE_BOX_NONE, "",
base::UTF16ToUTF8(message_text), "", checkbox, false, gfx::ImageSkia(),
base::Bind(&AtomJavaScriptDialogManager::OnMessageBoxCallback,
base::Unretained(this), base::Passed(std::move(callback)),

View File

@@ -28,19 +28,23 @@ enum {
#if defined(OS_LINUX)
DIR_APP_DATA, // Application Data directory under the user profile.
#else
#endif
PATH_END, // End of new paths. Those that follow redirect to base::DIR_*
#if !defined(OS_LINUX)
DIR_APP_DATA = base::DIR_APP_DATA,
#endif
#if defined(OS_POSIX)
DIR_CACHE = base::DIR_CACHE, // Directory where to put cache data.
DIR_CACHE = base::DIR_CACHE // Directory where to put cache data.
#else
DIR_CACHE = base::DIR_APP_DATA,
DIR_CACHE = base::DIR_APP_DATA
#endif
PATH_END
};
static_assert(PATH_START < PATH_END, "invalid PATH boundaries");
} // namespace atom
#endif // ATOM_BROWSER_ATOM_PATHS_H_

View File

@@ -94,9 +94,9 @@ bool AtomResourceDispatcherHostDelegate::ShouldInterceptResourceAsStream(
*origin = GURL(kPdfViewerUIOrigin);
base::PostTaskWithTraits(
FROM_HERE, {BrowserThread::UI},
base::Bind(&OnPdfResourceIntercepted, request->url(),
render_process_host_id, render_frame_id,
info->GetWebContentsGetterForRequest()));
base::BindOnce(&OnPdfResourceIntercepted, request->url(),
render_process_host_id, render_frame_id,
info->GetWebContentsGetterForRequest()));
return true;
}
#endif // BUILDFLAG(ENABLE_PDF_VIEWER)

View File

@@ -4,17 +4,19 @@
#include "atom/browser/auto_updater.h"
#include <string>
#import <ReactiveCocoa/NSObject+RACPropertySubscribing.h>
#import <ReactiveCocoa/RACCommand.h>
#import <ReactiveCocoa/RACSignal.h>
#import <Squirrel/Squirrel.h>
#include "atom/browser/browser.h"
#include "atom/common/native_mate_converters/map_converter.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "base/bind.h"
#include "base/strings/sys_string_conversions.h"
#include "base/time/time.h"
#include "native_mate/converter.h"
#include "native_mate/dictionary.h"
namespace auto_updater {
@@ -29,7 +31,7 @@ SQRLUpdater* g_updater = nil;
namespace {
bool g_update_available = false;
std::string update_url_ = "";
std::string update_url_ = ""; // NOLINT(runtime/string)
} // namespace

View File

@@ -155,9 +155,9 @@ class Browser : public WindowListObserver {
const base::DictionaryValue& user_info);
// Bounce the dock icon.
enum BounceType {
BOUNCE_CRITICAL = 0,
BOUNCE_INFORMATIONAL = 10,
enum class BounceType {
CRITICAL = 0, // NSCriticalRequest
INFORMATIONAL = 10, // NSInformationalRequest
};
int DockBounce(BounceType type);
void DockCancelBounce(int request_id);
@@ -197,6 +197,7 @@ class Browser : public WindowListObserver {
base::string16 arguments;
base::string16 title;
base::string16 description;
base::FilePath working_dir;
base::FilePath icon_path;
int icon_index;

View File

@@ -4,6 +4,9 @@
#include "atom/browser/browser.h"
#include <string>
#include <utility>
#include "atom/browser/mac/atom_application.h"
#include "atom/browser/mac/atom_application_delegate.h"
#include "atom/browser/mac/dict_util.h"
@@ -131,7 +134,7 @@ bool Browser::IsDefaultProtocolClient(const std::string& protocol,
void Browser::SetAppUserModelID(const base::string16& name) {}
bool Browser::SetBadgeCount(int count) {
DockSetBadgeText(count != 0 ? base::IntToString(count) : "");
DockSetBadgeText(count != 0 ? base::NumberToString(count) : "");
badge_count_ = count;
return true;
}
@@ -282,9 +285,9 @@ void Browser::SetLoginItemSettings(LoginItemSettings settings) {
LOG(ERROR) << "Unable to set login item enabled on sandboxed app.";
}
#else
if (settings.open_at_login)
if (settings.open_at_login) {
base::mac::AddToLoginItems(settings.open_as_hidden);
else {
} else {
RemoveFromLoginItems();
}
#endif

View File

@@ -338,3 +338,7 @@ printing::PrintJobManager* BrowserProcessImpl::print_job_manager() {
return nullptr;
#endif
}
StartupData* BrowserProcessImpl::startup_data() {
return nullptr;
}

View File

@@ -114,6 +114,7 @@ class BrowserProcessImpl : public BrowserProcess {
void SetApplicationLocale(const std::string& locale) override;
const std::string& GetApplicationLocale() override;
printing::PrintJobManager* print_job_manager() override;
StartupData* startup_data() override;
private:
#if BUILDFLAG(ENABLE_PRINTING)

View File

@@ -96,7 +96,7 @@ void Browser::Focus() {
}
void Browser::AddRecentDocument(const base::FilePath& path) {
if (base::win::GetVersion() < base::win::VERSION_WIN7)
if (base::win::GetVersion() < base::win::Version::WIN7)
return;
CComPtr<IShellItem> item;
@@ -141,6 +141,7 @@ bool Browser::SetUserTasks(const std::vector<UserTask>& tasks) {
item.icon_path = task.icon_path;
item.icon_index = task.icon_index;
item.description = task.description;
item.working_dir = task.working_dir;
category.items.push_back(item);
}
@@ -346,7 +347,7 @@ std::string Browser::GetExecutableFileProductName() const {
bool Browser::IsEmojiPanelSupported() {
// emoji picker is supported on Windows 10's Spring 2018 update & above.
return base::win::GetVersion() >= base::win::Version::VERSION_WIN10_RS4;
return base::win::GetVersion() >= base::win::Version::WIN10_RS4;
}
void Browser::ShowEmojiPanel() {

View File

@@ -352,9 +352,8 @@ blink::WebSecurityStyle CommonWebContentsDelegate::GetSecurityStyle(
SecurityStateTabHelper* helper =
SecurityStateTabHelper::FromWebContents(web_contents);
DCHECK(helper);
security_state::SecurityInfo security_info;
helper->GetSecurityInfo(&security_info);
return security_state::GetSecurityStyle(security_info,
return security_state::GetSecurityStyle(helper->GetSecurityLevel(),
*helper->GetVisibleSecurityState(),
security_style_explanations);
}

View File

@@ -0,0 +1,31 @@
// 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 "electron/atom/browser/feature_list.h"
#include <string>
#include "base/base_switches.h"
#include "base/command_line.h"
#include "base/feature_list.h"
#include "content/public/common/content_features.h"
namespace atom {
void InitializeFeatureList() {
auto* cmd_line = base::CommandLine::ForCurrentProcess();
auto enable_features =
cmd_line->GetSwitchValueASCII(::switches::kEnableFeatures);
auto disable_features =
cmd_line->GetSwitchValueASCII(::switches::kDisableFeatures);
// Disable creation of spare renderer process with site-per-process mode,
// it interferes with our process preference tracking for non sandboxed mode.
// Can be reenabled when our site instance policy is aligned with chromium
// when node integration is enabled.
disable_features +=
std::string(",") + features::kSpareRendererForSitePerProcess.name;
base::FeatureList::InitializeInstance(enable_features, disable_features);
}
} // namespace atom

View File

@@ -0,0 +1,12 @@
// 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_FEATURE_LIST_H_
#define ATOM_BROWSER_FEATURE_LIST_H_
namespace atom {
void InitializeFeatureList();
}
#endif // ATOM_BROWSER_FEATURE_LIST_H_

View File

@@ -45,7 +45,7 @@ void IOThread::Init() {
auto cert_verifier = std::make_unique<net::CachingCertVerifier>(
std::make_unique<net::MultiThreadedCertVerifier>(
net::CertVerifyProc::CreateDefault()));
net::CertVerifyProc::CreateDefault(nullptr)));
builder->SetCertVerifier(std::move(cert_verifier));
// Create the network service, so that shared host resolver
@@ -70,5 +70,5 @@ void IOThread::CleanUp() {
system_request_context_->proxy_resolution_service()->OnShutdown();
if (net_log_)
net_log_->ShutDownBeforeTaskScheduler();
net_log_->ShutDownBeforeThreadPool();
}

View File

@@ -10,7 +10,7 @@
#include "atom/common/node_includes.h"
#include "base/command_line.h"
#include "base/message_loop/message_loop.h"
#include "base/task/task_scheduler/initialization_util.h"
#include "base/task/thread_pool/initialization_util.h"
#include "base/threading/thread_task_runner_handle.h"
#include "content/public/common/content_switches.h"
#include "gin/array_buffer.h"

View File

@@ -3,7 +3,7 @@
// found in the LICENSE file.
#include "atom/browser/lib/bluetooth_chooser.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/once_callback.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "native_mate/dictionary.h"
@@ -70,7 +70,7 @@ void BluetoothChooser::ShowDiscoveryState(DiscoveryState state) {
} else {
bool prevent_default = api_web_contents_->Emit(
"select-bluetooth-device", GetDeviceList(),
base::Bind(&OnDeviceChosen, event_handler_));
base::BindOnce(&OnDeviceChosen, event_handler_));
if (!prevent_default) {
auto it = device_map_.begin();
auto device_id = it->first;
@@ -102,9 +102,9 @@ void BluetoothChooser::AddOrUpdateDevice(const std::string& device_id,
if (changed) {
// Emit a select-bluetooth-device handler to allow for user to listen for
// bluetooth device found.
bool prevent_default =
api_web_contents_->Emit("select-bluetooth-device", GetDeviceList(),
base::Bind(&OnDeviceChosen, event_handler_));
bool prevent_default = api_web_contents_->Emit(
"select-bluetooth-device", GetDeviceList(),
base::BindOnce(&OnDeviceChosen, event_handler_));
// If emit not implimented select first device that matches the filters
// provided.

View File

@@ -26,7 +26,7 @@ LoginHandler::LoginHandler(net::URLRequest* request,
net::AuthCredentials* credentials,
content::ResourceRequestInfo* resource_request_info)
: credentials_(credentials),
auth_info_(&auth_info),
auth_info_(std::make_unique<net::AuthChallengeInfo>(auth_info)),
auth_callback_(std::move(callback)),
weak_factory_(this) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);

View File

@@ -5,6 +5,8 @@
#ifndef ATOM_BROWSER_LOGIN_HANDLER_H_
#define ATOM_BROWSER_LOGIN_HANDLER_H_
#include <memory>
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
@@ -57,7 +59,7 @@ class LoginHandler : public base::RefCountedThreadSafe<LoginHandler> {
net::AuthCredentials* credentials_;
// Who/where/what asked for the authentication.
scoped_refptr<const net::AuthChallengeInfo> auth_info_;
std::unique_ptr<const net::AuthChallengeInfo> auth_info_;
// WebContents associated with the login request.
content::ResourceRequestInfo::WebContentsGetter web_contents_getter_;

View File

@@ -4,6 +4,10 @@
#import "atom/browser/mac/atom_application.h"
#include <memory>
#include <string>
#include <utility>
#include "atom/browser/browser.h"
#import "atom/browser/mac/atom_application_delegate.h"
#include "atom/browser/mac/dict_util.h"

View File

@@ -4,6 +4,9 @@
#import "atom/browser/mac/atom_application_delegate.h"
#include <memory>
#include <string>
#include "atom/browser/browser.h"
#import "atom/browser/mac/atom_application.h"
#include "atom/browser/mac/dict_util.h"
@@ -24,7 +27,7 @@ static base::mac::ScopedObjCClassSwizzler* g_swizzle_imk_input_session;
@end
@implementation OOMDisabledIMKInputSession
- (void)_coreAttributesFromRange:(NSRange)range
whichAttributes:(long long)attributes
whichAttributes:(long long)attributes // NOLINT(runtime/int)
completionHandler:(void (^)(void))block {
// The allocator flag is per-process, so other threads may temporarily
// not have fatal OOM occur while this method executes, but it is better

View File

@@ -4,6 +4,10 @@
#include "atom/browser/mac/dict_util.h"
#include <memory>
#include <string>
#include <utility>
#include "base/json/json_writer.h"
#include "base/strings/sys_string_conversions.h"
#include "base/values.h"
@@ -15,8 +19,9 @@ NSArray* ListValueToNSArray(const base::ListValue& value) {
if (!base::JSONWriter::Write(value, &json))
return nil;
NSData* jsonData = [NSData dataWithBytes:json.c_str() length:json.length()];
id obj =
[NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
id obj = [NSJSONSerialization JSONObjectWithData:jsonData
options:0
error:nil];
if (![obj isKindOfClass:[NSArray class]])
return nil;
return obj;
@@ -67,8 +72,9 @@ NSDictionary* DictionaryValueToNSDictionary(
if (!base::JSONWriter::Write(value, &json))
return nil;
NSData* jsonData = [NSData dataWithBytes:json.c_str() length:json.length()];
id obj =
[NSJSONSerialization JSONObjectWithData:jsonData options:0 error:nil];
id obj = [NSJSONSerialization JSONObjectWithData:jsonData
options:0
error:nil];
if (![obj isKindOfClass:[NSDictionary class]])
return nil;
return obj;

View File

@@ -4,6 +4,9 @@
#include "atom/browser/mac/in_app_purchase.h"
#include <string>
#include <utility>
#include "base/bind.h"
#include "base/strings/sys_string_conversions.h"
#include "base/task/post_task.h"

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