diff --git a/packages/playwright-core/src/server/chromium/crPage.ts b/packages/playwright-core/src/server/chromium/crPage.ts index f41cb51959..68171fbfb8 100644 --- a/packages/playwright-core/src/server/chromium/crPage.ts +++ b/packages/playwright-core/src/server/chromium/crPage.ts @@ -748,6 +748,9 @@ class FrameSession { session._sendMayFail('Runtime.enable'); session._sendMayFail('Network.enable'); session._sendMayFail('Runtime.runIfWaitingForDebugger'); + session._sendMayFail('Target.setAutoAttach', { autoAttach: true, waitForDebuggerOnStart: true, flatten: true }); + session.on('Target.attachedToTarget', event => this._onAttachedToTarget(event)); + session.on('Target.detachedFromTarget', event => this._onDetachedFromTarget(event)); session.on('Runtime.consoleAPICalled', event => { const args = event.args.map(o => worker._existingExecutionContext!.createHandle(o)); this._page._addConsoleMessage(event.type, args, toConsoleMessageLocation(event.stackTrace)); @@ -763,6 +766,7 @@ class FrameSession { if (workerSession) { workerSession.dispose(); this._page._removeWorker(event.sessionId); + return; } // ... or an oopif. diff --git a/tests/page/workers.spec.ts b/tests/page/workers.spec.ts index 1222340663..e3854ffca8 100644 --- a/tests/page/workers.spec.ts +++ b/tests/page/workers.spec.ts @@ -16,6 +16,7 @@ */ import { test as it, expect } from './pageTest'; +import type { Worker as PwWorker } from '@playwright/test'; import { attachFrame } from '../config/utils'; import type { ConsoleMessage } from 'playwright-core'; import fs from 'fs'; @@ -192,3 +193,32 @@ it('should dispatch console messages when page has workers', async function({ pa ]); expect(message.text()).toBe('foo'); }); + +it('should report and intercept network from nested worker', async function({ page, server, browserName }) { + it.fixme(browserName === 'webkit', 'https://github.com/microsoft/playwright/issues/27376'); + await page.route('**/simple.json', async route => { + const json = { foo: 'not bar' }; + await route.fulfill({ json }); + }); + + await page.goto(server.EMPTY_PAGE); + const url = server.PREFIX + '/simple.json'; + const workers: PwWorker[] = []; + const messages: string[] = []; + + page.on('worker', worker => workers.push(worker)); + page.on('console', msg => messages.push(msg.text())); + + await page.evaluate(url => new Worker(URL.createObjectURL(new Blob([` + fetch("${url}").then(response => response.text()).then(t => console.log(t.trim())); + `], { type: 'application/javascript' }))), url); + await expect.poll(() => workers.length).toBe(1); + + await workers[0].evaluate(url => new Worker(URL.createObjectURL(new Blob([` + fetch("${url}").then(response => response.text()).then(t => console.log(t.trim())); + `], { type: 'application/javascript' }))), url); + + await expect.poll(() => workers.length).toBe(2); + + await expect.poll(() => messages).toEqual(['{"foo":"not bar"}', '{"foo":"not bar"}']); +});