Compare commits

..

598 Commits

Author SHA1 Message Date
Zeke Sikelianos
306b627090 Merge pull request #10839 from qazbnm456/update_docs
[docs] update app.md
2017-10-18 20:35:11 -07:00
John Kleinschmidt
90e7d7e112 v1.8.2-beta.1 2017-10-18 16:49:32 -04:00
Boik
7be79613b8 according to https://github.com/electron/electron/pull/10670, update app.md 2017-10-19 00:56:05 +08:00
John Kleinschmidt
cf12d31875 Merge pull request #10834 from Vehemos/master
Updated online-offline-events.md
2017-10-18 10:06:27 -04:00
Sarthak Tripathi
32f92f7a90 Updated online-offline-events.md
Improved readability and simplicity.
2017-10-18 19:26:19 +05:30
Sarthak Tripathi
392f4b44f0 Updated online-offline-events.md
Added links, removed grammatical error.
2017-10-18 19:11:05 +05:30
John Kleinschmidt
a65ab1d5a7 Merge pull request #10829 from zombieleet/master
update docs to show usage of ipcRenderer.sendTo
2017-10-18 09:33:57 -04:00
John Kleinschmidt
57537ea10e Merge pull request #10810 from qazbnm456/add_error_code_to_session_set_certificate_verify_proc
Add error code to session.setCertificateVerifyProc
2017-10-18 09:33:37 -04:00
John Kleinschmidt
51cbd977f0 Merge pull request #10534 from robbix1206/npx_in_quickstart
[Docs] Add npx command for node version 8.2.0 and later in quickstart guide
2017-10-18 09:32:30 -04:00
Sarthak Tripathi
392e88db34 Updated online-offline-events.md
Added more info, to clarify things.
2017-10-18 16:28:18 +05:30
73mp74710n
0a0897ef28 Update ipc-renderer.md 2017-10-18 02:52:02 +01:00
73mp74710n
5b193bad4b Merge pull request #1 from zombieleet/zombieleet-patch-1
update docs to show usage of ipcRenderer.sendTo
2017-10-18 02:35:51 +01:00
73mp74710n
c647b0c65e update docs to show usage of ipcRenderer.sendTo 2017-10-18 02:35:19 +01:00
Zeke Sikelianos
9193720789 Merge pull request #10825 from electron/vanessayuenn-patch-1
Fix link to version change rules
2017-10-17 14:53:02 -07:00
Vanessa Yuen
3208a77bf3 Fix link to version-change-rules 2017-10-17 13:37:05 -04:00
John Kleinschmidt
cbda307ebf Merge pull request #10696 from primalmotion/patch-1
🍎 skip tabbing category if macOS < Sierra
2017-10-17 10:24:11 -04:00
Cheng Zhao
0358862066 Merge pull request #10812 from electron/fix_symbol_file_names
Use real shared library names for symbol files
2017-10-17 15:27:35 +08:00
Cheng Zhao
d901504ea9 Merge pull request #10804 from robinwassen/optional-cpplint
cpplint skip to run if dependencies has not been bootstrapped
2017-10-17 15:26:49 +08:00
Cheng Zhao
4dc74776c1 Merge pull request #10709 from electron/fix-notification-actions-hs
Fix notification actions not working on High Sierra
2017-10-17 15:18:53 +08:00
Zeke Sikelianos
71f13620d3 Merge pull request #10795 from samthomson/docs/shell-open-external
updated docs
2017-10-16 19:32:09 -07:00
Zeke Sikelianos
a914d3c534 Merge pull request #10612 from electron/notification-docs-fix
Add `string` to notification doc
2017-10-16 19:31:47 -07:00
Vanessa Yuen
242a55aa60 Merge pull request #10740 from demopark/patch-1
Add notification docs translation in Chinese
2017-10-16 21:16:47 -04:00
Vanessa Yuen
9045171ad7 Merge pull request #10748 from demopark/patch-2
Add notifications tutoral in Chinese
2017-10-16 21:07:23 -04:00
Vanessa Yuen
e5797a57a7 Merge pull request #10749 from demopark/patch-3
Add notification-action.md file in Chinese
2017-10-16 21:03:32 -04:00
Ales Pergl
3a571bbdb4 Use real shared library names for symbol files 2017-10-16 16:48:52 +02:00
Boik
f40cc5ab54 add error code to session.setCertificateVerifyProc 2017-10-16 17:17:21 +08:00
Robin Andersson
60e614b10c cpplint skip to run if dependencies has not been bootstrapped
See #10593 for the discussion regarding this
2017-10-15 21:18:20 +02:00
Sam Thomson
f57b619097 updated docs 2017-10-14 13:11:44 +01:00
Zeke Sikelianos
4c9d432bd9 Merge pull request #10777 from reviforks/fix-korean-typo
WIP: Fix Korean translation's minor mistakes
2017-10-13 15:42:12 -07:00
Yongmin Hong
7b8dc38e88 Fix Korean grammatic mistakes
Mostly spacing errors. Haven't look at full Korean translation, but
will do.

Signed-off-by: Yongmin Hong <revi@pobox.com>
2017-10-13 02:58:44 +09:00
Samuel Attard
bce7d37086 Merge pull request #10773 from jeroenvisser101/patch-1
Fix link to libnotify spec
2017-10-13 02:09:05 +11:00
Birunthan Mohanathas
13b9b5c0c0 Merge pull request #10746 from electron/removeuserdefault
Add systemPreferences.removeUserDefault()
2017-10-12 16:08:57 +03:00
Jeroen Visser
cf6e3ca087 Fix link to libnotify spec
Link was broken
2017-10-12 14:55:21 +02:00
Samuel Attard
bdf3552be6 Merge pull request #10727 from electron/named-nativeimage
Add an API to get a nativeImage from a named NSImage
2017-10-12 10:02:07 +11:00
Felix Rieseberg
26220f2b31 Merge pull request #10758 from electron/felixrieseberg-patch-1
Don't be quiet on default loglevel
2017-10-11 15:18:11 -07:00
John Kleinschmidt
f2a1f0124d Merge pull request #10759 from electron/revert-official-build
Revert official build
2017-10-11 15:37:02 -04:00
Felix Rieseberg
2b510d7a06 Update install.js 2017-10-11 11:10:38 -07:00
Felix Rieseberg
d07529feca 🔧 Don't be quiet on default loglevel 2017-10-11 10:56:40 -07:00
John Kleinschmidt
6381f28847 Revert official build
Release builds are not currently building with official build
2017-10-11 11:38:50 -04:00
Jonas Zhang
af99e65876 Add notification-action.md file in Chinese
Add notification-action.md file in Chinese
2017-10-11 09:51:52 +08:00
Jonas Zhang
6fa9249062 Add notification.md file in Chinese
Add notification.md file in Chinese
2017-10-11 09:42:34 +08:00
Birunthan Mohanathas
06d782279c Add systemPreferences.removeUserDefault()
This can be used to restore the default or global value of a `key`
previously set with `setUserDefault`.
2017-10-10 22:57:47 +03:00
John Kleinschmidt
88616df2e5 Merge pull request #10744 from robinwassen/docs-vs-download-link
📝 Updated with link to VS 2015
2017-10-10 15:51:16 -04:00
Robin Andersson
c51ac6048d 📝 Updated with link to VS 2015
The previous link pointed to VS 2017 download location.
2017-10-10 21:33:14 +02:00
John Kleinschmidt
30abdbccf8 Merge pull request #10688 from electron/retry-uploads
Add logic to retry github uploads
2017-10-10 09:46:20 -04:00
Jonas Zhang
66df065e31 Add notification.md file in Chinese
Add notification.md file in Chinese
2017-10-10 21:34:39 +08:00
Samuel Attard
ed25941c65 Add basic specs 2017-10-10 17:30:27 +11:00
Samuel Attard
2c7787900f Follow style guide 2017-10-10 17:20:55 +11:00
Samuel Attard
9308c96f95 Appease the linting overlords 2017-10-10 17:17:51 +11:00
Samuel Attard
4ffb6c5f75 Merge pull request #10725 from electron/version-lock-escape-item
Ensure that the touchbar's esape item can be set before setting it
2017-10-10 17:07:04 +11:00
Samuel Attard
b5ba8699f3 Enable hsl shifting of named images 2017-10-10 17:05:13 +11:00
Zeke Sikelianos
19ac2179fb Merge pull request #10715 from electron/fix_toast_dpi_scaling
Fixed font DPI scaling
2017-10-09 12:56:45 -07:00
Zeke Sikelianos
1e6d51642c Merge pull request #10728 from excfergodst/patch-1
Create updates.md
2017-10-09 12:56:26 -07:00
Zeke Sikelianos
878813f968 Merge pull request #10730 from excfergodst/excfergodst-smalldoc
Adding few simple docs
2017-10-09 12:56:03 -07:00
Zeke Sikelianos
d7e5855ebf Merge pull request #10719 from yunzhenhuan/patch-1
Update build-instructions-linux.md
2017-10-09 12:55:29 -07:00
Zeke Sikelianos
a48219ecf2 Merge pull request #10731 from excfergodst/patch-7
Create v8-development.md
2017-10-09 12:54:58 -07:00
DaLun
995dccc726 Create v8-development.md 2017-10-09 13:00:35 -05:00
DaLun
0572b395ba Delete v8-development.md 2017-10-09 12:55:49 -05:00
DaLun
6e08682a7f Merge pull request #5 from excfergodst/patch-6
Create crash-report.md
2017-10-09 12:52:09 -05:00
DaLun
000ea8febd Merge pull request #4 from excfergodst/patch-5
Create upload-blob.md
2017-10-09 12:52:00 -05:00
DaLun
b02691cebd Merge pull request #3 from excfergodst/patch-4
Create size.md
2017-10-09 12:51:44 -05:00
DaLun
909fc98e1b Merge pull request #2 from excfergodst/patch-3
Create point.md
2017-10-09 12:51:33 -05:00
DaLun
53d138505a Create crash-report.md 2017-10-09 12:47:42 -05:00
DaLun
e655222d2f Create upload-blob.md 2017-10-09 12:45:56 -05:00
DaLun
d096fc8acf Create size.md 2017-10-09 12:37:48 -05:00
DaLun
48be4e765a Create point.md 2017-10-09 12:36:27 -05:00
DaLun
841763326a Create v8-development.md 2017-10-09 12:29:59 -05:00
DaLun
2ed2aedb00 Create updates.md 2017-10-09 12:13:00 -05:00
Samuel Attard
767a178bd1 Do not throw if the named image can not be found 2017-10-10 03:18:44 +11:00
Samuel Attard
ec610cd97b Document new nativeImage.createFromNamedImage method 2017-10-10 03:16:24 +11:00
Samuel Attard
e027ba9c47 Add nativeImage.createFromNamedImage API 2017-10-10 03:13:40 +11:00
Samuel Attard
d350134c4f Ensure that the touchbar's esape item can be set before setting it 2017-10-10 02:24:49 +11:00
XiYang
b8a58d0fce Update build-instructions-linux.md 2017-10-09 17:30:05 +08:00
Ales Pergl
1d25d58c26 Fixed font DPI scaling 2017-10-09 10:17:00 +02:00
Zeke Sikelianos
c85b159d46 Merge pull request #10712 from electron/remove-default-deprecation
remove potential deprecation and fix app close
2017-10-07 22:03:32 -07:00
Felix Rieseberg
77d4927e8b Merge pull request #10713 from electron/remote-node-warning-2
Tiny fix: String comparison for remote node warning
2017-10-07 10:04:49 -07:00
Felix Rieseberg
2bd8877be3 🔧 String comparison 2017-10-07 08:26:32 -07:00
Shelley Vohr
242e097e9b Merge pull request #10670 from electron/add-linuxdefaultprotocol
add setAsDefaultProtocolClient for Linux
2017-10-07 10:07:02 -05:00
Shelley Vohr
443c30890b remove dummy check 2017-10-07 10:38:08 -04:00
Zeke Sikelianos
61e606bedc Merge pull request #10336 from electron/document-prereleases
document new release and versioning process
2017-10-06 22:14:42 -07:00
Shelley Vohr
bedb8ca191 remove potential deprecation and fix app close 2017-10-07 01:03:54 -04:00
Shelley Vohr
35eea8bea5 remove unused xdg setting 2017-10-07 00:38:25 -04:00
Shelley Vohr
66827755e7 remove chrome check and change protocol handler 2017-10-07 00:36:18 -04:00
Shelley Vohr
85ef1ee21f Merge pull request #10633 from electron/update-default-app
updates to default app and cli usage
2017-10-06 23:08:23 -05:00
Samuel Attard
e5d4574d3a Use NSUserNotification identifiers to uniquely find the correct notification from CocoaNotification 2017-10-07 14:51:28 +11:00
Shelley Vohr
a1347f67a1 remove a space from a comment wow thanks linter 2017-10-06 23:40:58 -04:00
Shelley Vohr
c9da806c84 slight refactor and lin cleanup 2017-10-06 23:32:46 -04:00
Shelley Vohr
a45b1625fc remove newline and add deprecation warning 2017-10-06 23:29:54 -04:00
Felix Rieseberg
1761d5da06 Merge pull request #10708 from electron/remote-node-warning
Warn if loading remote content with nodeIntegration
2017-10-06 16:17:52 -07:00
Felix Rieseberg
63749e281d 🔧 Linters gotta lint 2017-10-06 13:36:54 -07:00
Felix Rieseberg
11ac780caf 🔧 Add security warning 2017-10-06 13:02:54 -07:00
Vanessa Yuen
31eb83223b Update the documentation on the release process to reflect the new versioning policy. 2017-10-06 11:48:09 -04:00
Vanessa Yuen
7062a6e55d remove the condition where release draft has to have a prerelease flag 2017-10-06 11:47:28 -04:00
Antoine
5e6b683cfb fixed: trying to fix the build 2017-10-05 15:57:27 -07:00
Antoine
8e1945f768 🍎 skip tabbing category if macOS < Sierra
Previously, the macro was ensuring the` MAC_OS_X_VERSION_10_12` was not defined to decide to compile a `NSWindow` category back porting native tabs or not.

This patch ensures to compile the `NSWindow` category only if the min required version is lesser than 1012 (`MAC_OS_X_VERSION_10_12`)
2017-10-05 14:11:58 -07:00
John Kleinschmidt
0ae12c2b3d Add success message
Also increase retries to 5 attempts.
2017-10-05 16:31:54 -04:00
John Kleinschmidt
54563dc94c Add logic to retry github uploads
When doing release, sometimes the GitHub upload fails, so try to retry it once before bailing.
2017-10-05 16:31:18 -04:00
Zeke Sikelianos
f81e4ec972 order change reasons major, minor, patch 2017-10-05 10:52:38 -07:00
John Kleinschmidt
d7aa0b0ddb Merge pull request #10694 from electron/official-build
Update libchromiumcontent with official_build turned on
2017-10-05 09:48:49 -04:00
Cheng Zhao
e098f414e4 Update libchromiumcontent with official_build turned on 2017-10-05 18:14:12 +09:00
Shelley Vohr
f8f21815eb syntax updates and pointer conversion 2017-10-05 00:30:14 -04:00
Cheng Zhao
80e6a64e47 Merge pull request #10361 from sbannigan/feature/tray-events
add mouse-move event and click event position for tray
2017-10-05 12:20:00 +09:00
Cheng Zhao
bb71b09452 Fix building on Windows 2017-10-05 11:51:41 +09:00
Cheng Zhao
4342480473 Fix cpplint warnings 2017-10-05 11:49:26 +09:00
Sean Bannigan
0b205019b6 add mouse-move event and click event position for tray 2017-10-05 11:41:08 +09:00
Cheng Zhao
ee519b7552 Merge pull request #10693 from makerGeek/patch-1
Update atom-shell-vs-node-webkit.md
2017-10-05 10:21:10 +09:00
Zeke Sikelianos
fae918be59 Merge pull request #10681 from fplucas/master
📝 Translation of environment-variables.md to pt-br [ci skip]
2017-10-04 12:45:37 -07:00
Zeke Sikelianos
b77fe4ca12 add more details to versioning docs 2017-10-04 12:41:12 -07:00
Daniel Imms
3a0de7e24a New release schedule proposal 2017-10-04 12:12:11 -07:00
Zeke Sikelianos
44572dce7d add sh to code block 2017-10-04 12:05:34 -07:00
Zeke Sikelianos
ba6f01a109 add missing backtick 2017-10-04 12:05:34 -07:00
Vanessa Yuen
9f55e162a3 add section on dist-tags 2017-10-04 12:05:34 -07:00
Zeke Sikelianos
d51a8accee tweak versioning doc 2017-10-04 12:05:34 -07:00
Zeke Sikelianos
cd411a5c36 document how we define stable 2017-10-04 12:05:34 -07:00
Zeke Sikelianos
fe7c827e30 remove section on semver, as electron does not fit its mold 2017-10-04 12:05:34 -07:00
Zeke Sikelianos
cc80930e2b document prereleases 2017-10-04 12:05:34 -07:00
Moetaz
d20ce404ef Update atom-shell-vs-node-webkit.md
nwjs now supports a js script as entrypoint.
cf. http://docs.nwjs.io/en/latest/References/Manifest%20Format/#main
2017-10-04 21:01:39 +02:00
John Kleinschmidt
2d269fb7f1 Merge pull request #10690 from electron/fix-tabbed-window-test
Fix failing tests on master
2017-10-04 14:29:38 -04:00
John Kleinschmidt
15bfb86eec Make sure test closes window
Newly added test was leaving window open causing tests to fail
2017-10-04 11:35:41 -04:00
Cheng Zhao
8c5bb5969c Merge pull request #10667 from dittos/window-opacity
Add window opacity support
2017-10-04 15:03:45 +09:00
Felix Rieseberg
a337b12877 Merge pull request #10680 from electron/idlewakeups-windows
Don't call GetIdleWakeupsPerSecond on Win
2017-10-03 22:04:55 -07:00
Felix Rieseberg
4e05d24d1b Merge pull request #10661 from electron/browserview-multiple-screens
BrowserView: Allow dragging of window to screen above menubar
2017-10-03 16:09:11 -07:00
John Kleinschmidt
5c94e23004 Merge pull request #10683 from electron/format-fix-bump-version
Fix formatting on bump-version.
2017-10-03 16:07:24 -04:00
John Kleinschmidt
587c49f6b1 Fix formatting on bump-version. 2017-10-03 15:35:49 -04:00
John Kleinschmidt
211688453c Merge pull request #10403 from electron/modify-bump-version
Modify `bump-version.py`
2017-10-03 14:23:33 -04:00
Lucas Pugliesi
5e7a45d6da Fix link to environment-variables.md in pt-br 2017-10-03 15:22:53 -03:00
Lucas Pugliesi
f72c72f4d4 Fix link to environment-variables.md in pt-br 2017-10-03 15:20:41 -03:00
Lucas Pugliesi
028bab0320 Merge remote-tracking branch 'upstream/master' 2017-10-03 14:57:37 -03:00
Lucas Pugliesi
ee2168b94d 📝 Translation of environment-variables.md to pt-br [ci skip] 2017-10-03 14:54:58 -03:00
Felix Rieseberg
c4de658964 📝 Make a note in the docs 2017-10-03 10:25:42 -07:00
Felix Rieseberg
9fcf7eb27c 🔧 Don't call GetIdleWakeupsPerSecond on Win 2017-10-03 10:21:31 -07:00
Shelley Vohr
6131a523dc add xdg helper method 2017-10-03 11:10:38 -04:00
John Kleinschmidt
93e40ee79c Merge pull request #10677 from rhysd/fix-doc-findInPage
Fix findInPage() documentation for correcting type definition
2017-10-03 10:16:39 -04:00
Cheng Zhao
150a4797a4 Merge pull request #10676 from qazbnm456/fix-unhandle-null-pointer
Add a null-pointer check before processing base::SupportsUserData::GetUserData
2017-10-03 20:18:51 +09:00
Cheng Zhao
745fa707dd Merge pull request #10508 from danielma/dma/native-tab-new-button
feat(NativeWindowMac): addTabbedWindow
2017-10-03 20:16:50 +09:00
Cheng Zhao
09b93aa164 No need of example for such simple API 2017-10-03 20:12:05 +09:00
Daniel Ma
1bb042a661 feat(NativeWindowMac): addTabbedWindow
Add support for the [`NSWindow addTabbedWindow`][nsw] method on MacOSX

This plays nicely with the changes from #9052 and #9725

Usage samples available in [this commit][c] in my fork of
`electron-quick-start`

