Merge pull request #9250 from electron/inherit-javascript-option

Inherit javascript preference in opened windows
This commit is contained in:
Kevin Sawicki 2017-04-25 13:33:53 -07:00 committed by GitHub
commit c9ec45d9d8
4 changed files with 48 additions and 2 deletions

View file

@ -30,6 +30,10 @@ has to be a field of `BrowserWindow`'s options.
* Node integration will always be disabled in the opened `window` if it is * Node integration will always be disabled in the opened `window` if it is
disabled on the parent window. disabled on the parent window.
* Context isolation will always be enabled in the opened `window` if it is
enabled on the parent window.
* JavaScript will always be disabled in the opened `window` if it is disabled on
the parent window.
* Non-standard features (that are not handled by Chromium or Electron) given in * Non-standard features (that are not handled by Chromium or Electron) given in
`features` will be passed to any registered `webContent`'s `new-window` event `features` will be passed to any registered `webContent`'s `new-window` event
handler in the `additionalFeatures` argument. handler in the `additionalFeatures` argument.

View file

@ -48,11 +48,16 @@ const mergeBrowserWindowOptions = function (embedder, options) {
options.webPreferences.nodeIntegration = false options.webPreferences.nodeIntegration = false
} }
// Enable context isolation on child window if enable on parent window // Enable context isolation on child window if enabled on parent window
if (embedder.getWebPreferences().contextIsolation === true) { if (embedder.getWebPreferences().contextIsolation === true) {
options.webPreferences.contextIsolation = true options.webPreferences.contextIsolation = true
} }
// Disable JavaScript on child window if disabled on parent window
if (embedder.getWebPreferences().javascript === false) {
options.webPreferences.javascript = false
}
// Sets correct openerId here to give correct options to 'new-window' event handler // Sets correct openerId here to give correct options to 'new-window' event handler
options.webPreferences.openerId = embedder.id options.webPreferences.openerId = embedder.id
@ -186,7 +191,7 @@ ipcMain.on('ELECTRON_GUEST_WINDOW_MANAGER_WINDOW_OPEN', (event, url, frameName,
const options = {} const options = {}
const ints = ['x', 'y', 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'zoomFactor'] const ints = ['x', 'y', 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'zoomFactor']
const webPreferences = ['zoomFactor', 'nodeIntegration', 'preload'] const webPreferences = ['zoomFactor', 'nodeIntegration', 'preload', 'javascript', 'contextIsolation']
const disposition = 'new-window' const disposition = 'new-window'
// Used to store additional features // Used to store additional features

View file

@ -229,6 +229,31 @@ describe('chromium feature', function () {
b = window.open(windowUrl, '', 'nodeIntegration=no,show=no') b = window.open(windowUrl, '', 'nodeIntegration=no,show=no')
}) })
it('disables JavaScript when it is disabled on the parent window', function (done) {
var b
app.once('web-contents-created', (event, contents) => {
contents.once('did-finish-load', () => {
app.once('browser-window-created', (event, window) => {
const preferences = window.webContents.getWebPreferences()
assert.equal(preferences.javascript, false)
window.destroy()
b.close()
done()
})
// Click link on page
contents.sendInputEvent({type: 'mouseDown', clickCount: 1, x: 1, y: 1})
contents.sendInputEvent({type: 'mouseUp', clickCount: 1, x: 1, y: 1})
})
})
var windowUrl = require('url').format({
pathname: `${fixtures}/pages/window-no-javascript.html`,
protocol: 'file',
slashes: true
})
b = window.open(windowUrl, '', 'javascript=no,show=no')
})
it('does not override child options', function (done) { it('does not override child options', function (done) {
var b, size var b, size
size = { size = {

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<html>
<style>
* {
padding: 0;
margin: 0;
}
</style>
<body>
<a href="about:blank>" target="_blank">CLICK</a>
</body>
</html>