diff --git a/spec/api-browser-window-spec.js b/spec/api-browser-window-spec.js index ef6baa4e48..09e13b914c 100644 --- a/spec/api-browser-window-spec.js +++ b/spec/api-browser-window-spec.js @@ -1400,6 +1400,31 @@ describe('BrowserWindow module', function () { }) w.loadURL(`file://${path.join(fixtures, 'api', 'new-window.html')}`) }) + + it('retains the original web preferences when window.location is changed to a new origin', async function () { + await serveFileFromProtocol('foo', path.join(fixtures, 'api', 'window-open-location-change.html')) + await serveFileFromProtocol('bar', path.join(fixtures, 'api', 'window-open-location-final.html')) + + w.destroy() + w = new BrowserWindow({ + show: true, + webPreferences: { + nodeIntegration: false, + nativeWindowOpen: true + } + }) + + return new Promise((resolve, reject) => { + ipcRenderer.send('set-web-preferences-on-next-new-window', w.webContents.id, 'preload', path.join(fixtures, 'api', 'window-open-preload.js')) + ipcMain.once('answer', (event, args, typeofProcess) => { + assert.equal(args.includes('--node-integration=false'), true) + assert.equal(args.includes('--native-window-open'), true) + assert.equal(typeofProcess, 'undefined') + resolve() + }) + w.loadURL(`file://${path.join(fixtures, 'api', 'window-open-location-open.html')}`) + }) + }) }) }) @@ -2780,3 +2805,20 @@ const isScaleFactorRounding = () => { // Return true if scale factor is odd number above 2 return scaleFactor > 2 && scaleFactor % 2 === 1 } + +function serveFileFromProtocol (protocolName, filePath) { + return new Promise((resolve, reject) => { + protocol.registerBufferProtocol(protocolName, (request, callback) => { + callback({ + mimeType: 'text/html', + data: fs.readFileSync(filePath) + }) + }, (error) => { + if (error != null) { + reject(error) + } else { + resolve() + } + }) + }) +} diff --git a/spec/fixtures/api/window-open-location-change.html b/spec/fixtures/api/window-open-location-change.html new file mode 100644 index 0000000000..fbb87c9f67 --- /dev/null +++ b/spec/fixtures/api/window-open-location-change.html @@ -0,0 +1,15 @@ + + + + + + + + foo + + + diff --git a/spec/fixtures/api/window-open-location-final.html b/spec/fixtures/api/window-open-location-final.html new file mode 100644 index 0000000000..0814c3262c --- /dev/null +++ b/spec/fixtures/api/window-open-location-final.html @@ -0,0 +1,10 @@ + + + + + + + + bar + + diff --git a/spec/fixtures/api/window-open-location-open.html b/spec/fixtures/api/window-open-location-open.html new file mode 100644 index 0000000000..95b65652a0 --- /dev/null +++ b/spec/fixtures/api/window-open-location-open.html @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/spec/fixtures/api/window-open-preload.js b/spec/fixtures/api/window-open-preload.js new file mode 100644 index 0000000000..09b8928573 --- /dev/null +++ b/spec/fixtures/api/window-open-preload.js @@ -0,0 +1,8 @@ +const {ipcRenderer} = require('electron') + +setImmediate(function () { + if (window.location.toString() === 'bar://page') { + ipcRenderer.send('answer', process.argv, typeof global.process) + window.close() + } +})