[nsw]: https://developer.apple.com/documentation/appkit/nswindow/1855947-addtabbedwindow
[c]: 79f06591df
2017-10-03 20:11:16 +09:00
rhysd
32ad59de26 Fix findInPage() documentation for correcting type definition
This update fixes the return type of `findInPage()`, which is currently
typed as `void` but actually it should be `number`.
2017-10-03 16:39:37 +09:00
Boik
d594092675 add a null-pointer check before processing base::SupportsUserData::GetUserData 2017-10-03 12:42:35 +08:00
Taeho Kim
7570ec9d39 Add BrowserWindow.getOpacity for consistency 2017-10-03 00:08:10 +09:00
Shelley Vohr
3f73e000ee first pass at adding linux setAsDefaultProtocolClient 2017-10-02 10:21:30 -04:00
Taeho Kim
7df5182901 Fix lint 2017-10-02 09:52:27 +09:00
Taeho Kim
7c1c8f323c Update browser-window.md 2017-10-01 17:36:22 +09:00
Shelley Vohr
68d35dbeb1 Merge pull request #10660 from electron/add_probot_stale
add initial file for stale bot
2017-09-29 19:47:08 -04:00
Shelley Vohr
7a163ef0cc add issue maintenance and closure information 2017-09-29 18:37:45 -04:00
John Kleinschmidt
b77467ca8f Update CI information (#10644)
* Update CI information

* Formatting updates
2017-09-29 16:11:42 -04:00
Zeke Sikelianos
e8ec1a6ed4 add utm source to outbound links 2017-09-29 12:31:17 -07:00
Zeke Sikelianos
bf2b6b3ac4 fix link behavior 2017-09-29 12:26:03 -07:00
Zeke Sikelianos
56581b416d improve command prompt styles 2017-09-29 12:13:31 -07:00
Zeke Sikelianos
a2f178b664 fix octicon alignment 2017-09-29 12:03:28 -07:00
Zeke Sikelianos
01ca3ae07f make nav link text clickable 2017-09-29 12:03:12 -07:00
Zeke Sikelianos
cc6803b358 remove unused styles 2017-09-29 11:35:39 -07:00
Zeke Sikelianos
33394f76d4 make styles more consistent with website 2017-09-29 11:35:22 -07:00
Zeke Sikelianos
f0048d54b0 make it roomy 2017-09-29 11:34:48 -07:00
Felix Rieseberg
0cc1ebc021 🔧 Allow dragging window to screen above menubar (for real) 2017-09-29 14:20:34 -04:00
Vadim Macagon
3ad1cccb1d [ci skip] Fix link to Chromium Runtime Features JSON file (#10639) 2017-09-29 14:17:00 -04:00
Zeke Sikelianos
9f895879bf Merge pull request #10191 from electron/add_log_path_support
add ability to access logs in getPath()
2017-09-29 11:11:29 -07:00
Zeke Sikelianos
9db9ffd3e4 chrome -> chromium 2017-09-29 10:41:48 -07:00
Zeke Sikelianos
0ca53420d5 use relative path to electron 2017-09-29 10:41:20 -07:00
Shelley Vohr
6932a42b0a updates to probot config 2017-09-29 13:28:49 -04:00
Shelley Vohr
b1e6845409 add initial file for stale bot 2017-09-29 10:38:38 -04:00
Shelley Vohr
96f1a25bbd convert to wstring for windows 2017-09-29 10:29:45 -04:00
Shelley Vohr
e7bb553d3b consolidate code and rename for clarity 2017-09-29 09:32:30 -04:00
Ted Kim
7f2c4a9e06 Add window opacity support 2017-09-29 17:49:10 +09:00
Shelley Vohr
c620d0de05 move overrides into the appropriate namespace 2017-09-28 23:03:01 -04:00
John Kleinschmidt
04430c6dda Bump to use large machine for arm64 build 2017-09-28 13:55:06 -04:00
Shelley Vohr
0dfadf7c09 remove unresolved external symbol 2017-09-28 13:35:24 -04:00
Shelley Vohr
911e266e9a add function signature declaration 2017-09-28 13:35:24 -04:00
Shelley Vohr
223942bf99 fix incorrect std namespacing 2017-09-28 13:35:24 -04:00
Zeke Sikelianos
94f46c9059 fix typo in comment 2017-09-28 13:35:24 -04:00
Shelley Vohr
fc443a8c2c fix header and line length lint errors 2017-09-28 13:35:24 -04:00
Shelley
e05f6102c2 update docs for new getPath() path 2017-09-28 13:35:24 -04:00
Shelley Vohr
d2d4b4cc23 fix escape backslashes 2017-09-28 13:35:24 -04:00
Shelley Vohr
c1c8f7b0f1 fix string concat errors 2017-09-28 13:35:23 -04:00
Shelley Vohr
2353fdb400 add dir creation if none exists 2017-09-28 13:35:23 -04:00
Shelley Vohr
e81cf74b39 add windows override path and cleanup linux 2017-09-28 13:35:23 -04:00
Shelley Vohr
e096b5ce83 fix override path 2017-09-28 13:35:23 -04:00
Shelley Vohr
3de008035a appeasing the linter 2017-09-28 13:35:23 -04:00
Shelley Vohr
f026bbb454 add first go at linux log path override 2017-09-28 13:35:23 -04:00
Shelley Vohr
5ef4caf8ab add ability to access logs in getPath() 2017-09-28 13:35:22 -04:00
John Kleinschmidt
7788b33dc9 Bump v1.8.1 2017-09-28 13:13:49 -04:00
John Kleinschmidt
d9d557dcc5 CircleCI updates (#10647)
* Update CircleCi for release and test

* Update test storage dir
2017-09-28 13:05:42 -04:00
Shelley Vohr
2915617c5c dear god never run beautifier again 2017-09-28 00:10:52 -04:00
Shelley Vohr
0f34967648 redesign and add versions/links 2017-09-27 23:51:53 -04:00
Zeke Sikelianos
0c9ada08a4 Merge pull request #10326 from develar/patch-4
docs: add note about electron-updater
2017-09-27 15:14:44 -07:00
Felix Rieseberg
89246f3714 🔧 Allow dragging over menubar 2017-09-27 17:43:09 -04:00
Shelley Vohr
24913a5ef9 remove drag functions 2017-09-27 14:50:46 -04:00
Shelley Vohr
2289d085fa first pass at reorganizing default usage 2017-09-27 14:23:42 -04:00
Birunthan Mohanathas
945fef8a5a Merge pull request #10483 from jublonet/fix-double-downloads
Use Squirrel.Windows --checkForUpdate
2017-09-27 20:26:24 +03:00
Zeke Sikelianos
928d2f78c3 Merge pull request #10555 from electron/CODEOWNERS
add CODEOWNERS file
2017-09-27 09:07:38 -07:00
Felix Rieseberg
04373b8658 Merge pull request #10627 from electron/fullscreen-drag
Don't drag fullscreen window
2017-09-27 08:08:08 -07:00
Birunthan Mohanathas
044a3a29a6 Simplify checking for NSFullScreenWindowMask 2017-09-27 16:36:18 +03:00
Vladimir Krivosheev
2e747e72cf change wording 2017-09-27 07:11:21 +02:00
Zeke Sikelianos
494000114c Merge pull request #10614 from electron/upload-overwrite
Document how to fix a published release
2017-09-26 21:56:37 -07:00
Zeke Sikelianos
415f1ca3a4 clarify bootstrapping command arg 2017-09-26 21:55:56 -07:00
Zeke Sikelianos
750f59cb55 make the @hubbers team own the .github directory 2017-09-26 20:11:41 -07:00
Cheng Zhao
18589a498c Merge pull request #10620 from electron/v8-promise-field
Update libchromiumcontent to fix crash in Node
2017-09-27 12:11:27 +09:00
Shelley Vohr
15b0878a17 Merge pull request #10618 from electron/add-menuitembyid
[WIP] add getMenuItemById to Menu API
2017-09-26 22:33:05 -04:00
Shelley Vohr
05c50b0a2e fix docs typo 2017-09-26 21:30:27 -04:00
Cheng Zhao
8062962d01 Define V8_PROMISE_INTERNAL_FIELD_COUNT=1 2017-09-27 10:20:06 +09:00
Shelley Vohr
31bf873c20 add docs update for new api call 2017-09-26 21:14:44 -04:00
Cheng Zhao
6e85f82d7a Update libchromiumcontent to fix crash in Node 2017-09-27 10:11:37 +09:00
Shelley Vohr
c932871bb1 change default to null 2017-09-26 20:35:14 -04:00
Shelley Vohr
3c6a7c332a add unit test for getMenuItemById 2017-09-26 20:05:51 -04:00
Felix Rieseberg
d45788a7b8 🔧 Don't drag fullscreen window 2017-09-26 18:03:44 -04:00
Shelley Vohr
f49f7d65a5 remove check on items instance 2017-09-26 14:38:34 -04:00
Zeke Sikelianos
9b6f9a0b18 fix typos in releasing doc 2017-09-26 11:10:29 -07:00
Shelley Vohr
afe033a6e1 stray semicolon fml 2017-09-26 12:10:16 -04:00
Shelley Vohr
4753ada7a9 rewrite method with only id parameter 2017-09-26 12:05:45 -04:00
Shelley Vohr
5217718d7b conform to linter standard 2017-09-26 09:50:47 -04:00
Shelley Vohr
ea42851c9b add first pass at getMenuItemById 2017-09-26 09:47:13 -04:00
Cheng Zhao
91e11f8e6f Merge pull request #10609 from electron/win32_toast_update
Fix for narrowing conversion warnings, minor style change
2017-09-26 10:50:45 +09:00
Cheng Zhao
3545280e1d Add --overwrite to the upload script 2017-09-26 10:43:43 +09:00
Cheng Zhao
c70508edb1 docs: How to re-upload binaries manually 2017-09-26 10:30:42 +09:00
Cheng Zhao
de4cb9022b Use same -ing form and remove trailing whitespaces 2017-09-26 10:18:38 +09:00
Felix Rieseberg
dfd90c3526 Merge pull request #10611 from electron/fix-notification-source
Browser-process notifications: Ensure correct icon on Windows
2017-09-26 09:54:43 +09:00
Felix Rieseberg
ff97817668 Add string to notification doc
Tiny fix: The docs suggest `NativeImage` for `icon`, but a string is also allowed.
2017-09-25 14:02:59 -07:00
Felix Rieseberg
741dc1eb0b 🔧 Ensure correct path 2017-09-25 13:51:16 -07:00
Zeke Sikelianos
c33c21e174 Merge pull request #10573 from electron/add-clarification-about-main-process
add clarification about main process
2017-09-25 12:40:45 -07:00
Ales Pergl
75feb495ad Fix for narrowing conversion warnings, minor style change 2017-09-25 18:08:54 +02:00
Aleš Pergl
2abde14a7c Merge pull request #10517 from yuya-oc/win7-notification-duration
Set duration for Windows 7 notifications based on Control Panel
2017-09-25 17:04:08 +02:00
Cheng Zhao
aeb568b41f Merge pull request #10052 from electron/views-browserview-bounds
Fix BrowserView auto-resize and BrowserWindow resize event on Windows
2017-09-25 14:12:31 +09:00
Birunthan Mohanathas
e1ddd3bdbc Stop sending resize event for minimized windows on Windows
This makes it consistent with macOS.

This also fixes BrowserView auto-resize on Windows when minimizing and
restoring the window. Previously it would incorrectly grow too in some
cases.
2017-09-25 11:44:32 +09:00
Birunthan Mohanathas
f3f6bedf8e Make BrowserView auto-resize relative to window size on Windows/Linux
Previously it was relative to the window web contents size, which was
not consistent with macOS.
2017-09-25 11:44:32 +09:00
Cheng Zhao
42a2126273 Merge pull request #10602 from electron/fix-singleton-test
Fix the flaky test of app.makeSingleInstance
2017-09-25 11:44:00 +09:00
Cheng Zhao
d87ea5713d spec: It is not certain which process starts first 2017-09-25 11:19:25 +09:00
Cheng Zhao
5940231b76 spec: Do not assume which process exits first in singleton test 2017-09-25 10:49:54 +09:00
Zeke Sikelianos
d54cb307d5 do not use globs 2017-09-24 11:34:08 +09:00
Zeke Sikelianos
2bb26b30dc add CODEOWNERS file 2017-09-24 11:34:08 +09:00
Zeke Sikelianos
696c7d59fd Merge pull request #10592 from electron/revert-9603-printer-info-options
Revert "PrinterInfo options object causes TypeScript error"
2017-09-24 11:29:54 +09:00
Zeke Sikelianos
d27f7c25b3 Revert "PrinterInfo options object causes TypeScript error" 2017-09-24 11:11:04 +09:00
Zeke Sikelianos
5843c98153 Merge pull request #10505 from qazbnm456/update-docs
docs: update web-request.md
2017-09-24 09:36:23 +09:00
Zeke Sikelianos
d552c97599 Merge pull request #10542 from EthianWong/master
Remove non-existent option
2017-09-24 09:33:43 +09:00
Zeke Sikelianos
a99280398b Merge pull request #10550 from ColMugX/patch-1
fix menu-item.md chinese version: a typo.
2017-09-24 09:32:51 +09:00
John Kleinschmidt
cb7f8e256e Change GitHub upload to use JS GitHub lib
Needed for Appveyor when running releases
2017-09-24 06:26:04 +09:00
Yuya Ochiai
d621471eb2 🏁 Set duration for Windows 7 notifications based on Control Panel 2017-09-22 21:28:29 +09:00
Cheng Zhao
ec587032b2 Merge pull request #10516 from electron/fix_notification_crash
Fixed potential crash in Win32 notifications.
2017-09-22 12:29:53 +09:00
Cheng Zhao
df098c2b2b Merge pull request #10520 from Alex-D/patch-1
Bump node version number
2017-09-22 12:20:38 +09:00
Zeke Sikelianos
5b5c4787e9 add-clarification-about-main-process 2017-09-22 10:52:43 +09:00
Samuel Attard
c4cfb3e711 Merge pull request #10518 from electron/fix-makesingleinstance
Fix app.makeSingleInstance hanging on posix systems
2017-09-20 13:54:47 +10:00
Cheng Zhao
b4075bed87 spec: Add test case for app.makeSingleInstance 2017-09-20 11:58:32 +09:00
Cheng Zhao
b7119b5756 Create watcher when message loop is ready 2017-09-20 11:58:32 +09:00
Samuel Attard
4147fa4629 Appease the linting gods 2017-09-20 11:58:32 +09:00
Samuel Attard
0ab83b301d Refactor as per @zcbenz comments
Also fix issue where we run the single instance callback *not* on the UI thread,
this apparently results in a hung process.
2017-09-20 11:58:32 +09:00
Samuel Attard
ecbeb0d117 Woops, how did that happen ;) 2017-09-20 11:58:32 +09:00
Samuel Attard
f928a399ae Move OnBrowserReady call to PreMainMessageLoopRun to account for timing issues on macOS 2017-09-20 11:58:32 +09:00
Samuel Attard
28900a9b63 Fix app.makeSingleInstance hanging on posix systems
Wait for the IO thread to be a thing before attempting to listen on the socket

Fixes #9880
2017-09-20 11:58:32 +09:00
Shelley Vohr
fb6a4febb0 Merge pull request #10552 from electron/fix-shell-openItem
update shell.OpenItem to use NSWorkspace
2017-09-19 22:00:40 -04:00
Shelley Vohr
27fd2dad59 update shell.OpenItem to use NSWorkspace 2017-09-19 18:15:37 -04:00
Co1MugX
639f445f5e zh-CN doc had a typo.
zh-CN doc had a typo.
2017-09-19 22:48:33 +08:00
WangYunjian
fa8649e671 Remove non-existent attributes
More details: 8d3e09747a
2017-09-18 13:31:54 +08:00
Samuel Attard
fa444dd029 Merge pull request #10540 from bpasero/touchbar-docs
Docs: set iconPosition as optional
2017-09-18 13:01:02 +10:00
Benjamin Pasero
ba5fe1d161 set iconPosition as optional 2017-09-17 17:44:36 +02:00
Milan Burda
9cfadbe6af Merge pull request #10509 from kewde/patch-1
docs: fix examples for sandbox
2017-09-17 12:26:27 +02:00
robbix1206
0bcc5d37ab Put npx as last option 2017-09-16 15:37:26 +02:00
robbix1206
564ca27679 Forget a # 2017-09-16 14:09:31 +02:00
robbix1206
9fecf4b2f7 Add npx command for node version 8.2.0 and later 2017-09-16 14:03:09 +02:00
Cheng Zhao
800ba9a325 Merge pull request #9950 from alexstrat/fix-content-script-insecure-contents
Fix mixed content errors when loading content from `chrome-extension`
2017-09-15 20:45:57 +09:00
Cheng Zhao
b277353238 Set secure schemes in native code
Code with same functionalities should be put together.
2017-09-15 16:48:55 +09:00
Alexandre Lachèze
5eb4b9ad6f Fix insecure content errors when loading content from chrome-extension 2017-09-15 16:32:47 +09:00
Alexandre Demode
8ebab10cb0 Bump node version number 2017-09-15 00:58:31 +02:00
Cheng Zhao
fc99785314 Merge pull request #10076 from alexstrat/add/add-support-for-content_scripts.css
Add support for css in content_scripts
2017-09-14 21:19:11 +09:00
Ales Pergl
af92a639be Fixed potential crash in Win32 notifications. 2017-09-14 11:52:53 +02:00
Alexandre Lachèze
e1a232e7c8 Add support for css in content_scripts 2017-09-14 17:23:33 +09:00
Cheng Zhao
6bf2ec4188 Merge pull request #10514 from electron/mac-crash
Suppress the destroy() spec on all platforms
2017-09-14 17:21:53 +09:00
Cheng Zhao
af329a9429 Suppress the destroy() spec on all platforms
It is also crashing on mac, but just not as frequent as other platforms.
2017-09-14 17:20:14 +09:00
Cheng Zhao
07840906dd Merge pull request #9869 from rafaelnobrepd/handoff-enhancements
Exposes more Handoff related APIs to Electron
2017-09-14 17:18:14 +09:00
Cheng Zhao
ff023115f5 Style fixes 2017-09-14 16:12:34 +09:00
Rafael Nobre
33dd5e26fb Updates documentation for Handoff related API. 2017-09-14 15:59:43 +09:00
Rafael Nobre
77a1c5d7fc Avoids deadlock in case NSUserActivityDelegate method start being called from main thread. 2017-09-14 15:59:43 +09:00
Rafael Nobre
9483f0fc14 Adds synchronization logic to allow NSUserActivityDelegate to wait Javascript updating the NSUserActiity UserInfo if requested. 2017-09-14 15:59:43 +09:00
Rafael Nobre
c23b4a48ec Fixes NSUserActivityDelegate that was called on a background thread thus not working. 2017-09-14 15:59:43 +09:00
Rafael Nobre
76efee675f Requests updated user info data before each Handoff operation. 2017-09-14 15:59:43 +09:00
Rafael Nobre
f6ac00532f Fix typo and remove extraneous doc entries. 2017-09-14 15:59:43 +09:00
Rafael Nobre
a870799c32 Exposes more Handoff related APIs to Electron. 2017-09-14 15:59:43 +09:00
Cheng Zhao
787675ab08 Merge pull request #9343 from xaviergonz/fix-osx-child-window-show
Make OSX child windows honor the show option to fix #8836
2017-09-14 15:50:13 +09:00
Cheng Zhao
ac55c358e9 Merge pull request #9603 from electron/printer-info-options
PrinterInfo options object causes TypeScript error
2017-09-14 15:49:41 +09:00
Kevin Sawicki
53b0698ee2 Add options object 2017-09-14 14:57:59 +09:00
Cheng Zhao
073583ff3d spec: The parent option should not affect show option 2017-09-14 14:48:42 +09:00
Cheng Zhao
19a7c7ac39 Styling fixes 2017-09-14 14:43:22 +09:00
xaviergonz
0d69738bd6 using standard javascript 2017-09-14 14:38:54 +09:00
xaviergonz
0301961c25 Update api-browser-window-spec.js 2017-09-14 14:38:54 +09:00
xaviergonz
e18cdc185a add the fix for showinactive 2017-09-14 14:35:53 +09:00
xaviergonz
d0c91daaed make sure setparentwindow only shows the window if already visible 2017-09-14 14:35:53 +09:00
xaviergonz
dc7cc6921e fix for mac child windows so they honor show option 2017-09-14 14:35:53 +09:00
xaviergonz
dae63d323c add new internal set parent window method 2017-09-14 14:33:24 +09:00
Cheng Zhao
a19a229a59 Merge pull request #10254 from zachflower/feature/simple-fullscreen-mode
Feature/simple fullscreen mode
2017-09-14 09:39:50 +09:00
Kewde
589585a269 Fix examples
w -> win
2017-09-13 20:53:30 +00:00
Zachary Flower
432b912c6a 🎨 Rename ambiguous simple_fullscreen_ variable to always_simple_fullscreen_ 2017-09-13 12:16:37 -06:00
John Kleinschmidt
5819acfd3d Rerun builds 2017-09-13 10:25:42 -04:00
Boik
0d312f3674 docs: update web-request.md 2017-09-13 22:09:21 +08:00
John Kleinschmidt
64c8ff62af Add CircleCI for Linux builds (#10344) 2017-09-13 09:48:19 -04:00
Cheng Zhao
2048a1a638 Merge pull request #10429 from qazbnm456/web-request-origin
Track the origin of webRequest events
2017-09-13 22:23:44 +09:00
Cheng Zhao
c34fb146f6 Fix styling 2017-09-13 21:40:29 +09:00
Vanessa Yuen
c39f5f1fad Merge pull request #9814 from shubham2892/fix-fullscreen-with-resizable-flag
Fix full screen when resizable is set to true
2017-09-12 20:20:19 -04:00
Vanessa Yuen
9a7d8a0511 merge master into fix-fullscreen-with-resizable-flag. 2017-09-12 18:34:23 -04:00
Vladimir Krivosheev
6bded6bf7b Fix link 2017-09-12 21:37:29 +02:00
Zachary Flower
fa4d52f042 🎨 Track/restore original stylemask, rather than individual states. 2017-09-12 12:27:30 -06:00
Zeke Sikelianos
618f8a9d06 Merge pull request #10497 from Toinane/fix-word-docs
Add markdown linking when missing
2017-09-12 08:49:35 -07:00
Milan Burda
ddb1d92c77 Merge pull request #10499 from miniak/doc-fix
Fix app.getGPUFeatureStatus in app.md
2017-09-12 16:04:17 +02:00
Toinane
1cb13be65f style: fix the word incompatible in docs 2017-09-12 15:51:53 +02:00
Milan Burda
d6bab3043c Fix app.getGPUFeatureStatus in app.md 2017-09-12 15:31:00 +02:00
Boik
e66341ec59 add back the missing 'resourceType' property 2017-09-12 21:27:49 +08:00
Boik
a01abd0fee fix lint-cpp 2017-09-12 20:28:30 +08:00
Boik
2d771674bb get webContentsId instead 2017-09-12 20:17:11 +08:00
Toinane
74cb673ce1 style: add uppercase 2017-09-12 12:07:33 +02:00
Toinane
b9f0131165 style: add link to when missing 2017-09-12 12:05:09 +02:00
Boik
13d363d1f1 fix lint-cpp 2017-09-12 15:40:35 +08:00
Boik
9f60673e4b remove package-lock.json 2017-09-12 15:40:35 +08:00
Boik
549c30f9b2 first attempt to track the origin requesters of webRequest events 2017-09-12 15:40:35 +08:00
Cheng Zhao
59cadf9e4b Merge pull request #10366 from syohex/window-close-order
Close window in order from newer one on macOS
2017-09-12 16:22:38 +09:00
Cheng Zhao
bca71fcfc1 Merge pull request #10393 from j3l11234/fix_mac_crack
fix mac ime crack
2017-09-12 16:19:08 +09:00
Cheng Zhao
1430faa2fd Merge pull request #10492 from electron/libcc-latest
Update libcc to latest
2017-09-12 16:18:47 +09:00
Cheng Zhao
8493d5707e Fix cpplint warnings 2017-09-12 15:35:24 +09:00
Cheng Zhao
92d0772eba Update libcc to latest
It was using a branch that had been deleted.
2017-09-12 15:25:29 +09:00
Cheng Zhao
6ebd00267e Merge pull request #10355 from owais/master
Add support for indicators in Ubuntu Gnome Session
2017-09-12 15:22:31 +09:00
Cheng Zhao
894bcdf749 Merge pull request #9896 from ferreus/dev/vladimir_8017
Fix #8017: Crash copying cropped image to clipboard
2017-09-12 15:02:44 +09:00
Zachary Flower
f256967414 📝 make clear what simple fullscreen mode is 2017-09-11 23:09:45 -06:00
Zeke Sikelianos
64c447bf04 Merge pull request #10487 from Toinane/fix-word-docs
Fix word in documentation
2017-09-11 10:08:01 -07:00
Toinane
2c56b67ea5 style: fix directory word in docs 2017-09-11 17:49:58 +02:00
Cheng Zhao
10ab870237 Merge pull request #10321 from kaylanm/macos-native-tab-api
🍎 Add macOS native tab methods to window API
2017-09-11 18:49:56 +09:00
Cheng Zhao
cc9771a3d0 Merge pull request #10307 from liusy182/10240-theme-color-2
return null when theme color is transparent or not found
2017-09-11 18:40:35 +09:00
Cheng Zhao
e6733b4b23 Merge pull request #10305 from ivmirx/macos-accessibility
Special attribute for macOS accessibility
2017-09-11 17:58:20 +09:00
Cheng Zhao
0694334487 Merge pull request #10271 from kaylanm/macos-native-tab-menu-items
🍎 Add roles for macOS native tab menu items
2017-09-11 17:41:31 +09:00
Zeke Sikelianos
c51e3c2882 Merge pull request #10481 from John2143/fix-docs
Redirect dead link in docs
2017-09-10 17:28:57 -07:00
J.M
6442e6b5e8 Use Squirrel.Windows --checkForUpdate
Avoid downloading updates twice. Fix #5057.
2017-09-11 00:54:08 +02:00
John Schmidt
38342fbe48 📝 Redirect dead link [ci skip] 2017-09-10 08:27:10 -04:00
Zeke Sikelianos
f293e1422b Merge pull request #10472 from lucaslopes/patch-1
Update coding-style.md
2017-09-09 12:38:07 -07:00
Lucas Lopes
20325b9952 Update coding-style.md 2017-09-09 08:08:28 -03:00
Birunthan Mohanathas
c265ea21c2 Merge pull request #10469 from electron/fix-save-dialog-extension-macos
Fix missing extension when saving a file without filters
2017-09-08 07:22:18 -07:00
Zeke Sikelianos
fbfd781426 Merge pull request #10454 from electron/MarshallOfSound-patch-1
Mark filters as optional inside webRequest
2017-09-07 21:45:24 -07:00
Samuel Attard
195cb91721 Make crashesDirectory optional 2017-09-08 13:21:35 +10:00
Birunthan Mohanathas
511e82de67 Fix missing extension when saving a file without filters
Previously, when triggering the save dialog through e.g. `<a download>`
links (e.g. http://jsfiddle.net/koldev/cW7W5/), the extension was only
saved if Finder was set to show all extensions by default. We now always
display the extension to make sure that it is saved.

If we want to keep the extension hidden, we could also populate the
allowed file types array with the extension from the default filename,
but that would have interfered with how we set the filters.
2017-09-07 16:48:14 -07:00
Samuel Attard
8e9b98360a Mark filters as optional inside webRequest 2017-09-07 14:26:37 +10:00
Samuel Attard
6ba3ee3950 Merge pull request #10453 from bpasero/fix-10448
Docs: add crashesDirectory to crash reporter options
2017-09-07 14:19:18 +10:00
Benjamin Pasero
54bd60d657 add crashesDirectory to crash reporter options 2017-09-07 06:07:28 +02:00
Vanessa Yuen
4fb800a899 more docs edit 2017-09-06 16:44:41 -04:00
Vanessa Yuen
a81ea1ffde Update release documentation to reflect new usage of bump-version script. 2017-09-06 16:41:51 -04:00
Vanessa Yuen
c56d8b4fe9 Add examples to make usage description clearer. 2017-09-06 16:31:58 -04:00
John Kleinschmidt
5bb7b4bb42 Bump v1.8.0 2017-08-31 16:31:59 -04:00
John Kleinschmidt
4b1e2b42a4 Bump v1.8.0 2017-08-31 16:16:19 -04:00
Vanessa Yuen
c784968e85 Merge pull request #10303 from MathieuDebit/doc/fix-desktopcapture-example
📝 Fix desktopCapturer example
2017-08-31 14:49:16 -04:00
Samuel Attard
6b010614e2 Implement moveToApplicationsFolder (#10142)
* Implement moveToApplicationsFolder

* Fix tabs / spaces

* Fix linting

* Use Browser::Quit, instead of exit

* Update documentation as per feedback

* Fix spec
2017-08-31 10:37:12 -04:00
John Kleinschmidt
14eea98566 Merge pull request #10333 from electron/more-releasing-tips
add more releasing tips
2017-08-30 10:42:59 -04:00
Cheng Zhao
c2ab4f711f Merge pull request #10396 from electron/cleanup
Cleanup obsolete code
2017-08-30 19:05:05 +09:00
Cheng Zhao
1630f14b99 Merge pull request #10395 from electron/fix_exit_crash2
Fixed crash on process exit on Windows
2017-08-30 17:43:46 +09:00
Ales Pergl
64d9e5b861 Removed obsolete io.h wrappers, included atlbase.h in atom_main.cc 2017-08-30 10:43:29 +02:00
Cheng Zhao
346a4bee0b Merge pull request #10394 from electron/another-async-crash
Fix another crash caused by assertion of asyncContext
2017-08-30 17:42:03 +09:00
Cheng Zhao
db0aeaa26e Fix another crash caused by assertion of asyncContext 2017-08-30 17:05:20 +09:00
Ales Pergl
7cd64f1bd1 Fixed crash on process exit on Windows 2017-08-30 09:23:19 +02:00
allenliu
5978775ce1 fix mac ime crack 2017-08-30 12:07:04 +08:00
Vanessa Yuen
a936430fd5 fix lint errors 2017-08-29 19:55:34 -04:00
Vanessa Yuen
b54804d449 change process.versions.electron to reflect suffixes in version name. 2017-08-29 19:37:49 -04:00
Vanessa Yuen
74c970c25f add dry run option 2017-08-29 18:56:16 -04:00
Vanessa Yuen
8fe675e56c Update bump-version.py to handle prerelease versions 2017-08-29 18:33:49 -04:00
Zeke Sikelianos
cc666c727f Merge pull request #10389 from electron/move-issue-template
move issue template to .github directory
2017-08-29 13:26:27 -07:00
Zeke Sikelianos
178b39b5a8 Merge pull request #10380 from electron/MarshallOfSound-patch-1
Mark channel as non-optional in ipcRenderer
2017-08-29 13:22:41 -07:00
Zeke Sikelianos
6c201fcae4 move issue template to .github directory 2017-08-29 12:51:02 -07:00
Cheng Zhao
39a366cf76 Merge pull request #10277 from electron/re-enable_debug_mode
Re-enabled debug mode
2017-08-29 19:22:37 +09:00
Cheng Zhao
0550a4a9b8 Fix crash when emitting render-view-deleted event 2017-08-29 17:46:46 +09:00
Cheng Zhao
7f4b74f8c6 spec: Compare id instead of the object
Otherwise it is impossible to see what's wrong.
2017-08-29 15:45:16 +09:00
Samuel Attard
e58ba1dc8e Update ipc-renderer.md 2017-08-29 16:12:55 +10:00
Cheng Zhao
f0f17fffd8 spec: Do not test window positions
They were too flaky.
2017-08-29 14:23:39 +09:00
Cheng Zhao
4febbec102 Fix crash when switching menus in menubar 2017-08-29 14:19:23 +09:00
Cheng Zhao
b2f3625eaa Fix deprecated node::MakeCallback call 2017-08-29 14:19:23 +09:00
Cheng Zhao
593ae7bf0e Fix crash caused by freeing capturer task 2017-08-29 14:19:22 +09:00
Cheng Zhao
5510d8cfb1 Revert "Revert "spec: Suppress the select-client-certificate test""
This reverts commit 8e989170f1.
2017-08-29 14:19:22 +09:00
Cheng Zhao
68e0fbfd60 Revert "Revert "spec: Suppress the app.importCertificate test""
This reverts commit a7cb89aeb5.
2017-08-29 14:19:21 +09:00
Cheng Zhao
9337e29482 Fix the crash caused by asyncContext 2017-08-29 14:19:20 +09:00
John Kleinschmidt
56233054ae Fix CI for Linux 2017-08-29 14:19:20 +09:00
Cheng Zhao
6e6b097968 Revert "Revert "spec: Suppress the test that destroys WebContents in event listener""
This reverts commit 210652ed54.
2017-08-29 14:19:19 +09:00
Ales Pergl
a7bae32527 Re-enabled debug mode 2017-08-29 14:19:19 +09:00
Zeke Sikelianos
c6918966c2 Merge pull request #10214 from psh0628/contextisolation-sandbox-fix
fix contextIsolation issue while webPreference sandbox is on
2017-08-28 21:20:04 -07:00
Ivan Mir
93a8e75238 Add clarifications to the documentation 2017-08-28 20:33:16 -03:00
Zeke Sikelianos
66a5ac4d67 Merge pull request #10215 from electron/update-chromium-upgrade-docs
Update Chromium Upgrade docs
2017-08-28 08:42:14 -07:00
Zeke Sikelianos
e1c4962312 add sh to code fences 2017-08-28 08:41:52 -07:00
Shohei YOSHIDA
55f2b524e7 Close window in order from newer one on macOS
A parent window is not closed if a child modal window still exists.
So a child window should be closed before parent window closed.
2017-08-28 13:56:05 +09:00
Ivan Mir
75b2915fee Change the parameter name for consistency 2017-08-27 11:53:25 -03:00
Tony Ganch
6a285e2e76 Update Chromium Upgrade docs 2017-08-27 17:51:47 +03:00
Aleksei Kuzmin
c4634f7e98 Update Chromium Upgrade docs 2017-08-27 17:51:47 +03:00
Zeke Sikelianos
87d4666648 Merge pull request #10356 from electron/update-browser-window-docs
update browser-window.md
2017-08-26 20:03:55 -07:00
Vanessa Yuen
deb7ccbef3 fix lint error 2017-08-25 17:24:50 -04:00
Vanessa Yuen
bb153ee79e update browser-window.md
Add a note about the subtle difference between `window.onbeforeunload = handler` and `window.addEventListener('beforeunload', handler)`.
2017-08-25 17:14:20 -04:00
Owais Lone
dc43dc2a13 Add support for indicators in Ubuntu Gnome Session
Ubuntu is switching to Gnome in 17.10 but it's not going to be the stock Gnome session. It's going to support the existing Unity APIs. Support has already landed for application indicators and likely other APIs (Launcher,etc) will be supported soon. The Ubuntu Gnome session will have `XDG_CURRENT_DESKTOP=ubuntu:GNOME` environment variable.

Ref: https://didrocks.fr/2017/08/23/ubuntu-gnome-shell-in-artful-day-7/
2017-08-25 23:25:08 +05:30
sungpark
65eb4e1994 fix compile error 2017-08-24 14:31:25 -07:00
Ivan Mir
6717f0d2bb Add accessibility setter to the app 2017-08-24 11:22:28 -03:00
Cheng Zhao
6a93052f7d Merge pull request #10298 from electron/update-external-binaries
Bump external binaries to 1.2.2
2017-08-24 19:29:13 +09:00
Samuel Attard
7ecac42214 Merge pull request #10232 from electron/drag-browser-view
Add -webkit-app-region support to BrowserView
2017-08-24 10:30:56 +10:00
Felix Rieseberg
fdfbf3abfa 🔧 Respect the header 2017-08-23 17:26:18 -07:00
Felix Rieseberg
a44c2d5dcc 🔧 Extend interface 2017-08-23 16:10:31 -07:00
sungpark
f984bd2ff5 use spaces instead of hard tabs for indentation and add the supported modules as a sub-list 2017-08-23 10:52:02 -07:00
sungpark
eca7ff986c add webFrame to sandboxed renderer 2017-08-23 10:52:02 -07:00
sungpark
bf07c5aebd fix contextIsolation issue while webPreference sandbox is on
contextIsolation didn't work while sandbox is on. The fix is contextIsolation picked up while sandbox on
2017-08-23 10:52:02 -07:00
Liu Siyuan
e64d4e5bd7 update web-content.md based on review 2017-08-23 23:37:37 +08:00
Liu Siyuan
15d2cfe458 update docs 2017-08-23 23:04:00 +08:00
Zeke Sikelianos
88b3109137 change backport branch creation steps 2017-08-22 21:03:03 -07:00
Siyuan Liu
5cb58cd42f use nullptr instead of nullptr_t() 2017-08-23 09:30:58 +08:00
Zeke Sikelianos
485b9099f1 Merge pull request #10328 from electron/bump-@types-node-to-8
bump @types/node to 8
2017-08-22 15:03:04 -07:00
Felix Rieseberg
cd5cd25f74 🔪 Bonus colon 2017-08-22 11:14:21 -07:00
Zeke Sikelianos
18e7354b4a bump @types/node to 8 2017-08-22 11:01:40 -07:00
Ivan Mir
9605e6cb40 Add documentation for macOS accessibility 2017-08-22 13:01:33 -03:00
Vladimir Krivosheev
d3f30e7a9c docs: add note about electron-updater 2017-08-22 16:51:57 +02:00
Cheng Zhao
1f604c0826 Merge pull request #10219 from HAMIDx9/master
Add arm64 build support
2017-08-22 17:02:23 +09:00
Cheng Zhao
2bfc2be8c9 Merge pull request #10279 from electron/fix-10279
Fix 'BrowserWindow module "webPreferences" option "sandbox" option can print to PDF'
2017-08-22 15:25:37 +09:00
Cheng Zhao
d233fc044a Pass dpiVertical and dpiHorizontal to print settings 2017-08-22 13:54:49 +09:00
Michael Kaylan
b4428e7e41 🍎 Add macOS native tab methods to window API 2017-08-21 23:24:30 -04:00
Aleksei Kuzmin
8b55e6e2f5 Revert "Disable a failing test"
This reverts commit 9487222726.
2017-08-22 11:49:53 +09:00
Cheng Zhao
94ab1c790f Verify arm64 builds in prerelease 2017-08-22 10:08:27 +09:00
Cheng Zhao
de67e42fc9 Update breakpad for ia32/arm fix 2017-08-22 10:02:51 +09:00
Cheng Zhao
136857952e Add arm64 task in travis ci 2017-08-22 10:02:51 +09:00
HAMIDx9
cd42133651 Add arm64 build support 2017-08-22 10:02:51 +09:00
Cheng Zhao
0c93e4b8d7 Merge pull request #10318 from electron/module-version
Use 57 as node module version in Electron 1.8
2017-08-22 10:02:15 +09:00
Cheng Zhao
f954b60119 Use 57 as node module version
This matches Node v8, which uses 57 for V8 5.8 - 6.0.
2017-08-22 09:24:18 +09:00
Cheng Zhao
565ece6986 Merge pull request #10308 from electron/native-view
Add WebContents.getNativeView() API
2017-08-22 09:19:27 +09:00
Felix Rieseberg
f0680587fa 🔧 Linter fascism 2017-08-21 16:52:59 -07:00
Charlie Hess
f17bd040ad Merge pull request #10293 from electron/notification-sounds
Add support for soundName in main process notifications
2017-08-21 16:15:47 -07:00
Zeke Sikelianos
b1011768e5 Merge pull request #10251 from electron/new-update-docs
New guide for implementing updates
2017-08-21 15:22:43 -07:00
Zeke Sikelianos
b6787dbbb3 link to updates guide from docs readme 2017-08-21 15:22:13 -07:00
Zeke Sikelianos
1731359a17 tweak the updates guide 2017-08-21 15:19:59 -07:00
Charlie Hess
f2c0d1f0c5 📝 Little cleanup. 2017-08-21 13:56:10 -07:00
Charlie Hess
db081d95d5 Review CommentZ. 2017-08-21 13:53:50 -07:00
Zeke Sikelianos
a50e36d256 Merge pull request #10304 from kyo-ago/patch-1
Fix typo on japanese document
2017-08-21 09:17:26 -07:00
Zeke Sikelianos
6c60c6ca76 Merge pull request #10306 from lisurc/patch-1
📝 Fix markdown syntax
2017-08-21 09:14:56 -07:00
Cheng Zhao
2c1984b6ed Add WebContents.getNativeView API 2017-08-21 19:50:12 +09:00
Cheng Zhao
dede3d6213 Merge pull request #10280 from electron/fix-10280
Fix 'BrowserWindow module window states resizable state works for a frameless window'
2017-08-21 19:28:13 +09:00
Cheng Zhao
70fd42808e Fix build on Linux 2017-08-21 17:42:45 +09:00
Cheng Zhao
19323c88f9 win: Fix "thickFrame: false" not working for normal window 2017-08-21 17:21:59 +09:00
Aleksei Kuzmin
c0331673da Revert "Disable a failing test"
This reverts commit 25c0cf0612.
2017-08-21 16:48:24 +09:00
Siyuan Liu
eeb2e58ad8 return null when theme color is not found 2017-08-20 22:48:13 +08:00
Bastien
39c2a4721b 📝 Fix markdown syntax
Also fix some grammar and syntax typing mistakes.
[ci skip]
2017-08-19 22:29:34 +02:00
Ivan Mir
94dd068e15 Special attribute for macOS accessibility #7206
In the linked issue we were discussing that Electron apps are inaccessible unless VoiceOver is enabled. While it's a working solution for users with vision impairment, all other users and apps that require accessibility can't interact with Electron-based software because they don't keep VoiceOver running.

I suggest adding `AXManualAccessibility` for programmatically enabling it in Electron apps. The reason for a new attribute is that `AXEnhancedUserInterface` is already reserved by VoiceOver.

Adding this attribute will allow both Electron developers and 3rd party developers to enable and disable accessibility from their code by calling `accessibilitySetValue:forAttribute:` on the application.

It will be also possible to create a small utility app to switch accessibility in Electron-based apps until there's a native UI solution (like the accessibility settings page in Chrome).
2017-08-19 17:18:12 -03:00
kyo_ago
8695672082 fix typo 2017-08-19 15:37:07 +09:00
Samuel Attard
15db4ee450 Merge pull request #10275 from electron/windowclose-exception
Fixing uncaught exception on window close
2017-08-19 13:58:55 +10:00
Mathieu Débit
81f7b422e4 📝 Fix desktopCapturer example (#10303)
[ci skip]

Based on MDN example:
https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia#Examples
2017-08-18 22:02:28 +02:00
Josh Abernathy
766b604de5 Bump external binaries to 1.2.2 2017-08-18 08:20:07 -04:00
Cheng Zhao
ac6a44f0ac Merge pull request #10273 from rhysd/doc-fix-optional-args
fix some optional args docs
2017-08-18 19:07:56 +09:00
Charlie Hess
2b9b186fd1 Rename soundName → sound. 2017-08-17 17:28:14 -07:00
Charlie Hess
0cfae1cc2b Plumb in the macOS soundName property for notifications. 2017-08-17 13:31:20 -07:00
Hari Juturu
340431750b Removing try/catch 2017-08-17 10:56:37 -07:00
Cheng Zhao
4bc4a0c45b Merge pull request #10289 from electron/fix-compile
Fix compilation on mac
2017-08-17 17:41:13 +09:00
rhysd
01f549628f fix signature of <webview>.executeJavaScript 2017-08-17 17:06:30 +09:00
Cheng Zhao
9c552644d8 Fix compilation on mac 2017-08-17 16:47:12 +09:00
Cheng Zhao
f6792c0232 Merge pull request #10264 from electron/fix-sandbox-crash-on-background-tab
Fix sandbox crash when opening a background tab
2017-08-17 15:57:29 +09:00
Cheng Zhao
ecff620528 Merge pull request #10081 from renaesop/master
Add a callback option to `webContents.print`
2017-08-17 15:56:02 +09:00
Cheng Zhao
f908678e8e Merge pull request #10183 from andens/mouse_forward
Mouse forward functionality on Windows
2017-08-17 15:54:22 +09:00
Vanessa Yuen
32121b9c38 Merge pull request #10283 from electron/welcome-probots-config
add welcome probots
2017-08-16 15:56:19 -04:00
Vanessa Yuen
c4d1fb929c Update config.yml 2017-08-16 15:04:34 -04:00
Vanessa Yuen
65908bbb87 Create config.yml 2017-08-16 14:54:10 -04:00
John Kleinschmidt
44481db1ee Merge pull request #9946 from electron/upgrade-to-chromium-59
Upgrade to Chromium 59
2017-08-16 10:00:34 -04:00
Aleksei Kuzmin
5543bfc278 Use the latest libcc version with Chromium 59 2017-08-16 14:29:03 +03:00
Andreas Flöjt
d4bbd7c7ab Add example of using mouse forwarding. 2017-08-16 03:28:52 +02:00
Andreas Flöjt
814702f5b8 Cleanup potential mouse forwarding resources when window is destroyed. 2017-08-16 03:28:07 +02:00
Felix Rieseberg
6191e6e787 🔧 Implement feedback 2017-08-15 16:14:58 -07:00
Hari Juturu
9120774c00 Fixing uncaught exception on window close 2017-08-15 14:59:48 -07:00
Leo Lamprecht
78c87d4bd3 Made dialog message clear 2017-08-15 22:55:55 +02:00
Zeke Sikelianos
5f82168213 lint 2017-08-15 13:09:06 -07:00
Zeke Sikelianos
a84d49fe5c add newline 2017-08-15 13:06:45 -07:00
Zeke Sikelianos
2ec223ba11 use an arrow function 2017-08-15 13:04:52 -07:00
Zeke Sikelianos
35b2bc6b51 implement a dialog in the download handler 2017-08-15 12:53:46 -07:00
Leo Lamprecht
68250d80cd Improved error logging 2017-08-15 21:38:31 +02:00
rhysd
2edf4da859 fix some optional args docs 2017-08-16 02:23:36 +09:00
Michael Kaylan
7741a0e6ad 🍎 Add roles for macOS native tab menu items
Fixes #9086, #10064.
2017-08-15 11:30:39 -04:00
Aleksei Kuzmin
25c0cf0612 Disable a failing test
BrowserWindow module window states resizable state works for a frameless window
2017-08-15 16:19:29 +03:00
Aleksei Kuzmin
9487222726 Disable a failing test
BrowserWindow module "webPreferences" option "sandbox" option can print to PDF
2017-08-15 16:19:29 +03:00
Catalin Fratila
60b363fa3b Fixing Windows tray icon content menu - based on chrome/browser/ui/views/status_icons/status_icon_win.cc 2017-08-15 16:19:23 +03:00
Kevin Sawicki
90fbe5c06c Disable warnings in node.cc and string_bytes.cc 2017-08-15 16:19:23 +03:00
Kevin Sawicki
7226adee29 Upgrade node for windows build fixes 2017-08-15 16:19:23 +03:00
Kevin Sawicki
27c1612f44 Upgrade to node 8.2.1 2017-08-15 16:19:23 +03:00
Kevin Sawicki
fb6759b5e0 Downgrade to node 8.1.4 since 8.2.0 will be against v8 6.0 2017-08-15 16:19:23 +03:00
Kevin Sawicki
eabbac4ca1 Upgrade node for version module change 2017-08-15 16:19:23 +03:00
Kevin Sawicki
d943519fb4 Update text expectation for new --inspect-brk message 2017-08-15 16:19:23 +03:00
Kevin Sawicki
9d2aa6f1c7 Upgrade to node 8.2.0 2017-08-15 16:19:23 +03:00
Ales Pergl
9f8f95f4c9 Lock pixels before calling SkBitmap::getPixels and copy bitmap row-wise in case (stride != width) 2017-08-15 16:19:23 +03:00
John Kleinschmidt
924a345fac Try fix to boto on Trusty 2017-08-15 16:19:23 +03:00
John Kleinschmidt
59238a915e Require sudo 2017-08-15 16:19:23 +03:00
John Kleinschmidt
03d15809be Explicity use Precise for Travis CI 2017-08-15 16:19:23 +03:00
deepak1556
778772710a intialize WebTextCheckClient https://codereview.chromium.org/2791753003 2017-08-15 16:19:22 +03:00
Kevin Sawicki
fb02343ec0 Remove unneeded volumes and env 2017-08-15 16:19:22 +03:00
Kevin Sawicki
dc6e451010 Only start xvfb when tests will be run 2017-08-15 16:19:22 +03:00
Kevin Sawicki
1f71a2e94c Simplify xvfb init script 2017-08-15 16:19:22 +03:00
Kevin Sawicki
b407834ed7 Remove default 2017-08-15 16:19:22 +03:00
Kevin Sawicki
f1036f7305 Add xvfb-init.sh to docker context 2017-08-15 16:19:22 +03:00
Kevin Sawicki
c3e0e4682d Use xvfb from container on CI 2017-08-15 16:19:22 +03:00
Kevin Sawicki
a0fd37c8a3 Try always using DISPLAY=unix:99:0 on Linux CI 2017-08-15 16:19:22 +03:00
Kevin Sawicki
23b35af7f2 Use DISPLAY=:99.0 on Linux CI 2017-08-15 16:19:22 +03:00
Kevin Sawicki
ddefc08ec5 Remove command logging 2017-08-15 16:19:22 +03:00
Kevin Sawicki
f79a90161c Extend libcc Dockerfile for Electron Linux build 2017-08-15 16:19:22 +03:00
Kevin Sawicki
29dc06c89d Configure spec UI to run in docker container 2017-08-15 16:19:22 +03:00
Kevin Sawicki
5737f8b74e Remove unneeded nodenv setup 2017-08-15 16:19:22 +03:00
Kevin Sawicki
bbd1b325fb Initial docker-based linux builds 2017-08-15 16:19:22 +03:00
Kevin Sawicki
152d573fbd Build with jessie sysroot on ARM 2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
adaec2d32b Fix brightray.gyp 2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
b6f0d04813 net: remove CryptoModule class
https://codereview.chromium.org/2724013002
2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
fe0a96200d Use Jessie sysroot for building on amd64 and i386 2017-08-15 16:19:22 +03:00
Gellert Hegyi
c6ba812d79 re-enables OSR 2017-08-15 16:19:22 +03:00
Gellert Hegyi
6ab0a8a287 removes unused autoresizelock from osrrwhv 2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
90ec61fbe9 Revert "Enable OSR"
This reverts commit 5925d737afcd1b8dbbccc1d2b52ced025e291436.
2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
ba0c43e1fc Do not run navigator.getUserMedia related test on CI build machines 2017-08-15 16:19:22 +03:00
Gellert Hegyi
1d10654a22 fixes bitmap to canvas conversion 2017-08-15 16:19:22 +03:00
Gellert Hegyi
76d46ce509 adds compositor resize lock client implementation 2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
5ef668de64 Enable OSR 2017-08-15 16:19:22 +03:00
Gellert Hegyi
ca4a6e4692 fixes offscreen rendering on macos 2017-08-15 16:19:22 +03:00
Aleksei Kuzmin
1d132565c9 FIXME: enable_osr=0 2017-08-15 16:19:21 +03:00
Kevin Sawicki
7d1a49db48 Use kPointsPerInch instead of desired_dpi
Changed in https://codereview.chromium.org/2788343003
2017-08-15 16:19:21 +03:00
Kevin Sawicki
9945fc5148 Don't destroy menu delegate until OnMenuClosed fires 2017-08-15 16:19:21 +03:00
Kevin Sawicki
ad33e569d6 Register default layout provider 2017-08-15 16:19:21 +03:00
Kevin Sawicki
34fff57646 Grant the devtools access to the extension origins 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
4fc2b3e642 Make download item drags look like bookmark
https://codereview.chromium.org/2750253002
2017-08-15 16:19:21 +03:00
Kevin Sawicki
4bb95acc2b 👕 Remove linter errors 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
c7cf844bcd Update CHROME_VERSION_STRING 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
ba9b8719ac The Blink Rename 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
f4411889a9 Fix free memory calculation.
https://codereview.chromium.org/2558043007
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
627eb30409 The Blink Rename 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
b8b7d0ab1a Rename methods in autofill 2017-08-15 16:19:21 +03:00
Kevin Sawicki
45db999593 Extend blink::WebTextCheckClient in atom::api::SpellCheckClient 2017-08-15 16:19:21 +03:00
Tony Ganch
4d9f309888 Fix HasServiceWorker check
Revert cb2014f9e8ae0283e5f20d4e2167be1592228887.
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
e2fe95894f Require explicit selection of traits for LazyInstance
https://codereview.chromium.org/2733283002
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
e16e1e2854 Remove URLRequestJobFactory::IsHandledURL.
https://codereview.chromium.org/2783343002
2017-08-15 16:19:21 +03:00
Tony Ganch
90574160db Replace x/y in WebMouseEvent with proper getters/setters 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
b997c2ffc1 Don't call deprecated copyPixelsTo
don't call deprecated copyPixelsTo
https://codereview.chromium.org/2812853002

stop using copyPixelsTo -- deprecated
https://codereview.chromium.org/2798413002

remove unused SkBitmap::copyPixelsTo
https://skia-review.googlesource.com/c/13171/
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
f824b1e9d4 Migrate base::TaskRunner from Closure to OnceClosure
Migrate base::TaskRunner from Closure to OnceClosure
https://codereview.chromium.org/2637843002

Pass Callback to TaskRunner by value and consume it on invocation (1)
https://codereview.chromium.org/2726523002

Replace base::get with std::get
https://codereview.chromium.org/2797133002
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
48821a6d2a Fix compilation 2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
d09cab2e21 Migrate base::TaskRunner from Closure to OnceClosure
Migrate base::TaskRunner from Closure to OnceClosure
https://codereview.chromium.org/2637843002

Pass Callback to TaskRunner by value and consume it on invocation (1)
https://codereview.chromium.org/2726523002

Replace base::get with std::get
https://codereview.chromium.org/2797133002
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
ffbb16e854 Adds a basic offline check to InstallableManager.
https://codereview.chromium.org/2751343002
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
30fafc2772 Fix CompositorResizeLock to do something.
https://codereview.chromium.org/2773433003
2017-08-15 16:19:21 +03:00
Aleksei Kuzmin
9b8a77f0d8 Adds the ability for WebContentsDelegate to decide if event should be updated
https://codereview.chromium.org/2775553002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
d322769de8 WebMouseEvent coordinates are now fractional & private
https://codereview.chromium.org/2782893002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
faaeab7e4a Add EME support for new VP9 codec string in WebM.
https://codereview.chromium.org/2793163003
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
567646e624 Fix cc/paint skia type mismatches
https://codereview.chromium.org/2717943002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
adddff3ee2 Move PrefRegistrySimple to use unique_ptr<Value>
https://codereview.chromium.org/2784513002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
99e57f9072 Add display::GetDisplayNearestView
https://codereview.chromium.org/2751833004
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
6415f181ca Downloads: Added transient flag to download item and download database
https://codereview.chromium.org/2720613002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
bd971b6371 Added last_access_time to DownloadItem and History DB
https://codereview.chromium.org/2705283003
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
0adc887b32 [downloads] Allow download target determination to indicate an error.
https://chromium-review.googlesource.com/c/465526/
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
7c7300ff82 Make GetDisplayedNotifications asynchronous.
https://codereview.chromium.org/2749453002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
bda5e4efcb Moving LatencyInfo into a separate component.
https://codereview.chromium.org/2783973002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
cc350efbd8 Remove base::BinaryValue
https://codereview.chromium.org/2799093006
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
49fbb52b01 Add X509CertificateBytes which uses CRYPTO_BUFFER instead of macOS-native certificate types.
https://codereview.chromium.org/2746103003
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
3d700ee49f Remove base::Value::CreateNullValue
https://codereview.chromium.org/2792573002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
c7f2e2731c Allow content embedder to set a cursor for RenderWidgetHost
https://codereview.chromium.org/2808763009
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
1126719e7f Separate ContentSettingsClient out from LocalFrameClient
https://codereview.chromium.org/2786673002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
a20f633272 Remove base::StringValue
https://codereview.chromium.org/2664753002
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
fb7bd8f11e Remove desired DPI
https://codereview.chromium.org/2788343003
2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
7a4ca08a8d The Blink Rename 2017-08-15 16:19:20 +03:00
Aleksei Kuzmin
3939359354 Update clang revision to match Chromium 59.0.3071.104 2017-08-15 16:19:20 +03:00
Thiago de Arruda
1709b8e39d Fix sandbox crash when opening a background tab
When a link is clicked with the middle mouse button, chrome opens a window with
"background-tab" disposition. This is not currently handled in sandbox mode,
causing an api::WebContents to leak leading to eventual crash(since it has no
wrapper).

Also fix the event handler for "-add-new-contents" by having it call
`event.preventDefault()` when the window creation should be cancelled.
2017-08-15 09:55:39 -03:00
Cheng Zhao
a419fe75ca Merge pull request #10253 from electron/improvements-for-libcc-development
Improve development workflow with built libchromiumcontent
2017-08-15 19:40:06 +09:00
Leo Lamprecht
4ba4fe4f62 Examples for events 2017-08-15 11:38:54 +02:00
Leo Lamprecht
3062027bab Better wording about Now deployment 2017-08-15 11:29:28 +02:00
Leo Lamprecht
78f11df6e4 Full Windows section is back 2017-08-15 11:27:33 +02:00
Leo Lamprecht
3405596983 Brought back Windows section 2017-08-15 11:24:59 +02:00
Thiago de Arruda
d6fbf5f1bb Improve development workflow with built libchromiumcontent
- Add `--debug_libchromiumcontent` to build libchromiumcontent for debugging
  (shared library build).
- By default, only invoke `gclient sync` the first time to checkout chromium
  source tree. Add `--force_update_libchromiumcontent` switch to force updating.
- Document new options.

The goal is to allow faster edit/compile cycles when debugging/making changes
to libchromiumcontent.
2017-08-15 05:40:22 -03:00
renaesop
6d16eb81d2 Add a callback option to webContents.print 2017-08-15 14:44:24 +08:00
Zeke Sikelianos
6a872dd938 update the updates doc 2017-08-14 13:26:33 -07:00
Zeke Sikelianos
796664ef1c Merge pull request #10266 from electron/revert-10250-remove-preinstall-no-op
Revert "remove no-op preinstall script"
2017-08-14 11:34:44 -07:00
Zeke Sikelianos
10f2c80162 Revert "remove no-op preinstall script" 2017-08-14 11:33:32 -07:00
Andreas Flöjt
3d33da7696 Make mouse forward option of setIgnoreMouseMessages and update documentation. 2017-08-14 20:21:00 +02:00
Andreas Flöjt
60c0bf1636 Set up legacy window subclass and mouse hook during setForwardMouseMessages.
As opposed to when a legacy window is created/destroyed. This enables forwarding on a per-window basis.
2017-08-14 18:12:55 +02:00
Zeke Sikelianos
646a8eb753 Merge pull request #10250 from electron/remove-preinstall-no-op
remove no-op preinstall script
2017-08-13 21:19:29 -07:00
Zachary Flower
8a2c35023f 📝 Document simple fullscreen functionality [ci skip] 2017-08-13 00:58:28 -06:00
Zachary Flower
ba5fa2c8b1 Add support for simple (pre-Lion) fullscreen on Mac OS 2017-08-13 00:28:33 -06:00
Leo Lamprecht
235ae0989f Mention that the app needs to check for updates 2017-08-12 12:48:49 +02:00
Leo Lamprecht
837a34cf71 Indicate that Nuts supports private repositories 2017-08-12 12:44:21 +02:00
Leo Lamprecht
01f31edb95 Cut down platform notices a little 2017-08-12 01:30:29 +02:00
Leo Lamprecht
cfe914ff83 Fixed wording 2017-08-12 01:24:56 +02:00
Leo Lamprecht
06f4c1b337 Be clear about the usage example 2017-08-12 01:23:54 +02:00
Leo Lamprecht
3815ed8af4 Fixed a typo 2017-08-12 01:18:34 +02:00
Leo Lamprecht
c1a40fbd98 Linked guide about implementing updates 2017-08-12 01:10:20 +02:00
Leo Lamprecht
bb1627a69b Added guide for updates 2017-08-12 01:04:25 +02:00
John Kleinschmidt
ad90de0c82 Merge pull request #10230 from electron/prerelease
add a prerelease check
2017-08-11 16:41:08 -04:00
Zeke Sikelianos
0cd99d9815 remove no-op preinstall script 2017-08-11 12:18:51 -07:00
John Kleinschmidt
6956f2fc69 Merge pull request #10246 from electron/another-final-step-in-releasing
edit release on github after promoting to latest
2017-08-11 09:50:08 -04:00
Zeke Sikelianos
fd6aeda6f6 edit release on github after promoting to latest 2017-08-10 20:53:02 -07:00
Felix Rieseberg
b4bb00843b 🔧 Spaces for the Spacelord 2017-08-10 09:38:01 -07:00
Felix Rieseberg
4c48908a31 Merge branch 'drag-browser-view' of https://github.com/electron/electron into drag-browser-view 2017-08-10 09:36:12 -07:00
Zeke Sikelianos
404589d9b5 add more releasing tips 2017-08-10 09:26:22 -07:00
Felix Rieseberg
d913b53fea 🔧 Handle offset BrowserView 2017-08-10 08:00:21 -07:00
Cheng Zhao
c6289ef219 Merge pull request #10223 from ajmacd/shutdown-desktop-capturers
Ensure DesktopCapturers are destroyed when no longer needed.
2017-08-10 21:28:31 +09:00
Felix Rieseberg
47d652b5a2 🔧 Properly derive 2017-08-09 15:21:58 -07:00
Felix Rieseberg
7bfece1144 🔧 Make work with complex shapes 2017-08-09 15:21:58 -07:00
Felix Rieseberg
a55015d63d 🔧 Support older versions of macOS 2017-08-09 15:21:58 -07:00
Felix Rieseberg
a5dfb09037 🔧 Draggable (using the window’s regions) 2017-08-09 15:21:58 -07:00
Felix Rieseberg
ae5c8e63d9 🔧 Properly derive 2017-08-10 07:09:03 +09:00
Felix Rieseberg
ebe058e7cb 🔧 Make work with complex shapes 2017-08-09 14:53:36 -07:00
Zeke Sikelianos
96dd9b9ab8 update prerelease to check for files on s3 2017-08-09 13:40:52 -07:00
Felix Rieseberg
fdd0d67fd3 🔧 Support older versions of macOS 2017-08-09 11:57:57 -07:00
Zeke Sikelianos
a16c4167eb standardize 2017-08-09 11:06:16 -07:00
Zeke Sikelianos
1a6f0ae437 add a prerelease check 2017-08-09 10:49:31 -07:00
Felix Rieseberg
df66223f4c 🔧 Draggable (using the window’s regions) 2017-08-08 17:00:00 -07:00
Vladimir Vainer
39c46a9b75 added comment to mention sk_tools_utils::copy_to 2017-08-08 13:06:39 +03:00
Vladimir Vainer
e6abfa959a Revert "Do not use deprecated deepCopyTo"
This reverts commit 517184b89b.
2017-08-08 13:02:20 +03:00
Andrew MacDonald
a8759a3176 Ensure DesktopCapturers are destroyed when no longer needed. 2017-08-04 15:06:58 -07:00
Andreas Flöjt
0736de1e8d Fix lint errors 2017-08-03 23:23:42 +02:00
Andreas Flöjt
12dbcfa2ea 📝 Documentation for setForwardMouseMessages. 2017-08-02 21:50:42 +02:00
Andreas Flöjt
a84fa0eecb 🏁 Add API to forward mouse messages.
As opposed to the existing setIgnoreMouseEvents this call makes Chromium aware of mouse movements, allowing the user to stop forwarding according to movements in the webpage.
2017-08-02 21:16:37 +02:00
Vladimir Vainer
517184b89b Do not use deprecated deepCopyTo 2017-07-16 06:33:37 +03:00
Vladimir Vainer
5f2dd2ef6c Fix #8017: Crash copying croped image to clipboard 2017-07-09 06:56:14 +03:00
Shubham
1b8963ff6e 🍎 Fix full screen when resizable is set to true 2017-06-20 16:11:28 -04:00
280 changed files with 6253 additions and 1849 deletions

View File

@@ -6,33 +6,265 @@ jobs:
- image: electronbuilds/electron:0.0.3
environment:
TARGET_ARCH: arm
resource_class: xlarge
steps:
- checkout
- run: script/cibuild
- run:
name: Setup for headless testing
command: sh -e /etc/init.d/xvfb start
- run:
name: Check for release
command: |
MESSAGE="$(git log --format=%B -n 1 HEAD)"
case ${MESSAGE} in
Bump* ) echo 'export ELECTRON_RELEASE=1' >> $BASH_ENV
esac
- run:
name: Bootstrap
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Bootstrapping Electron for release build'
script/bootstrap.py --target_arch=$TARGET_ARCH
else
echo 'Bootstrapping Electron for debug build'
script/bootstrap.py --target_arch=$TARGET_ARCH --dev
fi
- run: npm run lint
- run:
name: Build
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Building Electron for release'
script/build.py -c R
else
echo 'Building Electron for debug'
script/build.py -c D
fi
- run:
name: Create distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Creating Electron release distribution'
script/create-dist.py
else
echo 'Skipping create distribution because build is not for release'
fi
- run:
name: Upload distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Uploading Electron release distribution'
script/upload.py
else
echo 'Skipping upload distribution because build is not for release'
fi
electron-linux-arm64:
docker:
- image: electronbuilds/electron:0.0.3
environment:
TARGET_ARCH: arm64
resource_class: xlarge
steps:
- checkout
- run:
name: Setup for headless testing
command: sh -e /etc/init.d/xvfb start
- run:
name: Check for release
command: |
MESSAGE="$(git log --format=%B -n 1 HEAD)"
case ${MESSAGE} in
Bump* ) echo 'export ELECTRON_RELEASE=1' >> $BASH_ENV
esac
- run:
name: Bootstrap
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Bootstrapping Electron for release build'
script/bootstrap.py --target_arch=$TARGET_ARCH
else
echo 'Bootstrapping Electron for debug build'
script/bootstrap.py --target_arch=$TARGET_ARCH --dev
fi
- run: npm run lint
- run:
name: Build
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Building Electron for release'
script/build.py -c R
else
echo 'Building Electron for debug'
script/build.py -c D
fi
- run:
name: Create distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Creating Electron release distribution'
script/create-dist.py
else
echo 'Skipping create distribution because build is not for release'
fi
- run:
name: Upload distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Uploading Electron release distribution'
script/upload.py
else
echo 'Skipping upload distribution because build is not for release'
fi
electron-linux-ia32:
docker:
- image: electronbuilds/electron:0.0.3
environment:
TARGET_ARCH: ia32
resource_class: xlarge
steps:
- checkout
- run: script/cibuild
- run:
name: Setup for headless testing
command: sh -e /etc/init.d/xvfb start
- run:
name: Check for release
command: |
MESSAGE="$(git log --format=%B -n 1 HEAD)"
case ${MESSAGE} in
Bump* ) echo 'export ELECTRON_RELEASE=1' >> $BASH_ENV
esac
- run:
name: Bootstrap
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Bootstrapping Electron for release build'
script/bootstrap.py --target_arch=$TARGET_ARCH
else
echo 'Bootstrapping Electron for debug build'
script/bootstrap.py --target_arch=$TARGET_ARCH --dev
fi
- run: npm run lint
- run:
name: Build
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Building Electron for release'
script/build.py -c R
else
echo 'Building Electron for debug'
script/build.py -c D
fi
- run:
name: Create distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Creating Electron release distribution'
script/create-dist.py
else
echo 'Skipping create distribution because build is not for release'
fi
- run:
name: Upload distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Uploading Electron release distribution'
script/upload.py
else
echo 'Skipping upload distribution because build is not for release'
fi
electron-linux-x64:
docker:
- image: electronbuilds/electron:0.0.3
environment:
TARGET_ARCH: x64
resource_class: xlarge
steps:
- checkout
- run: script/cibuild
- run:
name: Setup for headless testing
command: sh -e /etc/init.d/xvfb start
- run:
name: Check for release
command: |
MESSAGE="$(git log --format=%B -n 1 HEAD)"
case ${MESSAGE} in
Bump* ) echo 'export ELECTRON_RELEASE=1' >> $BASH_ENV
esac
- run:
name: Bootstrap
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Bootstrapping Electron for release build'
script/bootstrap.py --target_arch=$TARGET_ARCH
else
echo 'Bootstrapping Electron for debug build'
script/bootstrap.py --target_arch=$TARGET_ARCH --dev
fi
- run: npm run lint
- run:
name: Build
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Building Electron for release'
script/build.py -c R
else
echo 'Building Electron for debug'
script/build.py -c D
fi
- run:
name: Create distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Creating Electron release distribution'
script/create-dist.py
else
echo 'Skipping create distribution because build is not for release'
fi
- run:
name: Upload distribution
command: |
if [ "$ELECTRON_RELEASE" == "1" ]; then
echo 'Uploading Electron release distribution'
script/upload.py
else
echo 'Skipping upload distribution because build is not for release'
fi
- run:
name: Test
environment:
MOCHA_FILE: junit/test-results.xml
MOCHA_REPORTER: mocha-junit-reporter
command: |
if [ "$ELECTRON_RELEASE" != "1" ]; then
echo 'Testing Electron debug build'
mkdir junit
script/test.py --ci --rebuild_native_modules
else
echo 'Skipping testing on release build'
fi
- run:
name: Verify FFmpeg
command: |
if [ "$ELECTRON_RELEASE" != "1" ]; then
echo 'Verifying ffmpeg on debug build'
script/verify-ffmpeg.py
else
echo 'Skipping verify ffmpeg on release build'
fi
- store_test_results:
path: junit
- store_artifacts:
path: junit
workflows:
version: 2
build-arm:
jobs:
- electron-linux-arm
build-arm64:
jobs:
- electron-linux-arm64
build-ia32:
jobs:
- electron-linux-ia32

2
.dockerignore Normal file
View File

@@ -0,0 +1,2 @@
*
!tools/xvfb-init.sh

21
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,21 @@
# Order is important. The LAST matching pattern has the MOST precedence.
# gitignore style patterns are used, not globs.
# https://help.github.com/articles/about-codeowners
# https://git-scm.com/docs/gitignore
# Everything that falls through the cracks:
* @electron/reviewers
# filename patterns
*browser_view* @electron/browserview
*notification* @electron/notifications
*pdf* @electron/printing
*printing* @electron/printing
*updater* @electron/updater
# directories
/.github/ @electron/hubbers
/default_app/ @electron/docs
/docs/ @electron/docs
/docs-translations/ @electron/i18n
/npm/ @electron/hubbers

29
.github/config.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
# Configuration for new-issue-welcome - https://github.com/behaviorbot/new-issue-welcome
# Comment to be posted to on first time issues
newIssueWelcomeComment: |
👋 Thanks for opening your first issue here! If you're reporting a 🐞 bug, please make sure you include steps to reproduce it. We get a lot of issues on this repo, so please be patient and we will get back to you as soon as we can.
To help make it easier for us to investigate your issue, please follow the [contributing guidelines](https://github.com/electron/electron/blob/master/CONTRIBUTING.md#submitting-issues).
# Configuration for new-pr-welcome - https://github.com/behaviorbot/new-pr-welcome
# Comment to be posted to on PRs from first time contributors in your repository
newPRWelcomeComment: |
💖 Thanks for opening this pull request! 💖
Here is a list of things that will help get it across the finish line:
- Follow the JavaScript, C++, and Python [coding style](https://github.com/electron/electron/blob/master/docs/development/coding-style.md).
- Run `npm run lint` locally to catch formatting errors earlier.
- Document any user-facing changes you've made following the [documentation styleguide](https://github.com/electron/electron/blob/master/docs/styleguide.md).
- Include tests when adding/changing behavior.
- Include screenshots and animated GIFs whenever possible.
We get a lot of pull requests on this repo, so please be patient and we will get back to you as soon as we can.
# Configuration for first-pr-merge - https://github.com/behaviorbot/first-pr-merge
# Comment to be posted to on pull requests merged by a first time user
firstPRMergeComment: >
Congrats on merging your first pull request! 🎉🎉🎉
# It is recommend to include as many gifs and emojis as possiblec

25
.github/stale.yml vendored Normal file
View File

@@ -0,0 +1,25 @@
# Number of days of inactivity before an issue becomes stale
daysUntilStale: 45
# Number of days of inactivity before a stale issue is closed
daysUntilClose: 7
# Issues with these labels will never be considered stale
exemptLabels:
- fixme/bug
- fixme/crash
- fixme/regression
- fixme/security
- blocked
- blocking-stable
- needs-review
# Label to use when marking an issue as stale
staleLabel: stale
# Comment to post when marking an issue as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had
recent activity and is not currently prioritized. It will be closed
in a week if no further activity occurs :)
# Comment to post when closing a stale issue. Set to `false` to disable
closeComment: >
If you still think this issue is relevant, please ping a maintainer or
leave a comment!

4
.gitignore vendored
View File

@@ -1,5 +1,6 @@
.DS_Store
.env
.gclient_done
.npmrc
.tags*
.vs/
@@ -14,7 +15,6 @@
*.vcxproj.filters
*.vcxproj.user
*.xcodeproj
node_modules/
/.idea/
/brightray/brightray.opensdf
/brightray/brightray.sdf
@@ -41,3 +41,5 @@ node_modules/
/vendor/node/deps/node-inspect/.npmrc
/vendor/npm/
/vendor/python_26/
node_modules/
SHASUMS256.txt

View File

@@ -1 +1 @@
v7.9.0
v8.2.1

View File

@@ -5,7 +5,7 @@ notifications:
before_install:
- export BOTO_CONFIG=/dev/null
language: node_js
node_js:
- "4"
@@ -22,6 +22,8 @@ matrix:
env: TARGET_ARCH=arm
- os: linux
env: TARGET_ARCH=ia32
- os: linux
env: TARGET_ARCH=arm64
allow_failures:
- os: osx

View File

@@ -14,6 +14,7 @@ propose changes to this document in a pull request.
## Submitting Issues
### Creating Issues
* You can create an issue [here](https://github.com/electron/electron/issues/new),
but before doing that please read the notes below and include as many details as
possible with your report. If you can, please include:
@@ -27,6 +28,15 @@ possible with your report. If you can, please include:
* Perform a [cursory search](https://github.com/electron/electron/issues?utf8=✓&q=is%3Aissue+)
to see if a similar issue has already been submitted
### Issue Maintenance and Closure
* If an issue is inactive for 45 days (no activity of any kind), it will be
marked for closure with `stale`.
* If after this label is applied, no further activity occurs in the next 7 days,
the issue will be closed.
* If an issue has been closed and you still feel it's relevant, feel free to
ping a maintainer or add a comment!
## Submitting Pull Requests
* Include screenshots and animated GIFs in your pull request whenever possible.

18
Dockerfile Normal file
View File

@@ -0,0 +1,18 @@
FROM electronbuilds/libchromiumcontent:0.0.4
USER root
# Set up HOME directory
ENV HOME=/home
RUN chmod a+rwx /home
# Install node.js
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get update && apt-get install -y --force-yes nodejs
# Install wget used by crash reporter
RUN apt-get install -y --force-yes wget
# Add xvfb init script
ADD tools/xvfb-init.sh /etc/init.d/xvfb
RUN chmod a+x /etc/init.d/xvfb

17
Dockerfile.circleci Normal file
View File

@@ -0,0 +1,17 @@
FROM electronbuilds/libchromiumcontent:0.0.4
USER root
# Install node.js
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get update && apt-get install -y --force-yes nodejs
# Install wget used by crash reporter
RUN apt-get install -y --force-yes wget
# Add xvfb init script
ADD tools/xvfb-init.sh /etc/init.d/xvfb
RUN chmod a+x /etc/init.d/xvfb
USER builduser
WORKDIR /home/builduser

View File

@@ -9,6 +9,7 @@
#if defined(OS_WIN)
#include <windows.h> // windows.h must be included first
#include <atlbase.h> // ensures that ATL statics like `_AtlWinModule` are initialized (it's an issue in static debug build)
#include <shellapi.h>
#include <shellscalingapi.h>
#include <tchar.h>
@@ -34,7 +35,7 @@
namespace {
const char* kRunAsNode = "ELECTRON_RUN_AS_NODE";
const auto kRunAsNode = "ELECTRON_RUN_AS_NODE";
bool IsEnvSet(const char* name) {
#if defined(OS_WIN)
@@ -56,6 +57,29 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
bool run_as_node = IsEnvSet(kRunAsNode);
#ifdef _DEBUG
// Don't display assert dialog boxes in CI test runs
static const auto kCI = "ELECTRON_CI";
bool is_ci = IsEnvSet(kCI);
if (!is_ci) {
for (int i = 0; i < argc; ++i) {
if (!_wcsicmp(wargv[i], L"--ci")) {
is_ci = true;
_putenv_s(kCI, "1"); // set flag for child processes
break;
}
}
}
if (is_ci) {
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR);
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG | _CRTDBG_MODE_FILE);
_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);
_set_error_mode(_OUT_TO_STDERR);
}
#endif
// Make sure the output is printed to console.
if (run_as_node || !IsEnvSet("ELECTRON_NO_ATTACH_CONSOLE"))

View File

@@ -2,6 +2,8 @@
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#include <utility>
#include "atom/app/uv_task_runner.h"
#include "base/stl_util.h"
@@ -19,13 +21,13 @@ UvTaskRunner::~UvTaskRunner() {
}
bool UvTaskRunner::PostDelayedTask(const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) {
auto* timer = new uv_timer_t;
timer->data = this;
uv_timer_init(loop_, timer);
uv_timer_start(timer, UvTaskRunner::OnTimeout, delay.InMilliseconds(), 0);
tasks_[timer] = task;
tasks_[timer] = std::move(task);
return true;
}
@@ -35,9 +37,9 @@ bool UvTaskRunner::RunsTasksOnCurrentThread() const {
bool UvTaskRunner::PostNonNestableDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) {
return PostDelayedTask(from_here, task, delay);
return PostDelayedTask(from_here, std::move(task), delay);
}
// static
@@ -46,7 +48,7 @@ void UvTaskRunner::OnTimeout(uv_timer_t* timer) {
if (!ContainsKey(self->tasks_, timer))
return;
self->tasks_[timer].Run();
std::move(self->tasks_[timer]).Run();
self->tasks_.erase(timer);
uv_timer_stop(timer);
uv_close(reinterpret_cast<uv_handle_t*>(timer), UvTaskRunner::OnClose);

View File

@@ -21,12 +21,12 @@ class UvTaskRunner : public base::SingleThreadTaskRunner {
// base::SingleThreadTaskRunner:
bool PostDelayedTask(const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) override;
bool RunsTasksOnCurrentThread() const override;
bool PostNonNestableDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) override;
private:
@@ -35,7 +35,7 @@ class UvTaskRunner : public base::SingleThreadTaskRunner {
uv_loop_t* loop_;
std::map<uv_timer_t*, base::Closure> tasks_;
std::map<uv_timer_t*, base::OnceClosure> tasks_;
DISALLOW_COPY_AND_ASSIGN(UvTaskRunner);
};

View File

@@ -54,6 +54,10 @@
#include "base/strings/utf_string_conversions.h"
#endif
#if defined(OS_MACOSX)
#include "atom/browser/ui/cocoa/atom_bundle_mover.h"
#endif
using atom::Browser;
namespace mate {
@@ -371,6 +375,8 @@ int GetPathConstant(const std::string& name) {
return brightray::DIR_CACHE;
else if (name == "userCache")
return brightray::DIR_USER_CACHE;
else if (name == "logs")
return brightray::DIR_APP_LOGS;
else if (name == "home")
return base::DIR_HOME;
else if (name == "temp")
@@ -586,6 +592,18 @@ void App::OnAccessibilitySupportChanged() {
}
#if defined(OS_MACOSX)
void App::OnWillContinueUserActivity(
bool* prevent_default,
const std::string& type) {
*prevent_default = Emit("will-continue-activity", type);
}
void App::OnDidFailToContinueUserActivity(
const std::string& type,
const std::string& error) {
Emit("continue-activity-error", type, error);
}
void App::OnContinueUserActivity(
bool* prevent_default,
const std::string& type,
@@ -593,10 +611,22 @@ void App::OnContinueUserActivity(
*prevent_default = Emit("continue-activity", type, user_info);
}
void App::OnUserActivityWasContinued(
const std::string& type,
const base::DictionaryValue& user_info) {
Emit("activity-was-continued", type, user_info);
}
void App::OnUpdateUserActivityState(
bool* prevent_default,
const std::string& type,
const base::DictionaryValue& user_info) {
*prevent_default = Emit("update-activity-state", type, user_info);
}
void App::OnNewWindowForTab() {
Emit("new-window-for-tab");
}
#endif
void App::OnLogin(LoginHandler* login_handler,
@@ -875,6 +905,16 @@ bool App::IsAccessibilitySupportEnabled() {
return ax_state->IsAccessibleBrowser();
}
void App::SetAccessibilitySupportEnabled(bool enabled) {
auto ax_state = content::BrowserAccessibilityState::GetInstance();
if (enabled) {
ax_state->OnScreenReaderDetected();
} else {
ax_state->DisableAccessibility();
}
Browser::Get()->OnAccessibilitySupportChanged();
}
Browser::LoginItemSettings App::GetLoginItemSettings(mate::Arguments* args) {
Browser::LoginItemSettings options;
args->GetNext(&options);
@@ -1078,6 +1118,16 @@ void App::EnableMixedSandbox(mate::Arguments* args) {
command_line->AppendSwitch(switches::kEnableMixedSandbox);
}
#if defined(OS_MACOSX)
bool App::MoveToApplicationsFolder(mate::Arguments* args) {
return ui::cocoa::AtomBundleMover::Move(args);
}
bool App::IsInApplicationsFolder() {
return ui::cocoa::AtomBundleMover::IsCurrentAppInApplicationsFolder();
}
#endif
// static
mate::Handle<App> App::Create(v8::Isolate* isolate) {
return mate::CreateHandle(isolate, new App(isolate));
@@ -1121,6 +1171,10 @@ void App::BuildPrototype(
base::Bind(&Browser::SetUserActivity, browser))
.SetMethod("getCurrentActivityType",
base::Bind(&Browser::GetCurrentActivityType, browser))
.SetMethod("invalidateCurrentActivity",
base::Bind(&Browser::InvalidateCurrentActivity, browser))
.SetMethod("updateCurrentActivity",
base::Bind(&Browser::UpdateCurrentActivity, browser))
.SetMethod("setAboutPanelOptions",
base::Bind(&Browser::SetAboutPanelOptions, browser))
#endif
@@ -1147,6 +1201,8 @@ void App::BuildPrototype(
.SetMethod("relaunch", &App::Relaunch)
.SetMethod("isAccessibilitySupportEnabled",
&App::IsAccessibilitySupportEnabled)
.SetMethod("setAccessibilitySupportEnabled",
&App::SetAccessibilitySupportEnabled)
.SetMethod("disableHardwareAcceleration",
&App::DisableHardwareAcceleration)
.SetMethod("disableDomainBlockingFor3DAPIs",
@@ -1156,6 +1212,10 @@ void App::BuildPrototype(
.SetMethod("getGPUFeatureStatus", &App::GetGPUFeatureStatus)
.SetMethod("enableMixedSandbox", &App::EnableMixedSandbox)
// TODO(juturu): Remove in 2.0, deprecate before then with warnings
#if defined(OS_MACOSX)
.SetMethod("moveToApplicationsFolder", &App::MoveToApplicationsFolder)
.SetMethod("isInApplicationsFolder", &App::IsInApplicationsFolder)
#endif
.SetMethod("getAppMemoryInfo", &App::GetAppMetrics);
}

View File

@@ -115,11 +115,23 @@ class App : public AtomBrowserClient::Delegate,
void OnAccessibilitySupportChanged() override;
void OnPreMainMessageLoopRun() override;
#if defined(OS_MACOSX)
void OnWillContinueUserActivity(
bool* prevent_default,
const std::string& type) override;
void OnDidFailToContinueUserActivity(
const std::string& type,
const std::string& error) override;
void OnContinueUserActivity(
bool* prevent_default,
const std::string& type,
const base::DictionaryValue& user_info) override;
void OnUserActivityWasContinued(
const std::string& type,
const base::DictionaryValue& user_info) override;
void OnUpdateUserActivityState(
bool* prevent_default,
const std::string& type,
const base::DictionaryValue& user_info) override;
void OnNewWindowForTab() override;
#endif
@@ -173,6 +185,7 @@ class App : public AtomBrowserClient::Delegate,
void DisableHardwareAcceleration(mate::Arguments* args);
void DisableDomainBlockingFor3DAPIs(mate::Arguments* args);
bool IsAccessibilitySupportEnabled();
void SetAccessibilitySupportEnabled(bool enabled);
Browser::LoginItemSettings GetLoginItemSettings(mate::Arguments* args);
#if defined(USE_NSS_CERTS)
void ImportCertificate(const base::DictionaryValue& options,
@@ -185,6 +198,11 @@ class App : public AtomBrowserClient::Delegate,
v8::Local<v8::Value> GetGPUFeatureStatus(v8::Isolate* isolate);
void EnableMixedSandbox(mate::Arguments* args);
#if defined(OS_MACOSX)
bool MoveToApplicationsFolder(mate::Arguments* args);
bool IsInApplicationsFolder();
#endif
#if defined(OS_WIN)
// Get the current Jump List settings.
v8::Local<v8::Value> GetJumpListSettings();

View File

@@ -212,6 +212,7 @@ struct Converter<atom::VerifyRequestParams> {
dict.Set("hostname", val.hostname);
dict.Set("certificate", val.certificate);
dict.Set("verificationResult", val.default_result);
dict.Set("errorCode", val.error_code);
return dict.GetHandle();
}
};
@@ -433,6 +434,7 @@ void DownloadIdCallback(content::DownloadManager* download_manager,
content::DownloadItem::INTERRUPTED,
content::DownloadDangerType::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
content::DOWNLOAD_INTERRUPT_REASON_NETWORK_TIMEOUT, false,
base::Time(), false,
std::vector<content::DownloadItem::ReceivedSlice>());
}

View File

@@ -67,6 +67,7 @@ void SystemPreferences::BuildPrototype(
&SystemPreferences::UnsubscribeLocalNotification)
.SetMethod("getUserDefault", &SystemPreferences::GetUserDefault)
.SetMethod("setUserDefault", &SystemPreferences::SetUserDefault)
.SetMethod("removeUserDefault", &SystemPreferences::RemoveUserDefault)
.SetMethod("isSwipeTrackingFromScrollEventsEnabled",
&SystemPreferences::IsSwipeTrackingFromScrollEventsEnabled)
#endif

View File

@@ -76,6 +76,7 @@ class SystemPreferences : public mate::EventEmitter<SystemPreferences>
void SetUserDefault(const std::string& name,
const std::string& type,
mate::Arguments* args);
void RemoveUserDefault(const std::string& name);
bool IsSwipeTrackingFromScrollEventsEnabled();
#endif
bool IsDarkMode();

View File

@@ -229,6 +229,11 @@ void SystemPreferences::SetUserDefault(const std::string& name,
}
}
void SystemPreferences::RemoveUserDefault(const std::string& name) {
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:base::SysUTF8ToNSString(name)];
}
bool SystemPreferences::IsDarkMode() {
NSString* mode = [[NSUserDefaults standardUserDefaults]
stringForKey:@"AppleInterfaceStyle"];

View File

@@ -86,8 +86,10 @@ mate::WrappableBase* Tray::New(mate::Handle<NativeImage> image,
return new Tray(args->isolate(), args->GetThis(), image);
}
void Tray::OnClicked(const gfx::Rect& bounds, int modifiers) {
EmitWithFlags("click", modifiers, bounds);
void Tray::OnClicked(const gfx::Rect& bounds,
const gfx::Point& location,
int modifiers) {
EmitWithFlags("click", modifiers, bounds, location);
}
void Tray::OnDoubleClicked(const gfx::Rect& bounds, int modifiers) {
@@ -130,6 +132,10 @@ void Tray::OnMouseExited(const gfx::Point& location, int modifiers) {
EmitWithFlags("mouse-leave", modifiers, location);
}
void Tray::OnMouseMoved(const gfx::Point& location, int modifiers) {
EmitWithFlags("mouse-move", modifiers, location);
}
void Tray::OnDragEntered() {
Emit("drag-enter");
}

View File

@@ -47,7 +47,9 @@ class Tray : public mate::TrackableObject<Tray>,
~Tray() override;
// TrayIconObserver:
void OnClicked(const gfx::Rect& bounds, int modifiers) override;
void OnClicked(const gfx::Rect& bounds,
const gfx::Point& location,
int modifiers) override;
void OnDoubleClicked(const gfx::Rect& bounds, int modifiers) override;
void OnRightClicked(const gfx::Rect& bounds, int modifiers) override;
void OnBalloonShow() override;
@@ -61,6 +63,7 @@ class Tray : public mate::TrackableObject<Tray>,
void OnDragEnded() override;
void OnMouseEntered(const gfx::Point& location, int modifiers) override;
void OnMouseExited(const gfx::Point& location, int modifiers) override;
void OnMouseMoved(const gfx::Point& location, int modifiers) override;
void SetImage(v8::Isolate* isolate, mate::Handle<NativeImage> image);
void SetPressedImage(v8::Isolate* isolate, mate::Handle<NativeImage> image);

View File

@@ -56,6 +56,7 @@
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "content/browser/web_contents/web_contents_impl.h"
#include "content/common/view_messages.h"
#include "content/public/browser/child_process_security_policy.h"
#include "content/public/browser/favicon_status.h"
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/navigation_details.h"
@@ -81,6 +82,7 @@
#include "third_party/WebKit/public/web/WebFindOptions.h"
#include "ui/display/screen.h"
#include "ui/events/base_event_utils.h"
#include "ui/latency/latency_info.h"
#if !defined(OS_MACOSX)
#include "ui/aura/window.h"
@@ -303,6 +305,10 @@ WebContents::WebContents(v8::Isolate* isolate, const mate::Dictionary& options)
request_id_(0),
background_throttling_(true),
enable_devtools_(true) {
// WebContents may need to emit events when it is garbage collected, so it
// has to be deleted in the first gc callback.
MarkHighMemoryUsage();
// Read options.
options.Get("backgroundThrottling", &background_throttling_);
@@ -586,16 +592,18 @@ void WebContents::HandleKeyboardEvent(
}
}
bool WebContents::PreHandleKeyboardEvent(
content::KeyboardEventProcessingResult WebContents::PreHandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) {
if (event.type() == blink::WebInputEvent::Type::RawKeyDown ||
event.type() == blink::WebInputEvent::Type::KeyUp) {
return Emit("before-input-event", event);
} else {
return false;
const content::NativeWebKeyboardEvent& event) {
if (event.GetType() == blink::WebInputEvent::Type::kRawKeyDown ||
event.GetType() == blink::WebInputEvent::Type::kKeyUp) {
bool prevent_default = Emit("before-input-event", event);
if (prevent_default) {
return content::KeyboardEventProcessingResult::HANDLED;
}
}
return content::KeyboardEventProcessingResult::NOT_HANDLED;
}
void WebContents::EnterFullscreenModeForTab(content::WebContents* source,
@@ -753,7 +761,11 @@ void WebContents::MediaStoppedPlaying(const MediaPlayerInfo& video_type,
}
void WebContents::DidChangeThemeColor(SkColor theme_color) {
Emit("did-change-theme-color", atom::ToRGBHex(theme_color));
if (theme_color != SK_ColorTRANSPARENT) {
Emit("did-change-theme-color", atom::ToRGBHex(theme_color));
} else {
Emit("did-change-theme-color", nullptr);
}
}
void WebContents::DocumentLoadedInFrame(
@@ -818,7 +830,7 @@ void WebContents::DidFinishNavigation(
bool is_main_frame = navigation_handle->IsInMainFrame();
if (navigation_handle->HasCommitted() && !navigation_handle->IsErrorPage()) {
auto url = navigation_handle->GetURL();
bool is_in_page = navigation_handle->IsSamePage();
bool is_in_page = navigation_handle->IsSameDocument();
if (is_main_frame && !is_in_page) {
Emit("did-navigate", url);
} else if (is_in_page) {
@@ -1002,7 +1014,7 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) {
GURL http_referrer;
if (options.Get("httpReferrer", &http_referrer))
params.referrer = content::Referrer(http_referrer.GetAsReferrer(),
blink::WebReferrerPolicyDefault);
blink::kWebReferrerPolicyDefault);
std::string user_agent;
if (options.Get("userAgent", &user_agent))
@@ -1240,9 +1252,22 @@ void WebContents::HasServiceWorker(
if (!context)
return;
context->CheckHasServiceWorker(web_contents()->GetLastCommittedURL(),
GURL::EmptyGURL(),
callback);
struct WrappedCallback {
base::Callback<void(bool)> callback_;
explicit WrappedCallback(const base::Callback<void(bool)>& callback)
: callback_(callback) {}
void Run(content::ServiceWorkerCapability capability) {
callback_.Run(capability !=
content::ServiceWorkerCapability::NO_SERVICE_WORKER);
delete this;
}
};
auto wrapped_callback = new WrappedCallback(callback);
context->CheckHasServiceWorker(
web_contents()->GetLastCommittedURL(), GURL::EmptyGURL(),
base::Bind(&WrappedCallback::Run, base::Unretained(wrapped_callback)));
}
void WebContents::UnregisterServiceWorker(
@@ -1269,13 +1294,21 @@ bool WebContents::IsAudioMuted() {
void WebContents::Print(mate::Arguments* args) {
PrintSettings settings = { false, false, base::string16() };
if (args->Length() == 1 && !args->GetNext(&settings)) {
if (args->Length() >= 1 && !args->GetNext(&settings)) {
args->ThrowError();
return;
}
printing::PrintViewManagerBasic::FromWebContents(web_contents())->
PrintNow(web_contents()->GetMainFrame(),
auto print_view_manager_basic_ptr =
printing::PrintViewManagerBasic::FromWebContents(web_contents());
if (args->Length() == 2) {
base::Callback<void(bool)> callback;
if (!args->GetNext(&callback)) {
args->ThrowError();
return;
}
print_view_manager_basic_ptr->SetCallback(callback);
}
print_view_manager_basic_ptr->PrintNow(web_contents()->GetMainFrame(),
settings.silent,
settings.print_background,
settings.device_name);
@@ -1426,22 +1459,22 @@ void WebContents::SendInputEvent(v8::Isolate* isolate,
return;
int type = mate::GetWebInputEventType(isolate, input_event);
if (blink::WebInputEvent::isMouseEventType(type)) {
if (blink::WebInputEvent::IsMouseEventType(type)) {
blink::WebMouseEvent mouse_event;
if (mate::ConvertFromV8(isolate, input_event, &mouse_event)) {
view->ProcessMouseEvent(mouse_event, ui::LatencyInfo());
return;
}
} else if (blink::WebInputEvent::isKeyboardEventType(type)) {
} else if (blink::WebInputEvent::IsKeyboardEventType(type)) {
content::NativeWebKeyboardEvent keyboard_event(
blink::WebKeyboardEvent::RawKeyDown,
blink::WebInputEvent::NoModifiers,
blink::WebKeyboardEvent::kRawKeyDown,
blink::WebInputEvent::kNoModifiers,
ui::EventTimeForNow());
if (mate::ConvertFromV8(isolate, input_event, &keyboard_event)) {
view->ProcessKeyboardEvent(keyboard_event);
return;
}
} else if (type == blink::WebInputEvent::MouseWheel) {
} else if (type == blink::WebInputEvent::kMouseWheel) {
blink::WebMouseWheelEvent mouse_wheel_event;
if (mate::ConvertFromV8(isolate, input_event, &mouse_wheel_event)) {
view->ProcessMouseWheelEvent(mouse_wheel_event, ui::LatencyInfo());
@@ -1541,7 +1574,7 @@ void WebContents::CapturePage(mate::Arguments* args) {
gfx::Size bitmap_size = view_size;
const gfx::NativeView native_view = view->GetNativeView();
const float scale =
display::Screen::GetScreen()->GetDisplayNearestWindow(native_view)
display::Screen::GetScreen()->GetDisplayNearestView(native_view)
.device_scale_factor();
if (scale > 1.0f)
bitmap_size = gfx::ScaleToCeiledSize(view_size, scale);
@@ -1553,7 +1586,7 @@ void WebContents::CapturePage(mate::Arguments* args) {
}
void WebContents::OnCursorChange(const content::WebCursor& cursor) {
content::WebCursor::CursorInfo info;
content::CursorInfo info;
cursor.GetCursorInfo(&info);
if (cursor.IsCustom()) {
@@ -1758,6 +1791,16 @@ void WebContents::SetEmbedder(const WebContents* embedder) {
}
}
v8::Local<v8::Value> WebContents::GetNativeView() const {
gfx::NativeView ptr = web_contents()->GetNativeView();
auto buffer = node::Buffer::Copy(
isolate(), reinterpret_cast<char*>(&ptr), sizeof(gfx::NativeView));
if (buffer.IsEmpty())
return v8::Null(isolate());
else
return buffer.ToLocalChecked();
}
v8::Local<v8::Value> WebContents::DevToolsWebContents(v8::Isolate* isolate) {
if (devtools_web_contents_.IsEmpty())
return v8::Null(isolate);
@@ -1773,6 +1816,12 @@ v8::Local<v8::Value> WebContents::Debugger(v8::Isolate* isolate) {
return v8::Local<v8::Value>::New(isolate, debugger_);
}
void WebContents::GrantOriginAccess(const GURL& url) {
content::ChildProcessSecurityPolicy::GetInstance()->GrantOrigin(
web_contents()->GetMainFrame()->GetProcess()->GetID(),
url::Origin(url));
}
// static
void WebContents::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype) {
@@ -1863,10 +1912,12 @@ void WebContents::BuildPrototype(v8::Isolate* isolate,
.SetMethod("copyImageAt", &WebContents::CopyImageAt)
.SetMethod("capturePage", &WebContents::CapturePage)
.SetMethod("setEmbedder", &WebContents::SetEmbedder)
.SetMethod("getNativeView", &WebContents::GetNativeView)
.SetMethod("setWebRTCIPHandlingPolicy",
&WebContents::SetWebRTCIPHandlingPolicy)
.SetMethod("getWebRTCIPHandlingPolicy",
&WebContents::GetWebRTCIPHandlingPolicy)
.SetMethod("_grantOriginAccess", &WebContents::GrantOriginAccess)
.SetProperty("id", &WebContents::ID)
.SetProperty("session", &WebContents::Session)
.SetProperty("hostWebContents", &WebContents::HostWebContents)

View File

@@ -14,6 +14,7 @@
#include "atom/browser/common_web_contents_delegate.h"
#include "atom/browser/ui/autofill_popup.h"
#include "content/common/cursors/webcursor.h"
#include "content/public/browser/keyboard_event_processing_result.h"
#include "content/public/browser/web_contents_observer.h"
#include "content/public/common/favicon_url.h"
#include "native_mate/handle.h"
@@ -115,7 +116,8 @@ class WebContents : public mate::TrackableObject<WebContents>,
void DisableDeviceEmulation();
void InspectElement(int x, int y);
void InspectServiceWorker();
void HasServiceWorker(const base::Callback<void(bool)>&);
void HasServiceWorker(
const base::Callback<void(bool)>&);
void UnregisterServiceWorker(const base::Callback<void(bool)>&);
void SetIgnoreMenuShortcuts(bool ignore);
void SetAudioMuted(bool muted);
@@ -123,6 +125,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
void Print(mate::Arguments* args);
std::vector<printing::PrinterBasicInfo> GetPrinterList();
void SetEmbedder(const WebContents* embedder);
v8::Local<v8::Value> GetNativeView() const;
// Print current page as PDF.
void PrintToPDF(const base::DictionaryValue& setting,
@@ -214,6 +217,10 @@ class WebContents : public mate::TrackableObject<WebContents>,
// Returns the owner window.
v8::Local<v8::Value> GetOwnerBrowserWindow();
// Grants the child process the capability to access URLs with the origin of
// the specified URL.
void GrantOriginAccess(const GURL& url);
// Properties.
int32_t ID() const;
v8::Local<v8::Value> Session(v8::Isolate* isolate);
@@ -268,9 +275,9 @@ class WebContents : public mate::TrackableObject<WebContents>,
void HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) override;
bool PreHandleKeyboardEvent(content::WebContents* source,
const content::NativeWebKeyboardEvent& event,
bool* is_keyboard_shortcut) override;
content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) override;
void EnterFullscreenModeForTab(content::WebContents* source,
const GURL& origin) override;
void ExitFullscreenModeForTab(content::WebContents* source) override;

View File

@@ -603,6 +603,14 @@ void Window::SetSkipTaskbar(bool skip) {
window_->SetSkipTaskbar(skip);
}
void Window::SetSimpleFullScreen(bool simple_fullscreen) {
window_->SetSimpleFullScreen(simple_fullscreen);
}
bool Window::IsSimpleFullScreen() {
return window_->IsSimpleFullScreen();
}
void Window::SetKiosk(bool kiosk) {
window_->SetKiosk(kiosk);
}
@@ -623,6 +631,14 @@ bool Window::HasShadow() {
return window_->HasShadow();
}
void Window::SetOpacity(const double opacity) {
window_->SetOpacity(opacity);
}
double Window::GetOpacity() {
return window_->GetOpacity();
}
void Window::FocusOnWebView() {
window_->FocusOnWebView();
}
@@ -651,8 +667,11 @@ bool Window::IsDocumentEdited() {
return window_->IsDocumentEdited();
}
void Window::SetIgnoreMouseEvents(bool ignore) {
return window_->SetIgnoreMouseEvents(ignore);
void Window::SetIgnoreMouseEvents(bool ignore, mate::Arguments* args) {
mate::Dictionary options;
bool forward = false;
args->GetNext(&options) && options.Get("forward", &forward);
return window_->SetIgnoreMouseEvents(ignore, forward);
}
void Window::SetContentProtection(bool enable) {
@@ -907,6 +926,30 @@ void Window::SetAutoHideCursor(bool auto_hide) {
window_->SetAutoHideCursor(auto_hide);
}
void Window::SelectPreviousTab() {
window_->SelectPreviousTab();
}
void Window::SelectNextTab() {
window_->SelectNextTab();
}
void Window::MergeAllWindows() {
window_->MergeAllWindows();
}
void Window::MoveTabToNewWindow() {
window_->MoveTabToNewWindow();
}
void Window::ToggleTabBar() {
window_->ToggleTabBar();
}
void Window::AddTabbedWindow(NativeWindow* window) {
window_->AddTabbedWindow(window);
}
void Window::SetVibrancy(mate::Arguments* args) {
std::string type;
@@ -1018,11 +1061,15 @@ void Window::BuildPrototype(v8::Isolate* isolate,
.SetMethod("getTitle", &Window::GetTitle)
.SetMethod("flashFrame", &Window::FlashFrame)
.SetMethod("setSkipTaskbar", &Window::SetSkipTaskbar)
.SetMethod("setSimpleFullScreen", &Window::SetSimpleFullScreen)
.SetMethod("isSimpleFullScreen", &Window::IsSimpleFullScreen)
.SetMethod("setKiosk", &Window::SetKiosk)
.SetMethod("isKiosk", &Window::IsKiosk)
.SetMethod("setBackgroundColor", &Window::SetBackgroundColor)
.SetMethod("setHasShadow", &Window::SetHasShadow)
.SetMethod("hasShadow", &Window::HasShadow)
.SetMethod("setOpacity", &Window::SetOpacity)
.SetMethod("getOpacity", &Window::GetOpacity)
.SetMethod("setRepresentedFilename", &Window::SetRepresentedFilename)
.SetMethod("getRepresentedFilename", &Window::GetRepresentedFilename)
.SetMethod("setDocumentEdited", &Window::SetDocumentEdited)
@@ -1047,6 +1094,12 @@ void Window::BuildPrototype(v8::Isolate* isolate,
&Window::IsVisibleOnAllWorkspaces)
#if defined(OS_MACOSX)
.SetMethod("setAutoHideCursor", &Window::SetAutoHideCursor)
.SetMethod("mergeAllWindows", &Window::MergeAllWindows)
.SetMethod("selectPreviousTab", &Window::SelectPreviousTab)
.SetMethod("selectNextTab", &Window::SelectNextTab)
.SetMethod("moveTabToNewWindow", &Window::MoveTabToNewWindow)
.SetMethod("toggleTabBar", &Window::ToggleTabBar)
.SetMethod("addTabbedWindow", &Window::AddTabbedWindow)
#endif
.SetMethod("setVibrancy", &Window::SetVibrancy)
.SetMethod("_setTouchBarItems", &Window::SetTouchBar)

View File

@@ -154,11 +154,15 @@ class Window : public mate::TrackableObject<Window>,
std::string GetTitle();
void FlashFrame(bool flash);
void SetSkipTaskbar(bool skip);
void SetSimpleFullScreen(bool simple_fullscreen);
bool IsSimpleFullScreen();
void SetKiosk(bool kiosk);
bool IsKiosk();
void SetBackgroundColor(const std::string& color_name);
void SetHasShadow(bool has_shadow);
bool HasShadow();
void SetOpacity(const double opacity);
double GetOpacity();
void FocusOnWebView();
void BlurWebView();
bool IsWebViewFocused();
@@ -166,7 +170,7 @@ class Window : public mate::TrackableObject<Window>,
std::string GetRepresentedFilename();
void SetDocumentEdited(bool edited);
bool IsDocumentEdited();
void SetIgnoreMouseEvents(bool ignore);
void SetIgnoreMouseEvents(bool ignore, mate::Arguments* args);
void SetContentProtection(bool enable);
void SetFocusable(bool focusable);
void SetProgressBar(double progress, mate::Arguments* args);
@@ -212,6 +216,13 @@ class Window : public mate::TrackableObject<Window>,
void SetAutoHideCursor(bool auto_hide);
void SelectPreviousTab();
void SelectNextTab();
void MergeAllWindows();
void MoveTabToNewWindow();
void ToggleTabBar();
void AddTabbedWindow(NativeWindow* window);
void SetVibrancy(mate::Arguments* args);
void SetTouchBar(const std::vector<mate::PersistentDictionary>& items);
void RefreshTouchBarItem(const std::string& item_id);

View File

@@ -45,9 +45,9 @@ bool FrameSubscriber::ShouldCaptureFrame(
gfx::Size view_size = rect.size();
gfx::Size bitmap_size = view_size;
const gfx::NativeView native_view = view_->GetNativeView();
gfx::NativeView native_view = view_->GetNativeView();
const float scale =
display::Screen::GetScreen()->GetDisplayNearestWindow(native_view)
display::Screen::GetScreen()->GetDisplayNearestView(native_view)
.device_scale_factor();
if (scale > 1.0f)
bitmap_size = gfx::ScaleToCeiledSize(view_size, scale);
@@ -78,20 +78,32 @@ void FrameSubscriber::OnFrameDelivered(const FrameCaptureCallback& callback,
v8::Locker locker(isolate_);
v8::HandleScope handle_scope(isolate_);
size_t rgb_arr_size = bitmap.width() * bitmap.height() *
bitmap.bytesPerPixel();
v8::MaybeLocal<v8::Object> buffer = node::Buffer::New(isolate_, rgb_arr_size);
size_t rgb_row_size = bitmap.width() * bitmap.bytesPerPixel();
v8::MaybeLocal<v8::Object> buffer =
node::Buffer::New(isolate_, rgb_row_size * bitmap.height());
if (buffer.IsEmpty())
return;
bitmap.copyPixelsTo(
reinterpret_cast<uint8_t*>(node::Buffer::Data(buffer.ToLocalChecked())),
rgb_arr_size);
auto local_buffer = buffer.ToLocalChecked();
{
SkAutoLockPixels lock(bitmap);
auto source = static_cast<const unsigned char*>(bitmap.getPixels());
auto target = node::Buffer::Data(local_buffer);
for (int y = 0; y < bitmap.height(); ++y) {
memcpy(target, source, rgb_row_size);
source += bitmap.rowBytes();
target += rgb_row_size;
}
}
v8::Local<v8::Value> damage =
mate::Converter<gfx::Rect>::ToV8(isolate_, damage_rect);
callback_.Run(buffer.ToLocalChecked(), damage);
callback_.Run(local_buffer, damage);
}
} // namespace api

View File

@@ -6,6 +6,7 @@
#include "atom/browser/atom_browser_main_parts.h"
#include "base/bind.h"
#include "base/memory/ptr_util.h"
#include "base/supports_user_data.h"
namespace mate {
@@ -46,16 +47,19 @@ void TrackableObjectBase::Destroy() {
}
void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_));
wrapped->SetUserData(kTrackedObjectKey,
base::MakeUnique<IDUserData>(weak_map_id_));
}
// static
int32_t TrackableObjectBase::GetIDFromWrappedClass(base::SupportsUserData* w) {
auto id = static_cast<IDUserData*>(w->GetUserData(kTrackedObjectKey));
if (id)
return *id;
else
return 0;
int32_t TrackableObjectBase::GetIDFromWrappedClass(
base::SupportsUserData* wrapped) {
if (wrapped) {
auto id = static_cast<IDUserData*>(wrapped->GetUserData(kTrackedObjectKey));
if (id)
return *id;
}
return 0;
}
// static

View File

@@ -30,15 +30,15 @@ class TrackableObjectBase {
// Wrap TrackableObject into a class that SupportsUserData.
void AttachAsUserData(base::SupportsUserData* wrapped);
// Get the weak_map_id from SupportsUserData.
static int32_t GetIDFromWrappedClass(base::SupportsUserData* wrapped);
protected:
virtual ~TrackableObjectBase();
// Returns a closure that can destroy the native class.
base::Closure GetDestroyClosure();
// Get the weak_map_id from SupportsUserData.
static int32_t GetIDFromWrappedClass(base::SupportsUserData* wrapped);
// Register a callback that should be destroyed before JavaScript environment
// gets destroyed.
static base::Closure RegisterDestructionCallback(const base::Closure& c);

View File

@@ -115,7 +115,10 @@ void AtomDownloadManagerDelegate::OnDownloadPathGenerated(
// If user cancels the file save dialog, run the callback with empty FilePath.
callback.Run(path,
content::DownloadItem::TARGET_DISPOSITION_PROMPT,
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path);
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS, path,
path.empty() ?
content::DOWNLOAD_INTERRUPT_REASON_USER_CANCELED :
content::DOWNLOAD_INTERRUPT_REASON_NONE);
}
void AtomDownloadManagerDelegate::Shutdown() {
@@ -132,7 +135,8 @@ bool AtomDownloadManagerDelegate::DetermineDownloadTarget(
callback.Run(download->GetForcedFilePath(),
content::DownloadItem::TARGET_DISPOSITION_OVERWRITE,
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
download->GetForcedFilePath());
download->GetForcedFilePath(),
content::DOWNLOAD_INTERRUPT_REASON_NONE);
return true;
}
@@ -143,7 +147,7 @@ bool AtomDownloadManagerDelegate::DetermineDownloadTarget(
callback.Run(save_path,
content::DownloadItem::TARGET_DISPOSITION_OVERWRITE,
content::DOWNLOAD_DANGER_TYPE_NOT_DANGEROUS,
save_path);
save_path, content::DOWNLOAD_INTERRUPT_REASON_NONE);
return true;
}

View File

@@ -11,27 +11,28 @@ namespace atom {
void BridgeTaskRunner::MessageLoopIsReady() {
auto message_loop = base::MessageLoop::current();
CHECK(message_loop);
for (const TaskPair& task : tasks_) {
for (TaskPair& task : tasks_) {
message_loop->task_runner()->PostDelayedTask(
base::get<0>(task), base::get<1>(task), base::get<2>(task));
std::get<0>(task), std::move(std::get<1>(task)), std::get<2>(task));
}
for (const TaskPair& task : non_nestable_tasks_) {
for (TaskPair& task : non_nestable_tasks_) {
message_loop->task_runner()->PostNonNestableDelayedTask(
base::get<0>(task), base::get<1>(task), base::get<2>(task));
std::get<0>(task), std::move(std::get<1>(task)), std::get<2>(task));
}
}
bool BridgeTaskRunner::PostDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) {
auto message_loop = base::MessageLoop::current();
if (!message_loop) {
tasks_.push_back(std::make_tuple(from_here, task, delay));
tasks_.push_back(std::make_tuple(from_here, std::move(task), delay));
return true;
}
return message_loop->task_runner()->PostDelayedTask(from_here, task, delay);
return message_loop->task_runner()->PostDelayedTask(
from_here, std::move(task), delay);
}
bool BridgeTaskRunner::RunsTasksOnCurrentThread() const {
@@ -44,16 +45,17 @@ bool BridgeTaskRunner::RunsTasksOnCurrentThread() const {
bool BridgeTaskRunner::PostNonNestableDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) {
auto message_loop = base::MessageLoop::current();
if (!message_loop) {
non_nestable_tasks_.push_back(std::make_tuple(from_here, task, delay));
non_nestable_tasks_.push_back(std::make_tuple(
from_here, std::move(task), delay));
return true;
}
return message_loop->task_runner()->PostNonNestableDelayedTask(
from_here, task, delay);
from_here, std::move(task), delay);
}
} // namespace atom

View File

@@ -25,17 +25,17 @@ class BridgeTaskRunner : public base::SingleThreadTaskRunner {
// base::SingleThreadTaskRunner:
bool PostDelayedTask(const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) override;
bool RunsTasksOnCurrentThread() const override;
bool PostNonNestableDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task,
base::OnceClosure task,
base::TimeDelta delay) override;
private:
using TaskPair = std::tuple<
tracked_objects::Location, base::Closure, base::TimeDelta>;
tracked_objects::Location, base::OnceClosure, base::TimeDelta>;
std::vector<TaskPair> tasks_;
std::vector<TaskPair> non_nestable_tasks_;

View File

@@ -119,10 +119,32 @@ class Browser : public WindowListObserver {
// Returns the type name of the current user activity.
std::string GetCurrentActivityType();
// Invalidates the current user activity.
void InvalidateCurrentActivity();
// Updates the current user activity
void UpdateCurrentActivity(const std::string& type,
const base::DictionaryValue& user_info);
// Indicates that an user activity is about to be resumed.
bool WillContinueUserActivity(const std::string& type);
// Indicates a failure to resume a Handoff activity.
void DidFailToContinueUserActivity(const std::string& type,
const std::string& error);
// Resumes an activity via hand-off.
bool ContinueUserActivity(const std::string& type,
const base::DictionaryValue& user_info);
// Indicates that an activity was continued on another device.
void UserActivityWasContinued(const std::string& type,
const base::DictionaryValue& user_info);
// Gives an oportunity to update the Handoff payload.
bool UpdateUserActivityState(const std::string& type,
const base::DictionaryValue& user_info);
// Bounce the dock icon.
enum BounceType {
BOUNCE_CRITICAL = 0,

View File

@@ -4,16 +4,62 @@
#include "atom/browser/browser.h"
#include <fcntl.h>
#include <stdlib.h>
#include "atom/browser/native_window.h"
#include "atom/browser/window_list.h"
#include "atom/common/atom_version.h"
#include "base/command_line.h"
#include "base/environment.h"
#include "base/process/launch.h"
#include "brightray/common/application_info.h"
#if defined(USE_X11)
#include "chrome/browser/ui/libgtkui/gtk_util.h"
#include "chrome/browser/ui/libgtkui/unity_service.h"
#endif
namespace atom {
const char kXdgSettings[] = "xdg-settings";
const char kXdgSettingsDefaultSchemeHandler[] = "default-url-scheme-handler";
bool LaunchXdgUtility(const std::vector<std::string>& argv, int* exit_code) {
*exit_code = EXIT_FAILURE;
int devnull = open("/dev/null", O_RDONLY);
if (devnull < 0) return false;
base::LaunchOptions options;
base::FileHandleMappingVector remap;
remap.push_back(std::make_pair(devnull, STDIN_FILENO));
options.fds_to_remap = &remap;
base::Process process = base::LaunchProcess(argv, options);
close(devnull);
if (!process.IsValid()) return false;
return process.WaitForExit(exit_code);
}
bool SetDefaultWebClient(const std::string& protocol) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
std::vector<std::string> argv;
argv.push_back(kXdgSettings);
argv.push_back("set");
if (!protocol.empty()) {
argv.push_back(kXdgSettingsDefaultSchemeHandler);
argv.push_back(protocol);
}
argv.push_back(libgtkui::GetDesktopName(env.get()));
int exit_code;
bool ran_ok = LaunchXdgUtility(argv, &exit_code);
return ran_ok && exit_code == EXIT_SUCCESS;
}
void Browser::Focus() {
// Focus on the first visible window.
for (const auto& window : WindowList::GetWindows()) {
@@ -33,18 +79,40 @@ void Browser::ClearRecentDocuments() {
void Browser::SetAppUserModelID(const base::string16& name) {
}
bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol,
mate::Arguments* args) {
return false;
}
bool Browser::SetAsDefaultProtocolClient(const std::string& protocol,
mate::Arguments* args) {
return false;
return SetDefaultWebClient(protocol);
}
bool Browser::IsDefaultProtocolClient(const std::string& protocol,
mate::Arguments* args) {
std::unique_ptr<base::Environment> env(base::Environment::Create());
if (protocol.empty()) return false;
std::vector<std::string> argv;
argv.push_back(kXdgSettings);
argv.push_back("check");
argv.push_back(kXdgSettingsDefaultSchemeHandler);
argv.push_back(protocol);
argv.push_back(libgtkui::GetDesktopName(env.get()));
std::string reply;
int success_code;
bool ran_ok = base::GetAppOutputWithExitCode(base::CommandLine(argv),
&reply, &success_code);
if (!ran_ok || success_code != EXIT_SUCCESS) return false;
// Allow any reply that starts with "yes".
return base::StartsWith(reply, "yes", base::CompareCase::SENSITIVE)
? true
: false;
}
// Todo implement
bool Browser::RemoveAsDefaultProtocolClient(const std::string& protocol,
mate::Arguments* args) {
return false;
}

View File

@@ -144,6 +144,30 @@ std::string Browser::GetCurrentActivityType() {
return base::SysNSStringToUTF8(userActivity.activityType);
}
void Browser::InvalidateCurrentActivity() {
[[AtomApplication sharedApplication] invalidateCurrentActivity];
}
void Browser::UpdateCurrentActivity(const std::string& type,
const base::DictionaryValue& user_info) {
[[AtomApplication sharedApplication]
updateCurrentActivity:base::SysUTF8ToNSString(type)
withUserInfo:DictionaryValueToNSDictionary(user_info)];
}
bool Browser::WillContinueUserActivity(const std::string& type) {
bool prevent_default = false;
for (BrowserObserver& observer : observers_)
observer.OnWillContinueUserActivity(&prevent_default, type);
return prevent_default;
}
void Browser::DidFailToContinueUserActivity(const std::string& type,
const std::string& error) {
for (BrowserObserver& observer : observers_)
observer.OnDidFailToContinueUserActivity(type, error);
}
bool Browser::ContinueUserActivity(const std::string& type,
const base::DictionaryValue& user_info) {
bool prevent_default = false;
@@ -152,6 +176,20 @@ bool Browser::ContinueUserActivity(const std::string& type,
return prevent_default;
}
void Browser::UserActivityWasContinued(const std::string& type,
const base::DictionaryValue& user_info) {
for (BrowserObserver& observer : observers_)
observer.OnUserActivityWasContinued(type, user_info);
}
bool Browser::UpdateUserActivityState(const std::string& type,
const base::DictionaryValue& user_info) {
bool prevent_default = false;
for (BrowserObserver& observer : observers_)
observer.OnUpdateUserActivityState(&prevent_default, type, user_info);
return prevent_default;
}
Browser::LoginItemSettings Browser::GetLoginItemSettings(
const LoginItemSettings& options) {
LoginItemSettings settings;

View File

@@ -59,12 +59,28 @@ class BrowserObserver {
virtual void OnPreMainMessageLoopRun() {}
#if defined(OS_MACOSX)
// The browser wants to report that an user activity will resume. (macOS only)
virtual void OnWillContinueUserActivity(
bool* prevent_default,
const std::string& type) {}
// The browser wants to report an user activity resuming error. (macOS only)
virtual void OnDidFailToContinueUserActivity(
const std::string& type,
const std::string& error) {}
// The browser wants to resume a user activity via handoff. (macOS only)
virtual void OnContinueUserActivity(
bool* prevent_default,
const std::string& type,
const base::DictionaryValue& user_info) {}
// The browser wants to notify that an user activity was resumed. (macOS only)
virtual void OnUserActivityWasContinued(
const std::string& type,
const base::DictionaryValue& user_info) {}
// The browser wants to update an user activity payload. (macOS only)
virtual void OnUpdateUserActivityState(
bool* prevent_default,
const std::string& type,
const base::DictionaryValue& user_info) {}
// User clicked the native macOS new tab button. (macOS only)
virtual void OnNewWindowForTab() {}
#endif

View File

@@ -14,6 +14,7 @@
#include "atom/browser/web_dialog_helper.h"
#include "atom/common/atom_constants.h"
#include "base/files/file_util.h"
#include "base/memory/ptr_util.h"
#include "chrome/browser/printing/print_preview_message_handler.h"
#include "chrome/browser/printing/print_view_manager_basic.h"
#include "chrome/browser/ssl/security_state_tab_helper.h"
@@ -300,7 +301,7 @@ void CommonWebContentsDelegate::DevToolsSaveToFile(
settings.title = url;
settings.default_path = base::FilePath::FromUTF8Unsafe(url);
if (!file_dialog::ShowSaveDialog(settings, &path)) {
base::StringValue url_value(url);
base::Value url_value(url);
web_contents_->CallClientFunction(
"DevToolsAPI.canceledSaveURL", &url_value, nullptr, nullptr);
return;
@@ -384,7 +385,7 @@ void CommonWebContentsDelegate::DevToolsAddFileSystem(
auto pref_service = GetPrefService(GetDevToolsWebContents());
DictionaryPrefUpdate update(pref_service, prefs::kDevToolsFileSystemPaths);
update.Get()->SetWithoutPathExpansion(
path.AsUTF8Unsafe(), base::Value::CreateNullValue());
path.AsUTF8Unsafe(), base::MakeUnique<base::Value>());
web_contents_->CallClientFunction("DevToolsAPI.fileSystemAdded",
file_system_value.get(),
@@ -404,7 +405,7 @@ void CommonWebContentsDelegate::DevToolsRemoveFileSystem(
DictionaryPrefUpdate update(pref_service, prefs::kDevToolsFileSystemPaths);
update.Get()->RemoveWithoutPathExpansion(path, nullptr);
base::StringValue file_system_path_value(path);
base::Value file_system_path_value(path);
web_contents_->CallClientFunction("DevToolsAPI.fileSystemRemoved",
&file_system_path_value,
nullptr, nullptr);
@@ -468,7 +469,7 @@ void CommonWebContentsDelegate::DevToolsSearchInPath(
void CommonWebContentsDelegate::OnDevToolsSaveToFile(
const std::string& url) {
// Notify DevTools.
base::StringValue url_value(url);
base::Value url_value(url);
web_contents_->CallClientFunction(
"DevToolsAPI.savedURL", &url_value, nullptr, nullptr);
}
@@ -476,7 +477,7 @@ void CommonWebContentsDelegate::OnDevToolsSaveToFile(
void CommonWebContentsDelegate::OnDevToolsAppendToFile(
const std::string& url) {
// Notify DevTools.
base::StringValue url_value(url);
base::Value url_value(url);
web_contents_->CallClientFunction(
"DevToolsAPI.appendedToURL", &url_value, nullptr, nullptr);
}
@@ -486,7 +487,7 @@ void CommonWebContentsDelegate::OnDevToolsIndexingWorkCalculated(
const std::string& file_system_path,
int total_work) {
base::Value request_id_value(request_id);
base::StringValue file_system_path_value(file_system_path);
base::Value file_system_path_value(file_system_path);
base::Value total_work_value(total_work);
web_contents_->CallClientFunction("DevToolsAPI.indexingTotalWorkCalculated",
&request_id_value,
@@ -499,7 +500,7 @@ void CommonWebContentsDelegate::OnDevToolsIndexingWorked(
const std::string& file_system_path,
int worked) {
base::Value request_id_value(request_id);
base::StringValue file_system_path_value(file_system_path);
base::Value file_system_path_value(file_system_path);
base::Value worked_value(worked);
web_contents_->CallClientFunction("DevToolsAPI.indexingWorked",
&request_id_value,
@@ -512,7 +513,7 @@ void CommonWebContentsDelegate::OnDevToolsIndexingDone(
const std::string& file_system_path) {
devtools_indexing_jobs_.erase(request_id);
base::Value request_id_value(request_id);
base::StringValue file_system_path_value(file_system_path);
base::Value file_system_path_value(file_system_path);
web_contents_->CallClientFunction("DevToolsAPI.indexingDone",
&request_id_value,
&file_system_path_value,
@@ -528,7 +529,7 @@ void CommonWebContentsDelegate::OnDevToolsSearchCompleted(
file_paths_value.AppendString(file_path);
}
base::Value request_id_value(request_id);
base::StringValue file_system_path_value(file_system_path);
base::Value file_system_path_value(file_system_path);
web_contents_->CallClientFunction("DevToolsAPI.searchCompleted",
&request_id_value,
&file_system_path_value,

View File

@@ -20,11 +20,11 @@ void CommonWebContentsDelegate::HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) {
if (event.skip_in_browser ||
event.type() == content::NativeWebKeyboardEvent::Char)
event.GetType() == content::NativeWebKeyboardEvent::kChar)
return;
// Escape exits tabbed fullscreen mode.
if (event.windowsKeyCode == ui::VKEY_ESCAPE && is_html_fullscreen())
if (event.windows_key_code == ui::VKEY_ESCAPE && is_html_fullscreen())
ExitFullscreenModeForTab(source);
if (!ignore_menu_shortcuts_) {

View File

@@ -19,7 +19,7 @@ void CommonWebContentsDelegate::HandleKeyboardEvent(
content::WebContents* source,
const content::NativeWebKeyboardEvent& event) {
// Escape exits tabbed fullscreen mode.
if (event.windowsKeyCode == ui::VKEY_ESCAPE && is_html_fullscreen())
if (event.windows_key_code == ui::VKEY_ESCAPE && is_html_fullscreen())
ExitFullscreenModeForTab(source);
// Let the NativeWindow handle other parts.

View File

@@ -33,7 +33,7 @@ class BluetoothChooser : public content::BluetoothChooser {
bool is_gatt_connected,
bool is_paired,
int signal_strength_level) override;
void RemoveDevice(const std::string& device_id) override;
void RemoveDevice(const std::string& device_id);
private:
std::vector<DeviceInfo> device_list_;

View File

@@ -6,10 +6,13 @@
#import "base/mac/scoped_nsobject.h"
@interface AtomApplication : NSApplication<CrAppProtocol,
CrAppControlProtocol> {
CrAppControlProtocol,
NSUserActivityDelegate> {
@private
BOOL handlingSendEvent_;
base::scoped_nsobject<NSUserActivity> currentActivity_;
NSCondition* handoffLock_;
BOOL updateReceived_;
}
+ (AtomApplication*)sharedApplication;
@@ -24,5 +27,8 @@
- (void)setCurrentActivity:(NSString*)type
withUserInfo:(NSDictionary*)userInfo
withWebpageURL:(NSURL*)webpageURL;
- (void)invalidateCurrentActivity;
- (void)updateCurrentActivity:(NSString*)type
withUserInfo:(NSDictionary*)userInfo;
@end

View File

@@ -4,11 +4,23 @@
#import "atom/browser/mac/atom_application.h"
#include "atom/browser/mac/dict_util.h"
#include "atom/browser/browser.h"
#include "base/auto_reset.h"
#include "base/strings/sys_string_conversions.h"
#include "content/public/browser/browser_accessibility_state.h"
namespace {
inline void dispatch_sync_main(dispatch_block_t block) {
if ([NSThread isMainThread])
block();
else
dispatch_sync(dispatch_get_main_queue(), block);
}
} // namespace
@implementation AtomApplication
+ (AtomApplication*)sharedApplication {
@@ -35,19 +47,78 @@
[[NSUserActivity alloc] initWithActivityType:type]);
[currentActivity_ setUserInfo:userInfo];
[currentActivity_ setWebpageURL:webpageURL];
[currentActivity_ setDelegate:self];
[currentActivity_ becomeCurrent];
[currentActivity_ setNeedsSave:YES];
}
- (NSUserActivity*)getCurrentActivity {
return currentActivity_.get();
}
- (void)invalidateCurrentActivity {
if (currentActivity_) {
[currentActivity_ invalidate];
currentActivity_.reset();
}
}
- (void)updateCurrentActivity:(NSString*)type
withUserInfo:(NSDictionary*)userInfo {
if (currentActivity_) {
[currentActivity_ addUserInfoEntriesFromDictionary:userInfo];
}
[handoffLock_ lock];
updateReceived_ = YES;
[handoffLock_ signal];
[handoffLock_ unlock];
}
- (void)userActivityWillSave:(NSUserActivity *)userActivity {
__block BOOL shouldWait = NO;
dispatch_sync_main(^{
std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType));
std::unique_ptr<base::DictionaryValue> user_info =
atom::NSDictionaryToDictionaryValue(userActivity.userInfo);
atom::Browser* browser = atom::Browser::Get();
shouldWait = browser->UpdateUserActivityState(activity_type, *user_info) ? YES : NO;
});
if (shouldWait) {
[handoffLock_ lock];
updateReceived_ = NO;
while (!updateReceived_) {
BOOL isSignaled = [handoffLock_ waitUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
if (!isSignaled) break;
}
[handoffLock_ unlock];
}
[userActivity setNeedsSave:YES];
}
- (void)userActivityWasContinued:(NSUserActivity *)userActivity {
dispatch_async(dispatch_get_main_queue(), ^{
std::string activity_type(base::SysNSStringToUTF8(userActivity.activityType));
std::unique_ptr<base::DictionaryValue> user_info =
atom::NSDictionaryToDictionaryValue(userActivity.userInfo);
atom::Browser* browser = atom::Browser::Get();
browser->UserActivityWasContinued(activity_type, *user_info);
});
[userActivity setNeedsSave:YES];
}
- (void)awakeFromNib {
[[NSAppleEventManager sharedAppleEventManager]
setEventHandler:self
andSelector:@selector(handleURLEvent:withReplyEvent:)
forEventClass:kInternetEventClass
andEventID:kAEGetURL];
handoffLock_ = [NSCondition new];
}
- (void)handleURLEvent:(NSAppleEventDescriptor*)event
@@ -72,6 +143,9 @@
bool enableAccessibility = ([self voiceOverEnabled] && [value boolValue]);
[self updateAccessibilityEnabled:enableAccessibility];
}
else if ([attribute isEqualToString:@"AXManualAccessibility"]) {
[self updateAccessibilityEnabled:[value boolValue]];
}
return [super accessibilitySetValue:value forAttribute:attribute];
}

View File

@@ -7,9 +7,36 @@
#import "atom/browser/mac/atom_application.h"
#include "atom/browser/browser.h"
#include "atom/browser/mac/dict_util.h"
#include "base/allocator/allocator_shim.h"
#include "base/allocator/features.h"
#include "base/mac/mac_util.h"
#include "base/mac/scoped_objc_class_swizzler.h"
#include "base/strings/sys_string_conversions.h"
#include "base/values.h"
#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM)
// On macOS 10.12, the IME system attempts to allocate a 2^64 size buffer,
// which would typically cause an OOM crash. To avoid this, the problematic
// method is swizzled out and the make-OOM-fatal bit is disabled for the
// duration of the original call. https://crbug.com/654695
static base::mac::ScopedObjCClassSwizzler* g_swizzle_imk_input_session;
@interface OOMDisabledIMKInputSession : NSObject
@end
@implementation OOMDisabledIMKInputSession
- (void)_coreAttributesFromRange:(NSRange)range
whichAttributes:(long long)attributes
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
// than crashing when using IME.
base::allocator::SetCallNewHandlerOnMallocFailure(false);
g_swizzle_imk_input_session->GetOriginalImplementation()(self, _cmd, range,
attributes, block);
base::allocator::SetCallNewHandlerOnMallocFailure(true);
}
@end
#endif // BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM)
@implementation AtomApplicationDelegate
- (void)setApplicationDockMenu:(atom::AtomMenuModel*)model {
@@ -35,6 +62,16 @@
std::unique_ptr<base::DictionaryValue> empty_info(new base::DictionaryValue);
atom::Browser::Get()->DidFinishLaunching(*empty_info);
}
#if BUILDFLAG(USE_EXPERIMENTAL_ALLOCATOR_SHIM)
// Disable fatal OOM to hack around an OS bug https://crbug.com/654695.
if (base::mac::IsOS10_12()) {
g_swizzle_imk_input_session = new base::mac::ScopedObjCClassSwizzler(
NSClassFromString(@"IMKInputSession"),
[OOMDisabledIMKInputSession class],
@selector(_coreAttributesFromRange:whichAttributes:completionHandler:));
}
#endif
}
- (NSMenu*)applicationDockMenu:(NSApplication*)sender {
@@ -81,6 +118,21 @@ continueUserActivity:(NSUserActivity*)userActivity
return browser->ContinueUserActivity(activity_type, *user_info) ? YES : NO;
}
- (BOOL)application:(NSApplication*)application willContinueUserActivityWithType:(NSString*)userActivityType {
std::string activity_type(base::SysNSStringToUTF8(userActivityType));
atom::Browser* browser = atom::Browser::Get();
return browser->WillContinueUserActivity(activity_type) ? YES : NO;
}
- (void)application:(NSApplication*)application didFailToContinueUserActivityWithType:(NSString*)userActivityType error:(NSError*)error {
std::string activity_type(base::SysNSStringToUTF8(userActivityType));
std::string error_message(base::SysNSStringToUTF8([error localizedDescription]));
atom::Browser* browser = atom::Browser::Get();
browser->DidFailToContinueUserActivity(activity_type, error_message);
}
- (IBAction)newWindowForTab:(id)sender {
atom::Browser::Get()->NewWindowForTab();
}

View File

@@ -5,6 +5,7 @@
#include "atom/browser/mac/dict_util.h"
#include "base/json/json_writer.h"
#include "base/memory/ptr_util.h"
#include "base/strings/sys_string_conversions.h"
#include "base/values.h"
@@ -45,14 +46,14 @@ std::unique_ptr<base::ListValue> NSArrayToListValue(NSArray* arr) {
if (sub_arr)
result->Append(std::move(sub_arr));
else
result->Append(base::Value::CreateNullValue());
result->Append(base::MakeUnique<base::Value>());
} else if ([value isKindOfClass:[NSDictionary class]]) {
std::unique_ptr<base::DictionaryValue> sub_dict =
NSDictionaryToDictionaryValue(value);
if (sub_dict)
result->Append(std::move(sub_dict));
else
result->Append(base::Value::CreateNullValue());
result->Append(base::MakeUnique<base::Value>());
} else {
result->AppendString(base::SysNSStringToUTF8([value description]));
}
@@ -104,7 +105,7 @@ std::unique_ptr<base::DictionaryValue> NSDictionaryToDictionaryValue(
result->SetWithoutPathExpansion(str_key, std::move(sub_arr));
else
result->SetWithoutPathExpansion(str_key,
base::Value::CreateNullValue());
base::MakeUnique<base::Value>());
} else if ([value isKindOfClass:[NSDictionary class]]) {
std::unique_ptr<base::DictionaryValue> sub_dict =
NSDictionaryToDictionaryValue(value);
@@ -112,7 +113,7 @@ std::unique_ptr<base::DictionaryValue> NSDictionaryToDictionaryValue(
result->SetWithoutPathExpansion(str_key, std::move(sub_dict));
else
result->SetWithoutPathExpansion(str_key,
base::Value::CreateNullValue());
base::MakeUnique<base::Value>());
} else {
result->SetStringWithoutPathExpansion(
str_key,

View File

@@ -43,10 +43,20 @@ const NSAutoresizingMaskOptions kDefaultAutoResizingMask =
- (void)mouseDown:(NSEvent *)event
{
if ([self.window respondsToSelector:@selector(performWindowDragWithEvent)]) {
// According to Google, using performWindowDragWithEvent:
// does not generate a NSWindowWillMoveNotification. Hence post one.
[[NSNotificationCenter defaultCenter]
postNotificationName:NSWindowWillMoveNotification
object:self];
[self.window performWindowDragWithEvent:event];
return;
}
if (self.window.styleMask & NSFullScreenWindowMask) {
return;
}
self.initialLocation = [event locationInWindow];
}
@@ -56,17 +66,53 @@ const NSAutoresizingMaskOptions kDefaultAutoResizingMask =
return;
}
if (self.window.styleMask & NSFullScreenWindowMask) {
return;
}
NSPoint currentLocation = [NSEvent mouseLocation];
NSPoint newOrigin;
NSRect screenFrame = [[NSScreen mainScreen] frame];
NSSize screenSize = screenFrame.size;
NSRect windowFrame = [self.window frame];
NSSize windowSize = windowFrame.size;
newOrigin.x = currentLocation.x - self.initialLocation.x;
newOrigin.y = currentLocation.y - self.initialLocation.y;
BOOL inMenuBar = (newOrigin.y + windowSize.height) > (screenFrame.origin.y + screenSize.height);
BOOL screenAboveMainScreen = false;
if (inMenuBar) {
for (NSScreen *screen in [NSScreen screens]) {
NSRect currentScreenFrame = [screen frame];
BOOL isHigher = currentScreenFrame.origin.y > screenFrame.origin.y;
// If there's another screen that is generally above the current screen,
// we'll draw a new rectangle that is just above the current screen. If the
// "higher" screen intersects with this rectangle, we'll allow drawing above
// the menubar.
if (isHigher) {
NSRect aboveScreenRect = NSMakeRect(
screenFrame.origin.x,
screenFrame.origin.y + screenFrame.size.height - 10,
screenFrame.size.width,
200
);
BOOL screenAboveIntersects = NSIntersectsRect(currentScreenFrame, aboveScreenRect);
if (screenAboveIntersects) {
screenAboveMainScreen = true;
break;
}
}
}
}
// Don't let window get dragged up under the menu bar
if ((newOrigin.y + windowFrame.size.height) > (screenFrame.origin.y + screenFrame.size.height)) {
if (inMenuBar && !screenAboveMainScreen) {
newOrigin.y = screenFrame.origin.y + (screenFrame.size.height - windowFrame.size.height);
}

View File

@@ -159,6 +159,10 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
if (options.Get(options::kHasShadow, &has_shadow)) {
SetHasShadow(has_shadow);
}
double opacity;
if (options.Get(options::kOpacity, &opacity)) {
SetOpacity(opacity);
}
bool top;
if (options.Get(options::kAlwaysOnTop, &top) && top) {
SetAlwaysOnTop(true);
@@ -336,6 +340,24 @@ void NativeWindow::SetParentWindow(NativeWindow* parent) {
void NativeWindow::SetAutoHideCursor(bool auto_hide) {
}
void NativeWindow::SelectPreviousTab() {
}
void NativeWindow::SelectNextTab() {
}
void NativeWindow::MergeAllWindows() {
}
void NativeWindow::MoveTabToNewWindow() {
}
void NativeWindow::ToggleTabBar() {
}
void NativeWindow::AddTabbedWindow(NativeWindow* window) {
}
void NativeWindow::SetVibrancy(const std::string& filename) {
}

View File

@@ -134,16 +134,20 @@ class NativeWindow : public base::SupportsUserData,
virtual std::string GetTitle() = 0;
virtual void FlashFrame(bool flash) = 0;
virtual void SetSkipTaskbar(bool skip) = 0;
virtual void SetSimpleFullScreen(bool simple_fullscreen) = 0;
virtual bool IsSimpleFullScreen() = 0;
virtual void SetKiosk(bool kiosk) = 0;
virtual bool IsKiosk() = 0;
virtual void SetBackgroundColor(const std::string& color_name) = 0;
virtual void SetHasShadow(bool has_shadow) = 0;
virtual bool HasShadow() = 0;
virtual void SetOpacity(const double opacity) = 0;
virtual double GetOpacity() = 0;
virtual void SetRepresentedFilename(const std::string& filename);
virtual std::string GetRepresentedFilename();
virtual void SetDocumentEdited(bool edited);
virtual bool IsDocumentEdited();
virtual void SetIgnoreMouseEvents(bool ignore) = 0;
virtual void SetIgnoreMouseEvents(bool ignore, bool forward) = 0;
virtual void SetContentProtection(bool enable) = 0;
virtual void SetFocusable(bool focusable);
virtual void SetMenu(AtomMenuModel* menu);
@@ -182,6 +186,14 @@ class NativeWindow : public base::SupportsUserData,
virtual void RefreshTouchBarItem(const std::string& item_id);
virtual void SetEscapeTouchBarItem(const mate::PersistentDictionary& item);
// Native Tab API
virtual void SelectPreviousTab();
virtual void SelectNextTab();
virtual void MergeAllWindows();
virtual void MoveTabToNewWindow();
virtual void ToggleTabBar();
virtual void AddTabbedWindow(NativeWindow* window);
// Webview APIs.
virtual void FocusOnWebView();
virtual void BlurWebView();

View File

@@ -76,16 +76,20 @@ class NativeWindowMac : public NativeWindow,
std::string GetTitle() override;
void FlashFrame(bool flash) override;
void SetSkipTaskbar(bool skip) override;
void SetSimpleFullScreen(bool simple_fullscreen) override;
bool IsSimpleFullScreen() override;
void SetKiosk(bool kiosk) override;
bool IsKiosk() override;
void SetBackgroundColor(const std::string& color_name) override;
void SetHasShadow(bool has_shadow) override;
bool HasShadow() override;
void SetOpacity(const double opacity) override;
double GetOpacity() override;
void SetRepresentedFilename(const std::string& filename) override;
std::string GetRepresentedFilename() override;
void SetDocumentEdited(bool edited) override;
bool IsDocumentEdited() override;
void SetIgnoreMouseEvents(bool ignore) override;
void SetIgnoreMouseEvents(bool ignore, bool) override;
void SetContentProtection(bool enable) override;
void SetBrowserView(NativeBrowserView* browser_view) override;
void SetParentWindow(NativeWindow* parent) override;
@@ -101,6 +105,13 @@ class NativeWindowMac : public NativeWindow,
void SetAutoHideCursor(bool auto_hide) override;
void SelectPreviousTab() override;
void SelectNextTab() override;
void MergeAllWindows() override;
void MoveTabToNewWindow() override;
void ToggleTabBar() override;
void AddTabbedWindow(NativeWindow* window) override;
void SetVibrancy(const std::string& type) override;
void SetTouchBar(
const std::vector<mate::PersistentDictionary>& items) override;
@@ -135,6 +146,8 @@ class NativeWindowMac : public NativeWindow,
bool fullscreen_window_title() const { return fullscreen_window_title_; }
bool simple_fullscreen() const { return always_simple_fullscreen_; }
protected:
// Return a vector of non-draggable regions that fill a window of size
// |width| by |height|, but leave gaps where the window should be draggable.
@@ -148,6 +161,7 @@ class NativeWindowMac : public NativeWindow,
void UpdateDraggableRegions(
const std::vector<DraggableRegion>& regions) override;
void InternalSetParentWindow(NativeWindow* parent, bool attach);
void ShowWindowButton(NSWindowButton button);
void InstallView();
@@ -189,6 +203,17 @@ class NativeWindowMac : public NativeWindow,
// The "titleBarStyle" option.
TitleBarStyle title_bar_style_;
// Simple (pre-Lion) Fullscreen Settings
bool always_simple_fullscreen_;
bool is_simple_fullscreen_;
bool was_maximizable_;
bool was_movable_;
NSRect original_frame_;
NSUInteger simple_fullscreen_mask_;
// The presentation options before entering simple fullscreen mode.
NSApplicationPresentationOptions simple_fullscreen_options_;
DISALLOW_COPY_AND_ASSIGN(NativeWindowMac);
};

View File

@@ -4,6 +4,7 @@
#include "atom/browser/native_window_mac.h"
#include <AvailabilityMacros.h>
#include <Quartz/Quartz.h>
#include <string>
@@ -173,6 +174,7 @@ bool ScopedDisableResize::disable_resize_ = false;
atom::NativeWindowMac* shell_;
bool is_zooming_;
int level_;
bool is_resizable_;
}
- (id)initWithShell:(atom::NativeWindowMac*)shell;
@end
@@ -335,6 +337,9 @@ bool ScopedDisableResize::disable_resize_ = false;
}
- (void)windowWillEnterFullScreen:(NSNotification*)notification {
// Setting resizable to true before entering fullscreen
is_resizable_ = shell_->IsResizable();
shell_->SetResizable(true);
// Hide the native toolbar before entering fullscreen, so there is no visual
// artifacts.
if (base::mac::IsAtLeastOS10_10() &&
@@ -394,6 +399,7 @@ bool ScopedDisableResize::disable_resize_ = false;
}
- (void)windowDidExitFullScreen:(NSNotification*)notification {
shell_->SetResizable(is_resizable_);
shell_->NotifyWindowLeaveFullScreen();
}
@@ -460,7 +466,7 @@ bool ScopedDisableResize::disable_resize_ = false;
@end
#if !defined(MAC_OS_X_VERSION_10_12)
#if !defined(AVAILABLE_MAC_OS_X_VERSION_10_12_AND_LATER)
enum {
NSWindowTabbingModeDisallowed = 2
@@ -469,9 +475,15 @@ enum {
@interface NSWindow (SierraSDK)
- (void)setTabbingMode:(NSInteger)mode;
- (void)setTabbingIdentifier:(NSString*)identifier;
- (void)addTabbedWindow:(NSWindow*)window ordered:(NSWindowOrderingMode)ordered;
- (IBAction)selectPreviousTab:(id)sender;
- (IBAction)selectNextTab:(id)sender;
- (IBAction)mergeAllWindows:(id)sender;
- (IBAction)moveTabToNewWindow:(id)sender;
- (IBAction)toggleTabBar:(id)sender;
@end
#endif // MAC_OS_X_VERSION_10_12
#endif
@interface AtomNSWindow : EventDispatchingWindow<QLPreviewPanelDataSource, QLPreviewPanelDelegate, NSTouchBarDelegate> {
@private
@@ -720,6 +732,13 @@ enum {
[super performClose:sender];
}
- (void)toggleFullScreen:(id)sender {
if (shell_->simple_fullscreen())
shell_->SetSimpleFullScreen(!shell_->IsSimpleFullScreen());
else
[super toggleFullScreen:sender];
}
- (void)performMiniaturize:(id)sender {
if (shell_->title_bar_style() == atom::NativeWindowMac::CUSTOM_BUTTONS_ON_HOVER)
[self miniaturize:self];
@@ -819,7 +838,9 @@ NativeWindowMac::NativeWindowMac(
zoom_to_page_width_(false),
fullscreen_window_title_(false),
attention_request_id_(0),
title_bar_style_(NORMAL) {
title_bar_style_(NORMAL),
always_simple_fullscreen_(false),
is_simple_fullscreen_(false) {
int width = 800, height = 600;
options.Get(options::kWidth, &width);
options.Get(options::kHeight, &height);
@@ -965,6 +986,8 @@ NativeWindowMac::NativeWindowMac(
options.Get(options::kFullscreenWindowTitle, &fullscreen_window_title_);
options.Get(options::kSimpleFullScreen, &always_simple_fullscreen_);
// Enable the NSView to accept first mouse event.
bool acceptsFirstMouse = false;
options.Get(options::kAcceptFirstMouse, &acceptsFirstMouse);
@@ -1065,6 +1088,10 @@ void NativeWindowMac::Show() {
return;
}
// Reattach the window to the parent to actually show it.
if (parent())
InternalSetParentWindow(parent(), true);
// This method is supposed to put focus on window, however if the app does not
// have focus then "makeKeyAndOrderFront" will only show the window.
[NSApp activateIgnoringOtherApps:YES];
@@ -1073,6 +1100,10 @@ void NativeWindowMac::Show() {
}
void NativeWindowMac::ShowInactive() {
// Reattach the window to the parent to actually show it.
if (parent())
InternalSetParentWindow(parent(), true);
[window_ orderFrontRegardless];
}
@@ -1083,6 +1114,10 @@ void NativeWindowMac::Hide() {
return;
}
// Deattach the window from the parent before.
if (parent())
InternalSetParentWindow(parent(), false);
[window_ orderOut:nil];
}
@@ -1351,6 +1386,80 @@ void NativeWindowMac::FlashFrame(bool flash) {
void NativeWindowMac::SetSkipTaskbar(bool skip) {
}
void NativeWindowMac::SetSimpleFullScreen(bool simple_fullscreen) {
NSWindow* window = GetNativeWindow();
if (simple_fullscreen && !is_simple_fullscreen_) {
is_simple_fullscreen_ = true;
// Take note of the current window size
original_frame_ = [window frame];
simple_fullscreen_options_ = [NSApp currentSystemPresentationOptions];
simple_fullscreen_mask_ = [window styleMask];
// We can simulate the pre-Lion fullscreen by auto-hiding the dock and menu bar
NSApplicationPresentationOptions options =
NSApplicationPresentationAutoHideDock +
NSApplicationPresentationAutoHideMenuBar;
[NSApp setPresentationOptions:options];
was_maximizable_ = IsMaximizable();
was_movable_ = IsMovable();
NSRect fullscreenFrame = [window.screen frame];
if ( !fullscreen_window_title() ) {
// Hide the titlebar
SetStyleMask(false, NSTitledWindowMask);
// Resize the window to accomodate the _entire_ screen size
fullscreenFrame.size.height -= [[[NSApplication sharedApplication] mainMenu] menuBarHeight];
} else {
// No need to hide the title, but we should still hide the window buttons
[[window standardWindowButton:NSWindowZoomButton] setHidden:YES];
[[window standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
[[window standardWindowButton:NSWindowCloseButton] setHidden:YES];
}
[window setFrame:fullscreenFrame display: YES animate: YES];
// Fullscreen windows can't be resized, minimized, maximized, or moved
SetMinimizable(false);
SetResizable(false);
SetMaximizable(false);
SetMovable(false);
} else if (!simple_fullscreen && is_simple_fullscreen_) {
is_simple_fullscreen_ = false;
if ( !fullscreen_window_title() ) {
// Restore the titlebar
SetStyleMask(true, NSTitledWindowMask);
} else {
// Show the window buttons
[[window standardWindowButton:NSWindowZoomButton] setHidden:NO];
[[window standardWindowButton:NSWindowMiniaturizeButton] setHidden:NO];
[[window standardWindowButton:NSWindowCloseButton] setHidden:NO];
}
[window setFrame:original_frame_ display: YES animate: YES];
[NSApp setPresentationOptions:simple_fullscreen_options_];
// Restore original style mask
ScopedDisableResize disable_resize;
[window_ setStyleMask:simple_fullscreen_mask_];
// Restore window manipulation abilities
SetMaximizable(was_maximizable_);
SetMovable(was_movable_);
}
}
bool NativeWindowMac::IsSimpleFullScreen() {
return is_simple_fullscreen_;
}
void NativeWindowMac::SetKiosk(bool kiosk) {
if (kiosk && !is_kiosk_) {
kiosk_options_ = [NSApp currentSystemPresentationOptions];
@@ -1396,6 +1505,14 @@ bool NativeWindowMac::HasShadow() {
return [window_ hasShadow];
}
void NativeWindowMac::SetOpacity(const double opacity) {
[window_ setAlphaValue:opacity];
}
double NativeWindowMac::GetOpacity() {
return [window_ alphaValue];
}
void NativeWindowMac::SetRepresentedFilename(const std::string& filename) {
[window_ setRepresentedFilename:base::SysUTF8ToNSString(filename)];
}
@@ -1412,7 +1529,7 @@ bool NativeWindowMac::IsDocumentEdited() {
return [window_ isDocumentEdited];
}
void NativeWindowMac::SetIgnoreMouseEvents(bool ignore) {
void NativeWindowMac::SetIgnoreMouseEvents(bool ignore, bool) {
[window_ setIgnoresMouseEvents:ignore];
}
@@ -1442,18 +1559,7 @@ void NativeWindowMac::SetBrowserView(NativeBrowserView* browser_view) {
}
void NativeWindowMac::SetParentWindow(NativeWindow* parent) {
if (is_modal())
return;
NativeWindow::SetParentWindow(parent);
// Remove current parent window.
if ([window_ parentWindow])
[[window_ parentWindow] removeChildWindow:window_];
// Set new current window.
if (parent)
[parent->GetNativeWindow() addChildWindow:window_ ordered:NSWindowAbove];
InternalSetParentWindow(parent, IsVisible());
}
gfx::NativeView NativeWindowMac::GetNativeView() const {
@@ -1523,6 +1629,42 @@ void NativeWindowMac::SetAutoHideCursor(bool auto_hide) {
[window_ setDisableAutoHideCursor:!auto_hide];
}
void NativeWindowMac::SelectPreviousTab() {
if ([window_ respondsToSelector:@selector(selectPreviousTab:)]) {
[window_ selectPreviousTab:nil];
}
}
void NativeWindowMac::SelectNextTab() {
if ([window_ respondsToSelector:@selector(selectNextTab:)]) {
[window_ selectNextTab:nil];
}
}
void NativeWindowMac::MergeAllWindows() {
if ([window_ respondsToSelector:@selector(mergeAllWindows:)]) {
[window_ mergeAllWindows:nil];
}
}
void NativeWindowMac::MoveTabToNewWindow() {
if ([window_ respondsToSelector:@selector(moveTabToNewWindow:)]) {
[window_ moveTabToNewWindow:nil];
}
}
void NativeWindowMac::ToggleTabBar() {
if ([window_ respondsToSelector:@selector(toggleTabBar:)]) {
[window_ toggleTabBar:nil];
}
}
void NativeWindowMac::AddTabbedWindow(NativeWindow* window) {
if ([window_ respondsToSelector:@selector(addTabbedWindow:ordered:)]) {
[window_ addTabbedWindow:window->GetNativeWindow() ordered:NSWindowAbove];
}
}
void NativeWindowMac::SetVibrancy(const std::string& type) {
if (!base::mac::IsAtLeastOS10_10()) return;
@@ -1604,10 +1746,10 @@ void NativeWindowMac::SetEscapeTouchBarItem(const mate::PersistentDictionary& it
}
void NativeWindowMac::OnInputEvent(const blink::WebInputEvent& event) {
switch (event.type()) {
case blink::WebInputEvent::GestureScrollBegin:
case blink::WebInputEvent::GestureScrollUpdate:
case blink::WebInputEvent::GestureScrollEnd:
switch (event.GetType()) {
case blink::WebInputEvent::kGestureScrollBegin:
case blink::WebInputEvent::kGestureScrollUpdate:
case blink::WebInputEvent::kGestureScrollEnd:
this->NotifyWindowScrollTouchEdge();
break;
default:
@@ -1672,6 +1814,26 @@ void NativeWindowMac::UpdateDraggableRegions(
UpdateDraggableRegionViews(regions);
}
void NativeWindowMac::InternalSetParentWindow(NativeWindow* parent, bool attach) {
if (is_modal())
return;
NativeWindow::SetParentWindow(parent);
// Do not remove/add if we are already properly attached.
if (attach && parent && [window_ parentWindow] == parent->GetNativeWindow())
return;
// Remove current parent window.
if ([window_ parentWindow])
[[window_ parentWindow] removeChildWindow:window_];
// Set new parent window.
// Note that this method will force the window to become visible.
if (parent && attach)
[parent->GetNativeWindow() addChildWindow:window_ ordered:NSWindowAbove];
}
void NativeWindowMac::ShowWindowButton(NSWindowButton button) {
auto view = [window_ standardWindowButton:button];
[view.superview addSubview:view positioned:NSWindowAbove relativeTo:nil];

View File

@@ -82,17 +82,17 @@ void FlipWindowStyle(HWND handle, bool on, DWORD flag) {
#endif
bool IsAltKey(const content::NativeWebKeyboardEvent& event) {
return event.windowsKeyCode == ui::VKEY_MENU;
return event.windows_key_code == ui::VKEY_MENU;
}
bool IsAltModifier(const content::NativeWebKeyboardEvent& event) {
typedef content::NativeWebKeyboardEvent::Modifiers Modifiers;
int modifiers = event.modifiers();
modifiers &= ~Modifiers::NumLockOn;
modifiers &= ~Modifiers::CapsLockOn;
return (modifiers == Modifiers::AltKey) ||
(modifiers == (Modifiers::AltKey | Modifiers::IsLeft)) ||
(modifiers == (Modifiers::AltKey | Modifiers::IsRight));
int modifiers = event.GetModifiers();
modifiers &= ~Modifiers::kNumLockOn;
modifiers &= ~Modifiers::kCapsLockOn;
return (modifiers == Modifiers::kAltKey) ||
(modifiers == (Modifiers::kAltKey | Modifiers::kIsLeft)) ||
(modifiers == (Modifiers::kAltKey | Modifiers::kIsRight));
}
#if defined(USE_X11)
@@ -304,11 +304,16 @@ NativeWindowViews::NativeWindowViews(
::SetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE, ex_style);
#endif
// TODO(zcbenz): This was used to force using native frame on Windows 2003, we
// should check whether setting it in InitParams can work.
if (has_frame()) {
// TODO(zcbenz): This was used to force using native frame on Windows 2003,
// we should check whether setting it in InitParams can work.
window_->set_frame_type(views::Widget::FrameType::FRAME_TYPE_FORCE_NATIVE);
window_->FrameTypeChanged();
#if defined(OS_WIN)
// thickFrame also works for normal window.
if (!thick_frame_)
FlipWindowStyle(GetAcceleratedWidget(), false, WS_THICKFRAME);
#endif
}
gfx::Size size = bounds.size();
@@ -334,6 +339,11 @@ NativeWindowViews::NativeWindowViews(
NativeWindowViews::~NativeWindowViews() {
window_->RemoveObserver(this);
#if defined(OS_WIN)
// Disable mouse forwarding to relinquish resources, should any be held.
SetForwardMouseMessages(false);
#endif
}
void NativeWindowViews::Close() {
@@ -572,6 +582,12 @@ gfx::Size NativeWindowViews::GetContentSize() {
void NativeWindowViews::SetContentSizeConstraints(
const extensions::SizeConstraints& size_constraints) {
NativeWindow::SetContentSizeConstraints(size_constraints);
#if defined(OS_WIN)
// Changing size constraints would force adding the WS_THICKFRAME style, so
// do nothing if thickFrame is false.
if (!thick_frame_)
return;
#endif
// widget_delegate() is only available after Init() is called, we make use of
// this to determine whether native widget has initialized.
if (window_ && window_->widget_delegate())
@@ -584,7 +600,7 @@ void NativeWindowViews::SetContentSizeConstraints(
void NativeWindowViews::SetResizable(bool resizable) {
#if defined(OS_WIN)
if (has_frame())
if (has_frame() && thick_frame_)
FlipWindowStyle(GetAcceleratedWidget(), resizable, WS_THICKFRAME);
#elif defined(USE_X11)
if (resizable != resizable_) {
@@ -754,6 +770,14 @@ void NativeWindowViews::SetSkipTaskbar(bool skip) {
#endif
}
void NativeWindowViews::SetSimpleFullScreen(bool simple_fullscreen) {
SetFullScreen(simple_fullscreen);
}
bool NativeWindowViews::IsSimpleFullScreen() {
return IsFullscreen();
}
void NativeWindowViews::SetKiosk(bool kiosk) {
SetFullScreen(kiosk);
}
@@ -790,14 +814,41 @@ bool NativeWindowViews::HasShadow() {
!= wm::ShadowElevation::NONE;
}
void NativeWindowViews::SetIgnoreMouseEvents(bool ignore) {
void NativeWindowViews::SetOpacity(const double opacity) {
#if defined(OS_WIN)
HWND hwnd = GetAcceleratedWidget();
if (!layered_) {
LONG ex_style = ::GetWindowLong(hwnd, GWL_EXSTYLE);
ex_style |= WS_EX_LAYERED;
::SetWindowLong(hwnd, GWL_EXSTYLE, ex_style);
layered_ = true;
}
::SetLayeredWindowAttributes(hwnd, 0, opacity * 255, LWA_ALPHA);
#endif
opacity_ = opacity;
}
double NativeWindowViews::GetOpacity() {
return opacity_;
}
void NativeWindowViews::SetIgnoreMouseEvents(bool ignore, bool forward) {
#if defined(OS_WIN)
LONG ex_style = ::GetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE);
if (ignore)
ex_style |= (WS_EX_TRANSPARENT | WS_EX_LAYERED);
else
ex_style &= ~(WS_EX_TRANSPARENT | WS_EX_LAYERED);
if (layered_)
ex_style |= WS_EX_LAYERED;
::SetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE, ex_style);
// Forwarding is always disabled when not ignoring mouse messages.
if (!ignore) {
SetForwardMouseMessages(false);
} else {
SetForwardMouseMessages(forward);
}
#elif defined(USE_X11)
if (ignore) {
XRectangle r = {0, 0, 1, 1};
@@ -1090,9 +1141,31 @@ void NativeWindowViews::OnWidgetBoundsChanged(
if (widget != window_.get())
return;
if (widget_size_ != bounds.size()) {
// Note: We intentionally use `GetBounds()` instead of `bounds` to properly
// handle minimized windows on Windows.
const auto new_bounds = GetBounds();
if (widget_size_ != new_bounds.size()) {
if (browser_view_) {
const auto flags = static_cast<NativeBrowserViewViews*>(browser_view_)
->GetAutoResizeFlags();
int width_delta = 0;
int height_delta = 0;
if (flags & kAutoResizeWidth) {
width_delta = new_bounds.width() - widget_size_.width();
}
if (flags & kAutoResizeHeight) {
height_delta = new_bounds.height() - widget_size_.height();
}
auto* view = browser_view_->GetInspectableWebContentsView()->GetView();
auto new_view_size = view->size();
new_view_size.set_width(new_view_size.width() + width_delta);
new_view_size.set_height(new_view_size.height() + height_delta);
view->SetSize(new_view_size);
}
NotifyWindowResize();
widget_size_ = bounds.size();
widget_size_ = new_bounds.size();
}
}
@@ -1252,15 +1325,15 @@ void NativeWindowViews::HandleKeyboardEvent(
// Show accelerator when "Alt" is pressed.
if (menu_bar_visible_ && IsAltKey(event))
menu_bar_->SetAcceleratorVisibility(
event.type() == blink::WebInputEvent::RawKeyDown);
event.GetType() == blink::WebInputEvent::kRawKeyDown);
// Show the submenu when "Alt+Key" is pressed.
if (event.type() == blink::WebInputEvent::RawKeyDown && !IsAltKey(event) &&
IsAltModifier(event)) {
if (event.GetType() == blink::WebInputEvent::kRawKeyDown &&
!IsAltKey(event) && IsAltModifier(event)) {
if (!menu_bar_visible_ &&
(menu_bar_->GetAcceleratorIndex(event.windowsKeyCode) != -1))
(menu_bar_->GetAcceleratorIndex(event.windows_key_code) != -1))
SetMenuBarVisibility(true);
menu_bar_->ActivateAccelerator(event.windowsKeyCode);
menu_bar_->ActivateAccelerator(event.windows_key_code);
return;
}
@@ -1268,11 +1341,11 @@ void NativeWindowViews::HandleKeyboardEvent(
return;
// Toggle the menu bar only when a single Alt is released.
if (event.type() == blink::WebInputEvent::RawKeyDown && IsAltKey(event)) {
if (event.GetType() == blink::WebInputEvent::kRawKeyDown && IsAltKey(event)) {
// When a single Alt is pressed:
menu_bar_alt_pressed_ = true;
} else if (event.type() == blink::WebInputEvent::KeyUp && IsAltKey(event) &&
menu_bar_alt_pressed_) {
} else if (event.GetType() == blink::WebInputEvent::kKeyUp &&
IsAltKey(event) && menu_bar_alt_pressed_) {
// When a single Alt is released right after a Alt is pressed:
menu_bar_alt_pressed_ = false;
SetMenuBarVisibility(!menu_bar_visible_);
@@ -1311,32 +1384,11 @@ void NativeWindowViews::Layout() {
menu_bar_->SetBoundsRect(menu_bar_bounds);
}
const auto old_web_view_size = web_view_ ? web_view_->size() : gfx::Size();
if (web_view_) {
web_view_->SetBoundsRect(
gfx::Rect(0, menu_bar_bounds.height(), size.width(),
size.height() - menu_bar_bounds.height()));
}
const auto new_web_view_size = web_view_ ? web_view_->size() : gfx::Size();
if (browser_view_) {
const auto flags = static_cast<NativeBrowserViewViews*>(browser_view_)
->GetAutoResizeFlags();
int width_delta = 0;
int height_delta = 0;
if (flags & kAutoResizeWidth) {
width_delta = new_web_view_size.width() - old_web_view_size.width();
}
if (flags & kAutoResizeHeight) {
height_delta = new_web_view_size.height() - old_web_view_size.height();
}
auto* view = browser_view_->GetInspectableWebContentsView()->GetView();
auto new_view_size = view->size();
new_view_size.set_width(new_view_size.width() + width_delta);
new_view_size.set_height(new_view_size.height() + height_delta);
view->SetSize(new_view_size);
}
}
gfx::Size NativeWindowViews::GetMinimumSize() const {

View File

@@ -7,6 +7,7 @@
#include "atom/browser/native_window.h"
#include <set>
#include <string>
#include <vector>
@@ -96,12 +97,16 @@ class NativeWindowViews : public NativeWindow,
std::string GetTitle() override;
void FlashFrame(bool flash) override;
void SetSkipTaskbar(bool skip) override;
void SetSimpleFullScreen(bool simple_fullscreen) override;
bool IsSimpleFullScreen() override;
void SetKiosk(bool kiosk) override;
bool IsKiosk() override;
void SetBackgroundColor(const std::string& color_name) override;
void SetHasShadow(bool has_shadow) override;
bool HasShadow() override;
void SetIgnoreMouseEvents(bool ignore) override;
void SetOpacity(const double opacity) override;
double GetOpacity() override;
void SetIgnoreMouseEvents(bool ignore, bool forward) override;
void SetContentProtection(bool enable) override;
void SetFocusable(bool focusable) override;
void SetMenu(AtomMenuModel* menu_model) override;
@@ -169,6 +174,12 @@ class NativeWindowViews : public NativeWindow,
bool PreHandleMSG(
UINT message, WPARAM w_param, LPARAM l_param, LRESULT* result) override;
void HandleSizeEvent(WPARAM w_param, LPARAM l_param);
void SetForwardMouseMessages(bool forward);
static LRESULT CALLBACK SubclassProc(
HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param, UINT_PTR subclass_id,
DWORD_PTR ref_data);
static LRESULT CALLBACK MouseHookProc(
int n_code, WPARAM w_param, LPARAM l_param);
#endif
// NativeWindow:
@@ -259,6 +270,13 @@ class NativeWindowViews : public NativeWindow,
// The icons of window and taskbar.
base::win::ScopedHICON window_icon_;
base::win::ScopedHICON app_icon_;
// The set of windows currently forwarding mouse messages.
static std::set<NativeWindowViews*> forwarding_windows_;
static HHOOK mouse_hook_;
bool forwarding_mouse_messages_ = false;
HWND legacy_window_ = NULL;
bool layered_ = false;
#endif
// Handles unhandled keyboard messages coming back from the renderer process.
@@ -278,6 +296,7 @@ class NativeWindowViews : public NativeWindow,
bool fullscreenable_;
std::string title_;
gfx::Size widget_size_;
double opacity_ = 1.0;
DISALLOW_COPY_AND_ASSIGN(NativeWindowViews);
};

View File

@@ -80,6 +80,9 @@ bool IsScreenReaderActive() {
} // namespace
std::set<NativeWindowViews*> NativeWindowViews::forwarding_windows_;
HHOOK NativeWindowViews::mouse_hook_ = NULL;
bool NativeWindowViews::ExecuteWindowsCommand(int command_id) {
std::string command = AppCommandToString(command_id);
NotifyWindowExecuteWindowsCommand(command);
@@ -151,6 +154,16 @@ bool NativeWindowViews::PreHandleMSG(
if (w_param) {
NotifyWindowEndSession();
}
return false;
}
case WM_PARENTNOTIFY: {
if (LOWORD(w_param) == WM_CREATE) {
// Because of reasons regarding legacy drivers and stuff, a window that
// matches the client area is created and used internally by Chromium.
// This is used when forwarding mouse messages.
legacy_window_ = reinterpret_cast<HWND>(l_param);
}
return false;
}
default:
return false;
@@ -207,4 +220,86 @@ void NativeWindowViews::HandleSizeEvent(WPARAM w_param, LPARAM l_param) {
}
}
void NativeWindowViews::SetForwardMouseMessages(bool forward) {
if (forward && !forwarding_mouse_messages_) {
forwarding_mouse_messages_ = true;
forwarding_windows_.insert(this);
// Subclassing is used to fix some issues when forwarding mouse messages;
// see comments in |SubclassProc|.
SetWindowSubclass(
legacy_window_, SubclassProc, 1, reinterpret_cast<DWORD_PTR>(this));
if (!mouse_hook_) {
mouse_hook_ = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);
}
} else if (!forward && forwarding_mouse_messages_) {
forwarding_mouse_messages_ = false;
forwarding_windows_.erase(this);
RemoveWindowSubclass(legacy_window_, SubclassProc, 1);
if (forwarding_windows_.size() == 0) {
UnhookWindowsHookEx(mouse_hook_);
mouse_hook_ = NULL;
}
}
}
LRESULT CALLBACK NativeWindowViews::SubclassProc(
HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param, UINT_PTR subclass_id,
DWORD_PTR ref_data) {
NativeWindowViews* window = reinterpret_cast<NativeWindowViews*>(ref_data);
switch (msg) {
case WM_MOUSELEAVE: {
// When input is forwarded to underlying windows, this message is posted.
// If not handled, it interferes with Chromium logic, causing for example
// mouseleave events to fire. If those events are used to exit forward
// mode, excessive flickering on for example hover items in underlying
// windows can occur due to rapidly entering and leaving forwarding mode.
// By consuming and ignoring the message, we're essentially telling
// Chromium that we have not left the window despite somebody else getting
// the messages. As to why this is catched for the legacy window and not
// the actual browser window is simply that the legacy window somehow
// makes use of these events; posting to the main window didn't work.
if (window->forwarding_mouse_messages_) {
return 0;
}
break;
}
}
return DefSubclassProc(hwnd, msg, w_param, l_param);
}
LRESULT CALLBACK NativeWindowViews::MouseHookProc(
int n_code, WPARAM w_param, LPARAM l_param) {
if (n_code < 0) {
return CallNextHookEx(NULL, n_code, w_param, l_param);
}
// Post a WM_MOUSEMOVE message for those windows whose client area contains
// the cursor since they are in a state where they would otherwise ignore all
// mouse input.
if (w_param == WM_MOUSEMOVE) {
for (auto window : forwarding_windows_) {
// At first I considered enumerating windows to check whether the cursor
// was directly above the window, but since nothing bad seems to happen
// if we post the message even if some other window occludes it I have
// just left it as is.
RECT client_rect;
GetClientRect(window->legacy_window_, &client_rect);
POINT p = reinterpret_cast<MSLLHOOKSTRUCT*>(l_param)->pt;
ScreenToClient(window->legacy_window_, &p);
if (PtInRect(&client_rect, p)) {
WPARAM w = 0; // No virtual keys pressed for our purposes
LPARAM l = MAKELPARAM(p.x, p.y);
PostMessage(window->legacy_window_, WM_MOUSEMOVE, w, l);
}
}
}
return CallNextHookEx(NULL, n_code, w_param, l_param);
}
} // namespace atom

View File

@@ -92,6 +92,7 @@ class CertVerifierRequest : public AtomCertVerifier::Request {
std::unique_ptr<VerifyRequestParams> request(new VerifyRequestParams());
request->hostname = params_.hostname();
request->default_result = net::ErrorToString(error);
request->error_code = error;
request->certificate = params_.certificate();
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,

View File

@@ -19,6 +19,7 @@ class CertVerifierRequest;
struct VerifyRequestParams {
std::string hostname;
std::string default_result;
int error_code;
scoped_refptr<net::X509Certificate> certificate;
};

View File

@@ -6,11 +6,13 @@
#include <utility>
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/common/native_mate_converters/net_converter.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "brightray/browser/net/devtools_network_transaction.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "net/url_request/url_request.h"
using brightray::DevToolsNetworkTransaction;
@@ -74,10 +76,23 @@ void ToDictionary(base::DictionaryValue* details, net::URLRequest* request) {
FillRequestDetails(details, request);
details->SetInteger("id", request->identifier());
details->SetDouble("timestamp", base::Time::Now().ToDoubleT() * 1000);
auto info = content::ResourceRequestInfo::ForRequest(request);
details->SetString("resourceType",
info ? ResourceTypeToString(info->GetResourceType())
: "other");
const auto* info = content::ResourceRequestInfo::ForRequest(request);
if (info) {
int process_id = info->GetChildID();
int frame_id = info->GetRenderFrameID();
auto* webContents = content::WebContents::FromRenderFrameHost(
content::RenderFrameHost::FromID(process_id, frame_id));
int webContentsId = atom::api::WebContents::GetIDFromWrappedClass(
webContents);
// webContentsId must be greater than zero
if (webContentsId)
details->SetInteger("webContentsId", webContentsId);
details->SetString("resourceType",
ResourceTypeToString(info->GetResourceType()));
} else {
details->SetString("resourceType", "other");
}
}
void ToDictionary(base::DictionaryValue* details,

View File

@@ -117,17 +117,13 @@ bool AtomURLRequestJobFactory::IsHandledProtocol(
net::URLRequest::IsHandledProtocol(scheme);
}
bool AtomURLRequestJobFactory::IsHandledURL(const GURL& url) const {
if (!url.is_valid()) {
bool AtomURLRequestJobFactory::IsSafeRedirectTarget(
const GURL& location) const {
if (!location.is_valid()) {
// We handle error cases.
return true;
}
return IsHandledProtocol(url.scheme());
}
bool AtomURLRequestJobFactory::IsSafeRedirectTarget(
const GURL& location) const {
return IsHandledURL(location);
return IsHandledProtocol(location.scheme());
}
} // namespace atom

View File

@@ -55,7 +55,6 @@ class AtomURLRequestJobFactory : public net::URLRequestJobFactory {
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const override;
bool IsHandledProtocol(const std::string& scheme) const override;
bool IsHandledURL(const GURL& url) const override;
bool IsSafeRedirectTarget(const GURL& location) const override;
private:

View File

@@ -33,7 +33,7 @@ URLRequestBufferJob::URLRequestBufferJob(
}
void URLRequestBufferJob::StartAsync(std::unique_ptr<base::Value> options) {
const base::BinaryValue* binary = nullptr;
const base::Value* binary = nullptr;
if (options->IsType(base::Value::Type::DICTIONARY)) {
base::DictionaryValue* dict =
static_cast<base::DictionaryValue*>(options.get());

View File

@@ -27,9 +27,9 @@ void NodeDebugger::Start() {
node::DebugOptions options;
for (auto& arg : base::CommandLine::ForCurrentProcess()->argv()) {
#if defined(OS_WIN)
options.ParseOption(base::UTF16ToUTF8(arg));
options.ParseOption("Electron", base::UTF16ToUTF8(arg));
#else
options.ParseOption(arg);
options.ParseOption("Electron", arg);
#endif
}

View File

@@ -5,6 +5,8 @@
#include "atom/browser/osr/osr_render_widget_host_view.h"
#include <algorithm>
#include <memory>
#include <utility>
#include <vector>
#include "base/callback_helpers.h"
@@ -15,10 +17,10 @@
#include "cc/output/copy_output_request.h"
#include "cc/scheduler/delay_based_time_source.h"
#include "components/display_compositor/gl_helper.h"
#include "content/browser/renderer_host/compositor_resize_lock.h"
#include "content/browser/renderer_host/render_widget_host_delegate.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_frame_subscriber.h"
#include "content/browser/renderer_host/resize_lock.h"
#include "content/common/view_messages.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/context_factory.h"
@@ -29,10 +31,10 @@
#include "ui/compositor/layer_type.h"
#include "ui/events/base_event_utils.h"
#include "ui/events/event_constants.h"
#include "ui/events/latency_info.h"
#include "ui/gfx/geometry/dip_util.h"
#include "ui/gfx/native_widget_types.h"
#include "ui/gfx/skbitmap_operations.h"
#include "ui/latency/latency_info.h"
namespace atom {
@@ -43,23 +45,23 @@ const int kFrameRetryLimit = 2;
ui::MouseEvent UiMouseEventFromWebMouseEvent(blink::WebMouseEvent event) {
ui::EventType type = ui::EventType::ET_UNKNOWN;
switch (event.type()) {
case blink::WebInputEvent::MouseDown:
switch (event.GetType()) {
case blink::WebInputEvent::kMouseDown:
type = ui::EventType::ET_MOUSE_PRESSED;
break;
case blink::WebInputEvent::MouseUp:
case blink::WebInputEvent::kMouseUp:
type = ui::EventType::ET_MOUSE_RELEASED;
break;
case blink::WebInputEvent::MouseMove:
case blink::WebInputEvent::kMouseMove:
type = ui::EventType::ET_MOUSE_MOVED;
break;
case blink::WebInputEvent::MouseEnter:
case blink::WebInputEvent::kMouseEnter:
type = ui::EventType::ET_MOUSE_ENTERED;
break;
case blink::WebInputEvent::MouseLeave:
case blink::WebInputEvent::kMouseLeave:
type = ui::EventType::ET_MOUSE_EXITED;
break;
case blink::WebInputEvent::MouseWheel:
case blink::WebInputEvent::kMouseWheel:
type = ui::EventType::ET_MOUSEWHEEL;
break;
default:
@@ -69,19 +71,19 @@ ui::MouseEvent UiMouseEventFromWebMouseEvent(blink::WebMouseEvent event) {
int button_flags = 0;
switch (event.button) {
case blink::WebMouseEvent::Button::X1:
case blink::WebMouseEvent::Button::kBack:
button_flags |= ui::EventFlags::EF_BACK_MOUSE_BUTTON;
break;
case blink::WebMouseEvent::Button::X2:
case blink::WebMouseEvent::Button::kForward:
button_flags |= ui::EventFlags::EF_FORWARD_MOUSE_BUTTON;
break;
case blink::WebMouseEvent::Button::Left:
case blink::WebMouseEvent::Button::kLeft:
button_flags |= ui::EventFlags::EF_LEFT_MOUSE_BUTTON;
break;
case blink::WebMouseEvent::Button::Middle:
case blink::WebMouseEvent::Button::kMiddle:
button_flags |= ui::EventFlags::EF_MIDDLE_MOUSE_BUTTON;
break;
case blink::WebMouseEvent::Button::Right:
case blink::WebMouseEvent::Button::kRight:
button_flags |= ui::EventFlags::EF_RIGHT_MOUSE_BUTTON;
break;
default:
@@ -90,11 +92,12 @@ ui::MouseEvent UiMouseEventFromWebMouseEvent(blink::WebMouseEvent event) {
}
ui::MouseEvent ui_event(type,
gfx::Point(std::floor(event.x), std::floor(event.y)),
gfx::Point(std::floor(event.x), std::floor(event.y)),
ui::EventTimeForNow(),
button_flags, button_flags);
ui_event.SetClickCount(event.clickCount);
gfx::Point(std::floor(event.PositionInWidget().x),
std::floor(event.PositionInWidget().y)),
gfx::Point(std::floor(event.PositionInWidget().x),
std::floor(event.PositionInWidget().y)),
ui::EventTimeForNow(), button_flags, button_flags);
ui_event.SetClickCount(event.click_count);
return ui_event;
}
@@ -102,69 +105,9 @@ ui::MouseEvent UiMouseEventFromWebMouseEvent(blink::WebMouseEvent event) {
ui::MouseWheelEvent UiMouseWheelEventFromWebMouseEvent(
blink::WebMouseWheelEvent event) {
return ui::MouseWheelEvent(UiMouseEventFromWebMouseEvent(event),
std::floor(event.deltaX), std::floor(event.deltaY));
std::floor(event.delta_x), std::floor(event.delta_y));
}
#if !defined(OS_MACOSX)
const int kResizeLockTimeoutMs = 67;
class AtomResizeLock : public content::ResizeLock {
public:
AtomResizeLock(OffScreenRenderWidgetHostView* host,
const gfx::Size new_size,
bool defer_compositor_lock)
: ResizeLock(new_size, defer_compositor_lock),
host_(host),
cancelled_(false),
weak_ptr_factory_(this) {
DCHECK(host_);
host_->HoldResize();
content::BrowserThread::PostDelayedTask(content::BrowserThread::UI,
FROM_HERE, base::Bind(&AtomResizeLock::CancelLock,
weak_ptr_factory_.GetWeakPtr()),
base::TimeDelta::FromMilliseconds(kResizeLockTimeoutMs));
}
~AtomResizeLock() override {
CancelLock();
}
bool GrabDeferredLock() override {
return ResizeLock::GrabDeferredLock();
}
void UnlockCompositor() override {
ResizeLock::UnlockCompositor();
compositor_lock_ = NULL;
}
protected:
void LockCompositor() override {
ResizeLock::LockCompositor();
compositor_lock_ = host_->GetCompositor()->GetCompositorLock();
}
void CancelLock() {
if (cancelled_)
return;
cancelled_ = true;
UnlockCompositor();
host_->ReleaseResize();
}
private:
OffScreenRenderWidgetHostView* host_;
scoped_refptr<ui::CompositorLock> compositor_lock_;
bool cancelled_;
base::WeakPtrFactory<AtomResizeLock> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(AtomResizeLock);
};
#endif // !defined(OS_MACOSX)
} // namespace
class AtomCopyFrameGenerator {
@@ -336,6 +279,8 @@ OffScreenRenderWidgetHostView::OffScreenRenderWidgetHostView(
popup_position_(gfx::Rect()),
hold_resize_(false),
pending_resize_(false),
renderer_compositor_frame_sink_(nullptr),
background_color_(SkColor()),
weak_ptr_factory_(this) {
DCHECK(render_widget_host_);
bool is_guest_view_hack = parent_host_view_ != nullptr;
@@ -554,14 +499,18 @@ gfx::Rect OffScreenRenderWidgetHostView::GetViewBounds() const {
}
void OffScreenRenderWidgetHostView::SetBackgroundColor(SkColor color) {
if (transparent_)
color = SkColorSetARGB(SK_AlphaTRANSPARENT, 0, 0, 0);
// The renderer will feed its color back to us with the first CompositorFrame.
// We short-cut here to show a sensible color before that happens.
UpdateBackgroundColorFromRenderer(color);
content::RenderWidgetHostViewBase::SetBackgroundColor(color);
if (render_widget_host_) {
render_widget_host_->SetBackgroundOpaque(SkColorGetA(color) ==
SK_AlphaOPAQUE);
}
}
const bool opaque = !transparent_ && GetBackgroundOpaque();
if (render_widget_host_)
render_widget_host_->SetBackgroundOpaque(opaque);
SkColor OffScreenRenderWidgetHostView::background_color() const {
return background_color_;
}
gfx::Size OffScreenRenderWidgetHostView::GetVisibleViewportSize() const {
@@ -578,11 +527,20 @@ bool OffScreenRenderWidgetHostView::LockMouse() {
void OffScreenRenderWidgetHostView::UnlockMouse() {
}
void OffScreenRenderWidgetHostView::OnSwapCompositorFrame(
uint32_t output_surface_id,
cc::CompositorFrame frame) {
void OffScreenRenderWidgetHostView::DidCreateNewRendererCompositorFrameSink(
cc::mojom::MojoCompositorFrameSinkClient* renderer_compositor_frame_sink) {
renderer_compositor_frame_sink_ = renderer_compositor_frame_sink;
if (GetDelegatedFrameHost()) {
GetDelegatedFrameHost()->DidCreateNewRendererCompositorFrameSink(
renderer_compositor_frame_sink_);
}
}
void OffScreenRenderWidgetHostView::SubmitCompositorFrame(
const cc::LocalSurfaceId& local_surface_id,
cc::CompositorFrame frame) {
TRACE_EVENT0("electron",
"OffScreenRenderWidgetHostView::OnSwapCompositorFrame");
"OffScreenRenderWidgetHostView::SubmitCompositorFrame");
if (frame.metadata.root_scroll_offset != last_scroll_offset_) {
last_scroll_offset_ = frame.metadata.root_scroll_offset;
@@ -596,11 +554,11 @@ void OffScreenRenderWidgetHostView::OnSwapCompositorFrame(
// The compositor will draw directly to the SoftwareOutputDevice which
// then calls OnPaint.
// We would normally call BrowserCompositorMac::SwapCompositorFrame on
// We would normally call BrowserCompositorMac::SubmitCompositorFrame on
// macOS, however it contains compositor resize logic that we don't want.
// Consequently we instead call the SwapDelegatedFrame method directly.
GetDelegatedFrameHost()->SwapDelegatedFrame(output_surface_id,
std::move(frame));
// Consequently we instead call the SubmitCompositorFrame method directly.
GetDelegatedFrameHost()->SubmitCompositorFrame(local_surface_id,
std::move(frame));
} else {
if (!copy_frame_generator_.get()) {
copy_frame_generator_.reset(
@@ -615,11 +573,11 @@ void OffScreenRenderWidgetHostView::OnSwapCompositorFrame(
gfx::ToEnclosingRect(gfx::RectF(root_pass->damage_rect));
damage_rect.Intersect(gfx::Rect(frame_size));
// We would normally call BrowserCompositorMac::SwapCompositorFrame on
// We would normally call BrowserCompositorMac::SubmitCompositorFrame on
// macOS, however it contains compositor resize logic that we don't want.
// Consequently we instead call the SwapDelegatedFrame method directly.
GetDelegatedFrameHost()->SwapDelegatedFrame(output_surface_id,
std::move(frame));
// Consequently we instead call the SubmitCompositorFrame method directly.
GetDelegatedFrameHost()->SubmitCompositorFrame(local_surface_id,
std::move(frame));
// Request a copy of the last compositor frame which will eventually call
// OnPaint asynchronously.
@@ -685,8 +643,14 @@ void OffScreenRenderWidgetHostView::Destroy() {
popup_bitmap_.reset();
if (child_host_view_)
child_host_view_->CancelWidget();
for (auto guest_host_view : guest_host_views_)
guest_host_view->CancelWidget();
if (!guest_host_views_.empty()) {
// Guest RWHVs will be destroyed when the associated RWHVGuest is
// destroyed. This parent RWHV may be destroyed first, so disassociate
// the guest RWHVs here without destroying them.
for (auto guest_host_view : guest_host_views_)
guest_host_view->parent_host_view_ = nullptr;
guest_host_views_.clear();
}
for (auto proxy_view : proxy_views_)
proxy_view->RemoveObserver();
Hide();
@@ -807,31 +771,25 @@ bool OffScreenRenderWidgetHostView::DelegatedFrameCanCreateResizeLock() const {
return !render_widget_host_->auto_resize_enabled();
}
std::unique_ptr<content::ResizeLock>
OffScreenRenderWidgetHostView::DelegatedFrameHostCreateResizeLock(
bool defer_compositor_lock) {
return std::unique_ptr<content::ResizeLock>(new AtomResizeLock(
this,
DelegatedFrameHostDesiredSizeInDIP(),
defer_compositor_lock));
}
void OffScreenRenderWidgetHostView::DelegatedFrameHostResizeLockWasReleased() {
return render_widget_host_->WasResized();
std::unique_ptr<content::CompositorResizeLock>
OffScreenRenderWidgetHostView::DelegatedFrameHostCreateResizeLock() {
HoldResize();
const gfx::Size& desired_size = GetRootLayer()->bounds().size();
return base::MakeUnique<content::CompositorResizeLock>(this, desired_size);
}
void
OffScreenRenderWidgetHostView::DelegatedFrameHostSendReclaimCompositorResources(
int output_surface_id,
bool is_swap_ack,
const cc::ReturnedResourceArray& resources) {
render_widget_host_->Send(new ViewMsg_ReclaimCompositorResources(
render_widget_host_->GetRoutingID(), output_surface_id, is_swap_ack,
resources));
OffScreenRenderWidgetHostView::OnBeginFrame(const cc::BeginFrameArgs& args) {
}
void OffScreenRenderWidgetHostView::SetBeginFrameSource(
cc::BeginFrameSource* source) {
std::unique_ptr<ui::CompositorLock>
OffScreenRenderWidgetHostView::GetCompositorLock(
ui::CompositorLockClient* client) {
return GetCompositor()->GetCompositorLock(client);
}
void OffScreenRenderWidgetHostView::CompositorResizeLockEnded() {
ReleaseResize();
}
#endif // !defined(OS_MACOSX)
@@ -1111,12 +1069,12 @@ void OffScreenRenderWidgetHostView::ProcessMouseEvent(
const ui::LatencyInfo& latency) {
for (auto proxy_view : proxy_views_) {
gfx::Rect bounds = proxy_view->GetBounds();
if (bounds.Contains(event.x, event.y)) {
if (bounds.Contains(event.PositionInWidget().x,
event.PositionInWidget().y)) {
blink::WebMouseEvent proxy_event(event);
proxy_event.x -= bounds.x();
proxy_event.y -= bounds.y();
proxy_event.windowX = proxy_event.x;
proxy_event.windowY = proxy_event.y;
proxy_event.SetPositionInWidget(
proxy_event.PositionInWidget().x - bounds.x(),
proxy_event.PositionInWidget().y - bounds.y());
ui::MouseEvent ui_event = UiMouseEventFromWebMouseEvent(proxy_event);
proxy_view->OnEvent(&ui_event);
@@ -1125,13 +1083,14 @@ void OffScreenRenderWidgetHostView::ProcessMouseEvent(
}
if (!IsPopupWidget()) {
if (popup_host_view_ &&
popup_host_view_->popup_position_.Contains(event.x, event.y)) {
if (popup_host_view_ && popup_host_view_->popup_position_.Contains(
event.PositionInWidget().x, event.PositionInWidget().y)) {
blink::WebMouseEvent popup_event(event);
popup_event.x -= popup_host_view_->popup_position_.x();
popup_event.y -= popup_host_view_->popup_position_.y();
popup_event.windowX = popup_event.x;
popup_event.windowY = popup_event.y;
popup_event.SetPositionInWidget(
popup_event.PositionInWidget().x -
popup_host_view_->popup_position_.x(),
popup_event.PositionInWidget().y -
popup_host_view_->popup_position_.y());
popup_host_view_->ProcessMouseEvent(popup_event, latency);
return;
@@ -1148,12 +1107,12 @@ void OffScreenRenderWidgetHostView::ProcessMouseWheelEvent(
const ui::LatencyInfo& latency) {
for (auto proxy_view : proxy_views_) {
gfx::Rect bounds = proxy_view->GetBounds();
if (bounds.Contains(event.x, event.y)) {
if (bounds.Contains(event.PositionInWidget().x,
event.PositionInWidget().y)) {
blink::WebMouseWheelEvent proxy_event(event);
proxy_event.x -= bounds.x();
proxy_event.y -= bounds.y();
proxy_event.windowX = proxy_event.x;
proxy_event.windowY = proxy_event.y;
proxy_event.SetPositionInWidget(
proxy_event.PositionInWidget().x - bounds.x(),
proxy_event.PositionInWidget().y - bounds.y());
ui::MouseWheelEvent ui_event =
UiMouseWheelEventFromWebMouseEvent(proxy_event);
@@ -1163,12 +1122,14 @@ void OffScreenRenderWidgetHostView::ProcessMouseWheelEvent(
}
if (!IsPopupWidget()) {
if (popup_host_view_) {
if (popup_host_view_->popup_position_.Contains(event.x, event.y)) {
if (popup_host_view_->popup_position_.Contains(
event.PositionInWidget().x, event.PositionInWidget().y)) {
blink::WebMouseWheelEvent popup_event(event);
popup_event.x -= popup_host_view_->popup_position_.x();
popup_event.y -= popup_host_view_->popup_position_.y();
popup_event.windowX = popup_event.x;
popup_event.windowY = popup_event.y;
popup_event.SetPositionInWidget(
popup_event.PositionInWidget().x -
popup_host_view_->popup_position_.x(),
popup_event.PositionInWidget().y -
popup_host_view_->popup_position_.y());
popup_host_view_->ProcessMouseWheelEvent(popup_event, latency);
return;
} else {
@@ -1312,4 +1273,15 @@ cc::FrameSinkId OffScreenRenderWidgetHostView::AllocateFrameSinkId(
render_widget_host_->GetRoutingID()));
}
void OffScreenRenderWidgetHostView::UpdateBackgroundColorFromRenderer(
SkColor color) {
if (color == background_color())
return;
background_color_ = color;
bool opaque = SkColorGetA(color) == SK_AlphaOPAQUE;
GetRootLayer()->SetFillsBoundsOpaquely(opaque);
GetRootLayer()->SetColor(color);
}
} // namespace atom

View File

@@ -23,10 +23,10 @@
#include "cc/output/compositor_frame.h"
#include "cc/scheduler/begin_frame_source.h"
#include "content/browser/frame_host/render_widget_host_view_guest.h"
#include "content/browser/renderer_host/compositor_resize_lock.h"
#include "content/browser/renderer_host/delegated_frame_host.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_view_base.h"
#include "content/browser/renderer_host/resize_lock.h"
#include "content/browser/web_contents/web_contents_view.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/WebKit/public/platform/WebVector.h"
@@ -68,6 +68,7 @@ class OffScreenRenderWidgetHostView
public ui::CompositorDelegate,
#if !defined(OS_MACOSX)
public content::DelegatedFrameHostClient,
public content::CompositorResizeLockClient,
#endif
public NativeWindowObserver,
public OffscreenViewProxyObserver {
@@ -99,6 +100,7 @@ class OffScreenRenderWidgetHostView
gfx::Size GetVisibleViewportSize() const override;
void SetInsets(const gfx::Insets&) override;
void SetBackgroundColor(SkColor color) override;
SkColor background_color() const override;
bool LockMouse(void) override;
void UnlockMouse(void) override;
void SetNeedsBeginFrames(bool needs_begin_frames) override;
@@ -113,8 +115,12 @@ class OffScreenRenderWidgetHostView
#endif // defined(OS_MACOSX)
// content::RenderWidgetHostViewBase:
void OnSwapCompositorFrame(uint32_t, cc::CompositorFrame)
override;
void DidCreateNewRendererCompositorFrameSink(
cc::mojom::MojoCompositorFrameSinkClient* renderer_compositor_frame_sink)
override;
void SubmitCompositorFrame(const cc::LocalSurfaceId& local_surface_id,
cc::CompositorFrame frame) override;
void ClearCompositorFrame(void) override;
void InitAsPopup(content::RenderWidgetHostView *rwhv, const gfx::Rect& rect)
override;
@@ -167,15 +173,14 @@ class OffScreenRenderWidgetHostView
bool DelegatedFrameHostIsVisible(void) const override;
SkColor DelegatedFrameHostGetGutterColor(SkColor) const override;
gfx::Size DelegatedFrameHostDesiredSizeInDIP(void) const override;
bool DelegatedFrameCanCreateResizeLock(void) const override;
std::unique_ptr<content::ResizeLock> DelegatedFrameHostCreateResizeLock(
bool defer_compositor_lock) override;
void DelegatedFrameHostResizeLockWasReleased(void) override;
void DelegatedFrameHostSendReclaimCompositorResources(
int output_surface_id,
bool is_swap_ack,
const cc::ReturnedResourceArray& resources) override;
void SetBeginFrameSource(cc::BeginFrameSource* source) override;
bool DelegatedFrameCanCreateResizeLock() const override;
std::unique_ptr<content::CompositorResizeLock>
DelegatedFrameHostCreateResizeLock() override;
void OnBeginFrame(const cc::BeginFrameArgs& args) override;
// CompositorResizeLockClient implementation.
std::unique_ptr<ui::CompositorLock> GetCompositorLock(
ui::CompositorLockClient* client) override;
void CompositorResizeLockEnded() override;
#endif // !defined(OS_MACOSX)
bool TransformPointToLocalCoordSpace(
@@ -224,7 +229,7 @@ class OffScreenRenderWidgetHostView
void OnProxyViewPaint(const gfx::Rect& damage_rect);
bool IsPopupWidget() const {
return popup_type_ != blink::WebPopupTypeNone;
return popup_type_ != blink::kWebPopupTypeNone;
}
void HoldResize();
@@ -271,6 +276,10 @@ class OffScreenRenderWidgetHostView
cc::FrameSinkId AllocateFrameSinkId(bool is_guest_view_hack);
// Applies background color without notifying the RenderWidget about
// opaqueness changes.
void UpdateBackgroundColorFromRenderer(SkColor color);
// Weak ptrs.
content::RenderWidgetHostImpl* render_widget_host_;
@@ -328,6 +337,10 @@ class OffScreenRenderWidgetHostView
std::string selected_text_;
#endif
cc::mojom::MojoCompositorFrameSinkClient* renderer_compositor_frame_sink_;
SkColor background_color_;
base::WeakPtrFactory<OffScreenRenderWidgetHostView> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(OffScreenRenderWidgetHostView);

View File

@@ -38,15 +38,6 @@ class MacHelper :
return color;
}
void BrowserCompositorMacSendReclaimCompositorResources(
int output_surface_id,
bool is_swap_ack,
const cc::ReturnedResourceArray& resources) override {
view_->render_widget_host()->Send(new ViewMsg_ReclaimCompositorResources(
view_->render_widget_host()->GetRoutingID(), output_surface_id,
is_swap_ack, resources));
}
void BrowserCompositorMacSendBeginFrame(
const cc::BeginFrameArgs& args) override {
view_->render_widget_host()->Send(

View File

@@ -17,9 +17,9 @@
<key>CFBundleIconFile</key>
<string>electron.icns</string>
<key>CFBundleVersion</key>
<string>1.7.8</string>
<string>1.8.2</string>
<key>CFBundleShortVersionString</key>
<string>1.7.8</string>
<string>1.8.2</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.developer-tools</string>
<key>LSMinimumSystemVersion</key>

View File

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

View File

@@ -10,6 +10,7 @@
#include "atom/browser/native_window.h"
#include "base/strings/sys_string_conversions.h"
#include "net/cert/cert_database.h"
#include "net/cert/x509_util_mac.h"
@interface TrustDelegate : NSObject {
@private
@@ -85,7 +86,8 @@ void ShowCertificateTrust(atom::NativeWindow* parent_window,
const std::string& message,
const ShowTrustCallback& callback) {
auto sec_policy = SecPolicyCreateBasicX509();
auto cert_chain = cert->CreateOSCertChainForCert();
auto cert_chain =
net::x509_util::CreateSecCertificateArrayForX509Certificate(cert.get());
SecTrustRef trust = nullptr;
SecTrustCreateWithCertificates(cert_chain, sec_policy, &trust);

View File

@@ -0,0 +1,42 @@
// Copyright (c) 2017 GitHub, Inc.
// Use of this source code is governed by the MIT license that can be
// found in the LICENSE file.
#ifndef ATOM_BROWSER_UI_COCOA_ATOM_BUNDLE_MOVER_H_
#define ATOM_BROWSER_UI_COCOA_ATOM_BUNDLE_MOVER_H_
#include <string>
#include "native_mate/persistent_dictionary.h"
namespace atom {
namespace ui {
namespace cocoa {
class AtomBundleMover {
public:
static bool Move(mate::Arguments* args);
static bool IsCurrentAppInApplicationsFolder();
private:
static bool IsInApplicationsFolder(NSString* bundlePath);
static NSString* ContainingDiskImageDevice(NSString* bundlePath);
static void Relaunch(NSString* destinationPath);
static NSString* ShellQuotedString(NSString* string);
static bool CopyBundle(NSString* srcPath, NSString* dstPath);
static bool AuthorizedInstall(NSString* srcPath, NSString* dstPath,
bool* canceled);
static bool IsApplicationAtPathRunning(NSString* bundlePath);
static bool DeleteOrTrash(NSString* path);
static bool Trash(NSString* path);
};
} // namespace cocoa
} // namespace ui
} // namespace atom
#endif // ATOM_BROWSER_UI_COCOA_ATOM_BUNDLE_MOVER_H_

View File

@@ -0,0 +1,345 @@
// 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 "atom/browser/ui/cocoa/atom_bundle_mover.h"
#import <AppKit/AppKit.h>
#import <Foundation/Foundation.h>
#import <Security/Security.h>
#import <dlfcn.h>
#import <sys/param.h>
#import <sys/mount.h>
#import "atom/browser/browser.h"
namespace atom {
namespace ui {
namespace cocoa {
bool AtomBundleMover::Move(mate::Arguments* args) {
// Path of the current bundle
NSString* bundlePath = [[NSBundle mainBundle] bundlePath];
// Skip if the application is already in the Applications folder
if (IsInApplicationsFolder(bundlePath)) return true;
NSFileManager* fileManager = [NSFileManager defaultManager];
NSString* diskImageDevice = ContainingDiskImageDevice(bundlePath);
NSString *applicationsDirectory = [[NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSLocalDomainMask, true) lastObject] stringByResolvingSymlinksInPath];
NSString *bundleName = [bundlePath lastPathComponent];
NSString *destinationPath = [applicationsDirectory stringByAppendingPathComponent:bundleName];
// Check if we can write to the applications directory
// and then make sure that if the app already exists we can overwrite it
bool needAuthorization = ![fileManager isWritableFileAtPath:applicationsDirectory]
| ([fileManager fileExistsAtPath:destinationPath] && ![fileManager isWritableFileAtPath:destinationPath]);
// Activate app -- work-around for focus issues related to "scary file from internet" OS dialog.
if (![NSApp isActive]) {
[NSApp activateIgnoringOtherApps:true];
}
// Move to applications folder
if (needAuthorization) {
bool authorizationCanceled;
if (!AuthorizedInstall(bundlePath, destinationPath, &authorizationCanceled)) {
if (authorizationCanceled) {
// User rejected the authorization request
args->ThrowError("User rejected the authorization request");
return false;
}
else {
args->ThrowError("Failed to copy to applications directory even with authorization");
return false;
}
}
} else {
// If a copy already exists in the Applications folder, put it in the Trash
if ([fileManager fileExistsAtPath:destinationPath]) {
// But first, make sure that it's not running
if (IsApplicationAtPathRunning(destinationPath)) {
// Give the running app focus and terminate myself
[[NSTask launchedTaskWithLaunchPath:@"/usr/bin/open" arguments:[NSArray arrayWithObject:destinationPath]] waitUntilExit];
atom::Browser::Get()->Quit();
return true;
} else {
if (!Trash([applicationsDirectory stringByAppendingPathComponent:bundleName])) {
args->ThrowError("Failed to delete existing application");
return false;
}
}
}
if (!CopyBundle(bundlePath, destinationPath)) {
args->ThrowError("Failed to copy current bundle to the applications folder");
return false;
}
}
// Trash the original app. It's okay if this fails.
// NOTE: This final delete does not work if the source bundle is in a network mounted volume.
// Calling rm or file manager's delete method doesn't work either. It's unlikely to happen
// but it'd be great if someone could fix this.
if (diskImageDevice == nil && !DeleteOrTrash(bundlePath)) {
// Could not delete original but we just don't care
}
// Relaunch.
Relaunch(destinationPath);
// Launched from within a disk image? -- unmount (if no files are open after 5 seconds,
// otherwise leave it mounted).
if (diskImageDevice) {
NSString *script = [NSString stringWithFormat:@"(/bin/sleep 5 && /usr/bin/hdiutil detach %@) &", ShellQuotedString(diskImageDevice)];
[NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]];
}
atom::Browser::Get()->Quit();
return true;
}
bool AtomBundleMover::IsCurrentAppInApplicationsFolder() {
return IsInApplicationsFolder([[NSBundle mainBundle] bundlePath]);
}
bool AtomBundleMover::IsInApplicationsFolder(NSString* bundlePath) {
// Check all the normal Application directories
NSArray* applicationDirs = NSSearchPathForDirectoriesInDomains(NSApplicationDirectory, NSAllDomainsMask, true);
for (NSString* appDir in applicationDirs) {
if ([bundlePath hasPrefix:appDir]) return true;
}
// Also, handle the case that the user has some other Application directory (perhaps on a separate data partition).
if ([[bundlePath pathComponents] containsObject:@"Applications"]) return true;
return false;
}
NSString* AtomBundleMover::ContainingDiskImageDevice(NSString* bundlePath) {
NSString* containingPath = [bundlePath stringByDeletingLastPathComponent];
struct statfs fs;
if (statfs([containingPath fileSystemRepresentation], &fs) || (fs.f_flags & MNT_ROOTFS))
return nil;
NSString *device = [[NSFileManager defaultManager] stringWithFileSystemRepresentation:fs.f_mntfromname length:strlen(fs.f_mntfromname)];
NSTask *hdiutil = [[[NSTask alloc] init] autorelease];
[hdiutil setLaunchPath:@"/usr/bin/hdiutil"];
[hdiutil setArguments:[NSArray arrayWithObjects:@"info", @"-plist", nil]];
[hdiutil setStandardOutput:[NSPipe pipe]];
[hdiutil launch];
[hdiutil waitUntilExit];
NSData *data = [[[hdiutil standardOutput] fileHandleForReading] readDataToEndOfFile];
NSDictionary *info = nil;
if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
info = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListImmutable format:NULL error:NULL];
} else {
info = [NSPropertyListSerialization propertyListFromData:data mutabilityOption:NSPropertyListImmutable format:NULL errorDescription:NULL];
}
if (![info isKindOfClass:[NSDictionary class]]) return nil;
NSArray *images = (NSArray *)[info objectForKey:@"images"];
if (![images isKindOfClass:[NSArray class]]) return nil;
for (NSDictionary *image in images) {
if (![image isKindOfClass:[NSDictionary class]]) return nil;
id systemEntities = [image objectForKey:@"system-entities"];
if (![systemEntities isKindOfClass:[NSArray class]]) return nil;
for (NSDictionary *systemEntity in systemEntities) {
if (![systemEntity isKindOfClass:[NSDictionary class]]) return nil;
NSString *devEntry = [systemEntity objectForKey:@"dev-entry"];
if (![devEntry isKindOfClass:[NSString class]]) return nil;
if ([devEntry isEqualToString:device])
return device;
}
}
return nil;
}
bool AtomBundleMover::AuthorizedInstall(NSString* srcPath, NSString* dstPath, bool* canceled) {
if (canceled) *canceled = false;
// Make sure that the destination path is an app bundle. We're essentially running 'sudo rm -rf'
// so we really don't want to screw this up.
if (![[dstPath pathExtension] isEqualToString:@"app"]) return false;
// Do some more checks
if ([[dstPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) return false;
if ([[srcPath stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length] == 0) return false;
int pid, status;
AuthorizationRef myAuthorizationRef;
// Get the authorization
OSStatus err = AuthorizationCreate(NULL, kAuthorizationEmptyEnvironment, kAuthorizationFlagDefaults, &myAuthorizationRef);
if (err != errAuthorizationSuccess) return false;
AuthorizationItem myItems = {kAuthorizationRightExecute, 0, NULL, 0};
AuthorizationRights myRights = {1, &myItems};
AuthorizationFlags myFlags = (AuthorizationFlags)(kAuthorizationFlagInteractionAllowed | kAuthorizationFlagExtendRights | kAuthorizationFlagPreAuthorize);
err = AuthorizationCopyRights(myAuthorizationRef, &myRights, NULL, myFlags, NULL);
if (err != errAuthorizationSuccess) {
if (err == errAuthorizationCanceled && canceled)
*canceled = true;
goto fail;
}
static OSStatus (*security_AuthorizationExecuteWithPrivileges)(AuthorizationRef authorization, const char *pathToTool,
AuthorizationFlags options, char * const *arguments,
FILE **communicationsPipe) = NULL;
if (!security_AuthorizationExecuteWithPrivileges) {
// On 10.7, AuthorizationExecuteWithPrivileges is deprecated. We want to still use it since there's no
// good alternative (without requiring code signing). We'll look up the function through dyld and fail
// if it is no longer accessible. If Apple removes the function entirely this will fail gracefully. If
// they keep the function and throw some sort of exception, this won't fail gracefully, but that's a
// risk we'll have to take for now.
security_AuthorizationExecuteWithPrivileges = (OSStatus (*)(AuthorizationRef, const char*,
AuthorizationFlags, char* const*,
FILE **)) dlsym(RTLD_DEFAULT, "AuthorizationExecuteWithPrivileges");
}
if (!security_AuthorizationExecuteWithPrivileges) goto fail;
// Delete the destination
{
char rf[] = "-rf";
char *args[] = {rf, (char *)[dstPath fileSystemRepresentation], NULL};
err = security_AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/rm", kAuthorizationFlagDefaults, args, NULL);
if (err != errAuthorizationSuccess) goto fail;
// Wait until it's done
pid = wait(&status);
if (pid == -1 || !WIFEXITED(status)) goto fail; // We don't care about exit status as the destination most likely does not exist
}
// Copy
{
char pR[] = "-pR";
char *args[] = {pR, (char *)[srcPath fileSystemRepresentation], (char *)[dstPath fileSystemRepresentation], NULL};
err = security_AuthorizationExecuteWithPrivileges(myAuthorizationRef, "/bin/cp", kAuthorizationFlagDefaults, args, NULL);
if (err != errAuthorizationSuccess) goto fail;
// Wait until it's done
pid = wait(&status);
if (pid == -1 || !WIFEXITED(status) || WEXITSTATUS(status)) goto fail;
}
AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults);
return true;
fail:
AuthorizationFree(myAuthorizationRef, kAuthorizationFlagDefaults);
return false;
}
bool AtomBundleMover::CopyBundle(NSString* srcPath, NSString* dstPath) {
NSFileManager* fileManager = [NSFileManager defaultManager];
NSError* error = nil;
if ([fileManager copyItemAtPath:srcPath toPath:dstPath error:&error]) {
return true;
}
else {
return false;
}
}
NSString* AtomBundleMover::ShellQuotedString(NSString* string) {
return [NSString stringWithFormat:@"'%@'", [string stringByReplacingOccurrencesOfString:@"'" withString:@"'\\''"]];
}
void AtomBundleMover::Relaunch(NSString* destinationPath) {
// The shell script waits until the original app process terminates.
// This is done so that the relaunched app opens as the front-most app.
int pid = [[NSProcessInfo processInfo] processIdentifier];
// Command run just before running open /final/path
NSString* preOpenCmd = @"";
NSString* quotedDestinationPath = ShellQuotedString(destinationPath);
// Before we launch the new app, clear xattr:com.apple.quarantine to avoid
// duplicate "scary file from the internet" dialog.
preOpenCmd = [NSString stringWithFormat:@"/usr/bin/xattr -d -r com.apple.quarantine %@", quotedDestinationPath];
NSString* script = [NSString stringWithFormat:@"(while /bin/kill -0 %d >&/dev/null; do /bin/sleep 0.1; done; %@; /usr/bin/open %@) &", pid, preOpenCmd, quotedDestinationPath];
[NSTask launchedTaskWithLaunchPath:@"/bin/sh" arguments:[NSArray arrayWithObjects:@"-c", script, nil]];
}
bool AtomBundleMover::IsApplicationAtPathRunning(NSString* bundlePath) {
bundlePath = [bundlePath stringByStandardizingPath];
for (NSRunningApplication *runningApplication in [[NSWorkspace sharedWorkspace] runningApplications]) {
NSString* runningAppBundlePath = [[[runningApplication bundleURL] path] stringByStandardizingPath];
if ([runningAppBundlePath isEqualToString:bundlePath]) {
return true;
}
}
return false;
}
bool AtomBundleMover::Trash(NSString* path) {
bool result = false;
if (floor(NSAppKitVersionNumber) >= NSAppKitVersionNumber10_8) {
result = [[NSFileManager defaultManager] trashItemAtURL:[NSURL fileURLWithPath:path] resultingItemURL:NULL error:NULL];
}
if (!result) {
result = [[NSWorkspace sharedWorkspace] performFileOperation:NSWorkspaceRecycleOperation
source:[path stringByDeletingLastPathComponent]
destination:@""
files:[NSArray arrayWithObject:[path lastPathComponent]]
tag:NULL];
}
// As a last resort try trashing with AppleScript.
// This allows us to trash the app in macOS Sierra even when the app is running inside
// an app translocation image.
if (!result) {
NSAppleScript* appleScript = [[[NSAppleScript alloc] initWithSource:
[NSString stringWithFormat:@"\
set theFile to POSIX file \"%@\" \n\
tell application \"Finder\" \n\
move theFile to trash \n\
end tell", path]] autorelease];
NSDictionary* errorDict = nil;
NSAppleEventDescriptor* scriptResult = [appleScript executeAndReturnError:&errorDict];
result = (scriptResult != nil);
}
return result;
}
bool AtomBundleMover::DeleteOrTrash(NSString* path) {
NSError* error;
if ([[NSFileManager defaultManager] removeItemAtPath:path error:&error]) {
return true;
} else {
return Trash(path);
}
}
} // namespace cocoa
} // namespace ui
} // namespace atom

View File

@@ -45,6 +45,11 @@ Role kRolesMap[] = {
{ @selector(performZoom:), "zoom" },
{ @selector(terminate:), "quit" },
{ @selector(toggleFullScreen:), "togglefullscreen" },
{ @selector(toggleTabBar:), "toggletabbar" },
{ @selector(selectNextTab:), "selectnexttab" },
{ @selector(selectPreviousTab:), "selectprevioustab" },
{ @selector(mergeAllWindows:), "mergeallwindows" },
{ @selector(moveTabToNewWindow:), "movetabtonewwindow" },
};
} // namespace

View File

@@ -143,6 +143,7 @@ static NSString* const ImageScrubberItemIdentifier = @"scrubber.image.item";
}
- (void)setEscapeTouchBarItem:(const mate::PersistentDictionary&)item forTouchBar:(NSTouchBar*)touchBar {
if (![touchBar respondsToSelector:@selector(escapeKeyReplacementItemIdentifier)]) return;
std::string type;
std::string item_id;
NSTouchBarItemIdentifier identifier = nil;

View File

@@ -7,12 +7,13 @@
#include "ui/aura/client/drag_drop_client.h"
#include "ui/aura/window.h"
#include "ui/base/dragdrop/drag_drop_types.h"
#include "ui/base/dragdrop/drag_utils.h"
#include "ui/base/dragdrop/file_info.h"
#include "ui/base/dragdrop/os_exchange_data.h"
#include "ui/display/screen.h"
#include "ui/gfx/geometry/point.h"
#include "ui/views/button_drag_utils.h"
#include "ui/views/widget/widget.h"
#include "url/gurl.h"
namespace atom {
@@ -22,7 +23,9 @@ void DragFileItems(const std::vector<base::FilePath>& files,
// Set up our OLE machinery
ui::OSExchangeData data;
drag_utils::CreateDragImageForFile(files[0], icon.AsImageSkia(), &data);
button_drag_utils::SetDragImage(GURL(), files[0].LossyDisplayName(),
icon.AsImageSkia(), nullptr,
*views::Widget::GetTopLevelWidgetForNativeView(view), &data);
std::vector<ui::FileInfo> file_infos;
for (const base::FilePath& file : files) {

View File

@@ -34,9 +34,11 @@ gfx::Rect TrayIcon::GetBounds() {
return gfx::Rect();
}
void TrayIcon::NotifyClicked(const gfx::Rect& bounds, int modifiers) {
void TrayIcon::NotifyClicked(const gfx::Rect& bounds,
const gfx::Point& location,
int modifiers) {
for (TrayIconObserver& observer : observers_)
observer.OnClicked(bounds, modifiers);
observer.OnClicked(bounds, location, modifiers);
}
void TrayIcon::NotifyDoubleClicked(const gfx::Rect& bounds, int modifiers) {
@@ -89,6 +91,11 @@ void TrayIcon::NotifyMouseExited(const gfx::Point& location, int modifiers) {
observer.OnMouseExited(location, modifiers);
}
void TrayIcon::NotifyMouseMoved(const gfx::Point& location, int modifiers) {
for (TrayIconObserver& observer : observers_)
observer.OnMouseMoved(location, modifiers);
}
void TrayIcon::NotifyDragEntered() {
for (TrayIconObserver& observer : observers_)
observer.OnDragEntered();

View File

@@ -70,7 +70,9 @@ class TrayIcon {
void AddObserver(TrayIconObserver* obs) { observers_.AddObserver(obs); }
void RemoveObserver(TrayIconObserver* obs) { observers_.RemoveObserver(obs); }
void NotifyClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0);
void NotifyClicked(const gfx::Rect& = gfx::Rect(),
const gfx::Point& location = gfx::Point(),
int modifiers = 0);
void NotifyDoubleClicked(const gfx::Rect& = gfx::Rect(), int modifiers = 0);
void NotifyBalloonShow();
void NotifyBalloonClicked();
@@ -87,6 +89,8 @@ class TrayIcon {
int modifiers = 0);
void NotifyMouseExited(const gfx::Point& location = gfx::Point(),
int modifiers = 0);
void NotifyMouseMoved(const gfx::Point& location = gfx::Point(),
int modifiers = 0);
protected:
TrayIcon();

View File

@@ -57,10 +57,10 @@ const CGFloat kVerticalTitleMargin = 2;
// Finalize setup by sizing our views
[self updateDimensions];
// Add NSTrackingArea for listening to mouseEnter and mouseExit events
// Add NSTrackingArea for listening to mouseEnter, mouseExit, and mouseMove events
auto trackingArea = [[[NSTrackingArea alloc]
initWithRect:[self bounds]
options:NSTrackingMouseEnteredAndExited | NSTrackingActiveAlways
options:NSTrackingMouseEnteredAndExited | NSTrackingMouseMoved | NSTrackingActiveAlways
owner:self
userInfo:nil] autorelease];
[self addTrackingArea:trackingArea];
@@ -249,6 +249,7 @@ const CGFloat kVerticalTitleMargin = 2;
if (event.clickCount == 1)
trayIcon_->NotifyClicked(
gfx::ScreenRectFromNSRect(event.window.frame),
gfx::ScreenPointFromNSPoint([event locationInWindow]),
ui::EventFlagsFromModifiers([event modifierFlags]));
// Double click event.
@@ -307,6 +308,12 @@ const CGFloat kVerticalTitleMargin = 2;
ui::EventFlagsFromModifiers([event modifierFlags]));
}
- (void)mouseMoved:(NSEvent*)event {
trayIcon_->NotifyMouseMoved(
gfx::ScreenPointFromNSPoint([event locationInWindow]),
ui::EventFlagsFromModifiers([event modifierFlags]));
}
- (void)draggingExited:(id <NSDraggingInfo>)sender {
trayIcon_->NotifyDragExited();
}

View File

@@ -17,7 +17,9 @@ namespace atom {
class TrayIconObserver {
public:
virtual void OnClicked(const gfx::Rect& bounds, int modifiers) {}
virtual void OnClicked(const gfx::Rect& bounds,
const gfx::Point& location,
int modifiers) {}
virtual void OnDoubleClicked(const gfx::Rect& bounds, int modifiers) {}
virtual void OnBalloonShow() {}
virtual void OnBalloonClicked() {}
@@ -31,6 +33,7 @@ class TrayIconObserver {
virtual void OnDragEnded() {}
virtual void OnMouseEntered(const gfx::Point& location, int modifiers) {}
virtual void OnMouseExited(const gfx::Point& location, int modifiers) {}
virtual void OnMouseMoved(const gfx::Point& location, int modifiers) {}
protected:
virtual ~TrayIconObserver() {}

View File

@@ -5,6 +5,7 @@
#include "atom/browser/ui/views/autofill_popup_view.h"
#include "base/bind.h"
#include "base/i18n/rtl.h"
#include "cc/paint/skia_paint_canvas.h"
#include "content/public/browser/render_view_host.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/gfx/canvas.h"
@@ -229,7 +230,8 @@ void AutofillPopupView::OnPaint(gfx::Canvas* canvas) {
bitmap.allocN32Pixels(popup_->popup_bounds_in_view_.width(),
popup_->popup_bounds_in_view_.height(),
true);
draw_canvas = new gfx::Canvas(new SkCanvas(bitmap), 1.0);
cc::SkiaPaintCanvas paint_canvas(new SkCanvas(bitmap));
draw_canvas = new gfx::Canvas(&paint_canvas, 1.0);
}
#endif
@@ -358,7 +360,7 @@ bool AutofillPopupView::HandleKeyPressEvent(
const content::NativeWebKeyboardEvent& event) {
if (!popup_)
return false;
switch (event.windowsKeyCode) {
switch (event.windows_key_code) {
case ui::VKEY_UP:
SelectPreviousLine();
return true;

View File

@@ -153,8 +153,9 @@ void MenuBar::OnMenuButtonClicked(views::MenuButton* source,
return;
}
MenuDelegate menu_delegate(this);
menu_delegate.RunMenu(menu_model_->GetSubmenuModelAt(id), source);
// Deleted in MenuDelegate::OnMenuClosed
MenuDelegate* menu_delegate = new MenuDelegate(this);
menu_delegate->RunMenu(menu_model_->GetSubmenuModelAt(id), source);
}
void MenuBar::OnNativeThemeChanged(const ui::NativeTheme* theme) {

View File

@@ -95,24 +95,36 @@ void MenuDelegate::WillHideMenu(views::MenuItemView* menu) {
adapter_->WillHideMenu(menu);
}
void MenuDelegate::OnMenuClosed(views::MenuItemView* menu,
views::MenuRunner::RunResult result) {
// Only switch to new menu when current menu is closed.
if (button_to_open_)
button_to_open_->Activate(nullptr);
delete this;
}
views::MenuItemView* MenuDelegate::GetSiblingMenu(
views::MenuItemView* menu,
const gfx::Point& screen_point,
views::MenuAnchorPosition* anchor,
bool* has_mnemonics,
views::MenuButton**) {
// TODO(zcbenz): We should follow Chromium's logics on implementing the
// sibling menu switches, this code is almost a hack.
views::MenuButton* button;
AtomMenuModel* model;
if (menu_bar_->GetMenuButtonFromScreenPoint(screen_point, &model, &button) &&
button->tag() != id_) {
DCHECK(menu_runner_->IsRunning());
menu_runner_->Cancel();
// After canceling the menu, we need to wait until next tick
// so we are out of nested message loop.
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
base::Bind(base::IgnoreResult(&views::MenuButton::Activate),
base::Unretained(button), nullptr));
bool switch_in_progress = !!button_to_open_;
// Always update target to open.
button_to_open_ = button;
// Switching menu asyncnously to avoid crash.
if (!switch_in_progress) {
content::BrowserThread::PostTask(
content::BrowserThread::UI, FROM_HERE,
base::Bind(&views::MenuRunner::Cancel,
base::Unretained(menu_runner_.get())));
}
}
return nullptr;

View File

@@ -40,6 +40,8 @@ class MenuDelegate : public views::MenuDelegate {
void SelectionChanged(views::MenuItemView* menu) override;
void WillShowMenu(views::MenuItemView* menu) override;
void WillHideMenu(views::MenuItemView* menu) override;
void OnMenuClosed(views::MenuItemView* menu,
views::MenuRunner::RunResult result) override;
views::MenuItemView* GetSiblingMenu(
views::MenuItemView* menu,
const gfx::Point& screen_point,
@@ -53,6 +55,9 @@ class MenuDelegate : public views::MenuDelegate {
std::unique_ptr<views::MenuDelegate> adapter_;
std::unique_ptr<views::MenuRunner> menu_runner_;
// The menu button to switch to.
views::MenuButton* button_to_open_ = nullptr;
DISALLOW_COPY_AND_ASSIGN(MenuDelegate);
};

View File

@@ -209,7 +209,7 @@ void PdfViewerHandler::OnZoomLevelChanged(content::WebContents* web_contents,
double level, bool is_temporary) {
if (web_ui()->GetWebContents() == web_contents) {
CallJavascriptFunction("cr.webUIListenerCallback",
base::StringValue("onZoomLevelChanged"),
base::Value("onZoomLevelChanged"),
base::Value(content::ZoomLevelToZoomFactor(level)));
}
}

View File

@@ -132,7 +132,7 @@ class PdfViewerUI::ResourceRequester
request->set_method("GET");
content::ResourceDispatcherHostImpl::Get()->InitializeURLRequest(
request.get(), content::Referrer(url, blink::WebReferrerPolicyDefault),
request.get(), content::Referrer(url, blink::kWebReferrerPolicyDefault),
false, // download.
render_process_id, render_view_id, render_frame_id,
content::PREVIEWS_OFF, resource_context);

View File

@@ -55,7 +55,9 @@ void NotifyIcon::HandleClickEvent(int modifiers,
if (double_button_click) // double left click
NotifyDoubleClicked(bounds, modifiers);
else // single left click
NotifyClicked(bounds, modifiers);
NotifyClicked(bounds,
display::Screen::GetScreen()->GetCursorScreenPoint(),
modifiers);
return;
} else if (!double_button_click) { // single right click
if (menu_model_)
@@ -147,10 +149,10 @@ void NotifyIcon::PopUpContextMenu(const gfx::Point& pos,
if (pos.IsOrigin())
rect.set_origin(display::Screen::GetScreen()->GetCursorScreenPoint());
views::MenuRunner menu_runner(
menu_runner_.reset(new views::MenuRunner(
menu_model != nullptr ? menu_model : menu_model_,
views::MenuRunner::CONTEXT_MENU | views::MenuRunner::HAS_MNEMONICS);
ignore_result(menu_runner.RunMenuAt(
views::MenuRunner::CONTEXT_MENU | views::MenuRunner::HAS_MNEMONICS));
ignore_result(menu_runner_->RunMenuAt(
NULL, NULL, rect, views::MENU_ANCHOR_TOPLEFT, ui::MENU_SOURCE_MOUSE));
}

View File

@@ -20,6 +20,10 @@ namespace gfx {
class Point;
}
namespace views {
class MenuRunner;
}
namespace atom {
class NotifyIconHost;
@@ -77,6 +81,9 @@ class NotifyIcon : public TrayIcon {
// The context menu.
AtomMenuModel* menu_model_;
// Context menu associated with this icon (if any).
std::unique_ptr<views::MenuRunner> menu_runner_;
DISALLOW_COPY_AND_ASSIGN(NotifyIcon);
};

View File

@@ -81,6 +81,9 @@ void WindowList::RemoveObserver(WindowListObserver* observer) {
// static
void WindowList::CloseAllWindows() {
WindowVector windows = GetInstance()->windows_;
#if defined(OS_MACOSX)
std::reverse(windows.begin(), windows.end());
#endif
for (const auto& window : windows)
if (!window->IsClosed())
window->Close();

View File

@@ -7,6 +7,7 @@
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "base/strings/utf_string_conversions.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "ui/base/clipboard/scoped_clipboard_writer.h"
#include "atom/common/node_includes.h"
@@ -166,7 +167,13 @@ gfx::Image Clipboard::ReadImage(mate::Arguments* args) {
void Clipboard::WriteImage(const gfx::Image& image, mate::Arguments* args) {
ui::ScopedClipboardWriter writer(GetClipboardType(args));
writer.WriteImage(image.AsBitmap());
SkBitmap bmp;
// TODO(ferreus): Replace with sk_tools_utils::copy_to (chrome60)
if (image.AsBitmap().deepCopyTo(&bmp)) {
writer.WriteImage(bmp);
} else {
writer.WriteImage(image.AsBitmap());
}
}
#if !defined(OS_MACOSX)

View File

@@ -541,6 +541,13 @@ mate::Handle<NativeImage> NativeImage::CreateFromDataURL(
return CreateEmpty(isolate);
}
#if !defined(OS_MACOSX)
mate::Handle<NativeImage> NativeImage::CreateFromNamedImage(
mate::Arguments* args, const std::string& name) {
return CreateEmpty(args->isolate());
}
#endif
// static
void NativeImage::BuildPrototype(
v8::Isolate* isolate, v8::Local<v8::FunctionTemplate> prototype) {
@@ -609,6 +616,8 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
dict.SetMethod("createFromBuffer", &atom::api::NativeImage::CreateFromBuffer);
dict.SetMethod("createFromDataURL",
&atom::api::NativeImage::CreateFromDataURL);
dict.SetMethod("createFromNamedImage",
&atom::api::NativeImage::CreateFromNamedImage);
}
} // namespace

View File

@@ -53,6 +53,8 @@ class NativeImage : public mate::Wrappable<NativeImage> {
mate::Arguments* args, v8::Local<v8::Value> buffer);
static mate::Handle<NativeImage> CreateFromDataURL(
v8::Isolate* isolate, const GURL& url);
static mate::Handle<NativeImage> CreateFromNamedImage(
mate::Arguments* args, const std::string& name);
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::FunctionTemplate> prototype);

View File

@@ -6,10 +6,56 @@
#import <Cocoa/Cocoa.h>
#include "base/strings/sys_string_conversions.h"
#include "ui/gfx/color_utils.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image_skia_operations.h"
namespace atom {
namespace api {
NSData* bufferFromNSImage(NSImage* image) {
CGImageRef ref = [image CGImageForProposedRect:nil context:nil hints:nil];
NSBitmapImageRep* rep = [[NSBitmapImageRep alloc] initWithCGImage:ref];
[rep setSize:[image size]];
return [rep representationUsingType:NSPNGFileType properties:[[NSDictionary alloc] init]];
}
double safeShift(double in, double def) {
if (in >= 0 || in <= 1 || in == def) return in;
return def;
}
mate::Handle<NativeImage> NativeImage::CreateFromNamedImage(
mate::Arguments* args, const std::string& name) {
@autoreleasepool {
std::vector<double> hsl_shift;
NSImage* image = [NSImage imageNamed:base::SysUTF8ToNSString(name)];
if (!image.valid) {
return CreateEmpty(args->isolate());
}
NSData* png_data = bufferFromNSImage(image);
if (args->GetNext(&hsl_shift) && hsl_shift.size() == 3) {
gfx::Image gfx_image = gfx::Image::CreateFrom1xPNGBytes(
reinterpret_cast<const unsigned char*>((char *) [png_data bytes]), [png_data length]);
color_utils::HSL shift = {
safeShift(hsl_shift[0], -1),
safeShift(hsl_shift[1], 0.5),
safeShift(hsl_shift[2], 0.5)
};
png_data = bufferFromNSImage(gfx::Image(
gfx::ImageSkiaOperations::CreateHSLShiftedImage(
gfx_image.AsImageSkia(), shift)).CopyNSImage());
}
return CreateFromPNG(args->isolate(), (char *) [png_data bytes], [png_data length]);
}
}
void NativeImage::SetTemplateImage(bool setAsTemplate) {
[image_.AsNSImage() setTemplate:setAsTemplate];
}

View File

@@ -164,7 +164,15 @@ v8::Local<v8::Value> AtomBindings::GetSystemMemoryInfo(v8::Isolate* isolate,
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("total", mem_info.total);
dict.Set("free", mem_info.free);
// See Chromium's "base/process/process_metrics.h" for an explanation.
int free =
#if defined(OS_WIN)
mem_info.avail_phys;
#else
mem_info.free;
#endif
dict.Set("free", free);
// NB: These return bogus values on macOS
#if !defined(OS_MACOSX)
@@ -180,7 +188,14 @@ v8::Local<v8::Value> AtomBindings::GetCPUUsage(v8::Isolate* isolate) {
int processor_count = base::SysInfo::NumberOfProcessors();
dict.Set("percentCPUUsage",
metrics_->GetPlatformIndependentCPUUsage() / processor_count);
// NB: This will throw NOTIMPLEMENTED() on Windows
// For backwards compatibility, we'll return 0
#if !defined(OS_WIN)
dict.Set("idleWakeupsPerSecond", metrics_->GetIdleWakeupsPerSecond());
#else
dict.Set("idleWakeupsPerSecond", 0);
#endif
return dict.GetHandle();
}

View File

@@ -20,7 +20,8 @@ v8::Local<v8::Value> CallMethodWithArgs(v8::Isolate* isolate,
v8::MicrotasksScope::kRunMicrotasks);
// Use node::MakeCallback to call the callback, and it will also run pending
// tasks in Node.js.
return node::MakeCallback(isolate, obj, method, args->size(), &args->front());
return node::MakeCallback(isolate, obj, method, args->size(), &args->front(),
{0, 0}).ToLocalChecked();
}
} // namespace internal

View File

@@ -19,11 +19,11 @@ namespace atom {
namespace {
content::RenderView* GetCurrentRenderView() {
WebLocalFrame* frame = WebLocalFrame::frameForCurrentContext();
WebLocalFrame* frame = WebLocalFrame::FrameForCurrentContext();
if (!frame)
return nullptr;
WebView* view = frame->view();
WebView* view = frame->View();
if (!view)
return nullptr; // can happen during closing.

View File

@@ -17,7 +17,7 @@
#include "base/values.h"
#if defined(OS_WIN)
#include "atom/node/osfhandle.h"
#include <io.h>
#endif
namespace asar {
@@ -118,7 +118,7 @@ Archive::Archive(const base::FilePath& path)
: path_(path),
file_(path_, base::File::FLAG_OPEN | base::File::FLAG_READ),
#if defined(OS_WIN)
fd_(node::open_osfhandle(
fd_(_open_osfhandle(
reinterpret_cast<intptr_t>(file_.GetPlatformFile()), 0)),
#elif defined(OS_POSIX)
fd_(file_.GetPlatformFile()),
@@ -131,7 +131,7 @@ Archive::Archive(const base::FilePath& path)
Archive::~Archive() {
#if defined(OS_WIN)
if (fd_ != -1) {
node::close(fd_);
_close(fd_);
// Don't close the handle since we already closed the fd.
file_.TakePlatformFile();
}

View File

@@ -6,8 +6,8 @@
#define ATOM_COMMON_ATOM_VERSION_H_
#define ATOM_MAJOR_VERSION 1
#define ATOM_MINOR_VERSION 7
#define ATOM_PATCH_VERSION 8
#define ATOM_MINOR_VERSION 8
#define ATOM_PATCH_VERSION 2
#define ATOM_VERSION_IS_RELEASE 1

View File

@@ -8,7 +8,7 @@
#ifndef ATOM_COMMON_CHROME_VERSION_H_
#define ATOM_COMMON_CHROME_VERSION_H_
#define CHROME_VERSION_STRING "58.0.3029.110"
#define CHROME_VERSION_STRING "59.0.3071.115"
#define CHROME_VERSION "v" CHROME_VERSION_STRING
#endif // ATOM_COMMON_CHROME_VERSION_H_

View File

@@ -179,27 +179,27 @@ ui::KeyboardCode KeyboardCodeFromStr(const std::string& str, bool* shifted) {
int WebEventModifiersToEventFlags(int modifiers) {
int flags = 0;
if (modifiers & blink::WebInputEvent::ShiftKey)
if (modifiers & blink::WebInputEvent::kShiftKey)
flags |= ui::EF_SHIFT_DOWN;
if (modifiers & blink::WebInputEvent::ControlKey)
if (modifiers & blink::WebInputEvent::kControlKey)
flags |= ui::EF_CONTROL_DOWN;
if (modifiers & blink::WebInputEvent::AltKey)
if (modifiers & blink::WebInputEvent::kAltKey)
flags |= ui::EF_ALT_DOWN;
if (modifiers & blink::WebInputEvent::MetaKey)
if (modifiers & blink::WebInputEvent::kMetaKey)
flags |= ui::EF_COMMAND_DOWN;
if (modifiers & blink::WebInputEvent::CapsLockOn)
if (modifiers & blink::WebInputEvent::kCapsLockOn)
flags |= ui::EF_CAPS_LOCK_ON;
if (modifiers & blink::WebInputEvent::NumLockOn)
if (modifiers & blink::WebInputEvent::kNumLockOn)
flags |= ui::EF_NUM_LOCK_ON;
if (modifiers & blink::WebInputEvent::ScrollLockOn)
if (modifiers & blink::WebInputEvent::kScrollLockOn)
flags |= ui::EF_SCROLL_LOCK_ON;
if (modifiers & blink::WebInputEvent::LeftButtonDown)
if (modifiers & blink::WebInputEvent::kLeftButtonDown)
flags |= ui::EF_LEFT_MOUSE_BUTTON;
if (modifiers & blink::WebInputEvent::MiddleButtonDown)
if (modifiers & blink::WebInputEvent::kMiddleButtonDown)
flags |= ui::EF_MIDDLE_MOUSE_BUTTON;
if (modifiers & blink::WebInputEvent::RightButtonDown)
if (modifiers & blink::WebInputEvent::kRightButtonDown)
flags |= ui::EF_RIGHT_MOUSE_BUTTON;
if (modifiers & blink::WebInputEvent::IsAutoRepeat)
if (modifiers & blink::WebInputEvent::kIsAutoRepeat)
flags |= ui::EF_IS_REPEAT;
return flags;

View File

@@ -9,52 +9,52 @@ using Cursor = blink::WebCursorInfo::Type;
namespace atom {
std::string CursorTypeToString(const content::WebCursor::CursorInfo& info) {
std::string CursorTypeToString(const content::CursorInfo& info) {
switch (info.type) {
case Cursor::TypePointer: return "default";
case Cursor::TypeCross: return "crosshair";
case Cursor::TypeHand: return "pointer";
case Cursor::TypeIBeam: return "text";
case Cursor::TypeWait: return "wait";
case Cursor::TypeHelp: return "help";
case Cursor::TypeEastResize: return "e-resize";
case Cursor::TypeNorthResize: return "n-resize";
case Cursor::TypeNorthEastResize: return "ne-resize";
case Cursor::TypeNorthWestResize: return "nw-resize";
case Cursor::TypeSouthResize: return "s-resize";
case Cursor::TypeSouthEastResize: return "se-resize";
case Cursor::TypeSouthWestResize: return "sw-resize";
case Cursor::TypeWestResize: return "w-resize";
case Cursor::TypeNorthSouthResize: return "ns-resize";
case Cursor::TypeEastWestResize: return "ew-resize";
case Cursor::TypeNorthEastSouthWestResize: return "nesw-resize";
case Cursor::TypeNorthWestSouthEastResize: return "nwse-resize";
case Cursor::TypeColumnResize: return "col-resize";
case Cursor::TypeRowResize: return "row-resize";
case Cursor::TypeMiddlePanning: return "m-panning";
case Cursor::TypeEastPanning: return "e-panning";
case Cursor::TypeNorthPanning: return "n-panning";
case Cursor::TypeNorthEastPanning: return "ne-panning";
case Cursor::TypeNorthWestPanning: return "nw-panning";
case Cursor::TypeSouthPanning: return "s-panning";
case Cursor::TypeSouthEastPanning: return "se-panning";
case Cursor::TypeSouthWestPanning: return "sw-panning";
case Cursor::TypeWestPanning: return "w-panning";
case Cursor::TypeMove: return "move";
case Cursor::TypeVerticalText: return "vertical-text";
case Cursor::TypeCell: return "cell";
case Cursor::TypeContextMenu: return "context-menu";
case Cursor::TypeAlias: return "alias";
case Cursor::TypeProgress: return "progress";
case Cursor::TypeNoDrop: return "nodrop";
case Cursor::TypeCopy: return "copy";
case Cursor::TypeNone: return "none";
case Cursor::TypeNotAllowed: return "not-allowed";
case Cursor::TypeZoomIn: return "zoom-in";
case Cursor::TypeZoomOut: return "zoom-out";
case Cursor::TypeGrab: return "grab";
case Cursor::TypeGrabbing: return "grabbing";
case Cursor::TypeCustom: return "custom";
case Cursor::kTypePointer: return "default";
case Cursor::kTypeCross: return "crosshair";
case Cursor::kTypeHand: return "pointer";
case Cursor::kTypeIBeam: return "text";
case Cursor::kTypeWait: return "wait";
case Cursor::kTypeHelp: return "help";
case Cursor::kTypeEastResize: return "e-resize";
case Cursor::kTypeNorthResize: return "n-resize";
case Cursor::kTypeNorthEastResize: return "ne-resize";
case Cursor::kTypeNorthWestResize: return "nw-resize";
case Cursor::kTypeSouthResize: return "s-resize";
case Cursor::kTypeSouthEastResize: return "se-resize";
case Cursor::kTypeSouthWestResize: return "sw-resize";
case Cursor::kTypeWestResize: return "w-resize";
case Cursor::kTypeNorthSouthResize: return "ns-resize";
case Cursor::kTypeEastWestResize: return "ew-resize";
case Cursor::kTypeNorthEastSouthWestResize: return "nesw-resize";
case Cursor::kTypeNorthWestSouthEastResize: return "nwse-resize";
case Cursor::kTypeColumnResize: return "col-resize";
case Cursor::kTypeRowResize: return "row-resize";
case Cursor::kTypeMiddlePanning: return "m-panning";
case Cursor::kTypeEastPanning: return "e-panning";
case Cursor::kTypeNorthPanning: return "n-panning";
case Cursor::kTypeNorthEastPanning: return "ne-panning";
case Cursor::kTypeNorthWestPanning: return "nw-panning";
case Cursor::kTypeSouthPanning: return "s-panning";
case Cursor::kTypeSouthEastPanning: return "se-panning";
case Cursor::kTypeSouthWestPanning: return "sw-panning";
case Cursor::kTypeWestPanning: return "w-panning";
case Cursor::kTypeMove: return "move";
case Cursor::kTypeVerticalText: return "vertical-text";
case Cursor::kTypeCell: return "cell";
case Cursor::kTypeContextMenu: return "context-menu";
case Cursor::kTypeAlias: return "alias";
case Cursor::kTypeProgress: return "progress";
case Cursor::kTypeNoDrop: return "nodrop";
case Cursor::kTypeCopy: return "copy";
case Cursor::kTypeNone: return "none";
case Cursor::kTypeNotAllowed: return "not-allowed";
case Cursor::kTypeZoomIn: return "zoom-in";
case Cursor::kTypeZoomOut: return "zoom-out";
case Cursor::kTypeGrab: return "grab";
case Cursor::kTypeGrabbing: return "grabbing";
case Cursor::kTypeCustom: return "custom";
default: return "default";
}
}

View File

@@ -29,7 +29,7 @@
namespace atom {
// Returns the cursor's type as a string.
std::string CursorTypeToString(const content::WebCursor::CursorInfo& info);
std::string CursorTypeToString(const content::CursorInfo& info);
} // namespace atom

View File

@@ -54,33 +54,33 @@ struct Converter<blink::WebInputEvent::Type> {
blink::WebInputEvent::Type* out) {
std::string type = base::ToLowerASCII(V8ToString(val));
if (type == "mousedown")
*out = blink::WebInputEvent::MouseDown;
*out = blink::WebInputEvent::kMouseDown;
else if (type == "mouseup")
*out = blink::WebInputEvent::MouseUp;
*out = blink::WebInputEvent::kMouseUp;
else if (type == "mousemove")
*out = blink::WebInputEvent::MouseMove;
*out = blink::WebInputEvent::kMouseMove;
else if (type == "mouseenter")
*out = blink::WebInputEvent::MouseEnter;
*out = blink::WebInputEvent::kMouseEnter;
else if (type == "mouseleave")
*out = blink::WebInputEvent::MouseLeave;
*out = blink::WebInputEvent::kMouseLeave;
else if (type == "contextmenu")
*out = blink::WebInputEvent::ContextMenu;
*out = blink::WebInputEvent::kContextMenu;
else if (type == "mousewheel")
*out = blink::WebInputEvent::MouseWheel;
*out = blink::WebInputEvent::kMouseWheel;
else if (type == "keydown")
*out = blink::WebInputEvent::RawKeyDown;
*out = blink::WebInputEvent::kRawKeyDown;
else if (type == "keyup")
*out = blink::WebInputEvent::KeyUp;
*out = blink::WebInputEvent::kKeyUp;
else if (type == "char")
*out = blink::WebInputEvent::Char;
*out = blink::WebInputEvent::kChar;
else if (type == "touchstart")
*out = blink::WebInputEvent::TouchStart;
*out = blink::WebInputEvent::kTouchStart;
else if (type == "touchmove")
*out = blink::WebInputEvent::TouchMove;
*out = blink::WebInputEvent::kTouchMove;
else if (type == "touchend")
*out = blink::WebInputEvent::TouchEnd;
*out = blink::WebInputEvent::kTouchEnd;
else if (type == "touchcancel")
*out = blink::WebInputEvent::TouchCancel;
*out = blink::WebInputEvent::kTouchCancel;
return true;
}
};
@@ -91,11 +91,11 @@ struct Converter<blink::WebMouseEvent::Button> {
blink::WebMouseEvent::Button* out) {
std::string button = base::ToLowerASCII(V8ToString(val));
if (button == "left")
*out = blink::WebMouseEvent::Button::Left;
*out = blink::WebMouseEvent::Button::kLeft;
else if (button == "middle")
*out = blink::WebMouseEvent::Button::Middle;
*out = blink::WebMouseEvent::Button::kMiddle;
else if (button == "right")
*out = blink::WebMouseEvent::Button::Right;
*out = blink::WebMouseEvent::Button::kRight;
else
return false;
return true;
@@ -108,37 +108,37 @@ struct Converter<blink::WebInputEvent::Modifiers> {
blink::WebInputEvent::Modifiers* out) {
std::string modifier = base::ToLowerASCII(V8ToString(val));
if (modifier == "shift")
*out = blink::WebInputEvent::ShiftKey;
*out = blink::WebInputEvent::kShiftKey;
else if (modifier == "control" || modifier == "ctrl")
*out = blink::WebInputEvent::ControlKey;
*out = blink::WebInputEvent::kControlKey;
else if (modifier == "alt")
*out = blink::WebInputEvent::AltKey;
*out = blink::WebInputEvent::kAltKey;
else if (modifier == "meta" || modifier == "command" || modifier == "cmd")
*out = blink::WebInputEvent::MetaKey;
*out = blink::WebInputEvent::kMetaKey;
else if (modifier == "iskeypad")
*out = blink::WebInputEvent::IsKeyPad;
*out = blink::WebInputEvent::kIsKeyPad;
else if (modifier == "isautorepeat")
*out = blink::WebInputEvent::IsAutoRepeat;
*out = blink::WebInputEvent::kIsAutoRepeat;
else if (modifier == "leftbuttondown")
*out = blink::WebInputEvent::LeftButtonDown;
*out = blink::WebInputEvent::kLeftButtonDown;
else if (modifier == "middlebuttondown")
*out = blink::WebInputEvent::MiddleButtonDown;
*out = blink::WebInputEvent::kMiddleButtonDown;
else if (modifier == "rightbuttondown")
*out = blink::WebInputEvent::RightButtonDown;
*out = blink::WebInputEvent::kRightButtonDown;
else if (modifier == "capslock")
*out = blink::WebInputEvent::CapsLockOn;
*out = blink::WebInputEvent::kCapsLockOn;
else if (modifier == "numlock")
*out = blink::WebInputEvent::NumLockOn;
*out = blink::WebInputEvent::kNumLockOn;
else if (modifier == "left")
*out = blink::WebInputEvent::IsLeft;
*out = blink::WebInputEvent::kIsLeft;
else if (modifier == "right")
*out = blink::WebInputEvent::IsRight;
*out = blink::WebInputEvent::kIsRight;
return true;
}
};
int GetWebInputEventType(v8::Isolate* isolate, v8::Local<v8::Value> val) {
blink::WebInputEvent::Type type = blink::WebInputEvent::Undefined;
blink::WebInputEvent::Type type = blink::WebInputEvent::kUndefined;
mate::Dictionary dict;
ConvertFromV8(isolate, val, &dict) && dict.Get("type", &type);
return type;
@@ -153,11 +153,11 @@ bool Converter<blink::WebInputEvent>::FromV8(
blink::WebInputEvent::Type type;
if (!dict.Get("type", &type))
return false;
out->setType(type);
out->SetType(type);
std::vector<blink::WebInputEvent::Modifiers> modifiers;
if (dict.Get("modifiers", &modifiers))
out->setModifiers(VectorToBitArray(modifiers));
out->setTimeStampSeconds(base::Time::Now().ToDoubleT());
out->SetModifiers(VectorToBitArray(modifiers));
out->SetTimeStampSeconds(base::Time::Now().ToDoubleT());
return true;
}
@@ -176,31 +176,31 @@ bool Converter<blink::WebKeyboardEvent>::FromV8(
bool shifted = false;
ui::KeyboardCode keyCode = atom::KeyboardCodeFromStr(str, &shifted);
out->windowsKeyCode = keyCode;
out->windows_key_code = keyCode;
if (shifted)
out->setModifiers(out->modifiers() | blink::WebInputEvent::ShiftKey);
out->SetModifiers(out->GetModifiers() | blink::WebInputEvent::kShiftKey);
ui::DomCode domCode = ui::UsLayoutKeyboardCodeToDomCode(keyCode);
out->domCode = static_cast<int>(domCode);
out->dom_code = static_cast<int>(domCode);
ui::DomKey domKey;
ui::KeyboardCode dummy_code;
int flags = atom::WebEventModifiersToEventFlags(out->modifiers());
int flags = atom::WebEventModifiersToEventFlags(out->GetModifiers());
if (ui::DomCodeToUsLayoutDomKey(domCode, flags, &domKey, &dummy_code))
out->domKey = static_cast<int>(domKey);
out->dom_key = static_cast<int>(domKey);
if ((out->type() == blink::WebInputEvent::Char ||
out->type() == blink::WebInputEvent::RawKeyDown)) {
if ((out->GetType() == blink::WebInputEvent::kChar ||
out->GetType() == blink::WebInputEvent::kRawKeyDown)) {
// Make sure to not read beyond the buffer in case some bad code doesn't
// NULL-terminate it (this is called from plugins).
size_t text_length_cap = blink::WebKeyboardEvent::textLengthCap;
size_t text_length_cap = blink::WebKeyboardEvent::kTextLengthCap;
base::string16 text16 = base::UTF8ToUTF16(str);
memset(out->text, 0, text_length_cap);
memset(out->unmodifiedText, 0, text_length_cap);
memset(out->unmodified_text, 0, text_length_cap);
for (size_t i = 0; i < std::min(text_length_cap, text16.size()); ++i) {
out->text[i] = text16[i];
out->unmodifiedText[i] = text16[i];
out->unmodified_text[i] = text16[i];
}
}
return true;
@@ -222,20 +222,20 @@ v8::Local<v8::Value> Converter<content::NativeWebKeyboardEvent>::ToV8(
v8::Isolate* isolate, const content::NativeWebKeyboardEvent& in) {
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
if (in.type() == blink::WebInputEvent::Type::RawKeyDown)
if (in.GetType() == blink::WebInputEvent::Type::kRawKeyDown)
dict.Set("type", "keyDown");
else if (in.type() == blink::WebInputEvent::Type::KeyUp)
else if (in.GetType() == blink::WebInputEvent::Type::kKeyUp)
dict.Set("type", "keyUp");
dict.Set("key", ui::KeycodeConverter::DomKeyToKeyString(in.domKey));
dict.Set("key", ui::KeycodeConverter::DomKeyToKeyString(in.dom_key));
dict.Set("code", ui::KeycodeConverter::DomCodeToCodeString(
static_cast<ui::DomCode>(in.domCode)));
static_cast<ui::DomCode>(in.dom_code)));
using Modifiers = blink::WebInputEvent::Modifiers;
dict.Set("isAutoRepeat", (in.modifiers() & Modifiers::IsAutoRepeat) != 0);
dict.Set("shift", (in.modifiers() & Modifiers::ShiftKey) != 0);
dict.Set("control", (in.modifiers() & Modifiers::ControlKey) != 0);
dict.Set("alt", (in.modifiers() & Modifiers::AltKey) != 0);
dict.Set("meta", (in.modifiers() & Modifiers::MetaKey) != 0);
dict.Set("isAutoRepeat", (in.GetModifiers() & Modifiers::kIsAutoRepeat) != 0);
dict.Set("shift", (in.GetModifiers() & Modifiers::kShiftKey) != 0);
dict.Set("control", (in.GetModifiers() & Modifiers::kControlKey) != 0);
dict.Set("alt", (in.GetModifiers() & Modifiers::kAltKey) != 0);
dict.Set("meta", (in.GetModifiers() & Modifiers::kMetaKey) != 0);
return dict.GetHandle();
}
@@ -247,15 +247,25 @@ bool Converter<blink::WebMouseEvent>::FromV8(
return false;
if (!ConvertFromV8(isolate, val, static_cast<blink::WebInputEvent*>(out)))
return false;
if (!dict.Get("x", &out->x) || !dict.Get("y", &out->y))
float x = 0.f;
float y = 0.f;
if (!dict.Get("x", &x) || !dict.Get("y", &y))
return false;
out->SetPositionInWidget(x, y);
if (!dict.Get("button", &out->button))
out->button = blink::WebMouseEvent::Button::Left;
dict.Get("globalX", &out->globalX);
dict.Get("globalY", &out->globalY);
dict.Get("movementX", &out->movementX);
dict.Get("movementY", &out->movementY);
dict.Get("clickCount", &out->clickCount);
out->button = blink::WebMouseEvent::Button::kLeft;
float global_x = 0.f;
float global_y = 0.f;
dict.Get("globalX", &global_x);
dict.Get("globalY", &global_y);
out->SetPositionInScreen(global_x, global_y);
dict.Get("movementX", &out->movement_x);
dict.Get("movementY", &out->movement_y);
dict.Get("clickCount", &out->click_count);
return true;
}
@@ -267,20 +277,20 @@ bool Converter<blink::WebMouseWheelEvent>::FromV8(
return false;
if (!ConvertFromV8(isolate, val, static_cast<blink::WebMouseEvent*>(out)))
return false;
dict.Get("deltaX", &out->deltaX);
dict.Get("deltaY", &out->deltaY);
dict.Get("wheelTicksX", &out->wheelTicksX);
dict.Get("wheelTicksY", &out->wheelTicksY);
dict.Get("accelerationRatioX", &out->accelerationRatioX);
dict.Get("accelerationRatioY", &out->accelerationRatioY);
dict.Get("hasPreciseScrollingDeltas", &out->hasPreciseScrollingDeltas);
dict.Get("deltaX", &out->delta_x);
dict.Get("deltaY", &out->delta_y);
dict.Get("wheelTicksX", &out->wheel_ticks_x);
dict.Get("wheelTicksY", &out->wheel_ticks_y);
dict.Get("accelerationRatioX", &out->acceleration_ratio_x);
dict.Get("accelerationRatioY", &out->acceleration_ratio_y);
dict.Get("hasPreciseScrollingDeltas", &out->has_precise_scrolling_deltas);
#if defined(USE_AURA)
// Matches the behavior of ui/events/blink/web_input_event_traits.cc:
bool can_scroll = true;
if (dict.Get("canScroll", &can_scroll) && !can_scroll) {
out->hasPreciseScrollingDeltas = false;
out->setModifiers(out->modifiers() & ~blink::WebInputEvent::ControlKey);
out->has_precise_scrolling_deltas = false;
out->SetModifiers(out->GetModifiers() & ~blink::WebInputEvent::kControlKey);
}
#endif
return true;
@@ -321,18 +331,18 @@ bool Converter<blink::WebDeviceEmulationParams>::FromV8(
if (dict.Get("screenPosition", &screen_position)) {
screen_position = base::ToLowerASCII(screen_position);
if (screen_position == "mobile")
out->screenPosition = blink::WebDeviceEmulationParams::Mobile;
out->screen_position = blink::WebDeviceEmulationParams::kMobile;
else if (screen_position == "desktop")
out->screenPosition = blink::WebDeviceEmulationParams::Desktop;
out->screen_position = blink::WebDeviceEmulationParams::kDesktop;
else
return false;
}
dict.Get("screenSize", &out->screenSize);
dict.Get("viewPosition", &out->viewPosition);
dict.Get("deviceScaleFactor", &out->deviceScaleFactor);
dict.Get("viewSize", &out->viewSize);
dict.Get("fitToView", &out->fitToView);
dict.Get("screenSize", &out->screen_size);
dict.Get("viewPosition", &out->view_position);
dict.Get("deviceScaleFactor", &out->device_scale_factor);
dict.Get("viewSize", &out->view_size);
dict.Get("fitToView", &out->fit_to_view);
dict.Get("offset", &out->offset);
dict.Get("scale", &out->scale);
return true;
@@ -347,10 +357,10 @@ bool Converter<blink::WebFindOptions>::FromV8(
return false;
dict.Get("forward", &out->forward);
dict.Get("matchCase", &out->matchCase);
dict.Get("findNext", &out->findNext);
dict.Get("wordStart", &out->wordStart);
dict.Get("medialCapitalAsWordStart", &out->medialCapitalAsWordStart);
dict.Get("matchCase", &out->match_case);
dict.Get("findNext", &out->find_next);
dict.Get("wordStart", &out->word_start);
dict.Get("medialCapitalAsWordStart", &out->medial_capital_as_word_start);
return true;
}
@@ -358,17 +368,17 @@ bool Converter<blink::WebFindOptions>::FromV8(
v8::Local<v8::Value> Converter<blink::WebContextMenuData::MediaType>::ToV8(
v8::Isolate* isolate, const blink::WebContextMenuData::MediaType& in) {
switch (in) {
case blink::WebContextMenuData::MediaTypeImage:
case blink::WebContextMenuData::kMediaTypeImage:
return mate::StringToV8(isolate, "image");
case blink::WebContextMenuData::MediaTypeVideo:
case blink::WebContextMenuData::kMediaTypeVideo:
return mate::StringToV8(isolate, "video");
case blink::WebContextMenuData::MediaTypeAudio:
case blink::WebContextMenuData::kMediaTypeAudio:
return mate::StringToV8(isolate, "audio");
case blink::WebContextMenuData::MediaTypeCanvas:
case blink::WebContextMenuData::kMediaTypeCanvas:
return mate::StringToV8(isolate, "canvas");
case blink::WebContextMenuData::MediaTypeFile:
case blink::WebContextMenuData::kMediaTypeFile:
return mate::StringToV8(isolate, "file");
case blink::WebContextMenuData::MediaTypePlugin:
case blink::WebContextMenuData::kMediaTypePlugin:
return mate::StringToV8(isolate, "plugin");
default:
return mate::StringToV8(isolate, "none");
@@ -380,11 +390,11 @@ v8::Local<v8::Value> Converter<blink::WebContextMenuData::InputFieldType>::ToV8(
v8::Isolate* isolate,
const blink::WebContextMenuData::InputFieldType& in) {
switch (in) {
case blink::WebContextMenuData::InputFieldTypePlainText:
case blink::WebContextMenuData::kInputFieldTypePlainText:
return mate::StringToV8(isolate, "plainText");
case blink::WebContextMenuData::InputFieldTypePassword:
case blink::WebContextMenuData::kInputFieldTypePassword:
return mate::StringToV8(isolate, "password");
case blink::WebContextMenuData::InputFieldTypeOther:
case blink::WebContextMenuData::kInputFieldTypeOther:
return mate::StringToV8(isolate, "other");
default:
return mate::StringToV8(isolate, "none");
@@ -394,16 +404,16 @@ v8::Local<v8::Value> Converter<blink::WebContextMenuData::InputFieldType>::ToV8(
v8::Local<v8::Value> EditFlagsToV8(v8::Isolate* isolate, int editFlags) {
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("canUndo",
!!(editFlags & blink::WebContextMenuData::CanUndo));
!!(editFlags & blink::WebContextMenuData::kCanUndo));
dict.Set("canRedo",
!!(editFlags & blink::WebContextMenuData::CanRedo));
!!(editFlags & blink::WebContextMenuData::kCanRedo));
dict.Set("canCut",
!!(editFlags & blink::WebContextMenuData::CanCut));
!!(editFlags & blink::WebContextMenuData::kCanCut));
dict.Set("canCopy",
!!(editFlags & blink::WebContextMenuData::CanCopy));
!!(editFlags & blink::WebContextMenuData::kCanCopy));
bool pasteFlag = false;
if (editFlags & blink::WebContextMenuData::CanPaste) {
if (editFlags & blink::WebContextMenuData::kCanPaste) {
std::vector<base::string16> types;
bool ignore;
ui::Clipboard::GetForCurrentThread()->ReadAvailableTypes(
@@ -413,9 +423,9 @@ v8::Local<v8::Value> EditFlagsToV8(v8::Isolate* isolate, int editFlags) {
dict.Set("canPaste", pasteFlag);
dict.Set("canDelete",
!!(editFlags & blink::WebContextMenuData::CanDelete));
!!(editFlags & blink::WebContextMenuData::kCanDelete));
dict.Set("canSelectAll",
!!(editFlags & blink::WebContextMenuData::CanSelectAll));
!!(editFlags & blink::WebContextMenuData::kCanSelectAll));
return mate::ConvertToV8(isolate, dict);
}
@@ -423,21 +433,21 @@ v8::Local<v8::Value> EditFlagsToV8(v8::Isolate* isolate, int editFlags) {
v8::Local<v8::Value> MediaFlagsToV8(v8::Isolate* isolate, int mediaFlags) {
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("inError",
!!(mediaFlags & blink::WebContextMenuData::MediaInError));
!!(mediaFlags & blink::WebContextMenuData::kMediaInError));
dict.Set("isPaused",
!!(mediaFlags & blink::WebContextMenuData::MediaPaused));
!!(mediaFlags & blink::WebContextMenuData::kMediaPaused));
dict.Set("isMuted",
!!(mediaFlags & blink::WebContextMenuData::MediaMuted));
!!(mediaFlags & blink::WebContextMenuData::kMediaMuted));
dict.Set("hasAudio",
!!(mediaFlags & blink::WebContextMenuData::MediaHasAudio));
!!(mediaFlags & blink::WebContextMenuData::kMediaHasAudio));
dict.Set("isLooping",
(mediaFlags & blink::WebContextMenuData::MediaLoop) != 0);
(mediaFlags & blink::WebContextMenuData::kMediaLoop) != 0);
dict.Set("isControlsVisible",
(mediaFlags & blink::WebContextMenuData::MediaControls) != 0);
(mediaFlags & blink::WebContextMenuData::kMediaControls) != 0);
dict.Set("canToggleControls",
!!(mediaFlags & blink::WebContextMenuData::MediaCanToggleControls));
!!(mediaFlags & blink::WebContextMenuData::kMediaCanToggleControls));
dict.Set("canRotate",
!!(mediaFlags & blink::WebContextMenuData::MediaCanRotate));
!!(mediaFlags & blink::WebContextMenuData::kMediaCanRotate));
return mate::ConvertToV8(isolate, dict);
}
@@ -447,7 +457,7 @@ v8::Local<v8::Value> Converter<blink::WebCache::ResourceTypeStat>::ToV8(
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("count", static_cast<uint32_t>(stat.count));
dict.Set("size", static_cast<double>(stat.size));
dict.Set("liveSize", static_cast<double>(stat.decodedSize));
dict.Set("liveSize", static_cast<double>(stat.decoded_size));
return dict.GetHandle();
}
@@ -457,8 +467,8 @@ v8::Local<v8::Value> Converter<blink::WebCache::ResourceTypeStats>::ToV8(
mate::Dictionary dict = mate::Dictionary::CreateEmpty(isolate);
dict.Set("images", stats.images);
dict.Set("scripts", stats.scripts);
dict.Set("cssStyleSheets", stats.cssStyleSheets);
dict.Set("xslStyleSheets", stats.xslStyleSheets);
dict.Set("cssStyleSheets", stats.css_style_sheets);
dict.Set("xslStyleSheets", stats.xsl_style_sheets);
dict.Set("fonts", stats.fonts);
dict.Set("other", stats.other);
return dict.GetHandle();

View File

@@ -109,7 +109,7 @@ v8::Local<v8::Value> Converter<ContextMenuParamsWithWebContents>::ToV8(
dict.Set("mediaType", params.media_type);
dict.Set("mediaFlags", MediaFlagsToV8(isolate, params.media_flags));
bool has_image_contents =
(params.media_type == blink::WebContextMenuData::MediaTypeImage) &&
(params.media_type == blink::WebContextMenuData::kMediaTypeImage) &&
params.has_image_contents;
dict.Set("hasImageContents", has_image_contents);
dict.Set("isEditable", params.is_editable);
@@ -215,7 +215,7 @@ Converter<scoped_refptr<ResourceRequestBodyImpl>>::ToV8(
auto type = element.type();
if (type == ResourceRequestBodyImpl::Element::TYPE_BYTES) {
std::unique_ptr<base::Value> bytes(
base::BinaryValue::CreateWithCopiedBuffer(
base::Value::CreateWithCopiedBuffer(
element.bytes(), static_cast<size_t>(element.length())));
post_data_dict->SetString("type", "rawData");
post_data_dict->Set("bytes", std::move(bytes));
@@ -260,7 +260,7 @@ bool Converter<scoped_refptr<ResourceRequestBodyImpl>>::FromV8(
return false;
dict->GetString("type", &type);
if (type == "rawData") {
base::BinaryValue* bytes = nullptr;
base::Value* bytes = nullptr;
dict->GetBinary("bytes", &bytes);
(*out)->AppendBytes(bytes->GetBuffer(), bytes->GetSize());
} else if (type == "file") {

View File

@@ -196,7 +196,7 @@ void GetUploadData(base::ListValue* upload_data_list,
const net::UploadBytesElementReader* bytes_reader =
reader->AsBytesReader();
std::unique_ptr<base::Value> bytes(
base::BinaryValue::CreateWithCopiedBuffer(bytes_reader->bytes(),
base::Value::CreateWithCopiedBuffer(bytes_reader->bytes(),
bytes_reader->length()));
upload_data_dict->Set("bytes", std::move(bytes));
} else if (reader->AsFileReader()) {

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