mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(electron): browser window ids out of sync (#8759)
This commit is contained in:
parent
c516729544
commit
1b83f3eaec
@ -19,6 +19,7 @@ import os from 'os';
|
|||||||
import path from 'path';
|
import path from 'path';
|
||||||
import { CRBrowser, CRBrowserContext } from '../chromium/crBrowser';
|
import { CRBrowser, CRBrowserContext } from '../chromium/crBrowser';
|
||||||
import { CRConnection, CRSession } from '../chromium/crConnection';
|
import { CRConnection, CRSession } from '../chromium/crConnection';
|
||||||
|
import { CRPage } from '../chromium/crPage';
|
||||||
import { CRExecutionContext } from '../chromium/crExecutionContext';
|
import { CRExecutionContext } from '../chromium/crExecutionContext';
|
||||||
import * as js from '../javascript';
|
import * as js from '../javascript';
|
||||||
import { Page } from '../page';
|
import { Page } from '../page';
|
||||||
@ -49,7 +50,6 @@ export class ElectronApplication extends SdkObject {
|
|||||||
private _nodeSession: CRSession;
|
private _nodeSession: CRSession;
|
||||||
private _nodeExecutionContext: js.ExecutionContext | undefined;
|
private _nodeExecutionContext: js.ExecutionContext | undefined;
|
||||||
_nodeElectronHandlePromise: Promise<js.JSHandle<any>>;
|
_nodeElectronHandlePromise: Promise<js.JSHandle<any>>;
|
||||||
private _lastWindowId = 0;
|
|
||||||
readonly _timeoutSettings = new TimeoutSettings();
|
readonly _timeoutSettings = new TimeoutSettings();
|
||||||
|
|
||||||
constructor(parent: SdkObject, browser: CRBrowser, nodeConnection: CRConnection) {
|
constructor(parent: SdkObject, browser: CRBrowser, nodeConnection: CRConnection) {
|
||||||
@ -59,9 +59,6 @@ export class ElectronApplication extends SdkObject {
|
|||||||
// Emit application closed after context closed.
|
// Emit application closed after context closed.
|
||||||
Promise.resolve().then(() => this.emit(ElectronApplication.Events.Close));
|
Promise.resolve().then(() => this.emit(ElectronApplication.Events.Close));
|
||||||
});
|
});
|
||||||
for (const page of this._browserContext.pages())
|
|
||||||
this._onPage(page);
|
|
||||||
this._browserContext.on(BrowserContext.Events.Page, event => this._onPage(event));
|
|
||||||
this._nodeConnection = nodeConnection;
|
this._nodeConnection = nodeConnection;
|
||||||
this._nodeSession = nodeConnection.rootSession;
|
this._nodeSession = nodeConnection.rootSession;
|
||||||
this._nodeElectronHandlePromise = new Promise(f => {
|
this._nodeElectronHandlePromise = new Promise(f => {
|
||||||
@ -75,12 +72,6 @@ export class ElectronApplication extends SdkObject {
|
|||||||
this._nodeSession.send('Runtime.enable', {}).catch(e => {});
|
this._nodeSession.send('Runtime.enable', {}).catch(e => {});
|
||||||
}
|
}
|
||||||
|
|
||||||
private _onPage(page: Page) {
|
|
||||||
// Needs to be sync.
|
|
||||||
const windowId = ++this._lastWindowId;
|
|
||||||
(page as any)._browserWindowId = windowId;
|
|
||||||
}
|
|
||||||
|
|
||||||
context(): BrowserContext {
|
context(): BrowserContext {
|
||||||
return this._browserContext;
|
return this._browserContext;
|
||||||
}
|
}
|
||||||
@ -95,8 +86,13 @@ export class ElectronApplication extends SdkObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async browserWindow(page: Page): Promise<js.JSHandle<BrowserWindow>> {
|
async browserWindow(page: Page): Promise<js.JSHandle<BrowserWindow>> {
|
||||||
|
// Assume CRPage as Electron is always Chromium.
|
||||||
|
const targetId = (page._delegate as CRPage)._targetId;
|
||||||
const electronHandle = await this._nodeElectronHandlePromise;
|
const electronHandle = await this._nodeElectronHandlePromise;
|
||||||
return await electronHandle.evaluateHandle(({ BrowserWindow }, windowId) => BrowserWindow.fromId(windowId), (page as any)._browserWindowId);
|
return await electronHandle.evaluateHandle(({ BrowserWindow, webContents }, targetId) => {
|
||||||
|
const wc = webContents.fromDevToolsTargetId(targetId);
|
||||||
|
return BrowserWindow.fromWebContents(wc);
|
||||||
|
}, targetId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -126,3 +126,44 @@ test('should bypass csp', async ({ playwright, server }) => {
|
|||||||
expect(await page.evaluate('window["__injected"]')).toBe(42);
|
expect(await page.evaluate('window["__injected"]')).toBe(42);
|
||||||
await app.close();
|
await app.close();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should create page for browser view', async ({ playwright }) => {
|
||||||
|
const app = await playwright._electron.launch({
|
||||||
|
args: [path.join(__dirname, 'electron-window-app.js')],
|
||||||
|
});
|
||||||
|
const browserViewPagePromise = app.waitForEvent('window');
|
||||||
|
await app.evaluate(async electron => {
|
||||||
|
const window = electron.BrowserWindow.getAllWindows()[0];
|
||||||
|
const view = new electron.BrowserView();
|
||||||
|
window.addBrowserView(view);
|
||||||
|
await view.webContents.loadURL('about:blank');
|
||||||
|
view.setBounds({ x: 0, y: 0, width: 256, height: 256 });
|
||||||
|
});
|
||||||
|
await browserViewPagePromise;
|
||||||
|
expect(app.windows()).toHaveLength(2);
|
||||||
|
await app.close();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should return same browser window for browser view pages', async ({ playwright }) => {
|
||||||
|
const app = await playwright._electron.launch({
|
||||||
|
args: [path.join(__dirname, 'electron-window-app.js')],
|
||||||
|
});
|
||||||
|
const browserViewPagePromise = app.waitForEvent('window');
|
||||||
|
await app.evaluate(async electron => {
|
||||||
|
const window = electron.BrowserWindow.getAllWindows()[0];
|
||||||
|
const view = new electron.BrowserView();
|
||||||
|
window.addBrowserView(view);
|
||||||
|
await view.webContents.loadURL('about:blank');
|
||||||
|
view.setBounds({ x: 0, y: 0, width: 256, height: 256 });
|
||||||
|
});
|
||||||
|
await browserViewPagePromise;
|
||||||
|
const [firstWindowId, secondWindowId] = await Promise.all(
|
||||||
|
app.windows().map(async page => {
|
||||||
|
const bwHandle = await app.browserWindow(page);
|
||||||
|
const id = await bwHandle.evaluate((bw: BrowserWindow) => bw.id);
|
||||||
|
return id;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
expect(firstWindowId).toEqual(secondWindowId);
|
||||||
|
await app.close();
|
||||||
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user