From ddc85869de8639907bb49f3b3aa444a73d8e71bb Mon Sep 17 00:00:00 2001 From: Milan Burda Date: Tue, 16 Jul 2019 04:44:04 +0200 Subject: [PATCH] fix: not working in scriptable popups (#19206) --- atom/browser/web_contents_preferences.cc | 4 ++-- spec/api-browser-window-spec.js | 21 +++++++++++++++++++ .../api/new-window-webview-preload.js | 3 +++ spec/fixtures/api/new-window-webview.html | 20 ++++++++++++++++++ spec/static/main.js | 6 ++++++ 5 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 spec/fixtures/api/new-window-webview-preload.js create mode 100644 spec/fixtures/api/new-window-webview.html diff --git a/atom/browser/web_contents_preferences.cc b/atom/browser/web_contents_preferences.cc index c23022b376dfe..c5dc0beaffb52 100644 --- a/atom/browser/web_contents_preferences.cc +++ b/atom/browser/web_contents_preferences.cc @@ -146,8 +146,6 @@ WebContentsPreferences::WebContentsPreferences( SetDefaultBoolIfUndefined(options::kOffscreen, false); SetDefaults(); - - last_preference_ = preference_.Clone(); } WebContentsPreferences::~WebContentsPreferences() { @@ -159,6 +157,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 3224209ec8fd6..fd351657b7a34 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -2034,6 +2034,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 e74facac70332..4d7d4420c8c26 100644 --- a/spec/static/main.js +++ b/spec/static/main.js @@ -340,6 +340,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