Merge pull request #816 from atom/browser-window-preload

Add "preload" option for BrowserWindow
This commit is contained in:
Cheng Zhao 2014-11-12 16:03:08 +08:00
commit e699cac92c
8 changed files with 41 additions and 3 deletions

View file

@ -101,6 +101,13 @@ NativeWindow::NativeWindow(content::WebContents* web_contents,
// Read icon before window is created.
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.
std::string old_string_token;
if (options.Get(switches::kNodeIntegration, &old_string_token) &&
@ -349,6 +356,10 @@ void NativeWindow::AppendExtraCommandLineSwitches(
command_line->AppendSwitchASCII(switches::kNodeIntegration,
node_integration_ ? "true" : "false");
// Append --preload.
if (!preload_script_.empty())
command_line->AppendSwitchPath(switches::kPreloadScript, preload_script_);
// Append --zoom-factor.
if (zoom_factor_ != 1.0)
command_line->AppendSwitchASCII(switches::kZoomFactor,

View file

@ -318,6 +318,9 @@ class NativeWindow : public brightray::DefaultWebContentsDelegate,
// 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.
double zoom_factor_;

View file

@ -67,7 +67,7 @@ const char kEnablePlugins[] = "enable-plugins";
const char kGuestInstanceID[] = "guest-instance-id";
// Script that will be loaded by guest WebContents before other scripts.
const char kPreloadScript[] = "preload-script";
const char kPreloadScript[] = "preload";
// Web runtime features.
const char kExperimentalFeatures[] = "experimental-features";

View file

@ -31,7 +31,7 @@ for arg in process.argv
require('web-frame').setName 'ATOM_SHELL_GUEST_WEB_VIEW'
else if arg.indexOf('--node-integration=') == 0
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
if location.protocol is 'chrome-devtools:'

View file

@ -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
than screen.
* `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
* `javascript` Boolean
* `web-security` Boolean

View file

@ -136,6 +136,16 @@ describe 'browser-window module', ->
assert.equal after[0], size.width
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', ->
it 'returning true would not prevent close', (done) ->
w.on 'closed', ->

9
spec/fixtures/api/preload.html vendored Normal file
View 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
View file

@ -0,0 +1 @@
window.test = 'preload';