Compare commits

..

738 Commits

Author SHA1 Message Date
Cheng Zhao
86ffbe16fb Bump v0.35.6 2016-01-11 04:51:03 +00:00
Robo
25aaafde45 fix chrome app and user path conflicts 2016-01-11 10:21:38 +08:00
Cheng Zhao
61e990e8cd Bump v0.35.5 2015-12-31 10:07:01 +08:00
Tyler Gibson
fb143a5dab Adding check for Windows version and alternate flags for Windows Vista/7 2015-12-31 10:06:50 +08:00
Cheng Zhao
e1d7ef7e24 Bump v0.35.4 2015-12-04 19:23:48 +08:00
Cheng Zhao
d14f15c33a Update native_mate: isDestroy => isDestroyed 2015-12-04 19:23:30 +08:00
Cheng Zhao
af2eee603c Merge pull request #3690 from leftstick/master
add translation of using-native-node-modules for ZH-CN
2015-12-04 18:46:56 +08:00
Cheng Zhao
427a2642a9 Merge pull request #3688 from preco21/master
Update as upstream
2015-12-04 18:46:33 +08:00
Cheng Zhao
c8e2be7b28 Bump v0.35.3 2015-12-04 16:43:23 +08:00
Howard.Zuo
c4f2d946e1 add translation of using-native-node-modules for ZH-CN 2015-12-04 15:18:55 +08:00
Cheng Zhao
ec541b2a18 Merge pull request #3686 from atom/fix-flaky-tests
Fix a few flaky tests
2015-12-04 13:53:07 +08:00
Cheng Zhao
7c1ea0b0f4 spec: Suppress flaky tests on Travis 2015-12-04 13:17:36 +08:00
Plusb Preco
0bcc23d8fe Update as upstream
[ci skip]
2015-12-04 13:52:03 +09:00
Plusb Preco
01f9107f00 Update as upstream
[ci skip]
2015-12-04 13:48:38 +09:00
Plusb Preco
4a2bfa0b06 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-12-04 13:38:21 +09:00
Cheng Zhao
1cb35cd172 Merge pull request #3664 from clevertonh/master
Add electron-br
2015-12-04 12:10:00 +08:00
Cheng Zhao
13c737823b spec: Suppress execFileSync test
It somehow makes the test flaky after refresh.
2015-12-04 11:52:34 +08:00
Cheng Zhao
5e5ae81c53 'key of' is better than Object.keys 2015-12-04 11:40:35 +08:00
Cheng Zhao
973ae06f21 Destroy the native window in next tick
It fixes a possible crash when native code is iterating all windows
while the JavaScript code decides to destroy a window.
2015-12-04 11:35:04 +08:00
Cheng Zhao
2c6d232254 Don't add too much listeners in BrowserWindowProxy 2015-12-04 11:12:36 +08:00
Cheng Zhao
504d3d3088 Merge pull request #3670 from mixmaxhq/jeff/fix_window_open
Fix `window.open` not respecting the features string
2015-12-04 10:55:51 +08:00
Cheng Zhao
f6dbc3001e Merge pull request #3683 from zeke/coc
add Contributor Covenant 1.3 code of conduct
2015-12-04 10:52:44 +08:00
Cheng Zhao
afa8f8b166 Merge pull request #3672 from CharlieHess/web-contents-download-url
DownloadURL from webContents
2015-12-04 10:52:11 +08:00
Plusb Preco
06a9ad3984 Add contributing guide
[ci skip]
2015-12-04 10:06:37 +09:00
Zeke Sikelianos
53350d26ae add placeholder CoC content to Korean README 2015-12-03 18:08:10 -06:00
Zeke Sikelianos
7951226f5c link to CoC from README and CONTRIBUTING 2015-12-03 18:06:58 -06:00
Zeke Sikelianos
149859c97b add CODE_OF_CONDUCT.md 2015-12-03 18:06:18 -06:00
Plusb Preco
d583cf7d8c Update as upstream
[ci skip]
2015-12-04 07:54:09 +09:00
Jessica Lord
37bcdfdd45 Merge pull request #3680 from atom/newline-before-code-block
Add newline before example code block
2015-12-03 12:16:32 -08:00
Charlie Hess
c412b9b892 Revert accidental change to this submodule. 2015-12-03 12:14:08 -08:00
Charlie Hess
f2797d2eab Merge commit '58567834c7cb9c290ef48c9e8f54ae37246ef665' into web-contents-download-url
Conflicts:
	atom/browser/api/atom_api_web_contents.cc
2015-12-03 10:31:51 -08:00
Kevin Sawicki
dec714bda4 Add newline before example code block 2015-12-03 08:40:47 -08:00
Cheng Zhao
58567834c7 Merge pull request #3663 from preco21/master
Update as upstream
2015-12-03 21:44:54 +08:00
Cheng Zhao
f3645c6661 Merge pull request #3676 from atom/callback-race-condition
Make sure V8 handles are deleted on UI thread
2015-12-03 18:06:34 +08:00
Cheng Zhao
48a11bd237 Weak map only needs to be deleted for once 2015-12-03 17:10:14 +08:00
Cheng Zhao
eb8426269f Remove itself from the cleanup list when it is destroyed 2015-12-03 17:04:40 +08:00
Cheng Zhao
1e7c8c9fda It is fine to leak a V8 handle on exit 2015-12-03 16:33:57 +08:00
Cheng Zhao
117b7462de window.id is no longer available when window is closed 2015-12-03 16:17:10 +08:00
Cheng Zhao
a15f9fab5b Use BuildPrototype to build prototype
This saves the step of manually keeping the global template object,
which is easy to forget then leak.
2015-12-03 16:04:46 +08:00
Cheng Zhao
6795bd1d96 Do not manually manage native resources
We should rely on the destructor to cleanup everything, instead of
putting them in the Destroy method.
2015-12-03 15:38:43 +08:00
Cheng Zhao
e5358d405a Make sure V8 Function passed to native code are destroyed on UI thread 2015-12-03 11:24:33 +08:00
Charlie Hess
b1391270ed This spec is a little unreliable; up the timeout. 2015-12-02 18:40:57 -08:00
Charlie Hess
b369d4991e Write a spec for downloading from the webview tag. 2015-12-02 18:40:39 -08:00
Charlie Hess
0d30a8d70c Make downloadURL available on the webview tag. 2015-12-02 18:40:02 -08:00
Charlie Hess
5839df66e4 Document the new method. 2015-12-02 13:49:42 -08:00
Charlie Hess
c311c6cf1b Add a DownloadURL method on WebContents. 2015-12-02 13:49:30 -08:00
Jeff Wear
225fe72d03 Ensure that window.open does not override the child options
Fixes https://github.com/atom/electron/issues/3652.
2015-12-02 12:00:51 -08:00
Jeff Wear
32e949efed Read window size properly in window.open test
`BrowserWindow#getSize` returns `[width, height]`, not `{width, height}`.
2015-12-02 11:50:44 -08:00
Cléverton Heming
0553b9c672 Add electron-br 2015-12-02 15:27:23 +00:00
Plusb Preco
75c28ff993 Update as upstream 2015-12-03 00:21:34 +09:00
Plusb Preco
cc841242b5 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-12-03 00:21:28 +09:00
Cheng Zhao
4252c17db0 Merge pull request #3660 from atom/tray-custom-menu
Add `menu` parameter for Tray.popUpContextMenu
2015-12-02 20:55:02 +08:00
Cheng Zhao
47b74ff820 Merge pull request #3659 from lukeapage/patch-1
Update debugging-main-process.md
2015-12-02 19:59:43 +08:00
Cheng Zhao
615ce45849 win: Implement menu parameter 2015-12-02 19:58:10 +08:00
Cheng Zhao
3cdd0f35c7 mac: Implement menu parameter 2015-12-02 19:05:22 +08:00
Cheng Zhao
2fba05b5e7 Add menu parameter for Tray.popUpContextMenu 2015-12-02 18:43:11 +08:00
Luke Page
9567599698 Update debugging-main-process.md 2015-12-02 10:23:21 +00:00
Cheng Zhao
202475f5a9 Deprecating a property with method of same name causes trouble
Close #3511.
2015-12-02 17:29:58 +08:00
Cheng Zhao
c493bec089 Make sure temp file will be cleaned up when base::Move fails 2015-12-02 11:36:29 +08:00
Cheng Zhao
c3645e3f95 Don't call Move if there is no need to move 2015-12-02 11:07:48 +08:00
Cheng Zhao
c691094aa1 spec: Fix failing tests on win32 2015-12-02 11:00:28 +08:00
Cheng Zhao
0d50e08ed1 Merge pull request #3648 from jviotti/jviotti/fix/exec-file-asar-bat
🏁 Preserve file extension when extracting from asar
2015-12-02 10:45:24 +08:00
Cheng Zhao
17f4bf2ce8 Merge pull request #3650 from arturts/patch-5
📝 [ci skip] Update to match english docs, fix typos
2015-12-02 10:21:10 +08:00
Cheng Zhao
8122d63cd2 Merge pull request #3649 from arturts/pt-BR-auto-updater
📝 [ci skip] Add translation to auto-updater, change links
2015-12-02 10:20:58 +08:00
Artur de Oliveira Tsuda
5cae8397cc 📝 [ci skip] fix more typos 2015-12-01 21:57:07 -02:00
Artur de Oliveira Tsuda
9a93ecc3cf 📝 [ci skip] fix typos 2015-12-01 21:46:13 -02:00
Artur de Oliveira Tsuda
d76e21853b Change header 2015-12-01 21:38:25 -02:00
Artur de Oliveira Tsuda
229dc02a41 📝 [ci skip] Update to match english docs, fix typos 2015-12-01 21:34:35 -02:00
Artur de Oliveira Tsuda
1b1c4bec4e 📝 [ci skip] Add translation to auto-updater, change links 2015-12-01 21:09:20 -02:00
Juan Cruz Viotti
a99c193cf2 🏁 Preserve file extension when extracting from asar
Currently, when calling `copyFileOut`, the original extension from the
file is lost, and a generic `*.tmp` is added instead.

This becomes problematic in the scenario where we use
`child_process.execFile` on a Windows Batch script that lives inside the
`asar` package.

Windows relies on the extension being present in order to interpret the
script accordingly, which results in the following bug because the
operating system doesn't know what do to with this `*.tmp` file:

```
Error: spawn UNKNOWN
```

Steps to reproduce:

1. Create a dummy batch script (test.bat):

```
@echo off
echo "Hello world"
```

2. Create an electron app that attemps to call this script with
`child_process.execFile`:

```js
var child_process = require('child_process');
var path = require('path');

child_process.execFile(path.join(__dirname, 'test.bat'), function(error, stdout) {
    if (error) throw error;
    console.log(stdout);
});
```

3. Package this small application as an asar archive:

```sh
> asar pack mytestapp app.asar
```

4. Execute the application:

```sh
> electron.exe app.asar
```
2015-12-01 14:55:58 -04:00
Cheng Zhao
85b7aa6933 Merge pull request #3645 from atom/fix-page-title-set
Delay the page-title-updated event to next tick
2015-12-01 19:12:34 +08:00
Cheng Zhao
e5974e44ed Deprecate the page-title-set event
We have two names for the same event, page-title-updated wins.
2015-12-01 18:50:56 +08:00
Cheng Zhao
c95117fb22 Delay the page-title-set event to next tick 2015-12-01 18:34:58 +08:00
Cheng Zhao
83ee78451a Emit event when title becomes empty 2015-12-01 17:53:13 +08:00
Cheng Zhao
8d20dda6d7 No need to override TitleWasSet in NativeWindow 2015-12-01 17:51:09 +08:00
Cheng Zhao
782af41c7c Merge pull request #3643 from atom/fix-did-fail-load-crash
Delay the did-fail-provisional-load event to next tick
2015-12-01 17:19:52 +08:00
Cheng Zhao
1b3eb1cc5d Delay the did-fail-provisional-load event to next tick
Chrome is doing some stuff after the DidFailProvisionalLoad event, if we
call LoadURL at this time crash would happen.
2015-12-01 17:00:42 +08:00
Cheng Zhao
0f17a0163d Put common constants in atom_constants 2015-12-01 16:21:15 +08:00
Cheng Zhao
a2f1390b0d Merge pull request #3641 from atom/process-no-asar
Add process.noAsar to toggle asar support
2015-12-01 14:40:37 +08:00
Cheng Zhao
165b464a15 docs: process.noAsar 2015-12-01 13:43:52 +08:00
Cheng Zhao
900dc78a47 spec: process.noAsar 2015-12-01 13:09:50 +08:00
Cheng Zhao
e3ec1fe8ab Add process.noAsar to turn off asar support 2015-12-01 13:09:37 +08:00
Cheng Zhao
757b644909 Merge pull request #3567 from atom/cors
Enable all origins via CORS header for custom schemes
2015-12-01 12:43:38 +08:00
Paul Betts
7fd1db192b Lint harder 2015-11-30 18:12:00 -08:00
Cheng Zhao
bd5d52f825 Merge pull request #3638 from arturts/pt-br-translation
📝 [ci skip] Add translation to app.md
2015-12-01 10:06:55 +08:00
Cheng Zhao
dd0b2bc8d5 Merge pull request #3636 from arturts/patch-4
📝 [ci skip] Update to match english docs.
2015-12-01 10:06:38 +08:00
Cheng Zhao
290c0c37f4 Merge pull request #3635 from arturts/patch-3
📝 [ci skip] Fix typos
2015-12-01 10:06:13 +08:00
Artur de Oliveira Tsuda
7da78a9fa8 📝 [ci skip] Add translation to app.md 2015-11-30 21:56:19 -02:00
Artur de Oliveira Tsuda
97f535251b 📝 [ci skip] Update to match english docs. 2015-11-30 19:43:19 -02:00
Artur de Oliveira Tsuda
c83976dfdc 📝 [ci skip] Fix typos 2015-11-30 19:14:33 -02:00
Paul Betts
549da7fd91 Linting 2015-11-30 11:10:18 -08:00
Paul Betts
15b8d7680e Add tests to verify behavior 2015-11-30 11:08:45 -08:00
Paul Betts
7cce3987eb Add CORS header to file jobs 2015-11-30 11:08:45 -08:00
Paul Betts
65cb1488b0 Fix CORS header code to be cleaner 2015-11-30 11:08:44 -08:00
Paul Betts
7622bb40a9 Enable all origins via CORS header for custom schemes
This PR disables CORS for custom schemes, which allows you to serve Font
resources from custom schemes after using registerCustomSchemeAsSecure
2015-11-30 11:08:43 -08:00
Cheng Zhao
f931e165d5 Merge pull request #3634 from atom/fix-crash-on-exit
Delete BridgeTaskRunner when main message loop is ready
2015-11-30 22:40:48 +08:00
Cheng Zhao
44e24ebf7a Delete BridgeTaskRunner when main message loop is ready 2015-11-30 22:29:01 +08:00
Cheng Zhao
a7dd6596f1 Merge pull request #3628 from lovemyliwu/patch-1
🎨 add miss charactor
2015-11-30 18:26:04 +08:00
Smite Chow
4d5028fb4c 🎨 add miss charactor 2015-11-30 17:16:35 +08:00
Plusb Preco
9fa6527460 Update as upstream 2015-11-30 17:24:43 +09:00
Cheng Zhao
dbdfac1133 Merge pull request #3626 from arturts/patch-2
Update 'Estilo de código' link.
2015-11-30 16:01:05 +08:00
Cheng Zhao
b9c6f719f3 Merge pull request #3625 from arturts/patch-1
Remove 'Google Translator'-like translation
2015-11-30 16:01:01 +08:00
Cheng Zhao
f30a7f5636 Merge pull request #3622 from atom/wl-docs-skip-ci
Suggest [ci skip] in documentation-only commits
2015-11-30 15:33:49 +08:00
Cheng Zhao
bf4b94561e docs: Mention submitting to MAC costs money
Close #3617.
2015-11-30 15:21:39 +08:00
Cheng Zhao
91395102cf Merge pull request #3618 from preco21/master
Update as upstream
2015-11-30 15:01:08 +08:00
Cheng Zhao
23560ff570 Merge pull request #3616 from leftstick/master
add packaging translation for ZH-CN
2015-11-30 15:00:33 +08:00
Cheng Zhao
8ba02fb899 Merge pull request #3612 from gunmetal313/translate_to_ru
init russian lang docs
2015-11-30 14:57:16 +08:00
Artur de Oliveira Tsuda
45e9ed5f0c Update 'Estilo de código' link.
'Estilo de código' in 'Desenvolvimento' section now points to the translated coding-style.md
2015-11-29 23:25:16 -02:00
Artur de Oliveira Tsuda
7d827c2f3e Remove 'Google Translator'-like translation 2015-11-29 22:56:34 -02:00
Paul Betts
b67e70334a Merge pull request #3621 from lukewestby/patch-1
fix misspelling in "rotation" string
2015-11-29 15:33:55 -08:00
Wliu
9c0afcd901 Wrap [ci skip] in backticks 2015-11-29 14:57:48 -05:00
Wliu
c7420e17ab Suggest [ci skip] in documentation-only commits 2015-11-29 14:04:57 -05:00
Luke Westby
df9ecefe01 fix typo in "rotation" string 2015-11-29 12:22:53 -06:00
Plusb Preco
22dbf5e9fc Small fixes 2015-11-29 23:06:01 +09:00
Plusb Preco
dab7058aa2 Update as upstream 2015-11-29 23:03:31 +09:00
Plusb Preco
9fbe2e6c0f Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-29 18:46:01 +09:00
howard.zuo
5bbc46930f add packaging translation for ZH-CN 2015-11-29 12:14:49 +08:00
Ivan Kulikov
eeb1143deb init russian lang docs 2015-11-27 22:32:45 +03:00
Cheng Zhao
62add3abcc Bump v0.35.2 2015-11-27 22:23:19 +08:00
Cheng Zhao
b529efcd8e Merge pull request #3608 from atom/cp-execfile
Add docs and tests for child_process.execFile
2015-11-27 22:21:33 +08:00
Cheng Zhao
cfdcfcbd80 Add executable permission in CopyFileOut 2015-11-27 22:06:37 +08:00
Cheng Zhao
6ef6a83042 spec: Test execFile and execFileSync 2015-11-27 21:38:43 +08:00
Cheng Zhao
a1fdc701ee docs: Add notes on spawn and exec 2015-11-27 21:29:31 +08:00
Cheng Zhao
6fb944c842 Merge pull request #3604 from niedzielski/patch-2
Update docs for webContents.addWorkSpace
2015-11-27 18:39:11 +08:00
Cheng Zhao
8472528909 Merge pull request #3603 from niedzielski/patch-1
Update docs for globalShortcut.register
2015-11-27 18:38:39 +08:00
Cheng Zhao
628ee93b0b Merge pull request #3606 from preco21/master
Update as upstream
2015-11-27 18:38:13 +08:00
Plusb Preco
a96c408df5 Update as upstream 2015-11-27 17:28:09 +09:00
Plusb Preco
8a7aa0171b Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-27 17:27:58 +09:00
Stephen Niedzielski
62c65280a1 Update docs for webContents.addWorkSpace
Specify that webContents.addWorkSpace cannot be called before DevTools
creation and include example.

Fix: #3536
2015-11-26 23:16:00 -07:00
Stephen Niedzielski
0b245b96e4 Update docs for globalShortcut.register
Document return value for globalShortcut.register and common failure scenario.

Fix: #3600
2015-11-26 22:38:47 -07:00
Cheng Zhao
42454b07d0 Merge pull request #3595 from jviotti/jviotti/fix/3512/execFile-override-exec-permissions
🐛 Fix missing execution permission bit in execFile override
2015-11-27 11:39:45 +08:00
Juan Cruz Viotti
585ff9062c 🐛 Fix missing execution permission bit in execFile override
Consider an electron application that uses `execFile` to run a script
that lives within the application code base:

```coffee
child_process = require 'child_process'
child_process.execFile __dirname + '/script.sh', (error) ->
  throw error if error?
```

An application like this will fail when being packaged in an `asar` with
an following error:

```
Error: spawn EACCES
```

Electron overrides certain `fs` functions to make them work within an
`asar` package. In the case of `execFile`, the file to be executed is
extracted from the `asar` package into a temporary file and ran from
there.

The problem is that during the extraction, the original permissions of
the file are lost.

We workaround this by:

1. Extending `asar.stat` to return whether a file is executable or not,
  which is information that's already saved in the `asar` header.

2. Setting execution permissions on the extracted file if the above
  property holds true.

Fixes: https://github.com/atom/electron/issues/3512
2015-11-26 23:30:23 -04:00
Plusb Preco
43b73a0ced Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-27 12:19:47 +09:00
Cheng Zhao
932cd92bf6 Fix wrong deprecation wrappers of BrowserWindow 2015-11-27 10:30:51 +08:00
Cheng Zhao
ed866900e7 Merge pull request #3594 from atom/public-env
Add ELECTRON_RUN_AS_NODE environment variable
2015-11-26 21:51:35 +08:00
Cheng Zhao
59402eb23f Add ELECTRON_NO_ATTACH_CONSOLE env var
Close #1556.
2015-11-26 21:11:28 +08:00
Cheng Zhao
682b48095a docs: Add example 2015-11-26 20:44:07 +08:00
Cheng Zhao
6534a0e616 docs: Add Environment Variables 2015-11-26 20:37:48 +08:00
Cheng Zhao
b1e6d4f64c Check ELECTRON_RUN_AS_NODE env var 2015-11-26 20:37:21 +08:00
Cheng Zhao
5ee9e61445 Update brightray for #1369 2015-11-26 19:10:43 +08:00
Cheng Zhao
a551b8eaaa Merge pull request #3590 from vQuagliaro/doc-windows-open-file
[doc] open-file and open-url events are only available on OS X
2015-11-26 18:34:12 +08:00
Vincent Quagliaro
fe4638ef33 📝 open-file and open-url events are only available on OS X 2015-11-26 09:09:45 +01:00
Cheng Zhao
086734cb57 Merge pull request #3588 from atom/fix-fullscreen-crash
Clears the delegate when window is going to be closed
2015-11-26 14:10:17 +08:00
Cheng Zhao
b0d4aa211d Fix compatibility with activate-with-no-open-windows event 2015-11-26 13:57:48 +08:00
Cheng Zhao
6c1878d15b mac: Clears the delegate when window is going to be closed
Since EL Capitan it is possible that the methods of delegate would get
called after the window has been closed.

Refs atom/atom#9584.
2015-11-26 13:56:56 +08:00
Cheng Zhao
8ce19d8059 Merge pull request #3586 from atom/ipc-fasterer
Ensure calling webview.send will not block the renderer
2015-11-26 13:15:08 +08:00
Cheng Zhao
9c62be8fc9 Improve the deprecation notice for ipc module
Close #3577.
2015-11-26 11:06:56 +08:00
Cheng Zhao
873bfd0538 Merge pull request #3574 from preco21/master
Update as upstream
2015-11-26 11:02:01 +08:00
Cheng Zhao
ec88567683 Merge pull request #3573 from rprichard/fix_3565
Fix https://github.com/atom/electron/issues/3565 by adding a typeof
2015-11-26 11:00:29 +08:00
Paul Betts
789380dfad Ensure calling webview.send will not block the renderer
When the browser process is busy, calling webview.send (a method that appears
on its face to be non-blocking) will actually block, because most webview methods
are remoted to a guest view instance in the browser. Instead, define a few methods
which will instead send its call over an async IPC message.
2015-11-25 15:54:30 -08:00
Plusb Preco
34aecc9327 Update as upstream 2015-11-25 08:55:04 +09:00
Ryan Prichard
0f5a3baff4 Fix https://github.com/atom/electron/issues/3565 by adding a typeof 2015-11-24 16:49:52 -06:00
Cheng Zhao
bf5e9e4f4d Merge pull request #3568 from laiso/fix_docs
docs: s/loadUrl/loadURL/g in docs-translations/
2015-11-24 22:03:46 +08:00
laiso
4acbd3e03f s/loadUrl/loadURL/g in docs-translations/ 2015-11-24 21:02:14 +09:00
Cheng Zhao
b9fd095b04 docs: Mark code blocks 2015-11-24 18:40:50 +08:00
Cheng Zhao
24e892dd17 Update brightray for #3550 2015-11-24 18:39:16 +08:00
Cheng Zhao
bab603d33a Merge pull request #3550 from etiktin/support_proxy_bypass_list
Add support for --proxy-bypass-list command line argument
2015-11-24 18:38:33 +08:00
Cheng Zhao
fe88cb01fc Merge pull request #3531 from deepak1556/fetch_job_nocontent_patch
protocol: handle http responses with no content
2015-11-24 15:45:07 +08:00
Cheng Zhao
a4a14a5f0e Update brightray for #3458 2015-11-24 15:14:48 +08:00
Cheng Zhao
e634dc567e Merge pull request #3561 from preco21/master
Update as upstream
2015-11-24 13:40:16 +08:00
Plusb Preco
6e6cee3ac6 Small fixes 2015-11-24 10:23:52 +09:00
Plusb Preco
6636effb1d Update as upstream
* Update as upstream
* Add caution of translation version
2015-11-24 10:21:30 +09:00
Plusb Preco
d353a3a204 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-23 20:34:00 +09:00
Cheng Zhao
c2197d8a05 Merge pull request #3554 from meowlab/docs-fix
docs: Fix deprecated usage tips
2015-11-23 18:19:37 +08:00
Cheng Zhao
9e74b10825 Merge pull request #3548 from dongjoon-hyun/fix_typos_in_koKR_api_ipc_main
Fix typos in Korean api/ipc-main.md
2015-11-23 17:45:48 +08:00
Cheng Zhao
422e40d08c Merge pull request #3544 from dongjoon-hyun/fix_typo
Fix a typo in Korean quick-start tutotial
2015-11-23 17:45:44 +08:00
Cheng Zhao
e98d4c4a2e Merge pull request #3549 from bengotow/fix-hide-others
Remove trailing colons from default menu roles
2015-11-23 17:44:06 +08:00
Plusb Preco
54f16a5568 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-23 18:23:15 +09:00
Cheng Zhao
360a747acf Merge pull request #3542 from etiktin/fix_menu_item_using_deprcated_api
Fix menu-item using deprecated API
2015-11-23 17:11:44 +08:00
Cheng Zhao
ba8b448c36 docs: Add indent for items in list
Some markdown renderers require it to be able to render the list
correctly.
2015-11-23 16:59:15 +08:00
Cheng Zhao
634fef2508 Merge pull request #3537 from etiktin/make_BrowserWindow_options_optional
Make BrowserWindow options argument optional
2015-11-23 16:56:30 +08:00
Cheng Zhao
812e105d4f Merge pull request #3535 from etiktin/use_the_correct_docs_version
Use the correct docs version
2015-11-23 16:45:26 +08:00
Cheng Zhao
1a1d5aba94 Merge pull request #3533 from preco21/master
Update as upstream
2015-11-23 16:41:02 +08:00
Sunny
6d46c3a75e docs: Fix deprecated usage tips 2015-11-23 13:40:23 +08:00
Eran Tiktin
baab0486f0 Add documentation for --proxy-bypass-list
Depends on atom/brightray#179
2015-11-22 23:44:20 +02:00
Robo
167f11e797 protocol: handle http responses with no content 2015-11-23 01:07:14 +05:30
Ben Gotow
fbdef9e112 Remove trailing colons from default menu roles
`hideothers` and `unhide` had trailing colons which prevented them from being enabled / working in the default app. #3543
2015-11-22 09:08:35 -08:00
Dongjoon Hyun
df570269e3 Fix typos in Korean api/ipc-main.md 2015-11-22 23:16:56 +09:00
Dongjoon Hyun
10a7ecee46 Add space, too 2015-11-22 19:55:36 +09:00
Dongjoon Hyun
b406774055 Fix a typo in Korean quick-start tutotial 2015-11-22 19:50:52 +09:00
Eran Tiktin
6db6842c14 Fix menu-item using deprecated API
Some of the roles in menu-item use methods on BrowserWindow instead of
WebContents which outputs a deprecation warning.
I changed it to use the correct methods.
2015-11-22 01:13:57 +02:00
Eran Tiktin
651254424d Expand the descriptions of options with defaults
Resolves #3367
2015-11-21 21:50:23 +02:00
Eran Tiktin
4027d04662 Add test 2015-11-21 06:58:17 +02:00
Eran Tiktin
ab693ca571 Update docs 2015-11-21 06:42:40 +02:00
Eran Tiktin
18de28c3ff Make BrowserWindow options argument optional
Resolves #3473
2015-11-21 06:22:19 +02:00
Plusb Preco
1cf3216f50 Add missed translation 2015-11-21 13:15:37 +09:00
Eran Tiktin
df8cc85d2c Rephrased the note 2015-11-21 04:22:16 +02:00
Eran Tiktin
5730d588d0 Add a note to readme about docs versioning
Added a note to readme about using the correct docs version. Hopefully
this will reduce users confusion.
2015-11-21 03:31:52 +02:00
Eran Tiktin
4d4bb0a73e Added ctags cache files to .gitignore 2015-11-21 02:32:53 +02:00
Eran Tiktin
9341b9d640 Make links to docs, point to the correct version
- Links to docs in the default app, pointed to the docs in the master
branch. I changed them to point to the docs that match Electron's
version.
- Added Electron's version to the header of the default app, so it will
be easier to figure out what version is currently running.
2015-11-21 02:26:59 +02:00
Plusb Preco
ecdce2b214 Update as upstream 2015-11-21 07:51:52 +09:00
Eran Tiktin
f374508a61 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-20 19:25:23 +02:00
Eran Tiktin
50083017bc Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-20 18:44:51 +02:00
Cheng Zhao
29052b0498 Bump v0.35.1 2015-11-20 13:36:59 +08:00
Cheng Zhao
153c751fd7 Update brightray for #3493 2015-11-20 13:33:42 +08:00
Cheng Zhao
8e2faba8f7 Small style fix 2015-11-20 13:06:42 +08:00
Cheng Zhao
c1d6d68783 Merge pull request #3509 from bengotow/macosx-desktop-window
Support the "desktop" window type on Mac OS X
2015-11-20 13:02:05 +08:00
Cheng Zhao
866cff8b9c Merge pull request #3519 from preco21/master
Update as upstream, some cleanups
2015-11-20 10:52:53 +08:00
Cheng Zhao
784d2633a9 Make child_process.execFileSync support asar 2015-11-20 10:33:57 +08:00
Cheng Zhao
eec93665b7 Merge pull request #3514 from atom/session
Add session module
2015-11-20 10:23:38 +08:00
Plusb Preco
79397abbeb Update as upstream 2015-11-20 04:58:51 +09:00
Plusb Preco
80dfa4bf09 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-20 04:46:07 +09:00
Plusb Preco
962134c612 Cleanup docs
* Adjust line wrap to 80
* Fix typos
* Improve grammar
2015-11-20 04:46:05 +09:00
Ben Gotow
65c823407d Address feedback 2015-11-19 10:14:14 -08:00
Plusb Preco
eca98b85fc Cleanup docs, fix typos 2015-11-20 02:25:44 +09:00
Cheng Zhao
026a1f9a4f Merge pull request #3515 from sotayamashita/japanese-localization
Format structure
2015-11-19 22:23:14 +08:00
Sota Yamashita
fd3b8ad623 Rename: READE.md -> README.md 2015-11-19 22:54:40 +09:00
Sota Yamashita
bee1af3264 Create README.md 2015-11-19 22:54:01 +09:00
Sota Yamashita
f2472274b7 Rename quick-start.md -> tutorial/quick-start.md 2015-11-19 22:52:37 +09:00
Cheng Zhao
1b464c82e1 docs: Put webContents.session under Properties 2015-11-19 21:48:45 +08:00
Cheng Zhao
611f87d17f spec: Use session.defaultSession in tests 2015-11-19 21:42:22 +08:00
Cheng Zhao
08c13cf446 Deprecate app.resolveProxy
There is now a public API to get default session, this helper is no
longer necessary.
2015-11-19 21:32:46 +08:00
Cheng Zhao
44c562ebd9 docs: New session methods 2015-11-19 21:31:39 +08:00
Cheng Zhao
dd8ef33e42 docs: webContents.savePage is placed at wrong place 2015-11-19 21:10:50 +08:00
Cheng Zhao
1392873cbc Add session.defaultSession and remove app.defaultSession
The latter has never been a public API, no need to keep it.
2015-11-19 21:03:42 +08:00
Cheng Zhao
47d7d49d19 Add session module 2015-11-19 20:47:11 +08:00
Cheng Zhao
b9ddb0c268 Merge pull request #3510 from atom/is-destroyed
Add "isDestroyed" method for objects with "destroy" method
2015-11-19 17:28:59 +08:00
Cheng Zhao
9a20b33d97 Add isDestroyed method for classes with destroy method 2015-11-19 17:08:16 +08:00
Ben Gotow
d427ae1030 Support the "desktop" window type on Mac OS X
Adds the desktop window type referenced in https://github.com/atom/electron/issues/2899 for compatiblity with the linux version. Note that on Mac OS X, the desktop window cannot receive input events (seems to be a limitation of being behind the desktop).

