Compare commits

...

610 Commits

Author SHA1 Message Date
Cheng Zhao
96c886a8f0 Fix upload.py for the rename 2015-04-17 15:53:46 +08:00
Cheng Zhao
0033240c1f Bump v0.24.0 2015-04-17 15:30:17 +08:00
Cheng Zhao
d0d6512330 win: Update the rc file
We should find a way to generate from atom.gyp.
2015-04-17 15:29:47 +08:00
Cheng Zhao
d535305ff1 Use electron in release title 2015-04-17 15:26:45 +08:00
Cheng Zhao
cd0aa4a956 Merge pull request #1389 from atom/rename-to-electron
Rename to electron
2015-04-17 15:22:07 +08:00
Cheng Zhao
0bab50ed80 Fix typo 2015-04-17 15:10:48 +08:00
Cheng Zhao
eb6fa46041 Use product_name for generating zip archives 2015-04-17 12:13:35 +08:00
Cheng Zhao
b0b6747456 docs: Update the rebranding guide 2015-04-17 11:59:40 +08:00
Kevin Sawicki
2f9de5a0e9 Merge pull request #1430 from simurai/rename-to-electron-icon
Electron icon
2015-04-16 09:15:11 -07:00
simurai
95250f4940 Replace icons 2015-04-17 00:38:14 +09:00
Cheng Zhao
1f1cb12d46 docs: Build for 64bit target on Windows 2015-04-16 14:50:46 +08:00
Cheng Zhao
d2682233fd docs: Atom Shell => Electron 2015-04-16 11:31:12 +08:00
Cheng Zhao
d878bd33d7 docs: Update links in README
The npm instructions are removed for now, will add it back when we had
electron in npm registry.
2015-04-16 11:10:24 +08:00
Cheng Zhao
76316e5e65 Forgot to set default version in crash reporter 2015-04-14 17:37:22 +08:00
Cheng Zhao
14e05c6d68 mac: Remove "Atom"s from default menu 2015-04-14 17:27:04 +08:00
Cheng Zhao
49c82b3b93 atom => electron in atom.gyp 2015-04-14 17:23:31 +08:00
Cheng Zhao
c7468278df Change the window class names 2015-04-14 16:18:57 +08:00
Cheng Zhao
e04c58f398 mac: Generate Info.plist from gyp variables 2015-04-14 16:09:34 +08:00
Cheng Zhao
1200d641b8 Change the names in specs 2015-04-14 15:59:45 +08:00
Cheng Zhao
2d8d328f02 Rename hard-coded application names in code 2015-04-14 15:55:41 +08:00
Cheng Zhao
c6c305a827 Don't hard-code product name in crash-repoter 2015-04-14 15:39:48 +08:00
Cheng Zhao
b86f149512 Set process.versions['electron'] 2015-04-14 14:18:20 +08:00
Cheng Zhao
ecc14dd023 mac: Avoid making frameworks_path for twice 2015-04-14 14:15:53 +08:00
Cheng Zhao
c20dc06c96 PRODUCT_NAME => ATOM_PRODUCT_NAME 2015-04-14 14:13:03 +08:00
Cheng Zhao
a72c7b38a5 Don't hard code exec path in child_process.fork 2015-04-14 14:05:30 +08:00
Cheng Zhao
4353c6d402 mac: Allow modifying helper app's name 2015-04-14 13:51:08 +08:00
Cheng Zhao
29338e2fa4 Lines should have <= 80 columns 2015-04-13 20:10:51 +08:00
Cheng Zhao
c10b9ea511 Merge pull request #1411 from theojulienne/accessibility-support
mac: Dynamically enable accessibility based on VoiceOver status
2015-04-13 19:57:32 +08:00
Cheng Zhao
fc7bddf0d9 Merge pull request #1409 from deepak1556/webcontents_geturl_patch
webContents: fix dereferencing null in getURL
2015-04-13 17:07:36 +08:00
Cheng Zhao
e28fc190f2 Merge pull request #1382 from deepak1556/webcontents_patch
webContents: workaround reloadIgnoringcache without breaking node integration
2015-04-13 14:54:06 +08:00
Cheng Zhao
eddb23d56b Merge pull request #1387 from deepak1556/shell_patch
shell: fix regression for moveItemToTrash on mac
2015-04-13 14:51:59 +08:00
deepak1556
a3f630e55c webContents: workaround reloadIgnoringcache without breaking node integration 2015-04-13 11:03:16 +05:30
deepak1556
175f397173 shell: fix regression for moveItemToTrash on mac 2015-04-13 10:57:58 +05:30
Cheng Zhao
a4c01b2336 Remove the did-get-response-details spec
It is not reliable to use external http resource for specs, should setup
our own http server.
2015-04-13 12:24:14 +08:00
Cheng Zhao
64f9f7e906 Merge pull request #1386 from deepak1556/web_contents_patch
webContents: event to detect status of requested resource
2015-04-13 11:59:37 +08:00
Cheng Zhao
91c9f590dd Remove the NativeImage::MakeTemplateImage method
Is duplicate with SetTemplateImage.
2015-04-13 11:53:24 +08:00
Cheng Zhao
f11988a354 Merge pull request #1383 from deepak1556/nativeimage_patch
nativeImage: adding setTemplateImage method
2015-04-13 11:47:58 +08:00
Cheng Zhao
6137c2317d Improves #1373
* Don't pollute Menu API.
* Add examples in docs.
* Moves the docs from menu-item.md to menu.md.
2015-04-13 11:22:33 +08:00
Cheng Zhao
7a97488023 Merge pull request #1373 from FoldingText/position-menu-items
Add position attribute for menu items
2015-04-13 09:46:13 +08:00
Theo Julienne
ddfd2bc4be [mac] Dynamically enable accessibility based on VoiceOver status 2015-04-12 10:44:27 -07:00
Cheng Zhao
74be99de31 Use atom.gyp to generate filenames in upload-windows-pdb.py 2015-04-12 22:26:00 +08:00
Cheng Zhao
7255962bd3 Fix uploading index.json under OS X 2015-04-12 22:24:07 +08:00
Cheng Zhao
b413acddb8 Update tmp dir prefix 2015-04-12 22:10:46 +08:00
Cheng Zhao
6ba57dcfa3 Use atom.gyp to generate paths in test.py 2015-04-12 22:10:02 +08:00
Cheng Zhao
f8d64ef1e4 Use atom.gyp to generate filenamse in create-dist.py 2015-04-12 22:06:06 +08:00
Cheng Zhao
af37af3e1c Rename some functions in bootstrap.py 2015-04-12 22:04:48 +08:00
Cheng Zhao
4e7ed50162 Use "project_name" in atom.gyp as default target in build.py 2015-04-12 21:52:56 +08:00
Cheng Zhao
43fe82e1e5 Merge branch 'master' into rename-to-electron 2015-04-12 21:49:08 +08:00
Cheng Zhao
159e013ce5 docs: Don't mention apm
It causes confusions, and it is not convineint any more, see #793.
2015-04-12 21:46:50 +08:00
Cheng Zhao
61100c9c0b No need to store apm's version in index.json 2015-04-12 21:42:11 +08:00
Cheng Zhao
1027fe9991 linux: Fix wrong off_t type under 32bit arch 2015-04-12 08:16:17 +00:00
Cheng Zhao
f979847e06 linux: Upgrade brightray to fix linking problem 2015-04-12 07:56:53 +00:00
Cheng Zhao
26ac617692 win: vccorlib120.dll is not needed anymore 2015-04-12 15:27:28 +08:00
Cheng Zhao
d0f2da944f Add missing 'v' in some places 2015-04-12 14:23:48 +08:00
Cheng Zhao
64aaa2bcb1 Merge pull request #1405 from atom/win_64bit
Add 64bit Windows build
2015-04-12 13:46:05 +08:00
Robo
847ae5abe4 webContents: fix dereferencing null in getURL 2015-04-12 10:51:05 +05:30
Cheng Zhao
d19a1063d5 Fix pylint warnings 2015-04-12 13:15:11 +08:00
Cheng Zhao
a724d6d684 Bump v0.23.0 2015-04-12 12:59:04 +08:00
Cheng Zhao
b53123d5e7 Add clean script 2015-04-12 12:55:38 +08:00
Cheng Zhao
e5a7921873 Don't push when bumping version 2015-04-12 12:52:07 +08:00
Cheng Zhao
b9b7928e7d Move version info to atom.gyp and discard apm dependency
Fixes #1408.
Closes #1359.
2015-04-12 12:45:18 +08:00
Cheng Zhao
6b1dd0d413 s3_config should be in lib.config 2015-04-12 12:00:02 +08:00
Cheng Zhao
aa835ad38a Upload index.json when publishing release 2015-04-12 11:36:55 +08:00
Cheng Zhao
6b1f2215b2 win: Do not copy vc runtime dlls
We now statically link with vc runtime.
2015-04-12 11:23:41 +08:00
Cheng Zhao
f64a3dd349 Add win32-ia32 in index.json 2015-04-12 00:02:45 +08:00
Cheng Zhao
8a418ba347 Upload SHASUMS.txt when publishing release 2015-04-12 00:01:10 +08:00
Cheng Zhao
c30d806837 win: Upload node.lib of x64 build 2015-04-11 23:40:10 +08:00
Cheng Zhao
fabaa2af94 Upgrade breakpad and brightray 2015-04-11 23:28:59 +08:00
Cheng Zhao
03bdd8814e Fix typo 2015-04-11 23:03:54 +08:00
Cheng Zhao
b5450801d0 win: Upload node.dll.pdb 2015-04-11 22:15:50 +08:00
Cheng Zhao
9e7c2a6fe4 spec: Suppress crash-reporter test on 64bit Windows 2015-04-11 20:15:31 +08:00
Cheng Zhao
aa07d5e557 win: Fix linking problem on x64 2015-04-11 19:51:11 +08:00
Cheng Zhao
f32cd5a35e win: Suppress size loss warnings 2015-04-11 19:17:03 +08:00
Cheng Zhao
6175380bc0 Explicit set default arch 2015-04-11 18:30:01 +08:00
Cheng Zhao
de016e72a5 win: Build with the arch chosen by user 2015-04-11 18:07:22 +08:00
Cheng Zhao
1a6832d849 TARGET_PLATFORM => PLATFORM
TARGET_PLATFORM is quite misleading since it is actually host platform.
2015-04-11 17:30:52 +08:00
Cheng Zhao
ca50cbb5ff Allow specifying the arch of libchromiumcontent to download 2015-04-11 17:29:21 +08:00
Cheng Zhao
252ac465c5 Merge pull request #1384 from atom/component_build
Links with Chromium directly instead of linking its shared library
2015-04-11 14:12:16 +08:00
Cheng Zhao
8e9e05f062 Merge pull request #1402 from Tribex/patch-1
Fix spelling and grammar errors in build-system-overview.md.
2015-04-11 13:49:47 +08:00
Cheng Zhao
3a59cd3b72 Upgrade brightray 2015-04-11 13:38:16 +08:00
Cheng Zhao
f997dbb01d Remove some duplicated symbols 2015-04-11 13:07:19 +08:00
Joshua Bemenderfer
4defde0b61 Fix spelling and grammar errors.
Particularly in the spelling of the bootstrap and build script names. That threw me off a bit.
2015-04-11 12:46:13 +08:00
Cheng Zhao
ab94c3f49e docs: Add "Build system overview" chapter 2015-04-11 12:11:57 +08:00
Cheng Zhao
21ca4de1af docs: Output dir is changed 2015-04-10 21:56:02 +08:00
Cheng Zhao
dfa6fedaed Don't link with shared_librayr of boringssl in Release mode 2015-04-10 19:00:06 +08:00
Cheng Zhao
88b6a60c29 Hide symbols of openssl
So we will avoid conflicts with boringssl.
2015-04-10 17:56:46 +08:00
Cheng Zhao
a13343800a win: Generate node.lib from node.dll 2015-04-10 15:45:45 +08:00
Cheng Zhao
1f66006c93 win: Fix link errors caused by libicu 2015-04-10 15:35:25 +08:00
Cheng Zhao
3a5bb588e5 No more need to reference node's symbols 2015-04-10 15:20:45 +08:00
Cheng Zhao
8894cfab50 mac: Fix libicu symbols not included 2015-04-10 13:47:21 +08:00
Cheng Zhao
8500a53c23 mac: Improve how we find .dSYM bundle 2015-04-10 13:24:05 +08:00
Cheng Zhao
5f2fe27b65 linux: Fix linking with node and v8 2015-04-10 12:22:18 +08:00
Cheng Zhao
a400bb5997 Build node as shared library 2015-04-09 21:16:22 +08:00
Cheng Zhao
ae9d90eaa6 Upgrade libchromiumcontent for win32 fix 2015-04-09 16:00:29 +08:00
Cheng Zhao
dcae08c128 win: Move common configs to gyp 2015-04-09 14:40:31 +08:00
Cheng Zhao
2d6b6e4578 win: No more chromiumcontent.dll.pdb 2015-04-09 14:10:28 +08:00
Cheng Zhao
97c76c19c4 win: Register msdia80.dll in dump-symbols.py 2015-04-09 13:21:33 +08:00
Cheng Zhao
78ed9b1b23 linux: Move '-g' to brightray 2015-04-09 12:06:02 +08:00
Cheng Zhao
52b875f199 mac: Move strip flags to brightray 2015-04-09 11:30:40 +08:00
Cheng Zhao
b947cb5057 Move clang flag to brightray 2015-04-09 10:52:15 +08:00
Cheng Zhao
b6af1cf93c Remove appveyor.yml
I don't think we will use it in future.
2015-04-09 10:15:24 +08:00
Cheng Zhao
0a56f34d04 Move filename_rules.gypi to brightray 2015-04-09 10:14:50 +08:00
Cheng Zhao
596f14eca5 Allow testing release build 2015-04-09 10:00:31 +08:00
Cheng Zhao
44d0bceff4 linux: Move some building flags to brightray 2015-04-09 09:59:57 +08:00
Cheng Zhao
b8e38ad14e linux: Strip binaries wen creating distribution 2015-04-09 09:05:51 +08:00
Kevin Sawicki
6615ef1054 Atom Shell -> Electron 2015-04-08 10:16:10 -07:00
Kevin Sawicki
6ca4623ae1 Begin Atom Shell -> Electron rename 2015-04-08 09:50:58 -07:00
Cheng Zhao
0bc5d6438e Fix generating distribution for chromedriver 2015-04-08 22:22:40 +08:00
Cheng Zhao
42dafd47fd Separate symbols generation from building 2015-04-08 22:12:47 +08:00
Cheng Zhao
4bb0ac271b mac: Fix linking error when running chromedriver 2015-04-08 22:05:33 +08:00
deepak1556
15a648a879 webContents: event to detect status of requested resource 2015-04-08 19:14:47 +05:30
Cheng Zhao
565065ed6b Remove unused copy_chromedriver target 2015-04-08 20:16:02 +08:00
Cheng Zhao
f5e6c62418 linux: Fix create distribution for chromedriver 2015-04-08 20:08:27 +08:00
Cheng Zhao
c3f8ef06b6 Ship with correct files in distribution 2015-04-08 19:46:57 +08:00
Cheng Zhao
c2852b5b8c linux: Add some more building requirements 2015-04-08 19:46:37 +08:00
Cheng Zhao
c5b85b23eb Remove linux_clang option
We are always using clang now.
2015-04-08 19:22:02 +08:00
Cheng Zhao
555e06573a Fix pylint warnings 2015-04-08 19:19:40 +08:00
Cheng Zhao
1b3b2cd402 linux: Don't dynamically load libgio
It conflicts with statically linked libgio.
2015-04-08 19:15:48 +08:00
deepak1556
efd294d69d nativeImage: adding setTemplateImage method 2015-04-08 14:39:14 +05:30
Cheng Zhao
f9b5156c2c linux: Fix static linking 2015-04-08 16:46:05 +08:00
Cheng Zhao
5467476173 Don't verbose output in ci 2015-04-08 16:37:12 +08:00
Cheng Zhao
d8fbfe6885 Fix typo 2015-04-08 10:05:06 +08:00
Cheng Zhao
4ce3b407ab Merge pull request #1363 from deepak1556/native_window_mac_patch
nativeWindowMac: check for web_contents before clipping
2015-04-08 09:04:16 +08:00
Kevin Sawicki
d763984b77 Merge pull request #1377 from tommoor/patch-1
Add 'error' event to auto-updater module documentation
2015-04-07 09:40:43 -07:00
Tom Moor
8bd711ea66 Add 'error' event to auto-updater documentation 2015-04-07 09:21:29 -07:00
Cheng Zhao
1a36770286 Only build static_library version of libchromiumcontent in CI 2015-04-07 23:41:42 +08:00
Jesse Grosjean
c8a3c14a8c Add position attribute for menu items
This commit adds a position attribute for menu items defined in menu
templates. When the final menu is built the position attribute is used
to determine menu item positions in a similar design to how Eclipse
positions menu items.
2015-04-07 11:14:28 -04:00
Cheng Zhao
105aec4ea9 Upgrade libchromiumcontent 2015-04-07 15:12:20 +00:00
Cheng Zhao
0cc36377a5 win: Ignore duplicate symbols between BoringSSL and OpenSSL 2015-04-07 22:56:21 +08:00
Cheng Zhao
9a458785b6 Simplify how we build node.lib 2015-04-07 18:37:05 +08:00
Cheng Zhao
21014614fc Link boringssl as shared_library 2015-04-07 18:26:56 +08:00
Cheng Zhao
0890ea716f win: Fix a compiler warning in Node 2015-04-07 14:03:16 +08:00
Cheng Zhao
2351c11da4 No more need to ship vc runtime
The release version now static links with vc runtime
2015-04-07 13:51:40 +08:00
Cheng Zhao
0f97bf03fa win: Fix Debug build 2015-04-07 13:50:58 +08:00
Cheng Zhao
2f5090d667 Fix minor typo 2015-04-07 12:36:16 +08:00
Cheng Zhao
f169772031 Link boringssl and node together in one binary 2015-04-07 12:28:57 +08:00
Cheng Zhao
fb00c28026 Merge pull request #1356 from deepak1556/web_view_patch
webview: adding page-title-set event
2015-04-07 10:54:07 +08:00
Cheng Zhao
54bb072ae0 Merge pull request #1353 from deepak1556/args_patch
atomMain: initialise uv_setup_args
2015-04-07 09:59:10 +08:00
Cheng Zhao
54f2b3248d Merge pull request #1350 from joshuabenuck/patch-1
Update build-instructions-windows.md
2015-04-07 09:52:38 +08:00
Cheng Zhao
e95ab2ddb8 Merge pull request #1337 from deepak1556/api_devtools_window_patch
browserWindow: adding devtools-focused event
2015-04-07 09:50:31 +08:00
Kevin Sawicki
3ae604ca4e Merge pull request #1358 from LMGTech/master
add `to` in sentence for grammar
2015-04-06 09:04:30 -07:00
deepak1556
1d97c2c8f2 nativeWindowMac: check for web_contents before clipping 2015-04-06 15:22:26 +05:30
Cheng Zhao
e334e6e822 win: Upgrade brightray for linking problem 2015-04-06 16:28:52 +08:00
Cheng Zhao
0dffa0f4bb win: Copy necessary shared libraries 2015-04-06 14:26:06 +08:00
Cheng Zhao
938069a389 win: Fix linking 2015-04-06 14:21:21 +08:00
TJ Krusinski
c98774b3df add to in sentence for grammar
Simply a small grammar improvement.
2015-04-05 16:18:20 -04:00
Cheng Zhao
e64101e31f Upgrade libchromiumcontent to use the static_library build 2015-04-05 22:30:03 +08:00
Cheng Zhao
5ffa22812f Download static_library build of libchromiumcontent 2015-04-05 22:28:51 +08:00
Robo
87af6f9c80 webview: adding page-title-set event 2015-04-05 14:50:42 +05:30
Robo
8e8c5e1846 atomMain: initialise uv_setup_args 2015-04-04 19:20:21 +05:30
Joshua Benuck
0de623693d Update build-instructions-windows.md
In the troubleshooting section, include a recommendation to install the latest Visual Studio update if you run into a fatal internal compiler error while building.
2015-04-03 20:22:50 -07:00
Cheng Zhao
bb7217a58c Move filenames to another gyp file 2015-04-03 14:39:25 +08:00
Cheng Zhao
40c85f2042 Do not download symbols 2015-04-03 14:33:52 +08:00
Cheng Zhao
d3abf64bd2 Strip generate binaries 2015-04-03 12:06:23 +08:00
Cheng Zhao
8b7d875e40 Use "R" and "D" as short names for config 2015-04-03 11:59:14 +08:00
Cheng Zhao
8a91000083 Fix linking node and chromium together 2015-04-03 11:38:04 +08:00
Cheng Zhao
dab9e9be67 Also build with static_library version of libchromiumcontent 2015-04-02 23:03:23 +08:00
Cheng Zhao
ca161e29ce Fix calling our new APIs in patch 2015-04-02 23:02:22 +08:00
Robo
3aefa5f549 browserWindow: adding devtools-focused event 2015-04-02 12:23:57 +05:30
Cheng Zhao
736afb32a0 Link with component build shared libraries 2015-04-02 14:06:23 +08:00
Cheng Zhao
14de7ddea8 Upgrade brightray for component build 2015-04-02 13:46:41 +08:00
Cheng Zhao
5ff9588b48 Merge pull request #1343 from atom/node_lib
Build node as shared library
2015-04-02 13:03:57 +08:00
Cheng Zhao
219a461f78 Fix generating node.lib 2015-04-02 11:06:01 +08:00
Cheng Zhao
e2000c4418 Fix wrong update of node 2015-04-02 10:36:55 +08:00
Cheng Zhao
0a99140b2a Update brightray for #1337 2015-04-02 10:20:32 +08:00
Cheng Zhao
95528f9207 linux: Fix relocation error when compiling as shared library 2015-04-01 23:44:55 +08:00
Cheng Zhao
211e386c89 win: Fix linking errors 2015-04-01 21:33:08 +08:00
Cheng Zhao
2915774644 No more need to reference node's native bindings 2015-04-01 21:07:29 +08:00
Cheng Zhao
cc443f730c Do not need to copy node.dll to PRODUCT_DIR 2015-04-01 20:33:25 +08:00
Cheng Zhao
80c9f864be Ship node.dll 2015-04-01 20:27:36 +08:00
Cheng Zhao
7e49645998 Build node as shared library 2015-04-01 20:26:46 +08:00
Cheng Zhao
761aa0e95c Merge pull request #1342 from atom/iojs-update
⬆️ iojs@1.6.3
2015-04-01 19:17:28 +08:00
Cheng Zhao
2980adfd79 Fix calling js2c 2015-04-01 19:03:50 +08:00
Cheng Zhao
da71175968 ⬆️ iojs@1.6.3 2015-04-01 18:43:09 +08:00
Cheng Zhao
8de1ccb2c0 Merge pull request #1340 from atom/zip_verify_file_exist
Verify whether the file exists before including it in zip
2015-04-01 10:34:51 +08:00
Cheng Zhao
953060e17c Verify whether the file exists before including it in zip 2015-04-01 10:23:17 +08:00
Kevin Sawicki
2612e8fe8e Merge pull request #1339 from evlogii/patch-1
fix link
2015-03-31 18:06:50 -07:00
Evlogiy Sutormin
430a6c2915 fix link 2015-04-01 03:24:39 +03:00
Kevin Sawicki
acd6797a5f Merge pull request #1332 from anhulife/patch-1
modify param description
2015-03-31 09:12:48 -07:00
liang feng
5460b84c60 modify param description 2015-03-30 16:13:11 +08:00
Cheng Zhao
ce3d9f44ff win: Fix compilation error
MSDN said, "These are pre-Win32 error codes and are no longer supported or
defined in any public header file."
2015-03-30 09:55:02 +08:00
Cheng Zhao
c5c686fe8c linux: Fix compilation error 2015-03-29 21:35:40 +08:00
Cheng Zhao
59c95f6a7d Bump v0.22.3 2015-03-29 21:16:42 +08:00
Cheng Zhao
a53bed567e Upgrade brightray to enable content module's webui
Fixes #663.
2015-03-29 21:08:50 +08:00
Cheng Zhao
9b68777b4b Minor fixes of #1309
* Line length should <= 80 cols.
* Add missing "s".
2015-03-29 20:40:02 +08:00
Cheng Zhao
3b1be743ef Merge pull request #1309 from hokein/workspace-visible-api
Add workspace visible APIs
2015-03-29 20:37:07 +08:00
Cheng Zhao
b987656f1f It is not safe to get exit code once the child is reaped
Continues #1311.
2015-03-29 20:32:23 +08:00
Cheng Zhao
e0d0e7651f Merge pull request #1311 from deepak1556/api_shell_patch
shell: return status for moveitemtotrash operation
2015-03-29 20:02:13 +08:00
Cheng Zhao
922def8ce0 Cleanup command line handling code 2015-03-29 19:59:16 +08:00
Cheng Zhao
d9c22396ea Revert "Don't store args as std::string"
This reverts commit 8482575d1f.

There is weird thing happened if we tried to store raw "argv" on Linux.
2015-03-29 19:53:47 +08:00
Cheng Zhao
9f30933d3a Merge pull request #1324 from vprasanth/master
Simplified Mirrors sub-section.
2015-03-29 19:16:59 +08:00
Cheng Zhao
8482575d1f Don't store args as std::string 2015-03-29 19:11:25 +08:00
Cheng Zhao
286ad19771 win: d3dcompiler_46.dll => d3dcompiler_47.dll 2015-03-29 18:51:02 +08:00
Cheng Zhao
27d2dbf375 Merge pull request #1256 from deepak1556/process_arg_patch
implemetation of AtomCommandline to preserve args
2015-03-29 18:47:13 +08:00
Cheng Zhao
657b1cf63a Merge pull request #1327 from atom/d3dcompiler_47
Ship d3dcompiler_47.dll
2015-03-29 18:46:00 +08:00
Cheng Zhao
0477c01fae win: Ship d3dcompiler_47.dll 2015-03-29 18:33:25 +08:00
Cheng Zhao
fdc07dea17 docs: Say more about what is renderer process and main process 2015-03-29 16:02:31 +08:00
Cheng Zhao
85838fbf1a Merge pull request #1313 from ArtskydJ/browser-side-to-main-process
Renamed browser-side to main process
2015-03-29 15:25:56 +08:00
Haojian Wu
0342854e25 Update workspace visible APIs. 2015-03-29 10:01:52 +08:00
Prasanth Vaaheeswaran
8a62f62e50 Simplified Mirrors section. 2015-03-28 18:34:59 -04:00
Robo
bedea89dcf shell: return status for moveItemToTrash on all platforms 2015-03-29 00:47:50 +05:30
deepak1556
399f47ef0f implemetation of AtomCommandline to preserve args 2015-03-28 22:41:00 +05:30
Cheng Zhao
8aae7c4440 Merge pull request #1323 from atom/no-zygote
Disable zygote process on Linux
2015-03-29 00:32:53 +08:00
Cheng Zhao
4663fdb446 Update libchromiumcontent to disable zygote process 2015-03-29 00:14:07 +08:00
Joseph Dykstra
4a508e0e41 reverted incorrect changes 2015-03-27 07:46:26 -05:00
Cheng Zhao
21a09d3ae8 Improve #1317 2015-03-27 16:29:14 +08:00
Cheng Zhao
2505f8b8b2 Merge pull request #1317 from deepak1556/api_window_patch
npapi: warn users loading npapi plugins on unsupported platform
2015-03-27 16:26:03 +08:00
Cheng Zhao
32cd068427 Improve #1307 2015-03-27 16:24:33 +08:00
Cheng Zhao
b52771e729 Merge pull request #1307 from deepak1556/api_windows_patch
providing option to undock devtools from browser-window
2015-03-27 16:19:45 +08:00
deepak1556
69d958b94e providing option to undock devtools from browser-window 2015-03-27 13:32:08 +05:30
Cheng Zhao
b77c03357c docs: BrowserWindow.capturePage nows returns NativeImage 2015-03-27 14:43:29 +08:00
Robo
c677a44688 npapi: warn users loading npapi plugins on unsupported platform 2015-03-27 04:14:01 +05:30
Joseph Dykstra
b6875ad49b Renamed browser-side to main process
renamed a few occurances of "web page" to "renderer"
renamed a few files that had "browser" in their name to "main-process"
note that there are still many occurances of web page.
2015-03-26 10:20:31 -05:00
Haojian Wu
296d5c4515 📝 Add document for workspace visible APIs. 2015-03-26 18:59:24 +08:00
Cheng Zhao
2cdfef286a Merge pull request #1304 from atom/restore-window-state
Restore window state when showing window
2015-03-26 17:05:40 +08:00
Cheng Zhao
83024ea509 views: Restore window state when showing window 2015-03-26 16:43:38 +08:00
Cheng Zhao
0611f9156f docs: Mention the debug symbols, closes #1201 2015-03-26 15:59:07 +08:00
Cheng Zhao
e2bdbae262 Merge pull request #1303 from atom/write-image
Add clipboard.writeImage API
2015-03-26 15:58:08 +08:00
Cheng Zhao
b54e786b09 linux: it is now safe to use clipboard in renderer process 2015-03-26 15:46:08 +08:00
Cheng Zhao
b5bc8c9811 spec: clipboard.readImage() 2015-03-26 15:25:34 +08:00
Haojian Wu
476b61322f Add SetVisibleOnAllWorkspaces/IsVisibleOnAllWorkspaces API.
These two APIs are only available on OS X/Linux platforms.
2015-03-26 14:18:37 +08:00
Cheng Zhao
6f082b630d Add clipboard.writeImage API 2015-03-26 12:54:15 +08:00
Cheng Zhao
0bb7abd7a4 docs: clipboard.readImage/.writeImage 2015-03-26 12:53:48 +08:00
Cheng Zhao
ae5586408f Enable setting only one side of max/min size, fixes #1301 2015-03-26 12:23:38 +08:00
Cheng Zhao
a4342fd5ba Unify how we throw exceptions 2015-03-26 11:34:41 +08:00
Cheng Zhao
1a6677bdc3 Merge pull request #1297 from deepak1556/api_tray_patch
throw when trying to create tray before app is ready
2015-03-26 11:28:54 +08:00
Cheng Zhao
6eee6c181d Improves #1295 2015-03-26 11:27:06 +08:00
Cheng Zhao
5c8f2d4e69 Merge pull request #1295 from deepak1556/app_patch
allow setting loglevel
2015-03-26 11:20:08 +08:00
deepak1556
15f59b54dd allow setting loglevel 2015-03-25 20:53:01 +05:30
deepak1556
e87041bcfc throw when trying to create tray before app is ready 2015-03-25 20:10:01 +05:30
Cheng Zhao
1804466334 Print localizedFailureReason for autoUpdater errors
This is to help solve #1292.
2015-03-25 21:20:07 +08:00
Cheng Zhao
a9301ea1d0 Merge pull request #1290 from deepak1556/protocol_patch
[doc]: fix when to use protocol module
2015-03-25 21:02:49 +08:00
Cheng Zhao
a0770580e9 Merge pull request #1294 from atom/catch-sign
Catches and reports exception thrown from Squirrel
2015-03-25 20:14:07 +08:00
Cheng Zhao
ee71b2044e Catch the exception thrown from Squirrel 2015-03-25 19:59:36 +08:00
Cheng Zhao
665363b356 Use Release build of Squirrel 2015-03-25 19:54:59 +08:00
Cheng Zhao
b68eccf784 docs: "options" is a required parameter in dialog.showMessageBox 2015-03-25 19:20:32 +08:00
Cheng Zhao
62f9c3def0 mac: Don't rely on autorelease to delete window delegate
When quiting while closing window, it will leave the window delegate out
of the autorelease pool and crash.

