diff --git a/tests/bidi/playwright.config.ts b/tests/bidi/playwright.config.ts
index 7aa17f35ba..7adaa56638 100644
--- a/tests/bidi/playwright.config.ts
+++ b/tests/bidi/playwright.config.ts
@@ -81,7 +81,6 @@ for (const [key, channels] of Object.entries(browserToChannels)) {
channel,
video: 'off',
launchOptions: {
- channel: 'bidi-chrome-canary',
executablePath,
},
trace: trace ? 'on' : undefined,
diff --git a/tests/library/chromium/oopif.spec.ts b/tests/library/chromium/oopif.spec.ts
index 0143120629..bea16bdb75 100644
--- a/tests/library/chromium/oopif.spec.ts
+++ b/tests/library/chromium/oopif.spec.ts
@@ -25,14 +25,14 @@ it.use({
it('should report oopif frames', async function({ page, browser, server }) {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
});
it('should handle oopif detach', async function({ page, browser, server }) {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
const frame = page.frames()[1];
expect(await frame.evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
@@ -46,20 +46,20 @@ it('should handle oopif detach', async function({ page, browser, server }) {
it('should handle remote -> local -> remote transitions', async function({ page, browser, server }) {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
await Promise.all([
page.frames()[1].waitForNavigation(),
page.evaluate('goLocal()'),
]);
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.PREFIX + '/grid.html');
- expect(await countOOPIFs(browser)).toBe(0);
+ await assertOOPIFCount(browser, 0);
await Promise.all([
page.frames()[1].waitForNavigation(),
page.evaluate('goRemote()'),
]);
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
});
it('should get the proper viewport', async ({ page, browser, server }) => {
@@ -68,7 +68,7 @@ it('should get the proper viewport', async ({ page, browser, server }) => {
expect(page.viewportSize()).toEqual({ width: 1280, height: 720 });
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const oopif = page.frames()[1];
expect(await oopif.evaluate(() => screen.width)).toBe(1280);
expect(await oopif.evaluate(() => screen.height)).toBe(720);
@@ -86,7 +86,7 @@ it('should get the proper viewport', async ({ page, browser, server }) => {
it('should expose function', async ({ page, browser, server }) => {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const oopif = page.frames()[1];
await page.exposeFunction('mul', (a: number, b: number) => a * b);
const result = await oopif.evaluate(async function() {
@@ -98,7 +98,7 @@ it('should expose function', async ({ page, browser, server }) => {
it('should emulate media', async ({ page, browser, server }) => {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const oopif = page.frames()[1];
expect(await oopif.evaluate(() => matchMedia('(prefers-color-scheme: dark)').matches)).toBe(false);
await page.emulateMedia({ colorScheme: 'dark' });
@@ -108,7 +108,7 @@ it('should emulate media', async ({ page, browser, server }) => {
it('should emulate offline', async ({ page, browser, server }) => {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const oopif = page.frames()[1];
expect(await oopif.evaluate(() => navigator.onLine)).toBe(true);
await page.context().setOffline(true);
@@ -125,7 +125,7 @@ it('should support context options', async ({ browser, server, playwright }) =>
page.goto(server.PREFIX + '/dynamic-oopif.html'),
]);
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const oopif = page.frames()[1];
expect(await oopif.evaluate(() => 'ontouchstart' in window)).toBe(true);
@@ -145,7 +145,7 @@ it('should respect route', async ({ page, browser, server }) => {
});
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(intercepted).toBe(true);
});
@@ -153,14 +153,14 @@ it('should take screenshot', async ({ page, browser, server }) => {
await page.setViewportSize({ width: 500, height: 500 });
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(await page.screenshot()).toMatchSnapshot('screenshot-oopif.png');
});
it('should load oopif iframes with subresources and route', async function({ page, browser, server }) {
await page.route('**/*', route => route.continue());
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
});
it('should report main requests', async function({ page, browser, server }) {
@@ -192,7 +192,7 @@ it('should report main requests', async function({ page, browser, server }) {
const grandChild = child.childFrames()[0];
await grandChild.waitForLoadState('domcontentloaded');
- expect(await countOOPIFs(browser)).toBe(2);
+ await assertOOPIFCount(browser, 2);
expect(requestFrames[0]).toBe(main);
expect(finishedFrames[0]).toBe(main);
expect(requestFrames[1]).toBe(child);
@@ -205,7 +205,7 @@ it('should support exposeFunction', async function({ page, browser, server }) {
await page.context().exposeFunction('dec', (a: number) => a - 1);
await page.exposeFunction('inc', (a: number) => a + 1);
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
expect(await page.frames()[0].evaluate(() => (window as any)['inc'](3))).toBe(4);
expect(await page.frames()[1].evaluate(() => (window as any)['inc'](4))).toBe(5);
@@ -217,7 +217,7 @@ it('should support addInitScript', async function({ page, browser, server }) {
await page.context().addInitScript(() => (window as any)['bar'] = 17);
await page.addInitScript(() => (window as any)['foo'] = 42);
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
expect(await page.frames()[0].evaluate(() => (window as any)['foo'])).toBe(42);
expect(await page.frames()[1].evaluate(() => (window as any)['foo'])).toBe(42);
@@ -227,7 +227,7 @@ it('should support addInitScript', async function({ page, browser, server }) {
// @see https://github.com/microsoft/playwright/issues/1240
it('should click a button when it overlays oopif', async function({ page, browser, server }) {
await page.goto(server.PREFIX + '/button-overlay-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
await page.click('button');
expect(await page.evaluate(() => (window as any)['BUTTON_CLICKED'])).toBe(true);
});
@@ -248,7 +248,7 @@ it('should report google.com frame with headed', async ({ browserType, server })
return new Promise(x => frame.onload = x);
});
await page.waitForSelector('iframe[src="https://google.com/"]');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const urls = page.frames().map(frame => frame.url());
expect(urls).toEqual([
server.EMPTY_PAGE,
@@ -267,7 +267,7 @@ it('ElementHandle.boundingBox() should work', async function({ page, browser, se
});
await page.frames()[1].goto(page.frames()[1].url());
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const handle1 = await page.frames()[1].$('.box:nth-of-type(13)');
expect(await handle1!.boundingBox()).toEqual({ x: 100 + 42, y: 50 + 17, width: 50, height: 50 });
@@ -275,7 +275,7 @@ it('ElementHandle.boundingBox() should work', async function({ page, browser, se
page.frames()[1].waitForNavigation(),
page.evaluate('goLocal()'),
]);
- expect(await countOOPIFs(browser)).toBe(0);
+ await assertOOPIFCount(browser, 0);
const handle2 = await page.frames()[1].$('.box:nth-of-type(13)');
expect(await handle2!.boundingBox()).toEqual({ x: 100 + 42, y: 50 + 17, width: 50, height: 50 });
});
@@ -290,7 +290,7 @@ it('should click', async function({ page, browser, server }) {
});
await page.frames()[1].goto(page.frames()[1].url());
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
const handle1 = (await page.frames()[1].$('.box:nth-of-type(13)'))!;
await handle1.evaluate(div => div.addEventListener('click', () => (window as any)['_clicked'] = true, false));
await handle1.click();
@@ -300,7 +300,7 @@ it('should click', async function({ page, browser, server }) {
it('contentFrame should work', async ({ page, browser, server }) => {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
expect(page.frames().length).toBe(2);
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(await page.locator('iframe').contentFrame().locator('div').count()).toBe(200);
const oopif = await page.$('iframe');
const content = await oopif.contentFrame();
@@ -309,7 +309,7 @@ it('contentFrame should work', async ({ page, browser, server }) => {
it('should allow cdp sessions on oopifs', async function({ page, browser, server }) {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
expect(await page.frames()[1].evaluate(() => '' + location.href)).toBe(server.CROSS_PROCESS_PREFIX + '/grid.html');
@@ -326,7 +326,7 @@ it('should emit filechooser event for iframe', async ({ page, server, browser })
// Add listener before OOPIF is created.
const chooserPromise = page.waitForEvent('filechooser');
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
const frame = page.frames()[1];
await frame.setContent(``);
@@ -340,7 +340,7 @@ it('should emit filechooser event for iframe', async ({ page, server, browser })
it('should be able to click in iframe', async ({ page, server, browser }) => {
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/28023' });
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
expect(page.frames().length).toBe(2);
const frame = page.frames()[1];
await frame.setContent(``);
@@ -353,7 +353,7 @@ it('should be able to click in iframe', async ({ page, server, browser }) => {
it('should not throw on exposeFunction when oopif detaches', async ({ page, browser, server }) => {
await page.goto(server.PREFIX + '/dynamic-oopif.html');
- expect(await countOOPIFs(browser)).toBe(1);
+ await assertOOPIFCount(browser, 1);
await Promise.all([
page.exposeFunction('myFunc', () => 2022),
page.evaluate(() => document.querySelector('iframe')!.remove()),
@@ -370,6 +370,12 @@ it('should intercept response body from oopif', async function({ page, browser,
expect(await response.text()).toBeTruthy();
});
+async function assertOOPIFCount(browser: Browser, count: number) {
+ if (browser.browserType().name() !== 'chromium')
+ return;
+ expect(await countOOPIFs(browser)).toBe(count);
+}
+
async function countOOPIFs(browser: Browser) {
const browserSession = await browser.newBrowserCDPSession();
const oopifs = [];