feat: add webContents.setWindowOpenHandler API (#24517)
Co-authored-by: Jeremy Rose <jeremya@chromium.org>
This commit is contained in:
parent
6b222a2d8a
commit
0b85fdf26c
56 changed files with 2087 additions and 885 deletions
|
@ -1,15 +1,16 @@
|
|||
import { BrowserWindow } from 'electron';
|
||||
import { writeFileSync, readFileSync } from 'fs';
|
||||
import { resolve } from 'path';
|
||||
import { expect } from 'chai';
|
||||
import { expect, assert } from 'chai';
|
||||
import { closeAllWindows } from './window-helpers';
|
||||
const { emittedOnce } = require('./events-helpers');
|
||||
|
||||
function genSnapshot (browserWindow: BrowserWindow, features: string) {
|
||||
return new Promise((resolve) => {
|
||||
browserWindow.webContents.on('new-window', (...args: any[]) => {
|
||||
resolve([features, ...args]);
|
||||
});
|
||||
browserWindow.webContents.executeJavaScript(`window.open('about:blank', 'frame name', '${features}')`);
|
||||
browserWindow.webContents.executeJavaScript(`window.open('about:blank', 'frame name', '${features}') && true`);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -52,7 +53,7 @@ describe('new-window event', () => {
|
|||
beforeEach((done) => {
|
||||
browserWindow = new BrowserWindow(browserWindowOptions);
|
||||
browserWindow.loadURL('about:blank');
|
||||
browserWindow.on('ready-to-show', () => done());
|
||||
browserWindow.on('ready-to-show', () => { done(); });
|
||||
});
|
||||
|
||||
afterEach(closeAllWindows);
|
||||
|
@ -86,6 +87,100 @@ describe('new-window event', () => {
|
|||
}
|
||||
});
|
||||
|
||||
describe('webContents.setWindowOpenHandler', () => {
|
||||
const testConfig = {
|
||||
native: {
|
||||
browserWindowOptions: {
|
||||
show: false,
|
||||
webPreferences: {
|
||||
nativeWindowOpen: true
|
||||
}
|
||||
}
|
||||
},
|
||||
proxy: {
|
||||
browserWindowOptions: {
|
||||
show: false,
|
||||
webPreferences: {
|
||||
nativeWindowOpen: false
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
for (const testName of Object.keys(testConfig) as (keyof typeof testConfig)[]) {
|
||||
let browserWindow: BrowserWindow;
|
||||
const { browserWindowOptions } = testConfig[testName];
|
||||
|
||||
describe(testName, () => {
|
||||
beforeEach((done) => {
|
||||
browserWindow = new BrowserWindow(browserWindowOptions);
|
||||
browserWindow.loadURL('about:blank');
|
||||
browserWindow.on('ready-to-show', () => { browserWindow.show(); done(); });
|
||||
});
|
||||
|
||||
afterEach(closeAllWindows);
|
||||
|
||||
it('does not fire window creation events if an override returns action: deny', (done) => {
|
||||
browserWindow.webContents.setWindowOpenHandler(() => ({ action: 'deny' }));
|
||||
browserWindow.webContents.on('new-window', () => {
|
||||
assert.fail('new-window should not to be called with an overridden window.open');
|
||||
});
|
||||
|
||||
browserWindow.webContents.on('did-create-window', () => {
|
||||
assert.fail('did-create-window should not to be called with an overridden window.open');
|
||||
});
|
||||
|
||||
browserWindow.webContents.executeJavaScript("window.open('about:blank') && true");
|
||||
|
||||
setTimeout(() => {
|
||||
done();
|
||||
}, 500);
|
||||
});
|
||||
|
||||
it('fires handler with correct params', (done) => {
|
||||
const testFrameName = 'test-frame-name';
|
||||
const testFeatures = 'top=10&left=10&something-unknown';
|
||||
const testUrl = 'app://does-not-exist/';
|
||||
browserWindow.webContents.setWindowOpenHandler(({ url, frameName, features }) => {
|
||||
expect(url).to.equal(testUrl);
|
||||
expect(frameName).to.equal(testFrameName);
|
||||
expect(features).to.equal(testFeatures);
|
||||
done();
|
||||
return { action: 'deny' };
|
||||
});
|
||||
|
||||
browserWindow.webContents.executeJavaScript(`window.open('${testUrl}', '${testFrameName}', '${testFeatures}') && true`);
|
||||
});
|
||||
|
||||
it('does fire window creation events if an override returns action: allow', async () => {
|
||||
browserWindow.webContents.setWindowOpenHandler(() => ({ action: 'allow' }));
|
||||
|
||||
setImmediate(() => {
|
||||
browserWindow.webContents.executeJavaScript("window.open('about:blank') && true");
|
||||
});
|
||||
|
||||
await Promise.all([
|
||||
emittedOnce(browserWindow.webContents, 'did-create-window'),
|
||||
emittedOnce(browserWindow.webContents, 'new-window')
|
||||
]);
|
||||
});
|
||||
|
||||
it('can change webPreferences of child windows', (done) => {
|
||||
browserWindow.webContents.setWindowOpenHandler(() => ({ action: 'allow', overrideBrowserWindowOptions: { webPreferences: { defaultFontSize: 30 } } }));
|
||||
|
||||
browserWindow.webContents.on('did-create-window', async (childWindow) => {
|
||||
await childWindow.webContents.executeJavaScript("document.write('hello')");
|
||||
const size = await childWindow.webContents.executeJavaScript("getComputedStyle(document.querySelector('body')).fontSize");
|
||||
expect(size).to.equal('30px');
|
||||
done();
|
||||
});
|
||||
|
||||
browserWindow.webContents.executeJavaScript("window.open('about:blank') && true");
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function stringifySnapshots (snapshots: any, pretty = false) {
|
||||
return JSON.stringify(snapshots, (key, value) => {
|
||||
if (['sender', 'webContents'].includes(key)) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue