From 97be66b15c24246aff4ca2404de902952dbd82cb Mon Sep 17 00:00:00 2001 From: Pavel Feldman Date: Tue, 15 Dec 2020 15:14:16 -0800 Subject: [PATCH] fix(adb): enable newPage in mobile browser (#4728) --- src/server/chromium/crBrowser.ts | 22 +++++++++++++++++++++- test/android/browser.spec.ts | 9 +++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/src/server/chromium/crBrowser.ts b/src/server/chromium/crBrowser.ts index 63ee58b57b..8fc5975828 100644 --- a/src/server/chromium/crBrowser.ts +++ b/src/server/chromium/crBrowser.ts @@ -316,7 +316,27 @@ export class CRBrowserContext extends BrowserContext { async newPageDelegate(): Promise { assertBrowserContextIsNotOwned(this); - const { targetId } = await this._browser._session.send('Target.createTarget', { url: 'about:blank', browserContextId: this._browserContextId }); + + const oldKeys = this._browser.isClank() ? new Set(this._browser._crPages.keys()) : undefined; + + let { targetId } = await this._browser._session.send('Target.createTarget', { url: 'about:blank', browserContextId: this._browserContextId }); + + if (oldKeys) { + // Chrome for Android returns tab ids (1, 2, 3, 4, 5) instead of content target ids here, work around it via the + // heuristic assuming that there is only one page created at a time. + const newKeys = new Set(this._browser._crPages.keys()); + // Remove old keys. + for (const key of oldKeys) + newKeys.delete(key); + // Remove potential concurrent popups. + for (const key of newKeys) { + const page = this._browser._crPages.get(key)!; + if (page._opener) + newKeys.delete(key); + } + assert(newKeys.size === 1); + [ targetId ] = [...newKeys]; + } return this._browser._crPages.get(targetId)!; } diff --git a/test/android/browser.spec.ts b/test/android/browser.spec.ts index 33cb8f035b..bc71db1771 100644 --- a/test/android/browser.spec.ts +++ b/test/android/browser.spec.ts @@ -29,4 +29,13 @@ if (process.env.PW_ANDROID_TESTS) { expect(await page.title()).toBe('Hello world!'); await context.close(); }); + + it('should create new page', async function({ device }) { + const context = await device.launchBrowser(); + const page = await context.newPage(); + await page.goto('data:text/html,Hello world!'); + expect(await page.title()).toBe('Hello world!'); + await page.close(); + await context.close(); + }); }