diff --git a/shell/browser/web_contents_preferences.cc b/shell/browser/web_contents_preferences.cc index 3b40c6e63b032..40e8565058155 100644 --- a/shell/browser/web_contents_preferences.cc +++ b/shell/browser/web_contents_preferences.cc @@ -147,8 +147,6 @@ WebContentsPreferences::WebContentsPreferences( #endif SetDefaultBoolIfUndefined(options::kOffscreen, false); - SetDefaults(); - // If this is a tag, and the embedder is offscreen-rendered, then // this WebContents is also offscreen-rendered. int guest_instance_id = 0; @@ -166,7 +164,7 @@ WebContentsPreferences::WebContentsPreferences( } } - last_preference_ = preference_.Clone(); + SetDefaults(); } WebContentsPreferences::~WebContentsPreferences() { @@ -178,6 +176,8 @@ void WebContentsPreferences::SetDefaults() { if (IsEnabled(options::kSandbox)) { SetBool(options::kNativeWindowOpen, true); } + + last_preference_ = preference_.Clone(); } bool WebContentsPreferences::SetDefaultBoolIfUndefined( diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index 2a95bd2ef1f45..1df7768486d58 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -836,6 +836,27 @@ describe('BrowserWindow module', () => { }) w.loadFile(path.join(fixtures, 'api', 'native-window-open-native-addon.html')) }) + it(' works in a scriptable popup', (done) => { + const preload = path.join(fixtures, 'api', 'new-window-webview-preload.js') + + w.destroy() + w = new BrowserWindow({ + show: false, + webPreferences: { + nodeIntegrationInSubFrames: true, + nativeWindowOpen: true, + webviewTag: true, + preload + } + }) + + ipcRenderer.send('set-options-on-next-new-window', w.webContents.id, 'show', false) + + ipcMain.once('webview-loaded', () => { + done() + }) + w.loadFile(path.join(fixtures, 'api', 'new-window-webview.html')) + }) it('should inherit the nativeWindowOpen setting in opened windows', (done) => { w.destroy() w = new BrowserWindow({ diff --git a/spec/fixtures/api/new-window-webview-preload.js b/spec/fixtures/api/new-window-webview-preload.js new file mode 100644 index 0000000000000..ba5d5ded82db1 --- /dev/null +++ b/spec/fixtures/api/new-window-webview-preload.js @@ -0,0 +1,3 @@ +const { ipcRenderer } = require('electron') + +window.ipcRenderer = ipcRenderer diff --git a/spec/fixtures/api/new-window-webview.html b/spec/fixtures/api/new-window-webview.html new file mode 100644 index 0000000000000..335e5ddc9cd56 --- /dev/null +++ b/spec/fixtures/api/new-window-webview.html @@ -0,0 +1,20 @@ + + + + + + + + + + diff --git a/spec/static/main.js b/spec/static/main.js index 34d61e42de907..892f22282b32a 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -231,6 +231,12 @@ ipcMain.on('prevent-next-new-window', (event, id) => { webContents.fromId(id).once('new-window', event => event.preventDefault()) }) +ipcMain.on('set-options-on-next-new-window', (event, id, key, value) => { + webContents.fromId(id).once('new-window', (event, url, frameName, disposition, options) => { + options[key] = value + }) +}) + ipcMain.on('set-web-preferences-on-next-new-window', (event, id, key, value) => { webContents.fromId(id).once('new-window', (event, url, frameName, disposition, options) => { options.webPreferences[key] = value