Merge pull request #816 from atom/browser-window-preload
Add "preload" option for BrowserWindow
This commit is contained in:
commit
e699cac92c
8 changed files with 41 additions and 3 deletions
|
@ -101,6 +101,13 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
|
||||||
// Read icon before window is created.
|
// Read icon before window is created.
|
||||||
options.Get(switches::kIcon, &icon_);
|
options.Get(switches::kIcon, &icon_);
|
||||||
|
|
||||||
|
// The "preload" option must be absolute path.
|
||||||
|
if (options.Get(switches::kPreloadScript, &preload_script_) &&
|
||||||
|
!preload_script_.IsAbsolute()) {
|
||||||
|
LOG(ERROR) << "Path of \"preload\" script must be absolute.";
|
||||||
|
preload_script_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
// Be compatible with old API of "node-integration" option.
|
// Be compatible with old API of "node-integration" option.
|
||||||
std::string old_string_token;
|
std::string old_string_token;
|
||||||
if (options.Get(switches::kNodeIntegration, &old_string_token) &&
|
if (options.Get(switches::kNodeIntegration, &old_string_token) &&
|
||||||
|
@ -349,6 +356,10 @@ void NativeWindow::AppendExtraCommandLineSwitches(
|
||||||
command_line->AppendSwitchASCII(switches::kNodeIntegration,
|
command_line->AppendSwitchASCII(switches::kNodeIntegration,
|
||||||
node_integration_ ? "true" : "false");
|
node_integration_ ? "true" : "false");
|
||||||
|
|
||||||
|
// Append --preload.
|
||||||
|
if (!preload_script_.empty())
|
||||||
|
command_line->AppendSwitchPath(switches::kPreloadScript, preload_script_);
|
||||||
|
|
||||||
// Append --zoom-factor.
|
// Append --zoom-factor.
|
||||||
if (zoom_factor_ != 1.0)
|
if (zoom_factor_ != 1.0)
|
||||||
command_line->AppendSwitchASCII(switches::kZoomFactor,
|
command_line->AppendSwitchASCII(switches::kZoomFactor,
|
||||||
|
|
|
@ -318,6 +318,9 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
|
||||||
// Web preferences.
|
// Web preferences.
|
||||||
mate::PersistentDictionary web_preferences_;
|
mate::PersistentDictionary web_preferences_;
|
||||||
|
|
||||||
|
// The script to load before page's JavaScript starts to run.
|
||||||
|
base::FilePath preload_script_;
|
||||||
|
|
||||||
// Page's default zoom factor.
|
// Page's default zoom factor.
|
||||||
double zoom_factor_;
|
double zoom_factor_;
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ const char kEnablePlugins[] = "enable-plugins";
|
||||||
const char kGuestInstanceID[] = "guest-instance-id";
|
const char kGuestInstanceID[] = "guest-instance-id";
|
||||||
|
|
||||||
// Script that will be loaded by guest WebContents before other scripts.
|
// Script that will be loaded by guest WebContents before other scripts.
|
||||||
const char kPreloadScript[] = "preload-script";
|
const char kPreloadScript[] = "preload";
|
||||||
|
|
||||||
// Web runtime features.
|
// Web runtime features.
|
||||||
const char kExperimentalFeatures[] = "experimental-features";
|
const char kExperimentalFeatures[] = "experimental-features";
|
||||||
|
|
|
@ -31,7 +31,7 @@ for arg in process.argv
|
||||||
require('web-frame').setName 'ATOM_SHELL_GUEST_WEB_VIEW'
|
require('web-frame').setName 'ATOM_SHELL_GUEST_WEB_VIEW'
|
||||||
else if arg.indexOf('--node-integration=') == 0
|
else if arg.indexOf('--node-integration=') == 0
|
||||||
nodeIntegration = arg.substr arg.indexOf('=') + 1
|
nodeIntegration = arg.substr arg.indexOf('=') + 1
|
||||||
else if arg.indexOf('--preload-script=') == 0
|
else if arg.indexOf('--preload=') == 0
|
||||||
preloadScript = arg.substr arg.indexOf('=') + 1
|
preloadScript = arg.substr arg.indexOf('=') + 1
|
||||||
|
|
||||||
if location.protocol is 'chrome-devtools:'
|
if location.protocol is 'chrome-devtools:'
|
||||||
|
|
|
@ -61,7 +61,11 @@ You can also create a window without chrome by using
|
||||||
* `enable-larger-than-screen` Boolean - Enable the window to be resized larger
|
* `enable-larger-than-screen` Boolean - Enable the window to be resized larger
|
||||||
than screen.
|
than screen.
|
||||||
* `dark-theme` Boolean - Forces using dark theme for the window, only works on
|
* `dark-theme` Boolean - Forces using dark theme for the window, only works on
|
||||||
some GTK+3 desktop environments.
|
some GTK+3 desktop environments
|
||||||
|
* `preload` String - Specifies a script that will be loaded before other
|
||||||
|
scripts run in the window. This script will always have access to node APIs
|
||||||
|
no matter whether node integration is turned on for the window, and the path
|
||||||
|
of `preload` script has to be absolute path.
|
||||||
* `web-preferences` Object - Settings of web page's features
|
* `web-preferences` Object - Settings of web page's features
|
||||||
* `javascript` Boolean
|
* `javascript` Boolean
|
||||||
* `web-security` Boolean
|
* `web-security` Boolean
|
||||||
|
|
|
@ -136,6 +136,16 @@ describe 'browser-window module', ->
|
||||||
assert.equal after[0], size.width
|
assert.equal after[0], size.width
|
||||||
assert.equal after[1], size.height
|
assert.equal after[1], size.height
|
||||||
|
|
||||||
|
describe '"preload" options', ->
|
||||||
|
it 'loads the script before other scripts in window', (done) ->
|
||||||
|
preload = path.join fixtures, 'module', 'set-global.js'
|
||||||
|
remote.require('ipc').once 'preload', (event, test) ->
|
||||||
|
assert.equal(test, 'preload')
|
||||||
|
done()
|
||||||
|
w.destroy()
|
||||||
|
w = new BrowserWindow(show: false, width: 400, height: 400, preload: preload)
|
||||||
|
w.loadUrl 'file://' + path.join(fixtures, 'api', 'preload.html')
|
||||||
|
|
||||||
describe 'beforeunload handler', ->
|
describe 'beforeunload handler', ->
|
||||||
it 'returning true would not prevent close', (done) ->
|
it 'returning true would not prevent close', (done) ->
|
||||||
w.on 'closed', ->
|
w.on 'closed', ->
|
||||||
|
|
9
spec/fixtures/api/preload.html
vendored
Normal file
9
spec/fixtures/api/preload.html
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
<script type="text/javascript" charset="utf-8">
|
||||||
|
if (!window.test)
|
||||||
|
window.test = 'window'
|
||||||
|
require('ipc').send('preload', window.test);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
1
spec/fixtures/module/set-global.js
vendored
Normal file
1
spec/fixtures/module/set-global.js
vendored
Normal file
|
@ -0,0 +1 @@
|
||||||
|
window.test = 'preload';
|
Loading…
Add table
Add a link
Reference in a new issue