Fixes #881.
2015-03-25 18:51:29 +08:00
deepak1556
a360ef7c8d [doc]: fix when to use protocol module 2015-03-25 11:54:21 +05:30
Nathan Sobo
9f9f772ff5 🎨 Add "-ize" suffix 2015-03-24 17:18:51 -06:00
Cheng Zhao
c4b240170d Merge pull request #1288 from deepak1556/native_window_mac_patch
added acceptsFirstMouse for controlRegionView
2015-03-24 18:57:17 +08:00
deepak1556
7006a14031 added acceptsFirstMouse for controlRegionView 2015-03-24 14:50:29 +05:30
Cheng Zhao
d46c64f64b Clean up WebView's ipc listeners when detached, fix #1185 2015-03-23 23:07:53 +08:00
Cheng Zhao
5bd3cfc4f6 Update brightray 2015-03-23 08:30:01 +00:00
Cheng Zhao
2e172a1053 Bump v0.22.2 2015-03-23 16:31:23 +08:00
Cheng Zhao
2f5345e10d Merge pull request #1284 from atom/subpixel-font
Bring back the "subpixel-font-scaling" option
2015-03-23 16:30:58 +08:00
Cheng Zhao
2a4b04bac6 Update libchromiumcontent 2015-03-23 16:29:32 +08:00
Cheng Zhao
30e931f10b Revert "The "subpixel-font-scaling" option is removed"
This reverts commit 98fbe5127b.
2015-03-23 16:29:32 +08:00
Cheng Zhao
266fadcb96 Update native_mate for #1112 2015-03-23 16:24:38 +08:00
Cheng Zhao
475f624113 docs: The right way of "set", according to #1126 2015-03-23 10:35:35 +08:00
Cheng Zhao
de76ab97fb docs: Fix setting GYP_DEFINES on Windows, closes #1126 2015-03-23 10:19:49 +08:00
Cheng Zhao
414c91a637 Cleanup #1275 2015-03-23 09:51:50 +08:00
Cheng Zhao
adce07785a Merge pull request #1275 from lygstate/master
Add runas as devDependencies, or the python script will install it again...
2015-03-23 09:49:10 +08:00
Cheng Zhao
1479f73612 Simplify #1261 2015-03-21 19:20:52 +08:00
Cheng Zhao
5e8c478b2c Merge pull request #1261 from deepak1556/asar_lib_patch
fs.read empty files from asar archive
2015-03-21 19:17:49 +08:00
Cheng Zhao
db056f8730 Merge pull request #1267 from atom/asar-unpacked
Add support for asar archives with unpacked files
2015-03-21 19:11:54 +08:00
Cheng Zhao
f5dc8fc80d docs: How to use asar archive with unpacked files 2015-03-21 19:11:15 +08:00
Yonggang Luo
fa011c3d97 Add runas as devDependencies, or the python script will install it again and again.
The options of register_msdia80_dll.js should be admin.
Fix the problem of runas not works cause it will escape command parameters by default.
2015-03-21 17:28:07 +08:00
deepak1556
fdc10e4e5f Allow reading empty file from asar archive 2015-03-21 14:56:03 +05:30
Cheng Zhao
73ce16fc52 Remove unneeded log 2015-03-20 21:32:10 +08:00
Cheng Zhao
b5a8cfb704 Recognize asar archive with unpacked files 2015-03-20 20:34:58 +08:00
Cheng Zhao
dc82553fc3 spec: Test asar archive with unpacked files 2015-03-20 20:34:31 +08:00
Cheng Zhao
1df033dce8 No need to override child_process.fork
We already support asar in Node mode.
2015-03-20 19:04:11 +08:00
Cheng Zhao
2c0b50a7e9 Merge pull request #1208 from deepak1556/protocol
adding protocol.RequestBufferJob api
2015-03-20 10:34:31 +08:00
Cheng Zhao
9bae54f917 Avoid extra copy of data in capturePage 2015-03-20 10:26:42 +08:00
deepak1556
9eac8ef266 add protocol.RequestBuffer api 2015-03-19 09:36:57 +05:30
Cheng Zhao
24d615d428 docs: Add a "s" 2015-03-19 11:25:53 +08:00
Cheng Zhao
99410217b9 Bump v0.22.1 2015-03-18 22:36:44 +08:00
Cheng Zhao
46cb6e68f6 Ship snapshot file, fixes #1260 2015-03-18 22:36:27 +08:00
Cheng Zhao
8b88dc6a94 libudev.so is now dynamically loaded from Chrome 41 2015-03-18 13:07:03 +00:00
Cheng Zhao
d6b36bb487 Bump v0.22.0 2015-03-18 20:57:21 +08:00
Cheng Zhao
b8d918d24f Merge pull request #1254 from austinmoore-/master
Add check for root in script/bootstrap.py
2015-03-18 20:36:29 +08:00
Cheng Zhao
b19cfba98e Merge pull request #1240 from suyash/rename-node-webkit-to-nwjs
rename node-webkit to NW.js in development docs
2015-03-18 18:01:37 +08:00
Cheng Zhao
c497eef3b3 Merge pull request #1243 from atom/chrome41
Upgrade to Chrome 41
2015-03-18 18:01:14 +08:00
Cheng Zhao
57812616b9 win: Fix tests and compilation errors 2015-03-18 13:58:33 +08:00
Cheng Zhao
b43386b273 Upgrade libchromiumcontent 2015-03-18 09:57:49 +08:00
Cheng Zhao
f8f7ca1d57 linux: Upgrade libchromiumcontent to fix linking 2015-03-18 09:57:48 +08:00
Cheng Zhao
105ad369ab linux: Fix compilation error 2015-03-18 09:57:48 +08:00
Cheng Zhao
ff724634f2 js_stream is a new module of io.js 2015-03-18 09:57:47 +08:00
Cheng Zhao
0b8eb6ad90 ⬆️ apm@0.144.0 2015-03-18 09:57:47 +08:00
Cheng Zhao
66292a2787 Upgrade brightray to fix invalid commit to libchromiumcontent 2015-03-18 09:57:46 +08:00
Cheng Zhao
12d5474077 Fix webview for the new API 2015-03-18 09:57:46 +08:00
Cheng Zhao
8328bce3f6 Initialize AtExitManager before calling MainApplicationBundlePath
Some singleton calsses require the existence of AtExitManager.
2015-03-18 09:57:45 +08:00
Cheng Zhao
c62c943bdb Define our own Node entry
Chromium's V8 is using external startup snapshot file while Node does
not, so we have to use Chromium's gin for V8 initialization.
2015-03-18 09:57:45 +08:00
Cheng Zhao
ceccf1b48a Fix devtools override for its new architecture 2015-03-18 09:57:44 +08:00
Cheng Zhao
6af7388ac0 Use DevToolsAPI instead of InspectorFrontendAPI 2015-03-18 09:57:43 +08:00
Cheng Zhao
d16d5b290a Remove the "X-Frame-Options" from response headers for devtools 2015-03-18 09:57:43 +08:00
Cheng Zhao
fbd9501c61 Upgrade to io.js v1.5.2 2015-03-18 09:57:42 +08:00
Cheng Zhao
578b24ae8a Ship with snapshot files 2015-03-18 09:57:42 +08:00
Cheng Zhao
5b2c0110dc Fix other compilation errors 2015-03-18 09:57:41 +08:00
Cheng Zhao
98fbe5127b The "subpixel-font-scaling" option is removed 2015-03-18 09:57:41 +08:00
Cheng Zhao
8e2fdc178b Fix API changes of CopyFromBackingStore 2015-03-18 09:57:40 +08:00
Cheng Zhao
757df39941 Upgrade native_mate for unsigned long conversion 2015-03-18 09:57:40 +08:00
Cheng Zhao
dfad907530 Fix API changes of tracing API 2015-03-18 09:57:39 +08:00
Cheng Zhao
04d1075db5 Fix API changes of ContentBrowserClient 2015-03-18 09:57:39 +08:00
Cheng Zhao
8a138fafd4 Fix API changes of WebContentsDelegate 2015-03-18 09:57:38 +08:00
Cheng Zhao
819ab5cd0c Fix ui/gfx/geometry headers 2015-03-18 09:57:38 +08:00
Cheng Zhao
dead7caab2 CommandLine moved to base::CommandLine 2015-03-18 09:57:37 +08:00
Cheng Zhao
14542f4fc8 Upgrade to Chrome 41 2015-03-18 09:57:37 +08:00
Kevin Sawicki
8a52374951 Update brightray repo url to be under atom org 2015-03-17 11:22:39 -07:00
Cheng Zhao
cfc615a6c1 Fix accidental update of submodules, closes #1255 2015-03-17 21:26:10 +08:00
Cheng Zhao
af0690fb88 docs: "Quick start" should also be a "tutorial"
Guides should include information that not available in the API
references, and tutorials should be step-by-step walkthrough or
introductory text on certain APIs.
2015-03-17 18:41:54 +08:00
Cheng Zhao
c80aaa2980 docs: Separate guides and tutorials 2015-03-17 18:37:32 +08:00
Austin Moore
521f61d7db Add argument that allows for non-interactive use
The newly added 'check_root()' method introduced an interactive prompt
that would ask the user if they wanted to continue. The new argument '-y'
will now skip the prompt, so that if a user needs to run this script
un-interactively, they can do so easily.
2015-03-17 01:42:23 -06:00
Austin Moore
2d1f70c1cf Add check for root in script/bootstrap.py 2015-03-17 01:01:33 -06:00
Suyash
327c7bc3cc 📝 avoid breaking everyone's stuff 2015-03-16 16:50:23 +05:30
Cheng Zhao
9e2842c9ca Merge pull request #1235 from suyash/update-linux-development-docs
add troubleshooting instructions for libudev.so.0 failure
2015-03-16 16:55:48 +08:00
Cheng Zhao
7457eccdee Merge pull request #1238 from deepak1556/browser_window_lib_patch
define devToolsWebContents for use from remote module
2015-03-16 16:43:46 +08:00
Cheng Zhao
2942eae9f2 Merge pull request #1242 from deepak1556/web_contents_patch
add DidFailProvisionalLoad method
2015-03-16 16:27:32 +08:00
Robo
87cb2ece80 add DidFailProvisionalLoad method 2015-03-14 08:58:30 +05:30
Kevin Sawicki
042074cab1 Merge pull request #1241 from ylaassel/patch-1
Fix a typo
2015-03-12 08:09:58 -07:00
Yassine Laassel
bd81b24b99 Fix a typo 2015-03-11 17:38:31 -07:00
Cheng Zhao
bb2f3a82d9 Merge pull request #1224 from deepak1556/chromium_flag_patch
test for ignoreCertificateError
2015-03-11 13:40:06 -07:00
Suyash
cda129b073 📝 rename node-webkit to NW.js in development docs
Replaces all occurences of node-webkit with NW.js in the development
docs.
2015-03-12 01:58:58 +05:30
deepak1556
adb130cefa define devToolsWebContents for use from remote module 2015-03-11 19:58:12 +05:30
Suyash
860b15ef8a 📝 add troubleshooting instructions for libudev.so.0 failure
Adding the easiest solution for solving the missing libudev.so.0 error
on ubuntu 13.04+.

I had to do this on my own machine running ubuntu 14.04.2 to build atom.

The solution is also referenced in
https://github.com/nwjs/nw.js/wiki/The-solution-of-lacking-libudev.so.0
2015-03-11 12:17:22 +05:30
Cheng Zhao
1679115302 Merge pull request #1225 from deepak1556/remote_lib_patch
using Object.defineProperty instead of __defineMethods__
2015-03-10 16:03:22 -07:00
deepak1556
8395745cc1 using Object.defineProperty instead of __defineMethods__ 2015-03-11 04:18:11 +05:30
deepak1556
dd706ea6e2 test for ignoreCertificateError 2015-03-10 12:39:23 +05:30
Cheng Zhao
6856d203c5 Merge pull request #1215 from deepak1556/dialog_patch
avoid overriding type value of showMessageBox
2015-03-09 13:50:18 -07:00
Cheng Zhao
29471ff8b5 Fix styling of #1209 2015-03-09 13:46:46 -07:00
Cheng Zhao
2495583b5e Merge pull request #1209 from deepak1556/webcontents_patch
using WebContentsObserver::NavigationEntryCommitted to set virtualurl
2015-03-09 13:41:27 -07:00
deepak1556
0b780def24 avoid overriding type value of showMessageBox 2015-03-06 17:56:26 +05:30
Cheng Zhao
5a50ce4157 Merge pull request #1210 from paulyoung/update-readme
Update README to replace node.js with io.js
2015-03-05 13:42:40 -08:00
Paul Young
4b9f78e375 Update README to replace node.js with io.js 2015-03-05 13:33:02 -08:00
Cheng Zhao
c9b549ae69 Fix styling of #1199 2015-03-05 12:31:45 -08:00
Cheng Zhao
bb0e68e563 Merge pull request #1199 from deepak1556/protocol_asar_patch
read files from asar archives in custom protocol
2015-03-05 12:26:42 -08:00
Robo
0663b9dae2 using WebContentsObserver::NavigationEntryCommitted to set virtualurl 2015-03-05 20:09:27 +05:30
Robo
2ce42af6e4 read files from asar archives in custom protocol 2015-03-05 09:26:34 +05:30
Kevin Sawicki
47463ae5cb 📝 Tweak Windows installer sentence 2015-03-04 14:36:56 -08:00
Kevin Sawicki
d813537e38 Merge pull request #1206 from joaomoreno/patch-1
Refer grunt-atom-shell-installer to Windows users
2015-03-04 14:35:26 -08:00
João Moreno
7148f6d144 Refer grunt-atom-shell-installer to Windows users 2015-03-04 22:38:25 +01:00
Cheng Zhao
52d596e576 Merge pull request #1202 from xfq/patch-2
Update application-packaging.md
2015-03-04 09:36:51 -08:00
Cheng Zhao
1f849ec7b0 Merge pull request #1203 from xfq/patch-3
Update online-offline-events.md
2015-03-04 09:27:54 -08:00
Cheng Zhao
610ab0c0a5 Merge pull request #1204 from xfq/patch-4
Update using-selenium-and-webdriver.md
2015-03-04 09:27:34 -08:00
Cheng Zhao
4e93b567e2 Merge pull request #1200 from xfq/patch-1
Update quick-start.md
2015-03-04 09:26:02 -08:00
Cheng Zhao
2d6dd9f4d2 docs: Put window.open docs in its own chapter, regards #1137 2015-03-04 08:47:04 -08:00
Cheng Zhao
eb31df2940 Rename FakeWindow to BrowserWindowProxy 2015-03-04 08:46:45 -08:00
Cheng Zhao
99f6bf045f Improve #1137 2015-03-04 07:58:06 -08:00
Cheng Zhao
fac9ea3356 Merge pull request #1137 from bundyo/implement-some-popup-methods
Implement FakeWindow.postMessage, window.opener.postMessage and window.closed flag for popup windows
2015-03-04 07:28:33 -08:00
Xue Fuqiao
246d6cbcf7 Update using-selenium-and-webdriver.md
Update the URI  of ChromeDriver.
2015-03-04 21:59:27 +08:00
Xue Fuqiao
29c6d1e46f Update online-offline-events.md
Add HTML5 doctype.
2015-03-04 21:29:02 +08:00
Xue Fuqiao
92c76bac2b Update application-packaging.md
`BrowserWindow` should be used in browser scripts instead of client scripts. Move it to the "Node API" section.
2015-03-04 20:16:22 +08:00
Bundyo
dbbc35bd13 Fixes after code review. 2015-03-04 11:29:52 +02:00
Xue Fuqiao
dab9dad9db Update quick-start.md
node-webkit has been renamed to nw.js.
2015-03-04 16:18:51 +08:00
Cheng Zhao
4176d542a5 Bump v0.21.3 2015-03-03 13:42:29 -08:00
Kevin Sawicki
e19c50223b Merge pull request #1192 from senorflor/fix-error-text
Fix tense of error message
2015-03-02 12:19:14 -08:00
Patrick Flor
5bdc200376 Fix tense of error message
Thanks for putting this project together; really enjoying hacking with
it so far!
2015-03-02 12:08:12 -08:00
Cheng Zhao
f2c8ea085b Merge pull request #1177 from maxogden/patch-1
add npm installation instructions to README
2015-03-02 09:10:04 -08:00
Max Ogden
d8d0f15ca8 fix readme style 2015-03-01 11:58:33 -08:00
Cheng Zhao
38a871aa4b Merge pull request #1176 from CharlieHess/before-quit-event
App Before-Quit Event
2015-03-01 02:20:03 -08:00
bundyo
e8d648bcba Change the link to use dashes. 2015-02-28 10:34:26 +02:00
bundyo
c7562dbfd0 Add FakeWindow documentation. 2015-02-28 10:31:07 +02:00
Cheng Zhao
54c948409e Merge pull request #1167 from mal/patch-1
Prevent overflow on webview with height: 100%
2015-02-27 15:30:17 -08:00
Cheng Zhao
70a83ad069 Merge pull request #1148 from bundyo/fix-window-open-options
Fix window.open options parsing
2015-02-27 12:24:13 -08:00
Cheng Zhao
e98953a5a5 win: Fix calling FILE_PATH_LITERAL for variable, fixes #1143 2015-02-27 12:21:19 -08:00
Charlie Hess
78b856268e Fix cpplint errors. 2015-02-25 21:57:25 -08:00
Max Ogden
1d1db66abd add npm installation instructions to README 2015-02-25 21:56:47 -08:00
Charlie Hess
b6787a9b34 Emit a new before-quit event at the start of Browser::Quit, which gives us a chance to cancel before any windows are closed. 2015-02-25 19:33:42 -08:00
Mal Graty
7eecb84898 Prevent overflow on webview with height: 100%
Without this, the object element gets displayed `inline` which in chromium means that it slightly exceeds it's bounds. Unfortunately there's no nice way to mitigate this issue as I can't find a way to get extra css into this intermediate page. However, forcing a block display solves the issue.
2015-02-21 22:34:57 +00:00
Kevin Sawicki
0c99f3baa6 Merge pull request #1158 from beardicus/patch-1
Broken link in docs, api/synopsis
2015-02-20 15:39:05 -08:00
Brian Boucheron
72d6a13e9e Broken link in docs, api/synopsis
Link to using-native-node-modules.md instead of use-native-node-modules. Filename changed with 268508764f
2015-02-19 12:03:05 -05:00
Bundyo
43e44f8c35 Fix window.open options parsing:
remove excessive whitespace (gets inserted in property names),
avoid creating dummy properties if not needed,
turn 1/0 to true/false, convert integer strings to strings (fixes width/height).
2015-02-18 14:36:05 +02:00
Bundyo
4e82f4c672 Remove two semicolons. 2015-02-13 18:54:18 +02:00
Bundyo
7fa1296a17 Implement FakeWindow.postMessage, window.opener.postMessage and window.closed flag for popup windows. 2015-02-13 18:45:12 +02:00
Cheng Zhao
f1ad8836d1 Merge pull request #1136 from atom/no-js
Bundle all the .js files in asar archive
2015-02-13 14:10:09 +08:00
Cheng Zhao
4834eed520 Set process.resourcesPath in C++ 2015-02-13 13:32:58 +08:00
Cheng Zhao
0f15dd04af Put compiled coffee sources into asar archive 2015-02-13 13:05:51 +08:00
Cheng Zhao
0b8efc434d Use __dirname when setting globalPaths 2015-02-13 12:55:06 +08:00
Cheng Zhao
3f3e66916a asar@0.2.2 2015-02-13 12:40:25 +08:00
Cheng Zhao
fd9a8f4b91 Merge pull request #1134 from atom/menu-icon
Enable setting icon for MenuItem
2015-02-13 12:32:41 +08:00
Cheng Zhao
ac6c2ce69a docs: "icon" attribute 2015-02-13 12:12:40 +08:00
Cheng Zhao
e81baf759a Enable setting icon of menu item 2015-02-13 12:11:50 +08:00
Cheng Zhao
b28a241dbf Simplify the code to call delegate method 2015-02-13 11:47:22 +08:00
Cheng Zhao
afd4052bde Merge pull request #1129 from atom/asar-image
Recognize asar archive in NativeImage
2015-02-12 21:04:34 +08:00
Cheng Zhao
a8c227d5f5 Fix cpplint warnings 2015-02-12 19:50:28 +08:00
Cheng Zhao
9646c28a41 spec: native-image should read asar archive 2015-02-12 19:34:39 +08:00
Cheng Zhao
3678f13dfb Make NativeImage work with asar archive 2015-02-12 19:34:21 +08:00
Cheng Zhao
98a7f08be2 Move GetAsarArchivePath to asar_util.h 2015-02-12 17:31:14 +08:00
Cheng Zhao
3b3a025ed4 Move GetsOrCreateAsarArchive to asar_util.h 2015-02-12 17:23:49 +08:00
Cheng Zhao
64622ceae3 Merge pull request #1128 from atom/native-image
Introduce NativeImage
2015-02-12 16:48:42 +08:00
Cheng Zhao
06d681c66a docs: Update NativeImage 2015-02-12 15:38:16 +08:00
Cheng Zhao
c8738a88a4 Add nativeImage.createFromBuffer() 2015-02-12 15:19:05 +08:00
Cheng Zhao
faf40457c5 spec: Fix BrowserWindow.capturePage 2015-02-12 14:37:32 +08:00
Cheng Zhao
353b485202 Add NativeImage.toDataUrl() 2015-02-12 14:32:51 +08:00
Cheng Zhao
8e94856cc8 Add nativeImage.createFromDataUrl() 2015-02-12 14:27:53 +08:00
Cheng Zhao
b9f6d6dffc Add nativeImage.createEmpty() 2015-02-12 13:55:45 +08:00
Cheng Zhao
8093300a43 docs: Use NativeImage to replace Image 2015-02-12 13:52:28 +08:00
Cheng Zhao
da407200d2 Return NativeImage in BrowserWindow.capturePage 2015-02-12 13:45:50 +08:00
Cheng Zhao
443a4b8f2f mac: Use AsNSImage instead of ToNSImage
It can get rid of the empty check.
2015-02-12 12:29:49 +08:00
Cheng Zhao
509ce0d5cb mac: Don't rely on NSImage to read file
It doesn't work with asar.
2015-02-12 12:24:18 +08:00
Cheng Zhao
903ff0b61a Upgrade native_mate for security check 2015-02-12 10:45:04 +08:00
Cheng Zhao
2ca6be69e2 Fix cpplint warnings 2015-02-12 10:45:04 +08:00
Cheng Zhao
054b6a9817 Use NativeImage when converting images from V8 2015-02-12 10:45:04 +08:00
Cheng Zhao
6556602bdc Enable creating NativeImage from file path 2015-02-12 10:45:04 +08:00
Cheng Zhao
2876f15063 Enable creating NativeImage with native-image module 2015-02-12 10:45:04 +08:00
Cheng Zhao
85f5ef2ab1 Enable creating NativeImage from PNG and JPEG 2015-02-12 10:45:04 +08:00
Cheng Zhao
53fca43d89 Add NativeImage.ToJPEG 2015-02-12 10:45:03 +08:00
Cheng Zhao
549df36f00 Add a few more methods for NativeImage 2015-02-12 10:45:03 +08:00
Cheng Zhao
aae576b484 Convert gfx::Image to NativeImage instance 2015-02-12 10:45:03 +08:00
Cheng Zhao
b76615f3e7 Add clipboard.readImage method 2015-02-12 10:45:03 +08:00
Cheng Zhao
878d25e91e Enable converting gfx::Image to Buffer 2015-02-12 10:45:03 +08:00
Cheng Zhao
ab315e502f Upgrade brightray for gyp 2015-02-12 10:43:53 +08:00
Cheng Zhao
564c0b41df Merge pull request #1122 from atom/window-type
Add "type" option to change window type of BrowserWindow
2015-02-11 12:31:44 +08:00
Cheng Zhao
382a00493b docs: "type" option of BrowserWindow 2015-02-11 12:19:39 +08:00
Cheng Zhao
f0924df68a Add "type" option to change window type 2015-02-11 12:19:39 +08:00
Cheng Zhao
6b37f30bd6 Merge pull request #1106 from paulcbetts/set-overlay-icon
Set window overlay icon
2015-02-11 11:51:01 +08:00
Paul Betts
86de75deef Style fixups 2015-02-10 17:14:26 -08:00
Cheng Zhao
bedd0a11ba Suppress SSL verification, fixes #1115 2015-02-10 17:52:33 +08:00
Cheng Zhao
778078973b Merge pull request #1107 from yoshuawuyts/patch-1
docs: update wording in `application-packaging`
2015-02-10 12:12:34 +08:00
Yoshua Wuyts
a26976a161 docs: update wording in application-packagaging
Minor tweak, should make the sentence a bit more fluent. Thanks!
2015-02-08 12:04:02 +01:00
Paul Betts
8a7acfc6c0 icon_util is Windows-only 2015-02-07 11:57:00 -08:00
Paul Betts
03a88883b6 Fix build on OS X 2015-02-07 11:56:03 -08:00
Paul Betts
59a8be53c2 Documentation 2015-02-06 17:11:54 -08:00
Paul Betts
f55379ed5b Add missing trampoline method 2015-02-06 17:07:29 -08:00
Paul Betts
ef869fb2ff We need a UTF-16 string here 2015-02-06 17:00:38 -08:00
Paul Betts
1b9649b481 Switch to gfx::Image 2015-02-06 17:00:26 -08:00
Paul Betts
fa6d499a4e Come correct with line length and constness 2015-02-06 16:32:27 -08:00
Paul Betts
0afac1e05a Plumb code all the way up 2015-02-06 16:12:32 -08:00
Paul Betts
66f2d18d8b First hack at setting the window icon overlay 2015-02-06 15:58:49 -08:00
Cheng Zhao
b75bfe0e92 Bump v0.21.2 2015-02-05 13:46:09 -08:00
Cheng Zhao
1cae81c0d6 Merge pull request #1100 from christoth/master
Remove MFC lib dependency
2015-02-05 12:01:25 -08:00
christoth
92ab227397 Update atom.rc 2015-02-05 14:55:32 -05:00
christoth
076535bc06 Remove MFC lib dependency
Replace afxres.h with windows.h to remove dependency on MFC for compilation on Windows
2015-02-05 13:09:19 -05:00
Cheng Zhao
071a55974a A little clean up 2015-02-05 00:19:30 -08:00
Kevin Sawicki
c21c89c0ce Merge pull request #1098 from dpatou/patch-1
Event name typo
2015-02-04 16:27:01 -08:00
Damien Patou
8e6e1610a4 Event name typo 2015-02-05 01:23:16 +01:00
Cheng Zhao
0b694dffd8 Merge pull request #1097 from atom/fix-webview-race-condition
Fix the race condition when updating webview info
2015-02-04 16:13:18 -08:00
Cheng Zhao
7c8bed7bfc Get the WebViewManager from embedder WebContents
This make our lives easier when we have multiple BrowserContext support.
2015-02-04 15:52:59 -08:00
Cheng Zhao
209840871c Seperate the API implementation of WebViewManager 2015-02-04 15:39:41 -08:00
Cheng Zhao
ea99037f3b Clean up WebViewManager 2015-02-04 15:28:26 -08:00
Cheng Zhao
331d0481bb Move web_view_manager to atom/browser 2015-02-04 15:17:28 -08:00
Cheng Zhao
2c61070b36 Avoid using global BrowserContext 2015-02-04 15:08:29 -08:00
Cheng Zhao
502c0f0df7 Remove the WebViewRendererState class 2015-02-04 14:58:03 -08:00
Cheng Zhao
aa49e4790f Update WebViewRendererState immediately 2015-02-04 12:59:46 -08:00
Cheng Zhao
3490ce507a Remove WebViewRendererState::IsGuest 2015-02-04 12:51:15 -08:00
Cheng Zhao
c1f3d22910 Add lock for WebViewRendererState 2015-02-04 12:50:24 -08:00
Cheng Zhao
f1bca5dd0f Merge pull request #1096 from atom/generic-asar-support
Support asar archives in scripts forked with child_process.fork
2015-02-04 12:18:13 -08:00
Cheng Zhao
7861eec426 linux: Fix building 2015-02-04 11:18:25 -08:00
Cheng Zhao
a02707f998 Fix cpplint warnings 2015-02-04 11:01:01 -08:00
Cheng Zhao
f214e88784 spec: Script forked with child_process supports asar archives 2015-02-04 10:52:09 -08:00
Cheng Zhao
45e2dd2ab5 Init asar support without external .js files 2015-02-04 10:45:17 -08:00
Cheng Zhao
f905bb64f6 Compile asar.coffee to .c 2015-02-03 16:46:52 -08:00
Cheng Zhao
8612ad0459 generate_sources => compile_coffee 2015-02-03 16:07:29 -08:00
Cheng Zhao
3bbcc1efd8 compile-coffee.py should be put under tools/ 2015-02-03 15:56:58 -08:00
Cheng Zhao
6dac8da91f Merge pull request #1092 from paulcbetts/patch-2
Use 'atomScreen' for the variable name
2015-02-03 12:12:59 -08:00
Cheng Zhao
137f3b8439 docs: forBrowser is now required for webdriver 2015-02-03 11:38:22 -08:00
Paul Betts
b77ed51594 Use 'atomScreen' for the variable name
Even though it's not screen's fault, it's super easy in the DevTools to write `screen = require('screen')`, then wonder why it doesn't work (because `window.screen` is reserved by the DOM). This makes people who just type in the example more likely to get it right.
2015-02-03 11:32:33 -08:00
Cheng Zhao
d17e6a3857 Upgrade brightray 2015-02-03 10:59:19 -08:00
Cheng Zhao
a2c38ed48c Upgrade brightray 2015-02-03 10:43:24 -08:00
Cheng Zhao
93a24ec672 Bump v0.21.1 2015-02-02 17:06:11 -08:00
Cheng Zhao
11cb777e35 win: Delete temp file on reboot, fix #1084 2015-02-02 17:03:52 -08:00
Cheng Zhao
27011ad0c8 win: Fix program not quitting, close #1084 2015-02-02 16:10:48 -08:00
Cheng Zhao
c6fabf8613 Merge pull request #1082 from atom/graceful-asar
Make asar support work with graceful-fs
2015-02-02 15:01:20 -08:00
Cheng Zhao
6e469df90e Fix string escaping 2015-02-02 13:35:32 -08:00
Cheng Zhao
0c0a6bd939 Don't touch global fs object in graceful-fs 2015-02-02 13:35:32 -08:00
Cheng Zhao
3f8ad3bf75 spec: graceful-fs should not touch global fs object 2015-02-02 13:35:32 -08:00
Cheng Zhao
afd6f41e08 Redirect process.binding('natives').fs to global fs object 2015-02-02 13:35:32 -08:00
Cheng Zhao
0a393eaa1c Enable wrap arbitrary fs object 2015-02-02 13:35:32 -08:00
Cheng Zhao
b1bb7bd8f3 spec: Test graceful-fs 2015-02-02 13:35:32 -08:00
Daniel Hengeveld
45bfbb7cf6 Merge pull request #1081 from xfq/osx
Change Mac OS X to OS X.
2015-02-02 11:11:07 -08:00
Xue Fuqiao
5083a7505d Change Mac OS X to OS X.
Apple has renamed Mac OS X to OS X.
2015-02-02 16:21:23 +08:00
Cheng Zhao
fd2b2003b4 Merge pull request #1077 from atom/asar-standard
Remove asar: protocol, use file: protocol instead
2015-01-31 22:30:29 -08:00
Cheng Zhao
23b5c1f782 Cleanup usaages of asar: protocol 2015-01-31 18:50:26 -08:00
Cheng Zhao
37d278de34 docs: Use file: instead of asar: 2015-01-31 18:48:11 -08:00
Cheng Zhao
24b5faf8df spec: Test loading script tag in html 2015-01-30 17:59:00 -08:00
Cheng Zhao
8b712bac8d Remove the asar: protocol 2015-01-30 17:59:00 -08:00
Cheng Zhao
a1f26c4c93 Make file: protocol compatible with asar: protocol 2015-01-30 17:58:59 -08:00
Cheng Zhao
13c887d4c9 No more need of pathwatcher spec
It was used for testing modules not working while compiling, since the
module version increases for ABI breakage, it is not useful anymore.
2015-01-30 16:50:42 -08:00
Cheng Zhao
2ed7d58ac4 Fix loading node integration when page in webview navigates, close #1068 2015-01-29 16:49:34 -08:00
Cheng Zhao
b51e2f6453 spec: Fix flags in fs.open 2015-01-28 21:25:48 -08:00
Cheng Zhao
17c191201c Upgrade node modules in spec 2015-01-28 21:22:56 -08:00
Cheng Zhao
4217b70331 Return null in window.open if failed to open new window, fixes #1067 2015-01-28 21:07:57 -08:00
Cheng Zhao
8947d54cc9 Bump v0.21.0 2015-01-27 17:33:13 -08:00
Cheng Zhao
f829f2eb0c Merge pull request #1002 from atom/chrome40
Upgrade to Chrome 40
2015-01-27 17:32:07 -08:00
Cheng Zhao
0087f8da27 linux: Fix building for Chrome 40 2015-01-27 17:20:50 -08:00
Cheng Zhao
dd606684c7 Upgrade node to fix module initialization 2015-01-27 15:29:39 -08:00
Cheng Zhao
12998399f8 Do not warn about deprecated APIs
Some APIs deprecated by iojs is still in use.
2015-01-27 14:49:14 -08:00
Cheng Zhao
c09ba6efdb Use upload-node-headers.py in upload.py 2015-01-27 13:19:18 -08:00
Cheng Zhao
7df1957ac7 Fix executing upload-node-headers.py in cygwin 2015-01-27 13:19:18 -08:00
Cheng Zhao
241e410a07 Move the code of uploading node headers to the new script 2015-01-27 13:19:18 -08:00
Cheng Zhao
68cfe80369 Move the code of creating tarball to a new script 2015-01-27 13:19:18 -08:00
Cheng Zhao
88d7ad95f6 ⬆️ apm@0.126.0 2015-01-27 13:19:18 -08:00
Cheng Zhao
02c04cbf68 win: gfx::EnableHighDPISupport is dropped 2015-01-27 13:19:18 -08:00
Cheng Zhao
5523938a47 kDisableDirectWrite has been moved to ui/gfx 2015-01-27 13:19:18 -08:00
Cheng Zhao
fbe1abddf4 Upgrade libchromiumcontent to ship crypto headers 2015-01-27 13:19:18 -08:00
Cheng Zhao
9a14d2bd0e Upgrade to Chrome 40.0.2214.91 2015-01-27 13:19:18 -08:00
Cheng Zhao
86644543ed Fix cpplint warning 2015-01-27 13:18:31 -08:00
Cheng Zhao
a9c720969f Upgrade to latest io.js 2015-01-27 13:18:31 -08:00
Cheng Zhao
3dd9e4cdf8 uv_run_mode can not be used as bitmask
See http://git.io/9ou_MQ for more on this.
2015-01-27 13:18:31 -08:00
Cheng Zhao
9a5698807f Update to latest URLRequestJobFactory API 2015-01-27 13:18:31 -08:00
Cheng Zhao
92142ee372 Fix the API to set opaque background 2015-01-27 13:18:31 -08:00
Cheng Zhao
715ac35672 Update to new FilesSelectedInChooser API 2015-01-27 13:18:30 -08:00
Cheng Zhao
750db6aed8 base/file_util.h has been moved to base/files/file_util.h 2015-01-27 13:18:30 -08:00
Cheng Zhao
5c78ecfe40 scoped_ptr.PassAs is removed 2015-01-27 13:18:30 -08:00
Cheng Zhao
43421aedcf OVERRIDE macro is now removed 2015-01-27 13:18:30 -08:00
Cheng Zhao
13ed038082 Upgrade to Chrome 40.0.2214.72 2015-01-27 13:17:48 -08:00
Cheng Zhao
de151cef8e Bump v0.20.8 2015-01-27 11:38:30 -08:00
Cheng Zhao
5bfe644c3e Merge pull request #1059 from atom/ipc-preload
Don't rely on global "process" object for message dispatching
2015-01-27 10:58:20 -08:00
Cheng Zhao
20431f4f2f No need to route via ATOM_INTERNAL_MESSAGE 2015-01-27 10:47:11 -08:00
Cheng Zhao
ad16e9ea49 Check for the existence of "ipc" object 2015-01-26 18:47:23 -08:00
Cheng Zhao
a10782cdea Don't rely on the global process object for message dispatching 2015-01-26 18:42:43 -08:00
Cheng Zhao
c14c6a3521 spec: The preload script should be able to receive ipc messages 2015-01-26 18:06:27 -08:00
Cheng Zhao
6c62895898 Merge pull request #1044 from atom/load-environment-later
Fix race condition when initializing node integration
2015-01-25 13:04:33 -08:00
Cheng Zhao
134aa32612 Merge pull request #1052 from gappsby/patch-1
Correct spelling mistake.
2015-01-25 13:04:22 -08:00
Florian Hämmerle
0a59384003 Correct spelling mistake. 2015-01-24 13:39:36 +01:00
Cheng Zhao
c2b109f7fc Fix process.crash() 2015-01-23 21:55:42 -08:00
Cheng Zhao
a755edebfa Simplify atom_bindings 2015-01-23 21:33:40 -08:00
Cheng Zhao
76fc62808c Use FILE_PATH_LITERAL instead of AppendASCII 2015-01-23 21:12:45 -08:00
Cheng Zhao
54ab6744f1 Remove some unused virtual functions 2015-01-23 21:05:32 -08:00
Cheng Zhao
2d262d2dbd Use node::CreateEnvironment to create environment 2015-01-23 21:02:31 -08:00
Cheng Zhao
de99c38fb6 Get rid of AtomRenderFrameObserver 2015-01-23 20:51:19 -08:00
Cheng Zhao
91320a9e55 Remove AtomRendererBindings
After the simplification of code this class is no longer needed.
2015-01-23 20:43:38 -08:00
Cheng Zhao
0bcc9b7713 Don't handle browser messages before document object is created
When we recevied messages from browser, we will try to transfer the
message to web page, and when we do that blink will create an empty
document when there is no document object yet, which will make our init
script run when window.location is still about:blank.
2015-01-23 18:33:01 -08:00
Cheng Zhao
33b6876cc1 Add support for Plus as accelerator key, fixes #1050 2015-01-23 15:26:54 -08:00
Cheng Zhao
81b370ee9f Implement CheckMediaAccessPermission, fixes #1017 2015-01-23 15:13:49 -08:00
Cheng Zhao
fe81e5b32d Use https://atom.io/download/atom-shell as headers download URL 2015-01-23 12:16:49 -08:00
Cheng Zhao
4ba3e101f6 Clean the init.coffee 2015-01-21 17:38:26 -08:00
Cheng Zhao
7210f6e64d spec: No node integration in iframe 2015-01-21 17:05:19 -08:00
Cheng Zhao
ef15b670a9 Initialize node integration after window object is cleared 2015-01-21 16:40:19 -08:00
Cheng Zhao
706f547287 Don't insert node symbols in frames
This greatly simplified our code, and it is not useful to enable node
integrations in frames.
2015-01-21 15:42:57 -08:00
Cheng Zhao
f142f572c3 Add DidClearWindowObject for renderer client 2015-01-21 15:35:43 -08:00
Cheng Zhao
7e33e26465 Add atom-shell bindings before loading environment 2015-01-21 15:02:09 -08:00
Cheng Zhao
5e58915bdd Separate LoadEnvironment from CreateEnvironment 2015-01-21 14:00:19 -08:00
Cheng Zhao
854c59df5c docs: Make getCurrentWindow more clear, fixes #1035 2015-01-21 13:47:28 -08:00
Cheng Zhao
f6db9bc84c Merge pull request #1034 from atom/index-js
Update index.json when publishing
2015-01-21 13:38:56 -08:00
Cheng Zhao
b8d0c5b3fe Include node's version 2015-01-21 13:37:52 -08:00
Cheng Zhao
23760058e9 Fix target url 2015-01-20 22:16:27 -08:00
Cheng Zhao
7b621262ea Upload the index.json to S3 2015-01-20 22:09:30 -08:00
Cheng Zhao
62756a79df Include apm version in index.json 2015-01-20 22:01:51 -08:00
Cheng Zhao
87cd762eb3 ⬆️ apm@0.122.0 2015-01-20 21:58:46 -08:00
Cheng Zhao
74566375b5 Download the index.json from server 2015-01-20 21:53:53 -08:00
Cheng Zhao
5d9b538513 Add script to dump information for atom-shell 2015-01-20 14:39:14 -08:00
Cheng Zhao
7c0f414881 Bump v0.20.7 2015-01-20 11:30:41 -08:00
Cheng Zhao
62d2b90e18 Merge pull request #1027 from fengmk2/mirror
Add China download mirrors
2015-01-19 19:44:19 -08:00
Cheng Zhao
69092eee15 No need to preheat original-fs module 2015-01-19 15:47:21 -08:00
Cheng Zhao
96f24b88ea Update asar specs 2015-01-19 15:36:56 -08:00
Cheng Zhao
3d858bee95 Guard against bad events in screen module
It can happen that the DisplayObserver methods are called without a
valid Display object passed.
2015-01-19 14:46:29 -08:00
Cheng Zhao
0933a7d1b2 Evaluate the "fs.js" in original-fs
Some high-level APIs in fs are using low-level APIs via "fs.xxx", which
will be overriden by our asar wrappers, so just shadow-copy those
methods is not enough.

