diff --git a/packages/playwright-core/src/server/browserContext.ts b/packages/playwright-core/src/server/browserContext.ts index 707025ab3c..550a0cfb07 100644 --- a/packages/playwright-core/src/server/browserContext.ts +++ b/packages/playwright-core/src/server/browserContext.ts @@ -75,6 +75,7 @@ export abstract class BrowserContext extends SdkObject { readonly _tempDirs: string[] = []; private _settingStorageState = false; readonly initScripts: string[] = []; + private _routesInFlight = new Set(); constructor(browser: Browser, options: channels.BrowserNewContextParams, browserContextId: string | undefined) { super(browser, 'browser-context'); @@ -458,6 +459,19 @@ export abstract class BrowserContext extends SdkObject { const recorder = this._harRecorders.get(harId || '')!; return recorder.export(); } + + addRouteInFlight(route: network.Route) { + this._routesInFlight.add(route); + } + + removeRouteInFlight(route: network.Route) { + this._routesInFlight.delete(route); + } + + async _cancelAllRoutesInFlight() { + await Promise.all([...this._routesInFlight].map(r => r.abort())).catch(() => {}); + this._routesInFlight.clear(); + } } export function assertBrowserContextIsNotOwned(context: BrowserContext) { diff --git a/packages/playwright-core/src/server/network.ts b/packages/playwright-core/src/server/network.ts index aeb487d56c..d23fad9a7b 100644 --- a/packages/playwright-core/src/server/network.ts +++ b/packages/playwright-core/src/server/network.ts @@ -232,6 +232,7 @@ export class Route extends SdkObject { super(request._frame || request._context , 'route'); this._request = request; this._delegate = delegate; + this._request._context.addRouteInFlight(this); } request(): Request { @@ -241,6 +242,7 @@ export class Route extends SdkObject { async abort(errorCode: string = 'failed') { this._startHandling(); await this._delegate.abort(errorCode); + this._endHandling(); } async redirectNavigationRequest(url: string) { @@ -272,6 +274,7 @@ export class Route extends SdkObject { body, isBase64, }); + this._endHandling(); } // See https://github.com/microsoft/playwright/issues/12929 @@ -301,12 +304,17 @@ export class Route extends SdkObject { throw new Error('New URL must have same protocol as overridden URL'); } await this._delegate.continue(this._request, overrides); + this._endHandling(); } private _startHandling() { assert(!this._handled, 'Route is already handled!'); this._handled = true; } + + private _endHandling() { + this._request._context.removeRouteInFlight(this); + } } export type RouteHandler = (route: Route, request: Request) => void;