chore: instrument nested workers (#27400)

Ref: https://github.com/microsoft/playwright/issues/27376
This commit is contained in:
Pavel Feldman 2023-10-03 13:08:15 -07:00 committed by GitHub
parent ae08d03d75
commit 47b0255b89
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 0 deletions

View file

@ -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.

View file

@ -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"}']);
});