By evaluating the whole "fs.js" we can make sure original-fs is not
polluted by the asar wrappers.

Fixes #782.
2015-01-19 14:22:32 -08:00
Cheng Zhao
fe78c17ea6 Don't popup error if the user has a custom uncaught exception handler
Fix #1012.
2015-01-19 12:50:44 -08:00
Cheng Zhao
79a233436b Merge pull request #1029 from atom/editing-commands
Add editing commands for <webview> and WebContents
2015-01-19 12:40:30 -08:00
Cheng Zhao
3da347a783 docs: The editing commands 2015-01-19 12:30:28 -08:00
Cheng Zhao
ff856e679d Make editing commands available in <webview> 2015-01-19 12:15:07 -08:00
Cheng Zhao
7fbf4246ac Add editing commands for WebContents 2015-01-19 12:09:47 -08:00
fengmk2
42077999e9 Add China download mirrors 2015-01-19 22:30:33 +08:00
Cheng Zhao
e75950cb89 Merge pull request #1026 from atom/set-data-path
Add API to set/get path to special directory or file
2015-01-18 21:53:29 -08:00
Cheng Zhao
4604c9bb0e Add a few more paths for app.getPath 2015-01-18 21:43:23 -08:00
Cheng Zhao
8aa5b97c61 docs: Say more about Linux's behavior 2015-01-18 21:43:22 -08:00
Cheng Zhao
ce52a87477 Add "cache" and "userCache" directories 2015-01-18 21:43:22 -08:00
Cheng Zhao
9a04f67c0a docs: Mention when to override userData path 2015-01-18 21:43:21 -08:00
Cheng Zhao
3d398458a8 Throw error when PathService call failed 2015-01-18 21:43:21 -08:00
Cheng Zhao
dec3e37683 docs: Document app.getPath/app.setPath 2015-01-18 21:43:20 -08:00
Cheng Zhao
a988b48016 Implement app.getHomeDir with app.getPath 2015-01-18 21:43:20 -08:00
Cheng Zhao
d31df439c3 Override default userData according to app's name 2015-01-18 21:43:19 -08:00
Cheng Zhao
06da5f254a Add app.setPath and app.getPath APIs
They can be used to set/get any path defined in PathService
2015-01-18 21:43:19 -08:00
Cheng Zhao
2d1afbf51b Call app.getDataPath after app is ready
It is possible for users to override the data path.
2015-01-18 21:43:18 -08:00
Cheng Zhao
45c26e0e5a Add app.setDataPath API 2015-01-18 21:43:18 -08:00
Cheng Zhao
c6fb645f6b Warning of app not ready in screen module 2015-01-18 21:42:46 -08:00
Cheng Zhao
e8f1f6819c Merge pull request #1016 from atom/screen-improve
Add API to enumerate external displays in screen module
2015-01-18 10:23:18 -08:00
Cheng Zhao
c59bd82f6f Merge pull request #1019 from atom/locale-in-node
Initialize ICU in Node mode
2015-01-16 17:08:30 -08:00
Cheng Zhao
b2be9373b0 linux,win: Initalize ICU for node mode 2015-01-16 16:12:12 -08:00
Cheng Zhao
f81df9a5d3 spec: Test localeCompare in child process 2015-01-16 16:11:02 -08:00
Cheng Zhao
51c03c3a71 mac: Initialize ICU in Node mode 2015-01-16 15:55:50 -08:00
Cheng Zhao
4f6ee31a28 docs: Fix typo 2015-01-16 14:01:52 -08:00
Cheng Zhao
1746518cdf docs: Update docs and examples for screen module 2015-01-16 13:57:16 -08:00
Cheng Zhao
b3c3556286 Update the displays when there is metrics change 2015-01-16 12:04:35 -08:00
Cheng Zhao
50b96ca7ef Pass the display in screen events 2015-01-16 12:02:32 -08:00
Cheng Zhao
7749484628 Make getAllDisplays return current displays. 2015-01-16 11:39:25 -08:00
Cheng Zhao
b5898d3355 Add events on display add/remove. 2015-01-16 11:01:38 -08:00
Cheng Zhao
809c995c0b Make "screen" module a browser module 2015-01-16 11:01:38 -08:00
Cheng Zhao
551c39e241 Add some more attributes for Display 2015-01-16 11:01:38 -08:00
Cheng Zhao
97070246b7 Don't put gfx_converter's implementaion in header file 2015-01-16 11:01:38 -08:00
Cheng Zhao
029ee9aa1e Add a few more API bindings 2015-01-16 11:01:38 -08:00
Cheng Zhao
509294b228 Don't hard-code API names 2015-01-16 11:01:38 -08:00
Cheng Zhao
ab9e1dd650 Upgrade brightray for #863 2015-01-15 17:52:14 -08:00
Cheng Zhao
0ac2443eb0 Merge pull request #1009 from atom/better-emit
Convert arguments to V8 directly in EventEmitter::Emit
2015-01-15 17:40:20 -08:00
Cheng Zhao
136b3da458 Add -stdlib=libc++ for linking 2015-01-15 17:17:43 -08:00
Cheng Zhao
9f5ed14f24 mac: Upgrade libchromiumcontent to fix linking error 2015-01-14 20:15:39 -08:00
Cheng Zhao
482c740e61 Also unpack arguments in ipc-message-host message 2015-01-14 19:43:01 -08:00
Cheng Zhao
1a1cf57097 Unpack the arguments in ipc message 2015-01-14 19:33:24 -08:00
Cheng Zhao
f6f5ff4330 Fix converting ListValue to V8 2015-01-14 19:09:25 -08:00
Cheng Zhao
6a11eccc3e Update native_mate to fix linking error 2015-01-14 18:55:54 -08:00
Cheng Zhao
2d6dc9c527 Convert arguments to V8 directly in EventEmitter::Emmit
This gets rid of the extra conversion between ListValue.
2015-01-14 17:51:54 -08:00
Cheng Zhao
65d2540807 Use C++11 stdlib 2015-01-14 17:40:24 -08:00
Cheng Zhao
834d28f528 win: Fix building 2015-01-14 14:05:22 -08:00
Cheng Zhao
b4ba4a908e Bump v0.20.6 2015-01-13 11:47:10 -08:00
Cheng Zhao
bda3711815 docs: Transparent window 2015-01-12 15:27:33 -08:00
Cheng Zhao
b4cdb546fe Don't set contentWindow property for <webview>
This property is only available in Chrome and we don't need it in
atom-shell, so remove it to avoid confusions.

Fixes #997.
2015-01-12 14:17:49 -08:00
Cheng Zhao
7ab5db1adb Use http in framework download url, fixes #998 2015-01-12 14:10:22 -08:00
Cheng Zhao
1926c2cd01 Merge pull request #949 from atom/window-transparency
Add support for window transparency
2015-01-12 14:05:20 -08:00
Cheng Zhao
21ba5b867d Merge branch 'master' into window-transparency
Conflicts:
	script/lib/config.py
2015-01-12 13:39:32 -08:00
Kevin Sawicki
1a80bc786d Merge pull request #1000 from yibuyisheng/master
remove `will`
2015-01-12 09:10:22 -08:00
yibuyisheng
6a532292c4 remove 2015-01-12 23:23:10 +08:00
Cheng Zhao
c8ed581e5c Merge pull request #990 from deepak1556/chrome_extension_patch
ensuring single instance for loading and unloading extension
2015-01-09 15:11:21 -08:00
deepak1556
c0f0f4cdc6 ensuring single instance for loading and unloading extension 2015-01-10 04:12:13 +05:30
Cheng Zhao
b83f042363 Merge pull request #985 from atom/set-safe-schema
Add webFrame.registerUrlSchemeAsSecure API
2015-01-08 13:12:14 -08:00
Cheng Zhao
bce8a3f835 Fix cpplint warning 2015-01-08 12:51:15 -08:00
Cheng Zhao
2d5b17552a Add webFrame.registerUrlSchemeAsSecure API 2015-01-08 12:39:58 -08:00
Cheng Zhao
19d6d171b1 Don't show insecure content by default
This follows the behavior of Chrome.
2015-01-08 11:50:55 -08:00
Cheng Zhao
09acb9032a Allow using blink's private headers 2015-01-08 11:50:55 -08:00
Cheng Zhao
3dfc496243 Add support for --ignore-certificate-errors
This makes it possible to test HTTPS related APIs.
2015-01-08 11:50:55 -08:00
Cheng Zhao
6939567cb4 win: Make transparent window resizable 2014-12-23 17:24:04 -08:00
Cheng Zhao
1a34e09a45 views: Make transparent window work 2014-12-23 16:55:57 -08:00
Cheng Zhao
85685feff4 mac: Simplify frameless window dragging code 2014-12-23 15:55:56 -08:00
Cheng Zhao
4ca0458b37 OVERRIDE => override in native_window_mac.h 2014-12-23 15:31:39 -08:00
Cheng Zhao
effcf18d56 Upgrade libchromiumcontent to make transparent window work on Mac 2014-12-23 13:32:18 -08:00
Cheng Zhao
5b312e8f64 mac: Fix a crash when closing window 2014-12-23 12:31:27 -08:00
Cheng Zhao
8506725b54 mac: Don't show title text in transparent window 2014-12-23 11:48:20 -08:00
Cheng Zhao
45c41fe880 mac: Use transparent window 2014-12-23 11:17:56 -08:00
Cheng Zhao
4fc73117c4 Tell the render widget to use transparent background. 2014-12-23 11:17:32 -08:00
Cheng Zhao
9593c71f52 Add "transparent" option 2014-12-22 17:48:54 -08:00
327 changed files with 6586 additions and 4348 deletions

2
.gitignore vendored
View File

@@ -10,3 +10,5 @@ node_modules/
*.xcodeproj
*.swp
*.pyc
debug.log
npm-debug.log

2
.gitmodules vendored
View File

@@ -1,6 +1,6 @@
[submodule "vendor/brightray"]
path = vendor/brightray
url = https://github.com/brightray/brightray.git
url = https://github.com/atom/brightray.git
[submodule "vendor/node"]
path = vendor/node
url = https://github.com/atom/node.git

View File

