diff --git a/packages/playwright-core/src/client/network.ts b/packages/playwright-core/src/client/network.ts index a0b4e8df4e..3c372b40f5 100644 --- a/packages/playwright-core/src/client/network.ts +++ b/packages/playwright-core/src/client/network.ts @@ -35,6 +35,7 @@ import { APIResponse } from './fetch'; import type { Serializable } from '../../types/structs'; import type { BrowserContext } from './browserContext'; import { HarRouter } from './harRouter'; +import { kBrowserOrContextClosedError } from '../common/errors'; export type NetworkCookie = { name: string, @@ -271,6 +272,10 @@ export class Request extends ChannelOwner implements ap _fallbackOverridesForContinue() { return this._fallbackOverrides; } + + _targetClosedPromise(): Promise { + return this.serviceWorker()?._closedPromise || this.frame()._page?._closedOrCrashedPromise || new Promise(() => {}); + } } export class Route extends ChannelOwner implements api.Route { @@ -294,7 +299,7 @@ export class Route extends ChannelOwner implements api.Ro // does not have a Page initialized just yet. return Promise.race([ promise, - this.request().serviceWorker()?._closedPromise || this.request().frame()._page?._closedOrCrashedPromise || Promise.resolve(), + this.request()._targetClosedPromise(), ]); } @@ -520,7 +525,12 @@ export class Response extends ChannelOwner implements } async finished(): Promise { - return this._finishedPromise.then(() => null); + return Promise.race([ + this._finishedPromise.then(() => null), + this.request()._targetClosedPromise().then(() => { + throw new Error(kBrowserOrContextClosedError); + }), + ]); } async body(): Promise { diff --git a/tests/page/page-network-response.spec.ts b/tests/page/page-network-response.spec.ts index e666ff04fb..449ebbb83c 100644 --- a/tests/page/page-network-response.spec.ts +++ b/tests/page/page-network-response.spec.ts @@ -109,7 +109,6 @@ it('should wait until response completes', async ({ page, server }) => { }); it('should reject response.finished if page closes', async ({ page, server }) => { - it.fixme(); await page.goto(server.EMPTY_PAGE); server.setRoute('/get', (req, res) => { // In Firefox, |fetch| will be hanging until it receives |Content-Type| header @@ -130,7 +129,6 @@ it('should reject response.finished if page closes', async ({ page, server }) => }); it('should reject response.finished if context closes', async ({ page, server }) => { - it.fixme(); await page.goto(server.EMPTY_PAGE); server.setRoute('/get', (req, res) => { // In Firefox, |fetch| will be hanging until it receives |Content-Type| header