mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
Compare commits
316 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ce3d9f44ff | ||
|
|
c5c686fe8c | ||
|
|
59c95f6a7d | ||
|
|
a53bed567e | ||
|
|
9b68777b4b | ||
|
|
3b1be743ef | ||
|
|
b987656f1f | ||
|
|
e0d0e7651f | ||
|
|
922def8ce0 | ||
|
|
d9c22396ea | ||
|
|
9f30933d3a | ||
|
|
8482575d1f | ||
|
|
286ad19771 | ||
|
|
27d2dbf375 | ||
|
|
657b1cf63a | ||
|
|
0477c01fae | ||
|
|
fdc07dea17 | ||
|
|
85838fbf1a | ||
|
|
0342854e25 | ||
|
|
8a62f62e50 | ||
|
|
bedea89dcf | ||
|
|
399f47ef0f | ||
|
|
8aae7c4440 | ||
|
|
4663fdb446 | ||
|
|
4a508e0e41 | ||
|
|
21a09d3ae8 | ||
|
|
2505f8b8b2 | ||
|
|
32cd068427 | ||
|
|
b52771e729 | ||
|
|
69d958b94e | ||
|
|
b77c03357c | ||
|
|
c677a44688 | ||
|
|
b6875ad49b | ||
|
|
296d5c4515 | ||
|
|
2cdfef286a | ||
|
|
83024ea509 | ||
|
|
0611f9156f | ||
|
|
e2bdbae262 | ||
|
|
b54e786b09 | ||
|
|
b5bc8c9811 | ||
|
|
476b61322f | ||
|
|
6f082b630d | ||
|
|
0bb7abd7a4 | ||
|
|
ae5586408f | ||
|
|
a4342fd5ba | ||
|
|
1a6677bdc3 | ||
|
|
6eee6c181d | ||
|
|
5c8f2d4e69 | ||
|
|
15f59b54dd | ||
|
|
e87041bcfc | ||
|
|
1804466334 | ||
|
|
a9301ea1d0 | ||
|
|
a0770580e9 | ||
|
|
ee71b2044e | ||
|
|
665363b356 | ||
|
|
b68eccf784 | ||
|
|
62f9c3def0 | ||
|
|
a360ef7c8d | ||
|
|
9f9f772ff5 | ||
|
|
c4b240170d | ||
|
|
7006a14031 | ||
|
|
d46c64f64b | ||
|
|
5bd3cfc4f6 | ||
|
|
2e172a1053 | ||
|
|
2f5345e10d | ||
|
|
2a4b04bac6 | ||
|
|
30e931f10b | ||
|
|
266fadcb96 | ||
|
|
475f624113 | ||
|
|
de76ab97fb | ||
|
|
414c91a637 | ||
|
|
adce07785a | ||
|
|
1479f73612 | ||
|
|
5e8c478b2c | ||
|
|
db056f8730 | ||
|
|
f5dc8fc80d | ||
|
|
fa011c3d97 | ||
|
|
fdc10e4e5f | ||
|
|
73ce16fc52 | ||
|
|
b5a8cfb704 | ||
|
|
dc82553fc3 | ||
|
|
1df033dce8 | ||
|
|
2c0b50a7e9 | ||
|
|
9bae54f917 | ||
|
|
9eac8ef266 | ||
|
|
24d615d428 | ||
|
|
99410217b9 | ||
|
|
46cb6e68f6 | ||
|
|
8b88dc6a94 | ||
|
|
d6b36bb487 | ||
|
|
b8d918d24f | ||
|
|
b19cfba98e | ||
|
|
c497eef3b3 | ||
|
|
57812616b9 | ||
|
|
b43386b273 | ||
|
|
f8f7ca1d57 | ||
|
|
105ad369ab | ||
|
|
ff724634f2 | ||
|
|
0b8eb6ad90 | ||
|
|
66292a2787 | ||
|
|
12d5474077 | ||
|
|
8328bce3f6 | ||
|
|
c62c943bdb | ||
|
|
ceccf1b48a | ||
|
|
6af7388ac0 | ||
|
|
d16d5b290a | ||
|
|
fbd9501c61 | ||
|
|
578b24ae8a | ||
|
|
5b2c0110dc | ||
|
|
98fbe5127b | ||
|
|
8e2fdc178b | ||
|
|
757df39941 | ||
|
|
dfad907530 | ||
|
|
04d1075db5 | ||
|
|
8a138fafd4 | ||
|
|
819ab5cd0c | ||
|
|
dead7caab2 | ||
|
|
14542f4fc8 | ||
|
|
8a52374951 | ||
|
|
cfc615a6c1 | ||
|
|
af0690fb88 | ||
|
|
c80aaa2980 | ||
|
|
521f61d7db | ||
|
|
2d1f70c1cf | ||
|
|
327c7bc3cc | ||
|
|
9e2842c9ca | ||
|
|
7457eccdee | ||
|
|
2942eae9f2 | ||
|
|
87cb2ece80 | ||
|
|
042074cab1 | ||
|
|
bd81b24b99 | ||
|
|
bb2f3a82d9 | ||
|
|
cda129b073 | ||
|
|
adb130cefa | ||
|
|
860b15ef8a | ||
|
|
1679115302 | ||
|
|
8395745cc1 | ||
|
|
dd706ea6e2 | ||
|
|
6856d203c5 | ||
|
|
29471ff8b5 | ||
|
|
2495583b5e | ||
|
|
0b780def24 | ||
|
|
5a50ce4157 | ||
|
|
4b9f78e375 | ||
|
|
c9b549ae69 | ||
|
|
bb0e68e563 | ||
|
|
0663b9dae2 | ||
|
|
2ce42af6e4 | ||
|
|
47463ae5cb | ||
|
|
d813537e38 | ||
|
|
7148f6d144 | ||
|
|
52d596e576 | ||
|
|
1f849ec7b0 | ||
|
|
610ab0c0a5 | ||
|
|
4e93b567e2 | ||
|
|
2d6dd9f4d2 | ||
|
|
eb31df2940 | ||
|
|
99f6bf045f | ||
|
|
fac9ea3356 | ||
|
|
246d6cbcf7 | ||
|
|
29c6d1e46f | ||
|
|
92c76bac2b | ||
|
|
dbbc35bd13 | ||
|
|
dab9dad9db | ||
|
|
4176d542a5 | ||
|
|
e19c50223b | ||
|
|
5bdc200376 | ||
|
|
f2c8ea085b | ||
|
|
d8d0f15ca8 | ||
|
|
38a871aa4b | ||
|
|
e8d648bcba | ||
|
|
c7562dbfd0 | ||
|
|
54c948409e | ||
|
|
70a83ad069 | ||
|
|
e98953a5a5 | ||
|
|
78b856268e | ||
|
|
1d1db66abd | ||
|
|
b6787a9b34 | ||
|
|
7eecb84898 | ||
|
|
0c99f3baa6 | ||
|
|
72d6a13e9e | ||
|
|
43e44f8c35 | ||
|
|
4e82f4c672 | ||
|
|
7fa1296a17 | ||
|
|
f1ad8836d1 | ||
|
|
4834eed520 | ||
|
|
0f15dd04af | ||
|
|
0b8efc434d | ||
|
|
3f3e66916a | ||
|
|
fd9a8f4b91 | ||
|
|
ac6c2ce69a | ||
|
|
e81baf759a | ||
|
|
b28a241dbf | ||
|
|
afd4052bde | ||
|
|
a8c227d5f5 | ||
|
|
9646c28a41 | ||
|
|
3678f13dfb | ||
|
|
98a7f08be2 | ||
|
|
3b3a025ed4 | ||
|
|
64622ceae3 | ||
|
|
06d681c66a | ||
|
|
c8738a88a4 | ||
|
|
faf40457c5 | ||
|
|
353b485202 | ||
|
|
8e94856cc8 | ||
|
|
b9f6d6dffc | ||
|
|
8093300a43 | ||
|
|
da407200d2 | ||
|
|
443a4b8f2f | ||
|
|
509ce0d5cb | ||
|
|
903ff0b61a | ||
|
|
2ca6be69e2 | ||
|
|
054b6a9817 | ||
|
|
6556602bdc | ||
|
|
2876f15063 | ||
|
|
85f5ef2ab1 | ||
|
|
53fca43d89 | ||
|
|
549df36f00 | ||
|
|
aae576b484 | ||
|
|
b76615f3e7 | ||
|
|
878d25e91e | ||
|
|
ab315e502f | ||
|
|
564c0b41df | ||
|
|
382a00493b | ||
|
|
f0924df68a | ||
|
|
6b37f30bd6 | ||
|
|
86de75deef | ||
|
|
bedd0a11ba | ||
|
|
778078973b | ||
|
|
a26976a161 | ||
|
|
8a7acfc6c0 | ||
|
|
03a88883b6 | ||
|
|
59a8be53c2 | ||
|
|
f55379ed5b | ||
|
|
ef869fb2ff | ||
|
|
1b9649b481 | ||
|
|
fa6d499a4e | ||
|
|
0afac1e05a | ||
|
|
66f2d18d8b | ||
|
|
b75bfe0e92 | ||
|
|
1cae81c0d6 | ||
|
|
92ab227397 | ||
|
|
076535bc06 | ||
|
|
071a55974a | ||
|
|
c21c89c0ce | ||
|
|
8e6e1610a4 | ||
|
|
0b694dffd8 | ||
|
|
7c8bed7bfc | ||
|
|
209840871c | ||
|
|
ea99037f3b | ||
|
|
331d0481bb | ||
|
|
2c61070b36 | ||
|
|
502c0f0df7 | ||
|
|
aa49e4790f | ||
|
|
3490ce507a | ||
|
|
c1f3d22910 | ||
|
|
f1bca5dd0f | ||
|
|
7861eec426 | ||
|
|
a02707f998 | ||
|
|
f214e88784 | ||
|
|
45e2dd2ab5 | ||
|
|
f905bb64f6 | ||
|
|
8612ad0459 | ||
|
|
3bbcc1efd8 | ||
|
|
6dac8da91f | ||
|
|
137f3b8439 | ||
|
|
b77ed51594 | ||
|
|
d17e6a3857 | ||
|
|
a2c38ed48c | ||
|
|
93a24ec672 | ||
|
|
11cb777e35 | ||
|
|
27011ad0c8 | ||
|
|
c6fabf8613 | ||
|
|
6e469df90e | ||
|
|
0c0a6bd939 | ||
|
|
3f8ad3bf75 | ||
|
|
afd6f41e08 | ||
|
|
0a393eaa1c | ||
|
|
b1bb7bd8f3 | ||
|
|
45bfbb7cf6 | ||
|
|
5083a7505d | ||
|
|
fd2b2003b4 | ||
|
|
23b5c1f782 | ||
|
|
37d278de34 | ||
|
|
24b5faf8df | ||
|
|
8b712bac8d | ||
|
|
a1f26c4c93 | ||
|
|
13c887d4c9 | ||
|
|
2ed7d58ac4 | ||
|
|
b51e2f6453 | ||
|
|
17c191201c | ||
|
|
4217b70331 | ||
|
|
8947d54cc9 | ||
|
|
f829f2eb0c | ||
|
|
0087f8da27 | ||
|
|
dd606684c7 | ||
|
|
12998399f8 | ||
|
|
c09ba6efdb | ||
|
|
7df1957ac7 | ||
|
|
241e410a07 | ||
|
|
68cfe80369 | ||
|
|
88d7ad95f6 | ||
|
|
02c04cbf68 | ||
|
|
5523938a47 | ||
|
|
fbe1abddf4 | ||
|
|
9a14d2bd0e | ||
|
|
86644543ed | ||
|
|
a9c720969f | ||
|
|
3dd9e4cdf8 | ||
|
|
9a5698807f | ||
|
|
92142ee372 | ||
|
|
715ac35672 | ||
|
|
750db6aed8 | ||
|
|
5c78ecfe40 | ||
|
|
43421aedcf | ||
|
|
13ed038082 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -10,3 +10,4 @@ node_modules/
|
|||||||
*.xcodeproj
|
*.xcodeproj
|
||||||
*.swp
|
*.swp
|
||||||
*.pyc
|
*.pyc
|
||||||
|
npm-debug.log
|
||||||
|
|||||||
2
.gitmodules
vendored
2
.gitmodules
vendored
@@ -1,6 +1,6 @@
|
|||||||
[submodule "vendor/brightray"]
|
[submodule "vendor/brightray"]
|
||||||
path = vendor/brightray
|
path = vendor/brightray
|
||||||
url = https://github.com/brightray/brightray.git
|
url = https://github.com/atom/brightray.git
|
||||||
[submodule "vendor/node"]
|
[submodule "vendor/node"]
|
||||||
path = vendor/node
|
path = vendor/node
|
||||||
url = https://github.com/atom/node.git
|
url = https://github.com/atom/node.git
|
||||||
|
|||||||
19
README.md
19
README.md
@@ -1,18 +1,29 @@
|
|||||||
# Atom Shell [](https://travis-ci.org/atom/atom-shell)
|
# Atom Shell [](https://travis-ci.org/atom/atom-shell)
|
||||||
|
|
||||||
The Atom Shell framework lets you write cross-platform desktop applications
|
The Atom Shell framework lets you write cross-platform desktop applications
|
||||||
using JavaScript, HTML and CSS. It is based on [node.js](http://nodejs.org) and
|
using JavaScript, HTML and CSS. It is based on [io.js](http://iojs.org) and
|
||||||
[Chromium](http://www.chromium.org) and is used in the [Atom
|
[Chromium](http://www.chromium.org) and is used in the [Atom
|
||||||
editor](https://github.com/atom/atom).
|
editor](https://github.com/atom/atom).
|
||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
Prebuilt binaries of atom-shell for Linux, Windows and Mac can be found on the
|
Prebuilt binaries and debug symbols of atom-shell for Linux, Windows and Mac can
|
||||||
[releases](https://github.com/atom/atom-shell/releases) page.
|
be found on the [releases](https://github.com/atom/atom-shell/releases) page.
|
||||||
|
|
||||||
|
You can also use [`npm`](https://docs.npmjs.com/) to install prebuilt atom-shell
|
||||||
|
binaries:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Install globally in your $PATH
|
||||||
|
npm install atom-shell -g
|
||||||
|
|
||||||
|
# Install as a development dependency
|
||||||
|
npm install atom-shell --save-dev
|
||||||
|
```
|
||||||
|
|
||||||
### Mirrors
|
### Mirrors
|
||||||
|
|
||||||
- [China Mirror](https://npm.taobao.org/mirrors/atom-shell): Improve download speeds for Chinese user.
|
- [China](https://npm.taobao.org/mirrors/atom-shell)
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
|
|||||||
122
atom.gyp
122
atom.gyp
@@ -38,10 +38,10 @@
|
|||||||
'atom/common/api/lib/clipboard.coffee',
|
'atom/common/api/lib/clipboard.coffee',
|
||||||
'atom/common/api/lib/crash-reporter.coffee',
|
'atom/common/api/lib/crash-reporter.coffee',
|
||||||
'atom/common/api/lib/id-weak-map.coffee',
|
'atom/common/api/lib/id-weak-map.coffee',
|
||||||
|
'atom/common/api/lib/native-image.coffee',
|
||||||
'atom/common/api/lib/original-fs.coffee',
|
'atom/common/api/lib/original-fs.coffee',
|
||||||
'atom/common/api/lib/shell.coffee',
|
'atom/common/api/lib/shell.coffee',
|
||||||
'atom/common/lib/init.coffee',
|
'atom/common/lib/init.coffee',
|
||||||
'atom/common/lib/asar.coffee',
|
|
||||||
'atom/renderer/lib/chrome-api.coffee',
|
'atom/renderer/lib/chrome-api.coffee',
|
||||||
'atom/renderer/lib/init.coffee',
|
'atom/renderer/lib/init.coffee',
|
||||||
'atom/renderer/lib/inspector.coffee',
|
'atom/renderer/lib/inspector.coffee',
|
||||||
@@ -55,12 +55,20 @@
|
|||||||
'atom/renderer/api/lib/screen.coffee',
|
'atom/renderer/api/lib/screen.coffee',
|
||||||
'atom/renderer/api/lib/web-frame.coffee',
|
'atom/renderer/api/lib/web-frame.coffee',
|
||||||
],
|
],
|
||||||
|
'coffee2c_sources': [
|
||||||
|
'atom/common/lib/asar.coffee',
|
||||||
|
'atom/common/lib/asar_init.coffee',
|
||||||
|
],
|
||||||
'lib_sources': [
|
'lib_sources': [
|
||||||
'atom/app/atom_content_client.cc',
|
'atom/app/atom_content_client.cc',
|
||||||
'atom/app/atom_content_client.h',
|
'atom/app/atom_content_client.h',
|
||||||
|
'atom/app/atom_main_args.cc',
|
||||||
|
'atom/app/atom_main_args.h',
|
||||||
'atom/app/atom_main_delegate.cc',
|
'atom/app/atom_main_delegate.cc',
|
||||||
'atom/app/atom_main_delegate.h',
|
'atom/app/atom_main_delegate.h',
|
||||||
'atom/app/atom_main_delegate_mac.mm',
|
'atom/app/atom_main_delegate_mac.mm',
|
||||||
|
'atom/app/node_main.cc',
|
||||||
|
'atom/app/node_main.h',
|
||||||
'atom/browser/api/atom_api_app.cc',
|
'atom/browser/api/atom_api_app.cc',
|
||||||
'atom/browser/api/atom_api_app.h',
|
'atom/browser/api/atom_api_app.h',
|
||||||
'atom/browser/api/atom_api_auto_updater.cc',
|
'atom/browser/api/atom_api_auto_updater.cc',
|
||||||
@@ -85,6 +93,7 @@
|
|||||||
'atom/browser/api/atom_api_tray.h',
|
'atom/browser/api/atom_api_tray.h',
|
||||||
'atom/browser/api/atom_api_web_contents.cc',
|
'atom/browser/api/atom_api_web_contents.cc',
|
||||||
'atom/browser/api/atom_api_web_contents.h',
|
'atom/browser/api/atom_api_web_contents.h',
|
||||||
|
'atom/browser/api/atom_api_web_view_manager.cc',
|
||||||
'atom/browser/api/atom_api_window.cc',
|
'atom/browser/api/atom_api_window.cc',
|
||||||
'atom/browser/api/atom_api_window.h',
|
'atom/browser/api/atom_api_window.h',
|
||||||
'atom/browser/api/event.cc',
|
'atom/browser/api/event.cc',
|
||||||
@@ -109,6 +118,8 @@
|
|||||||
'atom/browser/atom_browser_main_parts_mac.mm',
|
'atom/browser/atom_browser_main_parts_mac.mm',
|
||||||
'atom/browser/atom_javascript_dialog_manager.cc',
|
'atom/browser/atom_javascript_dialog_manager.cc',
|
||||||
'atom/browser/atom_javascript_dialog_manager.h',
|
'atom/browser/atom_javascript_dialog_manager.h',
|
||||||
|
'atom/browser/atom_resource_dispatcher_host_delegate.cc',
|
||||||
|
'atom/browser/atom_resource_dispatcher_host_delegate.h',
|
||||||
'atom/browser/atom_speech_recognition_manager_delegate.cc',
|
'atom/browser/atom_speech_recognition_manager_delegate.cc',
|
||||||
'atom/browser/atom_speech_recognition_manager_delegate.h',
|
'atom/browser/atom_speech_recognition_manager_delegate.h',
|
||||||
'atom/browser/browser.cc',
|
'atom/browser/browser.cc',
|
||||||
@@ -140,6 +151,8 @@
|
|||||||
'atom/browser/net/atom_url_request_job_factory.h',
|
'atom/browser/net/atom_url_request_job_factory.h',
|
||||||
'atom/browser/net/url_request_string_job.cc',
|
'atom/browser/net/url_request_string_job.cc',
|
||||||
'atom/browser/net/url_request_string_job.h',
|
'atom/browser/net/url_request_string_job.h',
|
||||||
|
'atom/browser/net/url_request_buffer_job.cc',
|
||||||
|
'atom/browser/net/url_request_buffer_job.h',
|
||||||
'atom/browser/node_debugger.cc',
|
'atom/browser/node_debugger.cc',
|
||||||
'atom/browser/node_debugger.h',
|
'atom/browser/node_debugger.h',
|
||||||
'atom/browser/ui/accelerator_util.cc',
|
'atom/browser/ui/accelerator_util.cc',
|
||||||
@@ -187,10 +200,8 @@
|
|||||||
'atom/browser/ui/x/window_state_watcher.h',
|
'atom/browser/ui/x/window_state_watcher.h',
|
||||||
'atom/browser/ui/x/x_window_utils.cc',
|
'atom/browser/ui/x/x_window_utils.cc',
|
||||||
'atom/browser/ui/x/x_window_utils.h',
|
'atom/browser/ui/x/x_window_utils.h',
|
||||||
'atom/browser/web_view/web_view_manager.cc',
|
'atom/browser/web_view_manager.cc',
|
||||||
'atom/browser/web_view/web_view_manager.h',
|
'atom/browser/web_view_manager.h',
|
||||||
'atom/browser/web_view/web_view_renderer_state.cc',
|
|
||||||
'atom/browser/web_view/web_view_renderer_state.h',
|
|
||||||
'atom/browser/web_dialog_helper.cc',
|
'atom/browser/web_dialog_helper.cc',
|
||||||
'atom/browser/web_dialog_helper.h',
|
'atom/browser/web_dialog_helper.h',
|
||||||
'atom/browser/window_list.cc',
|
'atom/browser/window_list.cc',
|
||||||
@@ -202,6 +213,9 @@
|
|||||||
'atom/common/api/atom_api_crash_reporter.cc',
|
'atom/common/api/atom_api_crash_reporter.cc',
|
||||||
'atom/common/api/atom_api_id_weak_map.cc',
|
'atom/common/api/atom_api_id_weak_map.cc',
|
||||||
'atom/common/api/atom_api_id_weak_map.h',
|
'atom/common/api/atom_api_id_weak_map.h',
|
||||||
|
'atom/common/api/atom_api_native_image.cc',
|
||||||
|
'atom/common/api/atom_api_native_image.h',
|
||||||
|
'atom/common/api/atom_api_native_image_mac.mm',
|
||||||
'atom/common/api/atom_api_shell.cc',
|
'atom/common/api/atom_api_shell.cc',
|
||||||
'atom/common/api/atom_api_v8_util.cc',
|
'atom/common/api/atom_api_v8_util.cc',
|
||||||
'atom/common/api/atom_bindings.cc',
|
'atom/common/api/atom_bindings.cc',
|
||||||
@@ -210,6 +224,8 @@
|
|||||||
'atom/common/api/object_life_monitor.h',
|
'atom/common/api/object_life_monitor.h',
|
||||||
'atom/common/asar/archive.cc',
|
'atom/common/asar/archive.cc',
|
||||||
'atom/common/asar/archive.h',
|
'atom/common/asar/archive.h',
|
||||||
|
'atom/common/asar/asar_util.cc',
|
||||||
|
'atom/common/asar/asar_util.h',
|
||||||
'atom/common/asar/scoped_temporary_file.cc',
|
'atom/common/asar/scoped_temporary_file.cc',
|
||||||
'atom/common/asar/scoped_temporary_file.h',
|
'atom/common/asar/scoped_temporary_file.h',
|
||||||
'atom/common/common_message_generator.cc',
|
'atom/common/common_message_generator.cc',
|
||||||
@@ -240,7 +256,6 @@
|
|||||||
'atom/common/native_mate_converters/gurl_converter.h',
|
'atom/common/native_mate_converters/gurl_converter.h',
|
||||||
'atom/common/native_mate_converters/image_converter.cc',
|
'atom/common/native_mate_converters/image_converter.cc',
|
||||||
'atom/common/native_mate_converters/image_converter.h',
|
'atom/common/native_mate_converters/image_converter.h',
|
||||||
'atom/common/native_mate_converters/image_converter_mac.mm',
|
|
||||||
'atom/common/native_mate_converters/string16_converter.h',
|
'atom/common/native_mate_converters/string16_converter.h',
|
||||||
'atom/common/native_mate_converters/v8_value_converter.cc',
|
'atom/common/native_mate_converters/v8_value_converter.cc',
|
||||||
'atom/common/native_mate_converters/v8_value_converter.h',
|
'atom/common/native_mate_converters/v8_value_converter.h',
|
||||||
@@ -270,6 +285,8 @@
|
|||||||
'atom/renderer/atom_render_view_observer.h',
|
'atom/renderer/atom_render_view_observer.h',
|
||||||
'atom/renderer/atom_renderer_client.cc',
|
'atom/renderer/atom_renderer_client.cc',
|
||||||
'atom/renderer/atom_renderer_client.h',
|
'atom/renderer/atom_renderer_client.h',
|
||||||
|
'atom/renderer/guest_view_container.cc',
|
||||||
|
'atom/renderer/guest_view_container.h',
|
||||||
'chromium_src/chrome/browser/browser_process.cc',
|
'chromium_src/chrome/browser/browser_process.cc',
|
||||||
'chromium_src/chrome/browser/browser_process.h',
|
'chromium_src/chrome/browser/browser_process.h',
|
||||||
'chromium_src/chrome/browser/chrome_notification_types.h',
|
'chromium_src/chrome/browser/chrome_notification_types.h',
|
||||||
@@ -333,6 +350,7 @@
|
|||||||
'chromium_src/library_loaders/libspeechd_loader.cc',
|
'chromium_src/library_loaders/libspeechd_loader.cc',
|
||||||
'chromium_src/library_loaders/libspeechd.h',
|
'chromium_src/library_loaders/libspeechd.h',
|
||||||
'<@(native_mate_files)',
|
'<@(native_mate_files)',
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/atom_natives.h',
|
||||||
],
|
],
|
||||||
'lib_sources_win': [
|
'lib_sources_win': [
|
||||||
'chromium_src/chrome/browser/ui/views/color_chooser_dialog.cc',
|
'chromium_src/chrome/browser/ui/views/color_chooser_dialog.cc',
|
||||||
@@ -386,7 +404,7 @@
|
|||||||
'target_name': '<(project_name)',
|
'target_name': '<(project_name)',
|
||||||
'type': 'executable',
|
'type': 'executable',
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
'generated_sources',
|
'compile_coffee',
|
||||||
'<(project_name)_lib',
|
'<(project_name)_lib',
|
||||||
],
|
],
|
||||||
'sources': [
|
'sources': [
|
||||||
@@ -484,7 +502,9 @@
|
|||||||
'<(libchromiumcontent_resources_dir)/content_resources_200_percent.pak',
|
'<(libchromiumcontent_resources_dir)/content_resources_200_percent.pak',
|
||||||
'<(libchromiumcontent_resources_dir)/content_shell.pak',
|
'<(libchromiumcontent_resources_dir)/content_shell.pak',
|
||||||
'<(libchromiumcontent_resources_dir)/ui_resources_200_percent.pak',
|
'<(libchromiumcontent_resources_dir)/ui_resources_200_percent.pak',
|
||||||
'external_binaries/d3dcompiler_46.dll',
|
'<(libchromiumcontent_resources_dir)/natives_blob.bin',
|
||||||
|
'<(libchromiumcontent_resources_dir)/snapshot_blob.bin',
|
||||||
|
'external_binaries/d3dcompiler_47.dll',
|
||||||
'external_binaries/msvcp120.dll',
|
'external_binaries/msvcp120.dll',
|
||||||
'external_binaries/msvcr120.dll',
|
'external_binaries/msvcr120.dll',
|
||||||
'external_binaries/vccorlib120.dll',
|
'external_binaries/vccorlib120.dll',
|
||||||
@@ -508,6 +528,8 @@
|
|||||||
'<(libchromiumcontent_library_dir)/libffmpegsumo.so',
|
'<(libchromiumcontent_library_dir)/libffmpegsumo.so',
|
||||||
'<(libchromiumcontent_resources_dir)/icudtl.dat',
|
'<(libchromiumcontent_resources_dir)/icudtl.dat',
|
||||||
'<(libchromiumcontent_resources_dir)/content_shell.pak',
|
'<(libchromiumcontent_resources_dir)/content_shell.pak',
|
||||||
|
'<(libchromiumcontent_resources_dir)/natives_blob.bin',
|
||||||
|
'<(libchromiumcontent_resources_dir)/snapshot_blob.bin',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -524,6 +546,7 @@
|
|||||||
'target_name': '<(project_name)_lib',
|
'target_name': '<(project_name)_lib',
|
||||||
'type': 'static_library',
|
'type': 'static_library',
|
||||||
'dependencies': [
|
'dependencies': [
|
||||||
|
'atom_coffee2c',
|
||||||
'vendor/brightray/brightray.gyp:brightray',
|
'vendor/brightray/brightray.gyp:brightray',
|
||||||
'vendor/node/node.gyp:node_lib',
|
'vendor/node/node.gyp:node_lib',
|
||||||
],
|
],
|
||||||
@@ -533,6 +556,9 @@
|
|||||||
'SK_SUPPORT_LEGACY_GETTOPDEVICE',
|
'SK_SUPPORT_LEGACY_GETTOPDEVICE',
|
||||||
# Disable warnings for g_settings_list_schemas.
|
# Disable warnings for g_settings_list_schemas.
|
||||||
'GLIB_DISABLE_DEPRECATION_WARNINGS',
|
'GLIB_DISABLE_DEPRECATION_WARNINGS',
|
||||||
|
# Defined in Chromium but not exposed in its gyp file.
|
||||||
|
'V8_USE_EXTERNAL_STARTUP_DATA',
|
||||||
|
'ENABLE_PLUGINS',
|
||||||
],
|
],
|
||||||
'sources': [
|
'sources': [
|
||||||
'<@(lib_sources)',
|
'<@(lib_sources)',
|
||||||
@@ -542,6 +568,8 @@
|
|||||||
'chromium_src',
|
'chromium_src',
|
||||||
'vendor/brightray',
|
'vendor/brightray',
|
||||||
'vendor/native_mate',
|
'vendor/native_mate',
|
||||||
|
# Include atom_natives.h.
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)',
|
||||||
# Include directories for uv and node.
|
# Include directories for uv and node.
|
||||||
'vendor/node/src',
|
'vendor/node/src',
|
||||||
'vendor/node/deps/http_parser',
|
'vendor/node/deps/http_parser',
|
||||||
@@ -612,44 +640,56 @@
|
|||||||
],
|
],
|
||||||
}, # target <(product_name)_lib
|
}, # target <(product_name)_lib
|
||||||
{
|
{
|
||||||
'target_name': 'generated_sources',
|
'target_name': 'compile_coffee',
|
||||||
'type': 'none',
|
'type': 'none',
|
||||||
'sources': [
|
'actions': [
|
||||||
'<@(coffee_sources)',
|
|
||||||
],
|
|
||||||
'rules': [
|
|
||||||
{
|
{
|
||||||
'rule_name': 'coffee',
|
'action_name': 'compile_coffee',
|
||||||
'extension': 'coffee',
|
'variables': {
|
||||||
|
'conditions': [
|
||||||
|
['OS=="mac"', {
|
||||||
|
'resources_path': '<(PRODUCT_DIR)/<(product_name).app/Contents/Resources',
|
||||||
|
},{
|
||||||
|
'resources_path': '<(PRODUCT_DIR)/resources',
|
||||||
|
}],
|
||||||
|
],
|
||||||
|
},
|
||||||
'inputs': [
|
'inputs': [
|
||||||
'script/compile-coffee.py',
|
'<@(coffee_sources)',
|
||||||
],
|
],
|
||||||
'conditions': [
|
'outputs': [
|
||||||
['OS=="mac"', {
|
'<(resources_path)/atom.asar',
|
||||||
'outputs': [
|
|
||||||
'<(PRODUCT_DIR)/<(product_name).app/Contents/Resources/<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).js',
|
|
||||||
],
|
|
||||||
'action': [
|
|
||||||
'python',
|
|
||||||
'script/compile-coffee.py',
|
|
||||||
'<(RULE_INPUT_PATH)',
|
|
||||||
'<(PRODUCT_DIR)/<(product_name).app/Contents/Resources/<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).js',
|
|
||||||
],
|
|
||||||
},{ # OS=="mac"
|
|
||||||
'outputs': [
|
|
||||||
'<(PRODUCT_DIR)/resources/<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).js',
|
|
||||||
],
|
|
||||||
'action': [
|
|
||||||
'python',
|
|
||||||
'script/compile-coffee.py',
|
|
||||||
'<(RULE_INPUT_PATH)',
|
|
||||||
'<(PRODUCT_DIR)/resources/<(RULE_INPUT_DIRNAME)/<(RULE_INPUT_ROOT).js',
|
|
||||||
],
|
|
||||||
}], # OS=="win" or OS=="linux"
|
|
||||||
],
|
],
|
||||||
},
|
'action': [
|
||||||
|
'python',
|
||||||
|
'tools/coffee2asar.py',
|
||||||
|
'<@(_outputs)',
|
||||||
|
'<@(_inputs)',
|
||||||
|
],
|
||||||
|
}
|
||||||
],
|
],
|
||||||
}, # target generated_sources
|
}, # target compile_coffee
|
||||||
|
{
|
||||||
|
'target_name': 'atom_coffee2c',
|
||||||
|
'type': 'none',
|
||||||
|
'actions': [
|
||||||
|
{
|
||||||
|
'action_name': 'atom_coffee2c',
|
||||||
|
'inputs': [
|
||||||
|
'<@(coffee2c_sources)',
|
||||||
|
],
|
||||||
|
'outputs': [
|
||||||
|
'<(SHARED_INTERMEDIATE_DIR)/atom_natives.h',
|
||||||
|
],
|
||||||
|
'action': [
|
||||||
|
'python',
|
||||||
|
'tools/coffee2c.py',
|
||||||
|
'<@(_outputs)',
|
||||||
|
'<@(_inputs)',
|
||||||
|
],
|
||||||
|
}
|
||||||
|
],
|
||||||
|
}, # target atom_coffee2c
|
||||||
{
|
{
|
||||||
'target_name': '<(project_name)_dump_symbols',
|
'target_name': '<(project_name)_dump_symbols',
|
||||||
'type': 'none',
|
'type': 'none',
|
||||||
@@ -821,6 +861,8 @@
|
|||||||
'atom/common/resources/mac/MainMenu.xib',
|
'atom/common/resources/mac/MainMenu.xib',
|
||||||
'<(libchromiumcontent_resources_dir)/content_shell.pak',
|
'<(libchromiumcontent_resources_dir)/content_shell.pak',
|
||||||
'<(libchromiumcontent_resources_dir)/icudtl.dat',
|
'<(libchromiumcontent_resources_dir)/icudtl.dat',
|
||||||
|
'<(libchromiumcontent_resources_dir)/natives_blob.bin',
|
||||||
|
'<(libchromiumcontent_resources_dir)/snapshot_blob.bin',
|
||||||
],
|
],
|
||||||
'xcode_settings': {
|
'xcode_settings': {
|
||||||
'INFOPLIST_FILE': 'atom/common/resources/mac/Info.plist',
|
'INFOPLIST_FILE': 'atom/common/resources/mac/Info.plist',
|
||||||
|
|||||||
@@ -19,10 +19,10 @@ class AtomContentClient : public brightray::ContentClient {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// content::ContentClient:
|
// content::ContentClient:
|
||||||
virtual std::string GetProduct() const OVERRIDE;
|
std::string GetProduct() const override;
|
||||||
virtual void AddAdditionalSchemes(
|
void AddAdditionalSchemes(
|
||||||
std::vector<std::string>* standard_schemes,
|
std::vector<std::string>* standard_schemes,
|
||||||
std::vector<std::string>* savable_schemes) OVERRIDE;
|
std::vector<std::string>* savable_schemes) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomContentClient);
|
DISALLOW_COPY_AND_ASSIGN(AtomContentClient);
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ __attribute__((visibility("default")))
|
|||||||
int AtomMain(int argc, const char* argv[]);
|
int AtomMain(int argc, const char* argv[]);
|
||||||
|
|
||||||
__attribute__((visibility("default")))
|
__attribute__((visibility("default")))
|
||||||
void AtomInitializeICU();
|
int AtomInitializeICUandStartNode(int argc, char *argv[]);
|
||||||
}
|
}
|
||||||
#endif // OS_MACOSX
|
#endif // OS_MACOSX
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,10 @@
|
|||||||
|
|
||||||
#include "atom/app/atom_library_main.h"
|
#include "atom/app/atom_library_main.h"
|
||||||
|
|
||||||
|
#include "atom/app/atom_main_args.h"
|
||||||
#include "atom/app/atom_main_delegate.h"
|
#include "atom/app/atom_main_delegate.h"
|
||||||
|
#include "atom/app/node_main.h"
|
||||||
|
#include "base/at_exit.h"
|
||||||
#include "base/i18n/icu_util.h"
|
#include "base/i18n/icu_util.h"
|
||||||
#include "base/mac/bundle_locations.h"
|
#include "base/mac/bundle_locations.h"
|
||||||
#include "brightray/common/mac/main_application_bundle.h"
|
#include "brightray/common/mac/main_application_bundle.h"
|
||||||
@@ -16,15 +19,18 @@ int AtomMain(int argc, const char* argv[]) {
|
|||||||
content::ContentMainParams params(&delegate);
|
content::ContentMainParams params(&delegate);
|
||||||
params.argc = argc;
|
params.argc = argc;
|
||||||
params.argv = argv;
|
params.argv = argv;
|
||||||
|
atom::AtomCommandLine::Init(argc, argv);
|
||||||
return content::ContentMain(params);
|
return content::ContentMain(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
void AtomInitializeICU() {
|
int AtomInitializeICUandStartNode(int argc, char *argv[]) {
|
||||||
|
base::AtExitManager atexit_manager;
|
||||||
base::mac::SetOverrideFrameworkBundlePath(
|
base::mac::SetOverrideFrameworkBundlePath(
|
||||||
brightray::MainApplicationBundlePath()
|
brightray::MainApplicationBundlePath()
|
||||||
.Append("Contents")
|
.Append("Contents")
|
||||||
.Append("Frameworks")
|
.Append("Frameworks")
|
||||||
.Append(PRODUCT_NAME " Framework.framework"));
|
.Append(PRODUCT_NAME " Framework.framework"));
|
||||||
base::i18n::InitializeICU();
|
base::i18n::InitializeICU();
|
||||||
|
return atom::NodeMain(argc, argv);
|
||||||
}
|
}
|
||||||
#endif // OS_MACOSX
|
#endif // OS_MACOSX
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#include "atom/app/atom_main.h"
|
#include "atom/app/atom_main.h"
|
||||||
|
#include "atom/app/atom_main_args.h"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -13,11 +14,14 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
#include <shellscalingapi.h>
|
||||||
|
#include <tchar.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
|
|
||||||
#include "atom/app/atom_main_delegate.h"
|
#include "atom/app/atom_main_delegate.h"
|
||||||
#include "atom/common/crash_reporter/win/crash_service_main.h"
|
#include "atom/common/crash_reporter/win/crash_service_main.h"
|
||||||
#include "base/environment.h"
|
#include "base/environment.h"
|
||||||
|
#include "base/win/windows_version.h"
|
||||||
#include "content/public/app/startup_helper_win.h"
|
#include "content/public/app/startup_helper_win.h"
|
||||||
#include "sandbox/win/src/sandbox_types.h"
|
#include "sandbox/win/src/sandbox_types.h"
|
||||||
#include "ui/gfx/win/dpi.h"
|
#include "ui/gfx/win/dpi.h"
|
||||||
@@ -28,14 +32,52 @@
|
|||||||
#include "atom/app/atom_library_main.h"
|
#include "atom/app/atom_library_main.h"
|
||||||
#endif // defined(OS_MACOSX)
|
#endif // defined(OS_MACOSX)
|
||||||
|
|
||||||
|
#include "atom/app/node_main.h"
|
||||||
#include "base/i18n/icu_util.h"
|
#include "base/i18n/icu_util.h"
|
||||||
|
|
||||||
// Declaration of node::Start.
|
#if defined(OS_WIN)
|
||||||
namespace node {
|
|
||||||
int Start(int argc, char *argv[]);
|
namespace {
|
||||||
|
|
||||||
|
// Win8.1 supports monitor-specific DPI scaling.
|
||||||
|
bool SetProcessDpiAwarenessWrapper(PROCESS_DPI_AWARENESS value) {
|
||||||
|
typedef HRESULT(WINAPI *SetProcessDpiAwarenessPtr)(PROCESS_DPI_AWARENESS);
|
||||||
|
SetProcessDpiAwarenessPtr set_process_dpi_awareness_func =
|
||||||
|
reinterpret_cast<SetProcessDpiAwarenessPtr>(
|
||||||
|
GetProcAddress(GetModuleHandleA("user32.dll"),
|
||||||
|
"SetProcessDpiAwarenessInternal"));
|
||||||
|
if (set_process_dpi_awareness_func) {
|
||||||
|
HRESULT hr = set_process_dpi_awareness_func(value);
|
||||||
|
if (SUCCEEDED(hr)) {
|
||||||
|
VLOG(1) << "SetProcessDpiAwareness succeeded.";
|
||||||
|
return true;
|
||||||
|
} else if (hr == E_ACCESSDENIED) {
|
||||||
|
LOG(ERROR) << "Access denied error from SetProcessDpiAwareness. "
|
||||||
|
"Function called twice, or manifest was used.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
// This function works for Windows Vista through Win8. Win8.1 must use
|
||||||
|
// SetProcessDpiAwareness[Wrapper].
|
||||||
|
BOOL SetProcessDPIAwareWrapper() {
|
||||||
|
typedef BOOL(WINAPI *SetProcessDPIAwarePtr)(VOID);
|
||||||
|
SetProcessDPIAwarePtr set_process_dpi_aware_func =
|
||||||
|
reinterpret_cast<SetProcessDPIAwarePtr>(
|
||||||
|
GetProcAddress(GetModuleHandleA("user32.dll"),
|
||||||
|
"SetProcessDPIAware"));
|
||||||
|
return set_process_dpi_aware_func &&
|
||||||
|
set_process_dpi_aware_func();
|
||||||
|
}
|
||||||
|
|
||||||
|
void EnableHighDPISupport() {
|
||||||
|
if (!SetProcessDpiAwarenessWrapper(PROCESS_SYSTEM_DPI_AWARE)) {
|
||||||
|
SetProcessDPIAwareWrapper();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
|
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
@@ -54,45 +96,46 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
|
|||||||
freopen_s(&dontcare, "CON", "r", stdin);
|
freopen_s(&dontcare, "CON", "r", stdin);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string node_indicator, crash_service_indicator;
|
// Convert argv to to UTF8
|
||||||
if (env->GetVar("ATOM_SHELL_INTERNAL_RUN_AS_NODE", &node_indicator) &&
|
char** argv = new char*[argc];
|
||||||
node_indicator == "1") {
|
for (int i = 0; i < argc; i++) {
|
||||||
// Convert argv to to UTF8
|
// Compute the size of the required buffer
|
||||||
char** argv = new char*[argc];
|
DWORD size = WideCharToMultiByte(CP_UTF8,
|
||||||
for (int i = 0; i < argc; i++) {
|
0,
|
||||||
// Compute the size of the required buffer
|
wargv[i],
|
||||||
DWORD size = WideCharToMultiByte(CP_UTF8,
|
-1,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
NULL);
|
||||||
|
if (size == 0) {
|
||||||
|
// This should never happen.
|
||||||
|
fprintf(stderr, "Could not convert arguments to utf8.");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
// Do the actual conversion
|
||||||
|
argv[i] = new char[size];
|
||||||
|
DWORD result = WideCharToMultiByte(CP_UTF8,
|
||||||
0,
|
0,
|
||||||
wargv[i],
|
wargv[i],
|
||||||
-1,
|
-1,
|
||||||
NULL,
|
argv[i],
|
||||||
0,
|
size,
|
||||||
NULL,
|
NULL,
|
||||||
NULL);
|
NULL);
|
||||||
if (size == 0) {
|
if (result == 0) {
|
||||||
// This should never happen.
|
// This should never happen.
|
||||||
fprintf(stderr, "Could not convert arguments to utf8.");
|
fprintf(stderr, "Could not convert arguments to utf8.");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
|
||||||
// Do the actual conversion
|
|
||||||
argv[i] = new char[size];
|
|
||||||
DWORD result = WideCharToMultiByte(CP_UTF8,
|
|
||||||
0,
|
|
||||||
wargv[i],
|
|
||||||
-1,
|
|
||||||
argv[i],
|
|
||||||
size,
|
|
||||||
NULL,
|
|
||||||
NULL);
|
|
||||||
if (result == 0) {
|
|
||||||
// This should never happen.
|
|
||||||
fprintf(stderr, "Could not convert arguments to utf8.");
|
|
||||||
exit(1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Now that conversion is done, we can finally start.
|
}
|
||||||
|
|
||||||
|
std::string node_indicator, crash_service_indicator;
|
||||||
|
if (env->GetVar("ATOM_SHELL_INTERNAL_RUN_AS_NODE", &node_indicator) &&
|
||||||
|
node_indicator == "1") {
|
||||||
|
// Now that argv conversion is done, we can finally start.
|
||||||
base::i18n::InitializeICU();
|
base::i18n::InitializeICU();
|
||||||
return node::Start(argc, argv);
|
return atom::NodeMain(argc, argv);
|
||||||
} else if (env->GetVar("ATOM_SHELL_INTERNAL_CRASH_SERVICE",
|
} else if (env->GetVar("ATOM_SHELL_INTERNAL_CRASH_SERVICE",
|
||||||
&crash_service_indicator) &&
|
&crash_service_indicator) &&
|
||||||
crash_service_indicator == "1") {
|
crash_service_indicator == "1") {
|
||||||
@@ -103,12 +146,16 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
|
|||||||
content::InitializeSandboxInfo(&sandbox_info);
|
content::InitializeSandboxInfo(&sandbox_info);
|
||||||
atom::AtomMainDelegate delegate;
|
atom::AtomMainDelegate delegate;
|
||||||
|
|
||||||
// Now chrome relies on a regkey to enable high dpi support.
|
// We don't want to set DPI awareness on pre-Win7 because we don't support
|
||||||
gfx::EnableHighDPISupport();
|
// DirectWrite there. GDI fonts are kerned very badly, so better to leave
|
||||||
|
// DPI-unaware and at effective 1.0. See also ShouldUseDirectWrite().
|
||||||
|
if (base::win::GetVersion() >= base::win::VERSION_WIN7)
|
||||||
|
EnableHighDPISupport();
|
||||||
|
|
||||||
content::ContentMainParams params(&delegate);
|
content::ContentMainParams params(&delegate);
|
||||||
params.instance = instance;
|
params.instance = instance;
|
||||||
params.sandbox_info = &sandbox_info;
|
params.sandbox_info = &sandbox_info;
|
||||||
|
atom::AtomCommandLine::Init(argc, argv);
|
||||||
return content::ContentMain(params);
|
return content::ContentMain(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,13 +165,14 @@ int main(int argc, const char* argv[]) {
|
|||||||
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
|
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
|
||||||
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) {
|
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) {
|
||||||
base::i18n::InitializeICU();
|
base::i18n::InitializeICU();
|
||||||
return node::Start(argc, const_cast<char**>(argv));
|
return atom::NodeMain(argc, const_cast<char**>(argv));
|
||||||
}
|
}
|
||||||
|
|
||||||
atom::AtomMainDelegate delegate;
|
atom::AtomMainDelegate delegate;
|
||||||
content::ContentMainParams params(&delegate);
|
content::ContentMainParams params(&delegate);
|
||||||
params.argc = argc;
|
params.argc = argc;
|
||||||
params.argv = argv;
|
params.argv = argv;
|
||||||
|
atom::AtomCommandLine::Init(argc, argv);
|
||||||
return content::ContentMain(params);
|
return content::ContentMain(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -133,8 +181,7 @@ int main(int argc, const char* argv[]) {
|
|||||||
int main(int argc, const char* argv[]) {
|
int main(int argc, const char* argv[]) {
|
||||||
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
|
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
|
||||||
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) {
|
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) {
|
||||||
AtomInitializeICU();
|
return AtomInitializeICUandStartNode(argc, const_cast<char**>(argv));
|
||||||
return node::Start(argc, const_cast<char**>(argv));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return AtomMain(argc, argv);
|
return AtomMain(argc, argv);
|
||||||
|
|||||||
19
atom/app/atom_main_args.cc
Normal file
19
atom/app/atom_main_args.cc
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// Copyright (c) 2013 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/app/atom_main_args.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
// static
|
||||||
|
std::vector<std::string> AtomCommandLine::argv_;
|
||||||
|
|
||||||
|
// static
|
||||||
|
void AtomCommandLine::Init(int argc, const char* const* argv) {
|
||||||
|
for (int i = 0; i < argc; ++i) {
|
||||||
|
argv_.push_back(argv[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
29
atom/app/atom_main_args.h
Normal file
29
atom/app/atom_main_args.h
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_APP_ATOM_MAIN_ARGS_H_
|
||||||
|
#define ATOM_APP_ATOM_MAIN_ARGS_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "base/macros.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
// Singleton to remember the original "argc" and "argv".
|
||||||
|
class AtomCommandLine {
|
||||||
|
public:
|
||||||
|
static void Init(int argc, const char* const* argv);
|
||||||
|
static std::vector<std::string> argv() { return argv_; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::vector<std::string> argv_;
|
||||||
|
|
||||||
|
DISALLOW_IMPLICIT_CONSTRUCTORS(AtomCommandLine);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_APP_ATOM_MAIN_ARGS_H_
|
||||||
@@ -27,8 +27,8 @@ AtomMainDelegate::~AtomMainDelegate() {
|
|||||||
|
|
||||||
bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
|
bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
|
||||||
// Disable logging out to debug.log on Windows
|
// Disable logging out to debug.log on Windows
|
||||||
#if defined(OS_WIN)
|
|
||||||
logging::LoggingSettings settings;
|
logging::LoggingSettings settings;
|
||||||
|
#if defined(OS_WIN)
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
settings.logging_dest = logging::LOG_TO_ALL;
|
settings.logging_dest = logging::LOG_TO_ALL;
|
||||||
settings.log_file = L"debug.log";
|
settings.log_file = L"debug.log";
|
||||||
@@ -36,15 +36,15 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
|
|||||||
settings.delete_old = logging::DELETE_OLD_LOG_FILE;
|
settings.delete_old = logging::DELETE_OLD_LOG_FILE;
|
||||||
#else
|
#else
|
||||||
settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
|
settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
|
||||||
#endif
|
#endif // defined(DEBUG)
|
||||||
logging::InitLogging(settings);
|
|
||||||
#endif // defined(OS_WIN)
|
#endif // defined(OS_WIN)
|
||||||
|
logging::InitLogging(settings);
|
||||||
|
|
||||||
// Logging with pid and timestamp.
|
// Logging with pid and timestamp.
|
||||||
logging::SetLogItems(true, false, true, false);
|
logging::SetLogItems(true, false, true, false);
|
||||||
|
|
||||||
// Enable convient stack printing.
|
|
||||||
#if defined(DEBUG) && defined(OS_LINUX)
|
#if defined(DEBUG) && defined(OS_LINUX)
|
||||||
|
// Enable convient stack printing.
|
||||||
base::debug::EnableInProcessStackDumping();
|
base::debug::EnableInProcessStackDumping();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -59,7 +59,7 @@ void AtomMainDelegate::PreSandboxStartup() {
|
|||||||
if (!env->HasVar("GOOGLE_API_KEY"))
|
if (!env->HasVar("GOOGLE_API_KEY"))
|
||||||
env->SetVar("GOOGLE_API_KEY", GOOGLEAPIS_API_KEY);
|
env->SetVar("GOOGLE_API_KEY", GOOGLEAPIS_API_KEY);
|
||||||
|
|
||||||
CommandLine* command_line = CommandLine::ForCurrentProcess();
|
auto command_line = base::CommandLine::ForCurrentProcess();
|
||||||
std::string process_type = command_line->GetSwitchValueASCII(
|
std::string process_type = command_line->GetSwitchValueASCII(
|
||||||
switches::kProcessType);
|
switches::kProcessType);
|
||||||
|
|
||||||
@@ -67,9 +67,6 @@ void AtomMainDelegate::PreSandboxStartup() {
|
|||||||
if (!process_type.empty())
|
if (!process_type.empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Add a flag to mark the start of switches added by atom-shell.
|
|
||||||
command_line->AppendSwitch("atom-shell-switches-start");
|
|
||||||
|
|
||||||
#if defined(OS_WIN)
|
#if defined(OS_WIN)
|
||||||
// Disable the LegacyRenderWidgetHostHWND, it made frameless windows unable
|
// Disable the LegacyRenderWidgetHostHWND, it made frameless windows unable
|
||||||
// to move and resize. We may consider enabling it again after upgraded to
|
// to move and resize. We may consider enabling it again after upgraded to
|
||||||
@@ -84,9 +81,6 @@ void AtomMainDelegate::PreSandboxStartup() {
|
|||||||
// Enable AVFoundation.
|
// Enable AVFoundation.
|
||||||
command_line->AppendSwitch("enable-avfoundation");
|
command_line->AppendSwitch("enable-avfoundation");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Add a flag to mark the end of switches added by atom-shell.
|
|
||||||
command_line->AppendSwitch("atom-shell-switches-end");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
content::ContentBrowserClient* AtomMainDelegate::CreateContentBrowserClient() {
|
content::ContentBrowserClient* AtomMainDelegate::CreateContentBrowserClient() {
|
||||||
|
|||||||
56
atom/app/node_main.cc
Normal file
56
atom/app/node_main.cc
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/app/node_main.h"
|
||||||
|
|
||||||
|
#include "atom/browser/javascript_environment.h"
|
||||||
|
#include "atom/common/node_includes.h"
|
||||||
|
#include "gin/array_buffer.h"
|
||||||
|
#include "gin/public/isolate_holder.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
int NodeMain(int argc, char *argv[]) {
|
||||||
|
argv = uv_setup_args(argc, argv);
|
||||||
|
int exec_argc;
|
||||||
|
const char** exec_argv;
|
||||||
|
node::Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
|
||||||
|
|
||||||
|
int exit_code = 1;
|
||||||
|
{
|
||||||
|
gin::IsolateHolder::LoadV8Snapshot();
|
||||||
|
gin::IsolateHolder::Initialize(
|
||||||
|
gin::IsolateHolder::kNonStrictMode,
|
||||||
|
gin::ArrayBufferAllocator::SharedInstance());
|
||||||
|
|
||||||
|
JavascriptEnvironment gin_env;
|
||||||
|
node::Environment* env = node::CreateEnvironment(
|
||||||
|
gin_env.isolate(), gin_env.context(), argc, argv, exec_argc, exec_argv);
|
||||||
|
|
||||||
|
bool more;
|
||||||
|
do {
|
||||||
|
more = uv_run(env->event_loop(), UV_RUN_ONCE);
|
||||||
|
if (more == false) {
|
||||||
|
node::EmitBeforeExit(env);
|
||||||
|
|
||||||
|
// Emit `beforeExit` if the loop became alive either after emitting
|
||||||
|
// event, or after running some callbacks.
|
||||||
|
more = uv_loop_alive(env->event_loop());
|
||||||
|
if (uv_run(env->event_loop(), UV_RUN_NOWAIT) != 0)
|
||||||
|
more = true;
|
||||||
|
}
|
||||||
|
} while (more == true);
|
||||||
|
|
||||||
|
exit_code = node::EmitExit(env);
|
||||||
|
node::RunAtExit(env);
|
||||||
|
|
||||||
|
env->Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
v8::V8::Dispose();
|
||||||
|
|
||||||
|
return exit_code;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
14
atom/app/node_main.h
Normal file
14
atom/app/node_main.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_APP_NODE_MAIN_H_
|
||||||
|
#define ATOM_APP_NODE_MAIN_H_
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
int NodeMain(int argc, char *argv[]);
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_APP_NODE_MAIN_H_
|
||||||
@@ -131,6 +131,10 @@ App::~App() {
|
|||||||
Browser::Get()->RemoveObserver(this);
|
Browser::Get()->RemoveObserver(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void App::OnBeforeQuit(bool* prevent_default) {
|
||||||
|
*prevent_default = Emit("before-quit");
|
||||||
|
}
|
||||||
|
|
||||||
void App::OnWillQuit(bool* prevent_default) {
|
void App::OnWillQuit(bool* prevent_default) {
|
||||||
*prevent_default = Emit("will-quit");
|
*prevent_default = Emit("will-quit");
|
||||||
}
|
}
|
||||||
@@ -234,11 +238,12 @@ mate::Handle<App> App::Create(v8::Isolate* isolate) {
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
void AppendSwitch(const std::string& switch_string, mate::Arguments* args) {
|
void AppendSwitch(const std::string& switch_string, mate::Arguments* args) {
|
||||||
|
auto command_line = base::CommandLine::ForCurrentProcess();
|
||||||
std::string value;
|
std::string value;
|
||||||
if (args->GetNext(&value))
|
if (args->GetNext(&value))
|
||||||
CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_string, value);
|
command_line->AppendSwitchASCII(switch_string, value);
|
||||||
else
|
else
|
||||||
CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
|
command_line->AppendSwitch(switch_string);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
@@ -259,13 +264,13 @@ void DockSetMenu(atom::api::Menu* menu) {
|
|||||||
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
||||||
v8::Handle<v8::Context> context, void* priv) {
|
v8::Handle<v8::Context> context, void* priv) {
|
||||||
v8::Isolate* isolate = context->GetIsolate();
|
v8::Isolate* isolate = context->GetIsolate();
|
||||||
CommandLine* command_line = CommandLine::ForCurrentProcess();
|
auto command_line = base::CommandLine::ForCurrentProcess();
|
||||||
|
|
||||||
mate::Dictionary dict(isolate, exports);
|
mate::Dictionary dict(isolate, exports);
|
||||||
dict.Set("app", atom::api::App::Create(isolate));
|
dict.Set("app", atom::api::App::Create(isolate));
|
||||||
dict.SetMethod("appendSwitch", &AppendSwitch);
|
dict.SetMethod("appendSwitch", &AppendSwitch);
|
||||||
dict.SetMethod("appendArgument",
|
dict.SetMethod("appendArgument",
|
||||||
base::Bind(&CommandLine::AppendArg,
|
base::Bind(&base::CommandLine::AppendArg,
|
||||||
base::Unretained(command_line)));
|
base::Unretained(command_line)));
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
auto browser = base::Unretained(Browser::Get());
|
auto browser = base::Unretained(Browser::Get());
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ class App : public mate::EventEmitter,
|
|||||||
virtual ~App();
|
virtual ~App();
|
||||||
|
|
||||||
// BrowserObserver:
|
// BrowserObserver:
|
||||||
|
void OnBeforeQuit(bool* prevent_default) override;
|
||||||
void OnWillQuit(bool* prevent_default) override;
|
void OnWillQuit(bool* prevent_default) override;
|
||||||
void OnWindowAllClosed() override;
|
void OnWindowAllClosed() override;
|
||||||
void OnQuit() override;
|
void OnQuit() override;
|
||||||
|
|||||||
@@ -26,20 +26,20 @@ class AutoUpdater : public mate::EventEmitter,
|
|||||||
virtual ~AutoUpdater();
|
virtual ~AutoUpdater();
|
||||||
|
|
||||||
// AutoUpdaterDelegate implementations.
|
// AutoUpdaterDelegate implementations.
|
||||||
virtual void OnError(const std::string& error) OVERRIDE;
|
void OnError(const std::string& error) override;
|
||||||
virtual void OnCheckingForUpdate() OVERRIDE;
|
void OnCheckingForUpdate() override;
|
||||||
virtual void OnUpdateAvailable() OVERRIDE;
|
void OnUpdateAvailable() override;
|
||||||
virtual void OnUpdateNotAvailable() OVERRIDE;
|
void OnUpdateNotAvailable() override;
|
||||||
virtual void OnUpdateDownloaded(
|
void OnUpdateDownloaded(
|
||||||
const std::string& release_notes,
|
const std::string& release_notes,
|
||||||
const std::string& release_name,
|
const std::string& release_name,
|
||||||
const base::Time& release_date,
|
const base::Time& release_date,
|
||||||
const std::string& update_url,
|
const std::string& update_url,
|
||||||
const base::Closure& quit_and_install) OVERRIDE;
|
const base::Closure& quit_and_install) override;
|
||||||
|
|
||||||
// mate::Wrappable implementations:
|
// mate::Wrappable implementations:
|
||||||
virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
|
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
|
||||||
v8::Isolate* isolate);
|
v8::Isolate* isolate) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void QuitAndInstall();
|
void QuitAndInstall();
|
||||||
|
|||||||
@@ -62,31 +62,26 @@ namespace {
|
|||||||
|
|
||||||
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
||||||
v8::Handle<v8::Context> context, void* priv) {
|
v8::Handle<v8::Context> context, void* priv) {
|
||||||
TracingController* controller = TracingController::GetInstance();
|
auto controller = base::Unretained(TracingController::GetInstance());
|
||||||
mate::Dictionary dict(context->GetIsolate(), exports);
|
mate::Dictionary dict(context->GetIsolate(), exports);
|
||||||
dict.SetMethod("getCategories", base::Bind(
|
dict.SetMethod("getCategories", base::Bind(
|
||||||
&TracingController::GetCategories, base::Unretained(controller)));
|
&TracingController::GetCategories, controller));
|
||||||
dict.SetMethod("startRecording", base::Bind(
|
dict.SetMethod("startRecording", base::Bind(
|
||||||
&TracingController::EnableRecording, base::Unretained(controller)));
|
&TracingController::EnableRecording, controller));
|
||||||
dict.SetMethod("stopRecording", base::Bind(
|
dict.SetMethod("stopRecording", base::Bind(
|
||||||
&TracingController::DisableRecording,
|
&TracingController::DisableRecording, controller, nullptr));
|
||||||
base::Unretained(controller),
|
|
||||||
nullptr));
|
|
||||||
dict.SetMethod("startMonitoring", base::Bind(
|
dict.SetMethod("startMonitoring", base::Bind(
|
||||||
&TracingController::EnableMonitoring, base::Unretained(controller)));
|
&TracingController::EnableMonitoring, controller));
|
||||||
dict.SetMethod("stopMonitoring", base::Bind(
|
dict.SetMethod("stopMonitoring", base::Bind(
|
||||||
&TracingController::DisableMonitoring, base::Unretained(controller)));
|
&TracingController::DisableMonitoring, controller));
|
||||||
dict.SetMethod("captureMonitoringSnapshot", base::Bind(
|
dict.SetMethod("captureMonitoringSnapshot", base::Bind(
|
||||||
&TracingController::CaptureMonitoringSnapshot,
|
&TracingController::CaptureMonitoringSnapshot, controller, nullptr));
|
||||||
base::Unretained(controller),
|
dict.SetMethod("getTraceBufferUsage", base::Bind(
|
||||||
nullptr));
|
&TracingController::GetTraceBufferUsage, controller));
|
||||||
dict.SetMethod("getTraceBufferPercentFull", base::Bind(
|
|
||||||
&TracingController::GetTraceBufferPercentFull,
|
|
||||||
base::Unretained(controller)));
|
|
||||||
dict.SetMethod("setWatchEvent", base::Bind(
|
dict.SetMethod("setWatchEvent", base::Bind(
|
||||||
&TracingController::SetWatchEvent, base::Unretained(controller)));
|
&TracingController::SetWatchEvent, controller));
|
||||||
dict.SetMethod("cancelWatchEvent", base::Bind(
|
dict.SetMethod("cancelWatchEvent", base::Bind(
|
||||||
&TracingController::CancelWatchEvent, base::Unretained(controller)));
|
&TracingController::CancelWatchEvent, controller));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -28,8 +28,8 @@ class GlobalShortcut : public extensions::GlobalShortcutListener::Observer,
|
|||||||
virtual ~GlobalShortcut();
|
virtual ~GlobalShortcut();
|
||||||
|
|
||||||
// mate::Wrappable implementations:
|
// mate::Wrappable implementations:
|
||||||
virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
|
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
|
||||||
v8::Isolate* isolate) OVERRIDE;
|
v8::Isolate* isolate) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
typedef std::map<ui::Accelerator, base::Closure> AcceleratorCallbackMap;
|
typedef std::map<ui::Accelerator, base::Closure> AcceleratorCallbackMap;
|
||||||
@@ -41,7 +41,7 @@ class GlobalShortcut : public extensions::GlobalShortcutListener::Observer,
|
|||||||
void UnregisterAll();
|
void UnregisterAll();
|
||||||
|
|
||||||
// GlobalShortcutListener::Observer implementation.
|
// GlobalShortcutListener::Observer implementation.
|
||||||
virtual void OnKeyPressed(const ui::Accelerator& accelerator) OVERRIDE;
|
void OnKeyPressed(const ui::Accelerator& accelerator) override;
|
||||||
|
|
||||||
AcceleratorCallbackMap accelerator_callback_map_;
|
AcceleratorCallbackMap accelerator_callback_map_;
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,9 @@
|
|||||||
|
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/common/native_mate_converters/accelerator_converter.h"
|
#include "atom/common/native_mate_converters/accelerator_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
|
#include "native_mate/callback.h"
|
||||||
#include "native_mate/constructor.h"
|
#include "native_mate/constructor.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
@@ -17,30 +19,6 @@ namespace atom {
|
|||||||
|
|
||||||
namespace api {
|
namespace api {
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
// Call method of delegate object.
|
|
||||||
v8::Handle<v8::Value> CallDelegate(v8::Isolate* isolate,
|
|
||||||
v8::Handle<v8::Value> default_value,
|
|
||||||
v8::Handle<v8::Object> menu,
|
|
||||||
const char* method,
|
|
||||||
int command_id) {
|
|
||||||
v8::Handle<v8::Value> delegate = menu->Get(
|
|
||||||
MATE_STRING_NEW(isolate, "delegate"));
|
|
||||||
if (!delegate->IsObject())
|
|
||||||
return default_value;
|
|
||||||
|
|
||||||
v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast(
|
|
||||||
delegate->ToObject()->Get(MATE_STRING_NEW(isolate, method)));
|
|
||||||
if (!function->IsFunction())
|
|
||||||
return default_value;
|
|
||||||
|
|
||||||
v8::Handle<v8::Value> argv = MATE_INTEGER_NEW(isolate, command_id);
|
|
||||||
return function->Call(isolate->GetCurrentContext()->Global(), 1, &argv);
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
Menu::Menu()
|
Menu::Menu()
|
||||||
: model_(new ui::SimpleMenuModel(this)),
|
: model_(new ui::SimpleMenuModel(this)),
|
||||||
parent_(NULL) {
|
parent_(NULL) {
|
||||||
@@ -49,37 +27,30 @@ Menu::Menu()
|
|||||||
Menu::~Menu() {
|
Menu::~Menu() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Menu::AfterInit(v8::Isolate* isolate) {
|
||||||
|
mate::Dictionary wrappable(isolate, GetWrapper(isolate));
|
||||||
|
mate::Dictionary delegate;
|
||||||
|
if (!wrappable.Get("delegate", &delegate))
|
||||||
|
return;
|
||||||
|
|
||||||
|
delegate.Get("isCommandIdChecked", &is_checked_);
|
||||||
|
delegate.Get("isCommandIdEnabled", &is_enabled_);
|
||||||
|
delegate.Get("isCommandIdVisible", &is_visible_);
|
||||||
|
delegate.Get("getAcceleratorForCommandId", &get_accelerator_);
|
||||||
|
delegate.Get("executeCommand", &execute_command_);
|
||||||
|
delegate.Get("menuWillShow", &menu_will_show_);
|
||||||
|
}
|
||||||
|
|
||||||
bool Menu::IsCommandIdChecked(int command_id) const {
|
bool Menu::IsCommandIdChecked(int command_id) const {
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
return is_checked_.Run(command_id);
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
return CallDelegate(isolate,
|
|
||||||
MATE_FALSE(isolate),
|
|
||||||
const_cast<Menu*>(this)->GetWrapper(isolate),
|
|
||||||
"isCommandIdChecked",
|
|
||||||
command_id)->BooleanValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Menu::IsCommandIdEnabled(int command_id) const {
|
bool Menu::IsCommandIdEnabled(int command_id) const {
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
return is_enabled_.Run(command_id);
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
return CallDelegate(isolate,
|
|
||||||
MATE_TRUE(isolate),
|
|
||||||
const_cast<Menu*>(this)->GetWrapper(isolate),
|
|
||||||
"isCommandIdEnabled",
|
|
||||||
command_id)->BooleanValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Menu::IsCommandIdVisible(int command_id) const {
|
bool Menu::IsCommandIdVisible(int command_id) const {
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
return is_visible_.Run(command_id);
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
return CallDelegate(isolate,
|
|
||||||
MATE_TRUE(isolate),
|
|
||||||
const_cast<Menu*>(this)->GetWrapper(isolate),
|
|
||||||
"isCommandIdVisible",
|
|
||||||
command_id)->BooleanValue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Menu::GetAcceleratorForCommandId(int command_id,
|
bool Menu::GetAcceleratorForCommandId(int command_id,
|
||||||
@@ -87,69 +58,16 @@ bool Menu::GetAcceleratorForCommandId(int command_id,
|
|||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
||||||
v8::Locker locker(isolate);
|
v8::Locker locker(isolate);
|
||||||
v8::HandleScope handle_scope(isolate);
|
v8::HandleScope handle_scope(isolate);
|
||||||
v8::Handle<v8::Value> shortcut = CallDelegate(isolate,
|
v8::Handle<v8::Value> val = get_accelerator_.Run(command_id);
|
||||||
MATE_UNDEFINED(isolate),
|
return mate::ConvertFromV8(isolate, val, accelerator);
|
||||||
GetWrapper(isolate),
|
|
||||||
"getAcceleratorForCommandId",
|
|
||||||
command_id);
|
|
||||||
return mate::ConvertFromV8(isolate, shortcut, accelerator);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Menu::IsItemForCommandIdDynamic(int command_id) const {
|
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
return CallDelegate(isolate,
|
|
||||||
MATE_FALSE(isolate),
|
|
||||||
const_cast<Menu*>(this)->GetWrapper(isolate),
|
|
||||||
"isItemForCommandIdDynamic",
|
|
||||||
command_id)->BooleanValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
base::string16 Menu::GetLabelForCommandId(int command_id) const {
|
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
v8::Handle<v8::Value> result = CallDelegate(
|
|
||||||
isolate,
|
|
||||||
MATE_FALSE(isolate),
|
|
||||||
const_cast<Menu*>(this)->GetWrapper(isolate),
|
|
||||||
"getLabelForCommandId",
|
|
||||||
command_id);
|
|
||||||
base::string16 label;
|
|
||||||
mate::ConvertFromV8(isolate, result, &label);
|
|
||||||
return label;
|
|
||||||
}
|
|
||||||
|
|
||||||
base::string16 Menu::GetSublabelForCommandId(int command_id) const {
|
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
v8::Handle<v8::Value> result = CallDelegate(
|
|
||||||
isolate,
|
|
||||||
MATE_FALSE(isolate),
|
|
||||||
const_cast<Menu*>(this)->GetWrapper(isolate),
|
|
||||||
"getSubLabelForCommandId",
|
|
||||||
command_id);
|
|
||||||
base::string16 label;
|
|
||||||
mate::ConvertFromV8(isolate, result, &label);
|
|
||||||
return label;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Menu::ExecuteCommand(int command_id, int event_flags) {
|
void Menu::ExecuteCommand(int command_id, int event_flags) {
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
execute_command_.Run(command_id);
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
CallDelegate(isolate, MATE_FALSE(isolate), GetWrapper(isolate),
|
|
||||||
"executeCommand", command_id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Menu::MenuWillShow(ui::SimpleMenuModel* source) {
|
void Menu::MenuWillShow(ui::SimpleMenuModel* source) {
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
menu_will_show_.Run();
|
||||||
v8::Locker locker(isolate);
|
|
||||||
v8::HandleScope handle_scope(isolate);
|
|
||||||
CallDelegate(isolate, MATE_FALSE(isolate), GetWrapper(isolate),
|
|
||||||
"menuWillShow", -1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Menu::AttachToWindow(Window* window) {
|
void Menu::AttachToWindow(Window* window) {
|
||||||
@@ -186,6 +104,10 @@ void Menu::InsertSubMenuAt(int index,
|
|||||||
model_->InsertSubMenuAt(index, command_id, label, menu->model_.get());
|
model_->InsertSubMenuAt(index, command_id, label, menu->model_.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Menu::SetIcon(int index, const gfx::Image& image) {
|
||||||
|
model_->SetIcon(index, image);
|
||||||
|
}
|
||||||
|
|
||||||
void Menu::SetSublabel(int index, const base::string16& sublabel) {
|
void Menu::SetSublabel(int index, const base::string16& sublabel) {
|
||||||
model_->SetSublabel(index, sublabel);
|
model_->SetSublabel(index, sublabel);
|
||||||
}
|
}
|
||||||
@@ -235,6 +157,7 @@ void Menu::BuildPrototype(v8::Isolate* isolate,
|
|||||||
.SetMethod("insertRadioItem", &Menu::InsertRadioItemAt)
|
.SetMethod("insertRadioItem", &Menu::InsertRadioItemAt)
|
||||||
.SetMethod("insertSeparator", &Menu::InsertSeparatorAt)
|
.SetMethod("insertSeparator", &Menu::InsertSeparatorAt)
|
||||||
.SetMethod("insertSubMenu", &Menu::InsertSubMenuAt)
|
.SetMethod("insertSubMenu", &Menu::InsertSubMenuAt)
|
||||||
|
.SetMethod("setIcon", &Menu::SetIcon)
|
||||||
.SetMethod("setSublabel", &Menu::SetSublabel)
|
.SetMethod("setSublabel", &Menu::SetSublabel)
|
||||||
.SetMethod("clear", &Menu::Clear)
|
.SetMethod("clear", &Menu::Clear)
|
||||||
.SetMethod("getIndexOfCommandId", &Menu::GetIndexOfCommandId)
|
.SetMethod("getIndexOfCommandId", &Menu::GetIndexOfCommandId)
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "atom/browser/api/atom_api_window.h"
|
#include "atom/browser/api/atom_api_window.h"
|
||||||
|
#include "base/callback.h"
|
||||||
#include "base/memory/scoped_ptr.h"
|
#include "base/memory/scoped_ptr.h"
|
||||||
#include "ui/base/models/simple_menu_model.h"
|
#include "ui/base/models/simple_menu_model.h"
|
||||||
#include "native_mate/wrappable.h"
|
#include "native_mate/wrappable.h"
|
||||||
@@ -16,8 +17,6 @@ namespace atom {
|
|||||||
|
|
||||||
namespace api {
|
namespace api {
|
||||||
|
|
||||||
class MenuMac;
|
|
||||||
|
|
||||||
class Menu : public mate::Wrappable,
|
class Menu : public mate::Wrappable,
|
||||||
public ui::SimpleMenuModel::Delegate {
|
public ui::SimpleMenuModel::Delegate {
|
||||||
public:
|
public:
|
||||||
@@ -40,16 +39,15 @@ class Menu : public mate::Wrappable,
|
|||||||
Menu();
|
Menu();
|
||||||
virtual ~Menu();
|
virtual ~Menu();
|
||||||
|
|
||||||
|
// mate::Wrappable:
|
||||||
|
void AfterInit(v8::Isolate* isolate) override;
|
||||||
|
|
||||||
// ui::SimpleMenuModel::Delegate implementations:
|
// ui::SimpleMenuModel::Delegate implementations:
|
||||||
bool IsCommandIdChecked(int command_id) const override;
|
bool IsCommandIdChecked(int command_id) const override;
|
||||||
bool IsCommandIdEnabled(int command_id) const override;
|
bool IsCommandIdEnabled(int command_id) const override;
|
||||||
bool IsCommandIdVisible(int command_id) const override;
|
bool IsCommandIdVisible(int command_id) const override;
|
||||||
bool GetAcceleratorForCommandId(
|
bool GetAcceleratorForCommandId(int command_id,
|
||||||
int command_id,
|
ui::Accelerator* accelerator) override;
|
||||||
ui::Accelerator* accelerator) override;
|
|
||||||
bool IsItemForCommandIdDynamic(int command_id) const override;
|
|
||||||
base::string16 GetLabelForCommandId(int command_id) const override;
|
|
||||||
base::string16 GetSublabelForCommandId(int command_id) const override;
|
|
||||||
void ExecuteCommand(int command_id, int event_flags) override;
|
void ExecuteCommand(int command_id, int event_flags) override;
|
||||||
void MenuWillShow(ui::SimpleMenuModel* source) override;
|
void MenuWillShow(ui::SimpleMenuModel* source) override;
|
||||||
|
|
||||||
@@ -74,6 +72,7 @@ class Menu : public mate::Wrappable,
|
|||||||
int command_id,
|
int command_id,
|
||||||
const base::string16& label,
|
const base::string16& label,
|
||||||
Menu* menu);
|
Menu* menu);
|
||||||
|
void SetIcon(int index, const gfx::Image& image);
|
||||||
void SetSublabel(int index, const base::string16& sublabel);
|
void SetSublabel(int index, const base::string16& sublabel);
|
||||||
void Clear();
|
void Clear();
|
||||||
int GetIndexOfCommandId(int command_id);
|
int GetIndexOfCommandId(int command_id);
|
||||||
@@ -85,6 +84,14 @@ class Menu : public mate::Wrappable,
|
|||||||
bool IsEnabledAt(int index) const;
|
bool IsEnabledAt(int index) const;
|
||||||
bool IsVisibleAt(int index) const;
|
bool IsVisibleAt(int index) const;
|
||||||
|
|
||||||
|
// Stored delegate methods.
|
||||||
|
base::Callback<bool(int)> is_checked_;
|
||||||
|
base::Callback<bool(int)> is_enabled_;
|
||||||
|
base::Callback<bool(int)> is_visible_;
|
||||||
|
base::Callback<v8::Handle<v8::Value>(int)> get_accelerator_;
|
||||||
|
base::Callback<void(int)> execute_command_;
|
||||||
|
base::Callback<void()> menu_will_show_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(Menu);
|
DISALLOW_COPY_AND_ASSIGN(Menu);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -19,8 +19,8 @@ class MenuMac : public Menu {
|
|||||||
protected:
|
protected:
|
||||||
MenuMac();
|
MenuMac();
|
||||||
|
|
||||||
virtual void Popup(Window* window) OVERRIDE;
|
void Popup(Window* window) override;
|
||||||
virtual void PopupAt(Window* window, int x, int y) OVERRIDE;
|
void PopupAt(Window* window, int x, int y) override;
|
||||||
|
|
||||||
base::scoped_nsobject<AtomMenuController> menu_controller_;
|
base::scoped_nsobject<AtomMenuController> menu_controller_;
|
||||||
|
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ class MenuViews : public Menu {
|
|||||||
MenuViews();
|
MenuViews();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void Popup(Window* window) OVERRIDE;
|
void Popup(Window* window) override;
|
||||||
virtual void PopupAt(Window* window, int x, int y) OVERRIDE;
|
void PopupAt(Window* window, int x, int y) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void PopupAtPoint(Window* window, const gfx::Point& point);
|
void PopupAtPoint(Window* window, const gfx::Point& point);
|
||||||
|
|||||||
@@ -24,9 +24,9 @@ class PowerMonitor : public mate::EventEmitter,
|
|||||||
virtual ~PowerMonitor();
|
virtual ~PowerMonitor();
|
||||||
|
|
||||||
// base::PowerObserver implementations:
|
// base::PowerObserver implementations:
|
||||||
virtual void OnPowerStateChange(bool on_battery_power) OVERRIDE;
|
void OnPowerStateChange(bool on_battery_power) override;
|
||||||
virtual void OnSuspend() OVERRIDE;
|
void OnSuspend() override;
|
||||||
virtual void OnResume() OVERRIDE;
|
void OnResume() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(PowerMonitor);
|
DISALLOW_COPY_AND_ASSIGN(PowerMonitor);
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class CustomProtocolRequestJob : public AdapterRequestJob {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// AdapterRequestJob:
|
// AdapterRequestJob:
|
||||||
virtual void GetJobTypeInUI() OVERRIDE {
|
void GetJobTypeInUI() override {
|
||||||
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
|
||||||
|
|
||||||
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
v8::Isolate* isolate = v8::Isolate::GetCurrent();
|
||||||
@@ -86,6 +86,17 @@ class CustomProtocolRequestJob : public AdapterRequestJob {
|
|||||||
base::Bind(&AdapterRequestJob::CreateStringJobAndStart,
|
base::Bind(&AdapterRequestJob::CreateStringJobAndStart,
|
||||||
GetWeakPtr(), mime_type, charset, data));
|
GetWeakPtr(), mime_type, charset, data));
|
||||||
return;
|
return;
|
||||||
|
} else if (name == "RequestBufferJob") {
|
||||||
|
std::string mime_type, encoding;
|
||||||
|
v8::Handle<v8::Value> buffer;
|
||||||
|
dict.Get("mimeType", &mime_type);
|
||||||
|
dict.Get("encoding", &encoding);
|
||||||
|
dict.Get("data", &buffer);
|
||||||
|
|
||||||
|
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
|
||||||
|
base::Bind(&AdapterRequestJob::CreateBufferJobAndStart,
|
||||||
|
GetWeakPtr(), mime_type, encoding, buffer->ToObject()));
|
||||||
|
return;
|
||||||
} else if (name == "RequestFileJob") {
|
} else if (name == "RequestFileJob") {
|
||||||
base::FilePath path;
|
base::FilePath path;
|
||||||
dict.Get("path", &path);
|
dict.Get("path", &path);
|
||||||
@@ -128,9 +139,9 @@ class CustomProtocolHandler : public ProtocolHandler {
|
|||||||
: registry_(registry), protocol_handler_(protocol_handler) {
|
: registry_(registry), protocol_handler_(protocol_handler) {
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual net::URLRequestJob* MaybeCreateJob(
|
net::URLRequestJob* MaybeCreateJob(
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate) const OVERRIDE {
|
net::NetworkDelegate* network_delegate) const override {
|
||||||
return new CustomProtocolRequestJob(registry_, protocol_handler_.get(),
|
return new CustomProtocolRequestJob(registry_, protocol_handler_.get(),
|
||||||
request, network_delegate);
|
request, network_delegate);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,16 +117,14 @@ mate::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder(
|
|||||||
// static
|
// static
|
||||||
v8::Handle<v8::Value> Screen::Create(v8::Isolate* isolate) {
|
v8::Handle<v8::Value> Screen::Create(v8::Isolate* isolate) {
|
||||||
if (!Browser::Get()->is_ready()) {
|
if (!Browser::Get()->is_ready()) {
|
||||||
isolate->ThrowException(v8::Exception::Error(mate::StringToV8(
|
node::ThrowError("Cannot initialize \"screen\" module before app is ready");
|
||||||
isolate, "Can not initialize \"screen\" module before app is ready")));
|
return v8::Null(isolate);
|
||||||
return v8::Undefined(isolate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
gfx::Screen* screen = gfx::Screen::GetNativeScreen();
|
gfx::Screen* screen = gfx::Screen::GetNativeScreen();
|
||||||
if (!screen) {
|
if (!screen) {
|
||||||
isolate->ThrowException(v8::Exception::Error(mate::StringToV8(
|
node::ThrowError("Failed to get screen information");
|
||||||
isolate, "Failed to get screen information")));
|
return v8::Null(isolate);
|
||||||
return v8::Undefined(isolate);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mate::CreateHandle(isolate, new Screen(screen)).ToV8();
|
return mate::CreateHandle(isolate, new Screen(screen)).ToV8();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "atom/browser/api/atom_api_menu.h"
|
#include "atom/browser/api/atom_api_menu.h"
|
||||||
|
#include "atom/browser/browser.h"
|
||||||
#include "atom/browser/ui/tray_icon.h"
|
#include "atom/browser/ui/tray_icon.h"
|
||||||
#include "atom/common/native_mate_converters/image_converter.h"
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
@@ -31,6 +32,10 @@ Tray::~Tray() {
|
|||||||
|
|
||||||
// static
|
// static
|
||||||
mate::Wrappable* Tray::New(const gfx::Image& image) {
|
mate::Wrappable* Tray::New(const gfx::Image& image) {
|
||||||
|
if (!Browser::Get()->is_ready()) {
|
||||||
|
node::ThrowError("Cannot create Tray before app is ready");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
return new Tray(image);
|
return new Tray(image);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/browser/web_dialog_helper.h"
|
#include "atom/browser/web_dialog_helper.h"
|
||||||
#include "atom/browser/web_view/web_view_renderer_state.h"
|
#include "atom/browser/web_view_manager.h"
|
||||||
#include "atom/common/api/api_messages.h"
|
#include "atom/common/api/api_messages.h"
|
||||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "brightray/browser/inspectable_web_contents.h"
|
#include "brightray/browser/inspectable_web_contents.h"
|
||||||
#include "content/public/browser/navigation_details.h"
|
#include "content/public/browser/navigation_details.h"
|
||||||
|
#include "content/public/browser/navigation_entry.h"
|
||||||
#include "content/public/browser/render_frame_host.h"
|
#include "content/public/browser/render_frame_host.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
#include "content/public/browser/render_view_host.h"
|
#include "content/public/browser/render_view_host.h"
|
||||||
@@ -39,13 +40,13 @@ v8::Persistent<v8::ObjectTemplate> template_;
|
|||||||
|
|
||||||
// Get the window that has the |guest| embedded.
|
// Get the window that has the |guest| embedded.
|
||||||
NativeWindow* GetWindowFromGuest(const content::WebContents* guest) {
|
NativeWindow* GetWindowFromGuest(const content::WebContents* guest) {
|
||||||
int guest_process_id = guest->GetRenderProcessHost()->GetID();
|
WebViewManager::WebViewInfo info;
|
||||||
WebViewRendererState::WebViewInfo info;
|
if (WebViewManager::GetInfoForProcess(guest->GetRenderProcessHost(), &info))
|
||||||
if (!WebViewRendererState::GetInstance()->GetInfo(guest_process_id, &info))
|
return NativeWindow::FromRenderView(
|
||||||
|
info.embedder->GetRenderProcessHost()->GetID(),
|
||||||
|
info.embedder->GetRoutingID());
|
||||||
|
else
|
||||||
return nullptr;
|
return nullptr;
|
||||||
return NativeWindow::FromRenderView(
|
|
||||||
info.embedder->GetRenderProcessHost()->GetID(),
|
|
||||||
info.embedder->GetRoutingID());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -55,6 +56,7 @@ WebContents::WebContents(content::WebContents* web_contents)
|
|||||||
guest_instance_id_(-1),
|
guest_instance_id_(-1),
|
||||||
element_instance_id_(-1),
|
element_instance_id_(-1),
|
||||||
guest_opaque_(true),
|
guest_opaque_(true),
|
||||||
|
guest_sizer_(nullptr),
|
||||||
auto_size_enabled_(false) {
|
auto_size_enabled_(false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,6 +64,7 @@ WebContents::WebContents(const mate::Dictionary& options)
|
|||||||
: guest_instance_id_(-1),
|
: guest_instance_id_(-1),
|
||||||
element_instance_id_(-1),
|
element_instance_id_(-1),
|
||||||
guest_opaque_(true),
|
guest_opaque_(true),
|
||||||
|
guest_sizer_(nullptr),
|
||||||
auto_size_enabled_(false) {
|
auto_size_enabled_(false) {
|
||||||
options.Get("guestInstanceId", &guest_instance_id_);
|
options.Get("guestInstanceId", &guest_instance_id_);
|
||||||
|
|
||||||
@@ -95,6 +98,7 @@ bool WebContents::AddMessageToConsole(content::WebContents* source,
|
|||||||
bool WebContents::ShouldCreateWebContents(
|
bool WebContents::ShouldCreateWebContents(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
int route_id,
|
int route_id,
|
||||||
|
int main_frame_route_id,
|
||||||
WindowContainerType window_container_type,
|
WindowContainerType window_container_type,
|
||||||
const base::string16& frame_name,
|
const base::string16& frame_name,
|
||||||
const GURL& target_url,
|
const GURL& target_url,
|
||||||
@@ -196,6 +200,15 @@ void WebContents::DidFinishLoad(content::RenderFrameHost* render_frame_host,
|
|||||||
Emit("did-finish-load");
|
Emit("did-finish-load");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// this error occurs when host could not be found
|
||||||
|
void WebContents::DidFailProvisionalLoad(
|
||||||
|
content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& validated_url,
|
||||||
|
int error_code,
|
||||||
|
const base::string16& error_description) {
|
||||||
|
Emit("did-fail-load", error_code, error_description);
|
||||||
|
}
|
||||||
|
|
||||||
void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host,
|
void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host,
|
||||||
const GURL& validated_url,
|
const GURL& validated_url,
|
||||||
int error_code,
|
int error_code,
|
||||||
@@ -212,7 +225,7 @@ void WebContents::DidStopLoading(content::RenderViewHost* render_view_host) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::DidGetRedirectForResourceRequest(
|
void WebContents::DidGetRedirectForResourceRequest(
|
||||||
content::RenderViewHost* render_view_host,
|
content::RenderFrameHost* render_frame_host,
|
||||||
const content::ResourceRedirectDetails& details) {
|
const content::ResourceRedirectDetails& details) {
|
||||||
Emit("did-get-redirect-request",
|
Emit("did-get-redirect-request",
|
||||||
details.url,
|
details.url,
|
||||||
@@ -247,14 +260,14 @@ void WebContents::RenderViewReady() {
|
|||||||
// WebContents::GetRenderWidgetHostView will return the RWHV of an
|
// WebContents::GetRenderWidgetHostView will return the RWHV of an
|
||||||
// interstitial page if one is showing at this time. We only want opacity
|
// interstitial page if one is showing at this time. We only want opacity
|
||||||
// to apply to web pages.
|
// to apply to web pages.
|
||||||
web_contents()->GetRenderViewHost()->GetView()->
|
if (guest_opaque_) {
|
||||||
SetBackgroundOpaque(guest_opaque_);
|
web_contents()
|
||||||
|
->GetRenderViewHost()
|
||||||
content::RenderViewHost* rvh = web_contents()->GetRenderViewHost();
|
->GetView()
|
||||||
if (auto_size_enabled_) {
|
->SetBackgroundColorToDefault();
|
||||||
rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
|
|
||||||
} else {
|
} else {
|
||||||
rvh->DisableAutoResize(element_size_);
|
web_contents()->GetRenderViewHost()->GetView()->SetBackgroundColor(
|
||||||
|
SK_ColorTRANSPARENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -264,13 +277,26 @@ void WebContents::WebContentsDestroyed() {
|
|||||||
Emit("destroyed");
|
Emit("destroyed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebContents::NavigationEntryCommitted(
|
||||||
|
const content::LoadCommittedDetails& load_details) {
|
||||||
|
auto entry = web_contents()->GetController().GetLastCommittedEntry();
|
||||||
|
entry->SetVirtualURL(load_details.entry->GetOriginalRequestURL());
|
||||||
|
}
|
||||||
|
|
||||||
void WebContents::DidAttach(int guest_proxy_routing_id) {
|
void WebContents::DidAttach(int guest_proxy_routing_id) {
|
||||||
Emit("did-attach");
|
Emit("did-attach");
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::ElementSizeChanged(const gfx::Size& old_size,
|
void WebContents::ElementSizeChanged(const gfx::Size& size) {
|
||||||
const gfx::Size& new_size) {
|
element_size_ = size;
|
||||||
element_size_ = new_size;
|
|
||||||
|
// Only resize if needed.
|
||||||
|
if (!size.IsEmpty())
|
||||||
|
guest_sizer_->SizeContents(size);
|
||||||
|
}
|
||||||
|
|
||||||
|
content::WebContents* WebContents::GetOwnerWebContents() const {
|
||||||
|
return embedder_web_contents_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::GuestSizeChanged(const gfx::Size& old_size,
|
void WebContents::GuestSizeChanged(const gfx::Size& old_size,
|
||||||
@@ -286,10 +312,15 @@ void WebContents::RegisterDestructionCallback(
|
|||||||
destruction_callback_ = callback;
|
destruction_callback_ = callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WebContents::SetGuestSizer(content::GuestSizer* guest_sizer) {
|
||||||
|
guest_sizer_ = guest_sizer;
|
||||||
|
}
|
||||||
|
|
||||||
void WebContents::WillAttach(content::WebContents* embedder_web_contents,
|
void WebContents::WillAttach(content::WebContents* embedder_web_contents,
|
||||||
int browser_plugin_instance_id) {
|
int element_instance_id,
|
||||||
|
bool is_full_page_plugin) {
|
||||||
embedder_web_contents_ = embedder_web_contents;
|
embedder_web_contents_ = embedder_web_contents;
|
||||||
element_instance_id_ = browser_plugin_instance_id;
|
element_instance_id_ = element_instance_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WebContents::Destroy() {
|
void WebContents::Destroy() {
|
||||||
@@ -323,7 +354,8 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
GURL WebContents::GetURL() const {
|
GURL WebContents::GetURL() const {
|
||||||
return web_contents()->GetURL();
|
auto entry = web_contents()->GetController().GetLastCommittedEntry();
|
||||||
|
return entry->GetVirtualURL();
|
||||||
}
|
}
|
||||||
|
|
||||||
base::string16 WebContents::GetTitle() const {
|
base::string16 WebContents::GetTitle() const {
|
||||||
@@ -498,7 +530,15 @@ void WebContents::SetAllowTransparency(bool allow) {
|
|||||||
if (!web_contents()->GetRenderViewHost()->GetView())
|
if (!web_contents()->GetRenderViewHost()->GetView())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
web_contents()->GetRenderViewHost()->GetView()->SetBackgroundOpaque(!allow);
|
if (guest_opaque_) {
|
||||||
|
web_contents()
|
||||||
|
->GetRenderViewHost()
|
||||||
|
->GetView()
|
||||||
|
->SetBackgroundColorToDefault();
|
||||||
|
} else {
|
||||||
|
web_contents()->GetRenderViewHost()->GetView()->SetBackgroundColor(
|
||||||
|
SK_ColorTRANSPARENT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
|
mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
|
||||||
|
|||||||
@@ -120,6 +120,7 @@ class WebContents : public mate::EventEmitter,
|
|||||||
bool ShouldCreateWebContents(
|
bool ShouldCreateWebContents(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
int route_id,
|
int route_id,
|
||||||
|
int main_frame_route_id,
|
||||||
WindowContainerType window_container_type,
|
WindowContainerType window_container_type,
|
||||||
const base::string16& frame_name,
|
const base::string16& frame_name,
|
||||||
const GURL& target_url,
|
const GURL& target_url,
|
||||||
@@ -154,10 +155,14 @@ class WebContents : public mate::EventEmitter,
|
|||||||
const GURL& validated_url,
|
const GURL& validated_url,
|
||||||
int error_code,
|
int error_code,
|
||||||
const base::string16& error_description) override;
|
const base::string16& error_description) override;
|
||||||
|
void DidFailProvisionalLoad(content::RenderFrameHost* render_frame_host,
|
||||||
|
const GURL& validated_url,
|
||||||
|
int error_code,
|
||||||
|
const base::string16& error_description) override;
|
||||||
void DidStartLoading(content::RenderViewHost* render_view_host) override;
|
void DidStartLoading(content::RenderViewHost* render_view_host) override;
|
||||||
void DidStopLoading(content::RenderViewHost* render_view_host) override;
|
void DidStopLoading(content::RenderViewHost* render_view_host) override;
|
||||||
void DidGetRedirectForResourceRequest(
|
void DidGetRedirectForResourceRequest(
|
||||||
content::RenderViewHost* render_view_host,
|
content::RenderFrameHost* render_frame_host,
|
||||||
const content::ResourceRedirectDetails& details) override;
|
const content::ResourceRedirectDetails& details) override;
|
||||||
void DidNavigateMainFrame(
|
void DidNavigateMainFrame(
|
||||||
const content::LoadCommittedDetails& details,
|
const content::LoadCommittedDetails& details,
|
||||||
@@ -165,16 +170,20 @@ class WebContents : public mate::EventEmitter,
|
|||||||
bool OnMessageReceived(const IPC::Message& message) override;
|
bool OnMessageReceived(const IPC::Message& message) override;
|
||||||
void RenderViewReady() override;
|
void RenderViewReady() override;
|
||||||
void WebContentsDestroyed() override;
|
void WebContentsDestroyed() override;
|
||||||
|
void NavigationEntryCommitted(
|
||||||
|
const content::LoadCommittedDetails& load_details) override;
|
||||||
|
|
||||||
// content::BrowserPluginGuestDelegate:
|
// content::BrowserPluginGuestDelegate:
|
||||||
void DidAttach(int guest_proxy_routing_id) final;
|
void DidAttach(int guest_proxy_routing_id) final;
|
||||||
void ElementSizeChanged(const gfx::Size& old_size,
|
void ElementSizeChanged(const gfx::Size& size) final;
|
||||||
const gfx::Size& new_size) final;
|
content::WebContents* GetOwnerWebContents() const final;
|
||||||
void GuestSizeChanged(const gfx::Size& old_size,
|
void GuestSizeChanged(const gfx::Size& old_size,
|
||||||
const gfx::Size& new_size) final;
|
const gfx::Size& new_size) final;
|
||||||
void RegisterDestructionCallback(const DestructionCallback& callback) final;
|
void RegisterDestructionCallback(const DestructionCallback& callback) final;
|
||||||
|
void SetGuestSizer(content::GuestSizer* guest_sizer) final;
|
||||||
void WillAttach(content::WebContents* embedder_web_contents,
|
void WillAttach(content::WebContents* embedder_web_contents,
|
||||||
int browser_plugin_instance_id) final;
|
int element_instance_id,
|
||||||
|
bool is_full_page_plugin) final;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Called when received a message from renderer.
|
// Called when received a message from renderer.
|
||||||
@@ -216,6 +225,9 @@ class WebContents : public mate::EventEmitter,
|
|||||||
// element may not match the size of the guest.
|
// element may not match the size of the guest.
|
||||||
gfx::Size guest_size_;
|
gfx::Size guest_size_;
|
||||||
|
|
||||||
|
// A pointer to the guest_sizer.
|
||||||
|
content::GuestSizer* guest_sizer_;
|
||||||
|
|
||||||
// Indicates whether autosize mode is enabled or not.
|
// Indicates whether autosize mode is enabled or not.
|
||||||
bool auto_size_enabled_;
|
bool auto_size_enabled_;
|
||||||
|
|
||||||
|
|||||||
93
atom/browser/api/atom_api_web_view_manager.cc
Normal file
93
atom/browser/api/atom_api_web_view_manager.cc
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/api/atom_api_web_contents.h"
|
||||||
|
#include "atom/browser/web_view_manager.h"
|
||||||
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
|
#include "content/public/browser/browser_context.h"
|
||||||
|
#include "native_mate/dictionary.h"
|
||||||
|
#include "net/base/filename_util.h"
|
||||||
|
|
||||||
|
#include "atom/common/node_includes.h"
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct Converter<content::WebContents*> {
|
||||||
|
static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
|
||||||
|
content::WebContents** out) {
|
||||||
|
atom::api::WebContents* contents;
|
||||||
|
if (!Converter<atom::api::WebContents*>::FromV8(isolate, val, &contents))
|
||||||
|
return false;
|
||||||
|
*out = contents->web_contents();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct Converter<atom::WebViewManager::WebViewInfo> {
|
||||||
|
static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
|
||||||
|
atom::WebViewManager::WebViewInfo* out) {
|
||||||
|
Dictionary options;
|
||||||
|
if (!ConvertFromV8(isolate, val, &options))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
GURL preload_url;
|
||||||
|
if (!options.Get("preloadUrl", &preload_url))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!preload_url.is_empty() &&
|
||||||
|
!net::FileURLToFilePath(preload_url, &(out->preload_script)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return options.Get("nodeIntegration", &(out->node_integration)) &&
|
||||||
|
options.Get("plugins", &(out->plugins)) &&
|
||||||
|
options.Get("disableWebSecurity", &(out->disable_web_security));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace mate
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
atom::WebViewManager* GetWebViewManager(content::WebContents* web_contents) {
|
||||||
|
auto context = web_contents->GetBrowserContext();
|
||||||
|
if (context) {
|
||||||
|
auto manager = context->GetGuestManager();
|
||||||
|
return static_cast<atom::WebViewManager*>(manager);
|
||||||
|
} else {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AddGuest(int guest_instance_id,
|
||||||
|
int element_instance_id,
|
||||||
|
content::WebContents* embedder,
|
||||||
|
content::WebContents* guest_web_contents,
|
||||||
|
atom::WebViewManager::WebViewInfo info) {
|
||||||
|
auto manager = GetWebViewManager(embedder);
|
||||||
|
if (manager) {
|
||||||
|
info.guest_instance_id = guest_instance_id;
|
||||||
|
info.embedder = embedder;
|
||||||
|
manager->AddGuest(guest_instance_id, element_instance_id, embedder,
|
||||||
|
guest_web_contents, info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RemoveGuest(content::WebContents* embedder, int guest_instance_id) {
|
||||||
|
auto manager = GetWebViewManager(embedder);
|
||||||
|
if (manager)
|
||||||
|
manager->RemoveGuest(guest_instance_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
||||||
|
v8::Handle<v8::Context> context, void* priv) {
|
||||||
|
mate::Dictionary dict(context->GetIsolate(), exports);
|
||||||
|
dict.SetMethod("addGuest", &AddGuest);
|
||||||
|
dict.SetMethod("removeGuest", &RemoveGuest);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_browser_web_view_manager, Initialize)
|
||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/common/native_mate_converters/gfx_converter.h"
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
#include "native_mate/callback.h"
|
#include "native_mate/callback.h"
|
||||||
@@ -51,15 +52,11 @@ namespace {
|
|||||||
|
|
||||||
void OnCapturePageDone(
|
void OnCapturePageDone(
|
||||||
v8::Isolate* isolate,
|
v8::Isolate* isolate,
|
||||||
const base::Callback<void(v8::Handle<v8::Value>)>& callback,
|
const base::Callback<void(const gfx::Image&)>& callback,
|
||||||
const std::vector<unsigned char>& data) {
|
const SkBitmap& bitmap) {
|
||||||
v8::Locker locker(isolate);
|
v8::Locker locker(isolate);
|
||||||
v8::HandleScope handle_scope(isolate);
|
v8::HandleScope handle_scope(isolate);
|
||||||
|
callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap));
|
||||||
v8::Local<v8::Value> buffer = node::Buffer::New(
|
|
||||||
reinterpret_cast<const char*>(data.data()),
|
|
||||||
data.size());
|
|
||||||
callback.Run(buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
@@ -145,13 +142,11 @@ void Window::OnRendererResponsive() {
|
|||||||
// static
|
// static
|
||||||
mate::Wrappable* Window::New(v8::Isolate* isolate,
|
mate::Wrappable* Window::New(v8::Isolate* isolate,
|
||||||
const mate::Dictionary& options) {
|
const mate::Dictionary& options) {
|
||||||
if (Browser::Get()->is_ready()) {
|
if (!Browser::Get()->is_ready()) {
|
||||||
return new Window(options);
|
node::ThrowError("Cannot create BrowserWindow before app is ready");
|
||||||
} else {
|
|
||||||
isolate->ThrowException(v8::Exception::TypeError(mate::StringToV8(
|
|
||||||
isolate, "Can not create BrowserWindow before app is ready")));
|
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
return new Window(options);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::Destroy() {
|
void Window::Destroy() {
|
||||||
@@ -327,8 +322,8 @@ bool Window::IsKiosk() {
|
|||||||
return window_->IsKiosk();
|
return window_->IsKiosk();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::OpenDevTools() {
|
void Window::OpenDevTools(bool can_dock) {
|
||||||
window_->OpenDevTools();
|
window_->OpenDevTools(can_dock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::CloseDevTools() {
|
void Window::CloseDevTools() {
|
||||||
@@ -373,7 +368,7 @@ bool Window::IsDocumentEdited() {
|
|||||||
|
|
||||||
void Window::CapturePage(mate::Arguments* args) {
|
void Window::CapturePage(mate::Arguments* args) {
|
||||||
gfx::Rect rect;
|
gfx::Rect rect;
|
||||||
base::Callback<void(v8::Handle<v8::Value>)> callback;
|
base::Callback<void(const gfx::Image&)> callback;
|
||||||
|
|
||||||
if (!(args->Length() == 1 && args->GetNext(&callback)) &&
|
if (!(args->Length() == 1 && args->GetNext(&callback)) &&
|
||||||
!(args->Length() == 2 && args->GetNext(&rect)
|
!(args->Length() == 2 && args->GetNext(&rect)
|
||||||
@@ -400,6 +395,11 @@ void Window::SetProgressBar(double progress) {
|
|||||||
window_->SetProgressBar(progress);
|
window_->SetProgressBar(progress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Window::SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description) {
|
||||||
|
window_->SetOverlayIcon(overlay, description);
|
||||||
|
}
|
||||||
|
|
||||||
void Window::SetAutoHideMenuBar(bool auto_hide) {
|
void Window::SetAutoHideMenuBar(bool auto_hide) {
|
||||||
window_->SetAutoHideMenuBar(auto_hide);
|
window_->SetAutoHideMenuBar(auto_hide);
|
||||||
}
|
}
|
||||||
@@ -422,6 +422,14 @@ void Window::ShowDefinitionForSelection() {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void Window::SetVisibleOnAllWorkspaces(bool visible) {
|
||||||
|
return window_->SetVisibleOnAllWorkspaces(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Window::IsVisibleOnAllWorkspaces() {
|
||||||
|
return window_->IsVisibleOnAllWorkspaces();
|
||||||
|
}
|
||||||
|
|
||||||
mate::Handle<WebContents> Window::GetWebContents(v8::Isolate* isolate) const {
|
mate::Handle<WebContents> Window::GetWebContents(v8::Isolate* isolate) const {
|
||||||
return WebContents::CreateFrom(isolate, window_->GetWebContents());
|
return WebContents::CreateFrom(isolate, window_->GetWebContents());
|
||||||
}
|
}
|
||||||
@@ -487,10 +495,15 @@ void Window::BuildPrototype(v8::Isolate* isolate,
|
|||||||
.SetMethod("capturePage", &Window::CapturePage)
|
.SetMethod("capturePage", &Window::CapturePage)
|
||||||
.SetMethod("print", &Window::Print)
|
.SetMethod("print", &Window::Print)
|
||||||
.SetMethod("setProgressBar", &Window::SetProgressBar)
|
.SetMethod("setProgressBar", &Window::SetProgressBar)
|
||||||
|
.SetMethod("setOverlayIcon", &Window::SetOverlayIcon)
|
||||||
.SetMethod("setAutoHideMenuBar", &Window::SetAutoHideMenuBar)
|
.SetMethod("setAutoHideMenuBar", &Window::SetAutoHideMenuBar)
|
||||||
.SetMethod("isMenuBarAutoHide", &Window::IsMenuBarAutoHide)
|
.SetMethod("isMenuBarAutoHide", &Window::IsMenuBarAutoHide)
|
||||||
.SetMethod("setMenuBarVisibility", &Window::SetMenuBarVisibility)
|
.SetMethod("setMenuBarVisibility", &Window::SetMenuBarVisibility)
|
||||||
.SetMethod("isMenuBarVisible", &Window::IsMenuBarVisible)
|
.SetMethod("isMenuBarVisible", &Window::IsMenuBarVisible)
|
||||||
|
.SetMethod("setVisibleOnAllWorkspaces",
|
||||||
|
&Window::SetVisibleOnAllWorkspaces)
|
||||||
|
.SetMethod("isVisibleOnAllWorkspaces",
|
||||||
|
&Window::IsVisibleOnAllWorkspaces)
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
.SetMethod("showDefinitionForSelection",
|
.SetMethod("showDefinitionForSelection",
|
||||||
&Window::ShowDefinitionForSelection)
|
&Window::ShowDefinitionForSelection)
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "base/memory/scoped_ptr.h"
|
#include "base/memory/scoped_ptr.h"
|
||||||
|
#include "ui/gfx/image/image.h"
|
||||||
#include "atom/browser/native_window_observer.h"
|
#include "atom/browser/native_window_observer.h"
|
||||||
#include "atom/browser/api/event_emitter.h"
|
#include "atom/browser/api/event_emitter.h"
|
||||||
#include "native_mate/handle.h"
|
#include "native_mate/handle.h"
|
||||||
@@ -104,7 +105,7 @@ class Window : public mate::EventEmitter,
|
|||||||
void SetSkipTaskbar(bool skip);
|
void SetSkipTaskbar(bool skip);
|
||||||
void SetKiosk(bool kiosk);
|
void SetKiosk(bool kiosk);
|
||||||
bool IsKiosk();
|
bool IsKiosk();
|
||||||
void OpenDevTools();
|
void OpenDevTools(bool can_dock);
|
||||||
void CloseDevTools();
|
void CloseDevTools();
|
||||||
bool IsDevToolsOpened();
|
bool IsDevToolsOpened();
|
||||||
void InspectElement(int x, int y);
|
void InspectElement(int x, int y);
|
||||||
@@ -118,6 +119,8 @@ class Window : public mate::EventEmitter,
|
|||||||
void CapturePage(mate::Arguments* args);
|
void CapturePage(mate::Arguments* args);
|
||||||
void Print(mate::Arguments* args);
|
void Print(mate::Arguments* args);
|
||||||
void SetProgressBar(double progress);
|
void SetProgressBar(double progress);
|
||||||
|
void SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description);
|
||||||
void SetAutoHideMenuBar(bool auto_hide);
|
void SetAutoHideMenuBar(bool auto_hide);
|
||||||
bool IsMenuBarAutoHide();
|
bool IsMenuBarAutoHide();
|
||||||
void SetMenuBarVisibility(bool visible);
|
void SetMenuBarVisibility(bool visible);
|
||||||
@@ -127,6 +130,9 @@ class Window : public mate::EventEmitter,
|
|||||||
void ShowDefinitionForSelection();
|
void ShowDefinitionForSelection();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void SetVisibleOnAllWorkspaces(bool visible);
|
||||||
|
bool IsVisibleOnAllWorkspaces();
|
||||||
|
|
||||||
// APIs for WebContents.
|
// APIs for WebContents.
|
||||||
mate::Handle<WebContents> GetWebContents(v8::Isolate* isolate) const;
|
mate::Handle<WebContents> GetWebContents(v8::Isolate* isolate) const;
|
||||||
mate::Handle<WebContents> GetDevToolsWebContents(v8::Isolate* isolate) const;
|
mate::Handle<WebContents> GetDevToolsWebContents(v8::Isolate* isolate) const;
|
||||||
|
|||||||
@@ -34,10 +34,10 @@ class Event : public Wrappable,
|
|||||||
virtual ~Event();
|
virtual ~Event();
|
||||||
|
|
||||||
// Wrappable implementations:
|
// Wrappable implementations:
|
||||||
virtual ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate);
|
ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) override;
|
||||||
|
|
||||||
// content::WebContentsObserver implementations:
|
// content::WebContentsObserver implementations:
|
||||||
virtual void WebContentsDestroyed() OVERRIDE;
|
void WebContentsDestroyed() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// Replyer for the synchronous messages.
|
// Replyer for the synchronous messages.
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ BrowserWindow::_init = ->
|
|||||||
@setMenu menu if menu?
|
@setMenu menu if menu?
|
||||||
|
|
||||||
@webContents = @getWebContents()
|
@webContents = @getWebContents()
|
||||||
|
@devToolsWebContents = null
|
||||||
@webContents.once 'destroyed', => @webContents = null
|
@webContents.once 'destroyed', => @webContents = null
|
||||||
|
|
||||||
# Remember the window ID.
|
# Remember the window ID.
|
||||||
@@ -39,8 +40,9 @@ BrowserWindow::_init = ->
|
|||||||
@once 'closed', =>
|
@once 'closed', =>
|
||||||
BrowserWindow.windows.remove @id if BrowserWindow.windows.has @id
|
BrowserWindow.windows.remove @id if BrowserWindow.windows.has @id
|
||||||
|
|
||||||
BrowserWindow::openDevTools = ->
|
BrowserWindow::openDevTools = (options={}) ->
|
||||||
@_openDevTools()
|
options.detach ?= false
|
||||||
|
@_openDevTools !options.detach
|
||||||
|
|
||||||
# Force devToolsWebContents to be created.
|
# Force devToolsWebContents to be created.
|
||||||
@devToolsWebContents = @getDevToolsWebContents()
|
@devToolsWebContents = @getDevToolsWebContents()
|
||||||
|
|||||||
@@ -83,8 +83,8 @@ module.exports =
|
|||||||
|
|
||||||
options ?= type: 'none'
|
options ?= type: 'none'
|
||||||
options.type ?= 'none'
|
options.type ?= 'none'
|
||||||
options.type = messageBoxTypes.indexOf options.type
|
messageBoxType = messageBoxTypes.indexOf options.type
|
||||||
throw new TypeError('Invalid message box type') unless options.type > -1
|
throw new TypeError('Invalid message box type') unless messageBoxType > -1
|
||||||
|
|
||||||
throw new TypeError('Buttons need to be array') unless Array.isArray options.buttons
|
throw new TypeError('Buttons need to be array') unless Array.isArray options.buttons
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ module.exports =
|
|||||||
options.detail ?= ''
|
options.detail ?= ''
|
||||||
options.icon ?= null
|
options.icon ?= null
|
||||||
|
|
||||||
binding.showMessageBox options.type,
|
binding.showMessageBox messageBoxType,
|
||||||
options.buttons,
|
options.buttons,
|
||||||
[options.title, options.message, options.detail],
|
[options.title, options.message, options.detail],
|
||||||
options.icon,
|
options.icon,
|
||||||
|
|||||||
@@ -9,13 +9,14 @@ class MenuItem
|
|||||||
constructor: (options) ->
|
constructor: (options) ->
|
||||||
Menu = require 'menu'
|
Menu = require 'menu'
|
||||||
|
|
||||||
{click, @selector, @type, @label, @sublabel, @accelerator, @enabled, @visible, @checked, @submenu} = options
|
{click, @selector, @type, @label, @sublabel, @accelerator, @icon, @enabled, @visible, @checked, @submenu} = options
|
||||||
|
|
||||||
@type = 'submenu' if not @type? and @submenu?
|
@type = 'submenu' if not @type? and @submenu?
|
||||||
throw new Error('Invalid submenu') if @type is 'submenu' and @submenu?.constructor isnt Menu
|
throw new Error('Invalid submenu') if @type is 'submenu' and @submenu?.constructor isnt Menu
|
||||||
|
|
||||||
@overrideReadOnlyProperty 'type', 'normal'
|
@overrideReadOnlyProperty 'type', 'normal'
|
||||||
@overrideReadOnlyProperty 'accelerator'
|
@overrideReadOnlyProperty 'accelerator'
|
||||||
|
@overrideReadOnlyProperty 'icon'
|
||||||
@overrideReadOnlyProperty 'submenu'
|
@overrideReadOnlyProperty 'submenu'
|
||||||
@overrideProperty 'label', ''
|
@overrideProperty 'label', ''
|
||||||
@overrideProperty 'sublabel', ''
|
@overrideProperty 'sublabel', ''
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ Menu::_init = ->
|
|||||||
isCommandIdEnabled: (commandId) => @commandsMap[commandId]?.enabled
|
isCommandIdEnabled: (commandId) => @commandsMap[commandId]?.enabled
|
||||||
isCommandIdVisible: (commandId) => @commandsMap[commandId]?.visible
|
isCommandIdVisible: (commandId) => @commandsMap[commandId]?.visible
|
||||||
getAcceleratorForCommandId: (commandId) => @commandsMap[commandId]?.accelerator
|
getAcceleratorForCommandId: (commandId) => @commandsMap[commandId]?.accelerator
|
||||||
|
getIconForCommandId: (commandId) => @commandsMap[commandId]?.icon
|
||||||
executeCommand: (commandId) => @commandsMap[commandId]?.click()
|
executeCommand: (commandId) => @commandsMap[commandId]?.click()
|
||||||
menuWillShow: =>
|
menuWillShow: =>
|
||||||
# Make sure radio groups have at least one menu item seleted.
|
# Make sure radio groups have at least one menu item seleted.
|
||||||
@@ -82,6 +83,7 @@ Menu::insert = (pos, item) ->
|
|||||||
@insertRadioItem pos, item.commandId, item.label, item.groupId
|
@insertRadioItem pos, item.commandId, item.label, item.groupId
|
||||||
|
|
||||||
@setSublabel pos, item.sublabel if item.sublabel?
|
@setSublabel pos, item.sublabel if item.sublabel?
|
||||||
|
@setIcon pos, item.icon if item.icon?
|
||||||
|
|
||||||
# Make menu accessable to items.
|
# Make menu accessable to items.
|
||||||
item.overrideReadOnlyProperty 'menu', this
|
item.overrideReadOnlyProperty 'menu', this
|
||||||
|
|||||||
@@ -16,6 +16,16 @@ class RequestStringJob
|
|||||||
@charset = charset ? 'UTF-8'
|
@charset = charset ? 'UTF-8'
|
||||||
@data = String data
|
@data = String data
|
||||||
|
|
||||||
|
protocol.RequestBufferJob =
|
||||||
|
class RequestBufferJob
|
||||||
|
constructor: ({mimeType, encoding, data}) ->
|
||||||
|
if not data instanceof Buffer
|
||||||
|
throw new TypeError('Data should be Buffer')
|
||||||
|
|
||||||
|
@mimeType = mimeType ? 'application/octet-stream'
|
||||||
|
@encoding = encoding ? 'utf8'
|
||||||
|
@data = new Buffer(data)
|
||||||
|
|
||||||
protocol.RequestFileJob =
|
protocol.RequestFileJob =
|
||||||
class RequestFileJob
|
class RequestFileJob
|
||||||
constructor: (@path) ->
|
constructor: (@path) ->
|
||||||
|
|||||||
@@ -17,10 +17,10 @@ class AtomAccessTokenStore : public content::AccessTokenStore {
|
|||||||
virtual ~AtomAccessTokenStore();
|
virtual ~AtomAccessTokenStore();
|
||||||
|
|
||||||
// content::AccessTokenStore:
|
// content::AccessTokenStore:
|
||||||
virtual void LoadAccessTokens(
|
void LoadAccessTokens(
|
||||||
const LoadAccessTokensCallbackType& callback) OVERRIDE;
|
const LoadAccessTokensCallbackType& callback) override;
|
||||||
virtual void SaveAccessToken(const GURL& server_url,
|
void SaveAccessToken(const GURL& server_url,
|
||||||
const base::string16& access_token) OVERRIDE;
|
const base::string16& access_token) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
DISALLOW_COPY_AND_ASSIGN(AtomAccessTokenStore);
|
DISALLOW_COPY_AND_ASSIGN(AtomAccessTokenStore);
|
||||||
|
|||||||
@@ -7,9 +7,10 @@
|
|||||||
#include "atom/browser/atom_access_token_store.h"
|
#include "atom/browser/atom_access_token_store.h"
|
||||||
#include "atom/browser/atom_browser_context.h"
|
#include "atom/browser/atom_browser_context.h"
|
||||||
#include "atom/browser/atom_browser_main_parts.h"
|
#include "atom/browser/atom_browser_main_parts.h"
|
||||||
|
#include "atom/browser/atom_resource_dispatcher_host_delegate.h"
|
||||||
#include "atom/browser/atom_speech_recognition_manager_delegate.h"
|
#include "atom/browser/atom_speech_recognition_manager_delegate.h"
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "atom/browser/web_view/web_view_renderer_state.h"
|
#include "atom/browser/web_view_manager.h"
|
||||||
#include "atom/browser/window_list.h"
|
#include "atom/browser/window_list.h"
|
||||||
#include "atom/common/options_switches.h"
|
#include "atom/common/options_switches.h"
|
||||||
#include "base/command_line.h"
|
#include "base/command_line.h"
|
||||||
@@ -18,6 +19,7 @@
|
|||||||
#include "chrome/browser/speech/tts_message_filter.h"
|
#include "chrome/browser/speech/tts_message_filter.h"
|
||||||
#include "content/public/browser/render_process_host.h"
|
#include "content/public/browser/render_process_host.h"
|
||||||
#include "content/public/browser/render_view_host.h"
|
#include "content/public/browser/render_view_host.h"
|
||||||
|
#include "content/public/browser/resource_dispatcher_host.h"
|
||||||
#include "content/public/browser/site_instance.h"
|
#include "content/public/browser/site_instance.h"
|
||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
#include "content/public/common/web_preferences.h"
|
#include "content/public/common/web_preferences.h"
|
||||||
@@ -61,7 +63,7 @@ void AtomBrowserClient::RenderProcessWillLaunch(
|
|||||||
}
|
}
|
||||||
|
|
||||||
content::SpeechRecognitionManagerDelegate*
|
content::SpeechRecognitionManagerDelegate*
|
||||||
AtomBrowserClient::GetSpeechRecognitionManagerDelegate() {
|
AtomBrowserClient::CreateSpeechRecognitionManagerDelegate() {
|
||||||
return new AtomSpeechRecognitionManagerDelegate;
|
return new AtomSpeechRecognitionManagerDelegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +71,12 @@ content::AccessTokenStore* AtomBrowserClient::CreateAccessTokenStore() {
|
|||||||
return new AtomAccessTokenStore;
|
return new AtomAccessTokenStore;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void AtomBrowserClient::ResourceDispatcherHostCreated() {
|
||||||
|
resource_dispatcher_delegate_.reset(new AtomResourceDispatcherHostDelegate);
|
||||||
|
content::ResourceDispatcherHost::Get()->SetDelegate(
|
||||||
|
resource_dispatcher_delegate_.get());
|
||||||
|
}
|
||||||
|
|
||||||
void AtomBrowserClient::OverrideWebkitPrefs(
|
void AtomBrowserClient::OverrideWebkitPrefs(
|
||||||
content::RenderViewHost* render_view_host,
|
content::RenderViewHost* render_view_host,
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
@@ -97,16 +105,15 @@ void AtomBrowserClient::OverrideWebkitPrefs(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Custom preferences of guest page.
|
// Custom preferences of guest page.
|
||||||
int guest_process_id = render_view_host->GetProcess()->GetID();
|
auto process = render_view_host->GetProcess();
|
||||||
WebViewRendererState::WebViewInfo info;
|
WebViewManager::WebViewInfo info;
|
||||||
if (WebViewRendererState::GetInstance()->GetInfo(guest_process_id, &info)) {
|
if (WebViewManager::GetInfoForProcess(process, &info)) {
|
||||||
prefs->web_security_enabled = !info.disable_web_security;
|
prefs->web_security_enabled = !info.disable_web_security;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
NativeWindow* window = NativeWindow::FromRenderView(
|
NativeWindow* window = NativeWindow::FromRenderView(
|
||||||
render_view_host->GetProcess()->GetID(),
|
process->GetID(), render_view_host->GetRoutingID());
|
||||||
render_view_host->GetRoutingID());
|
|
||||||
if (window)
|
if (window)
|
||||||
window->OverrideWebkitPrefs(url, prefs);
|
window->OverrideWebkitPrefs(url, prefs);
|
||||||
}
|
}
|
||||||
@@ -154,8 +161,9 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
|
|||||||
window->AppendExtraCommandLineSwitches(command_line, child_process_id);
|
window->AppendExtraCommandLineSwitches(command_line, child_process_id);
|
||||||
} else {
|
} else {
|
||||||
// Append commnad line arguments for guest web view.
|
// Append commnad line arguments for guest web view.
|
||||||
WebViewRendererState::WebViewInfo info;
|
auto child_process = content::RenderProcessHost::FromID(child_process_id);
|
||||||
if (WebViewRendererState::GetInstance()->GetInfo(child_process_id, &info)) {
|
WebViewManager::WebViewInfo info;
|
||||||
|
if (WebViewManager::GetInfoForProcess(child_process, &info)) {
|
||||||
command_line->AppendSwitchASCII(
|
command_line->AppendSwitchASCII(
|
||||||
switches::kGuestInstanceID,
|
switches::kGuestInstanceID,
|
||||||
base::IntToString(info.guest_instance_id));
|
base::IntToString(info.guest_instance_id));
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
|
class AtomResourceDispatcherHostDelegate;
|
||||||
|
|
||||||
class AtomBrowserClient : public brightray::BrowserClient {
|
class AtomBrowserClient : public brightray::BrowserClient {
|
||||||
public:
|
public:
|
||||||
AtomBrowserClient();
|
AtomBrowserClient();
|
||||||
@@ -20,8 +22,9 @@ class AtomBrowserClient : public brightray::BrowserClient {
|
|||||||
// content::ContentBrowserClient:
|
// content::ContentBrowserClient:
|
||||||
void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
|
void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
|
||||||
content::SpeechRecognitionManagerDelegate*
|
content::SpeechRecognitionManagerDelegate*
|
||||||
GetSpeechRecognitionManagerDelegate() override;
|
CreateSpeechRecognitionManagerDelegate() override;
|
||||||
content::AccessTokenStore* CreateAccessTokenStore() override;
|
content::AccessTokenStore* CreateAccessTokenStore() override;
|
||||||
|
void ResourceDispatcherHostCreated() override;
|
||||||
void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
|
void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
|
||||||
const GURL& url,
|
const GURL& url,
|
||||||
content::WebPreferences* prefs) override;
|
content::WebPreferences* prefs) override;
|
||||||
@@ -37,6 +40,8 @@ class AtomBrowserClient : public brightray::BrowserClient {
|
|||||||
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
|
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
|
||||||
const content::MainFunctionParams&) override;
|
const content::MainFunctionParams&) override;
|
||||||
|
|
||||||
|
scoped_ptr<AtomResourceDispatcherHostDelegate> resource_dispatcher_delegate_;
|
||||||
|
|
||||||
// The render process which would be swapped out soon.
|
// The render process which would be swapped out soon.
|
||||||
content::RenderProcessHost* dying_render_process_;
|
content::RenderProcessHost* dying_render_process_;
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
#include "atom/browser/atom_browser_main_parts.h"
|
#include "atom/browser/atom_browser_main_parts.h"
|
||||||
#include "atom/browser/net/atom_url_request_job_factory.h"
|
#include "atom/browser/net/atom_url_request_job_factory.h"
|
||||||
#include "atom/browser/net/asar/asar_protocol_handler.h"
|
#include "atom/browser/net/asar/asar_protocol_handler.h"
|
||||||
#include "atom/browser/web_view/web_view_manager.h"
|
#include "atom/browser/web_view_manager.h"
|
||||||
#include "atom/common/options_switches.h"
|
#include "atom/common/options_switches.h"
|
||||||
#include "base/command_line.h"
|
#include "base/command_line.h"
|
||||||
#include "base/threading/sequenced_worker_pool.h"
|
#include "base/threading/sequenced_worker_pool.h"
|
||||||
@@ -16,7 +16,6 @@
|
|||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "content/public/common/url_constants.h"
|
#include "content/public/common/url_constants.h"
|
||||||
#include "net/url_request/data_protocol_handler.h"
|
#include "net/url_request/data_protocol_handler.h"
|
||||||
#include "net/url_request/file_protocol_handler.h"
|
|
||||||
#include "net/url_request/url_request_intercepting_job_factory.h"
|
#include "net/url_request/url_request_intercepting_job_factory.h"
|
||||||
#include "url/url_constants.h"
|
#include "url/url_constants.h"
|
||||||
|
|
||||||
@@ -26,8 +25,6 @@ namespace atom {
|
|||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const char* kAsarScheme = "asar";
|
|
||||||
|
|
||||||
class NoCacheBackend : public net::HttpCache::BackendFactory {
|
class NoCacheBackend : public net::HttpCache::BackendFactory {
|
||||||
int CreateBackend(net::NetLog* net_log,
|
int CreateBackend(net::NetLog* net_log,
|
||||||
scoped_ptr<disk_cache::Backend>* backend,
|
scoped_ptr<disk_cache::Backend>* backend,
|
||||||
@@ -59,17 +56,12 @@ net::URLRequestJobFactory* AtomBrowserContext::CreateURLRequestJobFactory(
|
|||||||
job_factory->SetProtocolHandler(
|
job_factory->SetProtocolHandler(
|
||||||
url::kDataScheme, new net::DataProtocolHandler);
|
url::kDataScheme, new net::DataProtocolHandler);
|
||||||
job_factory->SetProtocolHandler(
|
job_factory->SetProtocolHandler(
|
||||||
url::kFileScheme, new net::FileProtocolHandler(
|
url::kFileScheme, new asar::AsarProtocolHandler(
|
||||||
BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
|
|
||||||
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
|
|
||||||
job_factory->SetProtocolHandler(
|
|
||||||
kAsarScheme, new asar::AsarProtocolHandler(
|
|
||||||
BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
|
BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
|
||||||
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
|
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
|
||||||
|
|
||||||
// Set up interceptors in the reverse order.
|
// Set up interceptors in the reverse order.
|
||||||
scoped_ptr<net::URLRequestJobFactory> top_job_factory =
|
scoped_ptr<net::URLRequestJobFactory> top_job_factory = job_factory.Pass();
|
||||||
job_factory.PassAs<net::URLRequestJobFactory>();
|
|
||||||
content::URLRequestInterceptorScopedVector::reverse_iterator it;
|
content::URLRequestInterceptorScopedVector::reverse_iterator it;
|
||||||
for (it = interceptors->rbegin(); it != interceptors->rend(); ++it)
|
for (it = interceptors->rbegin(); it != interceptors->rend(); ++it)
|
||||||
top_job_factory.reset(new net::URLRequestInterceptingJobFactory(
|
top_job_factory.reset(new net::URLRequestInterceptingJobFactory(
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
|
|||||||
brightray::BrowserMainParts::PreMainMessageLoopRun();
|
brightray::BrowserMainParts::PreMainMessageLoopRun();
|
||||||
|
|
||||||
#if defined(USE_X11)
|
#if defined(USE_X11)
|
||||||
libgtk2ui::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess());
|
libgtk2ui::GtkInitFromCommandLine(*base::CommandLine::ForCurrentProcess());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !defined(OS_MACOSX)
|
#if !defined(OS_MACOSX)
|
||||||
|
|||||||
@@ -27,14 +27,14 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Implementations of brightray::BrowserMainParts.
|
// Implementations of brightray::BrowserMainParts.
|
||||||
virtual brightray::BrowserContext* CreateBrowserContext() OVERRIDE;
|
brightray::BrowserContext* CreateBrowserContext() override;
|
||||||
|
|
||||||
// Implementations of content::BrowserMainParts.
|
// Implementations of content::BrowserMainParts.
|
||||||
virtual void PostEarlyInitialization() OVERRIDE;
|
void PostEarlyInitialization() override;
|
||||||
virtual void PreMainMessageLoopRun() OVERRIDE;
|
void PreMainMessageLoopRun() override;
|
||||||
#if defined(OS_MACOSX)
|
#if defined(OS_MACOSX)
|
||||||
virtual void PreMainMessageLoopStart() OVERRIDE;
|
void PreMainMessageLoopStart() override;
|
||||||
virtual void PostDestroyThreads() OVERRIDE;
|
void PostDestroyThreads() override;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ namespace atom {
|
|||||||
class AtomJavaScriptDialogManager : public content::JavaScriptDialogManager {
|
class AtomJavaScriptDialogManager : public content::JavaScriptDialogManager {
|
||||||
public:
|
public:
|
||||||
// content::JavaScriptDialogManager implementations.
|
// content::JavaScriptDialogManager implementations.
|
||||||
virtual void RunJavaScriptDialog(
|
void RunJavaScriptDialog(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
const GURL& origin_url,
|
const GURL& origin_url,
|
||||||
const std::string& accept_lang,
|
const std::string& accept_lang,
|
||||||
@@ -22,16 +22,15 @@ class AtomJavaScriptDialogManager : public content::JavaScriptDialogManager {
|
|||||||
const base::string16& message_text,
|
const base::string16& message_text,
|
||||||
const base::string16& default_prompt_text,
|
const base::string16& default_prompt_text,
|
||||||
const DialogClosedCallback& callback,
|
const DialogClosedCallback& callback,
|
||||||
bool* did_suppress_message) OVERRIDE;
|
bool* did_suppress_message) override;
|
||||||
virtual void RunBeforeUnloadDialog(
|
void RunBeforeUnloadDialog(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
const base::string16& message_text,
|
const base::string16& message_text,
|
||||||
bool is_reload,
|
bool is_reload,
|
||||||
const DialogClosedCallback& callback) OVERRIDE;
|
const DialogClosedCallback& callback) override;
|
||||||
virtual void CancelActiveAndPendingDialogs(
|
void CancelActiveAndPendingDialogs(
|
||||||
content::WebContents* web_contents) OVERRIDE {}
|
content::WebContents* web_contents) override {}
|
||||||
virtual void WebContentsDestroyed(
|
void WebContentsDestroyed(content::WebContents* web_contents) override {}
|
||||||
content::WebContents* web_contents) OVERRIDE {}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|||||||
33
atom/browser/atom_resource_dispatcher_host_delegate.cc
Normal file
33
atom/browser/atom_resource_dispatcher_host_delegate.cc
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
// Copyright (c) 2014 GitHub, Inc. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/atom_resource_dispatcher_host_delegate.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "base/logging.h"
|
||||||
|
#include "content/public/browser/render_frame_host.h"
|
||||||
|
#include "content/public/browser/resource_request_info.h"
|
||||||
|
#include "net/http/http_response_headers.h"
|
||||||
|
#include "net/url_request/url_request.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
AtomResourceDispatcherHostDelegate::AtomResourceDispatcherHostDelegate() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void AtomResourceDispatcherHostDelegate::OnResponseStarted(
|
||||||
|
net::URLRequest* request,
|
||||||
|
content::ResourceContext* resource_context,
|
||||||
|
content::ResourceResponse* response,
|
||||||
|
IPC::Sender* sender) {
|
||||||
|
// Remove the "X-Frame-Options" from response headers for devtools.
|
||||||
|
if (request->url().SchemeIs("chrome-devtools")) {
|
||||||
|
net::HttpResponseHeaders* response_headers = request->response_headers();
|
||||||
|
if (response_headers && response_headers->HasHeader("x-frame-options"))
|
||||||
|
response_headers->RemoveHeader("x-frame-options");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
30
atom/browser/atom_resource_dispatcher_host_delegate.h
Normal file
30
atom/browser/atom_resource_dispatcher_host_delegate.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
// Copyright (c) 2014 GitHub, Inc. All rights reserved.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_ATOM_RESOURCE_DISPATCHER_HOST_DELEGATE_H_
|
||||||
|
#define ATOM_BROWSER_ATOM_RESOURCE_DISPATCHER_HOST_DELEGATE_H_
|
||||||
|
|
||||||
|
#include "base/compiler_specific.h"
|
||||||
|
#include "content/public/browser/resource_dispatcher_host_delegate.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
class AtomResourceDispatcherHostDelegate
|
||||||
|
: public content::ResourceDispatcherHostDelegate {
|
||||||
|
public:
|
||||||
|
AtomResourceDispatcherHostDelegate();
|
||||||
|
|
||||||
|
// content::ResourceDispatcherHostDelegate:
|
||||||
|
void OnResponseStarted(net::URLRequest* request,
|
||||||
|
content::ResourceContext* resource_context,
|
||||||
|
content::ResourceResponse* response,
|
||||||
|
IPC::Sender* sender) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(AtomResourceDispatcherHostDelegate);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_ATOM_RESOURCE_DISPATCHER_HOST_DELEGATE_H_
|
||||||
@@ -36,15 +36,21 @@ void RelaunchToInstallUpdate() {
|
|||||||
// static
|
// static
|
||||||
void AutoUpdater::SetFeedURL(const std::string& feed) {
|
void AutoUpdater::SetFeedURL(const std::string& feed) {
|
||||||
if (g_updater == nil) {
|
if (g_updater == nil) {
|
||||||
// Initialize the SQRLUpdater.
|
|
||||||
NSURL* url = [NSURL URLWithString:base::SysUTF8ToNSString(feed)];
|
|
||||||
NSURLRequest* urlRequest = [NSURLRequest requestWithURL:url];
|
|
||||||
g_updater = [[SQRLUpdater alloc] initWithUpdateRequest:urlRequest];
|
|
||||||
|
|
||||||
AutoUpdaterDelegate* delegate = GetDelegate();
|
AutoUpdaterDelegate* delegate = GetDelegate();
|
||||||
if (!delegate)
|
if (!delegate)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Initialize the SQRLUpdater.
|
||||||
|
NSURL* url = [NSURL URLWithString:base::SysUTF8ToNSString(feed)];
|
||||||
|
NSURLRequest* urlRequest = [NSURLRequest requestWithURL:url];
|
||||||
|
|
||||||
|
@try {
|
||||||
|
g_updater = [[SQRLUpdater alloc] initWithUpdateRequest:urlRequest];
|
||||||
|
} @catch (NSException* error) {
|
||||||
|
delegate->OnError(base::SysNSStringToUTF8(error.reason));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
[[g_updater rac_valuesForKeyPath:@"state" observer:g_updater]
|
[[g_updater rac_valuesForKeyPath:@"state" observer:g_updater]
|
||||||
subscribeNext:^(NSNumber *stateNumber) {
|
subscribeNext:^(NSNumber *stateNumber) {
|
||||||
int state = [stateNumber integerValue];
|
int state = [stateNumber integerValue];
|
||||||
@@ -88,7 +94,9 @@ void AutoUpdater::CheckForUpdates() {
|
|||||||
delegate->OnUpdateNotAvailable();
|
delegate->OnUpdateNotAvailable();
|
||||||
}
|
}
|
||||||
} error:^(NSError *error) {
|
} error:^(NSError *error) {
|
||||||
delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription));
|
delegate->OnError(base::SysNSStringToUTF8(
|
||||||
|
[NSString stringWithFormat:@"%@: %@",
|
||||||
|
error.localizedDescription, error.localizedFailureReason]));
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ Browser* Browser::Get() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Browser::Quit() {
|
void Browser::Quit() {
|
||||||
is_quiting_ = true;
|
is_quiting_ = HandleBeforeQuit();
|
||||||
|
if (!is_quiting_)
|
||||||
|
return;
|
||||||
|
|
||||||
atom::WindowList* window_list = atom::WindowList::GetInstance();
|
atom::WindowList* window_list = atom::WindowList::GetInstance();
|
||||||
if (window_list->size() == 0)
|
if (window_list->size() == 0)
|
||||||
@@ -114,6 +116,15 @@ void Browser::NotifyAndShutdown() {
|
|||||||
Shutdown();
|
Shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Browser::HandleBeforeQuit() {
|
||||||
|
bool prevent_default = false;
|
||||||
|
FOR_EACH_OBSERVER(BrowserObserver,
|
||||||
|
observers_,
|
||||||
|
OnBeforeQuit(&prevent_default));
|
||||||
|
|
||||||
|
return !prevent_default;
|
||||||
|
}
|
||||||
|
|
||||||
void Browser::OnWindowCloseCancelled(NativeWindow* window) {
|
void Browser::OnWindowCloseCancelled(NativeWindow* window) {
|
||||||
if (is_quiting_)
|
if (is_quiting_)
|
||||||
// Once a beforeunload handler has prevented the closing, we think the quit
|
// Once a beforeunload handler has prevented the closing, we think the quit
|
||||||
|
|||||||
@@ -136,6 +136,9 @@ class Browser : public WindowListObserver {
|
|||||||
// Send the will-quit message and then shutdown the application.
|
// Send the will-quit message and then shutdown the application.
|
||||||
void NotifyAndShutdown();
|
void NotifyAndShutdown();
|
||||||
|
|
||||||
|
// Send the before-quit message and start closing windows.
|
||||||
|
bool HandleBeforeQuit();
|
||||||
|
|
||||||
bool is_quiting_;
|
bool is_quiting_;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ namespace atom {
|
|||||||
|
|
||||||
class BrowserObserver {
|
class BrowserObserver {
|
||||||
public:
|
public:
|
||||||
|
// The browser is about to close all windows.
|
||||||
|
virtual void OnBeforeQuit(bool* prevent_default) {}
|
||||||
|
|
||||||
// The browser has closed all windows and will quit.
|
// The browser has closed all windows and will quit.
|
||||||
virtual void OnWillQuit(bool* prevent_default) {}
|
virtual void OnWillQuit(bool* prevent_default) {}
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ if (option.file && !option.webdriver) {
|
|||||||
dialog.showErrorBox('Error opening app', 'The app provided is not a valid atom-shell app, please read the docs on how to write one:\nhttps://github.com/atom/atom-shell/tree/master/docs');
|
dialog.showErrorBox('Error opening app', 'The app provided is not a valid atom-shell app, please read the docs on how to write one:\nhttps://github.com/atom/atom-shell/tree/master/docs');
|
||||||
process.exit(1);
|
process.exit(1);
|
||||||
} else {
|
} else {
|
||||||
console.error('App throwed an error when running', e);
|
console.error('App threw an error when running', e);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ app.once 'ready', ->
|
|||||||
return new protocol.RequestFileJob(path.join(directory, parsed.path))
|
return new protocol.RequestFileJob(path.join(directory, parsed.path))
|
||||||
|
|
||||||
BrowserWindow::_loadDevToolsExtensions = (extensionInfoArray) ->
|
BrowserWindow::_loadDevToolsExtensions = (extensionInfoArray) ->
|
||||||
@devToolsWebContents?.executeJavaScript "WebInspector.addExtensions(#{JSON.stringify(extensionInfoArray)});"
|
@devToolsWebContents?.executeJavaScript "DevToolsAPI.addExtensions(#{JSON.stringify(extensionInfoArray)});"
|
||||||
|
|
||||||
BrowserWindow.addDevToolsExtension = (srcDirectory) ->
|
BrowserWindow.addDevToolsExtension = (srcDirectory) ->
|
||||||
extensionInfo = getExtensionInfoFromPath srcDirectory
|
extensionInfo = getExtensionInfoFromPath srcDirectory
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ createGuest = (embedder, params) ->
|
|||||||
# Destroy guest when the embedder is gone or navigated.
|
# Destroy guest when the embedder is gone or navigated.
|
||||||
destroyEvents = ['destroyed', 'crashed', 'did-navigate-to-different-page']
|
destroyEvents = ['destroyed', 'crashed', 'did-navigate-to-different-page']
|
||||||
destroy = ->
|
destroy = ->
|
||||||
destroyGuest id if guestInstances[id]?
|
destroyGuest embedder, id if guestInstances[id]?
|
||||||
embedder.once event, destroy for event in destroyEvents
|
embedder.once event, destroy for event in destroyEvents
|
||||||
guest.once 'destroyed', ->
|
guest.once 'destroyed', ->
|
||||||
embedder.removeListener event, destroy for event in destroyEvents
|
embedder.removeListener event, destroy for event in destroyEvents
|
||||||
@@ -90,7 +90,7 @@ attachGuest = (embedder, elementInstanceId, guestInstanceId, params) ->
|
|||||||
return unless oldGuestInstanceId != guestInstanceId
|
return unless oldGuestInstanceId != guestInstanceId
|
||||||
|
|
||||||
return unless guestInstances[oldGuestInstanceId]?
|
return unless guestInstances[oldGuestInstanceId]?
|
||||||
destroyGuest oldGuestInstanceId
|
destroyGuest embedder, oldGuestInstanceId
|
||||||
|
|
||||||
webViewManager.addGuest guestInstanceId, elementInstanceId, embedder, guest,
|
webViewManager.addGuest guestInstanceId, elementInstanceId, embedder, guest,
|
||||||
nodeIntegration: params.nodeintegration
|
nodeIntegration: params.nodeintegration
|
||||||
@@ -103,8 +103,8 @@ attachGuest = (embedder, elementInstanceId, guestInstanceId, params) ->
|
|||||||
reverseEmbedderElementsMap[guestInstanceId] = key
|
reverseEmbedderElementsMap[guestInstanceId] = key
|
||||||
|
|
||||||
# Destroy an existing guest instance.
|
# Destroy an existing guest instance.
|
||||||
destroyGuest = (id) ->
|
destroyGuest = (embedder, id) ->
|
||||||
webViewManager.removeGuest id
|
webViewManager.removeGuest embedder, id
|
||||||
guestInstances[id].guest.destroy()
|
guestInstances[id].guest.destroy()
|
||||||
delete guestInstances[id]
|
delete guestInstances[id]
|
||||||
|
|
||||||
@@ -120,7 +120,7 @@ ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_ATTACH_GUEST', (event, elementInstanceId,
|
|||||||
attachGuest event.sender, elementInstanceId, guestInstanceId, params
|
attachGuest event.sender, elementInstanceId, guestInstanceId, params
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', (event, id) ->
|
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', (event, id) ->
|
||||||
destroyGuest id
|
destroyGuest event.sender, id
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_AUTO_SIZE', (event, id, params) ->
|
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_AUTO_SIZE', (event, id, params) ->
|
||||||
guestInstances[id]?.guest.setAutoSize params.enableAutoSize, params.min, params.max
|
guestInstances[id]?.guest.setAutoSize params.enableAutoSize, params.min, params.max
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
ipc = require 'ipc'
|
ipc = require 'ipc'
|
||||||
|
v8Util = process.atomBinding 'v8_util'
|
||||||
BrowserWindow = require 'browser-window'
|
BrowserWindow = require 'browser-window'
|
||||||
|
|
||||||
frameToGuest = {}
|
frameToGuest = {}
|
||||||
@@ -13,13 +14,18 @@ createGuest = (embedder, url, frameName, options) ->
|
|||||||
guest = new BrowserWindow(options)
|
guest = new BrowserWindow(options)
|
||||||
guest.loadUrl url
|
guest.loadUrl url
|
||||||
|
|
||||||
|
# Remember the embedder, will be used by window.opener methods.
|
||||||
|
v8Util.setHiddenValue guest.webContents, 'embedder', embedder
|
||||||
|
|
||||||
# When |embedder| is destroyed we should also destroy attached guest, and if
|
# When |embedder| is destroyed we should also destroy attached guest, and if
|
||||||
# guest is closed by user then we should prevent |embedder| from double
|
# guest is closed by user then we should prevent |embedder| from double
|
||||||
# closing guest.
|
# closing guest.
|
||||||
closedByEmbedder = ->
|
closedByEmbedder = ->
|
||||||
|
embedder.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', guest.id
|
||||||
guest.removeListener 'closed', closedByUser
|
guest.removeListener 'closed', closedByUser
|
||||||
guest.destroy() unless guest.isClosed()
|
guest.destroy() unless guest.isClosed()
|
||||||
closedByUser = ->
|
closedByUser = ->
|
||||||
|
embedder.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', guest.id
|
||||||
embedder.removeListener 'render-view-deleted', closedByEmbedder
|
embedder.removeListener 'render-view-deleted', closedByEmbedder
|
||||||
embedder.once 'render-view-deleted', closedByEmbedder
|
embedder.once 'render-view-deleted', closedByEmbedder
|
||||||
guest.once 'closed', closedByUser
|
guest.once 'closed', closedByUser
|
||||||
@@ -49,6 +55,17 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, method,
|
|||||||
return unless BrowserWindow.windows.has guestId
|
return unless BrowserWindow.windows.has guestId
|
||||||
BrowserWindow.windows.get(guestId)[method] args...
|
BrowserWindow.windows.get(guestId)[method] args...
|
||||||
|
|
||||||
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (event, guestId, message, targetOrigin) ->
|
||||||
|
return unless BrowserWindow.windows.has guestId
|
||||||
|
guestContents = BrowserWindow.windows.get(guestId).webContents
|
||||||
|
if guestContents.getUrl().indexOf(targetOrigin) is 0 or targetOrigin is '*'
|
||||||
|
guestContents.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', message, targetOrigin
|
||||||
|
|
||||||
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, message, targetOrigin) ->
|
||||||
|
embedder = v8Util.getHiddenValue event.sender, 'embedder'
|
||||||
|
if embedder?.getUrl().indexOf(targetOrigin) is 0 or targetOrigin is '*'
|
||||||
|
embedder.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', message, targetOrigin
|
||||||
|
|
||||||
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
|
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
|
||||||
return unless BrowserWindow.windows.has guestId
|
return unless BrowserWindow.windows.has guestId
|
||||||
BrowserWindow.windows.get(guestId).webContents?[method] args...
|
BrowserWindow.windows.get(guestId).webContents?[method] args...
|
||||||
|
|||||||
@@ -3,25 +3,14 @@ path = require 'path'
|
|||||||
module = require 'module'
|
module = require 'module'
|
||||||
util = require 'util'
|
util = require 'util'
|
||||||
|
|
||||||
# Expose information of current process.
|
|
||||||
process.type = 'browser'
|
|
||||||
process.resourcesPath = path.resolve process.argv[1], '..', '..', '..', '..'
|
|
||||||
|
|
||||||
# We modified the original process.argv to let node.js load the atom.js,
|
# We modified the original process.argv to let node.js load the atom.js,
|
||||||
# we need to restore it here.
|
# we need to restore it here.
|
||||||
process.argv.splice 1, 1
|
process.argv.splice 1, 1
|
||||||
|
|
||||||
# Pick out switches appended by atom-shell.
|
|
||||||
startMark = process.argv.indexOf '--atom-shell-switches-start'
|
|
||||||
endMark = process.argv.indexOf '--atom-shell-switches-end'
|
|
||||||
# And --force-device-scale-factor on Linux.
|
|
||||||
endMark++ if process.platform is 'linux'
|
|
||||||
process.argv.splice startMark, endMark - startMark + 1
|
|
||||||
|
|
||||||
# Add browser/api/lib to require's search paths,
|
# Add browser/api/lib to require's search paths,
|
||||||
# which contains javascript part of Atom's built-in libraries.
|
# which contains javascript part of Atom's built-in libraries.
|
||||||
globalPaths = module.globalPaths
|
globalPaths = module.globalPaths
|
||||||
globalPaths.push path.join process.resourcesPath, 'atom', 'browser', 'api', 'lib'
|
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
|
||||||
|
|
||||||
# Import common settings.
|
# Import common settings.
|
||||||
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
|
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "atom/common/options_switches.h"
|
#include "atom/common/options_switches.h"
|
||||||
#include "base/command_line.h"
|
#include "base/command_line.h"
|
||||||
#include "base/file_util.h"
|
#include "base/files/file_util.h"
|
||||||
#include "base/json/json_writer.h"
|
#include "base/json/json_writer.h"
|
||||||
#include "base/prefs/pref_service.h"
|
#include "base/prefs/pref_service.h"
|
||||||
#include "base/message_loop/message_loop.h"
|
#include "base/message_loop/message_loop.h"
|
||||||
@@ -52,10 +52,14 @@
|
|||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "ui/gfx/codec/png_codec.h"
|
#include "ui/gfx/codec/png_codec.h"
|
||||||
#include "ui/gfx/geometry/size_conversions.h"
|
#include "ui/gfx/geometry/size_conversions.h"
|
||||||
#include "ui/gfx/point.h"
|
#include "ui/gfx/geometry/point.h"
|
||||||
#include "ui/gfx/rect.h"
|
#include "ui/gfx/geometry/rect.h"
|
||||||
#include "ui/gfx/screen.h"
|
#include "ui/gfx/screen.h"
|
||||||
#include "ui/gfx/size.h"
|
#include "ui/gfx/geometry/size.h"
|
||||||
|
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
#include "ui/gfx/switches.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
using content::NavigationEntry;
|
using content::NavigationEntry;
|
||||||
using content::RenderWidgetHostView;
|
using content::RenderWidgetHostView;
|
||||||
@@ -200,8 +204,8 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
|
|||||||
options.Get(switches::kMinWidth, &min_width)) {
|
options.Get(switches::kMinWidth, &min_width)) {
|
||||||
SetMinimumSize(gfx::Size(min_width, min_height));
|
SetMinimumSize(gfx::Size(min_width, min_height));
|
||||||
}
|
}
|
||||||
int max_height = -1, max_width = -1;
|
int max_height = INT_MAX, max_width = INT_MAX;
|
||||||
if (options.Get(switches::kMaxHeight, &max_height) &&
|
if (options.Get(switches::kMaxHeight, &max_height) |
|
||||||
options.Get(switches::kMaxWidth, &max_width)) {
|
options.Get(switches::kMaxWidth, &max_width)) {
|
||||||
SetMaximumSize(gfx::Size(max_width, max_height));
|
SetMaximumSize(gfx::Size(max_width, max_height));
|
||||||
}
|
}
|
||||||
@@ -280,7 +284,8 @@ bool NativeWindow::HasModalDialog() {
|
|||||||
return has_dialog_attached_;
|
return has_dialog_attached_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::OpenDevTools() {
|
void NativeWindow::OpenDevTools(bool can_dock) {
|
||||||
|
inspectable_web_contents()->SetCanDock(can_dock);
|
||||||
inspectable_web_contents()->ShowDevTools();
|
inspectable_web_contents()->ShowDevTools();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,7 +298,7 @@ bool NativeWindow::IsDevToolsOpened() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::InspectElement(int x, int y) {
|
void NativeWindow::InspectElement(int x, int y) {
|
||||||
OpenDevTools();
|
OpenDevTools(true);
|
||||||
scoped_refptr<content::DevToolsAgentHost> agent(
|
scoped_refptr<content::DevToolsAgentHost> agent(
|
||||||
content::DevToolsAgentHost::GetOrCreateFor(GetWebContents()));
|
content::DevToolsAgentHost::GetOrCreateFor(GetWebContents()));
|
||||||
agent->InspectElement(x, y);
|
agent->InspectElement(x, y);
|
||||||
@@ -319,7 +324,7 @@ void NativeWindow::CapturePage(const gfx::Rect& rect,
|
|||||||
RenderWidgetHostView* const view = contents->GetRenderWidgetHostView();
|
RenderWidgetHostView* const view = contents->GetRenderWidgetHostView();
|
||||||
RenderWidgetHost* const host = view ? view->GetRenderWidgetHost() : nullptr;
|
RenderWidgetHost* const host = view ? view->GetRenderWidgetHost() : nullptr;
|
||||||
if (!view || !host) {
|
if (!view || !host) {
|
||||||
callback.Run(std::vector<unsigned char>());
|
callback.Run(SkBitmap());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -455,8 +460,12 @@ void NativeWindow::OverrideWebkitPrefs(const GURL& url,
|
|||||||
if (web_preferences_.Get("webaudio", &b))
|
if (web_preferences_.Get("webaudio", &b))
|
||||||
prefs->webaudio_enabled = b;
|
prefs->webaudio_enabled = b;
|
||||||
if (web_preferences_.Get("extra-plugin-dirs", &list)) {
|
if (web_preferences_.Get("extra-plugin-dirs", &list)) {
|
||||||
for (size_t i = 0; i < list.size(); ++i)
|
if (content::PluginService::GetInstance()->NPAPIPluginsSupported()) {
|
||||||
content::PluginService::GetInstance()->AddExtraPluginDir(list[i]);
|
for (size_t i = 0; i < list.size(); ++i)
|
||||||
|
content::PluginService::GetInstance()->AddExtraPluginDir(list[i]);
|
||||||
|
} else {
|
||||||
|
LOG(WARNING) << "NPAPI plugins not supported on this platform";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,6 +520,7 @@ void NativeWindow::NotifyWindowLeaveFullScreen() {
|
|||||||
bool NativeWindow::ShouldCreateWebContents(
|
bool NativeWindow::ShouldCreateWebContents(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
int route_id,
|
int route_id,
|
||||||
|
int main_frame_route_id,
|
||||||
WindowContainerType window_container_type,
|
WindowContainerType window_container_type,
|
||||||
const base::string16& frame_name,
|
const base::string16& frame_name,
|
||||||
const GURL& target_url,
|
const GURL& target_url,
|
||||||
@@ -564,7 +574,8 @@ content::WebContents* NativeWindow::OpenURLFromTab(
|
|||||||
return source;
|
return source;
|
||||||
}
|
}
|
||||||
|
|
||||||
content::JavaScriptDialogManager* NativeWindow::GetJavaScriptDialogManager() {
|
content::JavaScriptDialogManager* NativeWindow::GetJavaScriptDialogManager(
|
||||||
|
content::WebContents* source) {
|
||||||
if (!dialog_manager_)
|
if (!dialog_manager_)
|
||||||
dialog_manager_.reset(new AtomJavaScriptDialogManager);
|
dialog_manager_.reset(new AtomJavaScriptDialogManager);
|
||||||
|
|
||||||
@@ -726,7 +737,7 @@ void NativeWindow::DevToolsSaveToFile(const std::string& url,
|
|||||||
base::FilePath default_path(base::FilePath::FromUTF8Unsafe(url));
|
base::FilePath default_path(base::FilePath::FromUTF8Unsafe(url));
|
||||||
if (!file_dialog::ShowSaveDialog(this, url, default_path, filters, &path)) {
|
if (!file_dialog::ShowSaveDialog(this, url, default_path, filters, &path)) {
|
||||||
base::StringValue url_value(url);
|
base::StringValue url_value(url);
|
||||||
CallDevToolsFunction("InspectorFrontendAPI.canceledSaveURL", &url_value);
|
CallDevToolsFunction("DevToolsAPI.canceledSaveURL", &url_value);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -736,7 +747,7 @@ void NativeWindow::DevToolsSaveToFile(const std::string& url,
|
|||||||
|
|
||||||
// Notify devtools.
|
// Notify devtools.
|
||||||
base::StringValue url_value(url);
|
base::StringValue url_value(url);
|
||||||
CallDevToolsFunction("InspectorFrontendAPI.savedURL", &url_value);
|
CallDevToolsFunction("DevToolsAPI.savedURL", &url_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::DevToolsAppendToFile(const std::string& url,
|
void NativeWindow::DevToolsAppendToFile(const std::string& url,
|
||||||
@@ -748,7 +759,7 @@ void NativeWindow::DevToolsAppendToFile(const std::string& url,
|
|||||||
|
|
||||||
// Notify devtools.
|
// Notify devtools.
|
||||||
base::StringValue url_value(url);
|
base::StringValue url_value(url);
|
||||||
CallDevToolsFunction("InspectorFrontendAPI.appendedToURL", &url_value);
|
CallDevToolsFunction("DevToolsAPI.appendedToURL", &url_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
|
void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
|
||||||
@@ -774,13 +785,9 @@ void NativeWindow::NotifyWindowUnresponsive() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback,
|
void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback,
|
||||||
bool succeed,
|
const SkBitmap& bitmap,
|
||||||
const SkBitmap& bitmap) {
|
content::ReadbackResponse response) {
|
||||||
SkAutoLockPixels screen_capture_lock(bitmap);
|
callback.Run(bitmap);
|
||||||
std::vector<unsigned char> data;
|
|
||||||
if (succeed)
|
|
||||||
gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &data);
|
|
||||||
callback.Run(data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindow::CallDevToolsFunction(const std::string& function_name,
|
void NativeWindow::CallDevToolsFunction(const std::string& function_name,
|
||||||
|
|||||||
@@ -20,8 +20,9 @@
|
|||||||
#include "brightray/browser/inspectable_web_contents_impl.h"
|
#include "brightray/browser/inspectable_web_contents_impl.h"
|
||||||
#include "content/public/browser/notification_registrar.h"
|
#include "content/public/browser/notification_registrar.h"
|
||||||
#include "content/public/browser/notification_observer.h"
|
#include "content/public/browser/notification_observer.h"
|
||||||
|
#include "content/public/browser/readback_types.h"
|
||||||
#include "native_mate/persistent_dictionary.h"
|
#include "native_mate/persistent_dictionary.h"
|
||||||
#include "ui/gfx/image/image_skia.h"
|
#include "ui/gfx/image/image.h"
|
||||||
|
|
||||||
namespace base {
|
namespace base {
|
||||||
class CommandLine;
|
class CommandLine;
|
||||||
@@ -58,8 +59,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
|
|||||||
public content::WebContentsObserver,
|
public content::WebContentsObserver,
|
||||||
public content::NotificationObserver {
|
public content::NotificationObserver {
|
||||||
public:
|
public:
|
||||||
typedef base::Callback<void(const std::vector<unsigned char>& buffer)>
|
typedef base::Callback<void(const SkBitmap& bitmap)> CapturePageCallback;
|
||||||
CapturePageCallback;
|
|
||||||
|
|
||||||
class DialogScope {
|
class DialogScope {
|
||||||
public:
|
public:
|
||||||
@@ -142,9 +142,13 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
|
|||||||
virtual bool HasModalDialog();
|
virtual bool HasModalDialog();
|
||||||
virtual gfx::NativeWindow GetNativeWindow() = 0;
|
virtual gfx::NativeWindow GetNativeWindow() = 0;
|
||||||
virtual void SetProgressBar(double progress) = 0;
|
virtual void SetProgressBar(double progress) = 0;
|
||||||
|
virtual void SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description) = 0;
|
||||||
|
virtual void SetVisibleOnAllWorkspaces(bool visible) = 0;
|
||||||
|
virtual bool IsVisibleOnAllWorkspaces() = 0;
|
||||||
|
|
||||||
virtual bool IsClosed() const { return is_closed_; }
|
virtual bool IsClosed() const { return is_closed_; }
|
||||||
virtual void OpenDevTools();
|
virtual void OpenDevTools(bool can_dock);
|
||||||
virtual void CloseDevTools();
|
virtual void CloseDevTools();
|
||||||
virtual bool IsDevToolsOpened();
|
virtual bool IsDevToolsOpened();
|
||||||
virtual void InspectElement(int x, int y);
|
virtual void InspectElement(int x, int y);
|
||||||
@@ -233,6 +237,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
|
|||||||
bool ShouldCreateWebContents(
|
bool ShouldCreateWebContents(
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
int route_id,
|
int route_id,
|
||||||
|
int main_frame_route_id,
|
||||||
WindowContainerType window_container_type,
|
WindowContainerType window_container_type,
|
||||||
const base::string16& frame_name,
|
const base::string16& frame_name,
|
||||||
const GURL& target_url,
|
const GURL& target_url,
|
||||||
@@ -241,7 +246,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
|
|||||||
content::WebContents* OpenURLFromTab(
|
content::WebContents* OpenURLFromTab(
|
||||||
content::WebContents* source,
|
content::WebContents* source,
|
||||||
const content::OpenURLParams& params) override;
|
const content::OpenURLParams& params) override;
|
||||||
content::JavaScriptDialogManager* GetJavaScriptDialogManager() override;
|
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
|
||||||
|
content::WebContents* source) override;
|
||||||
void BeforeUnloadFired(content::WebContents* tab,
|
void BeforeUnloadFired(content::WebContents* tab,
|
||||||
bool proceed,
|
bool proceed,
|
||||||
bool* proceed_to_fire_unload) override;
|
bool* proceed_to_fire_unload) override;
|
||||||
@@ -312,8 +318,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
|
|||||||
|
|
||||||
// Called when CapturePage has done.
|
// Called when CapturePage has done.
|
||||||
void OnCapturePageDone(const CapturePageCallback& callback,
|
void OnCapturePageDone(const CapturePageCallback& callback,
|
||||||
bool succeed,
|
const SkBitmap& bitmap,
|
||||||
const SkBitmap& bitmap);
|
content::ReadbackResponse response);
|
||||||
|
|
||||||
// Notification manager.
|
// Notification manager.
|
||||||
content::NotificationRegistrar registrar_;
|
content::NotificationRegistrar registrar_;
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
#include "base/memory/scoped_ptr.h"
|
#include "base/memory/scoped_ptr.h"
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
|
|
||||||
|
@class AtomNSWindow;
|
||||||
|
@class AtomNSWindowDelegate;
|
||||||
@class FullSizeContentView;
|
@class FullSizeContentView;
|
||||||
class SkRegion;
|
class SkRegion;
|
||||||
|
|
||||||
@@ -71,8 +73,13 @@ class NativeWindowMac : public NativeWindow {
|
|||||||
bool HasModalDialog() override;
|
bool HasModalDialog() override;
|
||||||
gfx::NativeWindow GetNativeWindow() override;
|
gfx::NativeWindow GetNativeWindow() override;
|
||||||
void SetProgressBar(double progress) override;
|
void SetProgressBar(double progress) override;
|
||||||
|
void SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description) override;
|
||||||
void ShowDefinitionForSelection() override;
|
void ShowDefinitionForSelection() override;
|
||||||
|
|
||||||
|
void SetVisibleOnAllWorkspaces(bool visible) override;
|
||||||
|
bool IsVisibleOnAllWorkspaces() override;
|
||||||
|
|
||||||
// Returns true if |point| in local Cocoa coordinate system falls within
|
// Returns true if |point| in local Cocoa coordinate system falls within
|
||||||
// the draggable region.
|
// the draggable region.
|
||||||
bool IsWithinDraggableRegion(NSPoint point) const;
|
bool IsWithinDraggableRegion(NSPoint point) const;
|
||||||
@@ -100,7 +107,8 @@ class NativeWindowMac : public NativeWindow {
|
|||||||
// whehter we can drag.
|
// whehter we can drag.
|
||||||
void InstallDraggableRegionView();
|
void InstallDraggableRegionView();
|
||||||
|
|
||||||
base::scoped_nsobject<NSWindow> window_;
|
base::scoped_nsobject<AtomNSWindow> window_;
|
||||||
|
base::scoped_nsobject<AtomNSWindowDelegate> window_delegate_;
|
||||||
|
|
||||||
// The view that will fill the whole frameless window.
|
// The view that will fill the whole frameless window.
|
||||||
base::scoped_nsobject<FullSizeContentView> content_view_;
|
base::scoped_nsobject<FullSizeContentView> content_view_;
|
||||||
|
|||||||
@@ -140,7 +140,6 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
|
|||||||
|
|
||||||
- (void)windowWillClose:(NSNotification*)notification {
|
- (void)windowWillClose:(NSNotification*)notification {
|
||||||
shell_->NotifyWindowClosed();
|
shell_->NotifyWindowClosed();
|
||||||
[self autorelease];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)windowShouldClose:(id)window {
|
- (BOOL)windowShouldClose:(id)window {
|
||||||
@@ -191,7 +190,7 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
|
|||||||
}
|
}
|
||||||
|
|
||||||
- (IBAction)showDevTools:(id)sender {
|
- (IBAction)showDevTools:(id)sender {
|
||||||
shell_->OpenDevTools();
|
shell_->OpenDevTools(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns an empty array for AXChildren attribute, this will force the
|
// Returns an empty array for AXChildren attribute, this will force the
|
||||||
@@ -243,6 +242,10 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
|
|||||||
shellWindow_->HandleMouseEvent(event);
|
shellWindow_->HandleMouseEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (BOOL)acceptsFirstMouse:(NSEvent*)event {
|
||||||
|
return YES;
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@interface AtomProgressBar : NSProgressIndicator
|
@interface AtomProgressBar : NSProgressIndicator
|
||||||
@@ -319,21 +322,18 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
|
|||||||
width,
|
width,
|
||||||
height);
|
height);
|
||||||
|
|
||||||
AtomNSWindow* atomWindow = [[AtomNSWindow alloc]
|
window_.reset([[AtomNSWindow alloc]
|
||||||
initWithContentRect:cocoa_bounds
|
initWithContentRect:cocoa_bounds
|
||||||
styleMask:NSTitledWindowMask | NSClosableWindowMask |
|
styleMask:NSTitledWindowMask | NSClosableWindowMask |
|
||||||
NSMiniaturizableWindowMask | NSResizableWindowMask |
|
NSMiniaturizableWindowMask | NSResizableWindowMask |
|
||||||
NSTexturedBackgroundWindowMask
|
NSTexturedBackgroundWindowMask
|
||||||
backing:NSBackingStoreBuffered
|
backing:NSBackingStoreBuffered
|
||||||
defer:YES];
|
defer:YES]);
|
||||||
|
[window_ setShell:this];
|
||||||
|
[window_ setEnableLargerThanScreen:enable_larger_than_screen_];
|
||||||
|
|
||||||
[atomWindow setShell:this];
|
window_delegate_.reset([[AtomNSWindowDelegate alloc] initWithShell:this]);
|
||||||
[atomWindow setEnableLargerThanScreen:enable_larger_than_screen_];
|
[window_ setDelegate:window_delegate_];
|
||||||
window_.reset(atomWindow);
|
|
||||||
|
|
||||||
AtomNSWindowDelegate* delegate =
|
|
||||||
[[AtomNSWindowDelegate alloc] initWithShell:this];
|
|
||||||
[window_ setDelegate:delegate];
|
|
||||||
|
|
||||||
if (transparent_) {
|
if (transparent_) {
|
||||||
// Make window has transparent background.
|
// Make window has transparent background.
|
||||||
@@ -354,7 +354,7 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
|
|||||||
// Enable the NSView to accept first mouse event.
|
// Enable the NSView to accept first mouse event.
|
||||||
bool acceptsFirstMouse = false;
|
bool acceptsFirstMouse = false;
|
||||||
options.Get(switches::kAcceptFirstMouse, &acceptsFirstMouse);
|
options.Get(switches::kAcceptFirstMouse, &acceptsFirstMouse);
|
||||||
[delegate setAcceptsFirstMouse:acceptsFirstMouse];
|
[window_delegate_ setAcceptsFirstMouse:acceptsFirstMouse];
|
||||||
|
|
||||||
// Disable fullscreen button when 'fullscreen' is specified to false.
|
// Disable fullscreen button when 'fullscreen' is specified to false.
|
||||||
bool fullscreen;
|
bool fullscreen;
|
||||||
@@ -678,6 +678,10 @@ void NativeWindowMac::SetProgressBar(double progress) {
|
|||||||
[dock_tile display];
|
[dock_tile display];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowMac::SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description) {
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowMac::ShowDefinitionForSelection() {
|
void NativeWindowMac::ShowDefinitionForSelection() {
|
||||||
content::WebContents* web_contents = GetWebContents();
|
content::WebContents* web_contents = GetWebContents();
|
||||||
if (!web_contents)
|
if (!web_contents)
|
||||||
@@ -688,6 +692,21 @@ void NativeWindowMac::ShowDefinitionForSelection() {
|
|||||||
rwhv->ShowDefinitionForSelection();
|
rwhv->ShowDefinitionForSelection();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowMac::SetVisibleOnAllWorkspaces(bool visible) {
|
||||||
|
NSUInteger collectionBehavior = [window_ collectionBehavior];
|
||||||
|
if (visible) {
|
||||||
|
collectionBehavior |= NSWindowCollectionBehaviorCanJoinAllSpaces;
|
||||||
|
} else {
|
||||||
|
collectionBehavior &= ~NSWindowCollectionBehaviorCanJoinAllSpaces;
|
||||||
|
}
|
||||||
|
[window_ setCollectionBehavior:collectionBehavior];
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NativeWindowMac::IsVisibleOnAllWorkspaces() {
|
||||||
|
NSUInteger collectionBehavior = [window_ collectionBehavior];
|
||||||
|
return collectionBehavior & NSWindowCollectionBehaviorCanJoinAllSpaces;
|
||||||
|
}
|
||||||
|
|
||||||
bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const {
|
bool NativeWindowMac::IsWithinDraggableRegion(NSPoint point) const {
|
||||||
if (!draggable_region_)
|
if (!draggable_region_)
|
||||||
return false;
|
return false;
|
||||||
@@ -735,7 +754,7 @@ void NativeWindowMac::HandleKeyboardEvent(
|
|||||||
event.type == content::NativeWebKeyboardEvent::Char)
|
event.type == content::NativeWebKeyboardEvent::Char)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (event.os_event.window == window_) {
|
if (event.os_event.window == window_.get()) {
|
||||||
EventProcessingWindow* event_window =
|
EventProcessingWindow* event_window =
|
||||||
static_cast<EventProcessingWindow*>(window_);
|
static_cast<EventProcessingWindow*>(window_);
|
||||||
DCHECK([event_window isKindOfClass:[EventProcessingWindow class]]);
|
DCHECK([event_window isKindOfClass:[EventProcessingWindow class]]);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@
|
|||||||
#include "ui/aura/window.h"
|
#include "ui/aura/window.h"
|
||||||
#include "ui/aura/window_tree_host.h"
|
#include "ui/aura/window_tree_host.h"
|
||||||
#include "ui/base/hit_test.h"
|
#include "ui/base/hit_test.h"
|
||||||
|
#include "ui/gfx/image/image.h"
|
||||||
#include "ui/views/background.h"
|
#include "ui/views/background.h"
|
||||||
#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
|
#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
|
||||||
#include "ui/views/controls/webview/webview.h"
|
#include "ui/views/controls/webview/webview.h"
|
||||||
@@ -51,6 +52,7 @@
|
|||||||
#include "base/win/scoped_comptr.h"
|
#include "base/win/scoped_comptr.h"
|
||||||
#include "base/win/windows_version.h"
|
#include "base/win/windows_version.h"
|
||||||
#include "ui/base/win/shell.h"
|
#include "ui/base/win/shell.h"
|
||||||
|
#include "ui/gfx/icon_util.h"
|
||||||
#include "ui/gfx/win/dpi.h"
|
#include "ui/gfx/win/dpi.h"
|
||||||
#include "ui/views/win/hwnd_util.h"
|
#include "ui/views/win/hwnd_util.h"
|
||||||
#endif
|
#endif
|
||||||
@@ -129,7 +131,7 @@ class NativeWindowClientView : public views::ClientView {
|
|||||||
}
|
}
|
||||||
virtual ~NativeWindowClientView() {}
|
virtual ~NativeWindowClientView() {}
|
||||||
|
|
||||||
virtual bool CanClose() OVERRIDE {
|
bool CanClose() override {
|
||||||
static_cast<NativeWindowViews*>(contents_view())->CloseWebContents();
|
static_cast<NativeWindowViews*>(contents_view())->CloseWebContents();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -223,6 +225,11 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
|
|||||||
ui::SetAtomArrayProperty(GetAcceleratedWidget(), "_NET_WM_STATE", "ATOM",
|
ui::SetAtomArrayProperty(GetAcceleratedWidget(), "_NET_WM_STATE", "ATOM",
|
||||||
state_atom_list);
|
state_atom_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set the _NET_WM_WINDOW_TYPE.
|
||||||
|
std::string window_type;
|
||||||
|
if (options.Get(switches::kType, &window_type))
|
||||||
|
SetWindowType(GetAcceleratedWidget(), window_type);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Add web view.
|
// Add web view.
|
||||||
@@ -300,7 +307,7 @@ bool NativeWindowViews::IsFocused() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowViews::Show() {
|
void NativeWindowViews::Show() {
|
||||||
window_->Show();
|
window_->native_widget_private()->ShowWithWindowState(GetRestoredState());
|
||||||
}
|
}
|
||||||
|
|
||||||
void NativeWindowViews::ShowInactive() {
|
void NativeWindowViews::ShowInactive() {
|
||||||
@@ -613,6 +620,28 @@ void NativeWindowViews::SetProgressBar(double progress) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowViews::SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description) {
|
||||||
|
#if defined(OS_WIN)
|
||||||
|
if (base::win::GetVersion() < base::win::VERSION_WIN7)
|
||||||
|
return;
|
||||||
|
|
||||||
|
base::win::ScopedComPtr<ITaskbarList3> taskbar;
|
||||||
|
if (FAILED(taskbar.CreateInstance(CLSID_TaskbarList, NULL,
|
||||||
|
CLSCTX_INPROC_SERVER) ||
|
||||||
|
FAILED(taskbar->HrInit()))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
HWND frame = views::HWNDForNativeWindow(GetNativeWindow());
|
||||||
|
|
||||||
|
std::wstring wstr = std::wstring(description.begin(), description.end());
|
||||||
|
taskbar->SetOverlayIcon(frame,
|
||||||
|
IconUtil::CreateHICONFromSkBitmap(overlay.AsBitmap()),
|
||||||
|
wstr.c_str());
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
void NativeWindowViews::SetAutoHideMenuBar(bool auto_hide) {
|
void NativeWindowViews::SetAutoHideMenuBar(bool auto_hide) {
|
||||||
menu_bar_autohide_ = auto_hide;
|
menu_bar_autohide_ = auto_hide;
|
||||||
}
|
}
|
||||||
@@ -645,6 +674,23 @@ bool NativeWindowViews::IsMenuBarVisible() {
|
|||||||
return menu_bar_visible_;
|
return menu_bar_visible_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NativeWindowViews::SetVisibleOnAllWorkspaces(bool visible) {
|
||||||
|
window_->SetVisibleOnAllWorkspaces(visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NativeWindowViews::IsVisibleOnAllWorkspaces() {
|
||||||
|
#if defined(USE_X11)
|
||||||
|
// Use the presence/absence of _NET_WM_STATE_STICKY in _NET_WM_STATE to
|
||||||
|
// determine whether the current window is visible on all workspaces.
|
||||||
|
XAtom sticky_atom = GetAtom("_NET_WM_STATE_STICKY");
|
||||||
|
std::vector<XAtom> wm_states;
|
||||||
|
ui::GetAtomArrayProperty(GetAcceleratedWidget(), "_NET_WM_STATE", &wm_states);
|
||||||
|
return std::find(wm_states.begin(),
|
||||||
|
wm_states.end(), sticky_atom) != wm_states.end();
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
gfx::AcceleratedWidget NativeWindowViews::GetAcceleratedWidget() {
|
gfx::AcceleratedWidget NativeWindowViews::GetAcceleratedWidget() {
|
||||||
return GetNativeWindow()->GetHost()->GetAcceleratedWidget();
|
return GetNativeWindow()->GetHost()->GetAcceleratedWidget();
|
||||||
}
|
}
|
||||||
@@ -898,6 +944,15 @@ gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds(
|
|||||||
return window_bounds;
|
return window_bounds;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui::WindowShowState NativeWindowViews::GetRestoredState() {
|
||||||
|
if (IsMaximized())
|
||||||
|
return ui::SHOW_STATE_MAXIMIZED;
|
||||||
|
if (IsFullscreen())
|
||||||
|
return ui::SHOW_STATE_FULLSCREEN;
|
||||||
|
|
||||||
|
return ui::SHOW_STATE_NORMAL;
|
||||||
|
}
|
||||||
|
|
||||||
// static
|
// static
|
||||||
NativeWindow* NativeWindow::Create(content::WebContents* web_contents,
|
NativeWindow* NativeWindow::Create(content::WebContents* web_contents,
|
||||||
const mate::Dictionary& options) {
|
const mate::Dictionary& options) {
|
||||||
|
|||||||
@@ -73,11 +73,15 @@ class NativeWindowViews : public NativeWindow,
|
|||||||
bool IsKiosk() override;
|
bool IsKiosk() override;
|
||||||
void SetMenu(ui::MenuModel* menu_model) override;
|
void SetMenu(ui::MenuModel* menu_model) override;
|
||||||
gfx::NativeWindow GetNativeWindow() override;
|
gfx::NativeWindow GetNativeWindow() override;
|
||||||
|
void SetOverlayIcon(const gfx::Image& overlay,
|
||||||
|
const std::string& description) override;
|
||||||
void SetProgressBar(double value) override;
|
void SetProgressBar(double value) override;
|
||||||
void SetAutoHideMenuBar(bool auto_hide) override;
|
void SetAutoHideMenuBar(bool auto_hide) override;
|
||||||
bool IsMenuBarAutoHide() override;
|
bool IsMenuBarAutoHide() override;
|
||||||
void SetMenuBarVisibility(bool visible) override;
|
void SetMenuBarVisibility(bool visible) override;
|
||||||
bool IsMenuBarVisible() override;
|
bool IsMenuBarVisible() override;
|
||||||
|
void SetVisibleOnAllWorkspaces(bool visible) override;
|
||||||
|
bool IsVisibleOnAllWorkspaces() override;
|
||||||
|
|
||||||
gfx::AcceleratedWidget GetAcceleratedWidget();
|
gfx::AcceleratedWidget GetAcceleratedWidget();
|
||||||
|
|
||||||
@@ -139,6 +143,9 @@ class NativeWindowViews : public NativeWindow,
|
|||||||
// in client area we need to substract/add menu bar's height in convertions.
|
// in client area we need to substract/add menu bar's height in convertions.
|
||||||
gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& content_bounds);
|
gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& content_bounds);
|
||||||
|
|
||||||
|
// Returns the restore state for the window.
|
||||||
|
ui::WindowShowState GetRestoredState();
|
||||||
|
|
||||||
scoped_ptr<views::Widget> window_;
|
scoped_ptr<views::Widget> window_;
|
||||||
views::View* web_view_; // Managed by inspectable_web_contents_.
|
views::View* web_view_; // Managed by inspectable_web_contents_.
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,9 @@
|
|||||||
|
|
||||||
#include "base/threading/sequenced_worker_pool.h"
|
#include "base/threading/sequenced_worker_pool.h"
|
||||||
#include "atom/browser/net/url_request_string_job.h"
|
#include "atom/browser/net/url_request_string_job.h"
|
||||||
|
#include "atom/browser/net/asar/url_request_asar_job.h"
|
||||||
|
#include "atom/common/asar/asar_util.h"
|
||||||
|
#include "atom/browser/net/url_request_buffer_job.h"
|
||||||
#include "content/public/browser/browser_thread.h"
|
#include "content/public/browser/browser_thread.h"
|
||||||
#include "net/base/net_errors.h"
|
#include "net/base/net_errors.h"
|
||||||
#include "net/url_request/url_request_error_job.h"
|
#include "net/url_request/url_request_error_job.h"
|
||||||
@@ -85,13 +88,22 @@ void AdapterRequestJob::CreateStringJobAndStart(const std::string& mime_type,
|
|||||||
real_job_->Start();
|
real_job_->Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AdapterRequestJob::CreateFileJobAndStart(const base::FilePath& path) {
|
void AdapterRequestJob::CreateBufferJobAndStart(const std::string& mime_type,
|
||||||
|
const std::string& charset,
|
||||||
|
v8::Local<v8::Object> buffer) {
|
||||||
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
||||||
|
|
||||||
real_job_ = new net::URLRequestFileJob(
|
real_job_ = new URLRequestBufferJob(
|
||||||
|
request(), network_delegate(), mime_type, charset, buffer);
|
||||||
|
real_job_->Start();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdapterRequestJob::CreateFileJobAndStart(const base::FilePath& path) {
|
||||||
|
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
|
||||||
|
real_job_ = asar::CreateJobFromPath(
|
||||||
|
path,
|
||||||
request(),
|
request(),
|
||||||
network_delegate(),
|
network_delegate(),
|
||||||
path,
|
|
||||||
content::BrowserThread::GetBlockingPool()->
|
content::BrowserThread::GetBlockingPool()->
|
||||||
GetTaskRunnerWithShutdownBehavior(
|
GetTaskRunnerWithShutdownBehavior(
|
||||||
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));
|
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "base/memory/weak_ptr.h"
|
#include "base/memory/weak_ptr.h"
|
||||||
#include "net/url_request/url_request_job.h"
|
#include "net/url_request/url_request_job.h"
|
||||||
#include "net/url_request/url_request_job_factory.h"
|
#include "net/url_request/url_request_job_factory.h"
|
||||||
|
#include "v8/include/v8.h"
|
||||||
|
|
||||||
namespace base {
|
namespace base {
|
||||||
class FilePath;
|
class FilePath;
|
||||||
@@ -28,16 +29,16 @@ class AdapterRequestJob : public net::URLRequestJob {
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
// net::URLRequestJob:
|
// net::URLRequestJob:
|
||||||
virtual void Start() OVERRIDE;
|
void Start() override;
|
||||||
virtual void Kill() OVERRIDE;
|
void Kill() override;
|
||||||
virtual bool ReadRawData(net::IOBuffer* buf,
|
bool ReadRawData(net::IOBuffer* buf,
|
||||||
int buf_size,
|
int buf_size,
|
||||||
int *bytes_read) OVERRIDE;
|
int *bytes_read) override;
|
||||||
virtual bool IsRedirectResponse(GURL* location,
|
bool IsRedirectResponse(GURL* location,
|
||||||
int* http_status_code) OVERRIDE;
|
int* http_status_code) override;
|
||||||
virtual net::Filter* SetupFilter() const OVERRIDE;
|
net::Filter* SetupFilter() const override;
|
||||||
virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
|
bool GetMimeType(std::string* mime_type) const override;
|
||||||
virtual bool GetCharset(std::string* charset) OVERRIDE;
|
bool GetCharset(std::string* charset) override;
|
||||||
|
|
||||||
base::WeakPtr<AdapterRequestJob> GetWeakPtr();
|
base::WeakPtr<AdapterRequestJob> GetWeakPtr();
|
||||||
|
|
||||||
@@ -50,6 +51,9 @@ class AdapterRequestJob : public net::URLRequestJob {
|
|||||||
void CreateStringJobAndStart(const std::string& mime_type,
|
void CreateStringJobAndStart(const std::string& mime_type,
|
||||||
const std::string& charset,
|
const std::string& charset,
|
||||||
const std::string& data);
|
const std::string& data);
|
||||||
|
void CreateBufferJobAndStart(const std::string& mime_type,
|
||||||
|
const std::string& charset,
|
||||||
|
v8::Local<v8::Object> buffer);
|
||||||
void CreateFileJobAndStart(const base::FilePath& path);
|
void CreateFileJobAndStart(const base::FilePath& path);
|
||||||
void CreateJobFromProtocolHandlerAndStart();
|
void CreateJobFromProtocolHandlerAndStart();
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#include "atom/browser/net/asar/url_request_asar_job.h"
|
#include "atom/browser/net/asar/url_request_asar_job.h"
|
||||||
#include "atom/common/asar/archive.h"
|
#include "atom/common/asar/archive.h"
|
||||||
|
#include "atom/common/asar/asar_util.h"
|
||||||
#include "net/base/filename_util.h"
|
#include "net/base/filename_util.h"
|
||||||
#include "net/base/net_errors.h"
|
#include "net/base/net_errors.h"
|
||||||
#include "net/url_request/url_request_error_job.h"
|
#include "net/url_request/url_request_error_job.h"
|
||||||
@@ -13,35 +14,36 @@
|
|||||||
|
|
||||||
namespace asar {
|
namespace asar {
|
||||||
|
|
||||||
namespace {
|
// static
|
||||||
|
net::URLRequestJob* CreateJobFromPath(
|
||||||
|
const base::FilePath& full_path,
|
||||||
|
net::URLRequest* request,
|
||||||
|
net::NetworkDelegate* network_delegate,
|
||||||
|
const scoped_refptr<base::TaskRunner> file_task_runner) {
|
||||||
|
// Create asar:// job when the path contains "xxx.asar/", otherwise treat the
|
||||||
|
// URL request as file://.
|
||||||
|
base::FilePath asar_path, relative_path;
|
||||||
|
if (!GetAsarArchivePath(full_path, &asar_path, &relative_path))
|
||||||
|
return new net::URLRequestFileJob(request, network_delegate, full_path,
|
||||||
|
file_task_runner);
|
||||||
|
|
||||||
const base::FilePath::CharType kAsarExtension[] = FILE_PATH_LITERAL(".asar");
|
std::shared_ptr<Archive> archive = GetOrCreateAsarArchive(asar_path);
|
||||||
|
Archive::FileInfo file_info;
|
||||||
|
if (!archive || !archive->GetFileInfo(relative_path, &file_info))
|
||||||
|
return new net::URLRequestErrorJob(request, network_delegate,
|
||||||
|
net::ERR_FILE_NOT_FOUND);
|
||||||
|
|
||||||
// Get the relative path in asar archive.
|
if (file_info.unpacked) {
|
||||||
bool GetAsarPath(const base::FilePath& full_path,
|
base::FilePath real_path;
|
||||||
base::FilePath* asar_path,
|
archive->CopyFileOut(relative_path, &real_path);
|
||||||
base::FilePath* relative_path) {
|
return new net::URLRequestFileJob(request, network_delegate, real_path,
|
||||||
base::FilePath iter = full_path;
|
file_task_runner);
|
||||||
while (true) {
|
|
||||||
base::FilePath dirname = iter.DirName();
|
|
||||||
if (iter.MatchesExtension(kAsarExtension))
|
|
||||||
break;
|
|
||||||
else if (iter == dirname)
|
|
||||||
return false;
|
|
||||||
iter = dirname;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
base::FilePath tail;
|
return new URLRequestAsarJob(request, network_delegate, archive,
|
||||||
if (!iter.AppendRelativePath(full_path, &tail))
|
relative_path, file_info, file_task_runner);
|
||||||
return false;
|
|
||||||
|
|
||||||
*asar_path = iter;
|
|
||||||
*relative_path = tail;
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
AsarProtocolHandler::AsarProtocolHandler(
|
AsarProtocolHandler::AsarProtocolHandler(
|
||||||
const scoped_refptr<base::TaskRunner>& file_task_runner)
|
const scoped_refptr<base::TaskRunner>& file_task_runner)
|
||||||
: file_task_runner_(file_task_runner) {}
|
: file_task_runner_(file_task_runner) {}
|
||||||
@@ -49,39 +51,13 @@ AsarProtocolHandler::AsarProtocolHandler(
|
|||||||
AsarProtocolHandler::~AsarProtocolHandler() {
|
AsarProtocolHandler::~AsarProtocolHandler() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Archive* AsarProtocolHandler::GetOrCreateAsarArchive(
|
|
||||||
const base::FilePath& path) const {
|
|
||||||
if (!archives_.contains(path)) {
|
|
||||||
scoped_ptr<Archive> archive(new Archive(path));
|
|
||||||
if (!archive->Init())
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
archives_.set(path, archive.Pass());
|
|
||||||
}
|
|
||||||
|
|
||||||
return archives_.get(path);
|
|
||||||
}
|
|
||||||
|
|
||||||
net::URLRequestJob* AsarProtocolHandler::MaybeCreateJob(
|
net::URLRequestJob* AsarProtocolHandler::MaybeCreateJob(
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate) const {
|
net::NetworkDelegate* network_delegate) const {
|
||||||
base::FilePath full_path;
|
base::FilePath full_path;
|
||||||
net::FileURLToFilePath(request->url(), &full_path);
|
net::FileURLToFilePath(request->url(), &full_path);
|
||||||
|
return CreateJobFromPath(full_path, request, network_delegate,
|
||||||
// Create asar:// job when the path contains "xxx.asar/", otherwise treat the
|
file_task_runner_);
|
||||||
// URL request as file://.
|
|
||||||
base::FilePath asar_path, relative_path;
|
|
||||||
if (!GetAsarPath(full_path, &asar_path, &relative_path))
|
|
||||||
return new net::URLRequestFileJob(request, network_delegate, full_path,
|
|
||||||
file_task_runner_);
|
|
||||||
|
|
||||||
Archive* archive = GetOrCreateAsarArchive(asar_path);
|
|
||||||
if (!archive)
|
|
||||||
return new net::URLRequestErrorJob(request, network_delegate,
|
|
||||||
net::ERR_FILE_NOT_FOUND);
|
|
||||||
|
|
||||||
return new URLRequestAsarJob(request, network_delegate, archive,
|
|
||||||
relative_path, file_task_runner_);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AsarProtocolHandler::IsSafeRedirectTarget(const GURL& location) const {
|
bool AsarProtocolHandler::IsSafeRedirectTarget(const GURL& location) const {
|
||||||
|
|||||||
@@ -5,8 +5,6 @@
|
|||||||
#ifndef ATOM_BROWSER_NET_ASAR_ASAR_PROTOCOL_HANDLER_H_
|
#ifndef ATOM_BROWSER_NET_ASAR_ASAR_PROTOCOL_HANDLER_H_
|
||||||
#define ATOM_BROWSER_NET_ASAR_ASAR_PROTOCOL_HANDLER_H_
|
#define ATOM_BROWSER_NET_ASAR_ASAR_PROTOCOL_HANDLER_H_
|
||||||
|
|
||||||
#include "base/containers/scoped_ptr_hash_map.h"
|
|
||||||
#include "base/files/file_path.h"
|
|
||||||
#include "base/memory/ref_counted.h"
|
#include "base/memory/ref_counted.h"
|
||||||
#include "net/url_request/url_request_job_factory.h"
|
#include "net/url_request/url_request_job_factory.h"
|
||||||
|
|
||||||
@@ -16,27 +14,21 @@ class TaskRunner;
|
|||||||
|
|
||||||
namespace asar {
|
namespace asar {
|
||||||
|
|
||||||
class Archive;
|
|
||||||
|
|
||||||
class AsarProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
|
class AsarProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
|
||||||
public:
|
public:
|
||||||
explicit AsarProtocolHandler(
|
explicit AsarProtocolHandler(
|
||||||
const scoped_refptr<base::TaskRunner>& file_task_runner);
|
const scoped_refptr<base::TaskRunner>& file_task_runner);
|
||||||
virtual ~AsarProtocolHandler();
|
virtual ~AsarProtocolHandler();
|
||||||
|
|
||||||
Archive* GetOrCreateAsarArchive(const base::FilePath& path) const;
|
|
||||||
|
|
||||||
// net::URLRequestJobFactory::ProtocolHandler:
|
// net::URLRequestJobFactory::ProtocolHandler:
|
||||||
virtual net::URLRequestJob* MaybeCreateJob(
|
net::URLRequestJob* MaybeCreateJob(
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate) const OVERRIDE;
|
net::NetworkDelegate* network_delegate) const override;
|
||||||
virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE;
|
bool IsSafeRedirectTarget(const GURL& location) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const scoped_refptr<base::TaskRunner> file_task_runner_;
|
const scoped_refptr<base::TaskRunner> file_task_runner_;
|
||||||
|
|
||||||
mutable base::ScopedPtrHashMap<base::FilePath, Archive> archives_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(AsarProtocolHandler);
|
DISALLOW_COPY_AND_ASSIGN(AsarProtocolHandler);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -17,12 +17,14 @@ namespace asar {
|
|||||||
URLRequestAsarJob::URLRequestAsarJob(
|
URLRequestAsarJob::URLRequestAsarJob(
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate,
|
net::NetworkDelegate* network_delegate,
|
||||||
Archive* archive,
|
std::shared_ptr<Archive> archive,
|
||||||
const base::FilePath& file_path,
|
const base::FilePath& file_path,
|
||||||
|
const Archive::FileInfo& file_info,
|
||||||
const scoped_refptr<base::TaskRunner>& file_task_runner)
|
const scoped_refptr<base::TaskRunner>& file_task_runner)
|
||||||
: net::URLRequestJob(request, network_delegate),
|
: net::URLRequestJob(request, network_delegate),
|
||||||
archive_(archive),
|
archive_(archive),
|
||||||
file_path_(file_path),
|
file_path_(file_path),
|
||||||
|
file_info_(file_info),
|
||||||
stream_(new net::FileStream(file_task_runner)),
|
stream_(new net::FileStream(file_task_runner)),
|
||||||
remaining_bytes_(0),
|
remaining_bytes_(0),
|
||||||
file_task_runner_(file_task_runner),
|
file_task_runner_(file_task_runner),
|
||||||
@@ -31,12 +33,6 @@ URLRequestAsarJob::URLRequestAsarJob(
|
|||||||
URLRequestAsarJob::~URLRequestAsarJob() {}
|
URLRequestAsarJob::~URLRequestAsarJob() {}
|
||||||
|
|
||||||
void URLRequestAsarJob::Start() {
|
void URLRequestAsarJob::Start() {
|
||||||
if (!archive_ || !archive_->GetFileInfo(file_path_, &file_info_)) {
|
|
||||||
NotifyDone(net::URLRequestStatus(net::URLRequestStatus::FAILED,
|
|
||||||
net::ERR_FILE_NOT_FOUND));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
remaining_bytes_ = static_cast<int64>(file_info_.size);
|
remaining_bytes_ = static_cast<int64>(file_info_.size);
|
||||||
|
|
||||||
int flags = base::File::FLAG_OPEN |
|
int flags = base::File::FLAG_OPEN |
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
#ifndef ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_
|
#ifndef ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_
|
||||||
#define ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_
|
#define ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "atom/common/asar/archive.h"
|
#include "atom/common/asar/archive.h"
|
||||||
@@ -23,21 +24,29 @@ class FileStream;
|
|||||||
|
|
||||||
namespace asar {
|
namespace asar {
|
||||||
|
|
||||||
|
// Createa a request job according to the file path.
|
||||||
|
net::URLRequestJob* CreateJobFromPath(
|
||||||
|
const base::FilePath& full_path,
|
||||||
|
net::URLRequest* request,
|
||||||
|
net::NetworkDelegate* network_delegate,
|
||||||
|
const scoped_refptr<base::TaskRunner> file_task_runner);
|
||||||
|
|
||||||
class URLRequestAsarJob : public net::URLRequestJob {
|
class URLRequestAsarJob : public net::URLRequestJob {
|
||||||
public:
|
public:
|
||||||
URLRequestAsarJob(net::URLRequest* request,
|
URLRequestAsarJob(net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate,
|
net::NetworkDelegate* network_delegate,
|
||||||
Archive* archive,
|
std::shared_ptr<Archive> archive,
|
||||||
const base::FilePath& file_path,
|
const base::FilePath& file_path,
|
||||||
|
const Archive::FileInfo& file_info,
|
||||||
const scoped_refptr<base::TaskRunner>& file_task_runner);
|
const scoped_refptr<base::TaskRunner>& file_task_runner);
|
||||||
|
|
||||||
// net::URLRequestJob:
|
// net::URLRequestJob:
|
||||||
virtual void Start() OVERRIDE;
|
void Start() override;
|
||||||
virtual void Kill() OVERRIDE;
|
void Kill() override;
|
||||||
virtual bool ReadRawData(net::IOBuffer* buf,
|
bool ReadRawData(net::IOBuffer* buf,
|
||||||
int buf_size,
|
int buf_size,
|
||||||
int* bytes_read) OVERRIDE;
|
int* bytes_read) override;
|
||||||
virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
|
bool GetMimeType(std::string* mime_type) const override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~URLRequestAsarJob();
|
virtual ~URLRequestAsarJob();
|
||||||
@@ -53,9 +62,9 @@ class URLRequestAsarJob : public net::URLRequestJob {
|
|||||||
// Callback after data is asynchronously read from the file into |buf|.
|
// Callback after data is asynchronously read from the file into |buf|.
|
||||||
void DidRead(scoped_refptr<net::IOBuffer> buf, int result);
|
void DidRead(scoped_refptr<net::IOBuffer> buf, int result);
|
||||||
|
|
||||||
Archive* archive_;
|
std::shared_ptr<Archive> archive_;
|
||||||
Archive::FileInfo file_info_;
|
|
||||||
base::FilePath file_path_;
|
base::FilePath file_path_;
|
||||||
|
Archive::FileInfo file_info_;
|
||||||
|
|
||||||
scoped_ptr<net::FileStream> stream_;
|
scoped_ptr<net::FileStream> stream_;
|
||||||
int64 remaining_bytes_;
|
int64 remaining_bytes_;
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ ProtocolHandler* AtomURLRequestJobFactory::ReplaceProtocol(
|
|||||||
|
|
||||||
base::AutoLock locked(lock_);
|
base::AutoLock locked(lock_);
|
||||||
if (!ContainsKey(protocol_handler_map_, scheme))
|
if (!ContainsKey(protocol_handler_map_, scheme))
|
||||||
return NULL;
|
return nullptr;
|
||||||
ProtocolHandler* original_protocol_handler = protocol_handler_map_[scheme];
|
ProtocolHandler* original_protocol_handler = protocol_handler_map_[scheme];
|
||||||
protocol_handler_map_[scheme] = protocol_handler;
|
protocol_handler_map_[scheme] = protocol_handler;
|
||||||
return original_protocol_handler;
|
return original_protocol_handler;
|
||||||
@@ -63,7 +63,7 @@ ProtocolHandler* AtomURLRequestJobFactory::GetProtocolHandler(
|
|||||||
base::AutoLock locked(lock_);
|
base::AutoLock locked(lock_);
|
||||||
ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
|
ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
|
||||||
if (it == protocol_handler_map_.end())
|
if (it == protocol_handler_map_.end())
|
||||||
return NULL;
|
return nullptr;
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -82,10 +82,23 @@ net::URLRequestJob* AtomURLRequestJobFactory::MaybeCreateJobWithProtocolHandler(
|
|||||||
base::AutoLock locked(lock_);
|
base::AutoLock locked(lock_);
|
||||||
ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
|
ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
|
||||||
if (it == protocol_handler_map_.end())
|
if (it == protocol_handler_map_.end())
|
||||||
return NULL;
|
return nullptr;
|
||||||
return it->second->MaybeCreateJob(request, network_delegate);
|
return it->second->MaybeCreateJob(request, network_delegate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
net::URLRequestJob* AtomURLRequestJobFactory::MaybeInterceptRedirect(
|
||||||
|
net::URLRequest* request,
|
||||||
|
net::NetworkDelegate* network_delegate,
|
||||||
|
const GURL& location) const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
net::URLRequestJob* AtomURLRequestJobFactory::MaybeInterceptResponse(
|
||||||
|
net::URLRequest* request,
|
||||||
|
net::NetworkDelegate* network_delegate) const {
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool AtomURLRequestJobFactory::IsHandledProtocol(
|
bool AtomURLRequestJobFactory::IsHandledProtocol(
|
||||||
const std::string& scheme) const {
|
const std::string& scheme) const {
|
||||||
DCHECK(CalledOnValidThread());
|
DCHECK(CalledOnValidThread());
|
||||||
|
|||||||
@@ -40,13 +40,20 @@ class AtomURLRequestJobFactory : public net::URLRequestJobFactory {
|
|||||||
bool HasProtocolHandler(const std::string& scheme) const;
|
bool HasProtocolHandler(const std::string& scheme) const;
|
||||||
|
|
||||||
// URLRequestJobFactory implementation
|
// URLRequestJobFactory implementation
|
||||||
virtual net::URLRequestJob* MaybeCreateJobWithProtocolHandler(
|
net::URLRequestJob* MaybeCreateJobWithProtocolHandler(
|
||||||
const std::string& scheme,
|
const std::string& scheme,
|
||||||
net::URLRequest* request,
|
net::URLRequest* request,
|
||||||
net::NetworkDelegate* network_delegate) const OVERRIDE;
|
net::NetworkDelegate* network_delegate) const override;
|
||||||
virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE;
|
net::URLRequestJob* MaybeInterceptRedirect(
|
||||||
virtual bool IsHandledURL(const GURL& url) const OVERRIDE;
|
net::URLRequest* request,
|
||||||
virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE;
|
net::NetworkDelegate* network_delegate,
|
||||||
|
const GURL& location) const override;
|
||||||
|
net::URLRequestJob* MaybeInterceptResponse(
|
||||||
|
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:
|
private:
|
||||||
typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap;
|
typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap;
|
||||||
|
|||||||
38
atom/browser/net/url_request_buffer_job.cc
Normal file
38
atom/browser/net/url_request_buffer_job.cc
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
// Copyright (c) 2013 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/net/url_request_buffer_job.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "net/base/net_errors.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
URLRequestBufferJob::URLRequestBufferJob(net::URLRequest* request,
|
||||||
|
net::NetworkDelegate* network_delegate,
|
||||||
|
const std::string& mime_type,
|
||||||
|
const std::string& charset,
|
||||||
|
v8::Local<v8::Object> data)
|
||||||
|
: net::URLRequestSimpleJob(request, network_delegate),
|
||||||
|
mime_type_(mime_type),
|
||||||
|
charset_(charset),
|
||||||
|
buffer_data_(new base::RefCountedBytes()) {
|
||||||
|
auto input = reinterpret_cast<const unsigned char*>(node::Buffer::Data(data));
|
||||||
|
size_t length = node::Buffer::Length(data);
|
||||||
|
buffer_data_->data().assign(input, input + length);
|
||||||
|
}
|
||||||
|
|
||||||
|
int URLRequestBufferJob::GetRefCountedData(
|
||||||
|
std::string* mime_type,
|
||||||
|
std::string* charset,
|
||||||
|
scoped_refptr<base::RefCountedMemory>* data,
|
||||||
|
const net::CompletionCallback& callback) const {
|
||||||
|
*mime_type = mime_type_;
|
||||||
|
*charset = charset_;
|
||||||
|
*data = buffer_data_;
|
||||||
|
return net::OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
40
atom/browser/net/url_request_buffer_job.h
Normal file
40
atom/browser/net/url_request_buffer_job.h
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// Copyright (c) 2013 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_BROWSER_NET_URL_REQUEST_BUFFER_JOB_H_
|
||||||
|
#define ATOM_BROWSER_NET_URL_REQUEST_BUFFER_JOB_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "base/memory/ref_counted_memory.h"
|
||||||
|
#include "net/url_request/url_request_simple_job.h"
|
||||||
|
#include "atom/common/node_includes.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
class URLRequestBufferJob : public net::URLRequestSimpleJob {
|
||||||
|
public:
|
||||||
|
URLRequestBufferJob(net::URLRequest* request,
|
||||||
|
net::NetworkDelegate* network_delegate,
|
||||||
|
const std::string& mime_type,
|
||||||
|
const std::string& charset,
|
||||||
|
v8::Local<v8::Object> buffer);
|
||||||
|
|
||||||
|
// URLRequestSimpleJob:
|
||||||
|
int GetRefCountedData(std::string* mime_type,
|
||||||
|
std::string* charset,
|
||||||
|
scoped_refptr<base::RefCountedMemory>* data,
|
||||||
|
const net::CompletionCallback& callback) const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::string mime_type_;
|
||||||
|
std::string charset_;
|
||||||
|
scoped_refptr<base::RefCountedBytes> buffer_data_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(URLRequestBufferJob);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_BROWSER_NET_URL_REQUEST_BUFFER_JOB_H_
|
||||||
@@ -20,10 +20,10 @@ class URLRequestStringJob : public net::URLRequestSimpleJob {
|
|||||||
const std::string& data);
|
const std::string& data);
|
||||||
|
|
||||||
// URLRequestSimpleJob:
|
// URLRequestSimpleJob:
|
||||||
virtual int GetData(std::string* mime_type,
|
int GetData(std::string* mime_type,
|
||||||
std::string* charset,
|
std::string* charset,
|
||||||
std::string* data,
|
std::string* data,
|
||||||
const net::CompletionCallback& callback) const OVERRIDE;
|
const net::CompletionCallback& callback) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string mime_type_;
|
std::string mime_type_;
|
||||||
|
|||||||
@@ -33,12 +33,12 @@ class NodeDebugger : public net::StreamListenSocket::Delegate {
|
|||||||
static void DebugMessageHandler(const v8::Debug::Message& message);
|
static void DebugMessageHandler(const v8::Debug::Message& message);
|
||||||
|
|
||||||
// net::StreamListenSocket::Delegate:
|
// net::StreamListenSocket::Delegate:
|
||||||
virtual void DidAccept(net::StreamListenSocket* server,
|
void DidAccept(net::StreamListenSocket* server,
|
||||||
scoped_ptr<net::StreamListenSocket> socket) OVERRIDE;
|
scoped_ptr<net::StreamListenSocket> socket) override;
|
||||||
virtual void DidRead(net::StreamListenSocket* socket,
|
void DidRead(net::StreamListenSocket* socket,
|
||||||
const char* data,
|
const char* data,
|
||||||
int len) OVERRIDE;
|
int len) override;
|
||||||
virtual void DidClose(net::StreamListenSocket* socket) OVERRIDE;
|
void DidClose(net::StreamListenSocket* socket) override;
|
||||||
|
|
||||||
v8::Isolate* isolate_;
|
v8::Isolate* isolate_;
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
<key>CFBundleIconFile</key>
|
<key>CFBundleIconFile</key>
|
||||||
<string>atom.icns</string>
|
<string>atom.icns</string>
|
||||||
<key>CFBundleVersion</key>
|
<key>CFBundleVersion</key>
|
||||||
<string>0.20.8</string>
|
<string>0.22.3</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>10.8.0</string>
|
<string>10.8.0</string>
|
||||||
<key>NSMainNibFile</key>
|
<key>NSMainNibFile</key>
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
//
|
//
|
||||||
// Generated from the TEXTINCLUDE 2 resource.
|
// Generated from the TEXTINCLUDE 2 resource.
|
||||||
//
|
//
|
||||||
#include "afxres.h"
|
#include "windows.h"
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
#undef APSTUDIO_READONLY_SYMBOLS
|
#undef APSTUDIO_READONLY_SYMBOLS
|
||||||
@@ -31,7 +31,7 @@ END
|
|||||||
|
|
||||||
2 TEXTINCLUDE
|
2 TEXTINCLUDE
|
||||||
BEGIN
|
BEGIN
|
||||||
"#include ""afxres.h""\r\n"
|
"#include ""windows.h""\r\n"
|
||||||
"\0"
|
"\0"
|
||||||
END
|
END
|
||||||
|
|
||||||
@@ -50,8 +50,8 @@ END
|
|||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 0,20,8,0
|
FILEVERSION 0,22,3,0
|
||||||
PRODUCTVERSION 0,20,8,0
|
PRODUCTVERSION 0,22,3,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@@ -68,12 +68,12 @@ BEGIN
|
|||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "GitHub, Inc."
|
VALUE "CompanyName", "GitHub, Inc."
|
||||||
VALUE "FileDescription", "Atom-Shell"
|
VALUE "FileDescription", "Atom-Shell"
|
||||||
VALUE "FileVersion", "0.20.8"
|
VALUE "FileVersion", "0.22.3"
|
||||||
VALUE "InternalName", "atom.exe"
|
VALUE "InternalName", "atom.exe"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved."
|
VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved."
|
||||||
VALUE "OriginalFilename", "atom.exe"
|
VALUE "OriginalFilename", "atom.exe"
|
||||||
VALUE "ProductName", "Atom-Shell"
|
VALUE "ProductName", "Atom-Shell"
|
||||||
VALUE "ProductVersion", "0.20.8"
|
VALUE "ProductVersion", "0.22.3"
|
||||||
VALUE "SquirrelAwareVersion", "1"
|
VALUE "SquirrelAwareVersion", "1"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "base/callback.h"
|
#include "base/callback.h"
|
||||||
#include "base/file_util.h"
|
#include "base/files/file_util.h"
|
||||||
#include "base/strings/string_util.h"
|
#include "base/strings/string_util.h"
|
||||||
#include "chrome/browser/ui/libgtk2ui/gtk2_signal.h"
|
#include "chrome/browser/ui/libgtk2ui/gtk2_signal.h"
|
||||||
#include "ui/aura/window.h"
|
#include "ui/aura/window.h"
|
||||||
|
|||||||
@@ -8,7 +8,8 @@
|
|||||||
#import <CoreServices/CoreServices.h>
|
#import <CoreServices/CoreServices.h>
|
||||||
|
|
||||||
#include "atom/browser/native_window.h"
|
#include "atom/browser/native_window.h"
|
||||||
#include "base/file_util.h"
|
#include "base/files/file_util.h"
|
||||||
|
#include "base/mac/foundation_util.h"
|
||||||
#include "base/mac/mac_util.h"
|
#include "base/mac/mac_util.h"
|
||||||
#include "base/mac/scoped_cftyperef.h"
|
#include "base/mac/scoped_cftyperef.h"
|
||||||
#include "base/strings/sys_string_conversions.h"
|
#include "base/strings/sys_string_conversions.h"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
|
|
||||||
#include "atom/browser/native_window_views.h"
|
#include "atom/browser/native_window_views.h"
|
||||||
#include "base/file_util.h"
|
#include "base/files/file_util.h"
|
||||||
#include "base/i18n/case_conversion.h"
|
#include "base/i18n/case_conversion.h"
|
||||||
#include "base/strings/string_util.h"
|
#include "base/strings/string_util.h"
|
||||||
#include "base/strings/string_split.h"
|
#include "base/strings/string_split.h"
|
||||||
|
|||||||
@@ -22,12 +22,12 @@ class TrayIconCocoa : public TrayIcon {
|
|||||||
TrayIconCocoa();
|
TrayIconCocoa();
|
||||||
virtual ~TrayIconCocoa();
|
virtual ~TrayIconCocoa();
|
||||||
|
|
||||||
virtual void SetImage(const gfx::Image& image) OVERRIDE;
|
void SetImage(const gfx::Image& image) override;
|
||||||
virtual void SetPressedImage(const gfx::Image& image) OVERRIDE;
|
void SetPressedImage(const gfx::Image& image) override;
|
||||||
virtual void SetToolTip(const std::string& tool_tip) OVERRIDE;
|
void SetToolTip(const std::string& tool_tip) override;
|
||||||
virtual void SetTitle(const std::string& title) OVERRIDE;
|
void SetTitle(const std::string& title) override;
|
||||||
virtual void SetHighlightMode(bool highlight) OVERRIDE;
|
void SetHighlightMode(bool highlight) override;
|
||||||
virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) OVERRIDE;
|
void SetContextMenu(ui::SimpleMenuModel* menu_model) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
base::scoped_nsobject<NSStatusItem> item_;
|
base::scoped_nsobject<NSStatusItem> item_;
|
||||||
|
|||||||
@@ -54,13 +54,11 @@ TrayIconCocoa::~TrayIconCocoa() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconCocoa::SetImage(const gfx::Image& image) {
|
void TrayIconCocoa::SetImage(const gfx::Image& image) {
|
||||||
if (!image.IsEmpty())
|
[item_ setImage:image.AsNSImage()];
|
||||||
[item_ setImage:image.ToNSImage()];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconCocoa::SetPressedImage(const gfx::Image& image) {
|
void TrayIconCocoa::SetPressedImage(const gfx::Image& image) {
|
||||||
if (!image.IsEmpty())
|
[item_ setAlternateImage:image.AsNSImage()];
|
||||||
[item_ setAlternateImage:image.ToNSImage()];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TrayIconCocoa::SetToolTip(const std::string& tool_tip) {
|
void TrayIconCocoa::SetToolTip(const std::string& tool_tip) {
|
||||||
|
|||||||
@@ -23,14 +23,14 @@ class TrayIconGtk : public TrayIcon,
|
|||||||
virtual ~TrayIconGtk();
|
virtual ~TrayIconGtk();
|
||||||
|
|
||||||
// TrayIcon:
|
// TrayIcon:
|
||||||
virtual void SetImage(const gfx::Image& image) OVERRIDE;
|
void SetImage(const gfx::Image& image) override;
|
||||||
virtual void SetToolTip(const std::string& tool_tip) OVERRIDE;
|
void SetToolTip(const std::string& tool_tip) override;
|
||||||
virtual void SetContextMenu(ui::SimpleMenuModel* menu_model) OVERRIDE;
|
void SetContextMenu(ui::SimpleMenuModel* menu_model) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// views::StatusIconLinux::Delegate:
|
// views::StatusIconLinux::Delegate:
|
||||||
virtual void OnClick() OVERRIDE;
|
void OnClick() override;
|
||||||
virtual bool HasClickAction() OVERRIDE;
|
bool HasClickAction() override;
|
||||||
|
|
||||||
scoped_ptr<views::StatusIconLinux> icon_;
|
scoped_ptr<views::StatusIconLinux> icon_;
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ SubmenuButton::SubmenuButton(views::ButtonListener* listener,
|
|||||||
underline_color_(SK_ColorBLACK) {
|
underline_color_(SK_ColorBLACK) {
|
||||||
#if defined(OS_LINUX)
|
#if defined(OS_LINUX)
|
||||||
// Dont' use native style border.
|
// Dont' use native style border.
|
||||||
SetBorder(CreateDefaultBorder().PassAs<views::Border>());
|
SetBorder(CreateDefaultBorder().Pass());
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (GetUnderlinePosition(title, &accelerator_, &underline_start_,
|
if (GetUnderlinePosition(title, &accelerator_, &underline_start_,
|
||||||
|
|||||||
@@ -11,8 +11,8 @@
|
|||||||
#include "third_party/skia/include/core/SkBitmap.h"
|
#include "third_party/skia/include/core/SkBitmap.h"
|
||||||
#include "ui/gfx/icon_util.h"
|
#include "ui/gfx/icon_util.h"
|
||||||
#include "ui/gfx/image/image.h"
|
#include "ui/gfx/image/image.h"
|
||||||
#include "ui/gfx/point.h"
|
#include "ui/gfx/geometry/point.h"
|
||||||
#include "ui/gfx/rect.h"
|
#include "ui/gfx/geometry/rect.h"
|
||||||
#include "ui/views/controls/menu/menu_runner.h"
|
#include "ui/views/controls/menu/menu_runner.h"
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|||||||
@@ -4,6 +4,9 @@
|
|||||||
|
|
||||||
#include "atom/browser/ui/x/x_window_utils.h"
|
#include "atom/browser/ui/x/x_window_utils.h"
|
||||||
|
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
|
||||||
|
#include "base/strings/string_util.h"
|
||||||
#include "ui/base/x/x11_util.h"
|
#include "ui/base/x/x11_util.h"
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
@@ -31,4 +34,16 @@ void SetWMSpecState(::Window xwindow, bool enabled, ::Atom state) {
|
|||||||
&xclient);
|
&xclient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SetWindowType(::Window xwindow, const std::string& type) {
|
||||||
|
XDisplay* xdisplay = gfx::GetXDisplay();
|
||||||
|
std::string type_prefix = "_NET_WM_WINDOW_TYPE_";
|
||||||
|
::Atom window_type = XInternAtom(
|
||||||
|
xdisplay, (type_prefix + StringToUpperASCII(type)).c_str(), False);
|
||||||
|
XChangeProperty(xdisplay, xwindow,
|
||||||
|
XInternAtom(xdisplay, "_NET_WM_WINDOW_TYPE", False),
|
||||||
|
XA_ATOM,
|
||||||
|
32, PropModeReplace,
|
||||||
|
reinterpret_cast<unsigned char*>(&window_type), 1);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|||||||
@@ -9,6 +9,8 @@
|
|||||||
#include <X11/extensions/Xrandr.h>
|
#include <X11/extensions/Xrandr.h>
|
||||||
#include <X11/Xlib.h>
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
::Atom GetAtom(const char* name);
|
::Atom GetAtom(const char* name);
|
||||||
@@ -17,6 +19,9 @@ namespace atom {
|
|||||||
// for _NET_WM_STATE.
|
// for _NET_WM_STATE.
|
||||||
void SetWMSpecState(::Window xwindow, bool enabled, ::Atom state);
|
void SetWMSpecState(::Window xwindow, bool enabled, ::Atom state);
|
||||||
|
|
||||||
|
// Sets the _NET_WM_WINDOW_TYPE of window.
|
||||||
|
void SetWindowType(::Window xwindow, const std::string& type);
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
||||||
#endif // ATOM_BROWSER_UI_X_X_WINDOW_UTILS_H_
|
#endif // ATOM_BROWSER_UI_X_X_WINDOW_UTILS_H_
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include "base/strings/utf_string_conversions.h"
|
#include "base/strings/utf_string_conversions.h"
|
||||||
#include "content/public/browser/render_view_host.h"
|
#include "content/public/browser/render_view_host.h"
|
||||||
#include "content/public/browser/web_contents.h"
|
#include "content/public/browser/web_contents.h"
|
||||||
|
#include "content/public/common/file_chooser_file_info.h"
|
||||||
#include "ui/shell_dialogs/selected_file_info.h"
|
#include "ui/shell_dialogs/selected_file_info.h"
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
@@ -26,15 +27,19 @@ WebDialogHelper::~WebDialogHelper() {
|
|||||||
|
|
||||||
void WebDialogHelper::RunFileChooser(content::WebContents* web_contents,
|
void WebDialogHelper::RunFileChooser(content::WebContents* web_contents,
|
||||||
const content::FileChooserParams& params) {
|
const content::FileChooserParams& params) {
|
||||||
std::vector<ui::SelectedFileInfo> result;
|
std::vector<content::FileChooserFileInfo> result;
|
||||||
if (params.mode == content::FileChooserParams::Save) {
|
if (params.mode == content::FileChooserParams::Save) {
|
||||||
base::FilePath path;
|
base::FilePath path;
|
||||||
if (file_dialog::ShowSaveDialog(window_,
|
if (file_dialog::ShowSaveDialog(window_,
|
||||||
base::UTF16ToUTF8(params.title),
|
base::UTF16ToUTF8(params.title),
|
||||||
params.default_file_name,
|
params.default_file_name,
|
||||||
file_dialog::Filters(),
|
file_dialog::Filters(),
|
||||||
&path))
|
&path)) {
|
||||||
result.push_back(ui::SelectedFileInfo(path, path));
|
content::FileChooserFileInfo info;
|
||||||
|
info.file_path = path;
|
||||||
|
info.display_name = path.BaseName().value();
|
||||||
|
result.push_back(info);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
int flags = file_dialog::FILE_DIALOG_CREATE_DIRECTORY;
|
int flags = file_dialog::FILE_DIALOG_CREATE_DIRECTORY;
|
||||||
switch (params.mode) {
|
switch (params.mode) {
|
||||||
@@ -56,9 +61,14 @@ void WebDialogHelper::RunFileChooser(content::WebContents* web_contents,
|
|||||||
params.default_file_name,
|
params.default_file_name,
|
||||||
file_dialog::Filters(),
|
file_dialog::Filters(),
|
||||||
flags,
|
flags,
|
||||||
&paths))
|
&paths)) {
|
||||||
for (auto& path : paths)
|
for (auto& path : paths) {
|
||||||
result.push_back(ui::SelectedFileInfo(path, path));
|
content::FileChooserFileInfo info;
|
||||||
|
info.file_path = path;
|
||||||
|
info.display_name = path.BaseName().value();
|
||||||
|
result.push_back(info);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
web_contents->GetRenderViewHost()->FilesSelectedInChooser(
|
web_contents->GetRenderViewHost()->FilesSelectedInChooser(
|
||||||
|
|||||||
@@ -1,154 +0,0 @@
|
|||||||
// Copyright (c) 2014 GitHub, Inc.
|
|
||||||
// Use of this source code is governed by the MIT license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "atom/browser/web_view/web_view_manager.h"
|
|
||||||
|
|
||||||
#include "atom/browser/api/atom_api_web_contents.h"
|
|
||||||
#include "atom/browser/atom_browser_context.h"
|
|
||||||
#include "atom/browser/web_view/web_view_renderer_state.h"
|
|
||||||
#include "atom/common/native_mate_converters/gurl_converter.h"
|
|
||||||
#include "base/bind.h"
|
|
||||||
#include "base/stl_util.h"
|
|
||||||
#include "content/public/browser/browser_thread.h"
|
|
||||||
#include "content/public/browser/render_process_host.h"
|
|
||||||
#include "native_mate/dictionary.h"
|
|
||||||
#include "native_mate/object_template_builder.h"
|
|
||||||
#include "net/base/filename_util.h"
|
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
|
||||||
|
|
||||||
namespace mate {
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct Converter<content::WebContents*> {
|
|
||||||
static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
|
|
||||||
content::WebContents** out) {
|
|
||||||
atom::api::WebContents* contents;
|
|
||||||
if (!Converter<atom::api::WebContents*>::FromV8(isolate, val, &contents))
|
|
||||||
return false;
|
|
||||||
*out = contents->web_contents();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct Converter<atom::WebViewManager::WebViewOptions> {
|
|
||||||
static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
|
|
||||||
atom::WebViewManager::WebViewOptions* out) {
|
|
||||||
Dictionary options;
|
|
||||||
if (!ConvertFromV8(isolate, val, &options))
|
|
||||||
return false;
|
|
||||||
return options.Get("nodeIntegration", &(out->node_integration)) &&
|
|
||||||
options.Get("plugins", &(out->plugins)) &&
|
|
||||||
options.Get("preloadUrl", &(out->preload_url)) &&
|
|
||||||
options.Get("disableWebSecurity", &(out->disable_web_security));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace mate
|
|
||||||
|
|
||||||
namespace atom {
|
|
||||||
|
|
||||||
WebViewManager::WebViewManager(content::BrowserContext* context) {
|
|
||||||
}
|
|
||||||
|
|
||||||
WebViewManager::~WebViewManager() {
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebViewManager::AddGuest(int guest_instance_id,
|
|
||||||
int element_instance_id,
|
|
||||||
content::WebContents* embedder,
|
|
||||||
content::WebContents* web_contents,
|
|
||||||
const WebViewOptions& options) {
|
|
||||||
web_contents_map_[guest_instance_id] = { web_contents, embedder };
|
|
||||||
|
|
||||||
WebViewRendererState::WebViewInfo web_view_info = {
|
|
||||||
guest_instance_id,
|
|
||||||
embedder,
|
|
||||||
options.node_integration,
|
|
||||||
options.plugins,
|
|
||||||
options.disable_web_security,
|
|
||||||
};
|
|
||||||
net::FileURLToFilePath(options.preload_url, &web_view_info.preload_script);
|
|
||||||
content::BrowserThread::PostTask(
|
|
||||||
content::BrowserThread::IO,
|
|
||||||
FROM_HERE,
|
|
||||||
base::Bind(&WebViewRendererState::AddGuest,
|
|
||||||
base::Unretained(WebViewRendererState::GetInstance()),
|
|
||||||
web_contents->GetRenderProcessHost()->GetID(),
|
|
||||||
web_view_info));
|
|
||||||
|
|
||||||
// Map the element in embedder to guest.
|
|
||||||
ElementInstanceKey key(embedder, element_instance_id);
|
|
||||||
element_instance_id_to_guest_map_[key] = guest_instance_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebViewManager::RemoveGuest(int guest_instance_id) {
|
|
||||||
if (!ContainsKey(web_contents_map_, guest_instance_id)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto web_contents = web_contents_map_[guest_instance_id].web_contents;
|
|
||||||
|
|
||||||
content::BrowserThread::PostTask(
|
|
||||||
content::BrowserThread::IO, FROM_HERE,
|
|
||||||
base::Bind(
|
|
||||||
&WebViewRendererState::RemoveGuest,
|
|
||||||
base::Unretained(WebViewRendererState::GetInstance()),
|
|
||||||
web_contents->GetRenderProcessHost()->GetID()));
|
|
||||||
|
|
||||||
web_contents_map_.erase(guest_instance_id);
|
|
||||||
|
|
||||||
// Remove the record of element in embedder too.
|
|
||||||
for (const auto& element : element_instance_id_to_guest_map_)
|
|
||||||
if (element.second == guest_instance_id) {
|
|
||||||
element_instance_id_to_guest_map_.erase(element.first);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
content::WebContents* WebViewManager::GetGuestByInstanceID(
|
|
||||||
content::WebContents* embedder,
|
|
||||||
int element_instance_id) {
|
|
||||||
ElementInstanceKey key(embedder, element_instance_id);
|
|
||||||
if (!ContainsKey(element_instance_id_to_guest_map_, key))
|
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
int guest_instance_id = element_instance_id_to_guest_map_[key];
|
|
||||||
if (ContainsKey(web_contents_map_, guest_instance_id))
|
|
||||||
return web_contents_map_[guest_instance_id].web_contents;
|
|
||||||
else
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebViewManager::ForEachGuest(content::WebContents* embedder_web_contents,
|
|
||||||
const GuestCallback& callback) {
|
|
||||||
for (auto& item : web_contents_map_)
|
|
||||||
if (item.second.embedder == embedder_web_contents &&
|
|
||||||
callback.Run(item.second.web_contents))
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace atom
|
|
||||||
|
|
||||||
namespace {
|
|
||||||
|
|
||||||
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
|
||||||
v8::Handle<v8::Context> context, void* priv) {
|
|
||||||
using atom::WebViewManager;
|
|
||||||
auto manager = static_cast<WebViewManager*>(
|
|
||||||
atom::AtomBrowserContext::Get()->GetGuestManager());
|
|
||||||
mate::Dictionary dict(context->GetIsolate(), exports);
|
|
||||||
dict.SetMethod("addGuest",
|
|
||||||
base::Bind(&WebViewManager::AddGuest,
|
|
||||||
base::Unretained(manager)));
|
|
||||||
dict.SetMethod("removeGuest",
|
|
||||||
base::Bind(&WebViewManager::RemoveGuest,
|
|
||||||
base::Unretained(manager)));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace
|
|
||||||
|
|
||||||
NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_browser_web_view_manager, Initialize)
|
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
// Copyright (c) 2014 GitHub, Inc.
|
|
||||||
// Use of this source code is governed by the MIT license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#include "atom/browser/web_view/web_view_renderer_state.h"
|
|
||||||
|
|
||||||
#include "content/public/browser/browser_thread.h"
|
|
||||||
|
|
||||||
namespace atom {
|
|
||||||
|
|
||||||
// static
|
|
||||||
WebViewRendererState* WebViewRendererState::GetInstance() {
|
|
||||||
return Singleton<WebViewRendererState>::get();
|
|
||||||
}
|
|
||||||
|
|
||||||
WebViewRendererState::WebViewRendererState() {
|
|
||||||
}
|
|
||||||
|
|
||||||
WebViewRendererState::~WebViewRendererState() {
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebViewRendererState::IsGuest(int render_process_id) {
|
|
||||||
return webview_info_map_.find(render_process_id) !=
|
|
||||||
webview_info_map_.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebViewRendererState::AddGuest(int guest_process_id,
|
|
||||||
const WebViewInfo& webview_info) {
|
|
||||||
webview_info_map_[guest_process_id] = webview_info;
|
|
||||||
}
|
|
||||||
|
|
||||||
void WebViewRendererState::RemoveGuest(int guest_process_id) {
|
|
||||||
webview_info_map_.erase(guest_process_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool WebViewRendererState::GetInfo(int guest_process_id,
|
|
||||||
WebViewInfo* webview_info) {
|
|
||||||
WebViewInfoMap::iterator iter = webview_info_map_.find(guest_process_id);
|
|
||||||
if (iter != webview_info_map_.end()) {
|
|
||||||
*webview_info = iter->second;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace atom
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
// Copyright (c) 2014 GitHub, Inc.
|
|
||||||
// Use of this source code is governed by the MIT license that can be
|
|
||||||
// found in the LICENSE file.
|
|
||||||
|
|
||||||
#ifndef ATOM_BROWSER_WEB_VIEW_WEB_VIEW_RENDERER_STATE_H_
|
|
||||||
#define ATOM_BROWSER_WEB_VIEW_WEB_VIEW_RENDERER_STATE_H_
|
|
||||||
|
|
||||||
#include <map>
|
|
||||||
#include <string>
|
|
||||||
#include <utility>
|
|
||||||
|
|
||||||
#include "base/files/file_path.h"
|
|
||||||
#include "base/memory/singleton.h"
|
|
||||||
|
|
||||||
namespace content {
|
|
||||||
class WebContents;
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace atom {
|
|
||||||
|
|
||||||
class WebViewManager;
|
|
||||||
|
|
||||||
// This class keeps track of <webview> renderer state for use on the IO thread.
|
|
||||||
// All methods should be called on the IO thread.
|
|
||||||
class WebViewRendererState {
|
|
||||||
public:
|
|
||||||
struct WebViewInfo {
|
|
||||||
int guest_instance_id;
|
|
||||||
content::WebContents* embedder;
|
|
||||||
bool node_integration;
|
|
||||||
bool plugins;
|
|
||||||
bool disable_web_security;
|
|
||||||
base::FilePath preload_script;
|
|
||||||
};
|
|
||||||
|
|
||||||
static WebViewRendererState* GetInstance();
|
|
||||||
|
|
||||||
// Looks up the information for the embedder <webview> for a given render
|
|
||||||
// view, if one exists. Called on the IO thread.
|
|
||||||
bool GetInfo(int guest_process_id, WebViewInfo* webview_info);
|
|
||||||
|
|
||||||
// Returns true if the given renderer is used by webviews.
|
|
||||||
bool IsGuest(int render_process_id);
|
|
||||||
|
|
||||||
private:
|
|
||||||
friend class WebViewManager;
|
|
||||||
friend struct DefaultSingletonTraits<WebViewRendererState>;
|
|
||||||
|
|
||||||
typedef std::map<int, WebViewInfo> WebViewInfoMap;
|
|
||||||
|
|
||||||
WebViewRendererState();
|
|
||||||
~WebViewRendererState();
|
|
||||||
|
|
||||||
// Adds or removes a <webview> guest render process from the set.
|
|
||||||
void AddGuest(int render_process_id, const WebViewInfo& webview_info);
|
|
||||||
void RemoveGuest(int render_process_id);
|
|
||||||
|
|
||||||
WebViewInfoMap webview_info_map_;
|
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(WebViewRendererState);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace atom
|
|
||||||
|
|
||||||
#endif // ATOM_BROWSER_WEB_VIEW_WEB_VIEW_RENDERER_STATE_H_
|
|
||||||
101
atom/browser/web_view_manager.cc
Normal file
101
atom/browser/web_view_manager.cc
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
// Copyright (c) 2014 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/browser/web_view_manager.h"
|
||||||
|
|
||||||
|
#include "atom/browser/atom_browser_context.h"
|
||||||
|
#include "content/public/browser/render_process_host.h"
|
||||||
|
#include "content/public/browser/web_contents.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
// static
|
||||||
|
bool WebViewManager::GetInfoForProcess(content::RenderProcessHost* process,
|
||||||
|
WebViewInfo* info) {
|
||||||
|
if (!process)
|
||||||
|
return false;
|
||||||
|
auto context = process->GetBrowserContext();
|
||||||
|
if (!context)
|
||||||
|
return false;
|
||||||
|
auto manager = context->GetGuestManager();
|
||||||
|
if (!manager)
|
||||||
|
return false;
|
||||||
|
return static_cast<WebViewManager*>(manager)->GetInfo(process->GetID(), info);
|
||||||
|
}
|
||||||
|
|
||||||
|
WebViewManager::WebViewManager(content::BrowserContext* context) {
|
||||||
|
}
|
||||||
|
|
||||||
|
WebViewManager::~WebViewManager() {
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebViewManager::AddGuest(int guest_instance_id,
|
||||||
|
int element_instance_id,
|
||||||
|
content::WebContents* embedder,
|
||||||
|
content::WebContents* web_contents,
|
||||||
|
const WebViewInfo& info) {
|
||||||
|
base::AutoLock auto_lock(lock_);
|
||||||
|
web_contents_embdder_map_[guest_instance_id] = { web_contents, embedder };
|
||||||
|
|
||||||
|
int guest_process_id = web_contents->GetRenderProcessHost()->GetID();
|
||||||
|
webview_info_map_[guest_process_id] = info;
|
||||||
|
|
||||||
|
// Map the element in embedder to guest.
|
||||||
|
ElementInstanceKey key(embedder, element_instance_id);
|
||||||
|
element_instance_id_to_guest_map_[key] = guest_instance_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
void WebViewManager::RemoveGuest(int guest_instance_id) {
|
||||||
|
base::AutoLock auto_lock(lock_);
|
||||||
|
if (!ContainsKey(web_contents_embdder_map_, guest_instance_id))
|
||||||
|
return;
|
||||||
|
|
||||||
|
auto web_contents = web_contents_embdder_map_[guest_instance_id].web_contents;
|
||||||
|
web_contents_embdder_map_.erase(guest_instance_id);
|
||||||
|
|
||||||
|
int guest_process_id = web_contents->GetRenderProcessHost()->GetID();
|
||||||
|
webview_info_map_.erase(guest_process_id);
|
||||||
|
|
||||||
|
// Remove the record of element in embedder too.
|
||||||
|
for (const auto& element : element_instance_id_to_guest_map_)
|
||||||
|
if (element.second == guest_instance_id) {
|
||||||
|
element_instance_id_to_guest_map_.erase(element.first);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WebViewManager::GetInfo(int guest_process_id, WebViewInfo* webview_info) {
|
||||||
|
base::AutoLock auto_lock(lock_);
|
||||||
|
WebViewInfoMap::iterator iter = webview_info_map_.find(guest_process_id);
|
||||||
|
if (iter != webview_info_map_.end()) {
|
||||||
|
*webview_info = iter->second;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
content::WebContents* WebViewManager::GetGuestByInstanceID(
|
||||||
|
content::WebContents* embedder,
|
||||||
|
int element_instance_id) {
|
||||||
|
ElementInstanceKey key(embedder, element_instance_id);
|
||||||
|
if (!ContainsKey(element_instance_id_to_guest_map_, key))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
int guest_instance_id = element_instance_id_to_guest_map_[key];
|
||||||
|
if (ContainsKey(web_contents_embdder_map_, guest_instance_id))
|
||||||
|
return web_contents_embdder_map_[guest_instance_id].web_contents;
|
||||||
|
else
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool WebViewManager::ForEachGuest(content::WebContents* embedder_web_contents,
|
||||||
|
const GuestCallback& callback) {
|
||||||
|
for (auto& item : web_contents_embdder_map_)
|
||||||
|
if (item.second.embedder == embedder_web_contents &&
|
||||||
|
callback.Run(item.second.web_contents))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
@@ -2,39 +2,52 @@
|
|||||||
// Use of this source code is governed by the MIT license that can be
|
// Use of this source code is governed by the MIT license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
#ifndef ATOM_BROWSER_WEB_VIEW_WEB_VIEW_MANAGER_H_
|
#ifndef ATOM_BROWSER_WEB_VIEW_MANAGER_H_
|
||||||
#define ATOM_BROWSER_WEB_VIEW_WEB_VIEW_MANAGER_H_
|
#define ATOM_BROWSER_WEB_VIEW_MANAGER_H_
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
#include "base/files/file_path.h"
|
||||||
|
#include "base/synchronization/lock.h"
|
||||||
#include "content/public/browser/browser_plugin_guest_manager.h"
|
#include "content/public/browser/browser_plugin_guest_manager.h"
|
||||||
#include "url/gurl.h"
|
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
class BrowserContext;
|
class BrowserContext;
|
||||||
|
class RenderProcessHost;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace atom {
|
namespace atom {
|
||||||
|
|
||||||
class WebViewManager : public content::BrowserPluginGuestManager {
|
class WebViewManager : public content::BrowserPluginGuestManager {
|
||||||
public:
|
public:
|
||||||
explicit WebViewManager(content::BrowserContext* context);
|
struct WebViewInfo {
|
||||||
virtual ~WebViewManager();
|
int guest_instance_id;
|
||||||
|
content::WebContents* embedder;
|
||||||
struct WebViewOptions {
|
|
||||||
bool node_integration;
|
bool node_integration;
|
||||||
bool plugins;
|
bool plugins;
|
||||||
bool disable_web_security;
|
bool disable_web_security;
|
||||||
GURL preload_url;
|
base::FilePath preload_script;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Finds the WebViewManager attached with |process| and returns the
|
||||||
|
// WebViewInfo of it.
|
||||||
|
static bool GetInfoForProcess(content::RenderProcessHost* process,
|
||||||
|
WebViewInfo* info);
|
||||||
|
|
||||||
|
explicit WebViewManager(content::BrowserContext* context);
|
||||||
|
virtual ~WebViewManager();
|
||||||
|
|
||||||
void AddGuest(int guest_instance_id,
|
void AddGuest(int guest_instance_id,
|
||||||
int element_instance_id,
|
int element_instance_id,
|
||||||
content::WebContents* embedder,
|
content::WebContents* embedder,
|
||||||
content::WebContents* web_contents,
|
content::WebContents* web_contents,
|
||||||
const WebViewOptions& options);
|
const WebViewInfo& info);
|
||||||
void RemoveGuest(int guest_instance_id);
|
void RemoveGuest(int guest_instance_id);
|
||||||
|
|
||||||
|
// Looks up the information for the embedder <webview> for a given render
|
||||||
|
// view, if one exists. Called on the IO thread.
|
||||||
|
bool GetInfo(int guest_process_id, WebViewInfo* webview_info);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// content::BrowserPluginGuestManager:
|
// content::BrowserPluginGuestManager:
|
||||||
content::WebContents* GetGuestByInstanceID(
|
content::WebContents* GetGuestByInstanceID(
|
||||||
@@ -45,19 +58,16 @@ class WebViewManager : public content::BrowserPluginGuestManager {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
struct WebContentsWithEmbedder {
|
struct WebContentsWithEmbedder {
|
||||||
content::WebContents* web_contents; // Weak ref.
|
content::WebContents* web_contents;
|
||||||
content::WebContents* embedder;
|
content::WebContents* embedder;
|
||||||
};
|
};
|
||||||
std::map<int, WebContentsWithEmbedder> web_contents_map_;
|
// guest_instance_id => (web_contents, embedder)
|
||||||
|
std::map<int, WebContentsWithEmbedder> web_contents_embdder_map_;
|
||||||
|
|
||||||
struct ElementInstanceKey {
|
struct ElementInstanceKey {
|
||||||
content::WebContents* owner_web_contents;
|
content::WebContents* owner_web_contents;
|
||||||
int element_instance_id;
|
int element_instance_id;
|
||||||
|
|
||||||
ElementInstanceKey()
|
|
||||||
: owner_web_contents(nullptr),
|
|
||||||
element_instance_id(0) {}
|
|
||||||
|
|
||||||
ElementInstanceKey(content::WebContents* owner_web_contents,
|
ElementInstanceKey(content::WebContents* owner_web_contents,
|
||||||
int element_instance_id)
|
int element_instance_id)
|
||||||
: owner_web_contents(owner_web_contents),
|
: owner_web_contents(owner_web_contents),
|
||||||
@@ -74,11 +84,18 @@ class WebViewManager : public content::BrowserPluginGuestManager {
|
|||||||
(element_instance_id == other.element_instance_id);
|
(element_instance_id == other.element_instance_id);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
// (web_contents, element_instance_id) => guest_instance_id
|
||||||
std::map<ElementInstanceKey, int> element_instance_id_to_guest_map_;
|
std::map<ElementInstanceKey, int> element_instance_id_to_guest_map_;
|
||||||
|
|
||||||
|
typedef std::map<int, WebViewInfo> WebViewInfoMap;
|
||||||
|
// guest_process_id => (guest_instance_id, embedder, ...)
|
||||||
|
WebViewInfoMap webview_info_map_;
|
||||||
|
|
||||||
|
base::Lock lock_;
|
||||||
|
|
||||||
DISALLOW_COPY_AND_ASSIGN(WebViewManager);
|
DISALLOW_COPY_AND_ASSIGN(WebViewManager);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace atom
|
} // namespace atom
|
||||||
|
|
||||||
#endif // ATOM_BROWSER_WEB_VIEW_WEB_VIEW_MANAGER_H_
|
#endif // ATOM_BROWSER_WEB_VIEW_MANAGER_H_
|
||||||
@@ -2,11 +2,15 @@
|
|||||||
// Use of this source code is governed by the MIT license that can be
|
// Use of this source code is governed by the MIT license that can be
|
||||||
// found in the LICENSE file.
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "atom_natives.h" // NOLINT: This file is generated with coffee2c.
|
||||||
#include "atom/common/asar/archive.h"
|
#include "atom/common/asar/archive.h"
|
||||||
#include "atom/common/native_mate_converters/file_path_converter.h"
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
#include "native_mate/arguments.h"
|
#include "native_mate/arguments.h"
|
||||||
|
#include "native_mate/callback.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
#include "native_mate/object_template_builder.h"
|
#include "native_mate/object_template_builder.h"
|
||||||
#include "native_mate/wrappable.h"
|
#include "native_mate/wrappable.h"
|
||||||
@@ -37,6 +41,7 @@ class Archive : public mate::Wrappable {
|
|||||||
return v8::False(isolate);
|
return v8::False(isolate);
|
||||||
mate::Dictionary dict(isolate, v8::Object::New(isolate));
|
mate::Dictionary dict(isolate, v8::Object::New(isolate));
|
||||||
dict.Set("size", info.size);
|
dict.Set("size", info.size);
|
||||||
|
dict.Set("unpacked", info.unpacked);
|
||||||
dict.Set("offset", info.offset);
|
dict.Set("offset", info.offset);
|
||||||
return dict.GetHandle();
|
return dict.GetHandle();
|
||||||
}
|
}
|
||||||
@@ -106,10 +111,33 @@ class Archive : public mate::Wrappable {
|
|||||||
DISALLOW_COPY_AND_ASSIGN(Archive);
|
DISALLOW_COPY_AND_ASSIGN(Archive);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void InitAsarSupport(v8::Isolate* isolate,
|
||||||
|
v8::Handle<v8::Value> process,
|
||||||
|
v8::Handle<v8::Value> require) {
|
||||||
|
// Evaluate asar_init.coffee.
|
||||||
|
v8::Local<v8::Script> asar_init = v8::Script::Compile(v8::String::NewFromUtf8(
|
||||||
|
isolate,
|
||||||
|
node::asar_init_native,
|
||||||
|
v8::String::kNormalString,
|
||||||
|
sizeof(node::asar_init_native) -1));
|
||||||
|
v8::Local<v8::Value> result = asar_init->Run();
|
||||||
|
|
||||||
|
// Initialize asar support.
|
||||||
|
base::Callback<void(v8::Handle<v8::Value>,
|
||||||
|
v8::Handle<v8::Value>,
|
||||||
|
std::string)> init;
|
||||||
|
if (mate::ConvertFromV8(isolate, result, &init)) {
|
||||||
|
init.Run(process,
|
||||||
|
require,
|
||||||
|
std::string(node::asar_native, sizeof(node::asar_native) - 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
||||||
v8::Handle<v8::Context> context, void* priv) {
|
v8::Handle<v8::Context> context, void* priv) {
|
||||||
mate::Dictionary dict(context->GetIsolate(), exports);
|
mate::Dictionary dict(context->GetIsolate(), exports);
|
||||||
dict.SetMethod("createArchive", &Archive::Create);
|
dict.SetMethod("createArchive", &Archive::Create);
|
||||||
|
dict.SetMethod("initAsarSupport", &InitAsarSupport);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|||||||
@@ -5,10 +5,13 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "atom/common/native_mate_converters/image_converter.h"
|
||||||
#include "atom/common/native_mate_converters/string16_converter.h"
|
#include "atom/common/native_mate_converters/string16_converter.h"
|
||||||
#include "native_mate/dictionary.h"
|
#include "native_mate/dictionary.h"
|
||||||
|
#include "third_party/skia/include/core/SkBitmap.h"
|
||||||
#include "ui/base/clipboard/clipboard.h"
|
#include "ui/base/clipboard/clipboard.h"
|
||||||
#include "ui/base/clipboard/scoped_clipboard_writer.h"
|
#include "ui/base/clipboard/scoped_clipboard_writer.h"
|
||||||
|
#include "ui/gfx/image/image.h"
|
||||||
|
|
||||||
#include "atom/common/node_includes.h"
|
#include "atom/common/node_includes.h"
|
||||||
|
|
||||||
@@ -16,8 +19,7 @@ namespace mate {
|
|||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct Converter<ui::ClipboardType> {
|
struct Converter<ui::ClipboardType> {
|
||||||
static bool FromV8(v8::Isolate* isolate,
|
static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val,
|
||||||
v8::Handle<v8::Value> val,
|
|
||||||
ui::ClipboardType* out) {
|
ui::ClipboardType* out) {
|
||||||
std::string type;
|
std::string type;
|
||||||
if (!Converter<std::string>::FromV8(isolate, val, &type))
|
if (!Converter<std::string>::FromV8(isolate, val, &type))
|
||||||
@@ -62,6 +64,16 @@ void WriteText(const base::string16& text, ui::ClipboardType type) {
|
|||||||
writer.WriteText(text);
|
writer.WriteText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gfx::Image ReadImage(ui::ClipboardType type) {
|
||||||
|
SkBitmap bitmap = ui::Clipboard::GetForCurrentThread()->ReadImage(type);
|
||||||
|
return gfx::Image::CreateFrom1xBitmap(bitmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WriteImage(const gfx::Image& image, ui::ClipboardType type) {
|
||||||
|
ui::ScopedClipboardWriter writer(type);
|
||||||
|
writer.WriteImage(image.AsBitmap());
|
||||||
|
}
|
||||||
|
|
||||||
void Clear(ui::ClipboardType type) {
|
void Clear(ui::ClipboardType type) {
|
||||||
ui::Clipboard::GetForCurrentThread()->Clear(type);
|
ui::Clipboard::GetForCurrentThread()->Clear(type);
|
||||||
}
|
}
|
||||||
@@ -73,6 +85,8 @@ void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
|||||||
dict.SetMethod("_read", &Read);
|
dict.SetMethod("_read", &Read);
|
||||||
dict.SetMethod("_readText", &ReadText);
|
dict.SetMethod("_readText", &ReadText);
|
||||||
dict.SetMethod("_writeText", &WriteText);
|
dict.SetMethod("_writeText", &WriteText);
|
||||||
|
dict.SetMethod("_readImage", &ReadImage);
|
||||||
|
dict.SetMethod("_writeImage", &WriteImage);
|
||||||
dict.SetMethod("_clear", &Clear);
|
dict.SetMethod("_clear", &Clear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
266
atom/common/api/atom_api_native_image.cc
Normal file
266
atom/common/api/atom_api_native_image.cc
Normal file
@@ -0,0 +1,266 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/common/api/atom_api_native_image.h"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "atom/common/asar/asar_util.h"
|
||||||
|
#include "atom/common/native_mate_converters/file_path_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/gfx_converter.h"
|
||||||
|
#include "atom/common/native_mate_converters/gurl_converter.h"
|
||||||
|
#include "base/base64.h"
|
||||||
|
#include "base/strings/string_util.h"
|
||||||
|
#include "native_mate/dictionary.h"
|
||||||
|
#include "native_mate/object_template_builder.h"
|
||||||
|
#include "net/base/data_url.h"
|
||||||
|
#include "ui/base/layout.h"
|
||||||
|
#include "ui/gfx/codec/jpeg_codec.h"
|
||||||
|
#include "ui/gfx/codec/png_codec.h"
|
||||||
|
#include "ui/gfx/geometry/size.h"
|
||||||
|
#include "ui/gfx/image/image_skia.h"
|
||||||
|
#include "ui/gfx/image/image_util.h"
|
||||||
|
|
||||||
|
#include "atom/common/node_includes.h"
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
struct ScaleFactorPair {
|
||||||
|
const char* name;
|
||||||
|
float scale;
|
||||||
|
};
|
||||||
|
|
||||||
|
ScaleFactorPair kScaleFactorPairs[] = {
|
||||||
|
// The "@2x" is put as first one to make scale matching faster.
|
||||||
|
{ "@2x" , 2.0f },
|
||||||
|
{ "@3x" , 3.0f },
|
||||||
|
{ "@1x" , 1.0f },
|
||||||
|
{ "@4x" , 4.0f },
|
||||||
|
{ "@5x" , 5.0f },
|
||||||
|
{ "@1.25x" , 1.25f },
|
||||||
|
{ "@1.33x" , 1.33f },
|
||||||
|
{ "@1.4x" , 1.4f },
|
||||||
|
{ "@1.5x" , 1.5f },
|
||||||
|
{ "@1.8x" , 1.8f },
|
||||||
|
{ "@2.5x" , 2.5f },
|
||||||
|
};
|
||||||
|
|
||||||
|
float GetScaleFactorFromPath(const base::FilePath& path) {
|
||||||
|
std::string filename(path.BaseName().RemoveExtension().AsUTF8Unsafe());
|
||||||
|
|
||||||
|
// We don't try to convert string to float here because it is very very
|
||||||
|
// expensive.
|
||||||
|
for (unsigned i = 0; i < arraysize(kScaleFactorPairs); ++i) {
|
||||||
|
if (EndsWith(filename, kScaleFactorPairs[i].name, true))
|
||||||
|
return kScaleFactorPairs[i].scale;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddImageSkiaRep(gfx::ImageSkia* image,
|
||||||
|
const unsigned char* data,
|
||||||
|
size_t size,
|
||||||
|
double scale_factor) {
|
||||||
|
scoped_ptr<SkBitmap> decoded(new SkBitmap());
|
||||||
|
|
||||||
|
// Try PNG first.
|
||||||
|
if (!gfx::PNGCodec::Decode(data, size, decoded.get()))
|
||||||
|
// Try JPEG.
|
||||||
|
decoded.reset(gfx::JPEGCodec::Decode(data, size));
|
||||||
|
|
||||||
|
if (!decoded)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
image->AddRepresentation(gfx::ImageSkiaRep(*decoded.release(), scale_factor));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool AddImageSkiaRep(gfx::ImageSkia* image,
|
||||||
|
const base::FilePath& path,
|
||||||
|
double scale_factor) {
|
||||||
|
std::string file_contents;
|
||||||
|
if (!asar::ReadFileToString(path, &file_contents))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const unsigned char* data =
|
||||||
|
reinterpret_cast<const unsigned char*>(file_contents.data());
|
||||||
|
size_t size = file_contents.size();
|
||||||
|
return AddImageSkiaRep(image, data, size, scale_factor);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PopulateImageSkiaRepsFromPath(gfx::ImageSkia* image,
|
||||||
|
const base::FilePath& path) {
|
||||||
|
bool succeed = false;
|
||||||
|
std::string filename(path.BaseName().RemoveExtension().AsUTF8Unsafe());
|
||||||
|
if (MatchPattern(filename, "*@*x"))
|
||||||
|
// Don't search for other representations if the DPI has been specified.
|
||||||
|
return AddImageSkiaRep(image, path, GetScaleFactorFromPath(path));
|
||||||
|
else
|
||||||
|
succeed |= AddImageSkiaRep(image, path, 1.0f);
|
||||||
|
|
||||||
|
for (const ScaleFactorPair& pair : kScaleFactorPairs)
|
||||||
|
succeed |= AddImageSkiaRep(image,
|
||||||
|
path.InsertBeforeExtensionASCII(pair.name),
|
||||||
|
pair.scale);
|
||||||
|
return succeed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(OS_MACOSX)
|
||||||
|
bool IsTemplateImage(const base::FilePath& path) {
|
||||||
|
return (MatchPattern(path.value(), "*Template.*") ||
|
||||||
|
MatchPattern(path.value(), "*Template@*x.*"));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
v8::Persistent<v8::ObjectTemplate> template_;
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
NativeImage::NativeImage() {}
|
||||||
|
|
||||||
|
NativeImage::NativeImage(const gfx::Image& image) : image_(image) {}
|
||||||
|
|
||||||
|
NativeImage::~NativeImage() {}
|
||||||
|
|
||||||
|
mate::ObjectTemplateBuilder NativeImage::GetObjectTemplateBuilder(
|
||||||
|
v8::Isolate* isolate) {
|
||||||
|
if (template_.IsEmpty())
|
||||||
|
template_.Reset(isolate, mate::ObjectTemplateBuilder(isolate)
|
||||||
|
.SetMethod("toPng", &NativeImage::ToPNG)
|
||||||
|
.SetMethod("toJpeg", &NativeImage::ToJPEG)
|
||||||
|
.SetMethod("toDataUrl", &NativeImage::ToDataURL)
|
||||||
|
.SetMethod("isEmpty", &NativeImage::IsEmpty)
|
||||||
|
.SetMethod("getSize", &NativeImage::GetSize)
|
||||||
|
.Build());
|
||||||
|
|
||||||
|
return mate::ObjectTemplateBuilder(
|
||||||
|
isolate, v8::Local<v8::ObjectTemplate>::New(isolate, template_));
|
||||||
|
}
|
||||||
|
|
||||||
|
v8::Handle<v8::Value> NativeImage::ToPNG(v8::Isolate* isolate) {
|
||||||
|
scoped_refptr<base::RefCountedMemory> png = image_.As1xPNGBytes();
|
||||||
|
return node::Buffer::New(isolate,
|
||||||
|
reinterpret_cast<const char*>(png->front()),
|
||||||
|
png->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
v8::Handle<v8::Value> NativeImage::ToJPEG(v8::Isolate* isolate, int quality) {
|
||||||
|
std::vector<unsigned char> output;
|
||||||
|
gfx::JPEG1xEncodedDataFromImage(image_, quality, &output);
|
||||||
|
return node::Buffer::New(isolate,
|
||||||
|
reinterpret_cast<const char*>(&output.front()),
|
||||||
|
output.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string NativeImage::ToDataURL() {
|
||||||
|
scoped_refptr<base::RefCountedMemory> png = image_.As1xPNGBytes();
|
||||||
|
std::string data_url;
|
||||||
|
data_url.insert(data_url.end(), png->front(), png->front() + png->size());
|
||||||
|
base::Base64Encode(data_url, &data_url);
|
||||||
|
data_url.insert(0, "data:image/png;base64,");
|
||||||
|
return data_url;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NativeImage::IsEmpty() {
|
||||||
|
return image_.IsEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::Size NativeImage::GetSize() {
|
||||||
|
return image_.Size();
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::CreateEmpty(v8::Isolate* isolate) {
|
||||||
|
return mate::CreateHandle(isolate, new NativeImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::Create(
|
||||||
|
v8::Isolate* isolate, const gfx::Image& image) {
|
||||||
|
return mate::CreateHandle(isolate, new NativeImage(image));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::CreateFromPNG(
|
||||||
|
v8::Isolate* isolate, const char* buffer, size_t length) {
|
||||||
|
gfx::Image image = gfx::Image::CreateFrom1xPNGBytes(
|
||||||
|
reinterpret_cast<const unsigned char*>(buffer), length);
|
||||||
|
return Create(isolate, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::CreateFromJPEG(
|
||||||
|
v8::Isolate* isolate, const char* buffer, size_t length) {
|
||||||
|
gfx::Image image = gfx::ImageFrom1xJPEGEncodedData(
|
||||||
|
reinterpret_cast<const unsigned char*>(buffer), length);
|
||||||
|
return Create(isolate, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::CreateFromPath(
|
||||||
|
v8::Isolate* isolate, const base::FilePath& path) {
|
||||||
|
gfx::ImageSkia image_skia;
|
||||||
|
PopulateImageSkiaRepsFromPath(&image_skia, path);
|
||||||
|
gfx::Image image(image_skia);
|
||||||
|
#if defined(OS_MACOSX)
|
||||||
|
if (IsTemplateImage(path))
|
||||||
|
MakeTemplateImage(&image);
|
||||||
|
#endif
|
||||||
|
return Create(isolate, image);
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::CreateFromBuffer(
|
||||||
|
mate::Arguments* args, v8::Handle<v8::Value> buffer) {
|
||||||
|
double scale_factor = 1.;
|
||||||
|
args->GetNext(&scale_factor);
|
||||||
|
|
||||||
|
gfx::ImageSkia image_skia;
|
||||||
|
AddImageSkiaRep(&image_skia,
|
||||||
|
reinterpret_cast<unsigned char*>(node::Buffer::Data(buffer)),
|
||||||
|
node::Buffer::Length(buffer),
|
||||||
|
scale_factor);
|
||||||
|
return Create(args->isolate(), gfx::Image(image_skia));
|
||||||
|
}
|
||||||
|
|
||||||
|
// static
|
||||||
|
mate::Handle<NativeImage> NativeImage::CreateFromDataURL(
|
||||||
|
v8::Isolate* isolate, const GURL& url) {
|
||||||
|
std::string mime_type, charset, data;
|
||||||
|
if (net::DataURL::Parse(url, &mime_type, &charset, &data)) {
|
||||||
|
if (mime_type == "image/png")
|
||||||
|
return CreateFromPNG(isolate, data.c_str(), data.size());
|
||||||
|
else if (mime_type == "image/jpeg")
|
||||||
|
return CreateFromJPEG(isolate, data.c_str(), data.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
return CreateEmpty(isolate);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace api
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
|
||||||
|
v8::Handle<v8::Context> context, void* priv) {
|
||||||
|
mate::Dictionary dict(context->GetIsolate(), exports);
|
||||||
|
dict.SetMethod("createEmpty", &atom::api::NativeImage::CreateEmpty);
|
||||||
|
dict.SetMethod("createFromPath", &atom::api::NativeImage::CreateFromPath);
|
||||||
|
dict.SetMethod("createFromBuffer", &atom::api::NativeImage::CreateFromBuffer);
|
||||||
|
dict.SetMethod("createFromDataUrl",
|
||||||
|
&atom::api::NativeImage::CreateFromDataURL);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_common_native_image, Initialize)
|
||||||
82
atom/common/api/atom_api_native_image.h
Normal file
82
atom/common/api/atom_api_native_image.h
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef ATOM_COMMON_API_ATOM_API_NATIVE_IMAGE_H_
|
||||||
|
#define ATOM_COMMON_API_ATOM_API_NATIVE_IMAGE_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "native_mate/handle.h"
|
||||||
|
#include "native_mate/wrappable.h"
|
||||||
|
#include "ui/gfx/image/image.h"
|
||||||
|
|
||||||
|
class GURL;
|
||||||
|
|
||||||
|
namespace base {
|
||||||
|
class FilePath;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace gfx {
|
||||||
|
class Size;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace mate {
|
||||||
|
class Arguments;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
|
||||||
|
class NativeImage : public mate::Wrappable {
|
||||||
|
public:
|
||||||
|
static mate::Handle<NativeImage> CreateEmpty(v8::Isolate* isolate);
|
||||||
|
static mate::Handle<NativeImage> Create(
|
||||||
|
v8::Isolate* isolate, const gfx::Image& image);
|
||||||
|
static mate::Handle<NativeImage> CreateFromPNG(
|
||||||
|
v8::Isolate* isolate, const char* buffer, size_t length);
|
||||||
|
static mate::Handle<NativeImage> CreateFromJPEG(
|
||||||
|
v8::Isolate* isolate, const char* buffer, size_t length);
|
||||||
|
static mate::Handle<NativeImage> CreateFromPath(
|
||||||
|
v8::Isolate* isolate, const base::FilePath& path);
|
||||||
|
static mate::Handle<NativeImage> CreateFromBuffer(
|
||||||
|
mate::Arguments* args, v8::Handle<v8::Value> buffer);
|
||||||
|
static mate::Handle<NativeImage> CreateFromDataURL(
|
||||||
|
v8::Isolate* isolate, const GURL& url);
|
||||||
|
|
||||||
|
// The default constructor should only be used by image_converter.cc.
|
||||||
|
NativeImage();
|
||||||
|
|
||||||
|
const gfx::Image& image() const { return image_; }
|
||||||
|
|
||||||
|
protected:
|
||||||
|
explicit NativeImage(const gfx::Image& image);
|
||||||
|
virtual ~NativeImage();
|
||||||
|
|
||||||
|
// mate::Wrappable:
|
||||||
|
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
|
||||||
|
v8::Isolate* isolate) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
#if defined(OS_MACOSX)
|
||||||
|
// Mark the image as template image if possible.
|
||||||
|
static void MakeTemplateImage(gfx::Image* image);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
v8::Handle<v8::Value> ToPNG(v8::Isolate* isolate);
|
||||||
|
v8::Handle<v8::Value> ToJPEG(v8::Isolate* isolate, int quality);
|
||||||
|
std::string ToDataURL();
|
||||||
|
bool IsEmpty();
|
||||||
|
gfx::Size GetSize();
|
||||||
|
|
||||||
|
gfx::Image image_;
|
||||||
|
|
||||||
|
DISALLOW_COPY_AND_ASSIGN(NativeImage);
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace api
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
|
|
||||||
|
#endif // ATOM_COMMON_API_ATOM_API_NATIVE_IMAGE_H_
|
||||||
20
atom/common/api/atom_api_native_image_mac.mm
Normal file
20
atom/common/api/atom_api_native_image_mac.mm
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
// Copyright (c) 2015 GitHub, Inc.
|
||||||
|
// Use of this source code is governed by the MIT license that can be
|
||||||
|
// found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "atom/common/api/atom_api_native_image.h"
|
||||||
|
|
||||||
|
#import <Cocoa/Cocoa.h>
|
||||||
|
|
||||||
|
namespace atom {
|
||||||
|
|
||||||
|
namespace api {
|
||||||
|
|
||||||
|
// static
|
||||||
|
void NativeImage::MakeTemplateImage(gfx::Image* image) {
|
||||||
|
[image->AsNSImage() setTemplate:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace api
|
||||||
|
|
||||||
|
} // namespace atom
|
||||||
@@ -58,6 +58,9 @@ void AtomBindings::BindTo(v8::Isolate* isolate,
|
|||||||
dict.SetMethod("activateUvLoop",
|
dict.SetMethod("activateUvLoop",
|
||||||
base::Bind(&AtomBindings::ActivateUVLoop, base::Unretained(this)));
|
base::Bind(&AtomBindings::ActivateUVLoop, base::Unretained(this)));
|
||||||
|
|
||||||
|
// Do not warn about deprecated APIs.
|
||||||
|
dict.Set("noDeprecation", true);
|
||||||
|
|
||||||
mate::Dictionary versions;
|
mate::Dictionary versions;
|
||||||
if (dict.Get("versions", &versions)) {
|
if (dict.Get("versions", &versions)) {
|
||||||
versions.Set("atom-shell", ATOM_VERSION_STRING);
|
versions.Set("atom-shell", ATOM_VERSION_STRING);
|
||||||
|
|||||||
@@ -1,12 +1,9 @@
|
|||||||
if process.platform is 'linux' and process.type is 'renderer'
|
binding = process.atomBinding 'clipboard'
|
||||||
# On Linux we could not access clipboard in renderer process.
|
module.exports =
|
||||||
module.exports = require('remote').require 'clipboard'
|
has: (format, type='standard') -> binding._has format, type
|
||||||
else
|
read: (format, type='standard') -> binding._read format, type
|
||||||
binding = process.atomBinding 'clipboard'
|
readText: (type='standard') -> binding._readText type
|
||||||
|
writeText: (text, type='standard') -> binding._writeText text, type
|
||||||
module.exports =
|
readImage: (type='standard') -> binding._readImage type
|
||||||
has: (format, type='standard') -> binding._has format, type
|
writeImage: (image, type='standard') -> binding._writeImage image, type
|
||||||
read: (format, type='standard') -> binding._read format, type
|
clear: (type='standard') -> binding._clear type
|
||||||
readText: (type='standard') -> binding._readText type
|
|
||||||
writeText: (text, type='standard') -> binding._writeText text, type
|
|
||||||
clear: (type='standard') -> binding._clear type
|
|
||||||
|
|||||||
1
atom/common/api/lib/native-image.coffee
Normal file
1
atom/common/api/lib/native-image.coffee
Normal file
@@ -0,0 +1 @@
|
|||||||
|
module.exports = process.atomBinding 'native_image'
|
||||||
@@ -2,7 +2,7 @@ vm = require 'vm'
|
|||||||
|
|
||||||
# Execute the 'fs.js' and pass the 'exports' to it.
|
# Execute the 'fs.js' and pass the 'exports' to it.
|
||||||
source = '(function (exports, require, module, __filename, __dirname) { ' +
|
source = '(function (exports, require, module, __filename, __dirname) { ' +
|
||||||
process.binding('natives').fs +
|
process.binding('natives').originalFs +
|
||||||
'\n});'
|
'\n});'
|
||||||
fn = vm.runInThisContext source, { filename: 'fs.js' }
|
fn = vm.runInThisContext source, { filename: 'fs.js' }
|
||||||
fn exports, require, module
|
fn exports, require, module
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user