@@ -1,20 +1,24 @@
# Atom Shell [![Build Status](https://travis-ci.org/atom/atom-shell.svg?branch=master)](https://travis-ci.org/atom/atom-shell)
# Electron [![Build Status](https://travis-ci.org/atom/electron.svg?branch=master)](https://travis-ci.org/atom/electron)
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
The Electron framework lets you write cross-platform desktop applications
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
editor](https://github.com/atom/atom).
## Downloads
Prebuilt binaries of atom-shell for Linux, Windows and Mac can be found on the
[releases](https://github.com/atom/atom-shell/releases) page.
Prebuilt binaries and debug symbols of Electron for Linux, Windows and Mac can
be found on the [releases](https://github.com/atom/electron/releases) page.
### Mirrors
- [China](https://npm.taobao.org/mirrors/atom-shell)
## Documentation
Guides and the API reference are located in the
[docs](https://github.com/atom/atom-shell/tree/master/docs) directory. It also
contains documents describing how to build and contribute to atom-shell.
[docs](https://github.com/atom/electron/tree/master/docs) directory. It also
contains documents describing how to build and contribute to Electron.
## Community

View File

@@ -1,28 +0,0 @@
# appveyor file
# http://www.appveyor.com/docs/appveyor-yml
version: "{build}"
init:
- git config --global core.autocrlf input
environment:
matrix:
- nodejs_version: 0.10
platform:
- x86
install:
- ps: Install-Product node $env:nodejs_version
- cmd: SET PATH=C:\Program Files (x86)\MSBuild\12.0\bin\;%PATH%
- cmd: SET PATH=C:\python27;%PATH%
- cmd: python script/bootstrap.py
- cmd: python script/build.py -c Debug
test_script:
- node --version
- npm --version
- cmd: python script/cpplint.py
- cmd: python script/coffeelint.py
build: off

754
atom.gyp
View File

@@ -1,392 +1,32 @@
{
'variables': {
'includes': [
'vendor/native_mate/native_mate_files.gypi',
],
'project_name%': 'atom',
'product_name%': 'Atom',
'app_sources': [
'atom/app/atom_main.cc',
'atom/app/atom_main.h',
],
'bundle_sources': [
'atom/browser/resources/mac/atom.icns',
],
'coffee_sources': [
'atom/browser/api/lib/app.coffee',
'atom/browser/api/lib/atom-delegate.coffee',
'atom/browser/api/lib/auto-updater.coffee',
'atom/browser/api/lib/browser-window.coffee',
'atom/browser/api/lib/content-tracing.coffee',
'atom/browser/api/lib/dialog.coffee',
'atom/browser/api/lib/global-shortcut.coffee',
'atom/browser/api/lib/ipc.coffee',
'atom/browser/api/lib/menu.coffee',
'atom/browser/api/lib/menu-item.coffee',
'atom/browser/api/lib/power-monitor.coffee',
'atom/browser/api/lib/protocol.coffee',
'atom/browser/api/lib/tray.coffee',
'atom/browser/api/lib/web-contents.coffee',
'atom/browser/lib/chrome-extension.coffee',
'atom/browser/lib/guest-view-manager.coffee',
'atom/browser/lib/guest-window-manager.coffee',
'atom/browser/lib/init.coffee',
'atom/browser/lib/objects-registry.coffee',
'atom/browser/lib/rpc-server.coffee',
'atom/common/api/lib/callbacks-registry.coffee',
'atom/common/api/lib/clipboard.coffee',
'atom/common/api/lib/crash-reporter.coffee',
'atom/common/api/lib/id-weak-map.coffee',
'atom/common/api/lib/original-fs.coffee',
'atom/common/api/lib/screen.coffee',
'atom/common/api/lib/shell.coffee',
'atom/common/lib/init.coffee',
'atom/common/lib/asar.coffee',
'atom/renderer/lib/chrome-api.coffee',
'atom/renderer/lib/init.coffee',
'atom/renderer/lib/inspector.coffee',
'atom/renderer/lib/override.coffee',
'atom/renderer/lib/web-view/guest-view-internal.coffee',
'atom/renderer/lib/web-view/web-view.coffee',
'atom/renderer/lib/web-view/web-view-attributes.coffee',
'atom/renderer/lib/web-view/web-view-constants.coffee',
'atom/renderer/api/lib/ipc.coffee',
'atom/renderer/api/lib/remote.coffee',
'atom/renderer/api/lib/web-frame.coffee',
],
'lib_sources': [
'atom/app/atom_content_client.cc',
'atom/app/atom_content_client.h',
'atom/app/atom_main_delegate.cc',
'atom/app/atom_main_delegate.h',
'atom/app/atom_main_delegate_mac.mm',
'atom/browser/api/atom_api_app.cc',
'atom/browser/api/atom_api_app.h',
'atom/browser/api/atom_api_auto_updater.cc',
'atom/browser/api/atom_api_auto_updater.h',
'atom/browser/api/atom_api_content_tracing.cc',
'atom/browser/api/atom_api_dialog.cc',
'atom/browser/api/atom_api_global_shortcut.cc',
'atom/browser/api/atom_api_global_shortcut.h',
'atom/browser/api/atom_api_menu.cc',
'atom/browser/api/atom_api_menu.h',
'atom/browser/api/atom_api_menu_views.cc',
'atom/browser/api/atom_api_menu_views.h',
'atom/browser/api/atom_api_menu_mac.h',
'atom/browser/api/atom_api_menu_mac.mm',
'atom/browser/api/atom_api_power_monitor.cc',
'atom/browser/api/atom_api_power_monitor.h',
'atom/browser/api/atom_api_protocol.cc',
'atom/browser/api/atom_api_protocol.h',
'atom/browser/api/atom_api_tray.cc',
'atom/browser/api/atom_api_tray.h',
'atom/browser/api/atom_api_web_contents.cc',
'atom/browser/api/atom_api_web_contents.h',
'atom/browser/api/atom_api_window.cc',
'atom/browser/api/atom_api_window.h',
'atom/browser/api/event.cc',
'atom/browser/api/event.h',
'atom/browser/api/event_emitter.cc',
'atom/browser/api/event_emitter.h',
'atom/browser/auto_updater.cc',
'atom/browser/auto_updater.h',
'atom/browser/auto_updater_delegate.h',
'atom/browser/auto_updater_linux.cc',
'atom/browser/auto_updater_mac.mm',
'atom/browser/auto_updater_win.cc',
'atom/browser/atom_access_token_store.cc',
'atom/browser/atom_access_token_store.h',
'atom/browser/atom_browser_client.cc',
'atom/browser/atom_browser_client.h',
'atom/browser/atom_browser_context.cc',
'atom/browser/atom_browser_context.h',
'atom/browser/atom_browser_main_parts.cc',
'atom/browser/atom_browser_main_parts.h',
'atom/browser/atom_browser_main_parts_linux.cc',
'atom/browser/atom_browser_main_parts_mac.mm',
'atom/browser/atom_javascript_dialog_manager.cc',
'atom/browser/atom_javascript_dialog_manager.h',
'atom/browser/atom_speech_recognition_manager_delegate.cc',
'atom/browser/atom_speech_recognition_manager_delegate.h',
'atom/browser/browser.cc',
'atom/browser/browser.h',
'atom/browser/browser_linux.cc',
'atom/browser/browser_mac.mm',
'atom/browser/browser_win.cc',
'atom/browser/browser_observer.h',
'atom/browser/javascript_environment.cc',
'atom/browser/javascript_environment.h',
'atom/browser/mac/atom_application.h',
'atom/browser/mac/atom_application.mm',
'atom/browser/mac/atom_application_delegate.h',
'atom/browser/mac/atom_application_delegate.mm',
'atom/browser/native_window.cc',
'atom/browser/native_window.h',
'atom/browser/native_window_views.cc',
'atom/browser/native_window_views.h',
'atom/browser/native_window_mac.h',
'atom/browser/native_window_mac.mm',
'atom/browser/native_window_observer.h',
'atom/browser/net/adapter_request_job.cc',
'atom/browser/net/adapter_request_job.h',
'atom/browser/net/asar/asar_protocol_handler.cc',
'atom/browser/net/asar/asar_protocol_handler.h',
'atom/browser/net/asar/url_request_asar_job.cc',
'atom/browser/net/asar/url_request_asar_job.h',
'atom/browser/net/atom_url_request_job_factory.cc',
'atom/browser/net/atom_url_request_job_factory.h',
'atom/browser/net/url_request_string_job.cc',
'atom/browser/net/url_request_string_job.h',
'atom/browser/node_debugger.cc',
'atom/browser/node_debugger.h',
'atom/browser/ui/accelerator_util.cc',
'atom/browser/ui/accelerator_util.h',
'atom/browser/ui/accelerator_util_mac.mm',
'atom/browser/ui/accelerator_util_views.cc',
'atom/browser/ui/cocoa/atom_menu_controller.h',
'atom/browser/ui/cocoa/atom_menu_controller.mm',
'atom/browser/ui/cocoa/event_processing_window.h',
'atom/browser/ui/cocoa/event_processing_window.mm',
'atom/browser/ui/file_dialog.h',
'atom/browser/ui/file_dialog_gtk.cc',
'atom/browser/ui/file_dialog_mac.mm',
'atom/browser/ui/file_dialog_win.cc',
'atom/browser/ui/message_box.h',
'atom/browser/ui/message_box_mac.mm',
'atom/browser/ui/message_box_views.cc',
'atom/browser/ui/tray_icon.cc',
'atom/browser/ui/tray_icon.h',
'atom/browser/ui/tray_icon_gtk.cc',
'atom/browser/ui/tray_icon_gtk.h',
'atom/browser/ui/tray_icon_cocoa.h',
'atom/browser/ui/tray_icon_cocoa.mm',
'atom/browser/ui/tray_icon_observer.h',
'atom/browser/ui/tray_icon_win.cc',
'atom/browser/ui/views/frameless_view.cc',
'atom/browser/ui/views/frameless_view.h',
'atom/browser/ui/views/global_menu_bar_x11.cc',
'atom/browser/ui/views/global_menu_bar_x11.h',
'atom/browser/ui/views/menu_bar.cc',
'atom/browser/ui/views/menu_bar.h',
'atom/browser/ui/views/menu_delegate.cc',
'atom/browser/ui/views/menu_delegate.h',
'atom/browser/ui/views/menu_layout.cc',
'atom/browser/ui/views/menu_layout.h',
'atom/browser/ui/views/submenu_button.cc',
'atom/browser/ui/views/submenu_button.h',
'atom/browser/ui/views/win_frame_view.cc',
'atom/browser/ui/views/win_frame_view.h',
'atom/browser/ui/win/notify_icon_host.cc',
'atom/browser/ui/win/notify_icon_host.h',
'atom/browser/ui/win/notify_icon.cc',
'atom/browser/ui/win/notify_icon.h',
'atom/browser/ui/x/window_state_watcher.cc',
'atom/browser/ui/x/window_state_watcher.h',
'atom/browser/ui/x/x_window_utils.cc',
'atom/browser/ui/x/x_window_utils.h',
'atom/browser/web_view/web_view_manager.cc',
'atom/browser/web_view/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.h',
'atom/browser/window_list.cc',
'atom/browser/window_list.h',
'atom/browser/window_list_observer.h',
'atom/common/api/api_messages.h',
'atom/common/api/atom_api_asar.cc',
'atom/common/api/atom_api_clipboard.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.h',
'atom/common/api/atom_api_screen.cc',
'atom/common/api/atom_api_screen.h',
'atom/common/api/atom_api_shell.cc',
'atom/common/api/atom_api_v8_util.cc',
'atom/common/api/atom_bindings.cc',
'atom/common/api/atom_bindings.h',
'atom/common/api/object_life_monitor.cc',
'atom/common/api/object_life_monitor.h',
'atom/common/asar/archive.cc',
'atom/common/asar/archive.h',
'atom/common/asar/scoped_temporary_file.cc',
'atom/common/asar/scoped_temporary_file.h',
'atom/common/common_message_generator.cc',
'atom/common/common_message_generator.h',
'atom/common/crash_reporter/crash_reporter.cc',
'atom/common/crash_reporter/crash_reporter.h',
'atom/common/crash_reporter/crash_reporter_linux.cc',
'atom/common/crash_reporter/crash_reporter_linux.h',
'atom/common/crash_reporter/crash_reporter_mac.h',
'atom/common/crash_reporter/crash_reporter_mac.mm',
'atom/common/crash_reporter/crash_reporter_win.cc',
'atom/common/crash_reporter/crash_reporter_win.h',
'atom/common/crash_reporter/linux/crash_dump_handler.cc',
'atom/common/crash_reporter/linux/crash_dump_handler.h',
'atom/common/crash_reporter/win/crash_service.cc',
'atom/common/crash_reporter/win/crash_service.h',
'atom/common/crash_reporter/win/crash_service_main.cc',
'atom/common/crash_reporter/win/crash_service_main.h',
'atom/common/draggable_region.cc',
'atom/common/draggable_region.h',
'atom/common/google_api_key.h',
'atom/common/linux/application_info.cc',
'atom/common/native_mate_converters/accelerator_converter.cc',
'atom/common/native_mate_converters/accelerator_converter.h',
'atom/common/native_mate_converters/file_path_converter.h',
'atom/common/native_mate_converters/gfx_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.h',
'atom/common/native_mate_converters/image_converter_mac.mm',
'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.h',
'atom/common/native_mate_converters/value_converter.cc',
'atom/common/native_mate_converters/value_converter.h',
'atom/common/node_bindings.cc',
'atom/common/node_bindings.h',
'atom/common/node_bindings_linux.cc',
'atom/common/node_bindings_linux.h',
'atom/common/node_bindings_mac.cc',
'atom/common/node_bindings_mac.h',
'atom/common/node_bindings_win.cc',
'atom/common/node_bindings_win.h',
'atom/common/node_includes.h',
'atom/common/options_switches.cc',
'atom/common/options_switches.h',
'atom/common/platform_util.h',
'atom/common/platform_util_linux.cc',
'atom/common/platform_util_mac.mm',
'atom/common/platform_util_win.cc',
'atom/renderer/api/atom_api_renderer_ipc.cc',
'atom/renderer/api/atom_api_spell_check_client.cc',
'atom/renderer/api/atom_api_spell_check_client.h',
'atom/renderer/api/atom_api_web_frame.cc',
'atom/renderer/api/atom_api_web_frame.h',
'atom/renderer/api/atom_renderer_bindings.cc',
'atom/renderer/api/atom_renderer_bindings.h',
'atom/renderer/atom_render_view_observer.cc',
'atom/renderer/atom_render_view_observer.h',
'atom/renderer/atom_renderer_client.cc',
'atom/renderer/atom_renderer_client.h',
'chromium_src/chrome/browser/browser_process.cc',
'chromium_src/chrome/browser/browser_process.h',
'chromium_src/chrome/browser/chrome_notification_types.h',
'chromium_src/chrome/browser/extensions/global_shortcut_listener.cc',
'chromium_src/chrome/browser/extensions/global_shortcut_listener.h',
'chromium_src/chrome/browser/extensions/global_shortcut_listener_mac.mm',
'chromium_src/chrome/browser/extensions/global_shortcut_listener_mac.h',
'chromium_src/chrome/browser/extensions/global_shortcut_listener_x11.cc',
'chromium_src/chrome/browser/extensions/global_shortcut_listener_x11.h',
'chromium_src/chrome/browser/extensions/global_shortcut_listener_win.cc',
'chromium_src/chrome/browser/extensions/global_shortcut_listener_win.h',
'chromium_src/chrome/browser/printing/print_job.cc',
'chromium_src/chrome/browser/printing/print_job.h',
'chromium_src/chrome/browser/printing/print_job_manager.cc',
'chromium_src/chrome/browser/printing/print_job_manager.h',
'chromium_src/chrome/browser/printing/print_job_worker.cc',
'chromium_src/chrome/browser/printing/print_job_worker.h',
'chromium_src/chrome/browser/printing/print_job_worker_owner.cc',
'chromium_src/chrome/browser/printing/print_job_worker_owner.h',
'chromium_src/chrome/browser/printing/print_view_manager_base.cc',
'chromium_src/chrome/browser/printing/print_view_manager_base.h',
'chromium_src/chrome/browser/printing/print_view_manager_basic.cc',
'chromium_src/chrome/browser/printing/print_view_manager_basic.h',
'chromium_src/chrome/browser/printing/print_view_manager_observer.h',
'chromium_src/chrome/browser/printing/printer_query.cc',
'chromium_src/chrome/browser/printing/printer_query.h',
'chromium_src/chrome/browser/printing/printing_message_filter.cc',
'chromium_src/chrome/browser/printing/printing_message_filter.h',
'chromium_src/chrome/browser/speech/tts_controller.h',
'chromium_src/chrome/browser/speech/tts_controller_impl.cc',
'chromium_src/chrome/browser/speech/tts_controller_impl.h',
'chromium_src/chrome/browser/speech/tts_linux.cc',
'chromium_src/chrome/browser/speech/tts_mac.mm',
'chromium_src/chrome/browser/speech/tts_message_filter.cc',
'chromium_src/chrome/browser/speech/tts_message_filter.h',
'chromium_src/chrome/browser/speech/tts_platform.cc',
'chromium_src/chrome/browser/speech/tts_platform.h',
'chromium_src/chrome/browser/speech/tts_win.cc',
'chromium_src/chrome/browser/ui/browser_dialogs.h',
'chromium_src/chrome/browser/ui/cocoa/color_chooser_mac.mm',
'chromium_src/chrome/browser/ui/views/color_chooser_aura.cc',
'chromium_src/chrome/browser/ui/views/color_chooser_aura.h',
'chromium_src/chrome/browser/ui/views/frame/global_menu_bar_registrar_x11.cc',
'chromium_src/chrome/browser/ui/views/frame/global_menu_bar_registrar_x11.h',
'chromium_src/chrome/common/print_messages.cc',
'chromium_src/chrome/common/print_messages.h',
'chromium_src/chrome/common/tts_messages.h',
'chromium_src/chrome/common/tts_utterance_request.cc',
'chromium_src/chrome/common/tts_utterance_request.h',
'chromium_src/chrome/renderer/printing/print_web_view_helper.cc',
'chromium_src/chrome/renderer/printing/print_web_view_helper_linux.cc',
'chromium_src/chrome/renderer/printing/print_web_view_helper_mac.mm',
'chromium_src/chrome/renderer/printing/print_web_view_helper_pdf_win.cc',
'chromium_src/chrome/renderer/printing/print_web_view_helper.h',
'chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.cc',
'chromium_src/chrome/renderer/spellchecker/spellcheck_worditerator.h',
'chromium_src/chrome/renderer/tts_dispatcher.cc',
'chromium_src/chrome/renderer/tts_dispatcher.h',
'chromium_src/library_loaders/libgio_loader.cc',
'chromium_src/library_loaders/libgio.h',
'chromium_src/library_loaders/libspeechd_loader.cc',
'chromium_src/library_loaders/libspeechd.h',
'<@(native_mate_files)',
],
'lib_sources_win': [
'chromium_src/chrome/browser/ui/views/color_chooser_dialog.cc',
'chromium_src/chrome/browser/ui/views/color_chooser_dialog.h',
'chromium_src/chrome/browser/ui/views/color_chooser_win.cc',
],
'framework_sources': [
'atom/app/atom_library_main.cc',
'atom/app/atom_library_main.h',
],
'locales': [
'am', 'ar', 'bg', 'bn', 'ca', 'cs', 'da', 'de', 'el', 'en-GB',
'en-US', 'es-419', 'es', 'et', 'fa', 'fi', 'fil', 'fr', 'gu', 'he',
'hi', 'hr', 'hu', 'id', 'it', 'ja', 'kn', 'ko', 'lt', 'lv',
'ml', 'mr', 'ms', 'nb', 'nl', 'pl', 'pt-BR', 'pt-PT', 'ro', 'ru',
'sk', 'sl', 'sr', 'sv', 'sw', 'ta', 'te', 'th', 'tr', 'uk',
'vi', 'zh-CN', 'zh-TW',
],
'project_name%': 'electron',
'product_name%': 'Electron',
'company_name%': 'GitHub, Inc',
'company_abbr%': 'github',
'version%': '0.24.0',
'atom_source_root': '<!(["python", "tools/atom_source_root.py"])',
'conditions': [
['OS=="win"', {
'app_sources': [
'atom/browser/resources/win/resource.h',
'atom/browser/resources/win/atom.ico',
'atom/browser/resources/win/atom.rc',
'<(libchromiumcontent_src_dir)/content/app/startup_helper_win.cc',
],
}], # OS=="win"
['OS=="mac"', {
'apply_locales_cmd': ['python', 'tools/mac/apply_locales.py'],
}], # OS=="mac"
],
},
'includes': [
'filenames.gypi',
'vendor/native_mate/native_mate_files.gypi',
],
'target_defaults': {
'defines': [
'ATOM_PRODUCT_NAME="<(product_name)"',
'ATOM_PROJECT_NAME="<(project_name)"',
],
'mac_framework_dirs': [
'<(atom_source_root)/external_binaries',
],
'includes': [
# Rules for excluding e.g. foo_win.cc from the build on non-Windows.
'filename_rules.gypi',
],
'configurations': {
'Debug': {
'defines': [ 'DEBUG' ],
'cflags': [ '-g', '-O0' ],
},
},
},
'targets': [
{
'target_name': '<(project_name)',
'type': 'executable',
'dependencies': [
'generated_sources',
'compile_coffee',
'<(project_name)_lib',
],
'sources': [
@@ -407,6 +47,7 @@
'<(project_name)_helper',
],
'xcode_settings': {
'ATOM_BUNDLE_ID': 'com.<(company_abbr).<(project_name)',
'INFOPLIST_FILE': 'atom/browser/resources/mac/Info.plist',
'LD_RUNPATH_SEARCH_PATHS': [
'@executable_path/../Frameworks',
@@ -456,6 +97,7 @@
{
'postbuild_name': 'Make Empty Localizations',
'variables': {
'apply_locales_cmd': ['python', 'tools/mac/apply_locales.py'],
'locale_dirs': [
'>!@(<(apply_locales_cmd) -d ZZLOCALE.lproj <(locales))',
],
@@ -472,22 +114,42 @@
],
}], # OS!="mac"
['OS=="win"', {
'msvs_settings': {
'VCLinkerTool': {
'AdditionalOptions': [
# Force linking even though we have duplicate symbols between
# BoringSSL and OpenSSL.
'/FORCE:MULTIPLE',
],
},
},
'copies': [
{
'variables': {
'conditions': [
['libchromiumcontent_component', {
'copied_libraries': [
'<@(libchromiumcontent_shared_libraries)',
'<@(libchromiumcontent_shared_v8_libraries)',
],
}, {
'copied_libraries': [],
}],
],
},
'destination': '<(PRODUCT_DIR)',
'files': [
'<(libchromiumcontent_library_dir)/chromiumcontent.dll',
'<(libchromiumcontent_library_dir)/ffmpegsumo.dll',
'<(libchromiumcontent_library_dir)/libEGL.dll',
'<(libchromiumcontent_library_dir)/libGLESv2.dll',
'<(libchromiumcontent_resources_dir)/icudtl.dat',
'<(libchromiumcontent_resources_dir)/content_resources_200_percent.pak',
'<(libchromiumcontent_resources_dir)/content_shell.pak',
'<(libchromiumcontent_resources_dir)/ui_resources_200_percent.pak',
'external_binaries/d3dcompiler_46.dll',
'external_binaries/msvcp120.dll',
'external_binaries/msvcr120.dll',
'external_binaries/vccorlib120.dll',
'<@(copied_libraries)',
'<(libchromiumcontent_dir)/ffmpegsumo.dll',
'<(libchromiumcontent_dir)/libEGL.dll',
'<(libchromiumcontent_dir)/libGLESv2.dll',
'<(libchromiumcontent_dir)/icudtl.dat',
'<(libchromiumcontent_dir)/content_resources_200_percent.pak',
'<(libchromiumcontent_dir)/content_shell.pak',
'<(libchromiumcontent_dir)/ui_resources_200_percent.pak',
'<(libchromiumcontent_dir)/natives_blob.bin',
'<(libchromiumcontent_dir)/snapshot_blob.bin',
'external_binaries/d3dcompiler_47.dll',
'external_binaries/xinput1_3.dll',
],
},
@@ -502,12 +164,29 @@
['OS=="linux"', {
'copies': [
{
'variables': {
'conditions': [
['libchromiumcontent_component', {
'copied_libraries': [
'<(PRODUCT_DIR)/lib/libnode.so',
'<@(libchromiumcontent_shared_libraries)',
'<@(libchromiumcontent_shared_v8_libraries)',
],
}, {
'copied_libraries': [
'<(PRODUCT_DIR)/lib/libnode.so',
],
}],
],
},
'destination': '<(PRODUCT_DIR)',
'files': [
'<(libchromiumcontent_library_dir)/libchromiumcontent.so',
'<(libchromiumcontent_library_dir)/libffmpegsumo.so',
'<(libchromiumcontent_resources_dir)/icudtl.dat',
'<(libchromiumcontent_resources_dir)/content_shell.pak',
'<@(copied_libraries)',
'<(libchromiumcontent_dir)/libffmpegsumo.so',
'<(libchromiumcontent_dir)/icudtl.dat',
'<(libchromiumcontent_dir)/content_shell.pak',
'<(libchromiumcontent_dir)/natives_blob.bin',
'<(libchromiumcontent_dir)/snapshot_blob.bin',
],
},
{
@@ -524,15 +203,20 @@
'target_name': '<(project_name)_lib',
'type': 'static_library',
'dependencies': [
'atom_coffee2c',
'vendor/brightray/brightray.gyp:brightray',
'vendor/node/node.gyp:node_lib',
'vendor/node/node.gyp:node',
],
'defines': [
'PRODUCT_NAME="<(product_name)"',
# This is defined in skia/skia_common.gypi.
'SK_SUPPORT_LEGACY_GETTOPDEVICE',
# Disable warnings for g_settings_list_schemas.
'GLIB_DISABLE_DEPRECATION_WARNINGS',
# Defined in Chromium but not exposed in its gyp file.
'V8_USE_EXTERNAL_STARTUP_DATA',
'ENABLE_PLUGINS',
# Needed by Node.
'NODE_WANT_INTERNALS=1',
],
'sources': [
'<@(lib_sources)',
@@ -542,14 +226,18 @@
'chromium_src',
'vendor/brightray',
'vendor/native_mate',
# Include atom_natives.h.
'<(SHARED_INTERMEDIATE_DIR)',
# Include directories for uv and node.
'vendor/node/src',
'vendor/node/deps/http_parser',
'vendor/node/deps/uv/include',
# The `node.h` is using `#include"v8.h"`.
'vendor/brightray/vendor/download/libchromiumcontent/src/v8/include',
'<(libchromiumcontent_src_dir)/v8/include',
# The `node.h` is using `#include"ares.h"`.
'vendor/node/deps/cares/include',
# The `third_party/WebKit/Source/platform/weborigin/SchemeRegistry.h` is using `platform/PlatformExport.h`.
'<(libchromiumcontent_src_dir)/third_party/WebKit/Source',
],
'direct_dependent_settings': {
'include_dirs': [
@@ -560,6 +248,11 @@
'vendor/brightray/brightray.gyp:brightray',
],
'conditions': [
['libchromiumcontent_component', {
'link_settings': {
'libraries': [ '<@(libchromiumcontent_v8_libraries)' ],
},
}],
['OS=="win"', {
'sources': [
'<@(lib_sources_win)',
@@ -573,6 +266,13 @@
],
},
'dependencies': [
# Node is built as static_library on Windows, so we also need to
# include its dependencies here.
'vendor/node/deps/cares/cares.gyp:cares',
'vendor/node/deps/http_parser/http_parser.gyp:http_parser',
'vendor/node/deps/uv/uv.gyp:libuv',
'vendor/node/deps/zlib/zlib.gyp:zlib',
# Build with breakpad support.
'vendor/breakpad/breakpad.gyp:breakpad_handler',
'vendor/breakpad/breakpad.gyp:breakpad_sender',
],
@@ -594,15 +294,13 @@
],
},
# Required settings of using breakpad.
'include_dirs': [
'vendor/breakpad/src',
],
'cflags': [
'<!@(pkg-config --cflags dbus-1)',
'-Wno-deprecated-register',
'cflags_cc': [
'-Wno-empty-body',
'-Wno-reserved-user-defined-literal',
],
'include_dirs': [
'vendor/breakpad/src',
],
'dependencies': [
'vendor/breakpad/breakpad.gyp:breakpad_client',
],
@@ -610,176 +308,56 @@
],
}, # target <(product_name)_lib
{
'target_name': 'generated_sources',
'type': 'none',
'sources': [
'<@(coffee_sources)',
],
'rules': [
{
'rule_name': 'coffee',
'extension': 'coffee',
'inputs': [
'script/compile-coffee.py',
],
'conditions': [
['OS=="mac"', {
'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"
],
},
],
}, # target generated_sources
{
'target_name': '<(project_name)_dump_symbols',
'type': 'none',
'dependencies': [
'<(project_name)',
],
'conditions': [
['OS=="mac"', {
'dependencies': [
'vendor/breakpad/breakpad.gyp:dump_syms',
],
'actions': [
{
'action_name': 'Dump Symbols',
'inputs': [
'<(PRODUCT_DIR)/<(product_name).app/Contents/MacOS/<(product_name)',
],
'outputs': [
'<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
],
'action': [
'python',
'tools/posix/generate_breakpad_symbols.py',
'--build-dir=<(PRODUCT_DIR)',
'--binary=<(PRODUCT_DIR)/<(product_name).app/Contents/MacOS/<(product_name)',
'--symbols-dir=<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
'--libchromiumcontent-dir=<(libchromiumcontent_library_dir)',
'--clear',
'--jobs=16',
],
},
],
}], # OS=="mac"
['OS=="win"', {
'actions': [
{
'action_name': 'Dump Symbols',
'inputs': [
'<(PRODUCT_DIR)/<(project_name).exe',
],
'outputs': [
'<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
],
'action': [
'python',
'tools/win/generate_breakpad_symbols.py',
'--symbols-dir=<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
'--jobs=16',
'<(PRODUCT_DIR)',
'<(libchromiumcontent_library_dir)',
],
},
],
}], # OS=="win"
['OS=="linux"', {
'dependencies': [
'vendor/breakpad/breakpad.gyp:dump_syms',
],
'actions': [
{
'action_name': 'Dump Symbols',
'inputs': [
'<(PRODUCT_DIR)/<(project_name)',
],
'outputs': [
'<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
],
'action': [
'python',
'tools/posix/generate_breakpad_symbols.py',
'--build-dir=<(PRODUCT_DIR)',
'--binary=<(PRODUCT_DIR)/<(project_name)',
'--symbols-dir=<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
'--libchromiumcontent-dir=<(libchromiumcontent_library_dir)',
'--clear',
'--jobs=16',
],
},
{
'action_name': 'Strip Binary',
'inputs': [
'<(PRODUCT_DIR)/libchromiumcontent.so',
'<(PRODUCT_DIR)/libffmpegsumo.so',
'<(PRODUCT_DIR)/<(project_name)',
# Add the syms folder as input would force this action to run
# after the 'Dump Symbols' action. And since it is a folder,
# it would be ignored by the 'strip' command.
'<(PRODUCT_DIR)/Atom-Shell.breakpad.syms',
],
'outputs': [
# Gyp action requires a output file, add a fake one here.
'<(PRODUCT_DIR)/dummy_file',
],
'action': [
'tools/posix/strip.sh',
'<@(_inputs)',
],
},
],
}], # OS=="linux"
],
}, # target <(project_name>_dump_symbols
{
'target_name': 'copy_chromedriver',
'target_name': 'compile_coffee',
'type': 'none',
'actions': [
{
'action_name': 'Copy ChromeDriver Binary',
'action_name': 'compile_coffee',
'variables': {
'conditions': [
['OS=="win"', {
'chromedriver_binary': 'chromedriver.exe',
['OS=="mac"', {
'resources_path': '<(PRODUCT_DIR)/<(product_name).app/Contents/Resources',
},{
'chromedriver_binary': 'chromedriver',
'resources_path': '<(PRODUCT_DIR)/resources',
}],
],
},
'inputs': [
'<(libchromiumcontent_library_dir)/<(chromedriver_binary)',
'<@(coffee_sources)',
],
'outputs': [
'<(PRODUCT_DIR)/<(chromedriver_binary)',
'<(resources_path)/atom.asar',
],
'action': [
'python',
'tools/copy_binary.py',
'<@(_inputs)',
'tools/coffee2asar.py',
'<@(_outputs)',
'<@(_inputs)',
],
}
],
}, # copy_chromedriver
}, # 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
],
'conditions': [
['OS=="mac"', {
@@ -797,7 +375,7 @@
'include_dirs': [
'.',
'vendor',
'<(libchromiumcontent_include_dir)',
'<(libchromiumcontent_src_dir)',
],
'export_dependent_settings': [
'<(project_name)_lib',
@@ -814,14 +392,14 @@
'mac_bundle': 1,
'mac_bundle_resources': [
'atom/common/resources/mac/MainMenu.xib',
'<(libchromiumcontent_resources_dir)/content_shell.pak',
'<(libchromiumcontent_resources_dir)/icudtl.dat',
'<(libchromiumcontent_dir)/content_shell.pak',
'<(libchromiumcontent_dir)/icudtl.dat',
'<(libchromiumcontent_dir)/natives_blob.bin',
'<(libchromiumcontent_dir)/snapshot_blob.bin',
],
'xcode_settings': {
'ATOM_BUNDLE_ID': 'com.<(company_abbr).<(project_name).framework',
'INFOPLIST_FILE': 'atom/common/resources/mac/Info.plist',
'LIBRARY_SEARCH_PATHS': [
'<(libchromiumcontent_library_dir)',
],
'LD_DYLIB_INSTALL_NAME': '@rpath/<(product_name) Framework.framework/<(product_name) Framework',
'LD_RUNPATH_SEARCH_PATHS': [
'@loader_path/Libraries',
@@ -832,10 +410,25 @@
},
'copies': [
{
'variables': {
'conditions': [
['libchromiumcontent_component', {
'copied_libraries': [
'<(PRODUCT_DIR)/libnode.dylib',
'<@(libchromiumcontent_shared_libraries)',
'<@(libchromiumcontent_shared_v8_libraries)',
],
}, {
'copied_libraries': [
'<(PRODUCT_DIR)/libnode.dylib',
],
}],
],
},
'destination': '<(PRODUCT_DIR)/<(product_name) Framework.framework/Versions/A/Libraries',
'files': [
'<(libchromiumcontent_library_dir)/ffmpegsumo.so',
'<(libchromiumcontent_library_dir)/libchromiumcontent.dylib',
'<@(copied_libraries)',
'<(libchromiumcontent_dir)/ffmpegsumo.so',
],
},
{
@@ -847,6 +440,16 @@
},
],
'postbuilds': [
{
'postbuild_name': 'Fix path of libnode',
'action': [
'install_name_tool',
'-change',
'/usr/local/lib/libnode.dylib',
'@rpath/libnode.dylib',
'${BUILT_PRODUCTS_DIR}/<(product_name) Framework.framework/Versions/A/<(product_name) Framework',
],
},
{
'postbuild_name': 'Add symlinks for framework subdirectories',
'action': [
@@ -873,6 +476,7 @@
],
'mac_bundle': 1,
'xcode_settings': {
'ATOM_BUNDLE_ID': 'com.<(company_abbr).<(project_name).helper',
'INFOPLIST_FILE': 'atom/renderer/resources/mac/Info.plist',
'LD_RUNPATH_SEARCH_PATHS': [
'@executable_path/../../..',
@@ -906,37 +510,5 @@
},
],
}], # OS!="mac"
['OS=="win"', {
'targets': [
{
'target_name': 'generate_node_lib',
'type': 'none',
'dependencies': [
'<(project_name)',
],
'actions': [
{
'action_name': 'Create node.lib',
'inputs': [
'<(PRODUCT_DIR)/<(project_name).lib',
'<(libchromiumcontent_library_dir)/chromiumcontent.dll.lib',
],
'outputs': [
'<(PRODUCT_DIR)/node.lib',
],
'action': [
'lib.exe',
'/nologo',
# We can't use <(_outputs) here because that escapes the
# backslash in the path, which confuses lib.exe.
'/OUT:<(PRODUCT_DIR)\\node.lib',
'<@(_inputs)',
],
'msvs_cygwin_shell': 0,
},
],
}, # target generate_node_lib
],
}], # OS==win
],
}

View File

@@ -19,10 +19,10 @@ class AtomContentClient : public brightray::ContentClient {
protected:
// content::ContentClient:
virtual std::string GetProduct() const OVERRIDE;
virtual void AddAdditionalSchemes(
std::string GetProduct() const override;
void AddAdditionalSchemes(
std::vector<std::string>* standard_schemes,
std::vector<std::string>* savable_schemes) OVERRIDE;
std::vector<std::string>* savable_schemes) override;
private:
DISALLOW_COPY_AND_ASSIGN(AtomContentClient);

View File

@@ -1,18 +0,0 @@
// 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_library_main.h"
#include "atom/app/atom_main_delegate.h"
#include "content/public/app/content_main.h"
#if defined(OS_MACOSX)
int AtomMain(int argc, const char* argv[]) {
atom::AtomMainDelegate delegate;
content::ContentMainParams params(&delegate);
params.argc = argc;
params.argv = argv;
return content::ContentMain(params);
}
#endif // OS_MACOSX

View File

@@ -11,6 +11,9 @@
extern "C" {
__attribute__((visibility("default")))
int AtomMain(int argc, const char* argv[]);
__attribute__((visibility("default")))
int AtomInitializeICUandStartNode(int argc, char *argv[]);
}
#endif // OS_MACOSX

View File

@@ -0,0 +1,36 @@
// 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_library_main.h"
#include "atom/app/atom_main_args.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/mac/bundle_locations.h"
#include "brightray/common/mac/main_application_bundle.h"
#include "content/public/app/content_main.h"
#if defined(OS_MACOSX)
int AtomMain(int argc, const char* argv[]) {
atom::AtomMainDelegate delegate;
content::ContentMainParams params(&delegate);
params.argc = argc;
params.argv = argv;
atom::AtomCommandLine::Init(argc, argv);
return content::ContentMain(params);
}
int AtomInitializeICUandStartNode(int argc, char *argv[]) {
base::AtExitManager atexit_manager;
base::mac::SetOverrideFrameworkBundlePath(
brightray::MainApplicationBundlePath()
.Append("Contents")
.Append("Frameworks")
.Append(ATOM_PRODUCT_NAME " Framework.framework"));
base::i18n::InitializeICU();
return atom::NodeMain(argc, argv);
}
#endif // OS_MACOSX

View File

@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "atom/app/atom_main.h"
#include "atom/app/atom_main_args.h"
#include <stdlib.h>
#include <string.h>
@@ -13,11 +14,14 @@
#include <fcntl.h>
#include <windows.h>
#include <shellscalingapi.h>
#include <tchar.h>
#include <shellapi.h>
#include "atom/app/atom_main_delegate.h"
#include "atom/common/crash_reporter/win/crash_service_main.h"
#include "base/environment.h"
#include "base/win/windows_version.h"
#include "content/public/app/startup_helper_win.h"
#include "sandbox/win/src/sandbox_types.h"
#include "ui/gfx/win/dpi.h"
@@ -28,13 +32,53 @@
#include "atom/app/atom_library_main.h"
#endif // defined(OS_MACOSX)
// Declaration of node::Start.
namespace node {
int Start(int argc, char *argv[]);
}
#include "atom/app/node_main.h"
#include "base/i18n/icu_util.h"
#if defined(OS_WIN)
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;
}
// 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 argc = 0;
wchar_t** wargv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
@@ -52,44 +96,46 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
freopen_s(&dontcare, "CON", "r", stdin);
}
std::string node_indicator, crash_service_indicator;
if (env->GetVar("ATOM_SHELL_INTERNAL_RUN_AS_NODE", &node_indicator) &&
node_indicator == "1") {
// Convert argv to to UTF8
char** argv = new char*[argc];
for (int i = 0; i < argc; i++) {
// Compute the size of the required buffer
DWORD size = WideCharToMultiByte(CP_UTF8,
// Convert argv to to UTF8
char** argv = new char*[argc];
for (int i = 0; i < argc; i++) {
// Compute the size of the required buffer
DWORD size = WideCharToMultiByte(CP_UTF8,
0,
wargv[i],
-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,
wargv[i],
-1,
NULL,
0,
argv[i],
size,
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,
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);
}
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.
return node::Start(argc, argv);
}
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();
return atom::NodeMain(argc, argv);
} else if (env->GetVar("ATOM_SHELL_INTERNAL_CRASH_SERVICE",
&crash_service_indicator) &&
crash_service_indicator == "1") {
@@ -100,12 +146,16 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
content::InitializeSandboxInfo(&sandbox_info);
atom::AtomMainDelegate delegate;
// Now chrome relies on a regkey to enable high dpi support.
gfx::EnableHighDPISupport();
// We don't want to set DPI awareness on pre-Win7 because we don't support
// 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);
params.instance = instance;
params.sandbox_info = &sandbox_info;
atom::AtomCommandLine::Init(argc, argv);
return content::ContentMain(params);
}
@@ -113,13 +163,16 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
int main(int argc, const char* argv[]) {
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0)
return node::Start(argc, const_cast<char**>(argv));
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) {
base::i18n::InitializeICU();
return atom::NodeMain(argc, const_cast<char**>(argv));
}
atom::AtomMainDelegate delegate;
content::ContentMainParams params(&delegate);
params.argc = argc;
params.argv = argv;
atom::AtomCommandLine::Init(argc, argv);
return content::ContentMain(params);
}
@@ -127,8 +180,9 @@ int main(int argc, const char* argv[]) {
int main(int argc, const char* argv[]) {
char* node_indicator = getenv("ATOM_SHELL_INTERNAL_RUN_AS_NODE");
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0)
return node::Start(argc, const_cast<char**>(argv));
if (node_indicator != NULL && strcmp(node_indicator, "1") == 0) {
return AtomInitializeICUandStartNode(argc, const_cast<char**>(argv));
}
return AtomMain(argc, argv);
}

View File

@@ -0,0 +1,22 @@
// 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"
#include "vendor/node/deps/uv/include/uv.h"
namespace atom {
// static
std::vector<std::string> AtomCommandLine::argv_;
// static
void AtomCommandLine::Init(int argc, const char* const* argv) {
// Hack around with the argv pointer. Used for process.title = "blah"
char** new_argv = uv_setup_args(argc, const_cast<char**>(argv));
for (int i = 0; i < argc; ++i) {
argv_.push_back(new_argv[i]);
}
}
} // namespace atom

29
atom/app/atom_main_args.h Normal file
View 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_

View File

@@ -27,8 +27,8 @@ AtomMainDelegate::~AtomMainDelegate() {
bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
// Disable logging out to debug.log on Windows
#if defined(OS_WIN)
logging::LoggingSettings settings;
#if defined(OS_WIN)
#if defined(DEBUG)
settings.logging_dest = logging::LOG_TO_ALL;
settings.log_file = L"debug.log";
@@ -36,15 +36,15 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
settings.delete_old = logging::DELETE_OLD_LOG_FILE;
#else
settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG;
#endif
logging::InitLogging(settings);
#endif // defined(DEBUG)
#endif // defined(OS_WIN)
logging::InitLogging(settings);
// Logging with pid and timestamp.
logging::SetLogItems(true, false, true, false);
// Enable convient stack printing.
#if defined(DEBUG) && defined(OS_LINUX)
// Enable convient stack printing.
base::debug::EnableInProcessStackDumping();
#endif
@@ -59,7 +59,7 @@ void AtomMainDelegate::PreSandboxStartup() {
if (!env->HasVar("GOOGLE_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(
switches::kProcessType);
@@ -67,9 +67,6 @@ void AtomMainDelegate::PreSandboxStartup() {
if (!process_type.empty())
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)
// Disable the LegacyRenderWidgetHostHWND, it made frameless windows unable
// to move and resize. We may consider enabling it again after upgraded to
@@ -84,9 +81,6 @@ void AtomMainDelegate::PreSandboxStartup() {
// Enable AVFoundation.
command_line->AppendSwitch("enable-avfoundation");
#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() {

View File

@@ -6,7 +6,9 @@
#include "base/mac/bundle_locations.h"
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "brightray/common/application_info.h"
#include "brightray/common/mac/main_application_bundle.h"
#include "content/public/common/content_paths.h"
@@ -19,19 +21,30 @@ base::FilePath GetFrameworksPath() {
.Append("Frameworks");
}
base::FilePath GetHelperAppPath(const base::FilePath& frameworks_path,
const std::string& name) {
return frameworks_path.Append(name + " Helper.app")
.Append("Contents")
.Append("MacOS")
.Append(name + " Helper");
}
} // namespace
void AtomMainDelegate::OverrideFrameworkBundlePath() {
base::mac::SetOverrideFrameworkBundlePath(
GetFrameworksPath().Append(PRODUCT_NAME " Framework.framework"));
GetFrameworksPath().Append(ATOM_PRODUCT_NAME " Framework.framework"));
}
void AtomMainDelegate::OverrideChildProcessPath() {
base::FilePath helper_path =
GetFrameworksPath().Append(PRODUCT_NAME " Helper.app")
.Append("Contents")
.Append("MacOS")
.Append(PRODUCT_NAME " Helper");
base::FilePath frameworks_path = GetFrameworksPath();
base::FilePath helper_path = GetHelperAppPath(frameworks_path,
ATOM_PRODUCT_NAME);
if (!base::PathExists(helper_path))
helper_path = GetHelperAppPath(frameworks_path,
brightray::GetApplicationName());
if (!base::PathExists(helper_path))
LOG(FATAL) << "Unable to find helper app";
PathService::Override(content::CHILD_PROCESS_EXE, helper_path);
}

56
atom/app/node_main.cc Normal file
View 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
View 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_

View File

@@ -12,11 +12,11 @@
#include "atom/browser/browser.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "base/values.h"
#include "base/command_line.h"
#include "base/environment.h"
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "brightray/browser/brightray_paths.h"
#include "native_mate/callback.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
@@ -27,10 +27,6 @@
#include "atom/common/node_includes.h"
#if defined(OS_LINUX)
#include "base/nix/xdg_util.h"
#endif
using atom::Browser;
namespace mate {
@@ -65,6 +61,30 @@ namespace api {
namespace {
// Return the path constant from string.
int GetPathConstant(const std::string& name) {
if (name == "appData")
return brightray::DIR_APP_DATA;
else if (name == "userData")
return brightray::DIR_USER_DATA;
else if (name == "cache")
return brightray::DIR_CACHE;
else if (name == "userCache")
return brightray::DIR_USER_CACHE;
else if (name == "home")
return base::DIR_HOME;
else if (name == "temp")
return base::DIR_TEMP;
else if (name == "userDesktop")
return base::DIR_USER_DESKTOP;
else if (name == "exe")
return base::FILE_EXE;
else if (name == "module")
return base::FILE_MODULE;
else
return -1;
}
class ResolveProxyHelper {
public:
ResolveProxyHelper(const GURL& url, App::ResolveProxyCallback callback)
@@ -111,6 +131,10 @@ App::~App() {
Browser::Get()->RemoveObserver(this);
}
void App::OnBeforeQuit(bool* prevent_default) {
*prevent_default = Emit("before-quit");
}
void App::OnWillQuit(bool* prevent_default) {
*prevent_default = Emit("will-quit");
}
@@ -124,15 +148,11 @@ void App::OnQuit() {
}
void App::OnOpenFile(bool* prevent_default, const std::string& file_path) {
base::ListValue args;
args.AppendString(file_path);
*prevent_default = Emit("open-file", args);
*prevent_default = Emit("open-file", file_path);
}
void App::OnOpenURL(const std::string& url) {
base::ListValue args;
args.AppendString(url);
Emit("open-url", args);
Emit("open-url", url);
}
void App::OnActivateWithNoOpenWindows() {
@@ -147,19 +167,26 @@ void App::OnFinishLaunching() {
Emit("ready");
}
base::FilePath App::GetDataPath() {
base::FilePath App::GetPath(mate::Arguments* args, const std::string& name) {
bool succeed = false;
base::FilePath path;
#if defined(OS_LINUX)
scoped_ptr<base::Environment> env(base::Environment::Create());
path = base::nix::GetXDGDirectory(env.get(),
base::nix::kXdgConfigHomeEnvVar,
base::nix::kDotConfigDir);
#else
PathService::Get(base::DIR_APP_DATA, &path);
#endif
int key = GetPathConstant(name);
if (key >= 0)
succeed = PathService::Get(key, &path);
if (!succeed)
args->ThrowError("Failed to get path");
return path;
}
return path.Append(base::FilePath::FromUTF8Unsafe(
Browser::Get()->GetName()));
void App::SetPath(mate::Arguments* args,
const std::string& name,
const base::FilePath& path) {
bool succeed = false;
int key = GetPathConstant(name);
if (key >= 0)
succeed = PathService::Override(key, path);
if (!succeed)
args->ThrowError("Failed to set path");
}
void App::ResolveProxy(const GURL& url, ResolveProxyCallback callback) {
@@ -192,7 +219,8 @@ mate::ObjectTemplateBuilder App::GetObjectTemplateBuilder(
.SetMethod("setUserTasks",
base::Bind(&Browser::SetUserTasks, browser))
#endif
.SetMethod("getDataPath", &App::GetDataPath)
.SetMethod("setPath", &App::SetPath)
.SetMethod("getPath", &App::GetPath)
.SetMethod("resolveProxy", &App::ResolveProxy)
.SetMethod("setDesktopName", &App::SetDesktopName);
}
@@ -210,11 +238,12 @@ mate::Handle<App> App::Create(v8::Isolate* isolate) {
namespace {
void AppendSwitch(const std::string& switch_string, mate::Arguments* args) {
auto command_line = base::CommandLine::ForCurrentProcess();
std::string value;
if (args->GetNext(&value))
CommandLine::ForCurrentProcess()->AppendSwitchASCII(switch_string, value);
command_line->AppendSwitchASCII(switch_string, value);
else
CommandLine::ForCurrentProcess()->AppendSwitch(switch_string);
command_line->AppendSwitch(switch_string);
}
#if defined(OS_MACOSX)
@@ -235,13 +264,13 @@ void DockSetMenu(atom::api::Menu* menu) {
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
v8::Handle<v8::Context> context, void* priv) {
v8::Isolate* isolate = context->GetIsolate();
CommandLine* command_line = CommandLine::ForCurrentProcess();
auto command_line = base::CommandLine::ForCurrentProcess();
mate::Dictionary dict(isolate, exports);
dict.Set("app", atom::api::App::Create(isolate));
dict.SetMethod("appendSwitch", &AppendSwitch);
dict.SetMethod("appendArgument",
base::Bind(&CommandLine::AppendArg,
base::Bind(&base::CommandLine::AppendArg,
base::Unretained(command_line)));
#if defined(OS_MACOSX)
auto browser = base::Unretained(Browser::Get());

View File

@@ -18,6 +18,10 @@ namespace base {
class FilePath;
}
namespace mate {
class Arguments;
}
namespace atom {
namespace api {
@@ -34,6 +38,7 @@ class App : public mate::EventEmitter,
virtual ~App();
// BrowserObserver:
void OnBeforeQuit(bool* prevent_default) override;
void OnWillQuit(bool* prevent_default) override;
void OnWindowAllClosed() override;
void OnQuit() override;
@@ -48,7 +53,12 @@ class App : public mate::EventEmitter,
v8::Isolate* isolate) override;
private:
base::FilePath GetDataPath();
// Get/Set the pre-defined path in PathService.
base::FilePath GetPath(mate::Arguments* args, const std::string& name);
void SetPath(mate::Arguments* args,
const std::string& name,
const base::FilePath& path);
void ResolveProxy(const GURL& url, ResolveProxyCallback callback);
void SetDesktopName(const std::string& desktop_name);

View File

@@ -5,7 +5,6 @@
#include "atom/browser/api/atom_api_auto_updater.h"
#include "base/time/time.h"
#include "base/values.h"
#include "atom/browser/auto_updater.h"
#include "atom/browser/browser.h"
#include "native_mate/dictionary.h"
@@ -26,9 +25,7 @@ AutoUpdater::~AutoUpdater() {
}
void AutoUpdater::OnError(const std::string& error) {
base::ListValue args;
args.AppendString(error);
Emit("error", args);
Emit("error", error);
}
void AutoUpdater::OnCheckingForUpdate() {
@@ -49,13 +46,8 @@ void AutoUpdater::OnUpdateDownloaded(const std::string& release_notes,
const std::string& update_url,
const base::Closure& quit_and_install) {
quit_and_install_ = quit_and_install;
base::ListValue args;
args.AppendString(release_notes);
args.AppendString(release_name);
args.AppendDouble(release_date.ToJsTime());
args.AppendString(update_url);
Emit("update-downloaded-raw", args);
Emit("update-downloaded-raw", release_notes, release_name,
release_date.ToJsTime(), update_url);
}
mate::ObjectTemplateBuilder AutoUpdater::GetObjectTemplateBuilder(

View File

@@ -26,20 +26,20 @@ class AutoUpdater : public mate::EventEmitter,
virtual ~AutoUpdater();
// AutoUpdaterDelegate implementations.
virtual void OnError(const std::string& error) OVERRIDE;
virtual void OnCheckingForUpdate() OVERRIDE;
virtual void OnUpdateAvailable() OVERRIDE;
virtual void OnUpdateNotAvailable() OVERRIDE;
virtual void OnUpdateDownloaded(
void OnError(const std::string& error) override;
void OnCheckingForUpdate() override;
void OnUpdateAvailable() override;
void OnUpdateNotAvailable() override;
void OnUpdateDownloaded(
const std::string& release_notes,
const std::string& release_name,
const base::Time& release_date,
const std::string& update_url,
const base::Closure& quit_and_install) OVERRIDE;
const base::Closure& quit_and_install) override;
// mate::Wrappable implementations:
virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate);
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
private:
void QuitAndInstall();

View File

@@ -62,31 +62,26 @@ namespace {
void Initialize(v8::Handle<v8::Object> exports, v8::Handle<v8::Value> unused,
v8::Handle<v8::Context> context, void* priv) {
TracingController* controller = TracingController::GetInstance();
auto controller = base::Unretained(TracingController::GetInstance());
mate::Dictionary dict(context->GetIsolate(), exports);
dict.SetMethod("getCategories", base::Bind(
&TracingController::GetCategories, base::Unretained(controller)));
&TracingController::GetCategories, controller));
dict.SetMethod("startRecording", base::Bind(
&TracingController::EnableRecording, base::Unretained(controller)));
&TracingController::EnableRecording, controller));
dict.SetMethod("stopRecording", base::Bind(
&TracingController::DisableRecording,
base::Unretained(controller),
nullptr));
&TracingController::DisableRecording, controller, nullptr));
dict.SetMethod("startMonitoring", base::Bind(
&TracingController::EnableMonitoring, base::Unretained(controller)));
&TracingController::EnableMonitoring, controller));
dict.SetMethod("stopMonitoring", base::Bind(
&TracingController::DisableMonitoring, base::Unretained(controller)));
&TracingController::DisableMonitoring, controller));
dict.SetMethod("captureMonitoringSnapshot", base::Bind(
&TracingController::CaptureMonitoringSnapshot,
base::Unretained(controller),
nullptr));
dict.SetMethod("getTraceBufferPercentFull", base::Bind(
&TracingController::GetTraceBufferPercentFull,
base::Unretained(controller)));
&TracingController::CaptureMonitoringSnapshot, controller, nullptr));
dict.SetMethod("getTraceBufferUsage", base::Bind(
&TracingController::GetTraceBufferUsage, controller));
dict.SetMethod("setWatchEvent", base::Bind(
&TracingController::SetWatchEvent, base::Unretained(controller)));
&TracingController::SetWatchEvent, controller));
dict.SetMethod("cancelWatchEvent", base::Bind(
&TracingController::CancelWatchEvent, base::Unretained(controller)));
&TracingController::CancelWatchEvent, controller));
}
} // namespace

View File

@@ -28,8 +28,8 @@ class GlobalShortcut : public extensions::GlobalShortcutListener::Observer,
virtual ~GlobalShortcut();
// mate::Wrappable implementations:
virtual mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) OVERRIDE;
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
private:
typedef std::map<ui::Accelerator, base::Closure> AcceleratorCallbackMap;
@@ -41,7 +41,7 @@ class GlobalShortcut : public extensions::GlobalShortcutListener::Observer,
void UnregisterAll();
// GlobalShortcutListener::Observer implementation.
virtual void OnKeyPressed(const ui::Accelerator& accelerator) OVERRIDE;
void OnKeyPressed(const ui::Accelerator& accelerator) override;
AcceleratorCallbackMap accelerator_callback_map_;

View File

@@ -6,7 +6,9 @@
#include "atom/browser/native_window.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 "native_mate/callback.h"
#include "native_mate/constructor.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
@@ -17,30 +19,6 @@ namespace atom {
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()
: model_(new ui::SimpleMenuModel(this)),
parent_(NULL) {
@@ -49,37 +27,30 @@ 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 {
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),
"isCommandIdChecked",
command_id)->BooleanValue();
return is_checked_.Run(command_id);
}
bool Menu::IsCommandIdEnabled(int command_id) const {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
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();
return is_enabled_.Run(command_id);
}
bool Menu::IsCommandIdVisible(int command_id) const {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
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();
return is_visible_.Run(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::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
v8::Handle<v8::Value> shortcut = CallDelegate(isolate,
MATE_UNDEFINED(isolate),
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;
v8::Handle<v8::Value> val = get_accelerator_.Run(command_id);
return mate::ConvertFromV8(isolate, val, accelerator);
}
void Menu::ExecuteCommand(int command_id, int event_flags) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
CallDelegate(isolate, MATE_FALSE(isolate), GetWrapper(isolate),
"executeCommand", command_id);
execute_command_.Run(command_id);
}
void Menu::MenuWillShow(ui::SimpleMenuModel* source) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
CallDelegate(isolate, MATE_FALSE(isolate), GetWrapper(isolate),
"menuWillShow", -1);
menu_will_show_.Run();
}
void Menu::AttachToWindow(Window* window) {
@@ -186,6 +104,10 @@ void Menu::InsertSubMenuAt(int index,
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) {
model_->SetSublabel(index, sublabel);
}
@@ -235,6 +157,7 @@ void Menu::BuildPrototype(v8::Isolate* isolate,
.SetMethod("insertRadioItem", &Menu::InsertRadioItemAt)
.SetMethod("insertSeparator", &Menu::InsertSeparatorAt)
.SetMethod("insertSubMenu", &Menu::InsertSubMenuAt)
.SetMethod("setIcon", &Menu::SetIcon)
.SetMethod("setSublabel", &Menu::SetSublabel)
.SetMethod("clear", &Menu::Clear)
.SetMethod("getIndexOfCommandId", &Menu::GetIndexOfCommandId)

View File

@@ -8,6 +8,7 @@
#include <string>
#include "atom/browser/api/atom_api_window.h"
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "ui/base/models/simple_menu_model.h"
#include "native_mate/wrappable.h"
@@ -16,8 +17,6 @@ namespace atom {
namespace api {
class MenuMac;
class Menu : public mate::Wrappable,
public ui::SimpleMenuModel::Delegate {
public:
@@ -40,16 +39,15 @@ class Menu : public mate::Wrappable,
Menu();
virtual ~Menu();
// mate::Wrappable:
void AfterInit(v8::Isolate* isolate) override;
// ui::SimpleMenuModel::Delegate implementations:
bool IsCommandIdChecked(int command_id) const override;
bool IsCommandIdEnabled(int command_id) const override;
bool IsCommandIdVisible(int command_id) const override;
bool GetAcceleratorForCommandId(
int command_id,
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;
bool GetAcceleratorForCommandId(int command_id,
ui::Accelerator* accelerator) override;
void ExecuteCommand(int command_id, int event_flags) override;
void MenuWillShow(ui::SimpleMenuModel* source) override;
@@ -74,6 +72,7 @@ class Menu : public mate::Wrappable,
int command_id,
const base::string16& label,
Menu* menu);
void SetIcon(int index, const gfx::Image& image);
void SetSublabel(int index, const base::string16& sublabel);
void Clear();
int GetIndexOfCommandId(int command_id);
@@ -85,6 +84,14 @@ class Menu : public mate::Wrappable,
bool IsEnabledAt(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);
};

View File

@@ -19,8 +19,8 @@ class MenuMac : public Menu {
protected:
MenuMac();
virtual void Popup(Window* window) OVERRIDE;
virtual void PopupAt(Window* window, int x, int y) OVERRIDE;
void Popup(Window* window) override;
void PopupAt(Window* window, int x, int y) override;
base::scoped_nsobject<AtomMenuController> menu_controller_;

View File

@@ -17,8 +17,8 @@ class MenuViews : public Menu {
MenuViews();
protected:
virtual void Popup(Window* window) OVERRIDE;
virtual void PopupAt(Window* window, int x, int y) OVERRIDE;
void Popup(Window* window) override;
void PopupAt(Window* window, int x, int y) override;
private:
void PopupAtPoint(Window* window, const gfx::Point& point);

View File

@@ -24,9 +24,9 @@ class PowerMonitor : public mate::EventEmitter,
virtual ~PowerMonitor();
// base::PowerObserver implementations:
virtual void OnPowerStateChange(bool on_battery_power) OVERRIDE;
virtual void OnSuspend() OVERRIDE;
virtual void OnResume() OVERRIDE;
void OnPowerStateChange(bool on_battery_power) override;
void OnSuspend() override;
void OnResume() override;
private:
DISALLOW_COPY_AND_ASSIGN(PowerMonitor);

View File

@@ -53,7 +53,7 @@ class CustomProtocolRequestJob : public AdapterRequestJob {
}
// AdapterRequestJob:
virtual void GetJobTypeInUI() OVERRIDE {
void GetJobTypeInUI() override {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
v8::Isolate* isolate = v8::Isolate::GetCurrent();
@@ -86,6 +86,17 @@ class CustomProtocolRequestJob : public AdapterRequestJob {
base::Bind(&AdapterRequestJob::CreateStringJobAndStart,
GetWeakPtr(), mime_type, charset, data));
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") {
base::FilePath path;
dict.Get("path", &path);
@@ -128,9 +139,9 @@ class CustomProtocolHandler : public ProtocolHandler {
: registry_(registry), protocol_handler_(protocol_handler) {
}
virtual net::URLRequestJob* MaybeCreateJob(
net::URLRequestJob* MaybeCreateJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const OVERRIDE {
net::NetworkDelegate* network_delegate) const override {
return new CustomProtocolRequestJob(registry_, protocol_handler_.get(),
request, network_delegate);
}
@@ -305,9 +316,7 @@ void Protocol::UninterceptProtocolInIO(const std::string& scheme) {
void Protocol::EmitEventInUI(const std::string& event,
const std::string& parameter) {
base::ListValue args;
args.AppendString(parameter);
Emit(event, args);
Emit(event, parameter);
}
// static

View File

@@ -0,0 +1,147 @@
// 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/api/atom_api_screen.h"
#include <algorithm>
#include <string>
#include "atom/browser/browser.h"
#include "atom/common/native_mate_converters/gfx_converter.h"
#include "base/bind.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
#include "ui/gfx/screen.h"
#include "atom/common/node_includes.h"
namespace atom {
namespace api {
namespace {
// Find an item in container according to its ID.
template<class T>
typename T::iterator FindById(T* container, int id) {
auto predicate = [id] (const typename T::value_type& item) -> bool {
return item.id() == id;
};
return std::find_if(container->begin(), container->end(), predicate);
}
// Convert the changed_metrics bitmask to string array.
std::vector<std::string> MetricsToArray(uint32_t metrics) {
std::vector<std::string> array;
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_BOUNDS)
array.push_back("bounds");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_WORK_AREA)
array.push_back("workArea");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR)
array.push_back("scaleFactor");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_ROTATION)
array.push_back("rotaion");
return array;
}
} // namespace
Screen::Screen(gfx::Screen* screen) : screen_(screen) {
screen_->AddObserver(this);
}
Screen::~Screen() {
screen_->RemoveObserver(this);
}
gfx::Point Screen::GetCursorScreenPoint() {
return screen_->GetCursorScreenPoint();
}
gfx::Display Screen::GetPrimaryDisplay() {
return screen_->GetPrimaryDisplay();
}
std::vector<gfx::Display> Screen::GetAllDisplays() {
// The Screen::GetAllDisplays doesn't update when there is display added or
// removed, so we have to manually maintain the displays_ to make it up to
// date.
if (displays_.size() == 0)
displays_ = screen_->GetAllDisplays();
return displays_;
}
gfx::Display Screen::GetDisplayNearestPoint(const gfx::Point& point) {
return screen_->GetDisplayNearestPoint(point);
}
gfx::Display Screen::GetDisplayMatching(const gfx::Rect& match_rect) {
return screen_->GetDisplayMatching(match_rect);
}
void Screen::OnDisplayAdded(const gfx::Display& new_display) {
displays_.push_back(new_display);
Emit("display-added", new_display);
}
void Screen::OnDisplayRemoved(const gfx::Display& old_display) {
auto iter = FindById(&displays_, old_display.id());
if (iter == displays_.end())
return;
displays_.erase(iter);
Emit("display-removed", old_display);
}
void Screen::OnDisplayMetricsChanged(const gfx::Display& display,
uint32_t changed_metrics) {
auto iter = FindById(&displays_, display.id());
if (iter == displays_.end())
return;
*iter = display;
Emit("display-metrics-changed", display, MetricsToArray(changed_metrics));
}
mate::ObjectTemplateBuilder Screen::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate)
.SetMethod("getCursorScreenPoint", &Screen::GetCursorScreenPoint)
.SetMethod("getPrimaryDisplay", &Screen::GetPrimaryDisplay)
.SetMethod("getAllDisplays", &Screen::GetAllDisplays)
.SetMethod("getDisplayNearestPoint", &Screen::GetDisplayNearestPoint)
.SetMethod("getDisplayMatching", &Screen::GetDisplayMatching);
}
// static
v8::Handle<v8::Value> Screen::Create(v8::Isolate* isolate) {
if (!Browser::Get()->is_ready()) {
node::ThrowError("Cannot initialize \"screen\" module before app is ready");
return v8::Null(isolate);
}
gfx::Screen* screen = gfx::Screen::GetNativeScreen();
if (!screen) {
node::ThrowError("Failed to get screen information");
return v8::Null(isolate);
}
return mate::CreateHandle(isolate, new Screen(screen)).ToV8();
}
} // 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.Set("screen", atom::api::Screen::Create(context->GetIsolate()));
}
} // namespace
NODE_MODULE_CONTEXT_AWARE_BUILTIN(atom_common_screen, Initialize)

View File

@@ -0,0 +1,60 @@
// 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_BROWSER_API_ATOM_API_SCREEN_H_
#define ATOM_BROWSER_API_ATOM_API_SCREEN_H_
#include <vector>
#include "atom/browser/api/event_emitter.h"
#include "native_mate/handle.h"
#include "ui/gfx/display_observer.h"
namespace gfx {
class Point;
class Rect;
class Screen;
}
namespace atom {
namespace api {
class Screen : public mate::EventEmitter,
public gfx::DisplayObserver {
public:
static v8::Handle<v8::Value> Create(v8::Isolate* isolate);
protected:
explicit Screen(gfx::Screen* screen);
virtual ~Screen();
gfx::Point GetCursorScreenPoint();
gfx::Display GetPrimaryDisplay();
std::vector<gfx::Display> GetAllDisplays();
gfx::Display GetDisplayNearestPoint(const gfx::Point& point);
gfx::Display GetDisplayMatching(const gfx::Rect& match_rect);
// gfx::DisplayObserver:
void OnDisplayAdded(const gfx::Display& new_display) override;
void OnDisplayRemoved(const gfx::Display& old_display) override;
void OnDisplayMetricsChanged(const gfx::Display& display,
uint32_t changed_metrics) override;
// mate::Wrappable:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
private:
gfx::Screen* screen_;
std::vector<gfx::Display> displays_;
DISALLOW_COPY_AND_ASSIGN(Screen);
};
} // namespace api
} // namespace atom
#endif // ATOM_BROWSER_API_ATOM_API_SCREEN_H_

View File

@@ -7,6 +7,7 @@
#include <string>
#include "atom/browser/api/atom_api_menu.h"
#include "atom/browser/browser.h"
#include "atom/browser/ui/tray_icon.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/string16_converter.h"
@@ -31,6 +32,10 @@ Tray::~Tray() {
// static
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);
}

View File

@@ -7,7 +7,7 @@
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/native_window.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/native_mate_converters/gfx_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
@@ -16,6 +16,7 @@
#include "base/strings/utf_string_conversions.h"
#include "brightray/browser/inspectable_web_contents.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_process_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.
NativeWindow* GetWindowFromGuest(const content::WebContents* guest) {
int guest_process_id = guest->GetRenderProcessHost()->GetID();
WebViewRendererState::WebViewInfo info;
if (!WebViewRendererState::GetInstance()->GetInfo(guest_process_id, &info))
WebViewManager::WebViewInfo info;
if (WebViewManager::GetInfoForProcess(guest->GetRenderProcessHost(), &info))
return NativeWindow::FromRenderView(
info.embedder->GetRenderProcessHost()->GetID(),
info.embedder->GetRoutingID());
else
return nullptr;
return NativeWindow::FromRenderView(
info.embedder->GetRenderProcessHost()->GetID(),
info.embedder->GetRoutingID());
}
} // namespace
@@ -55,6 +56,7 @@ WebContents::WebContents(content::WebContents* web_contents)
guest_instance_id_(-1),
element_instance_id_(-1),
guest_opaque_(true),
guest_sizer_(nullptr),
auto_size_enabled_(false) {
}
@@ -62,6 +64,7 @@ WebContents::WebContents(const mate::Dictionary& options)
: guest_instance_id_(-1),
element_instance_id_(-1),
guest_opaque_(true),
guest_sizer_(nullptr),
auto_size_enabled_(false) {
options.Get("guestInstanceId", &guest_instance_id_);
@@ -88,28 +91,23 @@ bool WebContents::AddMessageToConsole(content::WebContents* source,
const base::string16& message,
int32 line_no,
const base::string16& source_id) {
base::ListValue args;
args.AppendInteger(level);
args.AppendString(message);
args.AppendInteger(line_no);
args.AppendString(source_id);
Emit("console-message", args);
Emit("console-message", level, message, line_no, source_id);
return true;
}
bool WebContents::ShouldCreateWebContents(
content::WebContents* web_contents,
int route_id,
int main_frame_route_id,
WindowContainerType window_container_type,
const base::string16& frame_name,
const GURL& target_url,
const std::string& partition_id,
content::SessionStorageNamespace* session_storage_namespace) {
base::ListValue args;
args.AppendString(target_url.spec());
args.AppendString(frame_name);
args.AppendInteger(NEW_FOREGROUND_TAB);
Emit("-new-window", args);
Emit("-new-window",
target_url,
frame_name,
static_cast<int>(NEW_FOREGROUND_TAB));
return false;
}
@@ -121,18 +119,12 @@ content::WebContents* WebContents::OpenURLFromTab(
content::WebContents* source,
const content::OpenURLParams& params) {
if (params.disposition != CURRENT_TAB) {
base::ListValue args;
args.AppendString(params.url.spec());
args.AppendString("");
args.AppendInteger(params.disposition);
Emit("-new-window", args);
Emit("-new-window", params.url, "", static_cast<int>(params.disposition));
return nullptr;
}
// Give user a chance to cancel navigation.
base::ListValue args;
args.AppendString(params.url.spec());
if (Emit("will-navigate", args))
if (Emit("will-navigate", params.url))
return nullptr;
content::NavigationController::LoadURLParams load_url_params(params.url);
@@ -164,6 +156,12 @@ void WebContents::EnumerateDirectory(content::WebContents* guest,
web_dialog_helper_->EnumerateDirectory(guest, request_id, path);
}
bool WebContents::CheckMediaAccessPermission(content::WebContents* web_contents,
const GURL& security_origin,
content::MediaStreamType type) {
return true;
}
void WebContents::RequestMediaAccessPermission(
content::WebContents*,
const content::MediaStreamRequest& request,
@@ -184,10 +182,9 @@ void WebContents::HandleKeyboardEvent(
}
void WebContents::RenderViewDeleted(content::RenderViewHost* render_view_host) {
base::ListValue args;
args.AppendInteger(render_view_host->GetProcess()->GetID());
args.AppendInteger(render_view_host->GetRoutingID());
Emit("render-view-deleted", args);
Emit("render-view-deleted",
render_view_host->GetProcess()->GetID(),
render_view_host->GetRoutingID());
}
void WebContents::RenderProcessGone(base::TerminationStatus status) {
@@ -197,23 +194,26 @@ void WebContents::RenderProcessGone(base::TerminationStatus status) {
void WebContents::DidFinishLoad(content::RenderFrameHost* render_frame_host,
const GURL& validated_url) {
bool is_main_frame = !render_frame_host->GetParent();
base::ListValue args;
args.AppendBoolean(is_main_frame);
Emit("did-frame-finish-load", args);
Emit("did-frame-finish-load", is_main_frame);
if (is_main_frame)
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,
const GURL& validated_url,
int error_code,
const base::string16& error_description) {
base::ListValue args;
args.AppendInteger(error_code);
args.AppendString(error_description);
Emit("did-fail-load", args);
Emit("did-fail-load", error_code, error_description);
}
void WebContents::DidStartLoading(content::RenderViewHost* render_view_host) {
@@ -224,15 +224,24 @@ void WebContents::DidStopLoading(content::RenderViewHost* render_view_host) {
Emit("did-stop-loading");
}
void WebContents::DidGetResourceResponseStart(
const content::ResourceRequestDetails& details) {
Emit("did-get-response-details",
details.socket_address.IsEmpty(),
details.url,
details.original_url,
details.http_response_code,
details.method,
details.referrer);
}
void WebContents::DidGetRedirectForResourceRequest(
content::RenderViewHost* render_view_host,
content::RenderFrameHost* render_frame_host,
const content::ResourceRedirectDetails& details) {
base::ListValue args;
args.AppendString(details.url.spec());
args.AppendString(details.new_url.spec());
args.AppendBoolean(
details.resource_type == content::RESOURCE_TYPE_MAIN_FRAME);
Emit("did-get-redirect-request", args);
Emit("did-get-redirect-request",
details.url,
details.new_url,
(details.resource_type == content::RESOURCE_TYPE_MAIN_FRAME));
}
void WebContents::DidNavigateMainFrame(
@@ -242,6 +251,11 @@ void WebContents::DidNavigateMainFrame(
Emit("did-navigate-to-different-page");
}
void WebContents::TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) {
Emit("page-title-set", entry->GetTitle(), explicit_set);
}
bool WebContents::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(WebContents, message)
@@ -262,14 +276,14 @@ void WebContents::RenderViewReady() {
// WebContents::GetRenderWidgetHostView will return the RWHV of an
// interstitial page if one is showing at this time. We only want opacity
// to apply to web pages.
web_contents()->GetRenderViewHost()->GetView()->
SetBackgroundOpaque(guest_opaque_);
content::RenderViewHost* rvh = web_contents()->GetRenderViewHost();
if (auto_size_enabled_) {
rvh->EnableAutoResize(min_auto_size_, max_auto_size_);
if (guest_opaque_) {
web_contents()
->GetRenderViewHost()
->GetView()
->SetBackgroundColorToDefault();
} else {
rvh->DisableAutoResize(element_size_);
web_contents()->GetRenderViewHost()->GetView()->SetBackgroundColor(
SK_ColorTRANSPARENT);
}
}
@@ -279,13 +293,26 @@ void WebContents::WebContentsDestroyed() {
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) {
Emit("did-attach");
}
void WebContents::ElementSizeChanged(const gfx::Size& old_size,
const gfx::Size& new_size) {
element_size_ = new_size;
void WebContents::ElementSizeChanged(const gfx::Size& size) {
element_size_ = 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,
@@ -301,10 +328,15 @@ void WebContents::RegisterDestructionCallback(
destruction_callback_ = callback;
}
void WebContents::SetGuestSizer(content::GuestSizer* guest_sizer) {
guest_sizer_ = guest_sizer;
}
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;
element_instance_id_ = browser_plugin_instance_id;
element_instance_id_ = element_instance_id;
}
void WebContents::Destroy() {
@@ -338,7 +370,10 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) {
}
GURL WebContents::GetURL() const {
return web_contents()->GetURL();
auto entry = web_contents()->GetController().GetLastCommittedEntry();
if (!entry)
return GURL::EmptyGURL();
return entry->GetVirtualURL();
}
base::string16 WebContents::GetTitle() const {
@@ -365,6 +400,9 @@ void WebContents::Reload(const mate::Dictionary& options) {
}
void WebContents::ReloadIgnoringCache(const mate::Dictionary& options) {
// Hack to remove pending entries that ignores cache and treated as a fresh
// load.
web_contents()->GetController().ReloadIgnoringCache(false);
Reload(options);
}
@@ -433,6 +471,46 @@ bool WebContents::IsDevToolsOpened() {
return storage_->IsDevToolsViewShowing();
}
void WebContents::Undo() {
web_contents()->Undo();
}
void WebContents::Redo() {
web_contents()->Redo();
}
void WebContents::Cut() {
web_contents()->Cut();
}
void WebContents::Copy() {
web_contents()->Copy();
}
void WebContents::Paste() {
web_contents()->Paste();
}
void WebContents::Delete() {
web_contents()->Delete();
}
void WebContents::SelectAll() {
web_contents()->SelectAll();
}
void WebContents::Unselect() {
web_contents()->Unselect();
}
void WebContents::Replace(const base::string16& word) {
web_contents()->Replace(word);
}
void WebContents::ReplaceMisspelling(const base::string16& word) {
web_contents()->ReplaceMisspelling(word);
}
bool WebContents::SendIPCMessage(const base::string16& channel,
const base::ListValue& args) {
return Send(new AtomViewMsg_Message(routing_id(), channel, args));
@@ -473,7 +551,15 @@ void WebContents::SetAllowTransparency(bool allow) {
if (!web_contents()->GetRenderViewHost()->GetView())
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(
@@ -503,13 +589,23 @@ mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
.SetMethod("setUserAgent", &WebContents::SetUserAgent)
.SetMethod("insertCSS", &WebContents::InsertCSS)
.SetMethod("_executeJavaScript", &WebContents::ExecuteJavaScript)
.SetMethod("openDevTools", &WebContents::OpenDevTools)
.SetMethod("closeDevTools", &WebContents::CloseDevTools)
.SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened)
.SetMethod("undo", &WebContents::Undo)
.SetMethod("redo", &WebContents::Redo)
.SetMethod("cut", &WebContents::Cut)
.SetMethod("copy", &WebContents::Copy)
.SetMethod("paste", &WebContents::Paste)
.SetMethod("delete", &WebContents::Delete)
.SetMethod("selectAll", &WebContents::SelectAll)
.SetMethod("unselect", &WebContents::Unselect)
.SetMethod("replace", &WebContents::Replace)
.SetMethod("replaceMisspelling", &WebContents::ReplaceMisspelling)
.SetMethod("_send", &WebContents::SendIPCMessage)
.SetMethod("setAutoSize", &WebContents::SetAutoSize)
.SetMethod("setAllowTransparency", &WebContents::SetAllowTransparency)
.SetMethod("isGuest", &WebContents::is_guest)
.SetMethod("openDevTools", &WebContents::OpenDevTools)
.SetMethod("closeDevTools", &WebContents::CloseDevTools)
.SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened)
.Build());
return mate::ObjectTemplateBuilder(
@@ -526,17 +622,14 @@ void WebContents::OnRendererMessageSync(const base::string16& channel,
const base::ListValue& args,
IPC::Message* message) {
// webContents.emit(channel, new Event(sender, message), args...);
Emit(base::UTF16ToUTF8(channel), args, web_contents(), message);
EmitWithSender(base::UTF16ToUTF8(channel), web_contents(), message, args);
}
void WebContents::GuestSizeChangedDueToAutoSize(const gfx::Size& old_size,
const gfx::Size& new_size) {
base::ListValue args;
args.AppendInteger(old_size.width());
args.AppendInteger(old_size.height());
args.AppendInteger(new_size.width());
args.AppendInteger(new_size.height());
Emit("size-changed", args);
Emit("size-changed",
old_size.width(), old_size.height(),
new_size.width(), new_size.height());
}
// static

View File

@@ -67,6 +67,20 @@ class WebContents : public mate::EventEmitter,
void OpenDevTools();
void CloseDevTools();
bool IsDevToolsOpened();
// Editing commands.
void Undo();
void Redo();
void Cut();
void Copy();
void Paste();
void Delete();
void SelectAll();
void Unselect();
void Replace(const base::string16& word);
void ReplaceMisspelling(const base::string16& word);
// Sending messages to browser.
bool SendIPCMessage(const base::string16& channel,
const base::ListValue& args);
@@ -106,6 +120,7 @@ class WebContents : public mate::EventEmitter,
bool ShouldCreateWebContents(
content::WebContents* web_contents,
int route_id,
int main_frame_route_id,
WindowContainerType window_container_type,
const base::string16& frame_name,
const GURL& target_url,
@@ -120,6 +135,9 @@ class WebContents : public mate::EventEmitter,
void EnumerateDirectory(content::WebContents* web_contents,
int request_id,
const base::FilePath& path) override;
bool CheckMediaAccessPermission(content::WebContents* web_contents,
const GURL& security_origin,
content::MediaStreamType type) override;
void RequestMediaAccessPermission(
content::WebContents*,
const content::MediaStreamRequest&,
@@ -137,10 +155,16 @@ class WebContents : public mate::EventEmitter,
const GURL& validated_url,
int error_code,
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 DidStopLoading(content::RenderViewHost* render_view_host) override;
void DidGetResourceResponseStart(
const content::ResourceRequestDetails& details) override;
void DidGetRedirectForResourceRequest(
content::RenderViewHost* render_view_host,
content::RenderFrameHost* render_frame_host,
const content::ResourceRedirectDetails& details) override;
void DidNavigateMainFrame(
const content::LoadCommittedDetails& details,
@@ -148,16 +172,21 @@ class WebContents : public mate::EventEmitter,
bool OnMessageReceived(const IPC::Message& message) override;
void RenderViewReady() override;
void WebContentsDestroyed() override;
void NavigationEntryCommitted(
const content::LoadCommittedDetails& load_details) override;
void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override;
// content::BrowserPluginGuestDelegate:
void DidAttach(int guest_proxy_routing_id) final;
void ElementSizeChanged(const gfx::Size& old_size,
const gfx::Size& new_size) final;
void ElementSizeChanged(const gfx::Size& size) final;
content::WebContents* GetOwnerWebContents() const final;
void GuestSizeChanged(const gfx::Size& old_size,
const gfx::Size& new_size) final;
void RegisterDestructionCallback(const DestructionCallback& callback) final;
void SetGuestSizer(content::GuestSizer* guest_sizer) final;
void WillAttach(content::WebContents* embedder_web_contents,
int browser_plugin_instance_id) final;
int element_instance_id,
bool is_full_page_plugin) final;
private:
// Called when received a message from renderer.
@@ -199,6 +228,9 @@ class WebContents : public mate::EventEmitter,
// element may not match the size of the guest.
gfx::Size guest_size_;
// A pointer to the guest_sizer.
content::GuestSizer* guest_sizer_;
// Indicates whether autosize mode is enabled or not.
bool auto_size_enabled_;

View 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)

View File

@@ -8,6 +8,9 @@
#include "atom/browser/browser.h"
#include "atom/browser/native_window.h"
#include "atom/common/native_mate_converters/gfx_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/image_converter.h"
#include "atom/common/native_mate_converters/string16_converter.h"
#include "content/public/browser/render_process_host.h"
#include "native_mate/callback.h"
#include "native_mate/constructor.h"
@@ -49,15 +52,11 @@ namespace {
void OnCapturePageDone(
v8::Isolate* isolate,
const base::Callback<void(v8::Handle<v8::Value>)>& callback,
const std::vector<unsigned char>& data) {
const base::Callback<void(const gfx::Image&)>& callback,
const SkBitmap& bitmap) {
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
v8::Local<v8::Value> buffer = node::Buffer::New(
reinterpret_cast<const char*>(data.data()),
data.size());
callback.Run(buffer);
callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap));
}
} // namespace
@@ -76,26 +75,18 @@ Window::~Window() {
void Window::OnPageTitleUpdated(bool* prevent_default,
const std::string& title) {
base::ListValue args;
args.AppendString(title);
*prevent_default = Emit("page-title-updated", args);
*prevent_default = Emit("page-title-updated", title);
}
void Window::WillCreatePopupWindow(const base::string16& frame_name,
const GURL& target_url,
const std::string& partition_id,
WindowOpenDisposition disposition) {
base::ListValue args;
args.AppendString(target_url.spec());
args.AppendString(frame_name);
args.AppendInteger(disposition);
Emit("-new-window", args);
Emit("-new-window", target_url, frame_name, static_cast<int>(disposition));
}
void Window::WillNavigate(bool* prevent_default, const GURL& url) {
base::ListValue args;
args.AppendString(url.spec());
*prevent_default = Emit("-will-navigate", args);
*prevent_default = Emit("-will-navigate", url);
}
void Window::WillCloseWindow(bool* prevent_default) {
@@ -148,16 +139,18 @@ void Window::OnRendererResponsive() {
Emit("responsive");
}
void Window::OnDevToolsFocus() {
Emit("devtools-focused");
}
// static
mate::Wrappable* Window::New(v8::Isolate* isolate,
const mate::Dictionary& options) {
if (Browser::Get()->is_ready()) {
return new Window(options);
} else {
isolate->ThrowException(v8::Exception::TypeError(mate::StringToV8(
isolate, "Can not create BrowserWindow before app is ready")));
if (!Browser::Get()->is_ready()) {
node::ThrowError("Cannot create BrowserWindow before app is ready");
return nullptr;
}
return new Window(options);
}
void Window::Destroy() {
@@ -333,8 +326,8 @@ bool Window::IsKiosk() {
return window_->IsKiosk();
}
void Window::OpenDevTools() {
window_->OpenDevTools();
void Window::OpenDevTools(bool can_dock) {
window_->OpenDevTools(can_dock);
}
void Window::CloseDevTools() {
@@ -379,7 +372,7 @@ bool Window::IsDocumentEdited() {
void Window::CapturePage(mate::Arguments* args) {
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)) &&
!(args->Length() == 2 && args->GetNext(&rect)
@@ -406,6 +399,11 @@ void Window::SetProgressBar(double 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) {
window_->SetAutoHideMenuBar(auto_hide);
}
@@ -428,6 +426,14 @@ void Window::ShowDefinitionForSelection() {
}
#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 {
return WebContents::CreateFrom(isolate, window_->GetWebContents());
}
@@ -493,10 +499,15 @@ void Window::BuildPrototype(v8::Isolate* isolate,
.SetMethod("capturePage", &Window::CapturePage)
.SetMethod("print", &Window::Print)
.SetMethod("setProgressBar", &Window::SetProgressBar)
.SetMethod("setOverlayIcon", &Window::SetOverlayIcon)
.SetMethod("setAutoHideMenuBar", &Window::SetAutoHideMenuBar)
.SetMethod("isMenuBarAutoHide", &Window::IsMenuBarAutoHide)
.SetMethod("setMenuBarVisibility", &Window::SetMenuBarVisibility)
.SetMethod("isMenuBarVisible", &Window::IsMenuBarVisible)
.SetMethod("setVisibleOnAllWorkspaces",
&Window::SetVisibleOnAllWorkspaces)
.SetMethod("isVisibleOnAllWorkspaces",
&Window::IsVisibleOnAllWorkspaces)
#if defined(OS_MACOSX)
.SetMethod("showDefinitionForSelection",
&Window::ShowDefinitionForSelection)

View File

@@ -9,6 +9,7 @@
#include <vector>
#include "base/memory/scoped_ptr.h"
#include "ui/gfx/image/image.h"
#include "atom/browser/native_window_observer.h"
#include "atom/browser/api/event_emitter.h"
#include "native_mate/handle.h"
@@ -63,6 +64,7 @@ class Window : public mate::EventEmitter,
void OnWindowLeaveFullScreen() override;
void OnRendererUnresponsive() override;
void OnRendererResponsive() override;
void OnDevToolsFocus() override;
private:
// APIs for NativeWindow.
@@ -104,7 +106,7 @@ class Window : public mate::EventEmitter,
void SetSkipTaskbar(bool skip);
void SetKiosk(bool kiosk);
bool IsKiosk();
void OpenDevTools();
void OpenDevTools(bool can_dock);
void CloseDevTools();
bool IsDevToolsOpened();
void InspectElement(int x, int y);
@@ -118,6 +120,8 @@ class Window : public mate::EventEmitter,
void CapturePage(mate::Arguments* args);
void Print(mate::Arguments* args);
void SetProgressBar(double progress);
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description);
void SetAutoHideMenuBar(bool auto_hide);
bool IsMenuBarAutoHide();
void SetMenuBarVisibility(bool visible);
@@ -127,6 +131,9 @@ class Window : public mate::EventEmitter,
void ShowDefinitionForSelection();
#endif
void SetVisibleOnAllWorkspaces(bool visible);
bool IsVisibleOnAllWorkspaces();
// APIs for WebContents.
mate::Handle<WebContents> GetWebContents(v8::Isolate* isolate) const;
mate::Handle<WebContents> GetDevToolsWebContents(v8::Isolate* isolate) const;

View File

@@ -34,10 +34,10 @@ class Event : public Wrappable,
virtual ~Event();
// Wrappable implementations:
virtual ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate);
ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) override;
// content::WebContentsObserver implementations:
virtual void WebContentsDestroyed() OVERRIDE;
void WebContentsDestroyed() override;
private:
// Replyer for the synchronous messages.

View File

@@ -5,9 +5,6 @@
#include "atom/browser/api/event_emitter.h"
#include "atom/browser/api/event.h"
#include "atom/common/native_mate_converters/v8_value_converter.h"
#include "base/memory/scoped_ptr.h"
#include "base/values.h"
#include "native_mate/arguments.h"
#include "native_mate/object_template_builder.h"
@@ -41,43 +38,11 @@ v8::Local<v8::Object> CreateEventObject(v8::Isolate* isolate) {
EventEmitter::EventEmitter() {
}
bool EventEmitter::Emit(const base::StringPiece& name) {
return Emit(name, base::ListValue());
}
bool EventEmitter::Emit(const base::StringPiece& name,
const base::ListValue& args) {
return Emit(name, args, NULL, NULL);
}
bool EventEmitter::Emit(const base::StringPiece& name,
const base::ListValue& args,
content::WebContents* sender,
IPC::Message* message) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
v8::Handle<v8::Context> context = isolate->GetCurrentContext();
scoped_ptr<atom::V8ValueConverter> converter(new atom::V8ValueConverter);
// v8_args = [args...];
Arguments v8_args;
v8_args.reserve(args.GetSize());
for (size_t i = 0; i < args.GetSize(); i++) {
const base::Value* value(NULL);
if (args.Get(i, &value))
v8_args.push_back(converter->ToV8Value(value, context));
}
return Emit(isolate, name, v8_args, sender, message);
}
bool EventEmitter::Emit(v8::Isolate* isolate,
const base::StringPiece& name,
Arguments args,
content::WebContents* sender,
IPC::Message* message) {
bool EventEmitter::CallEmit(v8::Isolate* isolate,
const base::StringPiece& name,
content::WebContents* sender,
IPC::Message* message,
ValueArray args) {
v8::Handle<v8::Object> event;
bool use_native_event = sender && message;

View File

@@ -9,10 +9,6 @@
#include "native_mate/wrappable.h"
namespace base {
class ListValue;
}
namespace content {
class WebContents;
}
@@ -26,29 +22,39 @@ namespace mate {
// Provide helperers to emit event in JavaScript.
class EventEmitter : public Wrappable {
public:
typedef std::vector<v8::Handle<v8::Value>> Arguments;
typedef std::vector<v8::Handle<v8::Value>> ValueArray;
protected:
EventEmitter();
// this.emit(name, new Event());
bool Emit(const base::StringPiece& name);
// this.emit(name, new Event(), args...);
bool Emit(const base::StringPiece& name, const base::ListValue& args);
template<typename... Args>
bool Emit(const base::StringPiece& name, const Args&... args) {
return EmitWithSender(name, nullptr, nullptr, args...);
}
// this.emit(name, new Event(sender, message), args...);
bool Emit(const base::StringPiece& name, const base::ListValue& args,
content::WebContents* sender, IPC::Message* message);
template<typename... Args>
bool EmitWithSender(const base::StringPiece& name,
content::WebContents* sender,
IPC::Message* message,
const Args&... args) {
v8::Isolate* isolate = v8::Isolate::GetCurrent();
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
// Lower level implementations.
bool Emit(v8::Isolate* isolate,
const base::StringPiece& name,
Arguments args,
content::WebContents* sender = nullptr,
IPC::Message* message = nullptr);
ValueArray converted = { ConvertToV8(isolate, args)... };
return CallEmit(isolate, name, sender, message, converted);
}
private:
// Lower level implementations.
bool CallEmit(v8::Isolate* isolate,
const base::StringPiece& name,
content::WebContents* sender,
IPC::Message* message,
ValueArray args);
DISALLOW_COPY_AND_ASSIGN(EventEmitter);
};

View File

@@ -5,9 +5,6 @@ bindings = process.atomBinding 'app'
app = bindings.app
app.__proto__ = EventEmitter.prototype
app.getHomeDir = ->
process.env[if process.platform is 'win32' then 'USERPROFILE' else 'HOME']
app.setApplicationMenu = (menu) ->
require('menu').setApplicationMenu menu
@@ -32,6 +29,9 @@ if process.platform is 'darwin'
app.once 'ready', -> app.emit 'finish-launching'
app.terminate = app.quit
app.exit = process.exit
app.getHomeDir = -> app.getPath 'home'
app.getDataPath = -> app.getPath 'userData'
app.setDataPath = (path) -> app.setPath 'userData', path
# Only one App object pemitted.
module.exports = app

View File

@@ -17,6 +17,7 @@ BrowserWindow::_init = ->
@setMenu menu if menu?
@webContents = @getWebContents()
@devToolsWebContents = null
@webContents.once 'destroyed', => @webContents = null
# Remember the window ID.
@@ -39,8 +40,9 @@ BrowserWindow::_init = ->
@once 'closed', =>
BrowserWindow.windows.remove @id if BrowserWindow.windows.has @id
BrowserWindow::openDevTools = ->
@_openDevTools()
BrowserWindow::openDevTools = (options={}) ->
options.detach ?= false
@_openDevTools !options.detach
# Force devToolsWebContents to be created.
@devToolsWebContents = @getDevToolsWebContents()

View File

@@ -83,8 +83,8 @@ module.exports =
options ?= type: 'none'
options.type ?= 'none'
options.type = messageBoxTypes.indexOf options.type
throw new TypeError('Invalid message box type') unless options.type > -1
messageBoxType = messageBoxTypes.indexOf options.type
throw new TypeError('Invalid message box type') unless messageBoxType > -1
throw new TypeError('Buttons need to be array') unless Array.isArray options.buttons
@@ -93,7 +93,7 @@ module.exports =
options.detail ?= ''
options.icon ?= null
binding.showMessageBox options.type,
binding.showMessageBox messageBoxType,
options.buttons,
[options.title, options.message, options.detail],
options.icon,

View File

@@ -9,13 +9,14 @@ class MenuItem
constructor: (options) ->
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?
throw new Error('Invalid submenu') if @type is 'submenu' and @submenu?.constructor isnt Menu
@overrideReadOnlyProperty 'type', 'normal'
@overrideReadOnlyProperty 'accelerator'
@overrideReadOnlyProperty 'icon'
@overrideReadOnlyProperty 'submenu'
@overrideProperty 'label', ''
@overrideProperty 'sublabel', ''

View File

@@ -23,6 +23,37 @@ generateGroupId = (items, pos) ->
break if item.type is 'separator'
++nextGroupId
# Returns the index of item according to |id|.
indexOfItemById = (items, id) ->
return i for item, i in items when item.id is id
-1
# Returns the index of where to insert the item according to |position|.
indexToInsertByPosition = (items, position) ->
return items.length unless position
[query, id] = position.split '='
insertIndex = indexOfItemById items, id
if insertIndex is -1 and query isnt 'endof'
console.warn "Item with id '#{id}' is not found"
return items.length
switch query
when 'after'
insertIndex++
when 'endof'
# If the |id| doesn't exist, then create a new group with the |id|.
if insertIndex is -1
items.push id: id, type: 'separator'
insertIndex = items.length - 1
# Find the end of the group.
insertIndex++
while insertIndex < items.length and items[insertIndex].type isnt 'separator'
insertIndex++
insertIndex
Menu = bindings.Menu
Menu::__proto__ = EventEmitter.prototype
@@ -35,6 +66,7 @@ Menu::_init = ->
isCommandIdEnabled: (commandId) => @commandsMap[commandId]?.enabled
isCommandIdVisible: (commandId) => @commandsMap[commandId]?.visible
getAcceleratorForCommandId: (commandId) => @commandsMap[commandId]?.accelerator
getIconForCommandId: (commandId) => @commandsMap[commandId]?.icon
executeCommand: (commandId) => @commandsMap[commandId]?.click()
menuWillShow: =>
# Make sure radio groups have at least one menu item seleted.
@@ -82,6 +114,7 @@ Menu::insert = (pos, item) ->
@insertRadioItem pos, item.commandId, item.label, item.groupId
@setSublabel pos, item.sublabel if item.sublabel?
@setIcon pos, item.icon if item.icon?
# Make menu accessable to items.
item.overrideReadOnlyProperty 'menu', this
@@ -114,14 +147,25 @@ Menu.sendActionToFirstResponder = bindings.sendActionToFirstResponder
Menu.buildFromTemplate = (template) ->
throw new TypeError('Invalid template for Menu') unless Array.isArray template
menu = new Menu
positionedTemplate = []
insertIndex = 0
for item in template
if item.position
insertIndex = indexToInsertByPosition positionedTemplate, item.position
else
# If no |position| is specified, insert after last item.
insertIndex++
positionedTemplate.splice insertIndex, 0, item
menu = new Menu
for item in positionedTemplate
throw new TypeError('Invalid template for MenuItem') unless typeof item is 'object'
item.submenu = Menu.buildFromTemplate item.submenu if item.submenu?
menuItem = new MenuItem(item)
menuItem[key] = value for key, value of item when not menuItem[key]?
menu.append menuItem
menu

View File

@@ -16,6 +16,16 @@ class RequestStringJob
@charset = charset ? 'UTF-8'
@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 =
class RequestFileJob
constructor: (@path) ->

View File

@@ -0,0 +1,6 @@
EventEmitter = require('events').EventEmitter
screen = process.atomBinding('screen').screen
screen.__proto__ = EventEmitter.prototype
module.exports = screen

View File

@@ -9,8 +9,8 @@ module.exports.wrap = (webContents) ->
webContents.__proto__ = EventEmitter.prototype
# WebContents::send(channel, args..)
webContents.send = (args...) ->
@_send 'ATOM_INTERNAL_MESSAGE', [args...]
webContents.send = (channel, args...) ->
@_send channel, [args...]
# Make sure webContents.executeJavaScript would run the code only when the
# web contents has been loaded.
@@ -48,10 +48,12 @@ module.exports.wrap = (webContents) ->
process.emit 'ATOM_BROWSER_RELEASE_RENDER_VIEW', "#{processId}-#{routingId}"
# Dispatch IPC messages to the ipc module.
webContents.on 'ipc-message', (event, channel, args...) ->
webContents.on 'ipc-message', (event, packed) ->
[channel, args...] = packed
Object.defineProperty event, 'sender', value: webContents
ipc.emit channel, event, args...
webContents.on 'ipc-message-sync', (event, channel, args...) ->
webContents.on 'ipc-message-sync', (event, packed) ->
[channel, args...] = packed
Object.defineProperty event, 'returnValue', set: (value) -> event.sendReply JSON.stringify(value)
Object.defineProperty event, 'sender', value: webContents
ipc.emit channel, event, args...

View File

@@ -17,10 +17,10 @@ class AtomAccessTokenStore : public content::AccessTokenStore {
virtual ~AtomAccessTokenStore();
// content::AccessTokenStore:
virtual void LoadAccessTokens(
const LoadAccessTokensCallbackType& callback) OVERRIDE;
virtual void SaveAccessToken(const GURL& server_url,
const base::string16& access_token) OVERRIDE;
void LoadAccessTokens(
const LoadAccessTokensCallbackType& callback) override;
void SaveAccessToken(const GURL& server_url,
const base::string16& access_token) override;
private:
DISALLOW_COPY_AND_ASSIGN(AtomAccessTokenStore);

View File

@@ -7,9 +7,10 @@
#include "atom/browser/atom_access_token_store.h"
#include "atom/browser/atom_browser_context.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/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/common/options_switches.h"
#include "base/command_line.h"
@@ -18,6 +19,7 @@
#include "chrome/browser/speech/tts_message_filter.h"
#include "content/public/browser/render_process_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/web_contents.h"
#include "content/public/common/web_preferences.h"
@@ -61,7 +63,7 @@ void AtomBrowserClient::RenderProcessWillLaunch(
}
content::SpeechRecognitionManagerDelegate*
AtomBrowserClient::GetSpeechRecognitionManagerDelegate() {
AtomBrowserClient::CreateSpeechRecognitionManagerDelegate() {
return new AtomSpeechRecognitionManagerDelegate;
}
@@ -69,6 +71,12 @@ content::AccessTokenStore* AtomBrowserClient::CreateAccessTokenStore() {
return new AtomAccessTokenStore;
}
void AtomBrowserClient::ResourceDispatcherHostCreated() {
resource_dispatcher_delegate_.reset(new AtomResourceDispatcherHostDelegate);
content::ResourceDispatcherHost::Get()->SetDelegate(
resource_dispatcher_delegate_.get());
}
void AtomBrowserClient::OverrideWebkitPrefs(
content::RenderViewHost* render_view_host,
const GURL& url,
@@ -87,8 +95,8 @@ void AtomBrowserClient::OverrideWebkitPrefs(
prefs->allow_universal_access_from_file_urls = true;
prefs->allow_file_access_from_file_urls = true;
prefs->experimental_webgl_enabled = true;
prefs->allow_displaying_insecure_content = true;
prefs->allow_running_insecure_content = true;
prefs->allow_displaying_insecure_content = false;
prefs->allow_running_insecure_content = false;
// Turn off web security for devtools.
if (url.SchemeIs("chrome-devtools")) {
@@ -97,16 +105,15 @@ void AtomBrowserClient::OverrideWebkitPrefs(
}
// Custom preferences of guest page.
int guest_process_id = render_view_host->GetProcess()->GetID();
WebViewRendererState::WebViewInfo info;
if (WebViewRendererState::GetInstance()->GetInfo(guest_process_id, &info)) {
auto process = render_view_host->GetProcess();
WebViewManager::WebViewInfo info;
if (WebViewManager::GetInfoForProcess(process, &info)) {
prefs->web_security_enabled = !info.disable_web_security;
return;
}
NativeWindow* window = NativeWindow::FromRenderView(
render_view_host->GetProcess()->GetID(),
render_view_host->GetRoutingID());
process->GetID(), render_view_host->GetRoutingID());
if (window)
window->OverrideWebkitPrefs(url, prefs);
}
@@ -154,8 +161,9 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
window->AppendExtraCommandLineSwitches(command_line, child_process_id);
} else {
// Append commnad line arguments for guest web view.
WebViewRendererState::WebViewInfo info;
if (WebViewRendererState::GetInstance()->GetInfo(child_process_id, &info)) {
auto child_process = content::RenderProcessHost::FromID(child_process_id);
WebViewManager::WebViewInfo info;
if (WebViewManager::GetInfoForProcess(child_process, &info)) {
command_line->AppendSwitchASCII(
switches::kGuestInstanceID,
base::IntToString(info.guest_instance_id));

View File

@@ -11,6 +11,8 @@
namespace atom {
class AtomResourceDispatcherHostDelegate;
class AtomBrowserClient : public brightray::BrowserClient {
public:
AtomBrowserClient();
@@ -20,8 +22,9 @@ class AtomBrowserClient : public brightray::BrowserClient {
// content::ContentBrowserClient:
void RenderProcessWillLaunch(content::RenderProcessHost* host) override;
content::SpeechRecognitionManagerDelegate*
GetSpeechRecognitionManagerDelegate() override;
CreateSpeechRecognitionManagerDelegate() override;
content::AccessTokenStore* CreateAccessTokenStore() override;
void ResourceDispatcherHostCreated() override;
void OverrideWebkitPrefs(content::RenderViewHost* render_view_host,
const GURL& url,
content::WebPreferences* prefs) override;
@@ -37,6 +40,8 @@ class AtomBrowserClient : public brightray::BrowserClient {
brightray::BrowserMainParts* OverrideCreateBrowserMainParts(
const content::MainFunctionParams&) override;
scoped_ptr<AtomResourceDispatcherHostDelegate> resource_dispatcher_delegate_;
// The render process which would be swapped out soon.
content::RenderProcessHost* dying_render_process_;

View File

@@ -7,7 +7,7 @@
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/net/atom_url_request_job_factory.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 "base/command_line.h"
#include "base/threading/sequenced_worker_pool.h"
@@ -16,7 +16,6 @@
#include "content/public/browser/browser_thread.h"
#include "content/public/common/url_constants.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 "url/url_constants.h"
@@ -26,8 +25,6 @@ namespace atom {
namespace {
const char* kAsarScheme = "asar";
class NoCacheBackend : public net::HttpCache::BackendFactory {
int CreateBackend(net::NetLog* net_log,
scoped_ptr<disk_cache::Backend>* backend,
@@ -59,17 +56,12 @@ net::URLRequestJobFactory* AtomBrowserContext::CreateURLRequestJobFactory(
job_factory->SetProtocolHandler(
url::kDataScheme, new net::DataProtocolHandler);
job_factory->SetProtocolHandler(
url::kFileScheme, new net::FileProtocolHandler(
BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
job_factory->SetProtocolHandler(
kAsarScheme, new asar::AsarProtocolHandler(
url::kFileScheme, new asar::AsarProtocolHandler(
BrowserThread::GetBlockingPool()->GetTaskRunnerWithShutdownBehavior(
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN)));
// Set up interceptors in the reverse order.
scoped_ptr<net::URLRequestJobFactory> top_job_factory =
job_factory.PassAs<net::URLRequestJobFactory>();
scoped_ptr<net::URLRequestJobFactory> top_job_factory = job_factory.Pass();
content::URLRequestInterceptorScopedVector::reverse_iterator it;
for (it = interceptors->rbegin(); it != interceptors->rend(); ++it)
top_job_factory.reset(new net::URLRequestInterceptingJobFactory(

View File

@@ -72,6 +72,9 @@ void AtomBrowserMainParts::PostEarlyInitialization() {
// Add atom-shell extended APIs.
atom_bindings_->BindTo(js_env_->isolate(), global_env->process_object());
// Load everything.
node_bindings_->LoadEnvironment(global_env);
}
void AtomBrowserMainParts::PreMainMessageLoopRun() {
@@ -90,7 +93,7 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
brightray::BrowserMainParts::PreMainMessageLoopRun();
#if defined(USE_X11)
libgtk2ui::GtkInitFromCommandLine(*CommandLine::ForCurrentProcess());
libgtk2ui::GtkInitFromCommandLine(*base::CommandLine::ForCurrentProcess());
#endif
#if !defined(OS_MACOSX)

View File

@@ -27,14 +27,14 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
protected:
// Implementations of brightray::BrowserMainParts.
virtual brightray::BrowserContext* CreateBrowserContext() OVERRIDE;
brightray::BrowserContext* CreateBrowserContext() override;
// Implementations of content::BrowserMainParts.
virtual void PostEarlyInitialization() OVERRIDE;
virtual void PreMainMessageLoopRun() OVERRIDE;
void PostEarlyInitialization() override;
void PreMainMessageLoopRun() override;
#if defined(OS_MACOSX)
virtual void PreMainMessageLoopStart() OVERRIDE;
virtual void PostDestroyThreads() OVERRIDE;
void PreMainMessageLoopStart() override;
void PostDestroyThreads() override;
#endif
private:

View File

@@ -4,9 +4,10 @@
#include "atom/browser/atom_browser_main_parts.h"
#include <gio/gio.h>
#include "base/command_line.h"
#include "base/strings/string_number_conversions.h"
#include "library_loaders/libgio.h"
#include "ui/gfx/switches.h"
namespace atom {
@@ -16,8 +17,8 @@ namespace {
const char* kInterfaceSchema = "org.gnome.desktop.interface";
const char* kScaleFactor = "scaling-factor";
bool SchemaExists(const LibGioLoader& libgio_loader, const char* schema_name) {
const gchar* const* schemas = libgio_loader.g_settings_list_schemas();
bool SchemaExists(const char* schema_name) {
const gchar* const* schemas = g_settings_list_schemas();
while (*schemas) {
if (strcmp(schema_name, static_cast<const char*>(*schemas)) == 0)
return true;
@@ -26,9 +27,8 @@ bool SchemaExists(const LibGioLoader& libgio_loader, const char* schema_name) {
return false;
}
bool KeyExists(const LibGioLoader& libgio_loader, GSettings* client,
const char* key) {
gchar** keys = libgio_loader.g_settings_list_keys(client);
bool KeyExists(GSettings* client, const char* key) {
gchar** keys = g_settings_list_keys(client);
if (!keys)
return false;
@@ -45,24 +45,15 @@ bool KeyExists(const LibGioLoader& libgio_loader, GSettings* client,
}
void GetDPIFromGSettings(guint* scale_factor) {
LibGioLoader libgio_loader;
// Try also without .0 at the end; on some systems this may be required.
if (!libgio_loader.Load("libgio-2.0.so.0") &&
!libgio_loader.Load("libgio-2.0.so")) {
VLOG(1) << "Cannot load gio library. Will fall back to gconf.";
return;
}
GSettings* client = nullptr;
if (!SchemaExists(libgio_loader, kInterfaceSchema) ||
!(client = libgio_loader.g_settings_new(kInterfaceSchema))) {
if (!SchemaExists(kInterfaceSchema) ||
!(client = g_settings_new(kInterfaceSchema))) {
VLOG(1) << "Cannot create gsettings client.";
return;
}
if (KeyExists(libgio_loader, client, kScaleFactor))
*scale_factor = libgio_loader.g_settings_get_uint(client, kScaleFactor);
if (KeyExists(client, kScaleFactor))
*scale_factor = g_settings_get_uint(client, kScaleFactor);
g_object_unref(client);
}

View File

@@ -4,12 +4,11 @@
#include "atom/browser/atom_browser_main_parts.h"
#import "atom/browser/mac/atom_application.h"
#import "atom/browser/mac/atom_application_delegate.h"
#include "base/files/file_path.h"
#import "base/mac/foundation_util.h"
#include "atom/browser/mac/atom_application.h"
#include "atom/browser/mac/atom_application_delegate.h"
#include "base/mac/bundle_locations.h"
#include "base/mac/foundation_util.h"
#include "ui/base/l10n/l10n_util_mac.h"
#import "vendor/brightray/common/mac/main_application_bundle.h"
namespace atom {
@@ -23,12 +22,7 @@ void AtomBrowserMainParts::PreMainMessageLoopStart() {
AtomApplicationDelegate* delegate = [[AtomApplicationDelegate alloc] init];
[NSApp setDelegate:(id<NSFileManagerDelegate>)delegate];
base::FilePath frameworkPath = brightray::MainApplicationBundlePath()
.Append("Contents")
.Append("Frameworks")
.Append(PRODUCT_NAME " Framework.framework");
NSBundle* frameworkBundle = [NSBundle
bundleWithPath:base::mac::FilePathToNSString(frameworkPath)];
NSBundle* frameworkBundle = base::mac::FrameworkBundle();
NSNib* mainNib = [[NSNib alloc] initWithNibNamed:@"MainMenu"
bundle:frameworkBundle];
[mainNib instantiateWithOwner:application topLevelObjects:nil];

View File

@@ -14,7 +14,7 @@ namespace atom {
class AtomJavaScriptDialogManager : public content::JavaScriptDialogManager {
public:
// content::JavaScriptDialogManager implementations.
virtual void RunJavaScriptDialog(
void RunJavaScriptDialog(
content::WebContents* web_contents,
const GURL& origin_url,
const std::string& accept_lang,
@@ -22,16 +22,15 @@ class AtomJavaScriptDialogManager : public content::JavaScriptDialogManager {
const base::string16& message_text,
const base::string16& default_prompt_text,
const DialogClosedCallback& callback,
bool* did_suppress_message) OVERRIDE;
virtual void RunBeforeUnloadDialog(
bool* did_suppress_message) override;
void RunBeforeUnloadDialog(
content::WebContents* web_contents,
const base::string16& message_text,
bool is_reload,
const DialogClosedCallback& callback) OVERRIDE;
virtual void CancelActiveAndPendingDialogs(
content::WebContents* web_contents) OVERRIDE {}
virtual void WebContentsDestroyed(
content::WebContents* web_contents) OVERRIDE {}
const DialogClosedCallback& callback) override;
void CancelActiveAndPendingDialogs(
content::WebContents* web_contents) override {}
void WebContentsDestroyed(content::WebContents* web_contents) override {}
};
} // namespace atom

View 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

View 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_

View File

@@ -36,15 +36,21 @@ void RelaunchToInstallUpdate() {
// static
void AutoUpdater::SetFeedURL(const std::string& feed) {
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();
if (!delegate)
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]
subscribeNext:^(NSNumber *stateNumber) {
int state = [stateNumber integerValue];
@@ -88,7 +94,9 @@ void AutoUpdater::CheckForUpdates() {
delegate->OnUpdateNotAvailable();
}
} error:^(NSError *error) {
delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription));
delegate->OnError(base::SysNSStringToUTF8(
[NSString stringWithFormat:@"%@: %@",
error.localizedDescription, error.localizedFailureReason]));
}];
}

View File

@@ -28,7 +28,9 @@ Browser* Browser::Get() {
}
void Browser::Quit() {
is_quiting_ = true;
is_quiting_ = HandleBeforeQuit();
if (!is_quiting_)
return;
atom::WindowList* window_list = atom::WindowList::GetInstance();
if (window_list->size() == 0)
@@ -114,6 +116,15 @@ void Browser::NotifyAndShutdown() {
Shutdown();
}
bool Browser::HandleBeforeQuit() {
bool prevent_default = false;
FOR_EACH_OBSERVER(BrowserObserver,
observers_,
OnBeforeQuit(&prevent_default));
return !prevent_default;
}
void Browser::OnWindowCloseCancelled(NativeWindow* window) {
if (is_quiting_)
// Once a beforeunload handler has prevented the closing, we think the quit

View File

@@ -136,6 +136,9 @@ class Browser : public WindowListObserver {
// Send the will-quit message and then shutdown the application.
void NotifyAndShutdown();
// Send the before-quit message and start closing windows.
bool HandleBeforeQuit();
bool is_quiting_;
private:

View File

@@ -9,6 +9,7 @@
#include "atom/browser/native_window.h"
#include "atom/browser/window_list.h"
#include "atom/common/atom_version.h"
#include "brightray/common/application_info.h"
namespace atom {
@@ -31,11 +32,11 @@ void Browser::ClearRecentDocuments() {
}
std::string Browser::GetExecutableFileVersion() const {
return ATOM_VERSION_STRING;
return brightray::GetApplicationVersion();
}
std::string Browser::GetExecutableFileProductName() const {
return "Atom-Shell";
return brightray::GetApplicationName();
}
} // namespace atom

View File

@@ -4,13 +4,13 @@
#include "atom/browser/browser.h"
#import "atom/browser/mac/atom_application.h"
#import "atom/browser/mac/atom_application_delegate.h"
#include "atom/browser/mac/atom_application.h"
#include "atom/browser/mac/atom_application_delegate.h"
#include "atom/browser/native_window.h"
#include "atom/browser/window_list.h"
#import "base/mac/bundle_locations.h"
#import "base/mac/foundation_util.h"
#include "base/mac/foundation_util.h"
#include "base/strings/sys_string_conversions.h"
#include "brightray/common/application_info.h"
namespace atom {
@@ -27,15 +27,11 @@ void Browser::ClearRecentDocuments() {
}
std::string Browser::GetExecutableFileVersion() const {
NSDictionary* infoDictionary = base::mac::OuterBundle().infoDictionary;
NSString *version = [infoDictionary objectForKey:@"CFBundleVersion"];
return base::SysNSStringToUTF8(version);
return brightray::GetApplicationVersion();
}
std::string Browser::GetExecutableFileProductName() const {
NSDictionary* infoDictionary = base::mac::OuterBundle().infoDictionary;
NSString *version = [infoDictionary objectForKey:@"CFBundleName"];
return base::SysNSStringToUTF8(version);
return brightray::GetApplicationName();
}
int Browser::DockBounce(BounceType type) {

View File

@@ -11,6 +11,9 @@ namespace atom {
class BrowserObserver {
public:
// The browser is about to close all windows.
virtual void OnBeforeQuit(bool* prevent_default) {}
// The browser has closed all windows and will quit.
virtual void OnWillQuit(bool* prevent_default) {}

View File

@@ -118,7 +118,7 @@ void Browser::SetUserTasks(const std::vector<UserTask>& tasks) {
}
void Browser::SetAppUserModelID(const std::string& name) {
app_user_model_id_ = base::string16(L"atom-shell.app.");
app_user_model_id_ = base::string16(L"electron.app.");
app_user_model_id_ += base::UTF8ToUTF16(name);
SetCurrentProcessExplicitAppUserModelID(app_user_model_id_.c_str());
}
@@ -142,7 +142,7 @@ std::string Browser::GetExecutableFileProductName() const {
return base::UTF16ToUTF8(version_info->product_name());
}
return "Atom-Shell";
return ATOM_PRODUCT_NAME;
}
} // namespace atom

View File

@@ -25,10 +25,10 @@ app.on('ready', function() {
if (process.platform == 'darwin') {
var template = [
{
label: 'Atom Shell',
label: 'Electron',
submenu: [
{
label: 'About Atom Shell',
label: 'About Electron',
selector: 'orderFrontStandardAboutPanel:'
},
{
@@ -42,7 +42,7 @@ app.on('ready', function() {
type: 'separator'
},
{
label: 'Hide Atom Shell',
label: 'Hide Electron',
accelerator: 'Command+H',
selector: 'hide:'
},

View File

@@ -1,6 +1,6 @@
<html>
<head>
<title>Atom Shell</title>
<title>Electron</title>
<style>
body {
color: #555;
@@ -72,19 +72,19 @@
};
</script>
<h2 style="-webkit-app-region: drag">Welcome to Atom Shell</h2>
<h2 style="-webkit-app-region: drag">Welcome to Electron</h2>
<p>
To run your app with atom-shell, execute the following command under your
To run your app with Electron, execute the following command under your
Console (or Terminal):
</p>
<script>document.write('<pre>' + command + '</pre>')</script>
<p>
The <code>path-to-your-app</code> should be the path to your own atom-shell
app, you can read the <a href='https://github.com/atom/atom-shell/blob/master/docs/tutorial/quick-start.md'>quick start</a>
guide in atom-shell's <a href='https://github.com/atom/atom-shell/blob/master/docs'>docs</a>
The <code>path-to-your-app</code> should be the path to your own Electron
app, you can read the <a href='https://github.com/atom/electron/blob/master/docs/tutorial/quick-start.md'>quick start</a>
guide in Electron's <a href='https://github.com/atom/electron/blob/master/docs'>docs</a>
on how to write one.
</p>

View File

@@ -41,6 +41,8 @@ if (option.file && !option.webdriver) {
app.setName(packageJson.productName);
else if (packageJson.name)
app.setName(packageJson.name);
app.setPath('userData', path.join(app.getPath('appData'), app.getName()));
app.setPath('userCache', path.join(app.getPath('cache'), app.getName()));
}
// Run the app.
@@ -48,15 +50,15 @@ if (option.file && !option.webdriver) {
} catch(e) {
if (e.code == 'MODULE_NOT_FOUND') {
app.focus();
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 electron app, please read the docs on how to write one:\nhttps://github.com/atom/electron/tree/master/docs');
process.exit(1);
} else {
console.error('App throwed an error when running', e);
console.error('App threw an error when running', e);
throw e;
}
}
} else if (option.version) {
console.log('v' + process.versions['atom-shell']);
console.log('v' + process.versions['electron']);
process.exit(0);
} else {
require('./default_app.js');

View File

@@ -1,6 +1,5 @@
{
"name": "atom-shell-default-app",
"productName": "Atom Shell Default App",
"version": "0.1.0",
"name": "electron",
"productName": "Electron",
"main": "main.js"
}

View File

@@ -32,17 +32,11 @@ getExtensionInfoFromPath = (srcDirectory) ->
startPage: page
name: manifest.name
srcDirectory: srcDirectory
extensionInfoMap[manifest.name]
extensionInfoMap[manifest.name]
# Load persistented extensions.
loadedExtensionsPath = path.join app.getDataPath(), 'DevTools Extensions'
try
loadedExtensions = JSON.parse fs.readFileSync(loadedExtensionsPath)
loadedExtensions = [] unless Array.isArray loadedExtensions
# Preheat the extensionInfo cache.
getExtensionInfoFromPath srcDirectory for srcDirectory in loadedExtensions
catch e
# The loaded extensions cache and its persistent path.
loadedExtensions = null
loadedExtensionsPath = null
# Persistent loaded extensions.
app.on 'will-quit', ->
@@ -59,6 +53,16 @@ app.once 'ready', ->
protocol = require 'protocol'
BrowserWindow = require 'browser-window'
# Load persistented extensions.
loadedExtensionsPath = path.join app.getDataPath(), 'DevTools Extensions'
try
loadedExtensions = JSON.parse fs.readFileSync(loadedExtensionsPath)
loadedExtensions = [] unless Array.isArray loadedExtensions
# Preheat the extensionInfo cache.
getExtensionInfoFromPath srcDirectory for srcDirectory in loadedExtensions
catch e
# The chrome-extension: can map a extension URL request to real file path.
protocol.registerProtocol 'chrome-extension', (request) ->
parsed = url.parse request.url
@@ -70,12 +74,13 @@ app.once 'ready', ->
return new protocol.RequestFileJob(path.join(directory, parsed.path))
BrowserWindow::_loadDevToolsExtensions = (extensionInfoArray) ->
@devToolsWebContents?.executeJavaScript "WebInspector.addExtensions(#{JSON.stringify(extensionInfoArray)});"
@devToolsWebContents?.executeJavaScript "DevToolsAPI.addExtensions(#{JSON.stringify(extensionInfoArray)});"
BrowserWindow.addDevToolsExtension = (srcDirectory) ->
extensionInfo = getExtensionInfoFromPath srcDirectory
window._loadDevToolsExtensions [extensionInfo] for window in BrowserWindow.getAllWindows()
extensionInfo.name
if extensionInfo
window._loadDevToolsExtensions [extensionInfo] for window in BrowserWindow.getAllWindows()
extensionInfo.name
BrowserWindow.removeDevToolsExtension = (name) ->
delete extensionInfoMap[name]

View File

@@ -8,12 +8,14 @@ supportedWebViewEvents = [
'did-frame-finish-load'
'did-start-loading'
'did-stop-loading'
'did-get-response-details'
'did-get-redirect-request'
'console-message'
'new-window'
'close'
'crashed'
'destroyed'
'page-title-set'
]
nextInstanceId = 0
@@ -39,7 +41,7 @@ createGuest = (embedder, params) ->
# Destroy guest when the embedder is gone or navigated.
destroyEvents = ['destroyed', 'crashed', 'did-navigate-to-different-page']
destroy = ->
destroyGuest id if guestInstances[id]?
destroyGuest embedder, id if guestInstances[id]?
embedder.once event, destroy for event in destroyEvents
guest.once 'destroyed', ->
embedder.removeListener event, destroy for event in destroyEvents
@@ -68,7 +70,8 @@ createGuest = (embedder, params) ->
embedder.send "ATOM_SHELL_GUEST_VIEW_INTERNAL_DISPATCH_EVENT-#{guest.viewInstanceId}", event, args...
# Dispatch guest's IPC messages to embedder.
guest.on 'ipc-message-host', (_, channel, args...) ->
guest.on 'ipc-message-host', (_, packed) ->
[channel, args...] = packed
embedder.send "ATOM_SHELL_GUEST_VIEW_INTERNAL_IPC_MESSAGE-#{guest.viewInstanceId}", channel, args...
# Autosize.
@@ -89,7 +92,7 @@ attachGuest = (embedder, elementInstanceId, guestInstanceId, params) ->
return unless oldGuestInstanceId != guestInstanceId
return unless guestInstances[oldGuestInstanceId]?
destroyGuest oldGuestInstanceId
destroyGuest embedder, oldGuestInstanceId
webViewManager.addGuest guestInstanceId, elementInstanceId, embedder, guest,
nodeIntegration: params.nodeintegration
@@ -102,8 +105,8 @@ attachGuest = (embedder, elementInstanceId, guestInstanceId, params) ->
reverseEmbedderElementsMap[guestInstanceId] = key
# Destroy an existing guest instance.
destroyGuest = (id) ->
webViewManager.removeGuest id
destroyGuest = (embedder, id) ->
webViewManager.removeGuest embedder, id
guestInstances[id].guest.destroy()
delete guestInstances[id]
@@ -115,12 +118,11 @@ destroyGuest = (id) ->
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_CREATE_GUEST', (event, type, params, requestId) ->
event.sender.send "ATOM_SHELL_RESPONSE_#{requestId}", createGuest(event.sender, params)
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_ATTACH_GUEST', (event, elementInstanceId, guestInstanceId, params, requestId) ->
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_ATTACH_GUEST', (event, elementInstanceId, guestInstanceId, params) ->
attachGuest event.sender, elementInstanceId, guestInstanceId, params
event.sender.send "ATOM_SHELL_RESPONSE_#{requestId}"
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) ->
guestInstances[id]?.guest.setAutoSize params.enableAutoSize, params.min, params.max

View File

@@ -1,4 +1,5 @@
ipc = require 'ipc'
v8Util = process.atomBinding 'v8_util'
BrowserWindow = require 'browser-window'
frameToGuest = {}
@@ -13,13 +14,18 @@ createGuest = (embedder, url, frameName, options) ->
guest = new BrowserWindow(options)
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
# guest is closed by user then we should prevent |embedder| from double
# closing guest.
closedByEmbedder = ->
embedder.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', guest.id
guest.removeListener 'closed', closedByUser
guest.destroy() unless guest.isClosed()
closedByUser = ->
embedder.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', guest.id
embedder.removeListener 'render-view-deleted', closedByEmbedder
embedder.once 'render-view-deleted', closedByEmbedder
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
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...) ->
return unless BrowserWindow.windows.has guestId
BrowserWindow.windows.get(guestId).webContents?[method] args...

View File

@@ -3,95 +3,90 @@ path = require 'path'
module = require 'module'
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 need to restore it here.
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,
# which contains javascript part of Atom's built-in libraries.
globalPaths = module.globalPaths
globalPaths.push path.join process.resourcesPath, 'atom', 'browser', 'api', 'lib'
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
# Following operations need extra bindings by AtomBindings.
process.once 'BIND_DONE', ->
# Import common settings.
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init.js')
# Import common settings.
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
if process.platform is 'win32'
# Redirect node's console to use our own implementations, since node can not
# handle console output when running as GUI program.
print = (args...) ->
process.log util.format(args...)
console.log = console.error = console.warn = print
process.stdout.write = process.stderr.write = print
if process.platform is 'win32'
# Redirect node's console to use our own implementations, since node can not
# handle console output when running as GUI program.
print = (args...) ->
process.log util.format(args...)
console.log = console.error = console.warn = print
process.stdout.write = process.stderr.write = print
# Always returns EOF for stdin stream.
Readable = require('stream').Readable
stdin = new Readable
stdin.push null
process.__defineGetter__ 'stdin', -> stdin
# Always returns EOF for stdin stream.
Readable = require('stream').Readable
stdin = new Readable
stdin.push null
process.__defineGetter__ 'stdin', -> stdin
# Don't quit on fatal error.
process.on 'uncaughtException', (error) ->
# Show error in GUI.
stack = error.stack ? "#{error.name}: #{error.message}"
message = "Uncaught Exception:\n#{stack}"
require('dialog').showErrorBox 'A JavaScript error occured in the browser process', message
# Don't quit on fatal error.
process.on 'uncaughtException', (error) ->
# Do nothing if the user has a custom uncaught exception handler.
if process.listeners('uncaughtException').length > 1
return
# Emit 'exit' event on quit.
require('app').on 'quit', ->
process.emit 'exit'
# Show error in GUI.
stack = error.stack ? "#{error.name}: #{error.message}"
message = "Uncaught Exception:\n#{stack}"
require('dialog').showErrorBox 'A JavaScript error occured in the browser process', message
# Load the RPC server.
require './rpc-server'
# Emit 'exit' event on quit.
app = require 'app'
app.on 'quit', ->
process.emit 'exit'
# Load the guest view manager.
require './guest-view-manager'
require './guest-window-manager'
# Load the RPC server.
require './rpc-server'
# Now we try to load app's package.json.
packageJson = null
# Load the guest view manager.
require './guest-view-manager'
require './guest-window-manager'
searchPaths = [ 'app', 'app.asar', 'default_app' ]
for packagePath in searchPaths
try
packagePath = path.join process.resourcesPath, packagePath
packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json')))
break
catch e
continue
# Now we try to load app's package.json.
packageJson = null
throw new Error("Unable to find a valid app") unless packageJson?
searchPaths = [ 'app', 'app.asar', 'default_app' ]
for packagePath in searchPaths
try
packagePath = path.join process.resourcesPath, packagePath
packageJson = JSON.parse(fs.readFileSync(path.join(packagePath, 'package.json')))
break
catch e
continue
# Set application's version.
app = require 'app'
app.setVersion packageJson.version if packageJson.version?
throw new Error("Unable to find a valid app") unless packageJson?
# Set application's name.
if packageJson.productName?
app.setName packageJson.productName
else if packageJson.name?
app.setName packageJson.name
# Set application's version.
app.setVersion packageJson.version if packageJson.version?
# Set application's desktop name.
if packageJson.desktopName?
app.setDesktopName packageJson.desktopName
else
app.setDesktopName '#{app.getName()}.desktop'
# Set application's name.
if packageJson.productName?
app.setName packageJson.productName
else if packageJson.name?
app.setName packageJson.name
# Load the chrome extension support.
require './chrome-extension.js'
# Set application's desktop name.
if packageJson.desktopName?
app.setDesktopName packageJson.desktopName
else
app.setDesktopName "#{app.getName()}.desktop"
# Finally load app's main.js and transfer control to C++.
module._load path.join(packagePath, packageJson.main), module, true
# Set the user path according to application's name.
app.setPath 'userData', path.join(app.getPath('appData'), app.getName())
app.setPath 'userCache', path.join(app.getPath('cache'), app.getName())
# Load the chrome extension support.
require './chrome-extension'
# Finally load app's main.js and transfer control to C++.
module._load path.join(packagePath, packageJson.main), module, true

View File

@@ -4,9 +4,10 @@
#import "atom/browser/mac/atom_application.h"
#include "atom/browser/browser.h"
#include "base/auto_reset.h"
#include "base/strings/sys_string_conversions.h"
#include "atom/browser/browser.h"
#include "content/public/browser/browser_accessibility_state.h"
@implementation AtomApplication
@@ -46,4 +47,23 @@
atom::Browser::Get()->OpenURL(base::SysNSStringToUTF8(url));
}
- (void)accessibilitySetValue:(id)value forAttribute:(NSString *)attribute {
// Undocumented attribute that VoiceOver happens to set while running.
// Chromium uses this too, even though it's not exactly right.
if ([attribute isEqualToString:@"AXEnhancedUserInterface"]) {
[self updateAccessibilityEnabled:[value boolValue]];
}
return [super accessibilitySetValue:value forAttribute:attribute];
}
- (void)updateAccessibilityEnabled:(BOOL)enabled {
auto ax_state = content::BrowserAccessibilityState::GetInstance();
if (enabled) {
ax_state->OnScreenReaderDetected();
} else {
ax_state->DisableAccessibility();
}
}
@end

View File

@@ -21,7 +21,7 @@
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/options_switches.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/prefs/pref_service.h"
#include "base/message_loop/message_loop.h"
@@ -32,6 +32,7 @@
#include "brightray/browser/inspectable_web_contents_view.h"
#include "chrome/browser/printing/print_view_manager_basic.h"
#include "chrome/browser/ui/browser_dialogs.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/public/browser/devtools_agent_host.h"
#include "content/public/browser/invalidate_type.h"
#include "content/public/browser/navigation_entry.h"
@@ -51,10 +52,15 @@
#include "native_mate/dictionary.h"
#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/geometry/size_conversions.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/screen.h"
#include "ui/gfx/size.h"
#include "ui/gl/gpu_switching_manager.h"
#if defined(OS_WIN)
#include "ui/gfx/switches.h"
#endif
using content::NavigationEntry;
using content::RenderWidgetHostView;
@@ -88,6 +94,7 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
const mate::Dictionary& options)
: content::WebContentsObserver(web_contents),
has_frame_(true),
transparent_(false),
enable_larger_than_screen_(false),
is_closed_(false),
node_integration_(true),
@@ -99,9 +106,14 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
printing::PrintViewManagerBasic::CreateForWebContents(web_contents);
options.Get(switches::kFrame, &has_frame_);
options.Get(switches::kTransparent, &transparent_);
options.Get(switches::kEnableLargerThanScreen, &enable_larger_than_screen_);
options.Get(switches::kNodeIntegration, &node_integration_);
// Tell the content module to initialize renderer widget with transparent
// mode.
ui::GpuSwitchingManager::SetTransparent(transparent_);
// Read icon before window is created.
options.Get(switches::kIcon, &icon_);
@@ -132,7 +144,7 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
// Override the user agent to contain application and atom-shell's version.
Browser* browser = Browser::Get();
std::string product_name = base::StringPrintf(
"%s/%s Chrome/%s AtomShell/" ATOM_VERSION_STRING,
"%s/%s Chrome/%s " ATOM_PRODUCT_NAME "/" ATOM_VERSION_STRING,
RemoveWhitespace(browser->GetName()).c_str(),
browser->GetVersion().c_str(),
CHROME_VERSION_STRING);
@@ -189,8 +201,8 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
options.Get(switches::kMinWidth, &min_width)) {
SetMinimumSize(gfx::Size(min_width, min_height));
}
int max_height = -1, max_width = -1;
if (options.Get(switches::kMaxHeight, &max_height) &&
int max_height = INT_MAX, max_width = INT_MAX;
if (options.Get(switches::kMaxHeight, &max_height) |
options.Get(switches::kMaxWidth, &max_width)) {
SetMaximumSize(gfx::Size(max_width, max_height));
}
@@ -214,7 +226,7 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
if (options.Get(switches::kKiosk, &kiosk) && kiosk) {
SetKiosk(kiosk);
}
std::string title("Atom Shell");
std::string title("Electron");
options.Get(switches::kTitle, &title);
SetTitle(title);
@@ -269,7 +281,8 @@ bool NativeWindow::HasModalDialog() {
return has_dialog_attached_;
}
void NativeWindow::OpenDevTools() {
void NativeWindow::OpenDevTools(bool can_dock) {
inspectable_web_contents()->SetCanDock(can_dock);
inspectable_web_contents()->ShowDevTools();
}
@@ -282,7 +295,7 @@ bool NativeWindow::IsDevToolsOpened() {
}
void NativeWindow::InspectElement(int x, int y) {
OpenDevTools();
OpenDevTools(true);
scoped_refptr<content::DevToolsAgentHost> agent(
content::DevToolsAgentHost::GetOrCreateFor(GetWebContents()));
agent->InspectElement(x, y);
@@ -308,7 +321,7 @@ void NativeWindow::CapturePage(const gfx::Rect& rect,
RenderWidgetHostView* const view = contents->GetRenderWidgetHostView();
RenderWidgetHost* const host = view ? view->GetRenderWidgetHost() : nullptr;
if (!view || !host) {
callback.Run(std::vector<unsigned char>());
callback.Run(SkBitmap());
return;
}
@@ -444,8 +457,12 @@ void NativeWindow::OverrideWebkitPrefs(const GURL& url,
if (web_preferences_.Get("webaudio", &b))
prefs->webaudio_enabled = b;
if (web_preferences_.Get("extra-plugin-dirs", &list)) {
for (size_t i = 0; i < list.size(); ++i)
content::PluginService::GetInstance()->AddExtraPluginDir(list[i]);
if (content::PluginService::GetInstance()->NPAPIPluginsSupported()) {
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";
}
}
}
@@ -500,6 +517,7 @@ void NativeWindow::NotifyWindowLeaveFullScreen() {
bool NativeWindow::ShouldCreateWebContents(
content::WebContents* web_contents,
int route_id,
int main_frame_route_id,
WindowContainerType window_container_type,
const base::string16& frame_name,
const GURL& target_url,
@@ -553,13 +571,26 @@ content::WebContents* NativeWindow::OpenURLFromTab(
return source;
}
content::JavaScriptDialogManager* NativeWindow::GetJavaScriptDialogManager() {
content::JavaScriptDialogManager* NativeWindow::GetJavaScriptDialogManager(
content::WebContents* source) {
if (!dialog_manager_)
dialog_manager_.reset(new AtomJavaScriptDialogManager);
return dialog_manager_.get();
}
void NativeWindow::RenderViewCreated(
content::RenderViewHost* render_view_host) {
if (!transparent_)
return;
content::RenderWidgetHostImpl* impl = content::RenderWidgetHostImpl::FromID(
render_view_host->GetProcess()->GetID(),
render_view_host->GetRoutingID());
if (impl)
impl->SetBackgroundOpaque(false);
}
void NativeWindow::BeforeUnloadFired(content::WebContents* tab,
bool proceed,
bool* proceed_to_fire_unload) {
@@ -703,7 +734,7 @@ void NativeWindow::DevToolsSaveToFile(const std::string& url,
base::FilePath default_path(base::FilePath::FromUTF8Unsafe(url));
if (!file_dialog::ShowSaveDialog(this, url, default_path, filters, &path)) {
base::StringValue url_value(url);
CallDevToolsFunction("InspectorFrontendAPI.canceledSaveURL", &url_value);
CallDevToolsFunction("DevToolsAPI.canceledSaveURL", &url_value);
return;
}
}
@@ -713,7 +744,7 @@ void NativeWindow::DevToolsSaveToFile(const std::string& url,
// Notify devtools.
base::StringValue url_value(url);
CallDevToolsFunction("InspectorFrontendAPI.savedURL", &url_value);
CallDevToolsFunction("DevToolsAPI.savedURL", &url_value);
}
void NativeWindow::DevToolsAppendToFile(const std::string& url,
@@ -725,7 +756,11 @@ void NativeWindow::DevToolsAppendToFile(const std::string& url,
// Notify devtools.
base::StringValue url_value(url);
CallDevToolsFunction("InspectorFrontendAPI.appendedToURL", &url_value);
CallDevToolsFunction("DevToolsAPI.appendedToURL", &url_value);
}
void NativeWindow::DevToolsFocused() {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_, OnDevToolsFocus());
}
void NativeWindow::ScheduleUnresponsiveEvent(int ms) {
@@ -751,13 +786,9 @@ void NativeWindow::NotifyWindowUnresponsive() {
}
void NativeWindow::OnCapturePageDone(const CapturePageCallback& callback,
bool succeed,
const SkBitmap& bitmap) {
SkAutoLockPixels screen_capture_lock(bitmap);
std::vector<unsigned char> data;
if (succeed)
gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, true, &data);
callback.Run(data);
const SkBitmap& bitmap,
content::ReadbackResponse response) {
callback.Run(bitmap);
}
void NativeWindow::CallDevToolsFunction(const std::string& function_name,

View File

@@ -20,8 +20,9 @@
#include "brightray/browser/inspectable_web_contents_impl.h"
#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/notification_observer.h"
#include "content/public/browser/readback_types.h"
#include "native_mate/persistent_dictionary.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/gfx/image/image.h"
namespace base {
class CommandLine;
@@ -58,8 +59,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
public content::WebContentsObserver,
public content::NotificationObserver {
public:
typedef base::Callback<void(const std::vector<unsigned char>& buffer)>
CapturePageCallback;
typedef base::Callback<void(const SkBitmap& bitmap)> CapturePageCallback;
class DialogScope {
public:
@@ -142,9 +142,13 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
virtual bool HasModalDialog();
virtual gfx::NativeWindow GetNativeWindow() = 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 void OpenDevTools();
virtual void OpenDevTools(bool can_dock);
virtual void CloseDevTools();
virtual bool IsDevToolsOpened();
virtual void InspectElement(int x, int y);
@@ -233,6 +237,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
bool ShouldCreateWebContents(
content::WebContents* web_contents,
int route_id,
int main_frame_route_id,
WindowContainerType window_container_type,
const base::string16& frame_name,
const GURL& target_url,
@@ -241,7 +246,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
content::WebContents* OpenURLFromTab(
content::WebContents* source,
const content::OpenURLParams& params) override;
content::JavaScriptDialogManager* GetJavaScriptDialogManager() override;
content::JavaScriptDialogManager* GetJavaScriptDialogManager(
content::WebContents* source) override;
void BeforeUnloadFired(content::WebContents* tab,
bool proceed,
bool* proceed_to_fire_unload) override;
@@ -269,6 +275,7 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
void RendererResponsive(content::WebContents* source) override;
// Implementations of content::WebContentsObserver.
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
void BeforeUnloadFired(const base::TimeTicks& proceed_time) override;
bool OnMessageReceived(const IPC::Message& message) override;
@@ -283,10 +290,14 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
bool save_as) override;
void DevToolsAppendToFile(const std::string& url,
const std::string& content) override;
void DevToolsFocused() override;
// Whether window has standard frame.
bool has_frame_;
// Whether window is transparent.
bool transparent_;
// Whether window can be resized larger than screen.
bool enable_larger_than_screen_;
@@ -308,8 +319,8 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
// Called when CapturePage has done.
void OnCapturePageDone(const CapturePageCallback& callback,
bool succeed,
const SkBitmap& bitmap);
const SkBitmap& bitmap,
content::ReadbackResponse response);
// Notification manager.
content::NotificationRegistrar registrar_;

View File

@@ -14,6 +14,8 @@
#include "base/memory/scoped_ptr.h"
#include "atom/browser/native_window.h"
@class AtomNSWindow;
@class AtomNSWindowDelegate;
@class FullSizeContentView;
class SkRegion;
@@ -26,52 +28,57 @@ class NativeWindowMac : public NativeWindow {
virtual ~NativeWindowMac();
// NativeWindow implementation.
virtual void Close() OVERRIDE;
virtual void CloseImmediately() OVERRIDE;
virtual void Move(const gfx::Rect& pos) OVERRIDE;
virtual void Focus(bool focus) OVERRIDE;
virtual bool IsFocused() OVERRIDE;
virtual void Show() OVERRIDE;
virtual void ShowInactive() OVERRIDE;
virtual void Hide() OVERRIDE;
virtual bool IsVisible() OVERRIDE;
virtual void Maximize() OVERRIDE;
virtual void Unmaximize() OVERRIDE;
virtual bool IsMaximized() OVERRIDE;
virtual void Minimize() OVERRIDE;
virtual void Restore() OVERRIDE;
virtual bool IsMinimized() OVERRIDE;
virtual void SetFullScreen(bool fullscreen) OVERRIDE;
virtual bool IsFullscreen() OVERRIDE;
virtual void SetSize(const gfx::Size& size) OVERRIDE;
virtual gfx::Size GetSize() OVERRIDE;
virtual void SetContentSize(const gfx::Size& size) OVERRIDE;
virtual gfx::Size GetContentSize() OVERRIDE;
virtual void SetMinimumSize(const gfx::Size& size) OVERRIDE;
virtual gfx::Size GetMinimumSize() OVERRIDE;
virtual void SetMaximumSize(const gfx::Size& size) OVERRIDE;
virtual gfx::Size GetMaximumSize() OVERRIDE;
virtual void SetResizable(bool resizable) OVERRIDE;
virtual bool IsResizable() OVERRIDE;
virtual void SetAlwaysOnTop(bool top) OVERRIDE;
virtual bool IsAlwaysOnTop() OVERRIDE;
virtual void Center() OVERRIDE;
virtual void SetPosition(const gfx::Point& position) OVERRIDE;
virtual gfx::Point GetPosition() OVERRIDE;
virtual void SetTitle(const std::string& title) OVERRIDE;
virtual std::string GetTitle() OVERRIDE;
virtual void FlashFrame(bool flash) OVERRIDE;
virtual void SetSkipTaskbar(bool skip) OVERRIDE;
virtual void SetKiosk(bool kiosk) OVERRIDE;
virtual bool IsKiosk() OVERRIDE;
virtual void SetRepresentedFilename(const std::string& filename) OVERRIDE;
virtual std::string GetRepresentedFilename() OVERRIDE;
virtual void SetDocumentEdited(bool edited) OVERRIDE;
virtual bool IsDocumentEdited() OVERRIDE;
virtual bool HasModalDialog() OVERRIDE;
virtual gfx::NativeWindow GetNativeWindow() OVERRIDE;
virtual void SetProgressBar(double progress) OVERRIDE;
virtual void ShowDefinitionForSelection() OVERRIDE;
void Close() override;
void CloseImmediately() override;
void Move(const gfx::Rect& pos) override;
void Focus(bool focus) override;
bool IsFocused() override;
void Show() override;
void ShowInactive() override;
void Hide() override;
bool IsVisible() override;
void Maximize() override;
void Unmaximize() override;
bool IsMaximized() override;
void Minimize() override;
void Restore() override;
bool IsMinimized() override;
void SetFullScreen(bool fullscreen) override;
bool IsFullscreen() override;
void SetSize(const gfx::Size& size) override;
gfx::Size GetSize() override;
void SetContentSize(const gfx::Size& size) override;
gfx::Size GetContentSize() override;
void SetMinimumSize(const gfx::Size& size) override;
gfx::Size GetMinimumSize() override;
void SetMaximumSize(const gfx::Size& size) override;
gfx::Size GetMaximumSize() override;
void SetResizable(bool resizable) override;
bool IsResizable() override;
void SetAlwaysOnTop(bool top) override;
bool IsAlwaysOnTop() override;
void Center() override;
void SetPosition(const gfx::Point& position) override;
gfx::Point GetPosition() override;
void SetTitle(const std::string& title) override;
std::string GetTitle() override;
void FlashFrame(bool flash) override;
void SetSkipTaskbar(bool skip) override;
void SetKiosk(bool kiosk) override;
bool IsKiosk() override;
void SetRepresentedFilename(const std::string& filename) override;
std::string GetRepresentedFilename() override;
void SetDocumentEdited(bool edited) override;
bool IsDocumentEdited() override;
bool HasModalDialog() override;
gfx::NativeWindow GetNativeWindow() override;
void SetProgressBar(double progress) override;
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description) override;
void ShowDefinitionForSelection() override;
void SetVisibleOnAllWorkspaces(bool visible) override;
bool IsVisibleOnAllWorkspaces() override;
// Returns true if |point| in local Cocoa coordinate system falls within
// the draggable region.
@@ -83,25 +90,25 @@ class NativeWindowMac : public NativeWindow {
// Clip web view to rounded corner.
void ClipWebView();
SkRegion* draggable_region() const { return draggable_region_.get(); }
protected:
virtual void UpdateDraggableRegions(
const std::vector<DraggableRegion>& regions) OVERRIDE;
void UpdateDraggableRegions(
const std::vector<DraggableRegion>& regions) override;
// Implementations of content::WebContentsDelegate.
virtual void HandleKeyboardEvent(
void HandleKeyboardEvent(
content::WebContents*,
const content::NativeWebKeyboardEvent&) OVERRIDE;
const content::NativeWebKeyboardEvent&) override;
private:
void InstallView();
void UninstallView();
void InstallDraggableRegionViews();
void UpdateDraggableRegionsForCustomDrag(
const std::vector<DraggableRegion>& regions);
base::scoped_nsobject<NSWindow> window_;
// Install the drag view, which will cover the whole window and decides
// whehter we can drag.
void InstallDraggableRegionView();
base::scoped_nsobject<AtomNSWindow> window_;
base::scoped_nsobject<AtomNSWindowDelegate> window_delegate_;
// The view that will fill the whole frameless window.
base::scoped_nsobject<FullSizeContentView> content_view_;
@@ -113,10 +120,6 @@ class NativeWindowMac : public NativeWindow {
// The presentation options before entering kiosk mode.
NSApplicationPresentationOptions kiosk_options_;
// For system drag, the whole window is draggable and the non-draggable areas
// have to been explicitly excluded.
std::vector<gfx::Rect> system_drag_exclude_areas_;
// For custom drag, the whole window is non-draggable and the draggable region
// has to been explicitly provided.
scoped_ptr<SkRegion> draggable_region_; // used in custom drag.

View File

@@ -11,6 +11,7 @@
#include "atom/common/options_switches.h"
#include "base/mac/mac_util.h"
#include "base/strings/sys_string_conversions.h"
#include "content/public/browser/browser_accessibility_state.h"
#include "content/public/browser/native_web_keyboard_event.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/render_view_host.h"
@@ -101,7 +102,7 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
shell_->NotifyWindowBlur();
}
- (void)windowDidResize:(NSNotification*)otification {
- (void)windowDidResize:(NSNotification*)notification {
if (!shell_->has_frame())
shell_->ClipWebView();
}
@@ -140,7 +141,6 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
- (void)windowWillClose:(NSNotification*)notification {
shell_->NotifyWindowClosed();
[self autorelease];
}
- (BOOL)windowShouldClose:(id)window {
@@ -191,21 +191,27 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
}
- (IBAction)showDevTools:(id)sender {
shell_->OpenDevTools();
shell_->OpenDevTools(true);
}
// Returns an empty array for AXChildren attribute, this will force the
// SpeechSynthesisServer to use its classical way of speaking the selected text:
// by invoking the "Command+C" for current application and then speak out
// what's in the clipboard. Otherwise the "Text to Speech" would always speak
// out window's title.
// This behavior is taken by both FireFox and Chrome, see also FireFox's bug on
// more of how SpeechSynthesisServer chose which text to read:
// https://bugzilla.mozilla.org/show_bug.cgi?id=674612
- (id)accessibilityAttributeValue:(NSString*)attribute {
if ([attribute isEqualToString:@"AXChildren"])
return [NSArray array];
return [super accessibilityAttributeValue:attribute];
if (![attribute isEqualToString:@"AXChildren"])
return [super accessibilityAttributeValue:attribute];
// Filter out objects that aren't the title bar buttons. This has the effect
// of removing the window title, which VoiceOver already sees.
// * when VoiceOver is disabled, this causes Cmd+C to be used for TTS but
// still leaves the buttons available in the accessibility tree.
// * when VoiceOver is enabled, the full accessibility tree is used.
// Without removing the title and with VO disabled, the TTS would always read
// the window title instead of using Cmd+C to get the selected text.
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(self isKindOfClass: %@) OR (self.className == %@)",
[NSButtonCell class],
@"RenderWidgetHostViewCocoa"];
NSArray *children = [super accessibilityAttributeValue:attribute];
return [children filteredArrayUsingPredicate:predicate];
}
@end
@@ -243,6 +249,10 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
shellWindow_->HandleMouseEvent(event);
}
- (BOOL)acceptsFirstMouse:(NSEvent*)event {
return YES;
}
@end
@interface AtomProgressBar : NSProgressIndicator
@@ -280,6 +290,29 @@ static const CGFloat kAtomWindowCornerRadius = 4.0;
namespace atom {
namespace {
// Convert draggable regions in raw format to SkRegion format. Caller is
// responsible for deleting the returned SkRegion instance.
SkRegion* DraggableRegionsToSkRegion(
const std::vector<DraggableRegion>& regions) {
SkRegion* sk_region = new SkRegion;
for (std::vector<DraggableRegion>::const_iterator iter = regions.begin();
iter != regions.end();
++iter) {
const DraggableRegion& region = *iter;
sk_region->op(
region.bounds.x(),
region.bounds.y(),
region.bounds.right(),
region.bounds.bottom(),
region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
}
return sk_region;
}
} // namespace
NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
const mate::Dictionary& options)
: NativeWindow(web_contents, options),
@@ -296,23 +329,25 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
width,
height);
AtomNSWindow* atomWindow;
atomWindow = [[AtomNSWindow alloc]
window_.reset([[AtomNSWindow alloc]
initWithContentRect:cocoa_bounds
styleMask:NSTitledWindowMask | NSClosableWindowMask |
NSMiniaturizableWindowMask | NSResizableWindowMask |
NSTexturedBackgroundWindowMask
backing:NSBackingStoreBuffered
defer:YES];
defer:YES]);
[window_ setShell:this];
[window_ setEnableLargerThanScreen:enable_larger_than_screen_];
[atomWindow setShell:this];
[atomWindow setEnableLargerThanScreen:enable_larger_than_screen_];
window_.reset(atomWindow);
window_delegate_.reset([[AtomNSWindowDelegate alloc] initWithShell:this]);
[window_ setDelegate:window_delegate_];
AtomNSWindowDelegate* delegate =
[[AtomNSWindowDelegate alloc] initWithShell:this];
[window_ setDelegate:delegate];
if (transparent_) {
// Make window has transparent background.
[window_ setOpaque:NO];
[window_ setHasShadow:NO];
[window_ setBackgroundColor:[NSColor clearColor]];
}
// We will manage window's lifetime ourselves.
[window_ setReleasedWhenClosed:NO];
@@ -326,7 +361,7 @@ NativeWindowMac::NativeWindowMac(content::WebContents* web_contents,
// Enable the NSView to accept first mouse event.
bool acceptsFirstMouse = false;
options.Get(switches::kAcceptFirstMouse, &acceptsFirstMouse);
[delegate setAcceptsFirstMouse:acceptsFirstMouse];
[window_delegate_ setAcceptsFirstMouse:acceptsFirstMouse];
// Disable fullscreen button when 'fullscreen' is specified to false.
bool fullscreen;
@@ -542,6 +577,10 @@ gfx::Point NativeWindowMac::GetPosition() {
}
void NativeWindowMac::SetTitle(const std::string& title) {
// We don't want the title to show in transparent window.
if (transparent_)
return;
[window_ setTitle:base::SysUTF8ToNSString(title)];
}
@@ -646,6 +685,10 @@ void NativeWindowMac::SetProgressBar(double progress) {
[dock_tile display];
}
void NativeWindowMac::SetOverlayIcon(const gfx::Image& overlay,
const std::string& description) {
}
void NativeWindowMac::ShowDefinitionForSelection() {
content::WebContents* web_contents = GetWebContents();
if (!web_contents)
@@ -656,10 +699,28 @@ void NativeWindowMac::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 {
if (!draggable_region_)
return false;
NSView* webView = GetWebContents()->GetNativeView();
content::WebContents* web_contents = GetWebContents();
if (!web_contents)
return false;
NSView* webView = web_contents->GetNativeView();
NSInteger webViewHeight = NSHeight([webView bounds]);
// |draggable_region_| is stored in local platform-indepdent coordiate system
// while |point| is in local Cocoa coordinate system. Do the conversion
@@ -672,7 +733,6 @@ void NativeWindowMac::HandleMouseEvent(NSEvent* event) {
NSRect mouseRect = [window_ convertRectToScreen:NSMakeRect(eventLoc.x, eventLoc.y, 0, 0)];
NSPoint current_mouse_location = mouseRect.origin;
if ([event type] == NSLeftMouseDown) {
NSPoint frame_origin = [window_ frame].origin;
last_mouse_offset_ = NSMakePoint(
@@ -691,8 +751,7 @@ void NativeWindowMac::UpdateDraggableRegions(
if (has_frame_)
return;
UpdateDraggableRegionsForCustomDrag(regions);
InstallDraggableRegionViews();
draggable_region_.reset(DraggableRegionsToSkRegion(regions));
}
void NativeWindowMac::HandleKeyboardEvent(
@@ -702,7 +761,7 @@ void NativeWindowMac::HandleKeyboardEvent(
event.type == content::NativeWebKeyboardEvent::Char)
return;
if (event.os_event.window == window_) {
if (event.os_event.window == window_.get()) {
EventProcessingWindow* event_window =
static_cast<EventProcessingWindow*>(window_);
DCHECK([event_window isKindOfClass:[EventProcessingWindow class]]);
@@ -749,11 +808,16 @@ void NativeWindowMac::InstallView() {
}
ClipWebView();
InstallDraggableRegionView();
[[window_ standardWindowButton:NSWindowZoomButton] setHidden:YES];
[[window_ standardWindowButton:NSWindowMiniaturizeButton] setHidden:YES];
[[window_ standardWindowButton:NSWindowCloseButton] setHidden:YES];
[[window_ standardWindowButton:NSWindowFullScreenButton] setHidden:YES];
// Some third-party OS X utilities check the zoom button's enabled state to
// determine whether to show custom UI on hover, so we disable it here to
// prevent them from doing so in a frameless app window.
[[window_ standardWindowButton:NSWindowZoomButton] setEnabled:NO];
}
}
@@ -763,70 +827,22 @@ void NativeWindowMac::UninstallView() {
}
void NativeWindowMac::ClipWebView() {
NSView* view = GetWebContents()->GetNativeView();
view.layer.masksToBounds = YES;
view.layer.cornerRadius = kAtomWindowCornerRadius;
content::WebContents* web_contents = GetWebContents();
if (!web_contents)
return;
NSView* webView = web_contents->GetNativeView();
webView.layer.masksToBounds = YES;
webView.layer.cornerRadius = kAtomWindowCornerRadius;
}
void NativeWindowMac::InstallDraggableRegionViews() {
DCHECK(!has_frame_);
// All ControlRegionViews should be added as children of the WebContentsView,
// because WebContentsView will be removed and re-added when entering and
// leaving fullscreen mode.
void NativeWindowMac::InstallDraggableRegionView() {
NSView* webView = GetWebContents()->GetNativeView();
NSInteger webViewHeight = NSHeight([webView bounds]);
// Remove all ControlRegionViews that are added last time.
// Note that [webView subviews] returns the view's mutable internal array and
// it should be copied to avoid mutating the original array while enumerating
// it.
base::scoped_nsobject<NSArray> subviews([[webView subviews] copy]);
for (NSView* subview in subviews.get())
if ([subview isKindOfClass:[ControlRegionView class]])
[subview removeFromSuperview];
// Create and add ControlRegionView for each region that needs to be excluded
// from the dragging.
for (std::vector<gfx::Rect>::const_iterator iter =
system_drag_exclude_areas_.begin();
iter != system_drag_exclude_areas_.end();
++iter) {
base::scoped_nsobject<NSView> controlRegion(
[[ControlRegionView alloc] initWithShellWindow:this]);
[controlRegion setFrame:NSMakeRect(iter->x(),
webViewHeight - iter->bottom(),
iter->width(),
iter->height())];
[webView addSubview:controlRegion];
}
}
void NativeWindowMac::UpdateDraggableRegionsForCustomDrag(
const std::vector<DraggableRegion>& regions) {
// We still need one ControlRegionView to cover the whole window such that
// mouse events could be captured.
NSView* web_view = GetWebContents()->GetNativeView();
gfx::Rect window_bounds(
0, 0, NSWidth([web_view bounds]), NSHeight([web_view bounds]));
system_drag_exclude_areas_.clear();
system_drag_exclude_areas_.push_back(window_bounds);
// Aggregate the draggable areas and non-draggable areas such that hit test
// could be performed easily.
SkRegion* draggable_region = new SkRegion;
for (std::vector<DraggableRegion>::const_iterator iter = regions.begin();
iter != regions.end();
++iter) {
const DraggableRegion& region = *iter;
draggable_region->op(
region.bounds.x(),
region.bounds.y(),
region.bounds.right(),
region.bounds.bottom(),
region.draggable ? SkRegion::kUnion_Op : SkRegion::kDifference_Op);
}
draggable_region_.reset(draggable_region);
base::scoped_nsobject<NSView> controlRegion(
[[ControlRegionView alloc] initWithShellWindow:this]);
[controlRegion setFrame:NSMakeRect(0, 0,
NSWidth([webView bounds]),
NSHeight([webView bounds]))];
[webView addSubview:controlRegion];
}
// static

View File

@@ -50,6 +50,9 @@ class NativeWindowObserver {
virtual void OnWindowEnterFullScreen() {}
virtual void OnWindowLeaveFullScreen() {}
// Called when devtools window gets focused.
virtual void OnDevToolsFocus() {}
// Called when renderer is hung.
virtual void OnRendererUnresponsive() {}

View File

@@ -22,12 +22,14 @@
#include "ui/aura/window.h"
#include "ui/aura/window_tree_host.h"
#include "ui/base/hit_test.h"
#include "ui/gfx/image/image.h"
#include "ui/views/background.h"
#include "ui/views/controls/webview/unhandled_keyboard_event_handler.h"
#include "ui/views/controls/webview/webview.h"
#include "ui/views/window/client_view.h"
#include "ui/views/widget/native_widget_private.h"
#include "ui/views/widget/widget.h"
#include "ui/wm/core/shadow_types.h"
#if defined(USE_X11)
#include "atom/browser/browser.h"
@@ -50,6 +52,7 @@
#include "base/win/scoped_comptr.h"
#include "base/win/windows_version.h"
#include "ui/base/win/shell.h"
#include "ui/gfx/icon_util.h"
#include "ui/gfx/win/dpi.h"
#include "ui/views/win/hwnd_util.h"
#endif
@@ -128,7 +131,7 @@ class NativeWindowClientView : public views::ClientView {
}
virtual ~NativeWindowClientView() {}
virtual bool CanClose() OVERRIDE {
bool CanClose() override {
static_cast<NativeWindowViews*>(contents_view())->CloseWebContents();
return false;
}
@@ -183,6 +186,9 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
params.type = views::Widget::InitParams::TYPE_WINDOW;
params.remove_standard_frame = !has_frame_;
if (transparent_)
params.opacity = views::Widget::InitParams::TRANSLUCENT_WINDOW;
#if defined(USE_X11)
std::string name = Browser::Get()->GetName();
// Set WM_WINDOW_ROLE.
@@ -219,6 +225,11 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
ui::SetAtomArrayProperty(GetAcceleratedWidget(), "_NET_WM_STATE", "ATOM",
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
// Add web view.
@@ -237,8 +248,18 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
// frameless.
DWORD frame_style = WS_THICKFRAME | WS_MINIMIZEBOX | WS_MAXIMIZEBOX |
WS_CAPTION;
// We should not show a frame for transparent window.
if (transparent_)
frame_style &= ~(WS_THICKFRAME | WS_CAPTION);
::SetWindowLong(GetAcceleratedWidget(), GWL_STYLE, frame_style);
}
if (transparent_) {
// Transparent window on Windows has to have WS_EX_COMPOSITED style.
LONG ex_style = ::GetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE);
ex_style |= WS_EX_COMPOSITED;
::SetWindowLong(GetAcceleratedWidget(), GWL_EXSTYLE, ex_style);
}
#endif
// TODO(zcbenz): This was used to force using native frame on Windows 2003, we
@@ -248,6 +269,11 @@ NativeWindowViews::NativeWindowViews(content::WebContents* web_contents,
window_->FrameTypeChanged();
}
// The given window is most likely not rectangular since it uses
// transparency and has no standard frame, don't show a shadow for it.
if (transparent_ && !has_frame_)
wm::SetShadowType(GetNativeWindow(), wm::SHADOW_TYPE_NONE);
window_->UpdateWindowIcon();
window_->CenterWindow(bounds.size());
Layout();
@@ -281,7 +307,7 @@ bool NativeWindowViews::IsFocused() {
}
void NativeWindowViews::Show() {
window_->Show();
window_->native_widget_private()->ShowWithWindowState(GetRestoredState());
}
void NativeWindowViews::ShowInactive() {
@@ -594,6 +620,28 @@ void NativeWindowViews::SetProgressBar(double progress) {
#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) {
menu_bar_autohide_ = auto_hide;
}
@@ -626,6 +674,23 @@ bool NativeWindowViews::IsMenuBarVisible() {
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() {
return GetNativeWindow()->GetHost()->GetAcceleratedWidget();
}
@@ -879,6 +944,15 @@ gfx::Rect NativeWindowViews::ContentBoundsToWindowBounds(
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
NativeWindow* NativeWindow::Create(content::WebContents* web_contents,
const mate::Dictionary& options) {

View File

@@ -73,11 +73,15 @@ class NativeWindowViews : public NativeWindow,
bool IsKiosk() override;
void SetMenu(ui::MenuModel* menu_model) override;
gfx::NativeWindow GetNativeWindow() override;
void SetOverlayIcon(const gfx::Image& overlay,
const std::string& description) override;
void SetProgressBar(double value) override;
void SetAutoHideMenuBar(bool auto_hide) override;
bool IsMenuBarAutoHide() override;
void SetMenuBarVisibility(bool visible) override;
bool IsMenuBarVisible() override;
void SetVisibleOnAllWorkspaces(bool visible) override;
bool IsVisibleOnAllWorkspaces() override;
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.
gfx::Rect ContentBoundsToWindowBounds(const gfx::Rect& content_bounds);
// Returns the restore state for the window.
ui::WindowShowState GetRestoredState();
scoped_ptr<views::Widget> window_;
views::View* web_view_; // Managed by inspectable_web_contents_.

View File

@@ -6,6 +6,9 @@
#include "base/threading/sequenced_worker_pool.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 "net/base/net_errors.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();
}
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));
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(),
network_delegate(),
path,
content::BrowserThread::GetBlockingPool()->
GetTaskRunnerWithShutdownBehavior(
base::SequencedWorkerPool::SKIP_ON_SHUTDOWN));

View File

@@ -10,6 +10,7 @@
#include "base/memory/weak_ptr.h"
#include "net/url_request/url_request_job.h"
#include "net/url_request/url_request_job_factory.h"
#include "v8/include/v8.h"
namespace base {
class FilePath;
@@ -28,16 +29,16 @@ class AdapterRequestJob : public net::URLRequestJob {
public:
// net::URLRequestJob:
virtual void Start() OVERRIDE;
virtual void Kill() OVERRIDE;
virtual bool ReadRawData(net::IOBuffer* buf,
int buf_size,
int *bytes_read) OVERRIDE;
virtual bool IsRedirectResponse(GURL* location,
int* http_status_code) OVERRIDE;
virtual net::Filter* SetupFilter() const OVERRIDE;
virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
virtual bool GetCharset(std::string* charset) OVERRIDE;
void Start() override;
void Kill() override;
bool ReadRawData(net::IOBuffer* buf,
int buf_size,
int *bytes_read) override;
bool IsRedirectResponse(GURL* location,
int* http_status_code) override;
net::Filter* SetupFilter() const override;
bool GetMimeType(std::string* mime_type) const override;
bool GetCharset(std::string* charset) override;
base::WeakPtr<AdapterRequestJob> GetWeakPtr();
@@ -50,6 +51,9 @@ class AdapterRequestJob : public net::URLRequestJob {
void CreateStringJobAndStart(const std::string& mime_type,
const std::string& charset,
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 CreateJobFromProtocolHandlerAndStart();

View File

@@ -6,6 +6,7 @@
#include "atom/browser/net/asar/url_request_asar_job.h"
#include "atom/common/asar/archive.h"
#include "atom/common/asar/asar_util.h"
#include "net/base/filename_util.h"
#include "net/base/net_errors.h"
#include "net/url_request/url_request_error_job.h"
@@ -13,35 +14,36 @@
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.
bool GetAsarPath(const base::FilePath& full_path,
base::FilePath* asar_path,
base::FilePath* relative_path) {
base::FilePath iter = full_path;
while (true) {
base::FilePath dirname = iter.DirName();
if (iter.MatchesExtension(kAsarExtension))
break;
else if (iter == dirname)
return false;
iter = dirname;
if (file_info.unpacked) {
base::FilePath real_path;
archive->CopyFileOut(relative_path, &real_path);
return new net::URLRequestFileJob(request, network_delegate, real_path,
file_task_runner);
}
base::FilePath tail;
if (!iter.AppendRelativePath(full_path, &tail))
return false;
*asar_path = iter;
*relative_path = tail;
return true;
return new URLRequestAsarJob(request, network_delegate, archive,
relative_path, file_info, file_task_runner);
}
} // namespace
AsarProtocolHandler::AsarProtocolHandler(
const scoped_refptr<base::TaskRunner>& file_task_runner)
: file_task_runner_(file_task_runner) {}
@@ -49,39 +51,13 @@ 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::URLRequest* request,
net::NetworkDelegate* network_delegate) const {
base::FilePath full_path;
net::FileURLToFilePath(request->url(), &full_path);
// Create asar:// job when the path contains "xxx.asar/", otherwise treat the
// 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_);
return CreateJobFromPath(full_path, request, network_delegate,
file_task_runner_);
}
bool AsarProtocolHandler::IsSafeRedirectTarget(const GURL& location) const {

View File

@@ -5,8 +5,6 @@
#ifndef 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 "net/url_request/url_request_job_factory.h"
@@ -16,27 +14,21 @@ class TaskRunner;
namespace asar {
class Archive;
class AsarProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler {
public:
explicit AsarProtocolHandler(
const scoped_refptr<base::TaskRunner>& file_task_runner);
virtual ~AsarProtocolHandler();
Archive* GetOrCreateAsarArchive(const base::FilePath& path) const;
// net::URLRequestJobFactory::ProtocolHandler:
virtual net::URLRequestJob* MaybeCreateJob(
net::URLRequestJob* MaybeCreateJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const OVERRIDE;
virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE;
net::NetworkDelegate* network_delegate) const override;
bool IsSafeRedirectTarget(const GURL& location) const override;
private:
const scoped_refptr<base::TaskRunner> file_task_runner_;
mutable base::ScopedPtrHashMap<base::FilePath, Archive> archives_;
DISALLOW_COPY_AND_ASSIGN(AsarProtocolHandler);
};

View File

@@ -17,12 +17,14 @@ namespace asar {
URLRequestAsarJob::URLRequestAsarJob(
net::URLRequest* request,
net::NetworkDelegate* network_delegate,
Archive* archive,
std::shared_ptr<Archive> archive,
const base::FilePath& file_path,
const Archive::FileInfo& file_info,
const scoped_refptr<base::TaskRunner>& file_task_runner)
: net::URLRequestJob(request, network_delegate),
archive_(archive),
file_path_(file_path),
file_info_(file_info),
stream_(new net::FileStream(file_task_runner)),
remaining_bytes_(0),
file_task_runner_(file_task_runner),
@@ -31,12 +33,6 @@ URLRequestAsarJob::URLRequestAsarJob(
URLRequestAsarJob::~URLRequestAsarJob() {}
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);
int flags = base::File::FLAG_OPEN |

View File

@@ -5,6 +5,7 @@
#ifndef ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_
#define ATOM_BROWSER_NET_ASAR_URL_REQUEST_ASAR_JOB_H_
#include <memory>
#include <string>
#include "atom/common/asar/archive.h"
@@ -23,21 +24,29 @@ class FileStream;
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 {
public:
URLRequestAsarJob(net::URLRequest* request,
net::NetworkDelegate* network_delegate,
Archive* archive,
std::shared_ptr<Archive> archive,
const base::FilePath& file_path,
const Archive::FileInfo& file_info,
const scoped_refptr<base::TaskRunner>& file_task_runner);
// net::URLRequestJob:
virtual void Start() OVERRIDE;
virtual void Kill() OVERRIDE;
virtual bool ReadRawData(net::IOBuffer* buf,
int buf_size,
int* bytes_read) OVERRIDE;
virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
void Start() override;
void Kill() override;
bool ReadRawData(net::IOBuffer* buf,
int buf_size,
int* bytes_read) override;
bool GetMimeType(std::string* mime_type) const override;
protected:
virtual ~URLRequestAsarJob();
@@ -53,9 +62,9 @@ class URLRequestAsarJob : public net::URLRequestJob {
// Callback after data is asynchronously read from the file into |buf|.
void DidRead(scoped_refptr<net::IOBuffer> buf, int result);
Archive* archive_;
Archive::FileInfo file_info_;
std::shared_ptr<Archive> archive_;
base::FilePath file_path_;
Archive::FileInfo file_info_;
scoped_ptr<net::FileStream> stream_;
int64 remaining_bytes_;

View File

@@ -50,7 +50,7 @@ ProtocolHandler* AtomURLRequestJobFactory::ReplaceProtocol(
base::AutoLock locked(lock_);
if (!ContainsKey(protocol_handler_map_, scheme))
return NULL;
return nullptr;
ProtocolHandler* original_protocol_handler = protocol_handler_map_[scheme];
protocol_handler_map_[scheme] = protocol_handler;
return original_protocol_handler;
@@ -63,7 +63,7 @@ ProtocolHandler* AtomURLRequestJobFactory::GetProtocolHandler(
base::AutoLock locked(lock_);
ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
if (it == protocol_handler_map_.end())
return NULL;
return nullptr;
return it->second;
}
@@ -82,10 +82,23 @@ net::URLRequestJob* AtomURLRequestJobFactory::MaybeCreateJobWithProtocolHandler(
base::AutoLock locked(lock_);
ProtocolHandlerMap::const_iterator it = protocol_handler_map_.find(scheme);
if (it == protocol_handler_map_.end())
return NULL;
return nullptr;
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(
const std::string& scheme) const {
DCHECK(CalledOnValidThread());

View File

@@ -40,13 +40,20 @@ class AtomURLRequestJobFactory : public net::URLRequestJobFactory {
bool HasProtocolHandler(const std::string& scheme) const;
// URLRequestJobFactory implementation
virtual net::URLRequestJob* MaybeCreateJobWithProtocolHandler(
net::URLRequestJob* MaybeCreateJobWithProtocolHandler(
const std::string& scheme,
net::URLRequest* request,
net::NetworkDelegate* network_delegate) const OVERRIDE;
virtual bool IsHandledProtocol(const std::string& scheme) const OVERRIDE;
virtual bool IsHandledURL(const GURL& url) const OVERRIDE;
virtual bool IsSafeRedirectTarget(const GURL& location) const OVERRIDE;
net::NetworkDelegate* network_delegate) const override;
net::URLRequestJob* MaybeInterceptRedirect(
net::URLRequest* request,
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:
typedef std::map<std::string, ProtocolHandler*> ProtocolHandlerMap;

View 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

View 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_

View File

@@ -20,10 +20,10 @@ class URLRequestStringJob : public net::URLRequestSimpleJob {
const std::string& data);
// URLRequestSimpleJob:
virtual int GetData(std::string* mime_type,
std::string* charset,
std::string* data,
const net::CompletionCallback& callback) const OVERRIDE;
int GetData(std::string* mime_type,
std::string* charset,
std::string* data,
const net::CompletionCallback& callback) const override;
private:
std::string mime_type_;

View File

@@ -126,7 +126,7 @@ void NodeDebugger::SendConnectMessage() {
"Protocol-Version: 1\r\n"
"Embedding-Host: %s\r\n"
"%s: 0\r\n",
v8::V8::GetVersion(), "Atom-Shell", kContentLength), true);
v8::V8::GetVersion(), ATOM_PRODUCT_NAME, kContentLength), true);
}
// static

View File

@@ -33,12 +33,12 @@ class NodeDebugger : public net::StreamListenSocket::Delegate {
static void DebugMessageHandler(const v8::Debug::Message& message);
// net::StreamListenSocket::Delegate:
virtual void DidAccept(net::StreamListenSocket* server,
scoped_ptr<net::StreamListenSocket> socket) OVERRIDE;
virtual void DidRead(net::StreamListenSocket* socket,
const char* data,
int len) OVERRIDE;
virtual void DidClose(net::StreamListenSocket* socket) OVERRIDE;
void DidAccept(net::StreamListenSocket* server,
scoped_ptr<net::StreamListenSocket> socket) override;
void DidRead(net::StreamListenSocket* socket,
const char* data,
int len) override;
void DidClose(net::StreamListenSocket* socket) override;
v8::Isolate* isolate_;

View File

@@ -7,7 +7,7 @@
<key>CFBundleExecutable</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.github.atom-shell</string>
<string>${ATOM_BUNDLE_ID}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
@@ -17,7 +17,7 @@
<key>CFBundleIconFile</key>
<string>atom.icns</string>
<key>CFBundleVersion</key>
<string>0.20.5</string>
<string>0.24.0</string>
<key>LSMinimumSystemVersion</key>
<string>10.8.0</string>
<key>NSMainNibFile</key>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 345 KiB

After

Width:  |  Height:  |  Size: 76 KiB

View File

@@ -7,7 +7,7 @@
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
#include "windows.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
@@ -31,7 +31,7 @@ END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"#include ""windows.h""\r\n"
"\0"
END
@@ -50,8 +50,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,20,5,0
PRODUCTVERSION 0,20,5,0
FILEVERSION 0,24,0,0
PRODUCTVERSION 0,24,0,0
FILEFLAGSMASK 0x3fL
#ifdef _DEBUG
FILEFLAGS 0x1L
@@ -67,13 +67,13 @@ BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "GitHub, Inc."
VALUE "FileDescription", "Atom-Shell"
VALUE "FileVersion", "0.20.5"
VALUE "InternalName", "atom.exe"
VALUE "LegalCopyright", "Copyright (C) 2013 GitHub, Inc. All rights reserved."
VALUE "OriginalFilename", "atom.exe"
VALUE "ProductName", "Atom-Shell"
VALUE "ProductVersion", "0.20.5"
VALUE "FileDescription", "Electron"
VALUE "FileVersion", "0.24.0"
VALUE "InternalName", "electron.exe"
VALUE "LegalCopyright", "Copyright (C) 2015 GitHub, Inc. All rights reserved."
VALUE "OriginalFilename", "electron.exe"
VALUE "ProductName", "Electron"
VALUE "ProductVersion", "0.24.0"
VALUE "SquirrelAwareVersion", "1"
END
END

View File

@@ -121,6 +121,9 @@ bool StringToAccelerator(const std::string& description,
modifiers |= ui::EF_ALT_DOWN;
} else if (tokens[i] == "shift") {
modifiers |= ui::EF_SHIFT_DOWN;
} else if (tokens[i] == "plus") {
modifiers |= ui::EF_SHIFT_DOWN;
key = ui::VKEY_OEM_PLUS;
} else if (tokens[i] == "tab") {
key = ui::VKEY_TAB;
} else if (tokens[i] == "space") {

View File

@@ -16,7 +16,7 @@
#include "atom/browser/native_window.h"
#include "base/callback.h"
#include "base/file_util.h"
#include "base/files/file_util.h"
#include "base/strings/string_util.h"
#include "chrome/browser/ui/libgtk2ui/gtk2_signal.h"
#include "ui/aura/window.h"

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