From aa2aef146d0e19efcb05fe75e7f270c1cf63765c Mon Sep 17 00:00:00 2001 From: Simon Knott Date: Tue, 4 Feb 2025 11:27:16 +0100 Subject: [PATCH] implement first pass --- .../src/client/browserContext.ts | 4 +--- .../playwright-core/src/client/mockingProxy.ts | 18 +++++++++++++----- packages/playwright-core/src/client/network.ts | 6 +++--- packages/playwright-core/src/client/page.ts | 2 +- .../playwright-core/src/client/playwright.ts | 5 +++-- .../dispatchers/mockingProxyDispatcher.ts | 6 +++++- .../playwright-core/src/server/mockingProxy.ts | 8 ++++++-- 7 files changed, 32 insertions(+), 17 deletions(-) diff --git a/packages/playwright-core/src/client/browserContext.ts b/packages/playwright-core/src/client/browserContext.ts index 150e9581d6..71a5aca8ec 100644 --- a/packages/playwright-core/src/client/browserContext.ts +++ b/packages/playwright-core/src/client/browserContext.ts @@ -70,7 +70,6 @@ export class BrowserContext extends ChannelOwner _closeWasCalled = false; private _closeReason: string | undefined; private _harRouters: HarRouter[] = []; - private _registeredListeners: RegisteredListener[] = []; _mockingProxy?: MockingProxy; static from(context: channels.BrowserContextChannel): BrowserContext { @@ -96,7 +95,7 @@ export class BrowserContext extends ChannelOwner this._channel.on('page', ({ page }) => this._onPage(Page.from(page))); this._channel.on('route', params => { const route = network.Route.from(params.route); - route._context = this.request; + route._apiRequestContext = this.request; this._onRoute(route); }); this._channel.on('webSocketRoute', ({ webSocketRoute }) => this._onWebSocketRoute(network.WebSocketRoute.from(webSocketRoute))); @@ -467,7 +466,6 @@ export class BrowserContext extends ChannelOwner this._disposeHarRouters(); this.tracing._resetStackCounter(); this.emit(Events.BrowserContext.Close, this); - eventsHelper.removeEventListeners(this._registeredListeners); } async [Symbol.asyncDispose]() { diff --git a/packages/playwright-core/src/client/mockingProxy.ts b/packages/playwright-core/src/client/mockingProxy.ts index 5bbc92d812..898c620112 100644 --- a/packages/playwright-core/src/client/mockingProxy.ts +++ b/packages/playwright-core/src/client/mockingProxy.ts @@ -19,6 +19,7 @@ import { ChannelOwner } from './channelOwner'; import { APIRequestContext } from './fetch'; import { assert } from '../utils'; import type { Page } from './page'; +import { Events } from './events'; export class MockingProxy extends ChannelOwner { private _pages = new Map(); @@ -29,8 +30,8 @@ export class MockingProxy extends ChannelOwner { const requestContext = APIRequestContext.from(initializer.requestContext); this._channel.on('route', async (params: channels.MockingProxyRouteEvent) => { const route = network.Route.from(params.route); - route._context = requestContext; - const page = route.request()._safePage()!; + route._apiRequestContext = requestContext; + const page = route.request()._pageForMockingProxy!; await page._onRoute(route); }); @@ -44,7 +45,7 @@ export class MockingProxy extends ChannelOwner { this._channel.on('requestFailed', async (params: channels.MockingProxyRequestFailedEvent) => { const request = network.Request.from(params.request); - const page = request._safePage()!; + const page = request._pageForMockingProxy!; page.context()._onRequestFailed(request, params.responseEndTiming, params.failureText, page); }); @@ -52,20 +53,27 @@ export class MockingProxy extends ChannelOwner { const { responseEndTiming } = params; const request = network.Request.from(params.request); const response = network.Response.fromNullable(params.response); - const page = request._safePage()!; + const page = request._pageForMockingProxy!; page.context()._onRequestFinished(request, response, page, responseEndTiming); }); this._channel.on('response', async (params: channels.MockingProxyResponseEvent) => { const response = network.Response.from(params.response); - const page = response.request()._safePage()!; + const page = response.request()._pageForMockingProxy!; page.context()._onResponse(response, page); }); } + static from(channel: channels.MockingProxyChannel): MockingProxy { + return (channel as any)._object; + } + async instrumentPage(page: Page) { const correlation = page._guid.split('@')[1]; this._pages.set(correlation, page); + page.on(Events.Page.Close, () => { + this._pages.delete(correlation); + }); const proxyUrl = `http://localhost:${this._initializer.port}/pw_meta:${correlation}/`; await page.setExtraHTTPHeaders({ 'x-playwright-proxy': encodeURIComponent(proxyUrl) diff --git a/packages/playwright-core/src/client/network.ts b/packages/playwright-core/src/client/network.ts index cac330e879..c34ad5e564 100644 --- a/packages/playwright-core/src/client/network.ts +++ b/packages/playwright-core/src/client/network.ts @@ -219,7 +219,7 @@ export class Request extends ChannelOwner implements ap } _safePage(): Page | null { - return this._pageForMockingProxy ?? Frame.fromNullable(this._initializer.frame)?._page ?? null; + return Frame.fromNullable(this._initializer.frame)?._page ?? null; } serviceWorker(): Worker | null { @@ -294,7 +294,7 @@ export class Request extends ChannelOwner implements ap export class Route extends ChannelOwner implements api.Route { private _handlingPromise: ManualPromise | null = null; - _context!: APIRequestContext; + _apiRequestContext!: APIRequestContext; _didThrow: boolean = false; static from(route: channels.RouteChannel): Route { @@ -342,7 +342,7 @@ export class Route extends ChannelOwner implements api.Ro async fetch(options: FallbackOverrides & { maxRedirects?: number, maxRetries?: number, timeout?: number } = {}): Promise { return await this._wrapApiCall(async () => { - return await this._context._innerFetch({ request: this.request(), data: options.postData, ...options }); + return await this._apiRequestContext._innerFetch({ request: this.request(), data: options.postData, ...options }); }); } diff --git a/packages/playwright-core/src/client/page.ts b/packages/playwright-core/src/client/page.ts index 4f00e80664..466abcf595 100644 --- a/packages/playwright-core/src/client/page.ts +++ b/packages/playwright-core/src/client/page.ts @@ -140,7 +140,7 @@ export class Page extends ChannelOwner implements api.Page this._channel.on('locatorHandlerTriggered', ({ uid }) => this._onLocatorHandlerTriggered(uid)); this._channel.on('route', params => { const route = Route.from(params.route); - route._context = this.context().request; + route._apiRequestContext = this.context().request; this._onRoute(route); }); this._channel.on('webSocketRoute', ({ webSocketRoute }) => this._onWebSocketRoute(WebSocketRoute.from(webSocketRoute))); diff --git a/packages/playwright-core/src/client/playwright.ts b/packages/playwright-core/src/client/playwright.ts index f3124fb385..c3eb5bfa27 100644 --- a/packages/playwright-core/src/client/playwright.ts +++ b/packages/playwright-core/src/client/playwright.ts @@ -20,8 +20,9 @@ import { Android } from './android'; import { BrowserType } from './browserType'; import { ChannelOwner } from './channelOwner'; import { Electron } from './electron'; -import { APIRequest, type NewContextOptions } from './fetch'; +import { APIRequest } from './fetch'; import { Selectors, SelectorsOwner } from './selectors'; +import { MockingProxy } from './mockingProxy'; export class Playwright extends ChannelOwner { readonly _android: Android; @@ -77,6 +78,6 @@ export class Playwright extends ChannelOwner { async _startMockingProxy() { const requestContext = await this.request._newContext(undefined, this._connection.localUtils()._channel); const { mockingProxy } = await this._connection.localUtils()._channel.newMockingProxy({ requestContext: requestContext._channel }); - return (mockingProxy as any)._object; + return MockingProxy.from(mockingProxy); } } diff --git a/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts b/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts index 4338f95095..eece7884de 100644 --- a/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/mockingProxyDispatcher.ts @@ -30,7 +30,7 @@ export class MockingProxyDispatcher extends Dispatcher