electron/spec-main/api-browser-window-affinity-spec.ts
Samuel Attard 186301e126
feat: enable context isolation by default (#26890)
* feat: enable context isolation by default

* chore: set default in ctx iso getter

* spec: make all specs work with the new contextIsolation default

* spec: fix affinity specs

* spec: update tests for new ctx iso default

* spec: update tests for new ctx iso default

* spec: update tests for new ctx iso default

* spec: update tests for new ctx iso default

* chore: move stray prod deps to dev deps

* spec: update tests for new ctx iso default

* turn off contextIsolation for visibility tests

* turn off contextIsolation for <webview> tag nodeintegration attribute loads native modules when navigation happens

Co-authored-by: John Kleinschmidt <jkleinsc@electronjs.org>
2021-03-01 16:52:29 -05:00

178 lines
6.6 KiB
TypeScript

import { expect } from 'chai';
import * as path from 'path';
import { ipcMain, BrowserWindow, WebPreferences, app } from 'electron/main';
import { closeWindow } from './window-helpers';
import { emittedOnce } from './events-helpers';
describe('BrowserWindow with affinity module', () => {
const fixtures = path.resolve(__dirname, '..', 'spec', 'fixtures');
const myAffinityName = 'myAffinity';
const myAffinityNameUpper = 'MYAFFINITY';
const anotherAffinityName = 'anotherAffinity';
before(() => {
app.allowRendererProcessReuse = false;
});
after(() => {
app.allowRendererProcessReuse = true;
});
async function createWindowWithWebPrefs (webPrefs: WebPreferences) {
const w = new BrowserWindow({
show: false,
width: 400,
height: 400,
webPreferences: webPrefs || {}
});
await w.loadFile(path.join(fixtures, 'api', 'blank.html'));
return w;
}
function testAffinityProcessIds (name: string, webPreferences: WebPreferences = {}) {
describe(name, () => {
let mAffinityWindow: BrowserWindow;
before(async () => {
mAffinityWindow = await createWindowWithWebPrefs({ affinity: myAffinityName, ...webPreferences });
});
after(async () => {
await closeWindow(mAffinityWindow, { assertNotWindows: false });
mAffinityWindow = null as unknown as BrowserWindow;
});
it('should have a different process id than a default window', async () => {
const w = await createWindowWithWebPrefs({ ...webPreferences });
const affinityID = mAffinityWindow.webContents.getOSProcessId();
const wcID = w.webContents.getOSProcessId();
expect(affinityID).to.not.equal(wcID, 'Should have different OS process IDs');
await closeWindow(w, { assertNotWindows: false });
});
it(`should have a different process id than a window with a different affinity '${anotherAffinityName}'`, async () => {
const w = await createWindowWithWebPrefs({ affinity: anotherAffinityName, ...webPreferences });
const affinityID = mAffinityWindow.webContents.getOSProcessId();
const wcID = w.webContents.getOSProcessId();
expect(affinityID).to.not.equal(wcID, 'Should have different OS process IDs');
await closeWindow(w, { assertNotWindows: false });
});
it(`should have the same OS process id than a window with the same affinity '${myAffinityName}'`, async () => {
const w = await createWindowWithWebPrefs({ affinity: myAffinityName, ...webPreferences });
const affinityID = mAffinityWindow.webContents.getOSProcessId();
const wcID = w.webContents.getOSProcessId();
expect(affinityID).to.equal(wcID, 'Should have the same OS process ID');
await closeWindow(w, { assertNotWindows: false });
});
it(`should have the same OS process id than a window with an equivalent affinity '${myAffinityNameUpper}' (case insensitive)`, async () => {
const w = await createWindowWithWebPrefs({ affinity: myAffinityNameUpper, ...webPreferences });
const affinityID = mAffinityWindow.webContents.getOSProcessId();
const wcID = w.webContents.getOSProcessId();
expect(affinityID).to.equal(wcID, 'Should have the same OS process ID');
await closeWindow(w, { assertNotWindows: false });
});
});
}
testAffinityProcessIds(`BrowserWindow with an affinity '${myAffinityName}'`);
testAffinityProcessIds(`BrowserWindow with an affinity '${myAffinityName}' and sandbox enabled`, { sandbox: true });
testAffinityProcessIds(`BrowserWindow with an affinity '${myAffinityName}' and nativeWindowOpen enabled`, { nativeWindowOpen: true });
describe('BrowserWindow with an affinity : nodeIntegration=false', () => {
const preload = path.join(fixtures, 'module', 'send-later.js');
const affinityWithNodeTrue = 'affinityWithNodeTrue';
const affinityWithNodeFalse = 'affinityWithNodeFalse';
async function testNodeIntegration (present: boolean) {
const [, typeofProcess, typeofBuffer] = await emittedOnce(ipcMain, 'answer');
if (present) {
expect(typeofProcess).to.not.equal('undefined');
expect(typeofBuffer).to.not.equal('undefined');
} else {
expect(typeofProcess).to.equal('undefined');
expect(typeofBuffer).to.equal('undefined');
}
}
it('disables node integration when specified to false', async () => {
const [, w] = await Promise.all([
testNodeIntegration(false),
createWindowWithWebPrefs({
affinity: affinityWithNodeTrue,
preload,
nodeIntegration: false,
contextIsolation: false
})
]);
await closeWindow(w, { assertNotWindows: false });
});
it('allows nodeIntegration to enable in second window with the same affinity', async () => {
const [, w1] = await Promise.all([
testNodeIntegration(false),
createWindowWithWebPrefs({
affinity: affinityWithNodeTrue,
preload,
nodeIntegration: false,
contextIsolation: false
})
]);
const [, w2] = await Promise.all([
testNodeIntegration(true),
createWindowWithWebPrefs({
affinity: affinityWithNodeTrue,
preload,
nodeIntegration: true,
contextIsolation: false
})
]);
await Promise.all([
closeWindow(w1, { assertNotWindows: false }),
closeWindow(w2, { assertNotWindows: false })
]);
});
it('enables node integration when specified to true', async () => {
const [, w] = await Promise.all([
testNodeIntegration(true),
createWindowWithWebPrefs({
affinity: affinityWithNodeFalse,
preload,
nodeIntegration: true,
contextIsolation: false
})
]);
await closeWindow(w, { assertNotWindows: false });
});
it('allows nodeIntegration to disable in second window with the same affinity', async () => {
const [, w1] = await Promise.all([
testNodeIntegration(true),
createWindowWithWebPrefs({
affinity: affinityWithNodeFalse,
preload,
nodeIntegration: true,
contextIsolation: false
})
]);
const [, w2] = await Promise.all([
testNodeIntegration(false),
createWindowWithWebPrefs({
affinity: affinityWithNodeFalse,
preload,
nodeIntegration: false,
contextIsolation: false
})
]);
await Promise.all([
closeWindow(w1, { assertNotWindows: false }),
closeWindow(w2, { assertNotWindows: false })
]);
});
});
});