In this diff I also removed the `standardWindow` option from the docs, in favor of an additional `textured` value for window `type` on Mac OS X. The old `standardWindow` option continues to work, but seemed more confusing. If this seems like a bad idea, I can revert that change.
2015-11-19 00:39:45 -08:00
Cheng Zhao
ed1f9989b0 Merge pull request #3507 from atom/upload-dsym
Upload the dSYM symbols
2015-11-19 16:38:58 +08:00
Cheng Zhao
2c06afad6a Upload the dSYM symbols 2015-11-19 15:10:33 +08:00
Cheng Zhao
52e34ca0f9 Merge pull request #3506 from atom/linux-dpi
Update libchromiumcontent
2015-11-19 14:45:30 +08:00
Cheng Zhao
c63121c2f6 Update libchromiumcontent
Backport https://codereview.chromium.org/1324513002.
2015-11-19 13:50:54 +08:00
Cheng Zhao
69388e185c Merge pull request #3504 from KevinRamsunder/patch-1
mac-app-store-submission-guide.md: typo correction
2015-11-19 11:00:43 +08:00
Cheng Zhao
2affc44000 Merge pull request #3503 from etiktin/patch-2
Update ipc-renderer.md
2015-11-19 11:00:13 +08:00
Cheng Zhao
afbceab2ab Merge pull request #3496 from preco21/master
Update as upstream and some fixes
2015-11-19 10:57:21 +08:00
Cheng Zhao
e9b8e66f2b Merge pull request #3497 from etiktin/patch-1
Update browser-window.md
2015-11-19 10:54:32 +08:00
Cheng Zhao
8900d67c67 Merge pull request #3492 from vitorgalvao/patch-2
web-view-tag.md: small typo correction ('the' position swap)
2015-11-19 10:44:15 +08:00
Kevin Ramsunder
ba5f8aa096 mac-app-store-submission-guide.md: typo correction 2015-11-18 20:04:16 -05:00
Plusb Preco
0232b77ce3 Cleanup docs, Improve grammar 2015-11-19 09:32:44 +09:00
Eran Tiktin
b7ae9d3337 Update ipc-renderer.md
Removed duplication.
2015-11-19 02:11:32 +02:00
Plusb Preco
e4803e6f97 Translate docs 2015-11-19 05:12:38 +09:00
Eran Tiktin
f581730516 Update browser-window.md
Changed the description of the preload key to make it clear you need to provide an absolute file path and not a file url.
Also mentioned that it's possible to reintroduce Node globals when node integration is off and referenced the example from process.md (related to https://github.com/atom/electron/issues/254#issuecomment-157769756).
2015-11-18 21:06:06 +02:00
Plusb Preco
ef64a211a2 Standardize platform labels 2015-11-19 04:01:50 +09:00
Plusb Preco
82e2da1d9a Translate docs 2015-11-19 03:53:10 +09:00
Vítor Galvão
e2cd0578f3 web-view-tag.md: small typo correction ('the' position swap) 2015-11-18 18:13:48 +00:00
Plusb Preco
70c7abbbfe Small changes 2015-11-19 02:51:27 +09:00
Plusb Preco
f0d2bc87e8 Add translation, improve grammar 2015-11-19 02:50:04 +09:00
Plusb Preco
cc5a4f1dfe Update as upstream 2015-11-18 23:42:03 +09:00
Plusb Preco
9db4af4cf3 Fix platform label to uppercase (ko) 2015-11-18 23:36:20 +09:00
Plusb Preco
0c2d769b8a Fix platform label to uppercase 2015-11-18 23:35:36 +09:00
Plusb Preco
6058c7e14d Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-18 23:33:38 +09:00
Plusb Preco
250575719d Translate docs 2015-11-18 23:32:47 +09:00
Plusb Preco
6892f0d2d4 Add missed translation 2015-11-18 22:14:24 +09:00
Cheng Zhao
87546bd4f8 Merge pull request #3479 from bengotow/tray-resizing
Fix sizing of Mac OS X tray icon after image change
2015-11-18 18:49:15 +08:00
Cheng Zhao
1ee69540b0 Merge pull request #3484 from bengotow/remote-errors
Improve exception messages from remote calls
2015-11-18 18:21:02 +08:00
Cheng Zhao
151f8e7f8a Merge pull request #3485 from leftstick/master
[Doc update]: Use loadURL since loadUrl is deprecated
2015-11-18 18:12:09 +08:00
Cheng Zhao
a3460e8e19 Merge pull request #3483 from preco21/patch-4
'app-command' event is only available in Windows
2015-11-18 18:11:37 +08:00
Cheng Zhao
bcdd0952f8 docs: Fix typo 2015-11-18 17:56:50 +08:00
Cheng Zhao
9e67dc385b Merge pull request #3476 from preco21/master
Update as upstream, add new translation and some fixes
2015-11-18 13:18:44 +08:00
Cheng Zhao
45e3d4ea6b Merge pull request #3487 from atom/certificate-api
Rework of the certificate API
2015-11-18 12:06:52 +08:00
Plusb Preco
25e5c38556 Small changes 2015-11-18 12:45:33 +09:00
Cheng Zhao
47d7f2c050 Fix cpplint warning 2015-11-18 11:45:15 +08:00
Cheng Zhao
9ca022c98a docs: Update the certificate APIs 2015-11-18 11:35:26 +08:00
Cheng Zhao
c5bfac1969 Add session.setCertificateVerifyProc 2015-11-18 11:17:08 +08:00
Plusb Preco
3af4a40860 Translation docs 2015-11-18 11:43:16 +09:00
Cheng Zhao
e432abfb42 Add certificate-error event 2015-11-18 10:39:25 +08:00
Plusb Preco
74e8c8d6a5 Translate docs, small changes 2015-11-18 11:28:03 +09:00
Cheng Zhao
341341bf28 Rename select-certificate to select-client-certificate 2015-11-18 10:10:21 +08:00
Cheng Zhao
9a0dc3bfd7 Add Delegate for AtomBrowserClient 2015-11-18 10:07:03 +08:00
Howard.Zuo
c2eddb20f7 use loadURL since loadUrl is deprecated 2015-11-18 09:37:45 +08:00
Ben Gotow
1022179a1f Improve exception messages from remote calls
Spent a while tracking down `Error processing argument -1`, caused by a missing param (`app.exit()` now takes an exit code.) Improve the rpc-server so that it prints the function name when possible, so it's much easier to identify which remote call is causing the error.
2015-11-17 17:36:37 -08:00
Plusb Preco
d129aa9085 Update as upstream 2015-11-18 09:50:14 +09:00
Plusb Preco
0e8ab0688d Fix wrong markdown 2015-11-18 09:43:28 +09:00
Plusb Preco
0dd14ad204 'app-command' event is only available in Windows 2015-11-18 09:36:14 +09:00
Plusb Preco
7cc965b178 Translate docs 2015-11-18 09:21:49 +09:00
Plusb Preco
57aecbc415 Small changes 2015-11-18 07:09:10 +09:00
Ben Gotow
9c69416e32 Fix sizing of Mac OS X tray icon after image change
- Consolidate logic that applies view dimensions into a function
- Use `NSVariableStatusItemLength` instead of trying to sync status item width
- Use modern Obj-C syntax `@[], @{}` in a few places
- Recompute view bounds after updating image in `setImage:`
2015-11-17 13:43:55 -08:00
Plusb Preco
c21d7b537a Update as upstream 2015-11-18 03:40:58 +09:00
Plusb Preco
78dac21b84 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-18 03:10:18 +09:00
Plusb Preco
b4eca40d07 Improve grammar
* Improve grammar
* Standardize docs
* Fix typos
2015-11-18 03:09:51 +09:00
Plusb Preco
456154a6a2 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-18 02:13:01 +09:00
Plusb Preco
247a0a8ae2 Add BrowserWindow translation 2015-11-18 02:12:40 +09:00
Cheng Zhao
ab54fedc9a Merge pull request #3469 from atom/cleanup-verify-certificate
Emit verify-certificate only when default verifier fails
2015-11-17 21:57:58 +08:00
Cheng Zhao
961ee5a4d9 Rename verify-certificate to untrusted-certificate 2015-11-17 21:41:36 +08:00
Cheng Zhao
ebe66daa56 Emit verify-certificate only when default verifier fails 2015-11-17 21:36:36 +08:00
Cheng Zhao
e3517b701e Create a new CertVerifierRequest for each request
It greatly simplifies the code.
2015-11-17 19:44:55 +08:00
Cheng Zhao
ea1e4160ea Move AtomSSLConfigService to atom/browser/net 2015-11-17 19:05:38 +08:00
Cheng Zhao
37f355724a Move AtomCertVerifier to atom/browser/net 2015-11-17 19:03:09 +08:00
Cheng Zhao
217311ef21 No need to use weak reference
Ref-counting manages everything.
2015-11-17 19:00:33 +08:00
Cheng Zhao
24f573eceb Merge pull request #3344 from deepak1556/certificate_verifier_api_patch
session: api to allow handling certificate verification
2015-11-17 18:53:35 +08:00
Moises lopes ferreira
855c1ead00 Portuguese translation of coding-style.md 2015-11-17 18:42:03 +08:00
Cheng Zhao
9a9f912f24 Merge pull request #3464 from dongjoon-hyun/add_missing_translations_in_menu_items
Add missing Korean translations in menu-item.md
2015-11-17 18:20:17 +08:00
Dongjoon Hyun
5995451366 Add missing translations 2015-11-17 16:49:08 +09:00
tom
099da729c7 Added korean translations for webContents 2015-11-17 11:58:37 +08:00
Cheng Zhao
69a6e80ab8 Merge pull request #3462 from atom/absolut-url-docs
docs: Use absolute URLs
2015-11-17 11:50:19 +08:00
Cheng Zhao
68099a71b0 docs: Use absolute URLs
Relative paths in GitHub's repo do not work very well, and our docs site
can not recognize them.
2015-11-17 11:47:57 +08:00
Cheng Zhao
b4d3c8f248 Merge pull request #3460 from preco21/master
Small fixes, add translation
2015-11-17 11:42:57 +08:00
Cheng Zhao
3b826ed1a5 Update brightray: fix #3458 2015-11-17 11:22:14 +08:00
Plusb Preco
ee12dc3d17 Improve grammar 2015-11-17 11:22:05 +09:00
Plusb Preco
83dfef2e66 Fix missed changes 2015-11-17 10:53:24 +09:00
Plusb Preco
5b8e94ca28 Improve grammar 2015-11-17 10:50:06 +09:00
Plusb Preco
7ef347e69e Small changes 2015-11-17 10:44:30 +09:00
Plusb Preco
d05def1e3e Small changes 2015-11-17 05:17:24 +09:00
Plusb Preco
f312a4e6ec Change the translation encoding 2015-11-17 05:09:27 +09:00
Plusb Preco
66816ea2e0 Add Mac App Store guide translation 2015-11-17 05:05:11 +09:00
Robo
92c3ee8e16 use delegate to notify verification requests 2015-11-16 20:45:49 +05:30
Plusb Preco
62e6332366 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-16 23:55:46 +09:00
Plusb Preco
7dcc537359 Update as upstream 2015-11-16 23:47:09 +09:00
Cheng Zhao
202d2eeb8a Merge pull request #3454 from brenca/keyboard-pr
Adding further options to specify the character being sent with sendInputEvent (keyboard)
2015-11-16 22:13:09 +08:00
Heilig Benedek
14740eeb8a Merging keyCode and keyIdentifier and adjusting the docs accordingly 2015-11-16 14:51:26 +01:00
Cheng Zhao
1d800d5e26 Merge pull request #3432 from deepak1556/navigation_patch
browser: fix reloadignoringcache api
2015-11-16 20:55:16 +08:00
Cheng Zhao
9e70d35afa Bump v0.35.0 2015-11-16 16:48:51 +08:00
Cheng Zhao
728a5db3b4 Update brightray: fix building on Windows 2015-11-16 16:47:51 +08:00
Cheng Zhao
feedd0c43d Merge pull request #3456 from meowlab/improve-translation-zh-CN
Fix a dead link and add a new Chinese document translation
2015-11-16 16:29:09 +08:00
Cheng Zhao
3f0f1a2ce9 Update brightray 2015-11-16 16:18:57 +08:00
Cheng Zhao
2a9a66144c Merge pull request #3453 from preco21/master
Update as upstream
2015-11-16 16:11:51 +08:00
Cheng Zhao
0f89573719 Merge pull request #3441 from brenca/master
Fixing memory leak in FrameSubscriber
2015-11-16 16:03:58 +08:00
Sunny
c27c7b05fe Add Simplified Chinese translation for source code structure 2015-11-16 13:06:14 +08:00
Plusb Preco
ceee820d4a Fix typos in download-item.md 2015-11-16 13:44:25 +09:00
Plusb Preco
266c22903b Small fixes 2015-11-16 13:43:16 +09:00
Plusb Preco
c5e706bc30 Add download-item.md translation 2015-11-16 13:41:47 +09:00
Plusb Preco
19a2c24927 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-16 13:41:29 +09:00
Heilig Benedek
5fff06d2c2 Added documentation for the changes in KeyboardEvent and added missing mouseMove event type 2015-11-16 04:54:48 +01:00
Heilig Benedek
bb6d7d1498 Added the option to KeyboardEvent to specify the sent character by it's name (if it can't be sent via the keyCode parameter) 2015-11-16 04:54:21 +01:00
Cheng Zhao
abba83397b Merge pull request #3450 from eddiezane/patch-1
Fix typo in notifications example docs
2015-11-16 11:17:41 +08:00
Plusb Preco
1254331c5e Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-16 12:15:38 +09:00
Plusb Preco
e12e119381 Update as upstream
* Update as upstream
* Fix typos
* Improve grammar
2015-11-16 12:15:21 +09:00
Plusb Preco
ad776887da Update README.md 2015-11-16 08:34:41 +09:00
Plusb Preco
42a3771f98 Small change 2015-11-16 08:30:08 +09:00
Eddie Zaneski
c1373d7480 Fix typo in notifications example docs 2015-11-15 10:48:09 -05:00
Heilig Benedek
9f9436d6dc Moved scope creation before the allocation of the buffer in FrameSubscriber 2015-11-14 23:59:38 +01:00
Plusb Preco
78542ab54c Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-15 07:58:21 +09:00
Heilig Benedek
9987082de5 Merge pull request #3 from atom/master
Update from original
2015-11-14 21:11:26 +01:00
Robo
e2959ed3fc add docs 2015-11-14 12:09:18 +05:30
Robo
2a7f874373 browser: fix reloadignoringcache api 2015-11-14 02:25:23 +05:30
Cheng Zhao
fe214e0806 Merge pull request #3428 from atom/remote-enhance
Make it easier to use browser side modules
2015-11-14 00:26:03 +08:00
Cheng Zhao
5cacf79bc5 docs: Document the new style of remote module 2015-11-13 22:34:00 +08:00
Cheng Zhao
94e24abb99 Use the new style remote module in Electron 2015-11-13 22:22:25 +08:00
Cheng Zhao
b925ac0056 Send sync message to get list of modules 2015-11-13 22:15:16 +08:00
Cheng Zhao
099278855c Simplify how remote.require('electron') is optimized 2015-11-13 21:54:56 +08:00
Cheng Zhao
9bf0a8647e Make it easier to use remote 2015-11-13 21:52:27 +08:00
Cheng Zhao
e76a7f7b7d Fix typo, tray => Tray 2015-11-13 21:52:05 +08:00
Cheng Zhao
5d52ff76ab Merge pull request #3425 from atom/tray-api
Rename the "clicked" event to "click" in Tray
2015-11-13 18:52:56 +08:00
Cheng Zhao
e8ffd24e4e Rename the "clicked" event to "click" in Tray 2015-11-13 16:41:33 +08:00
Cheng Zhao
52f1431bde Merge pull request #3424 from atom/api-rename
Replace "Url" in API names with "URL"
2015-11-13 16:27:38 +08:00
Cheng Zhao
fbb8e61958 Replace "Url" in API names with "URL" 2015-11-13 16:03:40 +08:00
Sunny
9ac87e844a Fix node_bindings link in Simplified Chinese document translation 2015-11-13 15:41:20 +08:00
Cheng Zhao
8f56387bd9 Merge pull request #3422 from atom/windows-fix
Separate options from switches
2015-11-13 15:04:51 +08:00
Cheng Zhao
860c46b3c1 Separate options from switches
On Windows the case sensitivity of command line switches are ignored, so
--nodeIntegraion will become --nodeintegration.

We should separate options from switches so we use "nodeIntegraion" in
options, while passing "--node-integration" in command line.
2015-11-13 14:05:49 +08:00
Cheng Zhao
0f23d6faa9 Merge pull request #3421 from atom/chrome-paths
Add a few more paths for app.getPath
2015-11-13 13:53:55 +08:00
Cheng Zhao
fdc19f2d3a Fix building on Windows 2015-11-13 13:23:13 +08:00
Cheng Zhao
d3caea91b0 Add paths from chrome_paths 2015-11-13 13:05:16 +08:00
Cheng Zhao
05d2e431de Fix building on OS X 2015-11-13 13:03:00 +08:00
Cheng Zhao
83ae9f8d71 Import the chrome_paths code 2015-11-13 12:45:02 +08:00
Cheng Zhao
996a3c2a35 Merge branch 'content_tracing_patch' of https://github.com/deepak1556/atom-shell into deepak1556-content_tracing_patch 2015-11-13 12:29:18 +08:00
Cheng Zhao
78934dceb9 Cleanup and docs for the --js-flags 2015-11-13 12:22:08 +08:00
Cheng Zhao
0321a77a94 Merge pull request #3412 from skhameneh/master
Add --js-flags support for main thread.
2015-11-13 12:10:59 +08:00
Cheng Zhao
3a5160f799 Merge pull request #3415 from atom/exports-electron
Move all public APIs to "electron" module
2015-11-13 11:21:45 +08:00
Cheng Zhao
f2439cefd0 linux: Don't throw error when using autoUpdater
Fix #3194.
2015-11-13 10:58:10 +08:00
Robo
bfaa50a79e retrieve download directory using on linux 2015-11-13 07:44:05 +05:30
Cheng Zhao
852500e5fa Fix a few places using old style require 2015-11-13 09:38:22 +08:00
Robo
37e6e6fab7 emit verify-certificate event for handling verification 2015-11-13 06:44:49 +05:30
Robo
bb439c5f1c browser: check window liveness before setting title 2015-11-13 02:43:21 +05:30
Robo
3d5437e0a4 tracing: fix docs and allow null values in file path conversion fromv8 2015-11-13 02:36:38 +05:30
Robo
d072e61282 session: api to allow handling certificate verification 2015-11-13 01:27:30 +05:30
Cheng Zhao
ce6a7c7d08 spec: Disable old APIs in tests 2015-11-12 23:02:39 +08:00
Cheng Zhao
edd807d227 Fix a typo 2015-11-12 22:56:18 +08:00
Cheng Zhao
c5913c3149 docs: Add notes on old APIs 2015-11-12 22:24:11 +08:00
Cheng Zhao
2ca5a33d28 Add electron.hideInternalModules 2015-11-12 21:46:03 +08:00
Cheng Zhao
c649c4cf4f Rename the env to ELECTRON_HIDE_INTERNAL_MODULES 2015-11-12 21:37:44 +08:00
Cheng Zhao
eac2e7cc61 docs: Update codes in docs to use require('electron') 2015-11-12 21:20:09 +08:00
Cheng Zhao
8b2942c279 Optimize remote.require('electron') 2015-11-12 20:30:40 +08:00
Cheng Zhao
1d1f911b09 Use require('electron') in Electron's code 2015-11-12 20:29:30 +08:00
Shawn K
fb5beb9af5 Add --js-flags support for main thread.
Allow use of flags that must be set before V8 is initialized, such as
"--harmony_proxies", e.g. --js-flags="--harmony_proxies
--harmony_collections"
2015-11-12 01:48:23 -08:00
Cheng Zhao
f9d7e7ce55 Add ELECTRON_DISABLE_OLD_STYLE_MODULES env 2015-11-12 17:02:04 +08:00
Cheng Zhao
c2c09daa23 Add "electron" module 2015-11-12 16:40:27 +08:00
Cheng Zhao
ce0167756e Update node for atom/node#13 2015-11-12 16:27:28 +08:00
Cheng Zhao
cb1dc6b2e2 Merge pull request #3409 from preco21/master
Update as upstream
2015-11-12 12:49:51 +08:00
Plusb Preco
020214ff95 Update as upstream 2015-11-12 12:24:28 +09:00
Cheng Zhao
ca49ddc95d Update brightray 2015-11-12 09:49:15 +08:00
Heilig Benedek
c571776da6 Merge pull request #2 from atom/master
Update from original
2015-11-12 01:20:33 +01:00
Cheng Zhao
28db51ad83 docs: Update BrowserWindow's options 2015-11-11 23:56:17 +08:00
Cheng Zhao
f08bd721f3 Merge pull request #3392 from Mingling94/master
Suggest adding arguments when running webdriver
2015-11-11 22:57:30 +08:00
Cheng Zhao
0e9415a256 docs: More notes on --proxy-server, close #3390 2015-11-11 22:55:32 +08:00
Cheng Zhao
0a5b234e3d Merge pull request #3354 from nishanths/master
Add drag-entered and drag-exited events to Tray
2015-11-11 22:44:05 +08:00
Cheng Zhao
e41cf8111a Merge pull request #3400 from atom/browser-window-options
Remove the "-" in BrowserWindow's option names
2015-11-11 11:29:02 +08:00
Cheng Zhao
f63a4a05b7 spec: Make the crash-reporter test more reliable 2015-11-11 10:37:34 +08:00
Cheng Zhao
60ec1ca3f7 Use new styles of browserWindow options 2015-11-11 10:37:34 +08:00
Cheng Zhao
ba457681b2 Avoid storing unrelated things in WebContentsPreferences 2015-11-11 10:37:34 +08:00
Cheng Zhao
b807685453 Deep copy the options
Otherwise a window's options is possible to be affected by others.
2015-11-11 10:37:34 +08:00
Cheng Zhao
960d325a58 Be compatible with old BrowserWindow options 2015-11-11 10:37:34 +08:00
Cheng Zhao
5cca947f4d Remove unneeded override code 2015-11-11 10:37:34 +08:00
Cheng Zhao
737e22b003 Use minWidth style for options instead of min-width 2015-11-11 10:37:34 +08:00
Cheng Zhao
d37aa8bed9 Reorder switches 2015-11-11 10:37:34 +08:00
Cheng Zhao
961e06ba6c Merge pull request #3398 from preco21/master
Update as upstream
2015-11-11 10:06:47 +08:00
Cheng Zhao
3af1d907d8 Merge pull request #3397 from preco21/patch-2
Standardize the webContents object names
2015-11-11 10:06:12 +08:00
Plusb Preco
319acc1e8a Update as upstream 2015-11-11 09:44:33 +09:00
Plusb Preco
b611154f43 Standardize the webContents object name 2015-11-11 09:03:49 +09:00
Plusb Preco
8774e7cf8d Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-11 07:57:59 +09:00
Ming Luo
916671d4d2 Suggest adding arguments when running webdriver 2015-11-10 14:58:38 -05:00
Nishanth Shanmugham
ed179ecf03 docs: Update tray docs with drop and drag-end events 2015-11-10 10:14:55 -06:00
Nishanth Shanmugham
d1e8e71e3f Tray: Add drag-end and drop events 2015-11-10 10:02:50 -06:00
Nishanth Shanmugham
f98147ea01 Tray: Rename events to drag-enter and drag-leave
Previously, the names were drag-entered and drag-exited. The new names mirror the HTML Drag and Drop event names
2015-11-10 09:27:39 -06:00
Cheng Zhao
f6a0e5ad31 Update brightray for atom/brightray#167 2015-11-10 20:32:16 +08:00
Cheng Zhao
6c7acd8aa5 Merge pull request #3385 from DerNivel/patch-1
Fix typo
2015-11-10 20:25:48 +08:00
Levin Rickert
08e245e3dc Fix typo 2015-11-10 12:42:05 +01:00
Cheng Zhao
1f01a4535a Fix compilation error of brightray 2015-11-10 18:04:59 +08:00
Cheng Zhao
d582ddf790 Update brightray for win7 crash of using notification 2015-11-10 17:44:14 +08:00
Cheng Zhao
682433028c docs: Clean up the desktop-environment-integration.md 2015-11-10 17:43:29 +08:00
Cheng Zhao
20c8637810 Merge pull request #3382 from felixrieseberg/notifications
Document Notifications
2015-11-10 17:30:08 +08:00
Cheng Zhao
0af1308ad7 Merge pull request #3384 from atom/ipc-renderer
Use different names for "ipc" module in main and renderer processes
2015-11-10 17:29:07 +08:00
Cheng Zhao
d234f10177 Implement event.sender for ipcRenderer 2015-11-10 16:59:08 +08:00
Cheng Zhao
90a7d4a906 docs: Update with new IPC modules 2015-11-10 16:48:24 +08:00
Cheng Zhao
05611f5e60 spec: Use multiparty instead of formidable
The latter is buggy and affects our specs.
2015-11-10 16:21:08 +08:00
Cheng Zhao
751af25f37 Use ipcMain in Electron's code 2015-11-10 16:04:34 +08:00
Cheng Zhao
844cea8f21 Deprecate ipc module for ipcMain 2015-11-10 15:41:24 +08:00
Cheng Zhao
6515a445a0 Use ipcRenderer in Electron's code 2015-11-10 15:29:43 +08:00
Felix Rieseberg
765cfb1094 Document Notifications 2015-11-10 08:28:14 +01:00
Cheng Zhao
828d911ed1 Deprecate ipc module for ipcRenderer 2015-11-10 15:12:07 +08:00
Cheng Zhao
5d1f7ed029 Update brightray for atom/brightray#161 2015-11-09 22:56:12 +08:00
Cheng Zhao
bd1f6e2edf Merge pull request #3372 from atom/deprecation-notice
Show warnings for deprecated APIs
2015-11-09 22:40:36 +08:00
Cheng Zhao
91c4ed26fc Print warnings for deprecated APIs 2015-11-09 21:51:30 +08:00
Cheng Zhao
f0bd28ca8d Do not turn off deprecation notice by default
It is v4 now, people should be punished if they are still using
deprecated Node.js APIs.
2015-11-09 21:19:16 +08:00
Cheng Zhao
89ff62b1b5 Add "deprecate" module 2015-11-09 21:19:16 +08:00
Cheng Zhao
a23ffd7a1b Rely on "download" script for argument verification 2015-11-09 18:24:32 +08:00
Cheng Zhao
13b917dd95 Update brightray for atom/electron#3310 2015-11-09 16:38:51 +08:00
Cheng Zhao
dd8fb9739d Merge pull request #3368 from tejaspathak/master
Add option to build local libchromiumcontent
2015-11-09 16:37:00 +08:00
Cheng Zhao
5e3b8d51e4 docs: Fix typo 2015-11-09 11:42:37 +08:00
Plusb Preco
91c7043a1b Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-09 08:17:12 +09:00
Plusb Preco
429723c8a9 Update as upstream 2015-11-09 07:48:40 +09:00
tejaspathak
ae2b004db7 Fix pylint errors 2015-11-08 17:41:16 +09:00
tejaspathak
09169ed402 Add option to build local libchromiumcontent
- Currently libchromiumcontent is downloaded by default.
- Now developer can choose to provide local libchromiumcontent src, shared and static path
2015-11-08 16:18:22 +09:00
Cheng Zhao
3465095c49 Update brightray for #3357 2015-11-07 12:12:17 +08:00
Cheng Zhao
312a79165b Bump v0.34.3 2015-11-06 21:37:37 +08:00
Cheng Zhao
829c396efe Merge pull request #3356 from atom/process-exit
Make process.exit() quit program gracefully
2015-11-06 21:25:27 +08:00
Cheng Zhao
c4ee8c1b1f spec: Fix refreshing on Windows 2015-11-06 21:00:38 +08:00
Cheng Zhao
d70706f876 Make sure handles of callbacks are releases on exit
Some callbacks are stored in native resources that not managed by
JavaScript, so when those resources are destroyed the JavaScript context
may already be destroyed, and releasing callbacks then would result in
crash.
2015-11-06 21:00:32 +08:00
Cheng Zhao
acf4372cf7 win: Add ELECTRON_DEFAULT_ERROR_MODE env
It is useful to help debugging crashes without opening debugger.
2015-11-06 20:25:20 +08:00
Cheng Zhao
863199348f Make process.exit() quit gracefully
Instead of abrupting the whole program immediately, we should close all
windows and release all native resources gracefully on exit. This avoids
possible crashes.

Fix #3350.
2015-11-06 20:25:20 +08:00
Cheng Zhao
c10c74b23a Merge pull request #3355 from preco21/master
Update as upstream
2015-11-06 11:31:44 +08:00
Plusb Preco
0e950e6d26 Update as upstream 2015-11-06 10:52:55 +09:00
Nishanth Shanmugham
8a296f82a0 Tray: Remove extra qualification in header 2015-11-05 19:02:24 -06:00
Nishanth Shanmugham
ee783a13ad docs: Add Tray drag-entered and drag-exited events 2015-11-05 18:49:34 -06:00
Nishanth Shanmugham
818892d474 Tray: Add drag-entered and drag-exited events 2015-11-05 18:46:49 -06:00
Cheng Zhao
5b0ea5bd46 Merge pull request #3343 from atom/fix-crash-of-crash-reporter
win: Guard against failure of RtlAddFunctionTable
2015-11-05 22:41:52 +08:00
Cheng Zhao
2505ebb9a6 win: Guard against failure of RtlAddFunctionTable
On some machines this call will fail and CHECK will abort the
application.
2015-11-05 22:00:40 +08:00
Cheng Zhao
47649ffd17 win: Fix calling showItemInFolder in renderer process 2015-11-05 20:47:27 +08:00
Tyler Gibson
4ff5ce4d6d Fixing MoveItemToTrash behavior in Windows
Modifying MoveItemToTrash for Windows to actually verify file can be
moved to a drive's recycle bin before attempting to delete it.

PR: #3337.
2015-11-05 20:42:30 +08:00
Ryan Molden
4ce840d8e6 Re-enable accessibility in Electron on Windows
In conjunction with commit 7c41f0e.
2015-11-05 19:49:48 +08:00
Cheng Zhao
fbe1200dc7 Merge pull request #3313 from kevinsimper/patch-1
Update devtools-extension with a note about it not working
2015-11-05 10:12:03 +08:00
Kevin Simper
e4f74bb87e Update devtools-extension with a note about it not working 2015-11-04 15:21:02 +01:00
Cheng Zhao
9f536f4783 Merge pull request #3328 from atom/wrapper-cleanup
Clean up native resources on exit
2015-11-04 19:24:32 +08:00
Cheng Zhao
d56b34de3b Make sure all native resources get freed on exit 2015-11-04 18:21:03 +08:00
Cheng Zhao
07c55f321f Destroy JS env immediately after running destruction callbacks 2015-11-04 17:31:10 +08:00
Cheng Zhao
84410a7e1c mac: Destroy the app delegate before running destruction callbacks
Otherwise users might be able to access wrapper functions after they are
destroyed.
2015-11-04 17:23:27 +08:00
Cheng Zhao
323abef362 Merge pull request #3326 from preco21/master
Update as upstream
2015-11-04 17:13:14 +08:00
Cheng Zhao
75f49477ca Cleanup wrapper function when app has done quitting
The app may still do something when quitting, we need to make sure the
wrapper function is still there at that time.
2015-11-04 16:54:36 +08:00
Cheng Zhao
441cc3e57e Style fix 2015-11-04 16:50:19 +08:00
Plusb Preco
96cc5485cb Update as upstream 2015-11-04 17:47:14 +09:00
Plusb Preco
526b2083c4 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-04 17:47:03 +09:00
mgarciaisaia
4013b652ff :checkered_flag:🐛 Buffer overflows in tooltips
Fixes #3290.
2015-11-04 15:34:58 +08:00
Cheng Zhao
28abc8defe Merge pull request #3323 from joaomoreno/win-keyboard-accessibility
Enable Windows keyboard accessibility
2015-11-04 15:14:36 +08:00
Cheng Zhao
1ad77da9d6 Merge pull request #3308 from frankenbot/master
Update redirects
2015-11-04 10:08:13 +08:00
Plusb Preco
df5a3d4e68 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-11-04 10:50:33 +09:00
Joao Moreno
7c41f0e0e3 remove kDisableLegacyIntermediateWindow switch set 2015-11-03 16:12:01 -08:00
frankenbot
8c989c4630 Update nodejs url 2015-11-03 09:13:48 -08:00
Cheng Zhao
053cd3dad0 Merge pull request #3309 from atom/app-model-id
Fix a few problems around Application User Model ID
2015-11-03 17:58:03 +08:00
Cheng Zhao
1b165559f5 win: Use electron.app.$1 as default user model id
This is to keep compatibility with old apps that don't set app user
model id explicitly.
2015-11-03 15:50:43 +08:00
Cheng Zhao
726910df39 docs: app.setAppUserModelId 2015-11-03 15:36:44 +08:00
Cheng Zhao
8a3268b70c docs: Add notes for working together with Squirrel 2015-11-03 15:30:54 +08:00
Cheng Zhao
7b47b70c9e Fix building on POSIX 2015-11-03 15:30:37 +08:00
Cheng Zhao
9047f81835 win: Set app user model ID in one place
Fix #3297.
Fix #2573.
2015-11-03 15:09:31 +08:00
Cheng Zhao
7c7a7b96de win: Do not set app user model id by default
When user drags exe file into taskbar directly the pinned icon will not
has an app user model id, so if we set app user model id in the
application two icons will show in the taskbar.

For apps installed with a installer it is not a problem since the
shortcut icon will be created with app user model id, but we should also
keep the ability to make portable apps work out of box.

Fix #3303.
2015-11-03 14:55:43 +08:00
frankenbot
d332f2ab1c Update redirects 2015-11-02 21:16:12 -08:00
Cheng Zhao
9236adfbf5 Translate menu template directly in C++ 2015-11-02 23:31:44 +08:00
Cheng Zhao
56e6b28370 Merge pull request #3288 from deepak1556/flash_context_menu_pathc
browser: handle flash context menu request
2015-11-02 21:20:44 +08:00
Cheng Zhao
f7c0418bd8 Ignore case for type of savePage 2015-11-02 21:19:00 +08:00
Cheng Zhao
4804d6b79b Update native-mate 2015-11-02 21:08:29 +08:00
Cheng Zhao
b5f7c433c6 Merge pull request #3292 from ggamel/patch-2
Update auto-updater.md to improve readability
2015-11-02 20:30:47 +08:00
Cheng Zhao
647a0c4e2b Code cleanup for remote module 2015-11-02 20:28:01 +08:00
Cheng Zhao
88fc4e9d05 Merge pull request #3291 from maxcnunes/better-error-handling
Improve error handling from remote
2015-11-02 19:10:50 +08:00
Cheng Zhao
72d7fb7b8a Merge pull request #3281 from MrSurly/patch-1
Update dialog.md
2015-11-02 19:08:47 +08:00
Cheng Zhao
c763cbe298 Merge pull request #3282 from bureken/master
Replace Mac with OS X
2015-11-02 18:33:27 +08:00
Jesus David Rojas
f7108af36b Spanish translations of the documents 2015-11-02 12:41:42 +08:00
Greg Gamel
d097082baf Update auto-updater.md to improve readability
Fix minor grammatical mistakes, correct sentence structures, and improve readability.
2015-10-31 21:25:07 -05:00
Max Claus Nunes
bbb5aef5d2 Improve error handling from remote
This way copy all properties available in the error object and keep the real stack trace
2015-10-31 21:20:54 -02:00
Eric Poulsen
5b49655d1f Update dialog.md 2015-10-31 16:04:01 -07:00
Robo
c969052f12 browser: handle flash context menu 2015-11-01 01:13:17 +05:30
Paul Betts
6a02586176 Add Windows version of running cmd 2015-10-31 08:57:04 -07:00
Cheng Zhao
cb91d4487b Clean up the code handling renderer callback 2015-10-31 15:00:06 +08:00
Cheng Zhao
323ab92299 Merge pull request #3251 from deepak1556/remote_callback_patch
remote: track listeners on browser side
2015-10-31 14:18:58 +08:00
Jesus David Rojas
db3cd1af36 Translate "Diferencias Técnicas con NW.js" 2015-10-31 14:10:24 +08:00
bureken
a957ea1ed9 Replace Mac with OS X 2015-10-31 05:30:18 +03:00
Eric Poulsen
aa98720356 Update dialog.md
Clarification of showErrorBox behavior on Linux if called before app `ready` event.
2015-10-30 14:46:18 -07:00
Robo
2c59f4567e use webcontents id to identify callbacks 2015-10-30 19:51:19 +05:30
Cheng Zhao
d223faa9f4 Merge pull request #3275 from atom/as-optimize-fs-read-file-sync
Allow v8 to optimize fs.readFileSync
2015-10-30 20:02:34 +08:00
Cheng Zhao
58595a23fe Merge pull request #3278 from michaelzoidl/patch-1
Update autoUpdater api docs
2015-10-30 19:52:03 +08:00
Michael J. Zoidl
95ef73ebc1 Update autoUpdater api docs
The event `quitAndUpdate` event changed to `quitAndInstall`
2015-10-30 12:17:30 +01:00
Antonio Scandurra
9c69877421 Allow v8 to optimize fs.readFileSync 2015-10-30 10:30:27 +01:00
Cheng Zhao
21a7c459d8 Bump v0.34.2 2015-10-30 14:50:57 +08:00
Thomas Johansen
aeeada546f Merge pull request #3272 from sk2/patch-1
fix capital I -> i in isDocumentEdited
2015-10-30 07:41:52 +01:00
Simon Knight
8cd8495df7 fix capital I -> i in isDocumentEdited
Uncaught Exception:
TypeError: mainWindow.IsDocumentEdited is not a function
2015-10-30 16:10:46 +10:30
Cheng Zhao
28fb0d0e92 Merge pull request #3270 from preco21/master
Update as upstream
2015-10-30 10:24:48 +08:00
Robo
3a154ab8ea add line and column values to callback id 2015-10-29 21:21:30 +05:30
Robo
ac4df34ecd create binding to idweakmap 2015-10-29 17:51:56 +05:30
Robo
eae7c840b7 use idweakmap for holding callbacks in browser 2015-10-29 17:51:56 +05:30
Robo
62d15953ff remote: track listeners for browser side 2015-10-29 17:51:56 +05:30
Cheng Zhao
386325915b Merge pull request #3261 from preco21/patch-1
Remove extra spaces
2015-10-29 13:53:02 +08:00
Plusb Preco
72e8660245 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-10-29 14:23:21 +09:00
Plusb Preco
b8cc2e1649 Remove extra spaces 2015-10-29 14:22:00 +09:00
Plusb Preco
c7372f8f93 Update as upstream 2015-10-29 14:18:07 +09:00
Cheng Zhao
917b33dbe7 Small code cleanup 2015-10-29 10:55:08 +08:00
Cheng Zhao
0f89f67a84 Merge pull request #3254 from templateK/master
Fix remove boolean parameter at IsSwitchEnabled function
2015-10-29 10:54:56 +08:00
Cheng Zhao
bf9e6ba11e Merge pull request #3256 from omrilitov/master
Use WPARAM as uint64_t and LPARAM as int64_t
2015-10-29 10:41:11 +08:00
Cheng Zhao
f13a02e4fa Merge pull request #3250 from atom/basic-auth
Add support for basic auth
2015-10-29 10:20:51 +08:00
Omri Litov
ef038257d1 Returns buffer instead of WPARAM and LPARAM 2015-10-29 03:00:44 +02:00
Omri Litov
f22837523f Use WPARAM as uint64_t and LPARAM as int64_t 2015-10-28 21:54:50 +02:00
Omri Litov
2ac40cc28e Added .idea to .gitignore 2015-10-28 21:30:52 +02:00
taemu
16eafdb0ce Fix remove boolean parameter at IsSwitchEnabled function 2015-10-29 03:22:08 +09:00
Jessica Lord
2384c9f493 Merge pull request #3249 from antoinepairet/patch-1
Fix documentation for module types available in the renderer process
2015-10-28 09:58:22 -07:00
Antoine Pairet
4efff08007 Fix comments from @jlord 2015-10-28 17:55:18 +01:00
Antoine Pairet
974b5005bc Update from @jlord 2015-10-28 14:28:30 +01:00
Cheng Zhao
51ba37440d Guard against multiple calls of auth 2015-10-28 21:20:08 +08:00
Cheng Zhao
862c3187f5 docs: login event 2015-10-28 21:14:00 +08:00
Cheng Zhao
569e87035a Also emit "login" on WebContents 2015-10-28 21:00:39 +08:00
Cheng Zhao
f40a3f72d7 Converted callback can only be called for once 2015-10-28 20:44:46 +08:00
Cheng Zhao
4eac6b31b1 Also pass "webContents" in "login" event 2015-10-28 20:23:18 +08:00
Cheng Zhao
131531219e Pass auth_info and request in "login" event 2015-10-28 20:13:06 +08:00
Cheng Zhao
d05255179a Add login event for "app" module 2015-10-28 19:54:59 +08:00
Cheng Zhao
54dad72d92 Don't leak TranslaterHolder 2015-10-28 19:54:59 +08:00
Cheng Zhao
9847747736 Use the callback converter in JsAsker 2015-10-28 19:54:59 +08:00
Cheng Zhao
5d8a31c140 spec: Return early on error 2015-10-28 19:54:59 +08:00
Cheng Zhao
3881ad1c4b Don't leak FunctionTemplate when converting C++ callback 2015-10-28 19:54:59 +08:00
Cheng Zhao
9df89cf79b Add dummy LoginHandler 2015-10-28 19:54:59 +08:00
Cheng Zhao
b86267aa3b Use uint64_t instead of LPARAM
LPARAM is defined to differnt types on differnt machines with different
SDKs, so there is no way to represent it on all platforms safely, using
uint64_t seems to be the only safe choice.
2015-10-28 19:51:24 +08:00
Cheng Zhao
5fd310c75f Add converter for LPARAM 2015-10-28 19:43:05 +08:00
Antoine Pairet
0c5fe03999 Fix module types available in the renderer process
The doc previously stated `only GUI-unrelated` modules are available to the renderer process. I think it should be `only GUI-related`
2015-10-28 11:40:01 +01:00
Cheng Zhao
079796de26 Merge pull request #3247 from matiasinsaurralde/master
+supported-platforms.md (spanish version)
2015-10-28 14:52:30 +08:00
Matias Insaurralde
e90961ac4f Creating supported-platforms.md 2015-10-28 03:19:19 -03:00
Cheng Zhao
c9b53a6e8b Merge pull request #3240 from atom/reland-win-remove-wildcard-extension
Reland win remove wildcard extension
2015-10-27 20:52:43 +08:00
Cheng Zhao
142f380376 Merge pull request #3231 from omrilitov/master
Hooking windows messages
2015-10-27 20:48:19 +08:00
Haojian Wu
f69bafd48a Win: Fix adding '.*' to filename in callback. 2015-10-27 20:15:43 +08:00
Haojian Wu
fa24e15d8b Win: Remove adding '*.*' to file name in a save dialog. 2015-10-27 20:15:20 +08:00
Omri Litov
e355532d27 Change windows messages api to hook instead of emitter 2015-10-27 14:00:08 +02:00
Cheng Zhao
b4d9b92ecb Merge pull request #3236 from atom/mas-fix
Update libchromiumcontent: fix private API call
2015-10-27 15:05:11 +08:00
Cheng Zhao
dacd921a04 Revert "Win: Remove adding default file filter(*.*) in a save dialog."
This reverts commit 00493f64b7.
2015-10-27 14:58:44 +08:00
Cheng Zhao
9b17241f6f Merge pull request #3235 from sitdh/master
Translate docs to Thai
2015-10-27 14:31:01 +08:00
Cheng Zhao
3042f604cc Merge pull request #3234 from atom/win-remove-default-filter
Win: Remove adding default file filter(*.*) in a save dialog.
2015-10-27 14:30:35 +08:00
Cheng Zhao
2a85bd3360 Update libchromiumcontent: fix private API call 2015-10-27 14:25:42 +08:00
Sitdhibong Laokok
f1fad96b56 Fix missing spell 2015-10-27 12:36:43 +07:00
Sitdhibong Laokok
a84f4dc3e6 Remove original msg 2015-10-27 12:20:54 +07:00
Haojian Wu
00493f64b7 Win: Remove adding default file filter(*.*) in a save dialog. 2015-10-27 13:10:34 +08:00
Sitdhibong Laokok
2e3a5f5a3e Translate README.md 2015-10-27 12:09:49 +07:00
Cheng Zhao
d1c5d07451 Merge pull request #3227 from nekuz0r/load-url-headers
Add extra headers option to webContents.loadUrl
2015-10-27 11:37:27 +08:00
Omri Litov
edbebf84b9 Added browser-window event 'message' 2015-10-27 03:12:01 +02:00
Gohy Leandre
b29a8c94b9 Add extra headers option to webContents.loadUrl 2015-10-26 22:18:16 +01:00
Cheng Zhao
65ece4b1ca Merge pull request #3215 from atom/fix-remote-call
Fix calling showItemInFolder in renderer
2015-10-26 17:13:20 +08:00
Cheng Zhao
f399f50e9e Fix calling showItemInFolder in renderer
The remote method always assumes the existence of the remote object but
doesn't keep a reference to it, so if we only keep the reference of a
remote method we will get into troubles once the remote object is
garbage collected.

We should probably fix this in remote module, but since most things are
already working quite good, I'm using the work-around for now.

Fix #3139.
2015-10-26 16:48:27 +08:00
Cheng Zhao
e6f54f447c Merge pull request #3213 from rubixware/source-code-directory-structure-translation
Add source code directory structure spanish translation
2015-10-26 16:17:48 +08:00
Cheng Zhao
adb11225d2 Ship LICENSES.chromium.html in zip archive 2015-10-26 16:16:50 +08:00
Cheng Zhao
c973357752 Merge pull request #3198 from deepak1556/callback_patch
nativemate: use maybe version of v8::Function::call to avoid unhandled exceptions
2015-10-26 16:15:58 +08:00
Everardo Medina
b71ec748ad 📝 Add source code directory structure spanish translation 2015-10-26 00:04:11 -06:00
Robo
70fe169b0f nativemate: use maybe version of v8::Function::Call to avoid exceptions 2015-10-26 10:59:40 +05:30
Cheng Zhao
8976708e67 Merge pull request #3212 from rubixware/coding-style-translation
Add coding style spanish translation
2015-10-26 13:01:37 +08:00
Everardo Medina
da82eaefa7 📝 Add coding style spanish translation 2015-10-25 22:37:06 -06:00
Cheng Zhao
3dd6425592 Merge pull request #3203 from etiktin/patch-1
Update web-contents.md
2015-10-26 10:34:13 +08:00
Cheng Zhao
37240c2235 Merge pull request #3200 from jhen0409/patch-3
Sync zh-TW docs from upstream
2015-10-26 09:19:50 +08:00
Paul Betts
d528704bd6 Merge pull request #3207 from diegowifi/patch-1
Remove english words in description
2015-10-25 13:29:34 -07:00
Diego Ponce
fd94ff97e7 Remove english words in description 2015-10-25 14:04:03 -06:00
Eran Tiktin
9b36abc816 Update web-contents.md
The `did-fail-load` event returns an error code and error description. The error description is at least sometimes empty (e.g. when the error code is -102 on Windows), so you're left with an error code without knowing what happened. So I add a link to Chromium's net_error_list.h.
2015-10-25 17:00:29 +02:00
Jhen
8e5c1a505e Update tutorial/quick-start.md for zh-TW docs 2015-10-25 01:34:17 +08:00
Cheng Zhao
2effe6eff5 Merge pull request #3192 from preco21/master
Update as upstream
2015-10-24 15:46:59 +08:00
Plusb Preco
8555aea40f Update as upstream 2015-10-24 05:57:37 +09:00
Cheng Zhao
30ec7fdeed Bump v0.34.1 2015-10-23 20:32:02 +08:00
Cheng Zhao
0e3e1be85c Merge pull request #3186 from atom/auto-updater-fix
Clean up the code of auto-updater
2015-10-23 20:31:20 +08:00
Cheng Zhao
df9ea104c2 Merge pull request #3188 from alexandrubau/master
Updated docs
2015-10-23 20:13:00 +08:00
Cheng Zhao
88b05cff3e docs: auto-updater on Windows 2015-10-23 20:11:59 +08:00
Cheng Zhao
fae2c7bc7a win: Make auto-updater really work
Apparently that PR was never tested.
2015-10-23 19:41:54 +08:00
Alexandru Bau
96130dd4c2 Updated docs
Updated docs to better understand how to use electron-rebuild on all
platforms
2015-10-23 14:15:39 +03:00
Alexandru Bau
79e593aca6 Updated docs
Updated docs to better understand how to use electron-rebuild on Windows
2015-10-23 11:37:51 +03:00
Cheng Zhao
aeafc46ded Keep compatibility with old API style 2015-10-23 15:50:55 +08:00
Cheng Zhao
f89d28a63e Simplify the auto-updater implementations
We used to use Sparkle on OS X, and the design was reserved to be
extended to all platforms, which are all wrong now.
2015-10-23 15:40:56 +08:00
Cheng Zhao
d74ef5c078 Move implementation of auto-updater on OS X to another file 2015-10-23 15:13:24 +08:00
Cheng Zhao
85c84a0eb0 Emit Date object in C++ directly 2015-10-23 14:58:19 +08:00
Cheng Zhao
a3f62da615 Fix passing Date object in remote
Close #2017.
2015-10-23 14:51:41 +08:00
Cheng Zhao
95fe4beda8 Pass real Error object in error event 2015-10-23 14:37:35 +08:00
Cheng Zhao
d5c964c68c Fix passing Error object in remote
Closes #3089
2015-10-23 14:37:28 +08:00
Cheng Zhao
07adbc8e8a Merge pull request #1984 from patrickdet/windows-auto-updater
Windows Auto Updater
2015-10-23 13:54:29 +08:00
Cheng Zhao
90e3f726e4 Merge pull request #3184 from atom/windows-background-color
Make background-color work on Windows
2015-10-23 13:53:12 +08:00
Cheng Zhao
83ef23ff8d docs: background-color on Windows 2015-10-23 13:32:04 +08:00
Cheng Zhao
e36d455d51 Add setBackgroundColor method 2015-10-23 11:35:33 +08:00
Cheng Zhao
4a6134f3f7 win: Set native window's background color 2015-10-23 11:17:14 +08:00
Cheng Zhao
6182e4ce81 Merge pull request #3179 from deepak1556/session_api_patch
session: allow setproxy to use external pac script
2015-10-23 10:36:37 +08:00
Cheng Zhao
79d4d52172 Merge pull request #3178 from deepak1556/node_debugger_patch
debugger: expose v8debug
2015-10-23 10:36:06 +08:00
Cheng Zhao
e3ce1b50ec Merge pull request #3175 from atom/improve-make-single-instance
Fix some problems of makeSingleInstance
2015-10-23 09:13:57 +08:00
Robo
e9a5d05b27 session: allow setproxy to use external pac script 2015-10-22 23:03:47 +05:30
Cheng Zhao
61f07307cb docs: New behaviors of makeSingleInstance 2015-10-22 19:26:05 +08:00
Cheng Zhao
6bfe06ec4e Pass original argv in callback 2015-10-22 19:02:21 +08:00
Robo
7b5a1b06ba debugger: expose v8debug 2015-10-22 16:20:48 +05:30
Cheng Zhao
d52ef50b01 win: Pass original command line 2015-10-22 17:52:06 +08:00
Cheng Zhao
93a3a946f3 posix: Pass original command line 2015-10-22 17:43:55 +08:00
Cheng Zhao
afc1fff792 Remove the need for ProcessSingletonStartupLock 2015-10-22 17:12:09 +08:00
Cheng Zhao
70e74d05e0 Revert "app.makeSingleInstance is not available on OS X"
This reverts commit bcb78ebc00.
2015-10-22 17:03:18 +08:00
Cheng Zhao
f9d797d1ea win: Fix compiler warning 2015-10-22 16:55:54 +08:00
Cheng Zhao
e14fd62f46 Correctly handle notification callback when shutting down
When returning false in the notification callback the ProcessSingleton
will assume current process is quitting, we should met its expectation.
2015-10-22 16:24:35 +08:00
Cheng Zhao
ca876e424b Fix crash when calling app.quit() before app is ready 2015-10-22 16:06:37 +08:00
Cheng Zhao
230f2760e7 linux: Delay creating watcher until message loop is ready 2015-10-22 15:57:37 +08:00
Cheng Zhao
f01e84a418 linux: Delay listening to socket until message loop is ready 2015-10-22 15:54:58 +08:00
Cheng Zhao
05c6300329 Don't discard tasks in BridgeTaskRunner 2015-10-22 15:54:27 +08:00
Cheng Zhao
bcb78ebc00 app.makeSingleInstance is not available on OS X 2015-10-22 15:02:32 +08:00
Cheng Zhao
310954713f Simplify the usage of singleton 2015-10-22 14:59:12 +08:00
Cheng Zhao
acb2c099f6 Make sure current task runner is available
When calling makeSingleInstance we have to ensure current task runnder
is available, otherwise crash may happen.
2015-10-22 14:56:57 +08:00
Cheng Zhao
63cc2ec369 docs: Make code more JS-style 2015-10-22 14:24:09 +08:00
Cheng Zhao
04d3eed60e Merge pull request #3145 from atom/single-instance
Implement Single-Instance for Windows / Linux
2015-10-22 14:18:31 +08:00
Cheng Zhao
f7840e7379 docs: background-color is Linux-only for now 2015-10-22 14:16:17 +08:00
Cheng Zhao
15e0248d82 Merge pull request #3168 from deepak1556/window_background_color_patch
browser: option to set window background color
2015-10-22 14:13:37 +08:00
Robo
9411508d3e browser: option to set window background color 2015-10-22 09:54:29 +05:30
Cheng Zhao
f5659cd9a9 Merge pull request #3173 from tommoor/patch-5
Update crash-reporter.md
2015-10-22 11:10:30 +08:00
Cheng Zhao
803b3c8d5b Merge pull request #3172 from thomasjfox1/master
quick fix removing excess character
2015-10-22 11:08:30 +08:00
Tom Moor
bac3d2e372 Update crash-reporter.md 2015-10-21 17:07:36 -07:00
Paul Betts
759b6a1534 📝 for makeSingleInstance 2015-10-21 13:52:17 -07:00
Paul Betts
de66888051 Remove atom_process_singleton, just use the Chrome classes directly 2015-10-21 13:38:39 -07:00
Paul Betts
d020a7dc86 cpplinting 2015-10-21 13:17:56 -07:00
Paul Betts
938d68eb36 Move all the browser.cc code over to atom_api_app.cc 2015-10-21 13:04:50 -07:00
Thomas J Fox
b61c2e6ff7 quick fix removing excess character 2015-10-21 15:03:12 -05:00
Paul Betts
658a9872fb Only cleanup if we are the main process 2015-10-21 12:29:21 -07:00
Paul Betts
a160891a27 If a user calls makeSingleInstance more than once, just ignore it 2015-10-21 12:29:00 -07:00
Plusb Preco
acbd7d7541 Update as upstream 2015-10-22 03:36:14 +09:00
Paul Betts
38d6ff79c8 Need to free this early or get a SIGSEGV on Linux 2015-10-21 11:06:42 -07:00
Plusb Preco
bca88c1fb9 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-10-22 02:58:07 +09:00
Cheng Zhao
73f4aa1113 Merge pull request #3169 from atom/fix-node-buffer
Fix memory corruption when cleaning timer
2015-10-21 21:23:25 +08:00
Cheng Zhao
444f461269 Fix memory corruption when cleaning timer 2015-10-21 20:46:16 +08:00
Cheng Zhao
2d410ede48 Initialize things in the same sequence with main process 2015-10-21 16:24:54 +08:00
Cheng Zhao
ed9579a2f7 Merge pull request #3165 from roadev/master
Grammatical corrections for spanish translations at api, styleguide a…
2015-10-21 13:28:48 +08:00
Cheng Zhao
567d8e7434 Merge pull request #3163 from atom/fix-osx-app-region
osx: Implement draggable region with mouseDownCanMoveWindow
2015-10-21 09:53:02 +08:00
Cheng Zhao
d092c6acc9 osx: Implement draggable region with mouseDownCanMoveWindow
Previously we implemented draggable region by tracking mouse position,
it is buggy and causing some problems. But it is interesting that until
this didn't cause troubles until recently.
2015-10-21 08:54:46 +08:00
Paul Betts
99c496471b Allow WM_COPYDATA from all processes 2015-10-20 17:36:05 -07:00
Paul Betts
e5094fff3e Since setting up process_singleton is now conditional, its cleanup / unlock must be too 2015-10-20 17:27:28 -07:00
Juan Roa
fe25f3e747 grammatical corrections for spanish translations at api, styleguide and README 2015-10-20 18:10:08 -05:00
Cheng Zhao
b6859cab91 Merge pull request #3158 from ngoldman/patch-1
use webContents.openDevTools for quick start guide
2015-10-21 06:58:16 +08:00
Cheng Zhao
26d922d18d Merge pull request #3156 from preco21/master
Update as upstream
2015-10-21 06:52:10 +08:00
Paul Betts
15f00db1bf I don't think we need this 2015-10-20 15:03:59 -07:00
Paul Betts
4a7a09aae1 Infinite Linting 2015-10-20 15:00:10 -07:00
Paul Betts
f759471e01 Update to use Chromium sources 2015-10-20 14:36:01 -07:00
Paul Betts
4bc54ac5e3 Fix up filenames to include Chrome source 2015-10-20 14:33:34 -07:00
Paul Betts
5886398f22 Port our changes over 2015-10-20 14:24:45 -07:00
Paul Betts
7491d5cfb5 Copy back the original versions of Chromium files in 2015-10-20 14:05:07 -07:00
Paul Betts
b6f1729acd Move initialization of Single Instance into MakeSingleInstance call 2015-10-20 13:38:57 -07:00
Paul Betts
5d4c29a1e3 Ditch double-callback, just use mate directly 2015-10-20 13:27:34 -07:00
Paul Betts
a2eedcc027 Wire up the final callback to JS 2015-10-20 13:17:26 -07:00
Paul Betts
63417bc975 I am not good at C++ at all 2015-10-20 13:17:25 -07:00
Paul Betts
4a4b829cfc Fix callback handle usage 2015-10-20 13:17:25 -07:00
Paul Betts
50fab0733b At Browser ctor time, DIR_USER_DATA is unset, wait 2015-10-20 13:16:49 -07:00
Paul Betts
b02f89e63b Typo 2015-10-20 13:16:49 -07:00
Paul Betts
cdd51fa96d Wire everything up 2015-10-20 13:16:48 -07:00
Paul Betts
c38f2fcf75 Add a native mate converter for command lines 2015-10-20 13:15:12 -07:00
Paul Betts
7491ae4000 Set up Browser to create the process singleton 2015-10-20 13:15:12 -07:00
Paul Betts
4d5495a0a0 Bring in chrome_process_singleton but nuke the active dialog bits 2015-10-20 13:15:11 -07:00
Paul Betts
717aba9631 Create a dummy method in app that we'll twerk 2015-10-20 13:15:11 -07:00
Paul Betts
8288a22458 Fix build against old OneShotTimer 2015-10-20 13:14:08 -07:00
Paul Betts
88dd1480cc Get POSIX mostly compiling 2015-10-20 13:14:08 -07:00
Paul Betts
c46579b1ac Remove a bunch of stuff we don't need in process_singleton_win 2015-10-20 13:14:07 -07:00
Paul Betts
1b3363c811 Get process finder working 2015-10-20 13:14:07 -07:00
Paul Betts
daa65a138b Come Correct with headers 2015-10-20 13:14:06 -07:00
Paul Betts
d3b23a2032 Renames to avoid confusion, add file 2015-10-20 13:14:06 -07:00
Paul Betts
05b22b9372 Import process_finder verbatim 2015-10-20 13:14:05 -07:00
Paul Betts
ff2d9759d5 Start to remove / rearrange some header files 2015-10-20 13:14:05 -07:00
Paul Betts
90b997ef08 Add the files to filenames.gypi 2015-10-20 13:14:05 -07:00
Paul Betts
27fa5d880a Copy some relevant files over from Chromium 2015-10-20 13:14:04 -07:00
Paul Betts
285a4789b3 Update app.md 2015-10-20 12:35:56 -07:00
Nate Goldman
da7161d5a7 use webContents.openDevTools
https://github.com/atom/electron/issues/3125#issuecomment-148975593
2015-10-20 10:44:02 -07:00
Patrick Detlefsen
db3bc28937 PR feedback adressed 2015-10-20 19:25:03 +02:00
Jessica Lord
a0e2af6fac Merge pull request #3157 from IonicaBizauKitchen/doc-improvements
Doc improvements
2015-10-20 10:20:11 -07:00
Ionică Bizău
1ad979f9bd Add some missing words ("be" and "the") 2015-10-20 19:44:01 +03:00
Plusb Preco
f7a9b02c63 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-10-21 00:26:30 +09:00
Plusb Preco
7a0db35d91 Update as upstream 2015-10-21 00:25:24 +09:00
Cheng Zhao
c928894627 docs: app.allowNTLMCredentialsForAllDomains 2015-10-20 13:56:31 +08:00
Cheng Zhao
a7a399dcd8 Code cleanup 2015-10-20 13:52:39 +08:00
Cheng Zhao
14e2bbe4c7 Update brightray for #3120 2015-10-20 13:50:19 +08:00
Cheng Zhao
370cb5b5e1 Merge pull request #3120 from atom/ntlm-part-two
Optionally allow NTLM authentication for all domains
2015-10-20 13:48:12 +08:00
Cheng Zhao
78261973fb Merge pull request #3153 from atom/development-env
Add a few environment variables helpful for debugging
2015-10-20 13:47:17 +08:00
Cheng Zhao
be36a17dbf docs: Mention the ELECTRON_ENABLE_LOGGING env 2015-10-20 13:06:41 +08:00
Cheng Zhao
fb8ca33d5d Add ELECTRON_ENABLE_STACK_DUMPING env
It enables in-process stack dumping, which is convenient for debugging.
2015-10-20 13:02:48 +08:00
Cheng Zhao
2c4a24d26b Add ELECTRON_ENABLE_LOGGING env
It is the same with --enable-logging.
2015-10-20 13:00:28 +08:00
Cheng Zhao
4005e65e28 Merge pull request #3150 from atom/jl-upadate-qs
Update Quick Start HTML
2015-10-20 11:17:30 +08:00
Cheng Zhao
86327fb4bb Merge pull request #3149 from atom/jl-add-quick-start-repo
Add links to electron-quick-start Repository
2015-10-20 11:17:23 +08:00
Cheng Zhao
5a46147e9b Update brightray for atom/brightray#158 2015-10-20 10:34:33 +08:00
Cheng Zhao
bb8bb3dbea Merge pull request #3147 from deepak1556/cipher_suite_disable_patch
browser: flag to disable specified cipher suites
2015-10-20 10:29:49 +08:00
Jessica Lord
d09b09b744 Match the electron-quick-start repo 2015-10-19 16:37:18 -07:00
Jessica Lord
bc7c7da799 Add links to electron-quick-start 2015-10-19 15:52:02 -07:00
Robo
9f8479e9d8 browser: flag to diable specified cipher suites 2015-10-20 02:51:56 +05:30
Paul Betts
e3535d664b Fixed linter issues but now the code looks awful 2015-10-19 13:12:17 -07:00
Paul Betts
b3c7e2bf33 Plumb the method back 2015-10-19 13:07:14 -07:00
Paul Betts
489090fcf8 Set up our browser context to use new delegate-based API 2015-10-19 13:03:20 -07:00
Cheng Zhao
0afefe13f6 Merge pull request #3141 from jhen0409/patch-2
Sync recently updated docs to zh-TW docs-translations
2015-10-19 22:09:06 +08:00
Jhen
7f15d63552 Update README.md for zh-TW docs-translations 2015-10-19 21:54:29 +08:00
Jhen
09ee24514e Replace Mac with OS X for zh-TW docs translation 2015-10-19 21:49:57 +08:00
Jhen
d9c7401d0b Replace io.js with node.js for zh-TW docs translation 2015-10-19 21:29:10 +08:00
Cheng Zhao
de3e16ce60 Merge pull request #3129 from brandoncash/fix-tray-notify-typo
Fix: tray NotfiyDropFiles typo
2015-10-19 19:11:26 +08:00
Cheng Zhao
72e0da069c Merge pull request #3132 from princejwesley/issue-readFileSync
Fix: honor fs.readFileSync contract for empty packed asar file
2015-10-19 16:59:47 +08:00
Cheng Zhao
0d9e0a38c0 Merge pull request #3128 from atom/fix-save-page-position
Fix: 'savePage API' saves external resources in a wrong directory.
2015-10-19 16:40:45 +08:00
Prince J Wesley
810af2f95d 🐛 Honor fs.readFileSync contract for empty packed asar file 2015-10-19 08:43:50 +05:30
Plusb Preco
0aefa98e5a Small fix in README 2015-10-19 11:34:13 +09:00
Cheng Zhao
0e50b00fdf Merge pull request #3111 from preco21/master
Add app.md translation into ko-KR, some fixes
2015-10-18 21:45:25 +08:00
Brandon Cash
60b14d03e9 Fix: tray NotfiyDropFiles typo 2015-10-18 00:32:13 -05:00
Haojian Wu
49d25d0069 Fix: savePage API saves external resources in a wrong directory. 2015-10-18 11:28:05 +08:00
Plusb Preco
82e6058607 Update as upstream 2015-10-18 03:30:37 +09:00
Plusb Preco
c46ed897dd Update translation progress in README.md 2015-10-18 03:22:35 +09:00
Ivan Žužak
c7d9352972 Merge pull request #3118 from learningjs/thcm
[Tiny correction of misspelling]
2015-10-17 10:10:06 +02:00
Jessica Lord
cd2f924db8 Merge pull request #3117 from ggamel/patch-1
Update MAS tutorial to improve readability
2015-10-16 17:56:32 -07:00
Paul Betts
b958982d99 Rollback submodule change 2015-10-16 17:00:31 -07:00
Paul Betts
a3fc25110e Linter fixes 2015-10-16 16:55:28 -07:00
Paul Betts
5ae6bd2ef4 Wire it up 2015-10-16 16:46:05 -07:00
Paul Betts
7ac643d5f8 Create a new method on App to override URL Security Manager's decisions wrt NTLM 2015-10-16 16:45:54 -07:00
Greg Gamel
5e7a30deea Additional updates to adhere to styleguide
Per @jlord's recommendations.
2015-10-16 18:25:30 -05:00
max_devjs
72078f7b02 [truly humble correction of a misspelling]
Substituting webp with web in frameless-window.md .
2015-10-16 19:56:45 -03:00
Greg Gamel
b5478eaef7 Update MAS tutorial to improve readability
Adjusted tutorial body copy and headings to improve readability, clarify sentences, and fix some (minor) grammatical missteps.
2015-10-16 17:50:41 -05:00
Jessica Lord
1ae4be7571 Merge pull request #3115 from romankl/doc-osx
replace Mac with OS X
2015-10-16 14:21:54 -07:00
Roman Klauke
32523ae352 replace Mac with OS X
Commit 691d8dd replaced "Mac" with "OS X". This commit replaces some
other occurrences.
2015-10-16 22:03:47 +02:00
Eran Tiktin
f0c4c806b5 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-10-16 22:30:18 +03:00
Plusb Preco
c0ee8f4e60 Merge remote-tracking branch 'refs/remotes/atom/master' 2015-10-16 22:36:01 +09:00
Plusb Preco
edd6032ed0 Improve grammar for more readability 2015-10-16 22:26:27 +09:00
Plusb Preco
f05fc3c0ea Improve grammar, some fixes
* Improve grammar
* Fix typos
* Fix some mistranslations
* Fix quotes (' to `)
2015-10-16 22:23:31 +09:00
Cheng Zhao
f0825bf7ef Merge pull request #3109 from fplucas/master
Translation of debugging-main-process to pt-br.
2015-10-16 20:28:34 +08:00
Cheng Zhao
d9fdfb711f Clean up CallbackRegistry
There were some ancient code there.
2015-10-16 20:25:30 +08:00
Cheng Zhao
94f64c755d spec: Load url after event listener is set up 2015-10-16 20:22:04 +08:00
Cheng Zhao
4871ea715c Merge pull request #3103 from bengotow/bengotow/debug-release
Allow "released callback" errors to be traced to remote calls
2015-10-16 20:21:46 +08:00
Cheng Zhao
115bb31ab4 docs: Small fix on mas guide 2015-10-16 20:21:06 +08:00
Lucas
2725068a0c Updating README.md 2015-10-16 09:11:30 -03:00
Lucas Pugliesi
5e5caf2e86 Translation of debugging-main-process to pt-br. 2015-10-16 09:09:24 -03:00
Cheng Zhao
22e9c2f4eb Bump v0.34.0 2015-10-16 18:53:25 +08:00
Cheng Zhao
c371c713a9 Merge pull request #3108 from atom/mas-build
Prepare for MAS build and add a guide
2015-10-16 18:51:45 +08:00
Cheng Zhao
18fd126c64 docs: Mac App Store Submission Guide 2015-10-16 17:16:12 +08:00
Cheng Zhao
7bdbe45c91 subpixel-font-scaling option is removed 2015-10-16 15:01:28 +08:00
Cheng Zhao
fb99e72484 Update libchromiumcontent to have mas build 2015-10-16 15:01:28 +08:00
Ben Gotow
aeb24b784d Allow "released callback" errors to be traced to remote calls 2015-10-15 18:46:59 -07:00
Plusb Preco
b61baacfe1 Merge pull request #1 from ibocon/translateIntoKR
Add `app.md` translation
2015-10-15 07:59:25 +09:00
Yegun Kim
79311af8eb translate "/docs-translations/ko-KR/api/app.md" 2015-10-15 16:26:24 -05:00
Plusb Preco
af8049941e Update as upstream 2015-10-13 20:53:04 +09:00
Patrick Detlefsen
6c4016af46 make sure the query params are stripped from the updateUrl 2015-06-22 15:51:47 +02:00
Patrick Detlefsen
154ca8575c limit the auto-updater-win api to very few methods 2015-06-22 15:33:08 +02:00
Patrick Detlefsen
ae5411c37b move squirrel bahaviour into proper place 2015-06-22 15:17:07 +02:00
Patrick Detlefsen
62882fe49e auto updater win is an EventEmitter already 2015-06-16 16:13:23 +02:00
Patrick Detlefsen
a8469fc79d auto-updater extends event-emitter 2015-06-16 12:31:55 +02:00
Patrick Detlefsen
7aa60baafb switch statement coffee else instead of default 2015-06-16 11:48:39 +02:00
Patrick Detlefsen
99f352228c addresses suggestions from pull-request 2015-06-16 11:04:37 +02:00
Patrick Detlefsen
621178f558 initial idea 2015-06-15 20:28:47 +02:00
389 changed files with 14620 additions and 3686 deletions

2
.gitignore vendored
View File

@@ -1,4 +1,6 @@
.DS_Store
.tags*
/.idea/
/build/
/dist/
/external_binaries/

24
CODE_OF_CONDUCT.md Normal file
View File

@@ -0,0 +1,24 @@
# Contributor Code of Conduct
As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities.
We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality.
Examples of unacceptable behavior by participants include:
- The use of sexualized language or imagery
- Personal attacks
- Trolling or insulting/derogatory comments
- Public or private harassment
- Publishing other's private information, such as physical or electronic addresses, without explicit permission
- Other unethical or unprofessional conduct
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team.
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community.
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting a project maintainer at [atom@github.com](mailto:atom@github.com). All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. Maintainers are obligated to maintain confidentiality with regard to the reporter of an incident.
This Code of Conduct is adapted from the Contributor Covenant, version 1.3.0, available from http://contributor-covenant.org/version/1/3/0/

80
CONTRIBUTING-ko.md Normal file
View File

@@ -0,0 +1,80 @@
# Electron에 기여하기
:+1::tada: 먼저, 이 프로젝트에 기여해주셔서 감사합니다! :tada::+1:
이 프로젝트는 기여자 규약 [행동강령](CODE_OF_CONDUCT.md)을 준수합니다. 따라서 이
프로젝트의 개발에 참여하려면 이 규약을 지켜야 합니다. 받아들일 수 없는 행위를 발견했을
경우 atom@github.com로 보고 하십시오.
다음 항목들은 Electron에 기여하는 가이드라인을 제시합니다.
참고로 이 항목들은 그저 가이드라인에 불과하며 규칙이 아닙니다. 따라서 스스로의 적절한
판단에 따라 이 문서의 변경을 제안할 수 있으며 변경시 pull request를 넣으면 됩니다.
## 이슈 제출
* [여기](https://github.com/atom/electron/issues/new)에서 새로운 이슈를 만들 수
있습니다. 하지만 이슈를 작성하기 전에 아래의 항목들을 숙지하고 가능한한 이슈 보고에
대해 최대한 많은 정보와 자세한 설명을 포함해야 합니다. 가능하다면 다음 항목을 포함해야
합니다:
* 사용하고 있는 Electron의 버전
* 현재 사용중인 운영체제
* 가능하다면 무엇을 하려고 했고, 어떤 결과를 예측했으며, 어떤 것이 예측된대로
작동하지 않았는지에 대해 서술해야 합니다.
* 추가로 다음 사항을 준수하면 이슈를 해결하는데 큰 도움이 됩니다:
* 스크린샷 또는 GIF 애니메이션 이미지들
* 터미널에 출력된 에러의 내용 또는 개발자 도구, 알림창에 뜬 내용
* [Cursory search](https://github.com/atom/electron/issues?utf8=✓&q=is%3Aissue+)를
통해 이미 비슷한 내용의 이슈가 등록되어있는지 확인
## Pull Request 하기
* 가능한한 스크린샷과 GIF 애니메이션 이미지를 pull request에 추가
* CoffeeScript, JavaScript, C++과 Python등
[참조문서에 정의된 코딩스타일](/docs-translations/ko-KR/development/coding-style.md)을
준수
* [문서 스타일 가이드](/docs-translations/ko-KR/styleguide.md)에 따라 문서를
[Markdown](https://daringfireball.net/projects/markdown) 형식으로 작성.
* 짧은, 현재 시제 커밋 메시지 사용. [커밋 메시지 스타일 가이드](#Git-커밋-메시지)를
참고하세요
## 스타일 가이드
### 공통 코드
* 파일 마지막에 공백 라인(newline) 추가
* 다음 순서에 맞춰서 require 코드 작성:
* Node 빌트인 모듈 (`path` 같은)
* Electron 모듈 (`ipc`, `app` 같은)
* 로컬 모듈 (상대 경로상에 있는)
* 다음 순서에 맞춰서 클래스 속성 지정:
* 클래스 메서드와 속성 (메서드는 `@`로 시작)
* 인스턴스 메서드와 속성
* 플랫폼 종속적인 코드 자제:
* 파일 이름 결합시 `path.join()`을 사용.
* 임시 디렉터리가 필요할 땐 `/tmp` 대신 `os.tmpdir()`을 통해 접근.
* 명시적인 함수 종료가 필요할 땐 `return` 만 사용.
* `return null`, `return undefined`, `null`, 또는 `undefined` 사용 X
### Git 커밋 메시지
* 현재 시제 사용 ("Added feature" 대신 "Add feature" 사용)
* 필수적 분위기(imperative mood) 사용 ("Moves cursor to..." 대신 "Move cursor to..." 사용)
* 첫 줄은 72자에 맞추거나 그 보다 적게 제한
* 자유롭게 필요에 따라 이슈나 PR링크를 참조
* 단순한 문서 변경일 경우 `[ci skip]`을 커밋 메시지에 추가
* 커밋 메시지의 도입부에 의미있는 이모티콘 사용:
* :art: `:art:` 코드의 포맷이나 구조를 개선(추가)했을 때
* :racehorse: `:racehorse:` 성능을 개선했을 때
* :non-potable_water: `:non-potable_water:` 메모리 누수를 연결했을 때
* :memo: `:memo:` 문서를 작성했을 때
* :penguin: `:penguin:` Linux에 대한 패치를 했을 때
* :apple: `:apple:` Mac OS에 대한 패치를 했을 때
* :checkered_flag: `:checkered_flag:` Windows에 대한 패치를 했을 때
* :bug: `:bug:` 버그를 고쳤을 때
* :fire: `:fire:` 코드 또는 파일을 삭제했을 때
* :green_heart: `:green_heart:` CI 빌드를 고쳤을 때
* :white_check_mark: `:white_check_mark:` 테스트를 추가했을 때
* :lock: `:lock:` 보안 문제를 해결했을 때
* :arrow_up: `:arrow_up:` 종속성 라이브러리를 업데이트 했을 때
* :arrow_down: `:arrow_down:` 종속성 라이브러리를 다운그레이드 했을 때
* :shirt: `:shirt:` linter(코드 검사기)의 경고를 제거했을 때

View File

@@ -2,8 +2,9 @@
:+1::tada: First off, thanks for taking the time to contribute! :tada::+1:
This project adheres to the [Contributor Covenant 1.2](http://contributor-covenant.org/version/1/2/0).
By participating, you are expected to uphold this code. Please report unacceptable behavior to atom@github.com.
This project adheres to the Contributor Covenant [code of conduct](CODE_OF_CONDUCT.md).
By participating, you are expected to uphold this code. Please report unacceptable
behavior to atom@github.com.
The following is a set of guidelines for contributing to Electron.
These are just guidelines, not rules, use your best judgment and feel free to
@@ -57,6 +58,7 @@ possible with your report. If you can, please include:
* Use the imperative mood ("Move cursor to..." not "Moves cursor to...")
* Limit the first line to 72 characters or less
* Reference issues and pull requests liberally
* When only changing documentation, include `[ci skip]` in the commit description
* Consider starting the commit message with an applicable emoji:
* :art: `:art:` when improving the format/structure of the code
* :racehorse: `:racehorse:` when improving performance

View File

@@ -8,18 +8,26 @@
:zap: *프레임워크 이름이 Atom Shell에서 Electron으로 변경되었습니다* :zap:
Electron 프레임워크는 JavaScript, HTML 그리고 CSS를 사용하여 Cross-Platform 데스크톱 어플리케이션을 개발할 수 있도록 해주는 프레임워크입니다. 이 프레임워크는 [Node.js](https://nodejs.org) 와
[Chromium](http://www.chromium.org)을 기반으로 만들어 졌으며 [Atom Editor](https://github.com/atom/atom)에 사용되고 있습니다.
Electron 프레임워크는 JavaScript, HTML 그리고 CSS를 사용하여
Cross-Platform 데스크톱 어플리케이션을 개발할 수 있도록 해주는 프레임워크입니다.
[Node.js](https://nodejs.org/)와 [Chromium](http://www.chromium.org)을 기반으로
만들어졌으며 [Atom Editor](https://github.com/atom/atom)에 사용되고 있습니다.
Electron에 대한 중요한 알림을 받고 싶다면 Twitter에서 [@ElectronJS](https://twitter.com/electronjs)를 팔로우 하세요.
Electron에 대한 중요한 알림을 받고 싶다면 Twitter에서
[@ElectronJS](https://twitter.com/electronjs)를 팔로우 하세요.
이 프로젝트는 기여자 규약 1.2를 준수합니다. 이 프로젝트에 참여할 때 코드를 유지해야 합니다. 받아들일 수 없는 행동은 atom@github.com로 보고 하십시오.
이 프로젝트는 기여자 규약 [행동강령](CODE_OF_CONDUCT.md)을 준수합니다. 따라서 이
프로젝트의 개발에 참여하려면 이 규약을 지켜야 합니다. 받아들일 수 없는 행위를 발견했을
경우 atom@github.com로 보고 하십시오.
## 다운로드
Linux, Windows, Mac용으로 미리 빌드된 Electron 바이너리와 디버그 심볼이 준비되어 있습니다. [releases](https://github.com/atom/electron/releases) 페이지에서 받아 볼 수 있습니다.
Linux, Windows, OS X 용으로 미리 빌드된 Electron 바이너리와 디버그 심볼이 준비되어
있습니다. [releases](https://github.com/atom/electron/releases) 페이지에서 받아 볼
수 있습니다.
또한 [`npm`](https://docs.npmjs.com/)을 통해 미리 빌드된 Electron 바이너리를 받을 수도 있습니다:
또한 [`npm`](https://docs.npmjs.com/)을 통해 미리 빌드된 Electron 바이너리를 설치할
수도 있습니다:
```sh
# $PATH에 `electron` 커맨드를 등록하고 전역에 설치합니다.
@@ -35,8 +43,9 @@ npm install electron-prebuilt --save-dev
## 참조 문서
[Docs](https://github.com/atom/electron/tree/master/docs/README.md)에 개발 가이드와 API 레퍼런스가 있습니다.
Electron을 빌드 하는 방법과 프로젝트에 기여하는 방법도 문서에 포함되어 있으니 참고하시기 바랍니다.
[Docs](https://github.com/atom/electron/tree/master/docs/README.md)에 개발 지침과
API 레퍼런스가 있습니다. Electron을 빌드 하는 방법과 프로젝트에 기여하는법 또한 문서에
포함되어 있으니 참고하시기 바랍니다.
## 참조 문서 (번역)
@@ -47,12 +56,19 @@ Electron을 빌드 하는 방법과 프로젝트에 기여하는 방법도 문
- [중국어 간체](https://github.com/atom/electron/tree/master/docs-translations/zh-CN)
- [중국어 번체](https://github.com/atom/electron/tree/master/docs-translations/zh-TW)
## 시작하기
[`atom/electron-quick-start`](https://github.com/atom/electron-quick-start)
저장소를 클론하여 Electron을 간단히 접해볼 수 있습니다.
## 커뮤니티
다음 링크를 통해 커뮤니티에 질문을 올리거나 토론을 나누실 수 있습니다:
다음 링크를 통해 커뮤니티에 질문을 올리거나 토론을 나 수 있습니다:
- Atom 포럼의 [`electron`](http://discuss.atom.io/category/electron) 카테고리
- Freenode 채팅의 `#atom-shell` 채널
- Atom 포럼의 [`electron`](http://discuss.atom.io/c/electron) 카테고리
- Freenode 채팅의 `#atom-shell` 채널
- Slack의 [`Atom`](http://atom-slack.herokuapp.com/) 채널
[awesome-electron](https://github.com/sindresorhus/awesome-electron) 프로젝트엔 커뮤니티가 운영중인 유용한 예제 어플리케이션과 도구, 리소스가 있으니 한번 참고해 보시기 바랍니다.
[awesome-electron](https://github.com/sindresorhus/awesome-electron) 프로젝트
커뮤니티가 운영중인 유용한 예제 어플리케이션과 도구, 리소스가 있으니 한번 참고해 보시기
바랍니다.

View File

@@ -7,20 +7,20 @@
:zap: *Formerly known as Atom Shell* :zap:
The Electron framework lets you write cross-platform desktop applications
using JavaScript, HTML and CSS. It is based on [Node.js](https://nodejs.org) and
using JavaScript, HTML and CSS. It is based on [Node.js](https://nodejs.org/) and
[Chromium](http://www.chromium.org) and is used in the [Atom
editor](https://github.com/atom/atom).
Follow [@ElectronJS](https://twitter.com/electronjs) on Twitter for important
announcements.
This project adheres to the [Contributor Covenant 1.2](http://contributor-covenant.org/version/1/2/0).
By participating, you are expected to uphold this code. Please report
unacceptable behavior to atom@github.com.
This project adheres to the Contributor Covenant [code of conduct](CODE_OF_CONDUCT.md).
By participating, you are expected to uphold this code. Please report unacceptable
behavior to atom@github.com.
## Downloads
Prebuilt binaries and debug symbols of Electron for Linux, Windows and Mac can
Prebuilt binaries and debug symbols of Electron for Linux, Windows and OS X can
be found on the [releases](https://github.com/atom/electron/releases) page.
You can also use [`npm`](https://docs.npmjs.com/) to install prebuilt electron
@@ -52,15 +52,22 @@ contains documents describing how to build and contribute to Electron.
- [Spanish](https://github.com/atom/electron/tree/master/docs-translations/es)
- [Simplified Chinese](https://github.com/atom/electron/tree/master/docs-translations/zh-CN)
- [Traditional Chinese](https://github.com/atom/electron/tree/master/docs-translations/zh-TW)
- [Russian](https://github.com/atom/electron/tree/master/docs-translations/ru-RU)
## Quick Start
Clone and run the [`atom/electron-quick-start`](https://github.com/atom/electron-quick-start)
repository to see a minimal Electron app in action.
## Community
You can ask questions and interact with the community in the following
locations:
- [`electron`](http://discuss.atom.io/category/electron) category on the Atom
- [`electron`](http://discuss.atom.io/c/electron) category on the Atom
forums
- `#atom-shell` channel on Freenode
- [`Atom`](http://atom-slack.herokuapp.com/) channel on Slack
- [`electron-br`](https://electron-br.slack.com) *(Brazilian Portuguese)*
Check out [awesome-electron](https://github.com/sindresorhus/awesome-electron)
for a community maintained list of useful example apps, tools and resources.

View File

@@ -4,7 +4,7 @@
'product_name%': 'Electron',
'company_name%': 'GitHub, Inc',
'company_abbr%': 'github',
'version%': '0.33.9',
'version%': '0.35.6',
},
'includes': [
'filenames.gypi',

View File

@@ -10,6 +10,7 @@
#include "base/at_exit.h"
#include "base/i18n/icu_util.h"
#include "base/mac/bundle_locations.h"
#include "base/mac/scoped_nsautorelease_pool.h"
#include "brightray/common/mac/main_application_bundle.h"
#include "content/public/app/content_main.h"
@@ -25,6 +26,7 @@ int AtomMain(int argc, const char* argv[]) {
int AtomInitializeICUandStartNode(int argc, char *argv[]) {
base::AtExitManager atexit_manager;
base::mac::ScopedNSAutoreleasePool pool;
base::mac::SetOverrideFrameworkBundlePath(
brightray::MainApplicationBundlePath()
.Append("Contents")

View File

@@ -5,7 +5,6 @@
#include "atom/app/atom_main.h"
#include <stdlib.h>
#include <string.h>
#if defined(OS_WIN)
#include <stdio.h>
@@ -36,10 +35,33 @@
#include "base/at_exit.h"
#include "base/i18n/icu_util.h"
#if defined(OS_WIN)
namespace {
const char* kRunAsNode = "ELECTRON_RUN_AS_NODE";
const char* kOldRunAsNode = "ATOM_SHELL_INTERNAL_RUN_AS_NODE";
bool IsEnvSet(const char* name) {
#if defined(OS_WIN)
size_t required_size;
getenv_s(&required_size, nullptr, 0, name);
return required_size != 0;
#else
char* indicator = getenv(name);
return indicator && indicator[0] != '\0';
#endif
}
bool IsRunAsNode() {
return IsEnvSet(kRunAsNode) || IsEnvSet(kOldRunAsNode);
}
#if defined(OS_WIN)
bool IsCygwin() {
std::string os;
scoped_ptr<base::Environment> env(base::Environment::Create());
return env->GetVar("OS", &os) && os == "cygwin";
}
// Win8.1 supports monitor-specific DPI scaling.
bool SetProcessDpiAwarenessWrapper(PROCESS_DPI_AWARENESS value) {
typedef HRESULT(WINAPI *SetProcessDpiAwarenessPtr)(PROCESS_DPI_AWARENESS);
@@ -77,24 +99,22 @@ void EnableHighDPISupport() {
SetProcessDPIAwareWrapper();
}
}
#endif
} // namespace
#if defined(OS_WIN)
int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
int argc = 0;
wchar_t** wargv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
scoped_ptr<base::Environment> env(base::Environment::Create());
// Make output work in console if we are not in cygiwn.
std::string os;
if (env->GetVar("OS", &os) && os != "cygwin") {
if (!IsCygwin() && !IsEnvSet("ELECTRON_NO_ATTACH_CONSOLE")) {
AttachConsole(ATTACH_PARENT_PROCESS);
FILE* dontcare;
freopen_s(&dontcare, "CON", "w", stdout);
freopen_s(&dontcare, "CON", "w", stderr);
freopen_s(&dontcare, "CON", "r", stdin);
}
// Convert argv to to UTF8
@@ -131,16 +151,12 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
}
}
std::string node_indicator, crash_service_indicator;
if (env->GetVar("ATOM_SHELL_INTERNAL_RUN_AS_NODE", &node_indicator) &&
node_indicator == "1") {
if (IsRunAsNode()) {
// Now that argv conversion is done, we can finally start.
base::AtExitManager atexit_manager;
base::i18n::InitializeICU();
return atom::NodeMain(argc, argv);
} else if (env->GetVar("ATOM_SHELL_INTERNAL_CRASH_SERVICE",
&crash_service_indicator) &&
crash_service_indicator == "1") {
} else if (IsEnvSet("ATOM_SHELL_INTERNAL_CRASH_SERVICE")) {
return crash_service::Main(cmd);
}
@@ -164,8 +180,7 @@ int APIENTRY wWinMain(HINSTANCE instance, HINSTANCE, wchar_t* cmd, int) {
#elif defined(OS_LINUX) // defined(OS_WIN)
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) {
if (IsRunAsNode()) {
base::i18n::InitializeICU();
base::AtExitManager atexit_manager;
return atom::NodeMain(argc, const_cast<char**>(argv));
@@ -182,8 +197,7 @@ int main(int argc, const char* argv[]) {
#else // defined(OS_LINUX)
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) {
if (IsRunAsNode()) {
return AtomInitializeICUandStartNode(argc, const_cast<char**>(argv));
}

View File

@@ -16,6 +16,7 @@
#include "base/debug/stack_trace.h"
#include "base/environment.h"
#include "base/logging.h"
#include "chrome/common/chrome_paths.h"
#include "content/public/common/content_switches.h"
#include "ui/base/resource/resource_bundle.h"
@@ -59,7 +60,9 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
#endif // !defined(OS_WIN)
// Only enable logging when --enable-logging is specified.
if (!command_line->HasSwitch(switches::kEnableLogging)) {
scoped_ptr<base::Environment> env(base::Environment::Create());
if (!command_line->HasSwitch(switches::kEnableLogging) &&
!env->HasVar("ELECTRON_ENABLE_LOGGING")) {
settings.logging_dest = logging::LOG_NONE;
logging::SetMinLogLevel(logging::LOG_NUM_SEVERITIES);
}
@@ -69,10 +72,15 @@ bool AtomMainDelegate::BasicStartupComplete(int* exit_code) {
// Logging with pid and timestamp.
logging::SetLogItems(true, false, true, false);
#if defined(DEBUG) && defined(OS_LINUX)
// Enable convient stack printing.
base::debug::EnableInProcessStackDumping();
bool enable_stack_dumping = env->HasVar("ELECTRON_ENABLE_STACK_DUMPING");
#if defined(DEBUG) && defined(OS_LINUX)
enable_stack_dumping = true;
#endif
if (enable_stack_dumping)
base::debug::EnableInProcessStackDumping();
chrome::RegisterPathProvider();
return brightray::MainDelegate::BasicStartupComplete(exit_code);
}
@@ -97,13 +105,6 @@ void AtomMainDelegate::PreSandboxStartup() {
if (!IsBrowserProcess(command_line))
return;
#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
// Chrome 38, which should have fixed the problem.
command_line->AppendSwitch(switches::kDisableLegacyIntermediateWindow);
#endif
// Disable renderer sandbox for most of node's functions.
command_line->AppendSwitch(switches::kNoSandbox);

View File

@@ -7,8 +7,8 @@
#include "atom/app/uv_task_runner.h"
#include "atom/browser/javascript_environment.h"
#include "atom/browser/node_debugger.h"
#include "atom/common/node_includes.h"
#include "base/command_line.h"
#include "atom/common/node_includes.h"
#include "base/thread_task_runner_handle.h"
#include "gin/array_buffer.h"
#include "gin/public/isolate_holder.h"
@@ -19,25 +19,22 @@ namespace atom {
int NodeMain(int argc, char *argv[]) {
base::CommandLine::Init(argc, 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;
{
// Feed gin::PerIsolateData with a task runner.
argv = uv_setup_args(argc, argv);
uv_loop_t* loop = uv_default_loop();
scoped_refptr<UvTaskRunner> uv_task_runner(new UvTaskRunner(loop));
base::ThreadTaskRunnerHandle handle(uv_task_runner);
gin::V8Initializer::LoadV8Snapshot();
gin::V8Initializer::LoadV8Natives();
gin::IsolateHolder::Initialize(
gin::IsolateHolder::kNonStrictMode,
gin::ArrayBufferAllocator::SharedInstance());
JavascriptEnvironment gin_env;
int exec_argc;
const char** exec_argv;
node::Init(&argc, const_cast<const char**>(argv), &exec_argc, &exec_argv);
node::Environment* env = node::CreateEnvironment(
gin_env.isolate(), loop, gin_env.context(), argc, argv,
exec_argc, exec_argv);

View File

@@ -48,8 +48,13 @@ void UvTaskRunner::OnTimeout(uv_timer_t* timer) {
self->tasks_[timer].Run();
self->tasks_.erase(timer);
uv_unref(reinterpret_cast<uv_handle_t*>(timer));
delete timer;
uv_timer_stop(timer);
uv_close(reinterpret_cast<uv_handle_t*>(timer), UvTaskRunner::OnClose);
}
// static
void UvTaskRunner::OnClose(uv_handle_t* handle) {
delete reinterpret_cast<uv_timer_t*>(handle);
}
} // namespace atom

View File

@@ -31,6 +31,7 @@ class UvTaskRunner : public base::SingleThreadTaskRunner {
private:
static void OnTimeout(uv_timer_t* timer);
static void OnClose(uv_handle_t* handle);
uv_loop_t* loop_;

View File

@@ -7,18 +7,17 @@
#include <string>
#include <vector>
#if defined(OS_WIN)
#include <shlobj.h>
#endif
#include "atom/browser/api/atom_api_menu.h"
#include "atom/browser/api/atom_api_session.h"
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/browser.h"
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/login_handler.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/net_converter.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/node_includes.h"
#include "atom/common/options_switches.h"
#include "base/command_line.h"
@@ -26,8 +25,10 @@
#include "base/files/file_path.h"
#include "base/path_service.h"
#include "brightray/browser/brightray_paths.h"
#include "chrome/common/chrome_paths.h"
#include "content/public/browser/client_certificate_delegate.h"
#include "content/public/browser/gpu_data_manager.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/common/content_switches.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
@@ -63,21 +64,6 @@ struct Converter<Browser::UserTask> {
};
#endif
template<>
struct Converter<scoped_refptr<net::X509Certificate>> {
static v8::Local<v8::Value> ToV8(
v8::Isolate* isolate,
const scoped_refptr<net::X509Certificate>& val) {
mate::Dictionary dict(isolate, v8::Object::New(isolate));
std::string encoded_data;
net::X509Certificate::GetPEMEncoded(
val->os_cert_handle(), &encoded_data);
dict.Set("data", encoded_data);
dict.Set("issuerName", val->issuer().GetDisplayName());
return dict.GetHandle();
}
};
} // namespace mate
@@ -101,22 +87,47 @@ int GetPathConstant(const std::string& name) {
return base::DIR_HOME;
else if (name == "temp")
return base::DIR_TEMP;
else if (name == "userDesktop")
else if (name == "userDesktop" || name == "desktop")
return base::DIR_USER_DESKTOP;
else if (name == "exe")
return base::FILE_EXE;
else if (name == "module")
return base::FILE_MODULE;
else if (name == "documents")
return chrome::DIR_USER_DOCUMENTS;
else if (name == "downloads")
return chrome::DIR_DEFAULT_DOWNLOADS;
else if (name == "music")
return chrome::DIR_USER_MUSIC;
else if (name == "pictures")
return chrome::DIR_USER_PICTURES;
else if (name == "videos")
return chrome::DIR_USER_VIDEOS;
else
return -1;
}
bool NotificationCallbackWrapper(
const ProcessSingleton::NotificationCallback& callback,
const base::CommandLine::StringVector& cmd,
const base::FilePath& cwd) {
// Make sure the callback is called after app gets ready.
if (Browser::Get()->is_ready()) {
callback.Run(cmd, cwd);
} else {
scoped_refptr<base::SingleThreadTaskRunner> task_runner(
base::ThreadTaskRunnerHandle::Get());
task_runner->PostTask(
FROM_HERE, base::Bind(base::IgnoreResult(callback), cmd, cwd));
}
// ProcessSingleton needs to know whether current process is quiting.
return !Browser::Get()->is_shutting_down();
}
void OnClientCertificateSelected(
v8::Isolate* isolate,
std::shared_ptr<content::ClientCertificateDelegate> delegate,
mate::Arguments* args) {
v8::Locker locker(isolate);
v8::HandleScope handle_scope(isolate);
mate::Dictionary cert_data;
if (!(args->Length() == 1 && args->GetNext(&cert_data))) {
args->ThrowError();
@@ -130,18 +141,29 @@ void OnClientCertificateSelected(
net::X509Certificate::CreateCertificateListFromBytes(
encoded_data.data(), encoded_data.size(),
net::X509Certificate::FORMAT_AUTO);
delegate->ContinueWithCertificate(certs[0].get());
}
void PassLoginInformation(scoped_refptr<LoginHandler> login_handler,
mate::Arguments* args) {
base::string16 username, password;
if (args->GetNext(&username) && args->GetNext(&password))
login_handler->Login(username, password);
else
login_handler->CancelAuth();
}
} // namespace
App::App() {
static_cast<AtomBrowserClient*>(AtomBrowserClient::Get())->set_delegate(this);
Browser::Get()->AddObserver(this);
content::GpuDataManager::GetInstance()->AddObserver(this);
}
App::~App() {
static_cast<AtomBrowserClient*>(AtomBrowserClient::Get())->set_delegate(
nullptr);
Browser::Get()->RemoveObserver(this);
content::GpuDataManager::GetInstance()->RemoveObserver(this);
}
@@ -160,6 +182,11 @@ void App::OnWindowAllClosed() {
void App::OnQuit() {
Emit("quit");
if (process_singleton_.get()) {
process_singleton_->Cleanup();
process_singleton_.reset();
}
}
void App::OnOpenFile(bool* prevent_default, const std::string& file_path) {
@@ -179,26 +206,62 @@ void App::OnWillFinishLaunching() {
}
void App::OnFinishLaunching() {
// Create the defaultSession.
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
auto browser_context = static_cast<AtomBrowserContext*>(
AtomBrowserMainParts::Get()->browser_context());
auto handle = Session::CreateFrom(isolate(), browser_context);
default_session_.Reset(isolate(), handle.ToV8());
Emit("ready");
}
void App::OnSelectCertificate(
void App::OnLogin(LoginHandler* login_handler) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
bool prevent_default = Emit(
"login",
WebContents::CreateFrom(isolate(), login_handler->GetWebContents()),
login_handler->request(),
login_handler->auth_info(),
base::Bind(&PassLoginInformation, make_scoped_refptr(login_handler)));
// Default behavior is to always cancel the auth.
if (!prevent_default)
login_handler->CancelAuth();
}
void App::AllowCertificateError(
int pid,
int fid,
int cert_error,
const net::SSLInfo& ssl_info,
const GURL& request_url,
content::ResourceType resource_type,
bool overridable,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(bool)>& callback,
content::CertificateRequestResultType* request) {
auto rfh = content::RenderFrameHost::FromID(pid, fid);
auto web_contents = content::WebContents::FromRenderFrameHost(rfh);
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
bool prevent_default = Emit("certificate-error",
WebContents::CreateFrom(isolate(), web_contents),
request_url,
net::ErrorToString(cert_error),
ssl_info.cert,
callback);
// Deny the certificate by default.
if (!prevent_default)
*request = content::CERTIFICATE_REQUEST_RESULT_TYPE_DENY;
}
void App::SelectClientCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
scoped_ptr<content::ClientCertificateDelegate> delegate) {
std::shared_ptr<content::ClientCertificateDelegate>
shared_delegate(delegate.release());
bool prevent_default =
Emit("select-certificate",
api::WebContents::CreateFrom(isolate(), web_contents),
Emit("select-client-certificate",
WebContents::CreateFrom(isolate(), web_contents),
cert_request_info->host_and_port.ToString(),
cert_request_info->client_certs,
base::Bind(&OnClientCertificateSelected,
@@ -244,22 +307,36 @@ void App::SetDesktopName(const std::string& desktop_name) {
#endif
}
void App::SetAppUserModelId(const std::string& app_id) {
#if defined(OS_WIN)
base::string16 app_id_utf16 = base::UTF8ToUTF16(app_id);
SetCurrentProcessExplicitAppUserModelID(app_id_utf16.c_str());
#endif
void App::AllowNTLMCredentialsForAllDomains(bool should_allow) {
auto browser_context = static_cast<AtomBrowserContext*>(
AtomBrowserMainParts::Get()->browser_context());
browser_context->AllowNTLMCredentialsForAllDomains(should_allow);
}
std::string App::GetLocale() {
return l10n_util::GetApplicationLocale("");
}
v8::Local<v8::Value> App::DefaultSession(v8::Isolate* isolate) {
if (default_session_.IsEmpty())
return v8::Null(isolate);
else
return v8::Local<v8::Value>::New(isolate, default_session_);
bool App::MakeSingleInstance(
const ProcessSingleton::NotificationCallback& callback) {
if (process_singleton_.get())
return false;
base::FilePath user_dir;
PathService::Get(brightray::DIR_USER_DATA, &user_dir);
process_singleton_.reset(new ProcessSingleton(
user_dir, base::Bind(NotificationCallbackWrapper, callback)));
switch (process_singleton_->NotifyOtherProcessOrCreate()) {
case ProcessSingleton::NotifyResult::LOCK_ERROR:
case ProcessSingleton::NotifyResult::PROFILE_IN_USE:
case ProcessSingleton::NotifyResult::PROCESS_NOTIFIED:
process_singleton_.reset();
return true;
case ProcessSingleton::NotifyResult::PROCESS_NONE:
default: // Shouldn't be needed, but VS warns if it is not there.
return false;
}
}
mate::ObjectTemplateBuilder App::GetObjectTemplateBuilder(
@@ -267,6 +344,7 @@ mate::ObjectTemplateBuilder App::GetObjectTemplateBuilder(
auto browser = base::Unretained(Browser::Get());
return mate::ObjectTemplateBuilder(isolate)
.SetMethod("quit", base::Bind(&Browser::Quit, browser))
.SetMethod("exit", base::Bind(&Browser::Exit, browser))
.SetMethod("focus", base::Bind(&Browser::Focus, browser))
.SetMethod("getVersion", base::Bind(&Browser::GetVersion, browser))
.SetMethod("setVersion", base::Bind(&Browser::SetVersion, browser))
@@ -277,6 +355,8 @@ mate::ObjectTemplateBuilder App::GetObjectTemplateBuilder(
base::Bind(&Browser::AddRecentDocument, browser))
.SetMethod("clearRecentDocuments",
base::Bind(&Browser::ClearRecentDocuments, browser))
.SetMethod("setAppUserModelId",
base::Bind(&Browser::SetAppUserModelID, browser))
#if defined(OS_WIN)
.SetMethod("setUserTasks",
base::Bind(&Browser::SetUserTasks, browser))
@@ -284,9 +364,10 @@ mate::ObjectTemplateBuilder App::GetObjectTemplateBuilder(
.SetMethod("setPath", &App::SetPath)
.SetMethod("getPath", &App::GetPath)
.SetMethod("setDesktopName", &App::SetDesktopName)
.SetMethod("setAppUserModelId", &App::SetAppUserModelId)
.SetMethod("allowNTLMCredentialsForAllDomains",
&App::AllowNTLMCredentialsForAllDomains)
.SetMethod("getLocale", &App::GetLocale)
.SetProperty("defaultSession", &App::DefaultSession);
.SetMethod("makeSingleInstance", &App::MakeSingleInstance);
}
// static

View File

@@ -8,7 +8,10 @@
#include <string>
#include "atom/browser/api/event_emitter.h"
#include "atom/browser/atom_browser_client.h"
#include "atom/browser/browser_observer.h"
#include "atom/common/native_mate_converters/callback.h"
#include "chrome/browser/process_singleton.h"
#include "content/public/browser/gpu_data_manager_observer.h"
#include "native_mate/handle.h"
@@ -24,7 +27,8 @@ namespace atom {
namespace api {
class App : public mate::EventEmitter,
class App : public AtomBrowserClient::Delegate,
public mate::EventEmitter,
public BrowserObserver,
public content::GpuDataManagerObserver {
public:
@@ -44,7 +48,22 @@ class App : public mate::EventEmitter,
void OnActivate(bool has_visible_windows) override;
void OnWillFinishLaunching() override;
void OnFinishLaunching() override;
void OnSelectCertificate(
void OnLogin(LoginHandler* login_handler) override;
// content::ContentBrowserClient:
void AllowCertificateError(
int render_process_id,
int render_frame_id,
int cert_error,
const net::SSLInfo& ssl_info,
const GURL& request_url,
content::ResourceType resource_type,
bool overridable,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(bool)>& callback,
content::CertificateRequestResultType* request) override;
void SelectClientCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
scoped_ptr<content::ClientCertificateDelegate> delegate) override;
@@ -64,11 +83,12 @@ class App : public mate::EventEmitter,
const base::FilePath& path);
void SetDesktopName(const std::string& desktop_name);
void SetAppUserModelId(const std::string& app_id);
void AllowNTLMCredentialsForAllDomains(bool should_allow);
bool MakeSingleInstance(
const ProcessSingleton::NotificationCallback& callback);
std::string GetLocale();
v8::Local<v8::Value> DefaultSession(v8::Isolate* isolate);
v8::Global<v8::Value> default_session_;
scoped_ptr<ProcessSingleton> process_singleton_;
DISALLOW_COPY_AND_ASSIGN(App);
};

View File

@@ -5,12 +5,31 @@
#include "atom/browser/api/atom_api_auto_updater.h"
#include "base/time/time.h"
#include "atom/browser/auto_updater.h"
#include "atom/browser/browser.h"
#include "atom/browser/native_window.h"
#include "atom/browser/window_list.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/node_includes.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
namespace mate {
template<>
struct Converter<base::Time> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const base::Time& val) {
v8::MaybeLocal<v8::Value> date = v8::Date::New(
isolate->GetCurrentContext(), val.ToJsTime());
if (date.IsEmpty())
return v8::Null(isolate);
else
return date.ToLocalChecked();
}
};
} // namespace mate
namespace atom {
namespace api {
@@ -20,11 +39,18 @@ AutoUpdater::AutoUpdater() {
}
AutoUpdater::~AutoUpdater() {
auto_updater::AutoUpdater::SetDelegate(NULL);
auto_updater::AutoUpdater::SetDelegate(nullptr);
}
void AutoUpdater::OnError(const std::string& error) {
Emit("error", error);
void AutoUpdater::OnError(const std::string& message) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
auto error = v8::Exception::Error(mate::StringToV8(isolate(), message));
EmitCustomEvent(
"error",
error->ToObject(isolate()->GetCurrentContext()).ToLocalChecked(),
// Message is also emitted to keep compatibility with old code.
message);
}
void AutoUpdater::OnCheckingForUpdate() {
@@ -42,26 +68,36 @@ void AutoUpdater::OnUpdateNotAvailable() {
void AutoUpdater::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) {
quit_and_install_ = quit_and_install;
Emit("update-downloaded-raw", release_notes, release_name,
release_date.ToJsTime(), update_url);
const std::string& url) {
Emit("update-downloaded", release_notes, release_name, release_date, url,
// Keep compatibility with old APIs.
base::Bind(&AutoUpdater::QuitAndInstall, base::Unretained(this)));
}
void AutoUpdater::OnWindowAllClosed() {
QuitAndInstall();
}
mate::ObjectTemplateBuilder AutoUpdater::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate)
.SetMethod("setFeedUrl", &auto_updater::AutoUpdater::SetFeedURL)
.SetMethod("setFeedURL", &auto_updater::AutoUpdater::SetFeedURL)
.SetMethod("checkForUpdates", &auto_updater::AutoUpdater::CheckForUpdates)
.SetMethod("_quitAndInstall", &AutoUpdater::QuitAndInstall);
.SetMethod("quitAndInstall", &AutoUpdater::QuitAndInstall);
}
void AutoUpdater::QuitAndInstall() {
if (quit_and_install_.is_null())
Browser::Get()->Shutdown();
else
quit_and_install_.Run();
// If we don't have any window then quitAndInstall immediately.
WindowList* window_list = WindowList::GetInstance();
if (window_list->size() == 0) {
auto_updater::AutoUpdater::QuitAndInstall();
return;
}
// Otherwise do the restart after all windows have been closed.
window_list->AddObserver(this);
for (NativeWindow* window : *window_list)
window->Close();
}
// static

View File

@@ -7,9 +7,9 @@
#include <string>
#include "base/callback.h"
#include "atom/browser/api/event_emitter.h"
#include "atom/browser/auto_updater_delegate.h"
#include "atom/browser/auto_updater.h"
#include "atom/browser/window_list_observer.h"
#include "native_mate/handle.h"
namespace atom {
@@ -17,7 +17,8 @@ namespace atom {
namespace api {
class AutoUpdater : public mate::EventEmitter,
public auto_updater::AutoUpdaterDelegate {
public auto_updater::Delegate,
public WindowListObserver {
public:
static mate::Handle<AutoUpdater> Create(v8::Isolate* isolate);
@@ -25,17 +26,18 @@ class AutoUpdater : public mate::EventEmitter,
AutoUpdater();
virtual ~AutoUpdater();
// AutoUpdaterDelegate implementations.
// Delegate implementations.
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;
void OnUpdateDownloaded(const std::string& release_notes,
const std::string& release_name,
const base::Time& release_date,
const std::string& update_url) override;
// WindowListObserver:
void OnWindowAllClosed() override;
// mate::Wrappable implementations:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
@@ -44,8 +46,6 @@ class AutoUpdater : public mate::EventEmitter,
private:
void QuitAndInstall();
base::Closure quit_and_install_;
DISALLOW_COPY_AND_ASSIGN(AutoUpdater);
};

View File

@@ -204,7 +204,7 @@ void Cookies::GetCookiesOnIOThread(scoped_ptr<base::DictionaryValue> filter,
Passed(&filter), callback))) {
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(&RunGetCookiesCallbackOnUIThread, isolate(),
"Url is not valid", net::CookieList(), callback));
"URL is not valid", net::CookieList(), callback));
}
}
@@ -229,7 +229,7 @@ void Cookies::Remove(const mate::Dictionary& details,
error_message = "Details(url, name) of removing cookie are required.";
}
if (error_message.empty() && !url.is_valid()) {
error_message = "Url is not valid.";
error_message = "URL is not valid.";
}
if (!error_message.empty()) {
RunRemoveCookiesCallbackOnUIThread(isolate(), error_message, callback);
@@ -261,7 +261,7 @@ void Cookies::Set(const base::DictionaryValue& options,
GURL gurl(url);
if (error_message.empty() && !gurl.is_valid()) {
error_message = "Url is not valid.";
error_message = "URL is not valid.";
}
if (!error_message.empty()) {
@@ -322,14 +322,6 @@ void Cookies::OnSetCookies(const CookiesCallback& callback,
callback));
}
mate::ObjectTemplateBuilder Cookies::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate)
.SetMethod("get", &Cookies::Get)
.SetMethod("remove", &Cookies::Remove)
.SetMethod("set", &Cookies::Set);
}
net::CookieStore* Cookies::GetCookieStore() {
return request_context_getter_->GetURLRequestContext()->cookie_store();
}
@@ -341,6 +333,15 @@ mate::Handle<Cookies> Cookies::Create(
return mate::CreateHandle(isolate, new Cookies(browser_context));
}
// static
void Cookies::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.SetMethod("get", &Cookies::Get)
.SetMethod("remove", &Cookies::Remove)
.SetMethod("set", &Cookies::Set);
}
} // namespace api
} // namespace atom

View File

@@ -7,8 +7,8 @@
#include <string>
#include "atom/browser/api/trackable_object.h"
#include "base/callback.h"
#include "native_mate/wrappable.h"
#include "native_mate/handle.h"
#include "net/cookies/canonical_cookie.h"
@@ -33,7 +33,7 @@ namespace atom {
namespace api {
class Cookies : public mate::Wrappable {
class Cookies : public mate::TrackableObject<Cookies> {
public:
// node.js style callback function(error, result)
typedef base::Callback<void(v8::Local<v8::Value>, v8::Local<v8::Value>)>
@@ -42,6 +42,10 @@ class Cookies : public mate::Wrappable {
static mate::Handle<Cookies> Create(v8::Isolate* isolate,
content::BrowserContext* browser_context);
// mate::TrackableObject:
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype);
protected:
explicit Cookies(content::BrowserContext* browser_context);
~Cookies();
@@ -70,10 +74,6 @@ class Cookies : public mate::Wrappable {
void OnSetCookies(const CookiesCallback& callback,
bool set_success);
// mate::Wrappable:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
private:
// Must be called on IO thread.
net::CookieStore* GetCookieStore();

View File

@@ -6,6 +6,7 @@
#include <map>
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
@@ -69,29 +70,20 @@ DownloadItem::DownloadItem(content::DownloadItem* download_item) :
}
DownloadItem::~DownloadItem() {
Destroy();
}
void DownloadItem::Destroy() {
if (download_item_) {
download_item_->RemoveObserver(this);
auto iter = g_download_item_objects.find(download_item_->GetId());
if (iter != g_download_item_objects.end())
g_download_item_objects.erase(iter);
download_item_ = nullptr;
}
}
bool DownloadItem::IsDestroyed() const {
return download_item_ == nullptr;
if (download_item_)
OnDownloadDestroyed(download_item_);
}
void DownloadItem::OnDownloadUpdated(content::DownloadItem* item) {
download_item_->IsDone() ? Emit("done", item->GetState()) : Emit("updated");
}
void DownloadItem::OnDownloadDestroyed(content::DownloadItem* download) {
Destroy();
void DownloadItem::OnDownloadDestroyed(content::DownloadItem* download_item) {
download_item_->RemoveObserver(this);
auto iter = g_download_item_objects.find(download_item_->GetId());
if (iter != g_download_item_objects.end())
g_download_item_objects.erase(iter);
download_item_ = nullptr;
}
int64 DownloadItem::GetReceivedBytes() {
@@ -102,7 +94,7 @@ int64 DownloadItem::GetTotalBytes() {
return download_item_->GetTotalBytes();
}
const GURL& DownloadItem::GetUrl() {
const GURL& DownloadItem::GetURL() {
return download_item_->GetURL();
}
@@ -115,7 +107,7 @@ bool DownloadItem::HasUserGesture() {
}
std::string DownloadItem::GetFilename() {
return base::UTF16ToUTF8(net::GenerateFileName(GetUrl(),
return base::UTF16ToUTF8(net::GenerateFileName(GetURL(),
GetContentDisposition(),
std::string(),
download_item_->GetSuggestedFilename(),
@@ -143,15 +135,17 @@ void DownloadItem::Cancel() {
download_item_->Cancel(true);
}
mate::ObjectTemplateBuilder DownloadItem::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate)
// static
void DownloadItem::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.MakeDestroyable()
.SetMethod("pause", &DownloadItem::Pause)
.SetMethod("resume", &DownloadItem::Resume)
.SetMethod("cancel", &DownloadItem::Cancel)
.SetMethod("getReceivedBytes", &DownloadItem::GetReceivedBytes)
.SetMethod("getTotalBytes", &DownloadItem::GetTotalBytes)
.SetMethod("getUrl", &DownloadItem::GetUrl)
.SetMethod("getURL", &DownloadItem::GetURL)
.SetMethod("getMimeType", &DownloadItem::GetMimeType)
.SetMethod("hasUserGesture", &DownloadItem::HasUserGesture)
.SetMethod("getFilename", &DownloadItem::GetFilename)
@@ -159,14 +153,6 @@ mate::ObjectTemplateBuilder DownloadItem::GetObjectTemplateBuilder(
.SetMethod("setSavePath", &DownloadItem::SetSavePath);
}
void SetWrapDownloadItem(const WrapDownloadItemCallback& callback) {
g_wrap_download_item = callback;
}
void ClearWrapDownloadItem() {
g_wrap_download_item.Reset();
}
// static
mate::Handle<DownloadItem> DownloadItem::Create(
v8::Isolate* isolate, content::DownloadItem* item) {
@@ -182,6 +168,18 @@ void* DownloadItem::UserDataKey() {
return &kDownloadItemSavePathKey;
}
void ClearWrapDownloadItem() {
g_wrap_download_item.Reset();
}
void SetWrapDownloadItem(const WrapDownloadItemCallback& callback) {
g_wrap_download_item = callback;
// Cleanup the wrapper on exit.
atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(
base::Bind(ClearWrapDownloadItem));
}
} // namespace api
} // namespace atom
@@ -193,7 +191,6 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
v8::Isolate* isolate = context->GetIsolate();
mate::Dictionary dict(isolate, exports);
dict.SetMethod("_setWrapDownloadItem", &atom::api::SetWrapDownloadItem);
dict.SetMethod("_clearWrapDownloadItem", &atom::api::ClearWrapDownloadItem);
}
} // namespace

View File

@@ -17,7 +17,7 @@ namespace atom {
namespace api {
class DownloadItem : public mate::EventEmitter,
class DownloadItem : public mate::TrackableObject<DownloadItem>,
public content::DownloadItem::Observer {
public:
class SavePathData : public base::SupportsUserData::Data {
@@ -32,6 +32,10 @@ class DownloadItem : public mate::EventEmitter,
content::DownloadItem* item);
static void* UserDataKey();
// mate::TrackableObject:
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype);
protected:
explicit DownloadItem(content::DownloadItem* download_item);
~DownloadItem();
@@ -49,17 +53,10 @@ class DownloadItem : public mate::EventEmitter,
bool HasUserGesture();
std::string GetFilename();
std::string GetContentDisposition();
const GURL& GetUrl();
const GURL& GetURL();
void SetSavePath(const base::FilePath& path);
private:
// mate::Wrappable:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
bool IsDestroyed() const override;
void Destroy();
content::DownloadItem* download_item_;
DISALLOW_COPY_AND_ASSIGN(DownloadItem);

View File

@@ -8,9 +8,9 @@
#include <map>
#include <string>
#include "atom/browser/api/trackable_object.h"
#include "base/callback.h"
#include "chrome/browser/extensions/global_shortcut_listener.h"
#include "native_mate/wrappable.h"
#include "native_mate/handle.h"
#include "ui/base/accelerators/accelerator.h"
@@ -19,13 +19,13 @@ namespace atom {
namespace api {
class GlobalShortcut : public extensions::GlobalShortcutListener::Observer,
public mate::Wrappable {
public mate::TrackableObject<GlobalShortcut> {
public:
static mate::Handle<GlobalShortcut> Create(v8::Isolate* isolate);
protected:
GlobalShortcut();
virtual ~GlobalShortcut();
~GlobalShortcut() override;
// mate::Wrappable implementations:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(

View File

@@ -151,6 +151,7 @@ bool Menu::IsVisibleAt(int index) const {
void Menu::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.MakeDestroyable()
.SetMethod("insertItem", &Menu::InsertItemAt)
.SetMethod("insertCheckItem", &Menu::InsertCheckItemAt)
.SetMethod("insertRadioItem", &Menu::InsertRadioItemAt)

View File

@@ -8,16 +8,16 @@
#include <string>
#include "atom/browser/api/atom_api_window.h"
#include "atom/browser/api/trackable_object.h"
#include "atom/browser/ui/atom_menu_model.h"
#include "base/callback.h"
#include "base/memory/scoped_ptr.h"
#include "native_mate/wrappable.h"
namespace atom {
namespace api {
class Menu : public mate::Wrappable,
class Menu : public mate::TrackableObject<Menu>,
public AtomMenuModel::Delegate {
public:
static mate::Wrappable* Create();
@@ -37,7 +37,7 @@ class Menu : public mate::Wrappable,
protected:
Menu();
virtual ~Menu();
~Menu() override;
// mate::Wrappable:
void AfterInit(v8::Isolate* isolate) override;

View File

@@ -5,7 +5,7 @@
#ifndef ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_
#define ATOM_BROWSER_API_ATOM_API_POWER_MONITOR_H_
#include "atom/browser/api/event_emitter.h"
#include "atom/browser/api/trackable_object.h"
#include "base/compiler_specific.h"
#include "base/power_monitor/power_observer.h"
#include "native_mate/handle.h"
@@ -14,14 +14,14 @@ namespace atom {
namespace api {
class PowerMonitor : public mate::EventEmitter,
class PowerMonitor : public mate::TrackableObject<PowerMonitor>,
public base::PowerObserver {
public:
static v8::Local<v8::Value> Create(v8::Isolate* isolate);
protected:
PowerMonitor();
virtual ~PowerMonitor();
~PowerMonitor() override;
// base::PowerObserver implementations:
void OnPowerStateChange(bool on_battery_power) override;

View File

@@ -7,10 +7,10 @@
#include <map>
#include "atom/browser/api/trackable_object.h"
#include "base/memory/scoped_ptr.h"
#include "content/public/browser/power_save_blocker.h"
#include "native_mate/handle.h"
#include "native_mate/wrappable.h"
namespace mate {
class Dictionary;
@@ -20,13 +20,13 @@ namespace atom {
namespace api {
class PowerSaveBlocker : public mate::Wrappable {
class PowerSaveBlocker : public mate::TrackableObject<PowerSaveBlocker> {
public:
static mate::Handle<PowerSaveBlocker> Create(v8::Isolate* isolate);
protected:
PowerSaveBlocker();
virtual ~PowerSaveBlocker();
~PowerSaveBlocker() override;
// mate::Wrappable implementations:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
@@ -48,7 +48,6 @@ class PowerSaveBlocker : public mate::Wrappable {
std::map<int, content::PowerSaveBlocker::PowerSaveBlockerType>;
PowerSaveBlockerTypeMap power_save_blocker_types_;
DISALLOW_COPY_AND_ASSIGN(PowerSaveBlocker);
};

View File

@@ -12,27 +12,12 @@
#include "atom/browser/net/url_request_fetch_job.h"
#include "atom/browser/net/url_request_string_job.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/net_converter.h"
#include "atom/common/node_includes.h"
#include "native_mate/dictionary.h"
using content::BrowserThread;
namespace mate {
template<>
struct Converter<const net::URLRequest*> {
static v8::Local<v8::Value> ToV8(v8::Isolate* isolate,
const net::URLRequest* val) {
return mate::ObjectTemplateBuilder(isolate)
.SetValue("method", val->method())
.SetValue("url", val->url().spec())
.SetValue("referrer", val->referrer())
.Build()->NewInstance();
}
};
} // namespace mate
namespace atom {
namespace api {
@@ -52,7 +37,7 @@ mate::ObjectTemplateBuilder Protocol::GetObjectTemplateBuilder(
.SetMethod("registerBufferProtocol",
&Protocol::RegisterProtocol<URLRequestBufferJob>)
.SetMethod("registerFileProtocol",
&Protocol::RegisterProtocol<UrlRequestAsyncAsarJob>)
&Protocol::RegisterProtocol<URLRequestAsyncAsarJob>)
.SetMethod("registerHttpProtocol",
&Protocol::RegisterProtocol<URLRequestFetchJob>)
.SetMethod("unregisterProtocol", &Protocol::UnregisterProtocol)
@@ -62,7 +47,7 @@ mate::ObjectTemplateBuilder Protocol::GetObjectTemplateBuilder(
.SetMethod("interceptBufferProtocol",
&Protocol::InterceptProtocol<URLRequestBufferJob>)
.SetMethod("interceptFileProtocol",
&Protocol::InterceptProtocol<UrlRequestAsyncAsarJob>)
&Protocol::InterceptProtocol<URLRequestAsyncAsarJob>)
.SetMethod("interceptHttpProtocol",
&Protocol::InterceptProtocol<URLRequestFetchJob>)
.SetMethod("uninterceptProtocol", &Protocol::UninterceptProtocol);

View File

@@ -41,7 +41,7 @@ std::vector<std::string> MetricsToArray(uint32_t metrics) {
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_DEVICE_SCALE_FACTOR)
array.push_back("scaleFactor");
if (metrics & gfx::DisplayObserver::DISPLAY_METRIC_ROTATION)
array.push_back("rotaion");
array.push_back("rotation");
return array;
}

View File

@@ -9,12 +9,15 @@
#include "atom/browser/api/atom_api_cookies.h"
#include "atom/browser/api/atom_api_download_item.h"
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/api/atom_api_web_contents.h"
#include "atom/browser/api/save_page_handler.h"
#include "atom/browser/atom_browser_context.h"
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/net/atom_cert_verifier.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/net_converter.h"
#include "atom/common/node_includes.h"
#include "base/files/file_path.h"
#include "base/prefs/pref_service.h"
@@ -105,6 +108,24 @@ struct Converter<ClearStorageDataOptions> {
}
};
template<>
struct Converter<net::ProxyConfig> {
static bool FromV8(v8::Isolate* isolate,
v8::Local<v8::Value> val,
net::ProxyConfig* out) {
std::string proxy;
if (!ConvertFromV8(isolate, val, &proxy))
return false;
auto pac_url = GURL(proxy);
if (pac_url.is_valid()) {
out->set_pac_url(pac_url);
} else {
out->proxy_rules().ParseFromString(proxy);
}
return true;
}
};
} // namespace mate
namespace atom {
@@ -209,12 +230,12 @@ void ClearHttpCacheInIO(
}
void SetProxyInIO(net::URLRequestContextGetter* getter,
const std::string& proxy,
const net::ProxyConfig& config,
const base::Closure& callback) {
net::ProxyConfig config;
config.proxy_rules().ParseFromString(proxy);
auto proxy_service = getter->GetURLRequestContext()->proxy_service();
proxy_service->ResetConfigService(new net::ProxyConfigServiceFixed(config));
// Refetches and applies the new pac script if provided.
proxy_service->ForceReloadProxyConfig();
RunCallbackInUI(callback);
}
@@ -232,7 +253,6 @@ Session::Session(AtomBrowserContext* browser_context)
Session::~Session() {
content::BrowserContext::GetDownloadManager(browser_context())->
RemoveObserver(this);
Destroy();
}
void Session::OnDownloadCreated(content::DownloadManager* manager,
@@ -250,14 +270,6 @@ void Session::OnDownloadCreated(content::DownloadManager* manager,
}
}
bool Session::IsDestroyed() const {
return !browser_context_;
}
void Session::Destroy() {
browser_context_ = nullptr;
}
void Session::ResolveProxy(const GURL& url, ResolveProxyCallback callback) {
new ResolveProxyHelper(browser_context(), url, callback);
}
@@ -287,11 +299,11 @@ void Session::ClearStorageData(mate::Arguments* args) {
base::Time(), base::Time::Max(), callback);
}
void Session::SetProxy(const std::string& proxy,
void Session::SetProxy(const net::ProxyConfig& config,
const base::Closure& callback) {
auto getter = browser_context_->GetRequestContext();
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
base::Bind(&SetProxyInIO, base::Unretained(getter), proxy, callback));
base::Bind(&SetProxyInIO, base::Unretained(getter), config, callback));
}
void Session::SetDownloadPath(const base::FilePath& path) {
@@ -336,6 +348,17 @@ void Session::DisableNetworkEmulation() {
base::Passed(&conditions)));
}
void Session::SetCertVerifyProc(v8::Local<v8::Value> val,
mate::Arguments* args) {
AtomCertVerifier::VerifyProc proc;
if (!(val->IsNull() || mate::ConvertFromV8(args->isolate(), val, &proc))) {
args->ThrowError("Must pass null or function");
return;
}
browser_context_->cert_verifier()->SetVerifyProc(proc);
}
v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) {
if (cookies_.IsEmpty()) {
auto handle = atom::api::Cookies::Create(isolate, browser_context());
@@ -344,19 +367,6 @@ v8::Local<v8::Value> Session::Cookies(v8::Isolate* isolate) {
return v8::Local<v8::Value>::New(isolate, cookies_);
}
mate::ObjectTemplateBuilder Session::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
return mate::ObjectTemplateBuilder(isolate)
.SetMethod("resolveProxy", &Session::ResolveProxy)
.SetMethod("clearCache", &Session::ClearCache)
.SetMethod("clearStorageData", &Session::ClearStorageData)
.SetMethod("setProxy", &Session::SetProxy)
.SetMethod("setDownloadPath", &Session::SetDownloadPath)
.SetMethod("enableNetworkEmulation", &Session::EnableNetworkEmulation)
.SetMethod("disableNetworkEmulation", &Session::DisableNetworkEmulation)
.SetProperty("cookies", &Session::Cookies);
}
// static
mate::Handle<Session> Session::CreateFrom(
v8::Isolate* isolate, AtomBrowserContext* browser_context) {
@@ -377,14 +387,34 @@ mate::Handle<Session> Session::FromPartition(
static_cast<AtomBrowserContext*>(browser_context.get()));
}
void SetWrapSession(const WrapSessionCallback& callback) {
g_wrap_session = callback;
// static
void Session::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.MakeDestroyable()
.SetMethod("resolveProxy", &Session::ResolveProxy)
.SetMethod("clearCache", &Session::ClearCache)
.SetMethod("clearStorageData", &Session::ClearStorageData)
.SetMethod("setProxy", &Session::SetProxy)
.SetMethod("setDownloadPath", &Session::SetDownloadPath)
.SetMethod("enableNetworkEmulation", &Session::EnableNetworkEmulation)
.SetMethod("disableNetworkEmulation", &Session::DisableNetworkEmulation)
.SetMethod("setCertificateVerifyProc", &Session::SetCertVerifyProc)
.SetProperty("cookies", &Session::Cookies);
}
void ClearWrapSession() {
g_wrap_session.Reset();
}
void SetWrapSession(const WrapSessionCallback& callback) {
g_wrap_session = callback;
// Cleanup the wrapper on exit.
atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(
base::Bind(ClearWrapSession));
}
} // namespace api
} // namespace atom
@@ -397,7 +427,6 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
mate::Dictionary dict(isolate, exports);
dict.SetMethod("fromPartition", &atom::api::Session::FromPartition);
dict.SetMethod("_setWrapSession", &atom::api::SetWrapSession);
dict.SetMethod("_clearWrapSession", &atom::api::ClearWrapSession);
}
} // namespace

View File

@@ -23,6 +23,10 @@ class Arguments;
class Dictionary;
}
namespace net {
class ProxyConfig;
}
namespace atom {
class AtomBrowserContext;
@@ -44,6 +48,10 @@ class Session: public mate::TrackableObject<Session>,
AtomBrowserContext* browser_context() const { return browser_context_.get(); }
// mate::TrackableObject:
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype);
protected:
explicit Session(AtomBrowserContext* browser_context);
~Session();
@@ -52,22 +60,15 @@ class Session: public mate::TrackableObject<Session>,
void OnDownloadCreated(content::DownloadManager* manager,
content::DownloadItem* item) override;
// mate::Wrappable:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
bool IsDestroyed() const override;
private:
// mate::TrackableObject:
void Destroy() override;
void ResolveProxy(const GURL& url, ResolveProxyCallback callback);
void ClearCache(const net::CompletionCallback& callback);
void ClearStorageData(mate::Arguments* args);
void SetProxy(const std::string& proxy, const base::Closure& callback);
void SetProxy(const net::ProxyConfig& config, const base::Closure& callback);
void SetDownloadPath(const base::FilePath& path);
void EnableNetworkEmulation(const mate::Dictionary& options);
void DisableNetworkEmulation();
void SetCertVerifyProc(v8::Local<v8::Value> proc, mate::Arguments* args);
v8::Local<v8::Value> Cookies(v8::Isolate* isolate);
// Cached object for cookies API.

View File

@@ -44,21 +44,21 @@ mate::Wrappable* Tray::New(v8::Isolate* isolate, const gfx::Image& image) {
void Tray::OnClicked(const gfx::Rect& bounds, int modifiers) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
EmitCustomEvent("clicked",
EmitCustomEvent("click",
ModifiersToObject(isolate(), modifiers), bounds);
}
void Tray::OnDoubleClicked(const gfx::Rect& bounds, int modifiers) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
EmitCustomEvent("double-clicked",
EmitCustomEvent("double-click",
ModifiersToObject(isolate(), modifiers), bounds);
}
void Tray::OnRightClicked(const gfx::Rect& bounds, int modifiers) {
v8::Locker locker(isolate());
v8::HandleScope handle_scope(isolate());
EmitCustomEvent("right-clicked",
EmitCustomEvent("right-click",
ModifiersToObject(isolate(), modifiers), bounds);
}
@@ -67,23 +67,31 @@ void Tray::OnBalloonShow() {
}
void Tray::OnBalloonClicked() {
Emit("balloon-clicked");
Emit("balloon-click");
}
void Tray::OnBalloonClosed() {
Emit("balloon-closed");
}
void Tray::OnDrop() {
Emit("drop");
}
void Tray::OnDropFiles(const std::vector<std::string>& files) {
Emit("drop-files", files);
}
bool Tray::IsDestroyed() const {
return !tray_icon_;
void Tray::OnDragEntered() {
Emit("drag-enter");
}
void Tray::Destroy() {
tray_icon_.reset();
void Tray::OnDragExited() {
Emit("drag-leave");
}
void Tray::OnDragEnded() {
Emit("drag-end");
}
void Tray::SetImage(mate::Arguments* args, const gfx::Image& image) {
@@ -121,9 +129,11 @@ void Tray::DisplayBalloon(mate::Arguments* args,
}
void Tray::PopUpContextMenu(mate::Arguments* args) {
mate::Handle<Menu> menu;
args->GetNext(&menu);
gfx::Point pos;
args->GetNext(&pos);
tray_icon_->PopUpContextMenu(pos);
tray_icon_->PopUpContextMenu(pos, menu.IsEmpty() ? nullptr : menu->model());
}
void Tray::SetContextMenu(mate::Arguments* args, Menu* menu) {
@@ -144,7 +154,7 @@ v8::Local<v8::Object> Tray::ModifiersToObject(v8::Isolate* isolate,
void Tray::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.SetMethod("destroy", &Tray::Destroy, true)
.MakeDestroyable()
.SetMethod("setImage", &Tray::SetImage)
.SetMethod("setPressedImage", &Tray::SetPressedImage)
.SetMethod("setToolTip", &Tray::SetToolTip)

View File

@@ -8,7 +8,7 @@
#include <string>
#include <vector>
#include "atom/browser/api/event_emitter.h"
#include "atom/browser/api/trackable_object.h"
#include "atom/browser/ui/tray_icon_observer.h"
#include "base/memory/scoped_ptr.h"
@@ -29,7 +29,7 @@ namespace api {
class Menu;
class Tray : public mate::EventEmitter,
class Tray : public mate::TrackableObject<Tray>,
public TrayIconObserver {
public:
static mate::Wrappable* New(v8::Isolate* isolate, const gfx::Image& image);
@@ -39,7 +39,7 @@ class Tray : public mate::EventEmitter,
protected:
explicit Tray(const gfx::Image& image);
virtual ~Tray();
~Tray() override;
// TrayIconObserver:
void OnClicked(const gfx::Rect& bounds, int modifiers) override;
@@ -48,12 +48,12 @@ class Tray : public mate::EventEmitter,
void OnBalloonShow() override;
void OnBalloonClicked() override;
void OnBalloonClosed() override;
void OnDrop() override;
void OnDropFiles(const std::vector<std::string>& files) override;
void OnDragEntered() override;
void OnDragExited() override;
void OnDragEnded() override;
// mate::Wrappable:
bool IsDestroyed() const override;
void Destroy();
void SetImage(mate::Arguments* args, const gfx::Image& image);
void SetPressedImage(mate::Arguments* args, const gfx::Image& image);
void SetToolTip(mate::Arguments* args, const std::string& tool_tip);

View File

@@ -18,6 +18,7 @@
#include "atom/common/api/event_emitter_caller.h"
#include "atom/common/native_mate_converters/blink_converter.h"
#include "atom/common/native_mate_converters/callback.h"
#include "atom/common/native_mate_converters/content_converter.h"
#include "atom/common/native_mate_converters/file_path_converter.h"
#include "atom/common/native_mate_converters/gfx_converter.h"
#include "atom/common/native_mate_converters/gurl_converter.h"
@@ -46,6 +47,7 @@
#include "content/public/browser/storage_partition.h"
#include "content/public/browser/site_instance.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/context_menu_params.h"
#include "native_mate/dictionary.h"
#include "native_mate/object_template_builder.h"
#include "net/http/http_response_headers.h"
@@ -169,11 +171,12 @@ struct Converter<content::SavePageType> {
std::string save_type;
if (!ConvertFromV8(isolate, val, &save_type))
return false;
if (save_type == "HTMLOnly") {
save_type = base::StringToLowerASCII(save_type);
if (save_type == "htmlonly") {
*out = content::SAVE_PAGE_TYPE_AS_ONLY_HTML;
} else if (save_type == "HTMLComplete") {
} else if (save_type == "htmlcomplete") {
*out = content::SAVE_PAGE_TYPE_AS_COMPLETE_HTML;
} else if (save_type == "MHTML") {
} else if (save_type == "mhtml") {
*out = content::SAVE_PAGE_TYPE_AS_MHTML;
} else {
return false;
@@ -191,8 +194,6 @@ namespace api {
namespace {
v8::Persistent<v8::ObjectTemplate> template_;
// The wrapWebContents function which is implemented in JavaScript
using WrapWebContentsCallback = base::Callback<void(v8::Local<v8::Value>)>;
WrapWebContentsCallback g_wrap_web_contents;
@@ -266,9 +267,7 @@ WebContents::WebContents(v8::Isolate* isolate,
managed_web_contents()->GetView()->SetDelegate(this);
// Save the preferences in C++.
base::DictionaryValue web_preferences;
mate::ConvertFromV8(isolate, options.GetHandle(), &web_preferences);
new WebContentsPreferences(web_contents, &web_preferences);
new WebContentsPreferences(web_contents, options);
web_contents->SetUserAgentOverride(GetBrowserContext()->GetUserAgent());
@@ -289,7 +288,15 @@ WebContents::WebContents(v8::Isolate* isolate,
}
WebContents::~WebContents() {
Destroy();
if (type_ == WEB_VIEW && managed_web_contents()) {
// When force destroying the "destroyed" event is not emitted.
WebContentsDestroyed();
guest_delegate_->Destroy();
Observe(nullptr);
DestroyWebContents();
}
}
bool WebContents::AddMessageToConsole(content::WebContents* source,
@@ -404,6 +411,15 @@ void WebContents::RendererResponsive(content::WebContents* source) {
owner_window()->RendererResponsive(source);
}
bool WebContents::HandleContextMenu(const content::ContextMenuParams& params) {
if (!params.custom_context.is_pepper_menu)
return false;
Emit("pepper-context-menu", std::make_pair(params, web_contents()));
web_contents()->NotifyContextMenuClosed(params.custom_context);
return true;
}
void WebContents::BeforeUnloadFired(const base::TimeTicks& proceed_time) {
// Do nothing, we override this method just to avoid compilation error since
// there are two virtual functions named BeforeUnloadFired.
@@ -450,14 +466,13 @@ void WebContents::DidFinishLoad(content::RenderFrameHost* render_frame_host,
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,
const GURL& url,
int error_code,
const base::string16& error_description,
bool was_ignored_by_handler) {
Emit("did-fail-load", error_code, error_description, validated_url);
Emit("did-fail-provisional-load", error_code, error_description, url);
}
void WebContents::DidFailLoad(content::RenderFrameHost* render_frame_host,
@@ -510,9 +525,10 @@ void WebContents::DidNavigateMainFrame(
void WebContents::TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) {
// Back/Forward navigation may have pruned entries.
if (entry)
Emit("page-title-set", entry->GetTitle(), explicit_set);
Emit("-page-title-updated", entry->GetTitle(), explicit_set);
else
Emit("-page-title-updated", "", explicit_set);
}
void WebContents::DidUpdateFaviconURL(
@@ -581,23 +597,6 @@ void WebContents::NavigationEntryCommitted(
details.is_in_page, details.did_replace_entry);
}
void WebContents::Destroy() {
session_.Reset();
if (type_ == WEB_VIEW && managed_web_contents()) {
// When force destroying the "destroyed" event is not emitted.
WebContentsDestroyed();
guest_delegate_->Destroy();
Observe(nullptr);
DestroyWebContents();
}
}
bool WebContents::IsAlive() const {
return web_contents() != NULL;
}
int WebContents::GetID() const {
return web_contents()->GetRenderProcessHost()->GetID();
}
@@ -618,12 +617,25 @@ void WebContents::LoadURL(const GURL& url, const mate::Dictionary& options) {
if (options.Get("userAgent", &user_agent))
SetUserAgent(user_agent);
std::string extra_headers;
if (options.Get("extraHeaders", &extra_headers))
params.extra_headers = extra_headers;
params.transition_type = ui::PAGE_TRANSITION_TYPED;
params.should_clear_history_list = true;
params.override_user_agent = content::NavigationController::UA_OVERRIDE_TRUE;
web_contents()->GetController().LoadURLWithParams(params);
}
void WebContents::DownloadURL(const GURL& url) {
auto browser_context = web_contents()->GetBrowserContext();
auto download_manager =
content::BrowserContext::GetDownloadManager(browser_context);
download_manager->DownloadUrl(
content::DownloadUrlParameters::FromWebContents(web_contents(), url));
}
GURL WebContents::GetURL() const {
return web_contents()->GetURL();
}
@@ -644,10 +656,6 @@ void WebContents::Stop() {
web_contents()->Stop();
}
void WebContents::ReloadIgnoringCache() {
web_contents()->GetController().ReloadIgnoringCache(false);
}
void WebContents::GoBack() {
atom::AtomBrowserClient::SuppressRendererProcessRestartForOnce();
web_contents()->GetController().GoBack();
@@ -981,83 +989,73 @@ v8::Local<v8::Value> WebContents::DevToolsWebContents(v8::Isolate* isolate) {
return v8::Local<v8::Value>::New(isolate, devtools_web_contents_);
}
mate::ObjectTemplateBuilder WebContents::GetObjectTemplateBuilder(
v8::Isolate* isolate) {
if (template_.IsEmpty())
template_.Reset(isolate, mate::ObjectTemplateBuilder(isolate)
.SetMethod("destroy", &WebContents::Destroy, true)
.SetMethod("isAlive", &WebContents::IsAlive, true)
.SetMethod("getId", &WebContents::GetID)
.SetMethod("equal", &WebContents::Equal)
.SetMethod("_loadUrl", &WebContents::LoadURL)
.SetMethod("_getUrl", &WebContents::GetURL)
.SetMethod("getTitle", &WebContents::GetTitle)
.SetMethod("isLoading", &WebContents::IsLoading)
.SetMethod("isWaitingForResponse", &WebContents::IsWaitingForResponse)
.SetMethod("_stop", &WebContents::Stop)
.SetMethod("_reloadIgnoringCache", &WebContents::ReloadIgnoringCache)
.SetMethod("_goBack", &WebContents::GoBack)
.SetMethod("_goForward", &WebContents::GoForward)
.SetMethod("_goToOffset", &WebContents::GoToOffset)
.SetMethod("isCrashed", &WebContents::IsCrashed)
.SetMethod("setUserAgent", &WebContents::SetUserAgent)
.SetMethod("getUserAgent", &WebContents::GetUserAgent)
.SetMethod("insertCSS", &WebContents::InsertCSS)
.SetMethod("savePage", &WebContents::SavePage)
.SetMethod("_executeJavaScript", &WebContents::ExecuteJavaScript)
.SetMethod("openDevTools", &WebContents::OpenDevTools)
.SetMethod("closeDevTools", &WebContents::CloseDevTools)
.SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened)
.SetMethod("enableDeviceEmulation",
&WebContents::EnableDeviceEmulation)
.SetMethod("disableDeviceEmulation",
&WebContents::DisableDeviceEmulation)
.SetMethod("toggleDevTools", &WebContents::ToggleDevTools)
.SetMethod("inspectElement", &WebContents::InspectElement)
.SetMethod("setAudioMuted", &WebContents::SetAudioMuted)
.SetMethod("isAudioMuted", &WebContents::IsAudioMuted)
.SetMethod("undo", &WebContents::Undo)
.SetMethod("redo", &WebContents::Redo)
.SetMethod("cut", &WebContents::Cut)
.SetMethod("copy", &WebContents::Copy)
.SetMethod("paste", &WebContents::Paste)
.SetMethod("pasteAndMatchStyle", &WebContents::PasteAndMatchStyle)
.SetMethod("delete", &WebContents::Delete)
.SetMethod("selectAll", &WebContents::SelectAll)
.SetMethod("unselect", &WebContents::Unselect)
.SetMethod("replace", &WebContents::Replace)
.SetMethod("replaceMisspelling", &WebContents::ReplaceMisspelling)
.SetMethod("focus", &WebContents::Focus)
.SetMethod("tabTraverse", &WebContents::TabTraverse)
.SetMethod("_send", &WebContents::SendIPCMessage, true)
.SetMethod("sendInputEvent", &WebContents::SendInputEvent)
.SetMethod("beginFrameSubscription",
&WebContents::BeginFrameSubscription)
.SetMethod("endFrameSubscription", &WebContents::EndFrameSubscription)
.SetMethod("setSize", &WebContents::SetSize)
.SetMethod("setAllowTransparency", &WebContents::SetAllowTransparency)
.SetMethod("isGuest", &WebContents::IsGuest)
.SetMethod("getWebPreferences", &WebContents::GetWebPreferences)
.SetMethod("getOwnerBrowserWindow", &WebContents::GetOwnerBrowserWindow)
.SetMethod("hasServiceWorker", &WebContents::HasServiceWorker)
.SetMethod("unregisterServiceWorker",
&WebContents::UnregisterServiceWorker)
.SetMethod("inspectServiceWorker", &WebContents::InspectServiceWorker)
.SetMethod("print", &WebContents::Print)
.SetMethod("_printToPDF", &WebContents::PrintToPDF)
.SetMethod("addWorkSpace", &WebContents::AddWorkSpace)
.SetMethod("removeWorkSpace", &WebContents::RemoveWorkSpace)
.SetProperty("session", &WebContents::Session, true)
.SetProperty("devToolsWebContents",
&WebContents::DevToolsWebContents, true)
.Build());
return mate::ObjectTemplateBuilder(
isolate, v8::Local<v8::ObjectTemplate>::New(isolate, template_));
}
bool WebContents::IsDestroyed() const {
return !IsAlive();
// static
void WebContents::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.MakeDestroyable()
.SetMethod("getId", &WebContents::GetID)
.SetMethod("equal", &WebContents::Equal)
.SetMethod("_loadURL", &WebContents::LoadURL)
.SetMethod("downloadURL", &WebContents::DownloadURL)
.SetMethod("_getURL", &WebContents::GetURL)
.SetMethod("getTitle", &WebContents::GetTitle)
.SetMethod("isLoading", &WebContents::IsLoading)
.SetMethod("isWaitingForResponse", &WebContents::IsWaitingForResponse)
.SetMethod("_stop", &WebContents::Stop)
.SetMethod("_goBack", &WebContents::GoBack)
.SetMethod("_goForward", &WebContents::GoForward)
.SetMethod("_goToOffset", &WebContents::GoToOffset)
.SetMethod("isCrashed", &WebContents::IsCrashed)
.SetMethod("setUserAgent", &WebContents::SetUserAgent)
.SetMethod("getUserAgent", &WebContents::GetUserAgent)
.SetMethod("insertCSS", &WebContents::InsertCSS)
.SetMethod("savePage", &WebContents::SavePage)
.SetMethod("_executeJavaScript", &WebContents::ExecuteJavaScript)
.SetMethod("openDevTools", &WebContents::OpenDevTools)
.SetMethod("closeDevTools", &WebContents::CloseDevTools)
.SetMethod("isDevToolsOpened", &WebContents::IsDevToolsOpened)
.SetMethod("enableDeviceEmulation",
&WebContents::EnableDeviceEmulation)
.SetMethod("disableDeviceEmulation",
&WebContents::DisableDeviceEmulation)
.SetMethod("toggleDevTools", &WebContents::ToggleDevTools)
.SetMethod("inspectElement", &WebContents::InspectElement)
.SetMethod("setAudioMuted", &WebContents::SetAudioMuted)
.SetMethod("isAudioMuted", &WebContents::IsAudioMuted)
.SetMethod("undo", &WebContents::Undo)
.SetMethod("redo", &WebContents::Redo)
.SetMethod("cut", &WebContents::Cut)
.SetMethod("copy", &WebContents::Copy)
.SetMethod("paste", &WebContents::Paste)
.SetMethod("pasteAndMatchStyle", &WebContents::PasteAndMatchStyle)
.SetMethod("delete", &WebContents::Delete)
.SetMethod("selectAll", &WebContents::SelectAll)
.SetMethod("unselect", &WebContents::Unselect)
.SetMethod("replace", &WebContents::Replace)
.SetMethod("replaceMisspelling", &WebContents::ReplaceMisspelling)
.SetMethod("focus", &WebContents::Focus)
.SetMethod("tabTraverse", &WebContents::TabTraverse)
.SetMethod("_send", &WebContents::SendIPCMessage)
.SetMethod("sendInputEvent", &WebContents::SendInputEvent)
.SetMethod("beginFrameSubscription",
&WebContents::BeginFrameSubscription)
.SetMethod("endFrameSubscription", &WebContents::EndFrameSubscription)
.SetMethod("setSize", &WebContents::SetSize)
.SetMethod("setAllowTransparency", &WebContents::SetAllowTransparency)
.SetMethod("isGuest", &WebContents::IsGuest)
.SetMethod("getWebPreferences", &WebContents::GetWebPreferences)
.SetMethod("getOwnerBrowserWindow", &WebContents::GetOwnerBrowserWindow)
.SetMethod("hasServiceWorker", &WebContents::HasServiceWorker)
.SetMethod("unregisterServiceWorker",
&WebContents::UnregisterServiceWorker)
.SetMethod("inspectServiceWorker", &WebContents::InspectServiceWorker)
.SetMethod("print", &WebContents::Print)
.SetMethod("_printToPDF", &WebContents::PrintToPDF)
.SetMethod("addWorkSpace", &WebContents::AddWorkSpace)
.SetMethod("removeWorkSpace", &WebContents::RemoveWorkSpace)
.SetProperty("session", &WebContents::Session)
.SetProperty("devToolsWebContents", &WebContents::DevToolsWebContents);
}
AtomBrowserContext* WebContents::GetBrowserContext() const {
@@ -1108,14 +1106,18 @@ mate::Handle<WebContents> WebContents::Create(
return handle;
}
void SetWrapWebContents(const WrapWebContentsCallback& callback) {
g_wrap_web_contents = callback;
}
void ClearWrapWebContents() {
g_wrap_web_contents.Reset();
}
void SetWrapWebContents(const WrapWebContentsCallback& callback) {
g_wrap_web_contents = callback;
// Cleanup the wrapper on exit.
atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(
base::Bind(ClearWrapWebContents));
}
} // namespace api
} // namespace atom
@@ -1129,7 +1131,6 @@ void Initialize(v8::Local<v8::Object> exports, v8::Local<v8::Value> unused,
mate::Dictionary dict(isolate, exports);
dict.SetMethod("create", &atom::api::WebContents::Create);
dict.SetMethod("_setWrapWebContents", &atom::api::SetWrapWebContents);
dict.SetMethod("_clearWrapWebContents", &atom::api::ClearWrapWebContents);
}
} // namespace

View File

@@ -54,13 +54,10 @@ class WebContents : public mate::TrackableObject<WebContents>,
static mate::Handle<WebContents> Create(
v8::Isolate* isolate, const mate::Dictionary& options);
// mate::TrackableObject:
void Destroy() override;
bool IsAlive() const;
int GetID() const;
bool Equal(const WebContents* web_contents) const;
void LoadURL(const GURL& url, const mate::Dictionary& options);
void DownloadURL(const GURL& url);
GURL GetURL() const;
base::string16 GetTitle() const;
bool IsLoading() const;
@@ -145,16 +142,15 @@ class WebContents : public mate::TrackableObject<WebContents>,
v8::Local<v8::Value> Session(v8::Isolate* isolate);
v8::Local<v8::Value> DevToolsWebContents(v8::Isolate* isolate);
// mate::TrackableObject:
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype);
protected:
explicit WebContents(content::WebContents* web_contents);
WebContents(v8::Isolate* isolate, const mate::Dictionary& options);
~WebContents();
// mate::Wrappable:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override;
bool IsDestroyed() const override;
// content::WebContentsDelegate:
bool AddMessageToConsole(content::WebContents* source,
int32 level,
@@ -189,6 +185,7 @@ class WebContents : public mate::TrackableObject<WebContents>,
void ExitFullscreenModeForTab(content::WebContents* source) override;
void RendererUnresponsive(content::WebContents* source) override;
void RendererResponsive(content::WebContents* source) override;
bool HandleContextMenu(const content::ContextMenuParams& params) override;
// content::WebContentsObserver:
void BeforeUnloadFired(const base::TimeTicks& proceed_time) override;

View File

@@ -3,6 +3,7 @@
// found in the LICENSE file.
#include "atom/browser/api/atom_api_window.h"
#include "atom/common/native_mate_converters/value_converter.h"
#include "atom/browser/api/atom_api_menu.h"
#include "atom/browser/api/atom_api_web_contents.h"
@@ -60,22 +61,82 @@ void OnCapturePageDone(
callback.Run(gfx::Image::CreateFrom1xBitmap(bitmap));
}
// Converts min-width to minWidth, returns false if no conversion is needed.
bool TranslateOldKey(const std::string& key, std::string* new_key) {
if (key.find('-') == std::string::npos)
return false;
new_key->reserve(key.size());
bool next_upper_case = false;
for (char c : key) {
if (c == '-') {
next_upper_case = true;
} else if (next_upper_case) {
new_key->push_back(base::ToUpperASCII(c));
next_upper_case = false;
} else {
new_key->push_back(c);
}
}
return true;
}
// Converts min-width to minWidth recursively in the dictionary.
void TranslateOldOptions(v8::Isolate* isolate, v8::Local<v8::Object> options) {
auto context = isolate->GetCurrentContext();
auto maybe_keys = options->GetOwnPropertyNames(context);
if (maybe_keys.IsEmpty())
return;
std::vector<std::string> keys;
if (!mate::ConvertFromV8(isolate, maybe_keys.ToLocalChecked(), &keys))
return;
mate::Dictionary dict(isolate, options);
for (const auto& key : keys) {
v8::Local<v8::Value> value;
if (!dict.Get(key, &value)) // Shouldn't happen, but guard it anyway.
continue;
// Go recursively.
v8::Local<v8::Object> sub_options;
if (mate::ConvertFromV8(isolate, value, &sub_options))
TranslateOldOptions(isolate, sub_options);
// Translate key.
std::string new_key;
if (TranslateOldKey(key, &new_key)) {
dict.Set(new_key, value);
dict.Delete(key);
}
}
}
#if defined(OS_WIN)
// Converts binary data to Buffer.
v8::Local<v8::Value> ToBuffer(v8::Isolate* isolate, void* val, int size) {
auto buffer = node::Buffer::New(isolate, static_cast<char*>(val), size);
if (buffer.IsEmpty())
return v8::Null(isolate);
else
return buffer.ToLocalChecked();
}
#endif
} // namespace
Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) {
// Use options['web-preferences'] to create WebContents.
// Be compatible with old style field names like min-width.
TranslateOldOptions(isolate, options.GetHandle());
// Use options.webPreferences to create WebContents.
mate::Dictionary web_preferences = mate::Dictionary::CreateEmpty(isolate);
options.Get(switches::kWebPreferences, &web_preferences);
options.Get(options::kWebPreferences, &web_preferences);
// Be compatible with old options which are now in web_preferences.
v8::Local<v8::Value> value;
if (options.Get(switches::kNodeIntegration, &value))
web_preferences.Set(switches::kNodeIntegration, value);
if (options.Get(switches::kPreloadScript, &value))
web_preferences.Set(switches::kPreloadScript, value);
if (options.Get(switches::kZoomFactor, &value))
web_preferences.Set(switches::kZoomFactor, value);
if (options.Get(options::kNodeIntegration, &value))
web_preferences.Set(options::kNodeIntegration, value);
if (options.Get(options::kPreloadScript, &value))
web_preferences.Set(options::kPreloadScript, value);
if (options.Get(options::kZoomFactor, &value))
web_preferences.Set(options::kZoomFactor, value);
// Creates the WebContents used by BrowserWindow.
auto web_contents = WebContents::Create(isolate, web_preferences);
@@ -96,13 +157,12 @@ Window::Window(v8::Isolate* isolate, const mate::Dictionary& options) {
}
Window::~Window() {
if (window_)
Destroy();
}
if (!window_->IsClosed())
window_->CloseContents(nullptr);
void Window::OnPageTitleUpdated(bool* prevent_default,
const std::string& title) {
*prevent_default = Emit("page-title-updated", title);
// Destroy the native window in next tick because the native code might be
// iterating all windows.
base::MessageLoop::current()->DeleteSoon(FROM_HERE, window_.release());
}
void Window::WillCloseWindow(bool* prevent_default) {
@@ -110,19 +170,19 @@ void Window::WillCloseWindow(bool* prevent_default) {
}
void Window::OnWindowClosed() {
if (api_web_contents_) {
api_web_contents_->DestroyWebContents();
api_web_contents_ = nullptr;
web_contents_.Reset();
}
api_web_contents_->DestroyWebContents();
RemoveFromWeakMap();
window_->RemoveObserver(this);
// We can not call Destroy here because we need to call Emit first, but we
// also do not want any method to be used, so just mark as destroyed here.
MarkDestroyed();
Emit("closed");
// Clean up the resources after window has been closed.
base::MessageLoop::current()->DeleteSoon(FROM_HERE, window_.release());
// Destroy the native class when window is closed.
base::MessageLoop::current()->PostTask(FROM_HERE, GetDestroyClosure());
}
void Window::OnWindowBlur() {
@@ -189,34 +249,41 @@ void Window::OnExecuteWindowsCommand(const std::string& command_name) {
Emit("app-command", command_name);
}
#if defined(OS_WIN)
void Window::OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) {
if (IsWindowMessageHooked(message)) {
messages_callback_map_[message].Run(
ToBuffer(isolate(), static_cast<void*>(&w_param), sizeof(WPARAM)),
ToBuffer(isolate(), static_cast<void*>(&l_param), sizeof(LPARAM)));
}
}
#endif
// static
mate::Wrappable* Window::New(v8::Isolate* isolate,
const mate::Dictionary& options) {
mate::Wrappable* Window::New(v8::Isolate* isolate, mate::Arguments* args) {
if (!Browser::Get()->is_ready()) {
isolate->ThrowException(v8::Exception::Error(mate::StringToV8(
isolate, "Cannot create BrowserWindow before app is ready")));
return nullptr;
}
if (args->Length() > 1) {
args->ThrowError();
return nullptr;
}
mate::Dictionary options;
if (!(args->Length() == 1 && args->GetNext(&options))) {
options = mate::Dictionary::CreateEmpty(isolate);
}
return new Window(isolate, options);
}
bool Window::IsDestroyed() const {
return !window_ || window_->IsClosed();
}
void Window::Destroy() {
if (window_)
window_->CloseContents(nullptr);
}
void Window::Close() {
window_->Close();
}
bool Window::IsClosed() {
return window_->IsClosed();
}
void Window::Focus() {
window_->Focus(true);
}
@@ -385,6 +452,10 @@ bool Window::IsKiosk() {
return window_->IsKiosk();
}
void Window::SetBackgroundColor(const std::string& color_name) {
window_->SetBackgroundColor(color_name);
}
void Window::FocusOnWebView() {
window_->FocusOnWebView();
}
@@ -488,6 +559,29 @@ bool Window::IsMenuBarVisible() {
return window_->IsMenuBarVisible();
}
#if defined(OS_WIN)
bool Window::HookWindowMessage(UINT message,
const MessageCallback& callback) {
messages_callback_map_[message] = callback;
return true;
}
void Window::UnhookWindowMessage(UINT message) {
if (!ContainsKey(messages_callback_map_, message))
return;
messages_callback_map_.erase(message);
}
bool Window::IsWindowMessageHooked(UINT message) {
return ContainsKey(messages_callback_map_, message);
}
void Window::UnhookAllWindowMessages() {
messages_callback_map_.clear();
}
#endif
#if defined(OS_MACOSX)
void Window::ShowDefinitionForSelection() {
window_->ShowDefinitionForSelection();
@@ -523,9 +617,8 @@ v8::Local<v8::Value> Window::WebContents(v8::Isolate* isolate) {
void Window::BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype) {
mate::ObjectTemplateBuilder(isolate, prototype)
.SetMethod("destroy", &Window::Destroy, true)
.MakeDestroyable()
.SetMethod("close", &Window::Close)
.SetMethod("isClosed", &Window::IsClosed)
.SetMethod("focus", &Window::Focus)
.SetMethod("isFocused", &Window::IsFocused)
.SetMethod("show", &Window::Show)
@@ -564,6 +657,7 @@ void Window::BuildPrototype(v8::Isolate* isolate,
.SetMethod("setSkipTaskbar", &Window::SetSkipTaskbar)
.SetMethod("setKiosk", &Window::SetKiosk)
.SetMethod("isKiosk", &Window::IsKiosk)
.SetMethod("setBackgroundColor", &Window::SetBackgroundColor)
.SetMethod("setRepresentedFilename", &Window::SetRepresentedFilename)
.SetMethod("getRepresentedFilename", &Window::GetRepresentedFilename)
.SetMethod("setDocumentEdited", &Window::SetDocumentEdited)
@@ -585,12 +679,18 @@ void Window::BuildPrototype(v8::Isolate* isolate,
&Window::SetVisibleOnAllWorkspaces)
.SetMethod("isVisibleOnAllWorkspaces",
&Window::IsVisibleOnAllWorkspaces)
#if defined(OS_WIN)
.SetMethod("hookWindowMessage", &Window::HookWindowMessage)
.SetMethod("isWindowMessageHooked", &Window::IsWindowMessageHooked)
.SetMethod("unhookWindowMessage", &Window::UnhookWindowMessage)
.SetMethod("unhookAllWindowMessages", &Window::UnhookAllWindowMessages)
#endif
#if defined(OS_MACOSX)
.SetMethod("showDefinitionForSelection",
&Window::ShowDefinitionForSelection)
#endif
.SetProperty("id", &Window::ID, true)
.SetProperty("webContents", &Window::WebContents, true);
.SetProperty("id", &Window::ID)
.SetProperty("webContents", &Window::WebContents);
}
// static

View File

@@ -5,6 +5,7 @@
#ifndef ATOM_BROWSER_API_ATOM_API_WINDOW_H_
#define ATOM_BROWSER_API_ATOM_API_WINDOW_H_
#include <map>
#include <string>
#include <vector>
@@ -37,8 +38,7 @@ class WebContents;
class Window : public mate::TrackableObject<Window>,
public NativeWindowObserver {
public:
static mate::Wrappable* New(v8::Isolate* isolate,
const mate::Dictionary& options);
static mate::Wrappable* New(v8::Isolate* isolate, mate::Arguments* args);
static void BuildPrototype(v8::Isolate* isolate,
v8::Local<v8::ObjectTemplate> prototype);
@@ -54,8 +54,6 @@ class Window : public mate::TrackableObject<Window>,
virtual ~Window();
// NativeWindowObserver:
void OnPageTitleUpdated(bool* prevent_default,
const std::string& title) override;
void WillCloseWindow(bool* prevent_default) override;
void OnWindowClosed() override;
void OnWindowBlur() override;
@@ -75,16 +73,13 @@ class Window : public mate::TrackableObject<Window>,
void OnRendererResponsive() override;
void OnExecuteWindowsCommand(const std::string& command_name) override;
// mate::Wrappable:
bool IsDestroyed() const override;
#if defined(OS_WIN)
void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) override;
#endif
private:
// mate::TrackableObject:
void Destroy() override;
// APIs for NativeWindow.
void Close();
bool IsClosed();
void Focus();
bool IsFocused();
void Show();
@@ -122,6 +117,7 @@ class Window : public mate::TrackableObject<Window>,
void SetSkipTaskbar(bool skip);
void SetKiosk(bool kiosk);
bool IsKiosk();
void SetBackgroundColor(const std::string& color_name);
void FocusOnWebView();
void BlurWebView();
bool IsWebViewFocused();
@@ -142,6 +138,16 @@ class Window : public mate::TrackableObject<Window>,
bool IsMenuBarVisible();
void SetAspectRatio(double aspect_ratio, mate::Arguments* args);
#if defined(OS_WIN)
typedef base::Callback<void(v8::Local<v8::Value>,
v8::Local<v8::Value>)> MessageCallback;
bool HookWindowMessage(UINT message, const MessageCallback& callback);
bool IsWindowMessageHooked(UINT message);
void UnhookWindowMessage(UINT message);
void UnhookAllWindowMessages();
#endif
#if defined(OS_MACOSX)
void ShowDefinitionForSelection();
#endif
@@ -152,6 +158,11 @@ class Window : public mate::TrackableObject<Window>,
int32_t ID() const;
v8::Local<v8::Value> WebContents(v8::Isolate* isolate);
#if defined(OS_WIN)
typedef std::map<UINT, MessageCallback> MessageCallbackMap;
MessageCallbackMap messages_callback_map_;
#endif
v8::Global<v8::Value> web_contents_;
v8::Global<v8::Value> menu_;

View File

@@ -38,6 +38,9 @@ void FrameSubscriber::OnFrameDelivered(
if (!result)
return;
v8::Locker locker(isolate_);
v8::HandleScope handle_scope(isolate_);
gfx::Rect rect = frame->visible_rect();
size_t rgb_arr_size = rect.width() * rect.height() * 4;
v8::MaybeLocal<v8::Object> buffer = node::Buffer::New(isolate_, rgb_arr_size);
@@ -56,8 +59,6 @@ void FrameSubscriber::OnFrameDelivered(
rect.width() * 4,
media::YV12);
v8::Locker locker(isolate_);
v8::HandleScope handle_scope(isolate_);
callback_.Run(buffer.ToLocalChecked());
}

View File

@@ -1,30 +1,17 @@
EventEmitter = require('events').EventEmitter
{deprecate, session, Menu} = require 'electron'
{EventEmitter} = require 'events'
bindings = process.atomBinding 'app'
sessionBindings = process.atomBinding 'session'
downloadItemBindings = process.atomBinding 'download_item'
app = bindings.app
app.__proto__ = EventEmitter.prototype
wrapSession = (session) ->
# session is an Event Emitter.
session.__proto__ = EventEmitter.prototype
wrapDownloadItem = (download_item) ->
# download_item is an Event Emitter.
download_item.__proto__ = EventEmitter.prototype
# Be compatible with old APIs.
download_item.url = download_item.getUrl()
download_item.filename = download_item.getFilename()
download_item.mimeType = download_item.getMimeType()
download_item.hasUserGesture = download_item.hasUserGesture()
app.setApplicationMenu = (menu) ->
require('menu').setApplicationMenu menu
Menu.setApplicationMenu menu
app.getApplicationMenu = ->
require('menu').getApplicationMenu()
Menu.getApplicationMenu()
app.commandLine =
appendSwitch: bindings.appendSwitch,
@@ -47,22 +34,39 @@ app.setAppPath = (path) ->
app.getAppPath = ->
appPath
# Be compatible with old API.
app.once 'ready', -> @emit 'finish-launching'
app.terminate = app.quit
app.exit = process.exit
app.getHomeDir = -> @getPath 'home'
app.getDataPath = -> @getPath 'userData'
app.setDataPath = (path) -> @setPath 'userData', path
app.resolveProxy = -> @defaultSession.resolveProxy.apply @defaultSession, arguments
app.on 'activate', (event, hasVisibleWindows) -> @emit 'activate-with-no-open-windows' if not hasVisibleWindows
# Routes the events to webContents.
for name in ['login', 'certificate-error', 'select-client-certificate']
do (name) ->
app.on name, (event, webContents, args...) ->
webContents.emit name, event, args...
# Session wrapper.
sessionBindings._setWrapSession wrapSession
process.once 'exit', sessionBindings._clearWrapSession
# Deprecated.
app.getHomeDir = deprecate 'app.getHomeDir', 'app.getPath', ->
@getPath 'home'
app.getDataPath = deprecate 'app.getDataPath', 'app.getPath', ->
@getPath 'userData'
app.setDataPath = deprecate 'app.setDataPath', 'app.setPath', (path) ->
@setPath 'userData', path
app.resolveProxy = deprecate 'app.resolveProxy', 'session.defaultSession.resolveProxy', (url, callback) ->
session.defaultSession.resolveProxy url, callback
deprecate.rename app, 'terminate', 'quit'
deprecate.event app, 'finish-launching', 'ready', ->
setImmediate => # give default app a chance to setup default menu.
@emit 'finish-launching'
deprecate.event app, 'activate-with-no-open-windows', 'activate', (event, hasVisibleWindows) ->
@emit 'activate-with-no-open-windows', event if not hasVisibleWindows
deprecate.event app, 'select-certificate', 'select-client-certificate'
# Wrappers for native classes.
wrapDownloadItem = (downloadItem) ->
# downloadItem is an EventEmitter.
downloadItem.__proto__ = EventEmitter.prototype
# Deprecated.
deprecate.property downloadItem, 'url', 'getURL'
deprecate.property downloadItem, 'filename', 'getFilename'
deprecate.property downloadItem, 'mimeType', 'getMimeType'
deprecate.rename downloadItem, 'getUrl', 'getURL'
downloadItemBindings._setWrapDownloadItem wrapDownloadItem
process.once 'exit', downloadItemBindings._clearWrapDownloadItem
# Only one App object pemitted.
module.exports = app

View File

@@ -1,6 +0,0 @@
module.exports =
browserMainParts:
preMainMessageLoopRun: ->
setImmediate ->
module.exports.browserMainParts.preMainMessageLoopRun()

View File

@@ -1,24 +1,12 @@
autoUpdater = process.atomBinding('auto_updater').autoUpdater
EventEmitter = require('events').EventEmitter
{deprecate} = require 'electron'
autoUpdater.__proto__ = EventEmitter.prototype
autoUpdater =
if process.platform is 'win32'
require './auto-updater/auto-updater-win'
else
require './auto-updater/auto-updater-native'
autoUpdater.on 'update-downloaded-raw', (args...) ->
args[3] = new Date(args[3]) # releaseDate
@emit 'update-downloaded', args..., => @quitAndInstall()
autoUpdater.quitAndInstall = ->
# If we don't have any window then quitAndInstall immediately.
BrowserWindow = require 'browser-window'
windows = BrowserWindow.getAllWindows()
if windows.length is 0
@_quitAndInstall()
return
# Do the restart after all windows have been closed.
app = require 'app'
app.removeAllListeners 'window-all-closed'
app.once 'window-all-closed', @_quitAndInstall.bind(this)
win.close() for win in windows
# Deprecated.
deprecate.rename autoUpdater, 'setFeedUrl', 'setFeedURL'
module.exports = autoUpdater

View File

@@ -0,0 +1,6 @@
{EventEmitter} = require 'events'
{autoUpdater} = process.atomBinding 'auto_updater'
autoUpdater.__proto__ = EventEmitter.prototype
module.exports = autoUpdater

View File

@@ -0,0 +1,42 @@
{app} = require 'electron'
{EventEmitter} = require 'events'
url = require 'url'
squirrelUpdate = require './squirrel-update-win'
class AutoUpdater extends EventEmitter
quitAndInstall: ->
squirrelUpdate.processStart()
app.quit()
setFeedURL: (updateURL) ->
@updateURL = updateURL
checkForUpdates: ->
return @emitError 'Update URL is not set' unless @updateURL
return @emitError 'Can not find Squirrel' unless squirrelUpdate.supported()
@emit 'checking-for-update'
squirrelUpdate.download @updateURL, (error, update) =>
return @emitError error if error?
return @emit 'update-not-available' unless update?
@emit 'update-available'
squirrelUpdate.update @updateURL, (error) =>
return @emitError error if error?
{releaseNotes, version} = update
# Following information is not available on Windows, so fake them.
date = new Date
url = @updateURL
@emit 'update-downloaded', {}, releaseNotes, version, date, url, => @quitAndInstall()
# Private: Emit both error object and message, this is to keep compatibility
# with Old APIs.
emitError: (message) ->
@emit 'error', new Error(message), message
module.exports = new AutoUpdater

View File

@@ -0,0 +1,67 @@
fs = require 'fs'
path = require 'path'
{spawn} = require 'child_process'
appFolder = path.dirname process.execPath # i.e. my-app/app-0.1.13/
updateExe = path.resolve appFolder, '..', 'Update.exe' # i.e. my-app/Update.exe
exeName = path.basename process.execPath
# Spawn a command and invoke the callback when it completes with an error
# and the output from standard out.
spawnUpdate = (args, detached, callback) ->
try
spawnedProcess = spawn updateExe, args, {detached}
catch error
# Shouldn't happen, but still guard it.
process.nextTick -> callback error
return
stdout = ''
stderr = ''
spawnedProcess.stdout.on 'data', (data) -> stdout += data
spawnedProcess.stderr.on 'data', (data) -> stderr += data
errorEmitted = false
spawnedProcess.on 'error', (error) ->
errorEmitted = true
callback error
spawnedProcess.on 'exit', (code, signal) ->
# We may have already emitted an error.
return if errorEmitted
# Process terminated with error.
if code isnt 0
return callback "Command failed: #{signal ? code}\n#{stderr}"
# Success.
callback null, stdout
# Start an instance of the installed app.
exports.processStart = (callback) ->
spawnUpdate ['--processStart', exeName], true, ->
# Download the releases specified by the URL and write new results to stdout.
exports.download = (updateURL, callback) ->
spawnUpdate ['--download', updateURL], false, (error, stdout) ->
return callback(error) if error?
try
# Last line of output is the JSON details about the releases
json = stdout.trim().split('\n').pop()
update = JSON.parse(json)?.releasesToApply?.pop?()
catch
return callback "Invalid result:\n#{stdout}"
callback null, update
# Update the application to the latest remote version specified by URL.
exports.update = (updateURL, callback) ->
spawnUpdate ['--update', updateURL], false, callback
# Is the Update.exe installed with the current application?
exports.supported = ->
try
fs.accessSync updateExe, fs.R_OK
return true
catch
return false

View File

@@ -1,11 +1,12 @@
EventEmitter = require('events').EventEmitter
app = require 'app'
ipc = require 'ipc'
{ipcMain, deprecate} = require 'electron'
{EventEmitter} = require 'events'
BrowserWindow = process.atomBinding('window').BrowserWindow
{BrowserWindow} = process.atomBinding 'window'
BrowserWindow::__proto__ = EventEmitter.prototype
BrowserWindow::_init = ->
{app} = require 'electron' # avoid recursive require.
# Simulate the application menu on platforms other than OS X.
if process.platform isnt 'darwin'
menu = app.getApplicationMenu()
@@ -14,7 +15,7 @@ BrowserWindow::_init = ->
# Make new windows requested by links behave like "window.open"
@webContents.on '-new-window', (event, url, frameName) ->
options = show: true, width: 800, height: 600
ipc.emit 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, options
ipcMain.emit 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', event, url, frameName, options
# window.resizeTo(...)
# window.moveTo(...)
@@ -30,6 +31,11 @@ BrowserWindow::_init = ->
@webContents.on 'crashed', =>
@emit 'crashed'
# Change window title to page title.
@webContents.on 'page-title-updated', (event, title, explicitSet) =>
@emit 'page-title-updated', event, title
@setTitle title unless event.defaultPrevented
# Sometimes the webContents doesn't get focus when window is shown, so we have
# to force focusing on webContents in this case. The safest way is to focus it
# when we first start to load URL, if we do it earlier it won't have effect,
@@ -70,33 +76,37 @@ BrowserWindow.fromDevToolsWebContents = (webContents) ->
return window for window in windows when window.devToolsWebContents?.equal webContents
# Helpers.
BrowserWindow::loadUrl = -> @webContents.loadUrl.apply @webContents, arguments
BrowserWindow::send = -> @webContents.send.apply @webContents, arguments
# Be compatible with old API.
BrowserWindow::undo = -> @webContents.undo()
BrowserWindow::redo = -> @webContents.redo()
BrowserWindow::cut = -> @webContents.cut()
BrowserWindow::copy = -> @webContents.copy()
BrowserWindow::paste = -> @webContents.paste()
BrowserWindow::selectAll = -> @webContents.selectAll()
BrowserWindow::restart = -> @webContents.reload()
BrowserWindow::getUrl = -> @webContents.getUrl()
BrowserWindow::loadURL = -> @webContents.loadURL.apply @webContents, arguments
BrowserWindow::getURL = -> @webContents.getURL()
BrowserWindow::reload = -> @webContents.reload.apply @webContents, arguments
BrowserWindow::reloadIgnoringCache = -> @webContents.reloadIgnoringCache.apply @webContents, arguments
BrowserWindow::getPageTitle = -> @webContents.getTitle()
BrowserWindow::isLoading = -> @webContents.isLoading()
BrowserWindow::isWaitingForResponse = -> @webContents.isWaitingForResponse()
BrowserWindow::stop = -> @webContents.stop()
BrowserWindow::isCrashed = -> @webContents.isCrashed()
BrowserWindow::executeJavaScriptInDevTools = (code) -> @devToolsWebContents?.executeJavaScript code
BrowserWindow::send = -> @webContents.send.apply @webContents, arguments
BrowserWindow::openDevTools = -> @webContents.openDevTools.apply @webContents, arguments
BrowserWindow::closeDevTools = -> @webContents.closeDevTools()
BrowserWindow::isDevToolsOpened = -> @webContents.isDevToolsOpened()
BrowserWindow::toggleDevTools = -> @webContents.toggleDevTools()
BrowserWindow::inspectElement = -> @webContents.inspectElement.apply @webContents, arguments
BrowserWindow::inspectServiceWorker = -> @webContents.inspectServiceWorker()
BrowserWindow::print = -> @webContents.print.apply @webContents, arguments
BrowserWindow::printToPDF = -> @webContents.printToPDF.apply @webContents, arguments
# Deprecated.
deprecate.member BrowserWindow, 'undo', 'webContents'
deprecate.member BrowserWindow, 'redo', 'webContents'
deprecate.member BrowserWindow, 'cut', 'webContents'
deprecate.member BrowserWindow, 'copy', 'webContents'
deprecate.member BrowserWindow, 'paste', 'webContents'
deprecate.member BrowserWindow, 'selectAll', 'webContents'
deprecate.member BrowserWindow, 'reloadIgnoringCache', 'webContents'
deprecate.member BrowserWindow, 'isLoading', 'webContents'
deprecate.member BrowserWindow, 'isWaitingForResponse', 'webContents'
deprecate.member BrowserWindow, 'stop', 'webContents'
deprecate.member BrowserWindow, 'isCrashed', 'webContents'
deprecate.member BrowserWindow, 'print', 'webContents'
deprecate.member BrowserWindow, 'printToPDF', 'webContents'
deprecate.rename BrowserWindow, 'restart', 'reload'
deprecate.rename BrowserWindow, 'loadUrl', 'loadURL'
deprecate.rename BrowserWindow, 'getUrl', 'getURL'
BrowserWindow::executeJavaScriptInDevTools = deprecate 'executeJavaScriptInDevTools', 'devToolsWebContents.executeJavaScript', (code) ->
@devToolsWebContents?.executeJavaScript code
BrowserWindow::getPageTitle = deprecate 'getPageTitle', 'webContents.getTitle', ->
@webContents?.getTitle()
module.exports = BrowserWindow

View File

@@ -1,7 +1,7 @@
{app, BrowserWindow} = require 'electron'
binding = process.atomBinding 'dialog'
v8Util = process.atomBinding 'v8_util'
app = require 'app'
BrowserWindow = require 'browser-window'
fileDialogProperties =
openFile: 1 << 0

View File

@@ -0,0 +1,55 @@
# Import common modules.
module.exports = require '../../../../common/api/lib/exports/electron'
Object.defineProperties module.exports,
# Browser side modules, please sort with alphabet order.
app:
enumerable: true
get: -> require '../app'
autoUpdater:
enumerable: true
get: -> require '../auto-updater'
BrowserWindow:
enumerable: true
get: -> require '../browser-window'
contentTracing:
enumerable: true
get: -> require '../content-tracing'
dialog:
enumerable: true
get: -> require '../dialog'
ipcMain:
enumerable: true
get: -> require '../ipc-main'
globalShortcut:
enumerable: true
get: -> require '../global-shortcut'
Menu:
enumerable: true
get: -> require '../menu'
MenuItem:
enumerable: true
get: -> require '../menu-item'
powerMonitor:
enumerable: true
get: -> require '../power-monitor'
powerSaveBlocker:
enumerable: true
get: -> require '../power-save-blocker'
protocol:
enumerable: true
get: -> require '../protocol'
screen:
enumerable: true
get: -> require '../screen'
session:
enumerable: true
get: -> require '../session'
Tray:
enumerable: true
get: -> require '../tray'
# The internal modules, invisible unless you know their names.
NavigationController:
get: -> require '../navigation-controller'
webContents:
get: -> require '../web-contents'

View File

@@ -1,5 +1,3 @@
bindings = process.atomBinding 'global_shortcut'
globalShortcut = bindings.globalShortcut
{globalShortcut} = process.atomBinding 'global_shortcut'
module.exports = globalShortcut

View File

@@ -0,0 +1,3 @@
{EventEmitter} = require 'events'
module.exports = new EventEmitter

View File

@@ -1,3 +1,6 @@
EventEmitter = require('events').EventEmitter
{deprecate, ipcMain} = require 'electron'
module.exports = new EventEmitter
# This module is deprecated, we mirror everything from ipcMain.
deprecate.warn 'ipc module', 'require("electron").ipcMain'
module.exports = ipcMain

View File

@@ -1,4 +1,3 @@
BrowserWindow = require 'browser-window'
v8Util = process.atomBinding 'v8_util'
nextCommandId = 0
@@ -14,11 +13,16 @@ rolesMap =
minimize: 'minimize'
close: 'close'
# Maps methods that should be called directly on the BrowserWindow instance
methodInBrowserWindow =
minimize: true
close: true
class MenuItem
@types = ['normal', 'separator', 'submenu', 'checkbox', 'radio']
constructor: (options) ->
Menu = require 'menu'
{Menu} = require 'electron'
{click, @selector, @type, @role, @label, @sublabel, @accelerator, @icon, @enabled, @visible, @checked, @submenu} = options
@@ -43,8 +47,12 @@ class MenuItem
# Manually flip the checked flags when clicked.
@checked = !@checked if @type in ['checkbox', 'radio']
if @role and rolesMap[@role] and process.platform isnt 'darwin'
focusedWindow?[rolesMap[@role]]()
if @role and rolesMap[@role] and process.platform isnt 'darwin' and focusedWindow?
methodName = rolesMap[@role]
if methodInBrowserWindow[methodName]
focusedWindow[methodName]()
else
focusedWindow.webContents?[methodName]()
else if typeof click is 'function'
click this, focusedWindow
else if typeof @selector is 'string'

View File

@@ -1,8 +1,7 @@
BrowserWindow = require 'browser-window'
EventEmitter = require('events').EventEmitter
MenuItem = require 'menu-item'
v8Util = process.atomBinding 'v8_util'
{BrowserWindow, MenuItem} = require 'electron'
{EventEmitter} = require 'events'
v8Util = process.atomBinding 'v8_util'
bindings = process.atomBinding 'menu'
# Automatically generated radio menu item's group id.

View File

@@ -1,15 +1,15 @@
ipc = require 'ipc'
{ipcMain} = require 'electron'
# The history operation in renderer is redirected to browser.
ipc.on 'ATOM_SHELL_NAVIGATION_CONTROLLER', (event, method, args...) ->
ipcMain.on 'ATOM_SHELL_NAVIGATION_CONTROLLER', (event, method, args...) ->
event.sender[method] args...
ipc.on 'ATOM_SHELL_SYNC_NAVIGATION_CONTROLLER', (event, method, args...) ->
ipcMain.on 'ATOM_SHELL_SYNC_NAVIGATION_CONTROLLER', (event, method, args...) ->
event.returnValue = event.sender[method] args...
# JavaScript implementation of Chromium's NavigationController.
# Instead of relying on Chromium for history control, we compeletely do history
# control on user land, and only rely on WebContents.loadUrl for navigation.
# control on user land, and only rely on WebContents.loadURL for navigation.
# This helps us avoid Chromium's various optimizations so we can ensure renderer
# process is restarted everytime.
class NavigationController
@@ -17,9 +17,9 @@ class NavigationController
@clearHistory()
# webContents may have already navigated to a page.
if @webContents._getUrl()
if @webContents._getURL()
@currentIndex++
@history.push @webContents._getUrl()
@history.push @webContents._getURL()
@webContents.on 'navigation-entry-commited', (event, url, inPage, replaceEntry) =>
if @inPageIndex > -1 and not inPage
@@ -42,12 +42,12 @@ class NavigationController
@currentIndex++
@history.push url
loadUrl: (url, options={}) ->
loadURL: (url, options={}) ->
@pendingIndex = -1
@webContents._loadUrl url, options
@webContents._loadURL url, options
@webContents.emit 'load-url', url, options
getUrl: ->
getURL: ->
if @currentIndex is -1
''
else
@@ -59,11 +59,11 @@ class NavigationController
reload: ->
@pendingIndex = @currentIndex
@webContents._loadUrl @getUrl(), {}
@webContents._loadURL @getURL(), {}
reloadIgnoringCache: ->
@webContents._reloadIgnoringCache() # Rely on WebContents to clear cache.
@reload()
@pendingIndex = @currentIndex
@webContents._loadURL @getURL(), {extraHeaders: "pragma: no-cache\n"}
canGoBack: ->
@getActiveIndex() > 0
@@ -89,7 +89,7 @@ class NavigationController
if @inPageIndex > -1 and @pendingIndex >= @inPageIndex
@webContents._goBack()
else
@webContents._loadUrl @history[@pendingIndex], {}
@webContents._loadURL @history[@pendingIndex], {}
goForward: ->
return unless @canGoForward()
@@ -97,12 +97,12 @@ class NavigationController
if @inPageIndex > -1 and @pendingIndex >= @inPageIndex
@webContents._goForward()
else
@webContents._loadUrl @history[@pendingIndex], {}
@webContents._loadURL @history[@pendingIndex], {}
goToIndex: (index) ->
return unless @canGoToIndex index
@pendingIndex = index
@webContents._loadUrl @history[@pendingIndex], {}
@webContents._loadURL @history[@pendingIndex], {}
goToOffset: (offset) ->
return unless @canGoToOffset offset

View File

@@ -1,5 +1,6 @@
powerMonitor = process.atomBinding('power_monitor').powerMonitor
EventEmitter = require('events').EventEmitter
{EventEmitter} = require 'events'
{powerMonitor} = process.atomBinding 'power_monitor'
powerMonitor.__proto__ = EventEmitter.prototype

View File

@@ -1,3 +1,3 @@
bindings = process.atomBinding 'power_save_blocker'
{powerSaveBlocker} = process.atomBinding 'power_save_blocker'
module.exports = bindings.powerSaveBlocker
module.exports = powerSaveBlocker

View File

@@ -1,7 +1,8 @@
app = require 'app'
{app} = require 'electron'
throw new Error('Can not initialize protocol module before app is ready') unless app.isReady()
protocol = process.atomBinding('protocol').protocol
{protocol} = process.atomBinding 'protocol'
# Warn about removed APIs.
logAndThrow = (callback, message) ->

View File

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

View File

@@ -0,0 +1,23 @@
{EventEmitter} = require 'events'
bindings = process.atomBinding 'session'
PERSIST_PERFIX = 'persist:'
# Returns the Session from |partition| string.
exports.fromPartition = (partition='') ->
if partition.startsWith PERSIST_PERFIX
bindings.fromPartition partition.substr(PERSIST_PERFIX.length), false
else
bindings.fromPartition partition, true
# Returns the default session.
Object.defineProperty exports, 'defaultSession',
enumerable: true
get: -> exports.fromPartition ''
wrapSession = (session) ->
# session is an EventEmitter.
session.__proto__ = EventEmitter.prototype
bindings._setWrapSession wrapSession

View File

@@ -1,14 +1,19 @@
EventEmitter = require('events').EventEmitter
bindings = process.atomBinding 'tray'
{deprecate} = require 'electron'
{EventEmitter} = require 'events'
Tray = bindings.Tray
{Tray} = process.atomBinding 'tray'
Tray::__proto__ = EventEmitter.prototype
Tray::_init = ->
# Deprecated.
deprecate.rename this, 'popContextMenu', 'popUpContextMenu'
deprecate.event this, 'clicked', 'click'
deprecate.event this, 'double-clicked', 'double-click'
deprecate.event this, 'right-clicked', 'right-click'
deprecate.event this, 'balloon-clicked', 'balloon-click'
Tray::setContextMenu = (menu) ->
@_setContextMenu menu
@menu = menu # Keep a strong reference of menu.
# Keep compatibility with old APIs.
Tray::popContextMenu = Tray::popUpContextMenu
module.exports = Tray

View File

@@ -1,7 +1,7 @@
EventEmitter = require('events').EventEmitter
NavigationController = require './navigation-controller'
{EventEmitter} = require 'events'
{deprecate, ipcMain, session, NavigationController, Menu} = require 'electron'
binding = process.atomBinding 'web_contents'
ipc = require 'ipc'
nextId = 0
getNextId = -> ++nextId
@@ -45,7 +45,7 @@ wrapWebContents = (webContents) ->
# Make sure webContents.executeJavaScript would run the code only when the
# web contents has been loaded.
webContents.executeJavaScript = (code, hasUserGesture=false) ->
if @getUrl() and not @isLoading()
if @getURL() and not @isLoading()
@_executeJavaScript code, hasUserGesture
else
webContents.once 'did-finish-load', @_executeJavaScript.bind(this, code, hasUserGesture)
@@ -59,11 +59,32 @@ wrapWebContents = (webContents) ->
# Dispatch IPC messages to the ipc module.
webContents.on 'ipc-message', (event, packed) ->
[channel, args...] = packed
ipc.emit channel, event, args...
ipcMain.emit channel, event, args...
webContents.on 'ipc-message-sync', (event, packed) ->
[channel, args...] = packed
Object.defineProperty event, 'returnValue', set: (value) -> event.sendReply JSON.stringify(value)
ipc.emit channel, event, args...
ipcMain.emit channel, event, args...
# Handle context menu action request from pepper plugin.
webContents.on 'pepper-context-menu', (event, params) ->
menu = Menu.buildFromTemplate params.menu
menu.popup params.x, params.y
# This error occurs when host could not be found.
webContents.on 'did-fail-provisional-load', (args...) ->
# Calling loadURL during this event might cause crash, so delay the event
# until next tick.
setImmediate => @emit 'did-fail-load', args...
# Delays the page-title-updated event to next tick.
webContents.on '-page-title-updated', (args...) ->
setImmediate => @emit 'page-title-updated', args...
# Deprecated.
deprecate.rename webContents, 'loadUrl', 'loadURL'
deprecate.rename webContents, 'getUrl', 'getURL'
deprecate.event webContents, 'page-title-set', 'page-title-updated', (args...) ->
@emit 'page-title-set', args...
webContents.printToPDF = (options, callback) ->
printingSetting =
@@ -106,7 +127,6 @@ wrapWebContents = (webContents) ->
@_printToPDF printingSetting, callback
binding._setWrapWebContents wrapWebContents
process.once 'exit', binding._clearWrapWebContents
module.exports.create = (options={}) ->
binding.create(options)

View File

@@ -36,8 +36,13 @@ bool SavePageHandler::Handle(const base::FilePath& full_path,
auto download_manager = content::BrowserContext::GetDownloadManager(
web_contents_->GetBrowserContext());
download_manager->AddObserver(this);
// Chromium will create a 'foo_files' directory under the directory of saving
// page 'foo.html' for holding other resource files of 'foo.html'.
base::FilePath saved_main_directory_path = full_path.DirName().Append(
full_path.RemoveExtension().BaseName().value() +
FILE_PATH_LITERAL("_files"));
bool result = web_contents_->SavePage(full_path,
full_path.DirName(),
saved_main_directory_path,
save_type);
download_manager->RemoveObserver(this);
// If initialization fails which means fail to create |DownloadItem|, we need

View File

@@ -30,11 +30,11 @@ class IDUserData : public base::SupportsUserData::Data {
TrackableObjectBase::TrackableObjectBase()
: weak_map_id_(0), wrapped_(nullptr), weak_factory_(this) {
RegisterDestructionCallback(
base::Bind(&TrackableObjectBase::Destroy, weak_factory_.GetWeakPtr()));
cleanup_ = RegisterDestructionCallback(GetDestroyClosure());
}
TrackableObjectBase::~TrackableObjectBase() {
cleanup_.Run();
}
void TrackableObjectBase::AfterInit(v8::Isolate* isolate) {
@@ -42,6 +42,18 @@ void TrackableObjectBase::AfterInit(v8::Isolate* isolate) {
AttachAsUserData(wrapped_);
}
void TrackableObjectBase::MarkDestroyed() {
GetWrapper(isolate())->SetAlignedPointerInInternalField(0, nullptr);
}
base::Closure TrackableObjectBase::GetDestroyClosure() {
return base::Bind(&TrackableObjectBase::Destroy, weak_factory_.GetWeakPtr());
}
void TrackableObjectBase::Destroy() {
delete this;
}
void TrackableObjectBase::AttachAsUserData(base::SupportsUserData* wrapped) {
if (weak_map_id_ != 0) {
wrapped->SetUserData(kTrackedObjectKey, new IDUserData(weak_map_id_));
@@ -63,9 +75,9 @@ int32_t TrackableObjectBase::GetIDFromWrappedClass(base::SupportsUserData* w) {
}
// static
void TrackableObjectBase::RegisterDestructionCallback(
const base::Closure& closure) {
atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(closure);
base::Closure TrackableObjectBase::RegisterDestructionCallback(
const base::Closure& c) {
return atom::AtomBrowserMainParts::Get()->RegisterDestructionCallback(c);
}
} // namespace mate

View File

@@ -12,6 +12,7 @@
#include "base/bind.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "native_mate/object_template_builder.h"
namespace base {
class SupportsUserData;
@@ -30,26 +31,32 @@ class TrackableObjectBase : public mate::EventEmitter {
// Wrap TrackableObject into a class that SupportsUserData.
void AttachAsUserData(base::SupportsUserData* wrapped);
// Subclasses should implement this to destroy their native types.
virtual void Destroy() = 0;
protected:
~TrackableObjectBase() override;
// mate::Wrappable:
void AfterInit(v8::Isolate* isolate) override;
// Mark the JS object as destroyed.
void MarkDestroyed();
// Returns a closure that can destroy the native class.
base::Closure GetDestroyClosure();
// Get the weak_map_id from SupportsUserData.
static int32_t GetIDFromWrappedClass(base::SupportsUserData* wrapped);
// Register a callback that should be destroyed before JavaScript environment
// gets destroyed.
static void RegisterDestructionCallback(const base::Closure& closure);
static base::Closure RegisterDestructionCallback(const base::Closure& c);
int32_t weak_map_id_;
base::SupportsUserData* wrapped_;
private:
void Destroy();
base::Closure cleanup_;
base::WeakPtrFactory<TrackableObjectBase> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(TrackableObjectBase);
@@ -91,11 +98,6 @@ class TrackableObject : public TrackableObjectBase {
return std::vector<v8::Local<v8::Object>>();
}
TrackableObject() {
RegisterDestructionCallback(
base::Bind(&TrackableObject<T>::ReleaseAllWeakReferences));
}
// Removes this instance from the weak map.
void RemoveFromWeakMap() {
if (weak_map_ && weak_map_->Has(weak_map_id()))
@@ -103,28 +105,49 @@ class TrackableObject : public TrackableObjectBase {
}
protected:
TrackableObject() {}
~TrackableObject() override {
RemoveFromWeakMap();
}
void AfterInit(v8::Isolate* isolate) override {
if (!weak_map_)
if (!weak_map_) {
weak_map_.reset(new atom::IDWeakMap);
RegisterDestructionCallback(
base::Bind(&TrackableObject<T>::ReleaseAllWeakReferences));
}
weak_map_id_ = weak_map_->Add(isolate, GetWrapper(isolate));
TrackableObjectBase::AfterInit(isolate);
}
private:
// mate::Wrappable:
mate::ObjectTemplateBuilder GetObjectTemplateBuilder(
v8::Isolate* isolate) override {
if (template_.IsEmpty()) {
auto templ = v8::ObjectTemplate::New(isolate);
T::BuildPrototype(isolate, templ);
template_.Reset(isolate, templ);
}
return ObjectTemplateBuilder(
isolate, v8::Local<v8::ObjectTemplate>::New(isolate, template_));
}
// Releases all weak references in weak map, called when app is terminating.
static void ReleaseAllWeakReferences() {
weak_map_.reset();
}
static v8::Persistent<v8::ObjectTemplate> template_;
static scoped_ptr<atom::IDWeakMap> weak_map_;
DISALLOW_COPY_AND_ASSIGN(TrackableObject);
};
template<typename T>
v8::Persistent<v8::ObjectTemplate> TrackableObject<T>::template_;
template<typename T>
scoped_ptr<atom::IDWeakMap> TrackableObject<T>::weak_map_;

View File

@@ -18,7 +18,7 @@ namespace {
// Notice that we just combined the api key with the url together here, because
// if we use the standard {url: key} format Chromium would override our key with
// the predefined one in common.gypi of libchromiumcontent, which is empty.
const char* kGeolocationProviderUrl =
const char* kGeolocationProviderURL =
"https://www.googleapis.com/geolocation/v1/geolocate?key="
GOOGLEAPIS_API_KEY;
@@ -35,11 +35,11 @@ void AtomAccessTokenStore::LoadAccessTokens(
const LoadAccessTokensCallbackType& callback) {
AccessTokenSet access_token_set;
// Equivelent to access_token_set[kGeolocationProviderUrl].
// Equivelent to access_token_set[kGeolocationProviderURL].
// Somehow base::string16 is causing compilation errors when used in a pair
// of std::map on Linux, this can work around it.
std::pair<GURL, base::string16> token_pair;
token_pair.first = GURL(kGeolocationProviderUrl);
token_pair.first = GURL(kGeolocationProviderURL);
access_token_set.insert(token_pair);
auto browser_context = AtomBrowserMainParts::Get()->browser_context();

View File

@@ -14,7 +14,6 @@
#include "atom/browser/atom_quota_permission_context.h"
#include "atom/browser/atom_resource_dispatcher_host_delegate.h"
#include "atom/browser/atom_speech_recognition_manager_delegate.h"
#include "atom/browser/browser.h"
#include "atom/browser/native_window.h"
#include "atom/browser/web_contents_preferences.h"
#include "atom/browser/window_list.h"
@@ -88,7 +87,7 @@ void AtomBrowserClient::SetCustomSchemes(
g_custom_schemes = JoinString(schemes, ',');
}
AtomBrowserClient::AtomBrowserClient() {
AtomBrowserClient::AtomBrowserClient() : delegate_(nullptr) {
}
AtomBrowserClient::~AtomBrowserClient() {
@@ -208,6 +207,26 @@ content::QuotaPermissionContext*
return new AtomQuotaPermissionContext;
}
void AtomBrowserClient::AllowCertificateError(
int render_process_id,
int render_frame_id,
int cert_error,
const net::SSLInfo& ssl_info,
const GURL& request_url,
content::ResourceType resource_type,
bool overridable,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(bool)>& callback,
content::CertificateRequestResultType* request) {
if (delegate_) {
delegate_->AllowCertificateError(
render_process_id, render_frame_id, cert_error, ssl_info, request_url,
resource_type, overridable, strict_enforcement,
expired_previous_decision, callback, request);
}
}
void AtomBrowserClient::SelectClientCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
@@ -222,10 +241,10 @@ void AtomBrowserClient::SelectClientCertificate(
return;
}
if (!cert_request_info->client_certs.empty())
Browser::Get()->ClientCertificateSelector(web_contents,
cert_request_info,
delegate.Pass());
if (!cert_request_info->client_certs.empty() && delegate_) {
delegate_->SelectClientCertificate(
web_contents, cert_request_info, delegate.Pass());
}
}
void AtomBrowserClient::ResourceDispatcherHostCreated() {

View File

@@ -31,6 +31,9 @@ class AtomBrowserClient : public brightray::BrowserClient,
AtomBrowserClient();
virtual ~AtomBrowserClient();
using Delegate = content::ContentBrowserClient;
void set_delegate(Delegate* delegate) { delegate_ = delegate; }
// Don't force renderer process to restart for once.
static void SuppressRendererProcessRestartForOnce();
// Custom schemes to be registered to standard.
@@ -54,6 +57,18 @@ class AtomBrowserClient : public brightray::BrowserClient,
int child_process_id) override;
void DidCreatePpapiPlugin(content::BrowserPpapiHost* browser_host) override;
content::QuotaPermissionContext* CreateQuotaPermissionContext() override;
void AllowCertificateError(
int render_process_id,
int render_frame_id,
int cert_error,
const net::SSLInfo& ssl_info,
const GURL& request_url,
content::ResourceType resource_type,
bool overridable,
bool strict_enforcement,
bool expired_previous_decision,
const base::Callback<void(bool)>& callback,
content::CertificateRequestResultType* request) override;
void SelectClientCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
@@ -74,6 +89,8 @@ class AtomBrowserClient : public brightray::BrowserClient,
scoped_ptr<AtomResourceDispatcherHostDelegate>
resource_dispatcher_host_delegate_;
Delegate* delegate_;
DISALLOW_COPY_AND_ASSIGN(AtomBrowserClient);
};

View File

@@ -6,8 +6,9 @@
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/atom_download_manager_delegate.h"
#include "atom/browser/atom_ssl_config_service.h"
#include "atom/browser/browser.h"
#include "atom/browser/net/atom_cert_verifier.h"
#include "atom/browser/net/atom_ssl_config_service.h"
#include "atom/browser/net/atom_url_request_job_factory.h"
#include "atom/browser/net/asar/asar_protocol_handler.h"
#include "atom/browser/net/http_protocol_handler.h"
@@ -60,7 +61,9 @@ std::string RemoveWhitespace(const std::string& str) {
AtomBrowserContext::AtomBrowserContext(const std::string& partition,
bool in_memory)
: brightray::BrowserContext(partition, in_memory),
job_factory_(new AtomURLRequestJobFactory) {
cert_verifier_(new AtomCertVerifier),
job_factory_(new AtomURLRequestJobFactory),
allow_ntlm_everywhere_(false) {
}
AtomBrowserContext::~AtomBrowserContext() {
@@ -157,6 +160,10 @@ content::BrowserPluginGuestManager* AtomBrowserContext::GetGuestManager() {
return guest_manager_.get();
}
net::CertVerifier* AtomBrowserContext::CreateCertVerifier() {
return cert_verifier_;
}
net::SSLConfigService* AtomBrowserContext::CreateSSLConfigService() {
return new AtomSSLConfigService;
}
@@ -168,6 +175,16 @@ void AtomBrowserContext::RegisterPrefs(PrefRegistrySimple* pref_registry) {
base::FilePath());
}
bool AtomBrowserContext::AllowNTLMCredentialsForDomain(const GURL& origin) {
if (allow_ntlm_everywhere_)
return true;
return Delegate::AllowNTLMCredentialsForDomain(origin);
}
void AtomBrowserContext::AllowNTLMCredentialsForAllDomains(bool should_allow) {
allow_ntlm_everywhere_ = should_allow;
}
} // namespace atom
namespace brightray {

View File

@@ -12,6 +12,7 @@
namespace atom {
class AtomDownloadManagerDelegate;
class AtomCertVerifier;
class AtomURLRequestJobFactory;
class WebViewManager;
@@ -27,7 +28,9 @@ class AtomBrowserContext : public brightray::BrowserContext {
content::URLRequestInterceptorScopedVector* interceptors) override;
net::HttpCache::BackendFactory* CreateHttpCacheBackendFactory(
const base::FilePath& base_path) override;
net::CertVerifier* CreateCertVerifier() override;
net::SSLConfigService* CreateSSLConfigService() override;
bool AllowNTLMCredentialsForDomain(const GURL& auth_origin) override;
// content::BrowserContext:
content::DownloadManagerDelegate* GetDownloadManagerDelegate() override;
@@ -36,6 +39,10 @@ class AtomBrowserContext : public brightray::BrowserContext {
// brightray::BrowserContext:
void RegisterPrefs(PrefRegistrySimple* pref_registry) override;
void AllowNTLMCredentialsForAllDomains(bool should_allow);
AtomCertVerifier* cert_verifier() const { return cert_verifier_; }
AtomURLRequestJobFactory* job_factory() const { return job_factory_; }
private:
@@ -43,8 +50,11 @@ class AtomBrowserContext : public brightray::BrowserContext {
scoped_ptr<WebViewManager> guest_manager_;
// Managed by brightray::BrowserContext.
AtomCertVerifier* cert_verifier_;
AtomURLRequestJobFactory* job_factory_;
bool allow_ntlm_everywhere_;
DISALLOW_COPY_AND_ASSIGN(AtomBrowserContext);
};

View File

@@ -25,11 +25,17 @@
namespace atom {
template<typename T>
void Erase(T* container, typename T::iterator iter) {
container->erase(iter);
}
// static
AtomBrowserMainParts* AtomBrowserMainParts::self_ = NULL;
AtomBrowserMainParts::AtomBrowserMainParts()
: fake_browser_process_(new BrowserProcess),
exit_code_(nullptr),
browser_(new Browser),
node_bindings_(NodeBindings::Create(true)),
atom_bindings_(new AtomBindings),
@@ -47,9 +53,18 @@ AtomBrowserMainParts* AtomBrowserMainParts::Get() {
return self_;
}
void AtomBrowserMainParts::RegisterDestructionCallback(
bool AtomBrowserMainParts::SetExitCode(int code) {
if (!exit_code_)
return false;
*exit_code_ = code;
return true;
}
base::Closure AtomBrowserMainParts::RegisterDestructionCallback(
const base::Closure& callback) {
destruction_callbacks_.push_back(callback);
auto iter = destructors_.insert(destructors_.end(), callback);
return base::Bind(&Erase<std::list<base::Closure>>, &destructors_, iter);
}
void AtomBrowserMainParts::PreEarlyInitialization() {
@@ -62,17 +77,15 @@ void AtomBrowserMainParts::PreEarlyInitialization() {
void AtomBrowserMainParts::PostEarlyInitialization() {
brightray::BrowserMainParts::PostEarlyInitialization();
{
// Temporary set the bridge_task_runner_ as current thread's task runner,
// so we can fool gin::PerIsolateData to use it as its task runner, instead
// of getting current message loop's task runner, which is null for now.
bridge_task_runner_ = new BridgeTaskRunner;
base::ThreadTaskRunnerHandle handle(bridge_task_runner_);
// Temporary set the bridge_task_runner_ as current thread's task runner,
// so we can fool gin::PerIsolateData to use it as its task runner, instead
// of getting current message loop's task runner, which is null for now.
bridge_task_runner_ = new BridgeTaskRunner;
base::ThreadTaskRunnerHandle handle(bridge_task_runner_);
// The ProxyResolverV8 has setup a complete V8 environment, in order to
// avoid conflicts we only initialize our V8 environment after that.
js_env_.reset(new JavascriptEnvironment);
}
// The ProxyResolverV8 has setup a complete V8 environment, in order to
// avoid conflicts we only initialize our V8 environment after that.
js_env_.reset(new JavascriptEnvironment);
node_bindings_->Initialize();
@@ -107,6 +120,8 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
1000));
brightray::BrowserMainParts::PreMainMessageLoopRun();
bridge_task_runner_->MessageLoopIsReady();
bridge_task_runner_ = nullptr;
#if defined(USE_X11)
libgtk2ui::GtkInitFromCommandLine(*base::CommandLine::ForCurrentProcess());
@@ -119,6 +134,11 @@ void AtomBrowserMainParts::PreMainMessageLoopRun() {
#endif
}
bool AtomBrowserMainParts::MainMessageLoopRun(int* result_code) {
exit_code_ = result_code;
return brightray::BrowserMainParts::MainMessageLoopRun(result_code);
}
void AtomBrowserMainParts::PostMainMessageLoopStart() {
brightray::BrowserMainParts::PostMainMessageLoopStart();
#if defined(OS_POSIX)
@@ -129,11 +149,28 @@ void AtomBrowserMainParts::PostMainMessageLoopStart() {
void AtomBrowserMainParts::PostMainMessageLoopRun() {
brightray::BrowserMainParts::PostMainMessageLoopRun();
#if defined(OS_MACOSX)
FreeAppDelegate();
#endif
// Make sure destruction callbacks are called before message loop is
// destroyed, otherwise some objects that need to be deleted on IO thread
// won't be freed.
for (const auto& callback : destruction_callbacks_)
// We don't use ranged for loop because iterators are getting invalided when
// the callback runs.
for (auto iter = destructors_.begin(); iter != destructors_.end();) {
base::Closure& callback = *iter;
++iter;
callback.Run();
}
// Destroy JavaScript environment immediately after running destruction
// callbacks.
gc_timer_.Stop();
node_debugger_.reset();
atom_bindings_.reset();
node_bindings_.reset();
js_env_.reset();
}
} // namespace atom

View File

@@ -31,9 +31,13 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
static AtomBrowserMainParts* Get();
// Sets the exit code, will fail if the the message loop is not ready.
bool SetExitCode(int code);
// Register a callback that should be destroyed before JavaScript environment
// gets destroyed.
void RegisterDestructionCallback(const base::Closure& callback);
// Returns a closure that can be used to remove |callback| from the list.
base::Closure RegisterDestructionCallback(const base::Closure& callback);
Browser* browser() { return browser_.get(); }
@@ -42,11 +46,11 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
void PreEarlyInitialization() override;
void PostEarlyInitialization() override;
void PreMainMessageLoopRun() override;
bool MainMessageLoopRun(int* result_code) override;
void PostMainMessageLoopStart() override;
void PostMainMessageLoopRun() override;
#if defined(OS_MACOSX)
void PreMainMessageLoopStart() override;
void PostDestroyThreads() override;
#endif
private:
@@ -56,6 +60,10 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
void HandleShutdownSignals();
#endif
#if defined(OS_MACOSX)
void FreeAppDelegate();
#endif
// A fake BrowserProcess object that used to feed the source code from chrome.
scoped_ptr<BrowserProcess> fake_browser_process_;
@@ -63,6 +71,9 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
// with a task runner that will post all work to main loop.
scoped_refptr<BridgeTaskRunner> bridge_task_runner_;
// Pointer to exit code.
int* exit_code_;
scoped_ptr<Browser> browser_;
scoped_ptr<JavascriptEnvironment> js_env_;
scoped_ptr<NodeBindings> node_bindings_;
@@ -72,7 +83,7 @@ class AtomBrowserMainParts : public brightray::BrowserMainParts {
base::Timer gc_timer_;
// List of callbacks should be executed before destroying JS env.
std::list<base::Closure> destruction_callbacks_;
std::list<base::Closure> destructors_;
static AtomBrowserMainParts* self_;

View File

@@ -34,7 +34,7 @@ void AtomBrowserMainParts::PreMainMessageLoopStart() {
setObject:@"NO" forKey:@"NSTreatUnknownArgumentsAsOpen"];
}
void AtomBrowserMainParts::PostDestroyThreads() {
void AtomBrowserMainParts::FreeAppDelegate() {
[[NSApp delegate] release];
[NSApp setDelegate:nil];
}

View File

@@ -4,6 +4,7 @@
#include "atom/browser/atom_resource_dispatcher_host_delegate.h"
#include "atom/browser/login_handler.h"
#include "atom/common/platform_util.h"
#include "content/public/browser/browser_thread.h"
#include "net/base/escape.h"
@@ -29,4 +30,11 @@ bool AtomResourceDispatcherHostDelegate::HandleExternalProtocol(
return true;
}
content::ResourceDispatcherHostLoginDelegate*
AtomResourceDispatcherHostDelegate::CreateLoginDelegate(
net::AuthChallengeInfo* auth_info,
net::URLRequest* request) {
return new LoginHandler(auth_info, request);
}
} // namespace atom

View File

@@ -21,6 +21,9 @@ class AtomResourceDispatcherHostDelegate
bool is_main_frame,
ui::PageTransition transition,
bool has_user_gesture) override;
content::ResourceDispatcherHostLoginDelegate* CreateLoginDelegate(
net::AuthChallengeInfo* auth_info,
net::URLRequest* request) override;
};
} // namespace atom

View File

@@ -6,22 +6,25 @@
namespace auto_updater {
AutoUpdaterDelegate* AutoUpdater::delegate_ = NULL;
Delegate* AutoUpdater::delegate_ = nullptr;
AutoUpdaterDelegate* AutoUpdater::GetDelegate() {
Delegate* AutoUpdater::GetDelegate() {
return delegate_;
}
void AutoUpdater::SetDelegate(AutoUpdaterDelegate* delegate) {
void AutoUpdater::SetDelegate(Delegate* delegate) {
delegate_ = delegate;
}
#if defined(OS_MACOSX) && defined(MAS_BUILD)
#if !defined(OS_MACOSX) || defined(MAS_BUILD)
void AutoUpdater::SetFeedURL(const std::string& url) {
}
void AutoUpdater::CheckForUpdates() {
}
void AutoUpdater::QuitAndInstall() {
}
#endif
} // namespace auto_updater

View File

@@ -9,21 +9,48 @@
#include "base/basictypes.h"
namespace base {
class Time;
}
namespace auto_updater {
class AutoUpdaterDelegate;
class Delegate {
public:
// An error happened.
virtual void OnError(const std::string& error) {}
// Checking to see if there is an update
virtual void OnCheckingForUpdate() {}
// There is an update available and it is being downloaded
virtual void OnUpdateAvailable() {}
// There is no available update.
virtual void OnUpdateNotAvailable() {}
// There is a new update which has been downloaded.
virtual void OnUpdateDownloaded(const std::string& release_notes,
const std::string& release_name,
const base::Time& release_date,
const std::string& update_url) {}
protected:
virtual ~Delegate() {}
};
class AutoUpdater {
public:
// Gets/Sets the delegate.
static AutoUpdaterDelegate* GetDelegate();
static void SetDelegate(AutoUpdaterDelegate* delegate);
static Delegate* GetDelegate();
static void SetDelegate(Delegate* delegate);
static void SetFeedURL(const std::string& url);
static void CheckForUpdates();
static void QuitAndInstall();
private:
static AutoUpdaterDelegate* delegate_;
static Delegate* delegate_;
DISALLOW_IMPLICIT_CONSTRUCTORS(AutoUpdater);
};

View File

@@ -1,45 +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.
#ifndef ATOM_BROWSER_AUTO_UPDATER_DELEGATE_H_
#define ATOM_BROWSER_AUTO_UPDATER_DELEGATE_H_
#include <string>
#include "base/callback_forward.h"
namespace base {
class Time;
}
namespace auto_updater {
class AutoUpdaterDelegate {
public:
// An error happened.
virtual void OnError(const std::string& error) {}
// Checking to see if there is an update
virtual void OnCheckingForUpdate() {}
// There is an update available and it is being downloaded
virtual void OnUpdateAvailable() {}
// There is no available update.
virtual void OnUpdateNotAvailable() {}
// There is a new update which has been downloaded.
virtual 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) {}
protected:
virtual ~AutoUpdaterDelegate() {}
};
} // namespace auto_updater
#endif // ATOM_BROWSER_AUTO_UPDATER_DELEGATE_H_

View File

@@ -1,17 +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/browser/auto_updater.h"
namespace auto_updater {
// static
void AutoUpdater::SetFeedURL(const std::string& url) {
}
// static
void AutoUpdater::CheckForUpdates() {
}
} // namespace auto_updater

View File

@@ -12,9 +12,6 @@
#include "base/bind.h"
#include "base/time/time.h"
#include "base/strings/sys_string_conversions.h"
#include "atom/browser/auto_updater_delegate.h"
#include <iostream>
namespace auto_updater {
@@ -23,20 +20,12 @@ namespace {
// The gloal SQRLUpdater object.
SQRLUpdater* g_updater = nil;
void RelaunchToInstallUpdate() {
[[g_updater relaunchToInstallUpdate] subscribeError:^(NSError* error) {
AutoUpdaterDelegate* delegate = AutoUpdater::GetDelegate();
if (delegate)
delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription));
}];
}
} // namespace
// static
void AutoUpdater::SetFeedURL(const std::string& feed) {
if (g_updater == nil) {
AutoUpdaterDelegate* delegate = GetDelegate();
Delegate* delegate = GetDelegate();
if (!delegate)
return;
@@ -67,7 +56,7 @@ void AutoUpdater::SetFeedURL(const std::string& feed) {
// static
void AutoUpdater::CheckForUpdates() {
AutoUpdaterDelegate* delegate = GetDelegate();
Delegate* delegate = GetDelegate();
if (!delegate)
return;
@@ -86,8 +75,7 @@ void AutoUpdater::CheckForUpdates() {
base::SysNSStringToUTF8(update.releaseNotes),
base::SysNSStringToUTF8(update.releaseName),
base::Time::FromDoubleT(update.releaseDate.timeIntervalSince1970),
base::SysNSStringToUTF8(update.updateURL.absoluteString),
base::Bind(RelaunchToInstallUpdate));
base::SysNSStringToUTF8(update.updateURL.absoluteString));
} else {
// When the completed event is sent with no update, then we know there
// is no update available.
@@ -100,4 +88,12 @@ void AutoUpdater::CheckForUpdates() {
}];
}
void AutoUpdater::QuitAndInstall() {
[[g_updater relaunchToInstallUpdate] subscribeError:^(NSError* error) {
Delegate* delegate = AutoUpdater::GetDelegate();
if (delegate)
delegate->OnError(base::SysNSStringToUTF8(error.localizedDescription));
}];
}
} // namespace auto_updater

View File

@@ -1,17 +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/browser/auto_updater.h"
namespace auto_updater {
// static
void AutoUpdater::SetFeedURL(const std::string& url) {
}
// static
void AutoUpdater::CheckForUpdates() {
}
} // namespace auto_updater

View File

@@ -8,13 +8,28 @@
namespace atom {
void BridgeTaskRunner::MessageLoopIsReady() {
auto message_loop = base::MessageLoop::current();
CHECK(message_loop);
for (const TaskPair& task : tasks_) {
message_loop->task_runner()->PostDelayedTask(
base::get<0>(task), base::get<1>(task), base::get<2>(task));
}
for (const TaskPair& task : non_nestable_tasks_) {
message_loop->task_runner()->PostNonNestableDelayedTask(
base::get<0>(task), base::get<1>(task), base::get<2>(task));
}
}
bool BridgeTaskRunner::PostDelayedTask(
const tracked_objects::Location& from_here,
const base::Closure& task,
base::TimeDelta delay) {
auto message_loop = base::MessageLoop::current();
if (!message_loop)
return false;
if (!message_loop) {
tasks_.push_back(base::MakeTuple(from_here, task, delay));
return true;
}
return message_loop->task_runner()->PostDelayedTask(from_here, task, delay);
}
@@ -22,7 +37,7 @@ bool BridgeTaskRunner::PostDelayedTask(
bool BridgeTaskRunner::RunsTasksOnCurrentThread() const {
auto message_loop = base::MessageLoop::current();
if (!message_loop)
return false;
return true;
return message_loop->task_runner()->RunsTasksOnCurrentThread();
}
@@ -32,8 +47,10 @@ bool BridgeTaskRunner::PostNonNestableDelayedTask(
const base::Closure& task,
base::TimeDelta delay) {
auto message_loop = base::MessageLoop::current();
if (!message_loop)
return false;
if (!message_loop) {
non_nestable_tasks_.push_back(base::MakeTuple(from_here, task, delay));
return true;
}
return message_loop->task_runner()->PostNonNestableDelayedTask(
from_here, task, delay);

View File

@@ -5,17 +5,23 @@
#ifndef ATOM_BROWSER_BRIDGE_TASK_RUNNER_H_
#define ATOM_BROWSER_BRIDGE_TASK_RUNNER_H_
#include <vector>
#include "base/single_thread_task_runner.h"
#include "base/tuple.h"
namespace atom {
// Post all tasks to the current message loop's task runner if available,
// otherwise fail silently.
// otherwise delay the work until message loop is ready.
class BridgeTaskRunner : public base::SingleThreadTaskRunner {
public:
BridgeTaskRunner() {}
~BridgeTaskRunner() override {}
// Called when message loop is ready.
void MessageLoopIsReady();
// base::SingleThreadTaskRunner:
bool PostDelayedTask(const tracked_objects::Location& from_here,
const base::Closure& task,
@@ -27,6 +33,11 @@ class BridgeTaskRunner : public base::SingleThreadTaskRunner {
base::TimeDelta delay) override;
private:
using TaskPair = base::Tuple<
tracked_objects::Location, base::Closure, base::TimeDelta>;
std::vector<TaskPair> tasks_;
std::vector<TaskPair> non_nestable_tasks_;
DISALLOW_COPY_AND_ASSIGN(BridgeTaskRunner);
};

View File

@@ -7,10 +7,9 @@
#include <string>
#include "atom/browser/atom_browser_main_parts.h"
#include "atom/browser/native_window.h"
#include "atom/browser/window_list.h"
#include "base/message_loop/message_loop.h"
#include "content/public/browser/client_certificate_delegate.h"
#include "net/ssl/ssl_cert_request_info.h"
namespace atom {
@@ -45,6 +44,27 @@ void Browser::Quit() {
window_list->CloseAllWindows();
}
void Browser::Exit(int code) {
if (!AtomBrowserMainParts::Get()->SetExitCode(code)) {
// Message loop is not ready, quit directly.
exit(code);
} else {
// Prepare to quit when all windows have been closed..
is_quiting_ = true;
// Must destroy windows before quitting, otherwise bad things can happen.
atom::WindowList* window_list = atom::WindowList::GetInstance();
if (window_list->size() == 0) {
NotifyAndShutdown();
} else {
// Unlike Quit(), we do not ask to close window, but destroy the window
// without asking.
for (NativeWindow* window : *window_list)
window->CloseContents(nullptr); // e.g. Destroy()
}
}
}
void Browser::Shutdown() {
if (is_shutdown_)
return;
@@ -53,8 +73,14 @@ void Browser::Shutdown() {
is_quiting_ = true;
FOR_EACH_OBSERVER(BrowserObserver, observers_, OnQuit());
base::MessageLoop::current()->PostTask(
FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
if (base::MessageLoop::current()) {
base::MessageLoop::current()->PostTask(
FROM_HERE, base::MessageLoop::QuitWhenIdleClosure());
} else {
// There is no message loop available so we are in early stage.
exit(0);
}
}
std::string Browser::GetVersion() const {
@@ -83,10 +109,6 @@ std::string Browser::GetName() const {
void Browser::SetName(const std::string& name) {
name_override_ = name;
#if defined(OS_WIN)
SetAppUserModelID(name);
#endif
}
bool Browser::OpenFile(const std::string& file_path) {
@@ -117,15 +139,8 @@ void Browser::DidFinishLaunching() {
FOR_EACH_OBSERVER(BrowserObserver, observers_, OnFinishLaunching());
}
void Browser::ClientCertificateSelector(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
scoped_ptr<content::ClientCertificateDelegate> delegate) {
FOR_EACH_OBSERVER(BrowserObserver,
observers_,
OnSelectCertificate(web_contents,
cert_request_info,
delegate.Pass()));
void Browser::RequestLogin(LoginHandler* login_handler) {
FOR_EACH_OBSERVER(BrowserObserver, observers_, OnLogin(login_handler));
}
void Browser::NotifyAndShutdown() {

View File

@@ -11,12 +11,12 @@
#include "base/basictypes.h"
#include "base/compiler_specific.h"
#include "base/observer_list.h"
#include "base/strings/string16.h"
#include "atom/browser/browser_observer.h"
#include "atom/browser/window_list_observer.h"
#if defined(OS_WIN)
#include "base/files/file_path.h"
#include "base/strings/string16.h"
#endif
namespace base {
@@ -29,6 +29,8 @@ class MenuModel;
namespace atom {
class LoginHandler;
// This class is used for control application-wide operations.
class Browser : public WindowListObserver {
public:
@@ -40,6 +42,9 @@ class Browser : public WindowListObserver {
// Try to close all windows and quit the application.
void Quit();
// Exit the application immediately and set exit code.
void Exit(int code);
// Cleanup everything and shutdown the application gracefully.
void Shutdown();
@@ -64,6 +69,9 @@ class Browser : public WindowListObserver {
// Clear the recent documents list.
void ClearRecentDocuments();
// Set the application user model ID.
void SetAppUserModelID(const base::string16& name);
#if defined(OS_MACOSX)
// Bounce the dock icon.
enum BounceType {
@@ -98,8 +106,10 @@ class Browser : public WindowListObserver {
// Add a custom task to jump list.
void SetUserTasks(const std::vector<UserTask>& tasks);
// Set the application user model ID, called when "SetName" is called.
void SetAppUserModelID(const std::string& name);
// Returns the application user model ID, if there isn't one, then create
// one from app's name.
// The returned string managed by Browser, and should not be modified.
PCWSTR GetAppUserModelID();
#endif
// Tell the application to open a file.
@@ -116,11 +126,8 @@ class Browser : public WindowListObserver {
void WillFinishLaunching();
void DidFinishLaunching();
// Called when client certificate is required.
void ClientCertificateSelector(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
scoped_ptr<content::ClientCertificateDelegate> delegate);
// Request basic auth login.
void RequestLogin(LoginHandler* login_handler);
void AddObserver(BrowserObserver* obs) {
observers_.AddObserver(obs);
@@ -130,6 +137,7 @@ class Browser : public WindowListObserver {
observers_.RemoveObserver(obs);
}
bool is_shutting_down() const { return is_shutdown_; }
bool is_quiting() const { return is_quiting_; }
bool is_ready() const { return is_ready_; }

View File

@@ -31,6 +31,9 @@ void Browser::AddRecentDocument(const base::FilePath& path) {
void Browser::ClearRecentDocuments() {
}
void Browser::SetAppUserModelID(const base::string16& name) {
}
std::string Browser::GetExecutableFileVersion() const {
return brightray::GetApplicationVersion();
}

View File

@@ -26,6 +26,9 @@ void Browser::AddRecentDocument(const base::FilePath& path) {
void Browser::ClearRecentDocuments() {
}
void Browser::SetAppUserModelID(const base::string16& name) {
}
std::string Browser::GetExecutableFileVersion() const {
return brightray::GetApplicationVersion();
}

View File

@@ -7,19 +7,10 @@
#include <string>
#include "base/memory/scoped_ptr.h"
#include "content/public/browser/client_certificate_delegate.h"
namespace content {
class WebContents;
}
namespace net {
class SSLCertRequestInfo;
}
namespace atom {
class LoginHandler;
class BrowserObserver {
public:
// The browser is about to close all windows.
@@ -51,11 +42,8 @@ class BrowserObserver {
virtual void OnWillFinishLaunching() {}
virtual void OnFinishLaunching() {}
// The browser requires client certificate.
virtual void OnSelectCertificate(
content::WebContents* web_contents,
net::SSLCertRequestInfo* cert_request_info,
scoped_ptr<content::ClientCertificateDelegate> delegate) {}
// The browser requests HTTP login.
virtual void OnLogin(LoginHandler* login_handler) {}
protected:
virtual ~BrowserObserver() {}

View File

@@ -15,6 +15,7 @@
#include "base/files/file_path.h"
#include "base/memory/scoped_ptr.h"
#include "base/path_service.h"
#include "base/strings/string_util.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/win/win_util.h"
@@ -25,6 +26,8 @@ namespace atom {
namespace {
const wchar_t kAppUserModelIDFormat[] = L"electron.app.$1";
BOOL CALLBACK WindowsEnumerationHandler(HWND hwnd, LPARAM param) {
DWORD target_process_id = *reinterpret_cast<DWORD*>(param);
DWORD process_id = 0;
@@ -56,7 +59,7 @@ void Browser::AddRecentDocument(const base::FilePath& path) {
if (SUCCEEDED(hr)) {
SHARDAPPIDINFO info;
info.psi = item;
info.pszAppID = app_user_model_id_.c_str();
info.pszAppID = GetAppUserModelID();
SHAddToRecentDocs(SHARD_APPIDINFO, &info);
}
}
@@ -66,16 +69,21 @@ void Browser::ClearRecentDocuments() {
if (FAILED(destinations.CoCreateInstance(CLSID_ApplicationDestinations,
NULL, CLSCTX_INPROC_SERVER)))
return;
if (FAILED(destinations->SetAppID(app_user_model_id_.c_str())))
if (FAILED(destinations->SetAppID(GetAppUserModelID())))
return;
destinations->RemoveAllDestinations();
}
void Browser::SetAppUserModelID(const base::string16& name) {
app_user_model_id_ = name;
SetCurrentProcessExplicitAppUserModelID(app_user_model_id_.c_str());
}
void Browser::SetUserTasks(const std::vector<UserTask>& tasks) {
CComPtr<ICustomDestinationList> destinations;
if (FAILED(destinations.CoCreateInstance(CLSID_DestinationList)))
return;
if (FAILED(destinations->SetAppID(app_user_model_id_.c_str())))
if (FAILED(destinations->SetAppID(GetAppUserModelID())))
return;
// Start a transaction that updates the JumpList of this application.
@@ -117,10 +125,13 @@ void Browser::SetUserTasks(const std::vector<UserTask>& tasks) {
destinations->CommitList();
}
void Browser::SetAppUserModelID(const std::string& name) {
app_user_model_id_ = base::string16(L"electron.app.");
app_user_model_id_ += base::UTF8ToUTF16(name);
SetCurrentProcessExplicitAppUserModelID(app_user_model_id_.c_str());
PCWSTR Browser::GetAppUserModelID() {
if (app_user_model_id_.empty()) {
SetAppUserModelID(ReplaceStringPlaceholders(
kAppUserModelIDFormat, base::UTF8ToUTF16(GetName()), nullptr));
}
return app_user_model_id_.c_str();
}
std::string Browser::GetExecutableFileVersion() const {

View File

@@ -1,5 +1,6 @@
var app = require('app');
var BrowserWindow = require('browser-window');
const electron = require('electron');
const app = electron.app;
const BrowserWindow = electron.BrowserWindow;
var mainWindow = null;
@@ -12,9 +13,9 @@ app.on('ready', function() {
mainWindow = new BrowserWindow({
width: 800,
height: 600,
'auto-hide-menu-bar': true,
'use-content-size': true,
autoHideMenuBar: true,
useContentSize: true,
});
mainWindow.loadUrl('file://' + __dirname + '/index.html');
mainWindow.loadURL('file://' + __dirname + '/index.html');
mainWindow.focus();
});

View File

@@ -57,13 +57,17 @@
</head>
<body>
<script>
var execPath = require('remote').process.execPath;
const electron = require('electron');
const remote = electron.remote;
const shell = electron.shell;
var execPath = remote.process.execPath;
var command = execPath + ' path-to-your-app';
document.onclick = function(e) {
e.preventDefault();
if (e.target.tagName == 'A')
require('shell').openExternal(e.target.href);
shell.openExternal(e.target.href);
return false;
};
document.ondragover = document.ondrop = function(e) {
@@ -72,7 +76,11 @@
};
</script>
<h2 style="-webkit-app-region: drag">Welcome to Electron</h2>
<h2>
<script>
document.write(`Welcome to Electron (v${process.versions.electron})`)
</script>
</h2>
<p>
To run your app with Electron, execute the following command under your
@@ -83,8 +91,18 @@
<p>
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>
app, you can read the
<script>
document.write(
`<a href='https://github.com/atom/electron/blob/v${process.versions.electron}/docs/tutorial/quick-start.md'>quick start</a>`
);
</script>
guide in Electron's
<script>
document.write(
`<a href='https://github.com/atom/electron/tree/v${process.versions.electron}/docs#readme'>docs</a>`
);
</script>
on how to write one.
</p>

View File

@@ -1,9 +1,11 @@
var app = require('app');
var dialog = require('dialog');
const electron = require('electron');
const app = electron.app;
const dialog = electron.dialog;
const shell = electron.shell;
const Menu = electron.Menu;
var fs = require('fs');
var path = require('path');
var Menu = require('menu');
var BrowserWindow = require('browser-window');
// Quit when all windows are closed and no other one is listening to this.
app.on('window-all-closed', function() {
@@ -142,19 +144,23 @@ app.once('ready', function() {
submenu: [
{
label: 'Learn More',
click: function() { require('shell').openExternal('http://electron.atom.io') }
click: function() { shell.openExternal('http://electron.atom.io') }
},
{
label: 'Documentation',
click: function() { require('shell').openExternal('https://github.com/atom/electron/tree/master/docs#readme') }
click: function() {
shell.openExternal(
`https://github.com/atom/electron/tree/v${process.versions.electron}/docs#readme`
)
}
},
{
label: 'Community Discussions',
click: function() { require('shell').openExternal('https://discuss.atom.io/c/electron') }
click: function() { shell.openExternal('https://discuss.atom.io/c/electron') }
},
{
label: 'Search Issues',
click: function() { require('shell').openExternal('https://github.com/atom/electron/issues') }
click: function() { shell.openExternal('https://github.com/atom/electron/issues') }
}
]
},
@@ -187,11 +193,11 @@ app.once('ready', function() {
{
label: 'Hide Others',
accelerator: 'Command+Shift+H',
role: 'hideothers:'
role: 'hideothers'
},
{
label: 'Show All',
role: 'unhide:'
role: 'unhide'
},
{
type: 'separator'
@@ -247,7 +253,11 @@ 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 electron app, please read the docs on how to write one:\nhttps://github.com/atom/electron/tree/master/docs\n\n' + e.toString());
dialog.showErrorBox(
'Error opening app',
'The app provided is not a valid Electron app, please read the docs on how to write one:\n' +
`https://github.com/atom/electron/tree/v${process.versions.electron}/docs\n\n${e.toString()}`
);
process.exit(1);
} else {
console.error('App threw an error when running', e);
@@ -269,5 +279,5 @@ if (option.file && !option.webdriver) {
console.log(helpMessage);
process.exit(0);
} else {
require('./default_app.js');
require('./default_app');
}

View File

@@ -4,6 +4,10 @@
#include "atom/browser/javascript_environment.h"
#include <string>
#include "base/command_line.h"
#include "content/public/common/content_switches.h"
#include "gin/array_buffer.h"
#include "gin/v8_initializer.h"
@@ -20,7 +24,18 @@ JavascriptEnvironment::JavascriptEnvironment()
}
bool JavascriptEnvironment::Initialize() {
gin::V8Initializer::LoadV8Snapshot();
auto cmd = base::CommandLine::ForCurrentProcess();
if (cmd->HasSwitch("debug-brk")) {
// Need to be called before v8::Initialize().
const char expose_debug_as[] = "--expose_debug_as=v8debug";
v8::V8::SetFlagsFromString(expose_debug_as, sizeof(expose_debug_as) - 1);
}
// --js-flags.
std::string js_flags = cmd->GetSwitchValueASCII(switches::kJavaScriptFlags);
if (!js_flags.empty())
v8::V8::SetFlagsFromString(js_flags.c_str(), js_flags.size());
gin::IsolateHolder::Initialize(gin::IsolateHolder::kNonStrictMode,
gin::ArrayBufferAllocator::SharedInstance());
return true;

View File

@@ -1,4 +1,4 @@
app = require 'app'
electron = require 'electron'
fs = require 'fs'
path = require 'path'
url = require 'url'
@@ -40,6 +40,7 @@ loadedExtensions = null
loadedExtensionsPath = null
# Persistent loaded extensions.
{app} = electron
app.on 'will-quit', ->
try
loadedExtensions = Object.keys(extensionInfoMap).map (key) -> extensionInfoMap[key].srcDirectory
@@ -51,11 +52,10 @@ app.on 'will-quit', ->
# We can not use protocol or BrowserWindow until app is ready.
app.once 'ready', ->
protocol = require 'protocol'
BrowserWindow = require 'browser-window'
{protocol, BrowserWindow} = electron
# Load persistented extensions.
loadedExtensionsPath = path.join app.getDataPath(), 'DevTools Extensions'
loadedExtensionsPath = path.join app.getPath('userData'), 'DevTools Extensions'
try
loadedExtensions = JSON.parse fs.readFileSync(loadedExtensionsPath)

View File

@@ -1,5 +1,5 @@
ipc = require 'ipc'
webContents = require 'web-contents'
{ipcMain, webContents} = require 'electron'
webViewManager = null # Doesn't exist in early initialization.
supportedWebViewEvents = [
@@ -19,7 +19,7 @@ supportedWebViewEvents = [
'gpu-crashed'
'plugin-crashed'
'destroyed'
'page-title-set'
'page-title-updated'
'page-favicon-updated'
'enter-html-full-screen'
'leave-html-full-screen'
@@ -79,7 +79,7 @@ createGuest = (embedder, params) ->
opts = {}
opts.httpReferrer = params.httpreferrer if params.httpreferrer
opts.userAgent = params.useragent if params.useragent
@loadUrl params.src, opts
@loadURL params.src, opts
if params.allowtransparency?
@setAllowTransparency params.allowtransparency
@@ -118,11 +118,11 @@ attachGuest = (embedder, elementInstanceId, guestInstanceId, params) ->
destroyGuest embedder, oldGuestInstanceId
webPreferences =
'guest-instance-id': guestInstanceId
'node-integration': params.nodeintegration ? false
'plugins': params.plugins
'web-security': !params.disablewebsecurity
webPreferences['preload-url'] = params.preload if params.preload
guestInstanceId: guestInstanceId
nodeIntegration: params.nodeintegration ? false
plugins: params.plugins
webSecurity: !params.disablewebsecurity
webPreferences.preloadURL = params.preload if params.preload
webViewManager.addGuest guestInstanceId, elementInstanceId, embedder, guest, webPreferences
guest.attachParams = params
@@ -140,19 +140,19 @@ destroyGuest = (embedder, id) ->
delete reverseEmbedderElementsMap[id]
delete embedderElementsMap[key]
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_CREATE_GUEST', (event, params, requestId) ->
ipcMain.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_CREATE_GUEST', (event, 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) ->
ipcMain.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_ATTACH_GUEST', (event, elementInstanceId, guestInstanceId, params) ->
attachGuest event.sender, elementInstanceId, guestInstanceId, params
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', (event, id) ->
ipcMain.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_DESTROY_GUEST', (event, id) ->
destroyGuest event.sender, id
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_SIZE', (event, id, params) ->
ipcMain.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_SIZE', (event, id, params) ->
guestInstances[id]?.guest.setSize params
ipc.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_ALLOW_TRANSPARENCY', (event, id, allowtransparency) ->
ipcMain.on 'ATOM_SHELL_GUEST_VIEW_MANAGER_SET_ALLOW_TRANSPARENCY', (event, id, allowtransparency) ->
guestInstances[id]?.guest.setAllowTransparency allowtransparency
# Returns WebContents from its guest id.

View File

@@ -1,29 +1,37 @@
ipc = require 'ipc'
{ipcMain, BrowserWindow} = require 'electron'
v8Util = process.atomBinding 'v8_util'
BrowserWindow = require 'browser-window'
frameToGuest = {}
# Copy attribute of |parent| to |child| if it is not defined in |child|.
mergeOptions = (child, parent) ->
for own key, value of parent when key not of child
if typeof value is 'object'
child[key] = mergeOptions {}, value
else
child[key] = value
child
# Merge |options| with the |embedder|'s window's options.
mergeBrowserWindowOptions = (embedder, options) ->
if embedder.browserWindowOptions?
# Inherit the original options if it is a BrowserWindow.
options.__proto__ = embedder.browserWindowOptions
mergeOptions options, embedder.browserWindowOptions
else
# Or only inherit web-preferences if it is a webview.
options['web-preferences'] ?= {}
options['web-preferences'].__proto__ = embedder.getWebPreferences()
options.webPreferences ?= {}
mergeOptions options.webPreferences, embedder.getWebPreferences()
options
# Create a new guest created by |embedder| with |options|.
createGuest = (embedder, url, frameName, options) ->
guest = frameToGuest[frameName]
if frameName and guest?
guest.loadUrl url
guest.loadURL url
return guest.id
guest = new BrowserWindow(options)
guest.loadUrl url
guest.loadURL url
# Remember the embedder, will be used by window.opener methods.
v8Util.setHiddenValue guest.webContents, 'embedder', embedder
@@ -31,11 +39,12 @@ createGuest = (embedder, url, frameName, options) ->
# 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.
guestId = guest.id
closedByEmbedder = ->
guest.removeListener 'closed', closedByUser
guest.destroy()
closedByUser = ->
embedder.send 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED', guest.id
embedder.send "ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSED_#{guestId}"
embedder.removeListener 'render-view-deleted', closedByEmbedder
embedder.once 'render-view-deleted', closedByEmbedder
guest.once 'closed', closedByUser
@@ -49,7 +58,7 @@ createGuest = (embedder, url, frameName, options) ->
guest.id
# Routed window.open messages.
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
[url, frameName, options] = args
options = mergeBrowserWindowOptions event.sender, options
event.sender.emit 'new-window', event, url, frameName, 'new-window', options
@@ -58,26 +67,26 @@ ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, args...) ->
else
event.returnValue = createGuest event.sender, url, frameName, options
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', (event, guestId) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_CLOSE', (event, guestId) ->
BrowserWindow.fromId(guestId)?.destroy()
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, method, args...) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_METHOD', (event, guestId, method, args...) ->
BrowserWindow.fromId(guestId)?[method] args...
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (event, guestId, message, targetOrigin) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_POSTMESSAGE', (event, guestId, message, targetOrigin) ->
guestContents = BrowserWindow.fromId(guestId)?.webContents
if guestContents?.getUrl().indexOf(targetOrigin) is 0 or targetOrigin is '*'
if guestContents?.getURL().indexOf(targetOrigin) is 0 or targetOrigin is '*'
guestContents.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', guestId, message, targetOrigin
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, guestId, message, targetOrigin, sourceOrigin) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WINDOW_OPENER_POSTMESSAGE', (event, guestId, message, targetOrigin, sourceOrigin) ->
embedder = v8Util.getHiddenValue event.sender, 'embedder'
if embedder?.getUrl().indexOf(targetOrigin) is 0 or targetOrigin is '*'
if embedder?.getURL().indexOf(targetOrigin) is 0 or targetOrigin is '*'
embedder.send 'ATOM_SHELL_GUEST_WINDOW_POSTMESSAGE', guestId, message, sourceOrigin
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_WEB_CONTENTS_METHOD', (event, guestId, method, args...) ->
BrowserWindow.fromId(guestId)?.webContents?[method] args...
ipc.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID', (event) ->
ipcMain.on 'ATOM_SHELL_GUEST_WINDOW_MANAGER_GET_GUEST_ID', (event) ->
embedder = v8Util.getHiddenValue event.sender, 'embedder'
if embedder?
guest = BrowserWindow.fromWebContents event.sender

View File

@@ -13,10 +13,12 @@ require path.resolve(__dirname, '..', '..', 'common', 'lib', 'reset-search-paths
# Import common settings.
require path.resolve(__dirname, '..', '..', 'common', 'lib', 'init')
# Add browser/api/lib to module search paths, which contains javascript part of
# Electron's built-in libraries.
globalPaths = Module.globalPaths
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
unless process.env.ELECTRON_HIDE_INTERNAL_MODULES
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib')
# Expose public APIs.
globalPaths.push path.resolve(__dirname, '..', 'api', 'lib', 'exports')
if process.platform is 'win32'
# Redirect node's console to use our own implementations, since node can not
@@ -44,15 +46,19 @@ process.on 'uncaughtException', (error) ->
return
# Show error in GUI.
{dialog} = require 'electron'
stack = error.stack ? "#{error.name}: #{error.message}"
message = "Uncaught Exception:\n#{stack}"
require('dialog').showErrorBox 'A JavaScript error occurred in the main process', message
dialog.showErrorBox 'A JavaScript error occurred in the main process', message
# Emit 'exit' event on quit.
app = require 'app'
{app} = require 'electron'
app.on 'quit', ->
process.emit 'exit'
# Map process.exit to app.exit, which quits gracefully.
process.exit = app.exit
# Load the RPC server.
require './rpc-server'

View File

@@ -1,4 +1,4 @@
EventEmitter = require('events').EventEmitter
{EventEmitter} = require 'events'
v8Util = process.atomBinding 'v8_util'
class ObjectsRegistry extends EventEmitter

View File

@@ -1,7 +1,11 @@
ipc = require 'ipc'
path = require 'path'
objectsRegistry = require './objects-registry.js'
electron = require 'electron'
{ipcMain} = electron
objectsRegistry = require './objects-registry'
v8Util = process.atomBinding 'v8_util'
{IDWeakMap} = process.atomBinding 'id_weak_map'
# Convert a real value into meta data.
valueToMeta = (sender, value, optimizeSimpleObject=false) ->
@@ -10,7 +14,9 @@ valueToMeta = (sender, value, optimizeSimpleObject=false) ->
meta.type = 'buffer' if Buffer.isBuffer value
meta.type = 'value' if value is null
meta.type = 'array' if Array.isArray value
meta.type = 'promise' if value? and value.constructor.name is 'Promise'
meta.type = 'error' if value instanceof Error
meta.type = 'date' if value instanceof Date
meta.type = 'promise' if value?.constructor.name is 'Promise'
# Treat simple objects as value.
if optimizeSimpleObject and meta.type is 'object' and v8Util.getHiddenValue value, 'simple'
@@ -30,21 +36,28 @@ valueToMeta = (sender, value, optimizeSimpleObject=false) ->
# it.
meta.id = objectsRegistry.add sender.getId(), value
meta.members = []
meta.members.push {name: prop, type: typeof field} for prop, field of value
meta.members = ({name, type: typeof field} for name, field of value)
else if meta.type is 'buffer'
meta.value = Array::slice.call value, 0
else if meta.type is 'promise'
meta.then = valueToMeta(sender, value.then.bind(value))
meta.then = valueToMeta sender, value.then.bind(value)
else if meta.type is 'error'
meta.members = plainObjectToMeta value
else if meta.type is 'date'
meta.value = value.getTime()
else
meta.type = 'value'
meta.value = value
meta
# Convert object to meta by value.
plainObjectToMeta = (obj) ->
Object.getOwnPropertyNames(obj).map (name) -> {name, value: obj[name]}
# Convert Error into meta data.
errorToMeta = (error) ->
type: 'error', message: error.message, stack: (error.stack || error)
exceptionToMeta = (error) ->
type: 'exception', message: error.message, stack: (error.stack || error)
# Convert array of meta data from renderer into array of real values.
unwrapArgs = (sender, args) ->
@@ -64,16 +77,27 @@ unwrapArgs = (sender, args) ->
returnValue = metaToValue meta.value
-> returnValue
when 'function'
# Cache the callbacks in renderer.
unless sender.callbacks
sender.callbacks = new IDWeakMap
sender.on 'render-view-deleted', ->
sender.callbacks.clear()
return sender.callbacks.get meta.id if sender.callbacks.has meta.id
rendererReleased = false
objectsRegistry.once "clear-#{sender.getId()}", ->
rendererReleased = true
ret = ->
throw new Error('Calling a callback of released renderer view') if rendererReleased
if rendererReleased
throw new Error("Attempting to call a function in a renderer window
that has been closed or released. Function provided here: #{meta.location}.")
sender.send 'ATOM_RENDERER_CALLBACK', meta.id, valueToMeta(sender, arguments)
v8Util.setDestructor ret, ->
return if rendererReleased
sender.callbacks.remove meta.id
sender.send 'ATOM_RENDERER_RELEASE_CALLBACK', meta.id
sender.callbacks.set meta.id, ret
ret
else throw new TypeError("Unknown type: #{meta.type}")
@@ -82,40 +106,58 @@ unwrapArgs = (sender, args) ->
# Call a function and send reply asynchronously if it's a an asynchronous
# style function and the caller didn't pass a callback.
callFunction = (event, func, caller, args) ->
if v8Util.getHiddenValue(func, 'asynchronous') and typeof args[args.length - 1] isnt 'function'
args.push (ret) ->
funcMarkedAsync = v8Util.getHiddenValue(func, 'asynchronous')
funcPassedCallback = typeof args[args.length - 1] is 'function'
try
if funcMarkedAsync and not funcPassedCallback
args.push (ret) ->
event.returnValue = valueToMeta event.sender, ret, true
func.apply caller, args
else
ret = func.apply caller, args
event.returnValue = valueToMeta event.sender, ret, true
func.apply caller, args
else
ret = func.apply caller, args
event.returnValue = valueToMeta event.sender, ret, true
catch e
# Catch functions thrown further down in function invocation and wrap
# them with the function name so it's easier to trace things like
# `Error processing argument -1.`
funcName = func.name ? "anonymous"
throw new Error("Could not call remote function `#{funcName}`.
Check that the function signature is correct.
Underlying error: #{e.message}")
# Send by BrowserWindow when its render view is deleted.
process.on 'ATOM_BROWSER_RELEASE_RENDER_VIEW', (id) ->
objectsRegistry.clear id
ipc.on 'ATOM_BROWSER_REQUIRE', (event, module) ->
ipcMain.on 'ATOM_BROWSER_REQUIRE', (event, module) ->
try
event.returnValue = valueToMeta event.sender, process.mainModule.require(module)
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_GLOBAL', (event, name) ->
ipcMain.on 'ATOM_BROWSER_GET_BUILTIN', (event, module) ->
try
event.returnValue = valueToMeta event.sender, electron[module]
catch e
event.returnValue = exceptionToMeta e
ipcMain.on 'ATOM_BROWSER_GLOBAL', (event, name) ->
try
event.returnValue = valueToMeta event.sender, global[name]
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_CURRENT_WINDOW', (event) ->
ipcMain.on 'ATOM_BROWSER_CURRENT_WINDOW', (event) ->
try
event.returnValue = valueToMeta event.sender, event.sender.getOwnerBrowserWindow()
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_CURRENT_WEB_CONTENTS', (event) ->
ipcMain.on 'ATOM_BROWSER_CURRENT_WEB_CONTENTS', (event) ->
event.returnValue = valueToMeta event.sender, event.sender
ipc.on 'ATOM_BROWSER_CONSTRUCTOR', (event, id, args) ->
ipcMain.on 'ATOM_BROWSER_CONSTRUCTOR', (event, id, args) ->
try
args = unwrapArgs event.sender, args
constructor = objectsRegistry.get id
@@ -124,17 +166,17 @@ ipc.on 'ATOM_BROWSER_CONSTRUCTOR', (event, id, args) ->
obj = new (Function::bind.apply(constructor, [null].concat(args)))
event.returnValue = valueToMeta event.sender, obj
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_FUNCTION_CALL', (event, id, args) ->
ipcMain.on 'ATOM_BROWSER_FUNCTION_CALL', (event, id, args) ->
try
args = unwrapArgs event.sender, args
func = objectsRegistry.get id
callFunction event, func, global, args
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', (event, id, method, args) ->
ipcMain.on 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', (event, id, method, args) ->
try
args = unwrapArgs event.sender, args
constructor = objectsRegistry.get(id)[method]
@@ -142,37 +184,48 @@ ipc.on 'ATOM_BROWSER_MEMBER_CONSTRUCTOR', (event, id, method, args) ->
obj = new (Function::bind.apply(constructor, [null].concat(args)))
event.returnValue = valueToMeta event.sender, obj
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_MEMBER_CALL', (event, id, method, args) ->
ipcMain.on 'ATOM_BROWSER_MEMBER_CALL', (event, id, method, args) ->
try
args = unwrapArgs event.sender, args
obj = objectsRegistry.get id
callFunction event, obj[method], obj, args
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_MEMBER_SET', (event, id, name, value) ->
ipcMain.on 'ATOM_BROWSER_MEMBER_SET', (event, id, name, value) ->
try
obj = objectsRegistry.get id
obj[name] = value
event.returnValue = null
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_MEMBER_GET', (event, id, name) ->
ipcMain.on 'ATOM_BROWSER_MEMBER_GET', (event, id, name) ->
try
obj = objectsRegistry.get id
event.returnValue = valueToMeta event.sender, obj[name]
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipc.on 'ATOM_BROWSER_DEREFERENCE', (event, id) ->
ipcMain.on 'ATOM_BROWSER_DEREFERENCE', (event, id) ->
objectsRegistry.remove event.sender.getId(), id
ipc.on 'ATOM_BROWSER_GUEST_WEB_CONTENTS', (event, guestInstanceId) ->
ipcMain.on 'ATOM_BROWSER_GUEST_WEB_CONTENTS', (event, guestInstanceId) ->
try
guestViewManager = require './guest-view-manager'
event.returnValue = valueToMeta event.sender, guestViewManager.getGuest(guestInstanceId)
catch e
event.returnValue = errorToMeta e
event.returnValue = exceptionToMeta e
ipcMain.on 'ATOM_BROWSER_LIST_MODULES', (event) ->
event.returnValue = (name for name of electron)
ipcMain.on 'ATOM_BROWSER_ASYNC_CALL_TO_GUEST_VIEW', (event, guestInstanceId, method, args...) ->
try
guestViewManager = require './guest-view-manager'
guest = guestViewManager.getGuest(guestInstanceId)
guest[method].apply(guest, args)
catch e
event.returnValue = exceptionToMeta e

View File

@@ -0,0 +1,109 @@
// 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/login_handler.h"
#include "atom/browser/browser.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/render_frame_host.h"
#include "content/public/browser/resource_dispatcher_host.h"
#include "content/public/browser/resource_request_info.h"
#include "content/public/browser/web_contents.h"
#include "net/base/auth.h"
#include "net/url_request/url_request.h"
using content::BrowserThread;
namespace atom {
namespace {
// Helper to remove the ref from an net::URLRequest to the LoginHandler.
// Should only be called from the IO thread, since it accesses an
// net::URLRequest.
void ResetLoginHandlerForRequest(net::URLRequest* request) {
content::ResourceDispatcherHost::Get()->ClearLoginDelegateForRequest(request);
}
} // namespace
LoginHandler::LoginHandler(net::AuthChallengeInfo* auth_info,
net::URLRequest* request)
: handled_auth_(false),
auth_info_(auth_info),
request_(request),
render_process_host_id_(0),
render_frame_id_(0) {
content::ResourceRequestInfo::ForRequest(request_)->GetAssociatedRenderFrame(
&render_process_host_id_, &render_frame_id_);
BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
base::Bind(&Browser::RequestLogin,
base::Unretained(Browser::Get()),
make_scoped_refptr(this)));
}
LoginHandler::~LoginHandler() {
}
content::WebContents* LoginHandler::GetWebContents() const {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
content::RenderFrameHost* rfh = content::RenderFrameHost::FromID(
render_process_host_id_, render_frame_id_);
return content::WebContents::FromRenderFrameHost(rfh);
}
void LoginHandler::Login(const base::string16& username,
const base::string16& password) {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (TestAndSetAuthHandled())
return;
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&LoginHandler::DoLogin, this, username, password));
}
void LoginHandler::CancelAuth() {
DCHECK_CURRENTLY_ON(BrowserThread::UI);
if (TestAndSetAuthHandled())
return;
BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
base::Bind(&LoginHandler::DoCancelAuth, this));
}
void LoginHandler::OnRequestCancelled() {
TestAndSetAuthHandled();
request_ = nullptr;
}
// Marks authentication as handled and returns the previous handled state.
bool LoginHandler::TestAndSetAuthHandled() {
base::AutoLock lock(handled_auth_lock_);
bool was_handled = handled_auth_;
handled_auth_ = true;
return was_handled;
}
void LoginHandler::DoCancelAuth() {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (request_) {
request_->CancelAuth();
// Verify that CancelAuth doesn't destroy the request via our delegate.
DCHECK(request_ != nullptr);
ResetLoginHandlerForRequest(request_);
}
}
void LoginHandler::DoLogin(const base::string16& username,
const base::string16& password) {
DCHECK_CURRENTLY_ON(BrowserThread::IO);
if (request_) {
request_->SetAuth(net::AuthCredentials(username, password));
ResetLoginHandlerForRequest(request_);
}
}
} // namespace atom

View File

@@ -0,0 +1,76 @@
// 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_LOGIN_HANDLER_H_
#define ATOM_BROWSER_LOGIN_HANDLER_H_
#include "base/strings/string16.h"
#include "base/synchronization/lock.h"
#include "content/public/browser/resource_dispatcher_host_login_delegate.h"
namespace content {
class WebContents;
}
namespace net {
class AuthChallengeInfo;
class URLRequest;
}
namespace atom {
// Handles the HTTP basic auth, must be created on IO thread.
class LoginHandler : public content::ResourceDispatcherHostLoginDelegate {
public:
LoginHandler(net::AuthChallengeInfo* auth_info, net::URLRequest* request);
// Returns the WebContents associated with the request, must be called on UI
// thread.
content::WebContents* GetWebContents() const;
// The auth is cancelled, must be called on UI thread.
void CancelAuth();
// Login with |username| and |password|, must be called on UI thread.
void Login(const base::string16& username, const base::string16& password);
const net::AuthChallengeInfo* auth_info() const { return auth_info_.get(); }
const net::URLRequest* request() const { return request_; }
protected:
~LoginHandler() override;
// content::ResourceDispatcherHostLoginDelegate:
void OnRequestCancelled() override;
private:
// Must be called on IO thread.
void DoCancelAuth();
void DoLogin(const base::string16& username, const base::string16& password);
// Marks authentication as handled and returns the previous handled
// state.
bool TestAndSetAuthHandled();
// True if we've handled auth (Login or CancelAuth has been called).
bool handled_auth_;
mutable base::Lock handled_auth_lock_;
// Who/where/what asked for the authentication.
scoped_refptr<net::AuthChallengeInfo> auth_info_;
// The request that wants login data.
// This should only be accessed on the IO loop.
net::URLRequest* request_;
// Cached from the net::URLRequest, in case it goes NULL on us.
int render_process_host_id_;
int render_frame_id_;
DISALLOW_COPY_AND_ASSIGN(LoginHandler);
};
} // namespace atom
#endif // ATOM_BROWSER_LOGIN_HANDLER_H_

View File

@@ -43,26 +43,6 @@ DEFINE_WEB_CONTENTS_USER_DATA_KEY(atom::NativeWindowRelay);
namespace atom {
namespace {
// Convert draggable regions in raw format to SkRegion format. Caller is
// responsible for deleting the returned SkRegion instance.
scoped_ptr<SkRegion> DraggableRegionsToSkRegion(
const std::vector<DraggableRegion>& regions) {
scoped_ptr<SkRegion> sk_region(new SkRegion);
for (const DraggableRegion& region : regions) {
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.Pass();
}
} // namespace
NativeWindow::NativeWindow(
brightray::InspectableWebContents* inspectable_web_contents,
const mate::Dictionary& options)
@@ -76,16 +56,16 @@ NativeWindow::NativeWindow(
aspect_ratio_(0.0),
inspectable_web_contents_(inspectable_web_contents),
weak_factory_(this) {
options.Get(switches::kFrame, &has_frame_);
options.Get(switches::kTransparent, &transparent_);
options.Get(switches::kEnableLargerThanScreen, &enable_larger_than_screen_);
options.Get(options::kFrame, &has_frame_);
options.Get(options::kTransparent, &transparent_);
options.Get(options::kEnableLargerThanScreen, &enable_larger_than_screen_);
// 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_);
options.Get(options::kIcon, &icon_);
WindowList::AddWindow(this);
}
@@ -111,25 +91,25 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
// Setup window from options.
int x = -1, y = -1;
bool center;
if (options.Get(switches::kX, &x) && options.Get(switches::kY, &y)) {
if (options.Get(options::kX, &x) && options.Get(options::kY, &y)) {
SetPosition(gfx::Point(x, y));
} else if (options.Get(switches::kCenter, &center) && center) {
} else if (options.Get(options::kCenter, &center) && center) {
Center();
}
// On Linux and Window we may already have maximum size defined.
extensions::SizeConstraints size_constraints(GetContentSizeConstraints());
int min_height = 0, min_width = 0;
if (options.Get(switches::kMinHeight, &min_height) |
options.Get(switches::kMinWidth, &min_width)) {
if (options.Get(options::kMinHeight, &min_height) |
options.Get(options::kMinWidth, &min_width)) {
size_constraints.set_minimum_size(gfx::Size(min_width, min_height));
}
int max_height = INT_MAX, max_width = INT_MAX;
if (options.Get(switches::kMaxHeight, &max_height) |
options.Get(switches::kMaxWidth, &max_width)) {
if (options.Get(options::kMaxHeight, &max_height) |
options.Get(options::kMaxWidth, &max_width)) {
size_constraints.set_maximum_size(gfx::Size(max_width, max_height));
}
bool use_content_size = false;
options.Get(switches::kUseContentSize, &use_content_size);
options.Get(options::kUseContentSize, &use_content_size);
if (use_content_size) {
SetContentSizeConstraints(size_constraints);
} else {
@@ -137,35 +117,39 @@ void NativeWindow::InitFromOptions(const mate::Dictionary& options) {
}
#if defined(OS_WIN) || defined(USE_X11)
bool resizable;
if (options.Get(switches::kResizable, &resizable)) {
if (options.Get(options::kResizable, &resizable)) {
SetResizable(resizable);
}
#endif
bool top;
if (options.Get(switches::kAlwaysOnTop, &top) && top) {
if (options.Get(options::kAlwaysOnTop, &top) && top) {
SetAlwaysOnTop(true);
}
#if defined(OS_MACOSX) || defined(OS_WIN)
bool fullscreen;
if (options.Get(switches::kFullscreen, &fullscreen) && fullscreen) {
if (options.Get(options::kFullscreen, &fullscreen) && fullscreen) {
SetFullScreen(true);
}
#endif
bool skip;
if (options.Get(switches::kSkipTaskbar, &skip) && skip) {
if (options.Get(options::kSkipTaskbar, &skip) && skip) {
SetSkipTaskbar(skip);
}
bool kiosk;
if (options.Get(switches::kKiosk, &kiosk) && kiosk) {
if (options.Get(options::kKiosk, &kiosk) && kiosk) {
SetKiosk(kiosk);
}
std::string color;
if (options.Get(options::kBackgroundColor, &color)) {
SetBackgroundColor(color);
}
std::string title("Electron");
options.Get(switches::kTitle, &title);
options.Get(options::kTitle, &title);
SetTitle(title);
// Then show it.
bool show = true;
options.Get(switches::kShow, &show);
options.Get(options::kShow, &show);
if (show)
Show();
}
@@ -480,6 +464,28 @@ void NativeWindow::NotifyWindowExecuteWindowsCommand(
OnExecuteWindowsCommand(command));
}
#if defined(OS_WIN)
void NativeWindow::NotifyWindowMessage(
UINT message, WPARAM w_param, LPARAM l_param) {
FOR_EACH_OBSERVER(NativeWindowObserver, observers_,
OnWindowMessage(message, w_param, l_param));
}
#endif
scoped_ptr<SkRegion> NativeWindow::DraggableRegionsToSkRegion(
const std::vector<DraggableRegion>& regions) {
scoped_ptr<SkRegion> sk_region(new SkRegion);
for (const DraggableRegion& region : regions) {
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.Pass();
}
void NativeWindow::RenderViewCreated(
content::RenderViewHost* render_view_host) {
if (!transparent_)
@@ -499,17 +505,6 @@ void NativeWindow::BeforeUnloadDialogCancelled() {
window_unresposive_closure_.Cancel();
}
void NativeWindow::TitleWasSet(content::NavigationEntry* entry,
bool explicit_set) {
bool prevent_default = false;
std::string text = entry ? base::UTF16ToUTF8(entry->GetTitle()) : "";
FOR_EACH_OBSERVER(NativeWindowObserver,
observers_,
OnPageTitleUpdated(&prevent_default, text));
if (!prevent_default)
SetTitle(text);
}
bool NativeWindow::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(NativeWindow, message)

View File

@@ -134,6 +134,7 @@ class NativeWindow : public base::SupportsUserData,
virtual void SetSkipTaskbar(bool skip) = 0;
virtual void SetKiosk(bool kiosk) = 0;
virtual bool IsKiosk() = 0;
virtual void SetBackgroundColor(const std::string& color_name) = 0;
virtual void SetRepresentedFilename(const std::string& filename);
virtual std::string GetRepresentedFilename();
virtual void SetDocumentEdited(bool edited);
@@ -209,6 +210,10 @@ class NativeWindow : public base::SupportsUserData,
void NotifyWindowLeaveHtmlFullScreen();
void NotifyWindowExecuteWindowsCommand(const std::string& command);
#if defined(OS_WIN)
void NotifyWindowMessage(UINT message, WPARAM w_param, LPARAM l_param);
#endif
void AddObserver(NativeWindowObserver* obs) {
observers_.AddObserver(obs);
}
@@ -241,21 +246,25 @@ class NativeWindow : public base::SupportsUserData,
NativeWindow(brightray::InspectableWebContents* inspectable_web_contents,
const mate::Dictionary& options);
// Convert draggable regions in raw format to SkRegion format. Caller is
// responsible for deleting the returned SkRegion instance.
scoped_ptr<SkRegion> DraggableRegionsToSkRegion(
const std::vector<DraggableRegion>& regions);
// Converts between content size to window size.
virtual gfx::Size ContentSizeToWindowSize(const gfx::Size& size) = 0;
virtual gfx::Size WindowSizeToContentSize(const gfx::Size& size) = 0;
// Called when the window needs to update its draggable region.
virtual void UpdateDraggableRegions(
const std::vector<DraggableRegion>& regions);
// content::WebContentsObserver:
void RenderViewCreated(content::RenderViewHost* render_view_host) override;
void BeforeUnloadDialogCancelled() override;
void TitleWasSet(content::NavigationEntry* entry, bool explicit_set) override;
bool OnMessageReceived(const IPC::Message& message) override;
private:
// Called when the window needs to update its draggable region.
void UpdateDraggableRegions(
const std::vector<DraggableRegion>& regions);
// Schedule a notification unresponsive event.
void ScheduleUnresponsiveEvent(int ms);

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