From 703de7a9523b8fe0f4d16b73da0328bc40d6fd98 Mon Sep 17 00:00:00 2001 From: Nikolay Vitkov Date: Wed, 28 Jun 2023 14:03:26 +0200 Subject: [PATCH] chore: remove Request when completed --- .../src/common/bidi/NetworkManager.ts | 47 ++++++++++++++----- .../puppeteer-core/src/common/bidi/Page.ts | 1 + 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/puppeteer-core/src/common/bidi/NetworkManager.ts b/packages/puppeteer-core/src/common/bidi/NetworkManager.ts index 8bc7215e84e2d..3c15d06e48b83 100644 --- a/packages/puppeteer-core/src/common/bidi/NetworkManager.ts +++ b/packages/puppeteer-core/src/common/bidi/NetworkManager.ts @@ -20,6 +20,7 @@ import {EventEmitter, Handler} from '../EventEmitter.js'; import {NetworkManagerEmittedEvents} from '../NetworkManager.js'; import {Connection} from './Connection.js'; +import {Frame} from './Frame.js'; import {HTTPRequest} from './HTTPRequest.js'; import {HTTPResponse} from './HTTPResponse.js'; import {Page} from './Page.js'; @@ -74,18 +75,20 @@ export class NetworkManager extends EventEmitter { #onResponseCompleted(event: Bidi.Network.ResponseCompletedParams): void { const request = this.#requestMap.get(event.request.request); - if (request) { - const response = new HTTPResponse(request, event); - request._response = response; - if (event.navigation) { - this.#navigationMap.set(event.navigation, response); - } - if (response.fromCache()) { - this.emit(NetworkManagerEmittedEvents.RequestServedFromCache, request); - } - this.emit(NetworkManagerEmittedEvents.Response, response); - this.emit(NetworkManagerEmittedEvents.RequestFinished, request); + if (!request) { + return; + } + const response = new HTTPResponse(request, event); + request._response = response; + if (event.navigation) { + this.#navigationMap.set(event.navigation, response); } + if (response.fromCache()) { + this.emit(NetworkManagerEmittedEvents.RequestServedFromCache, request); + } + this.emit(NetworkManagerEmittedEvents.Response, response); + this.emit(NetworkManagerEmittedEvents.RequestFinished, request); + this.#requestMap.delete(event.request.request); } #onFetchError(event: Bidi.Network.FetchErrorParams) { @@ -95,10 +98,16 @@ export class NetworkManager extends EventEmitter { } request._failureText = event.errorText; this.emit(NetworkManagerEmittedEvents.RequestFailed, request); + this.#requestMap.delete(event.request.request); } getNavigationResponse(navigationId: string | null): HTTPResponse | null { - return this.#navigationMap.get(navigationId ?? '') ?? null; + if (!navigationId) { + return null; + } + const response = this.#navigationMap.get(navigationId); + + return response ?? null; } inFlightRequestsCount(): number { @@ -112,6 +121,20 @@ export class NetworkManager extends EventEmitter { return inFlightRequestCounter; } + clearMapAfterFrameDispose(frame: Frame): void { + for (const [id, request] of this.#requestMap.entries()) { + if (request.frame() === frame) { + this.#requestMap.delete(id); + } + } + + for (const [id, response] of this.#navigationMap.entries()) { + if (response.frame() === frame) { + this.#requestMap.delete(id); + } + } + } + dispose(): void { this.removeAllListeners(); this.#requestMap.clear(); diff --git a/packages/puppeteer-core/src/common/bidi/Page.ts b/packages/puppeteer-core/src/common/bidi/Page.ts index 1468c22b72f5c..057e4e6f6bdc0 100644 --- a/packages/puppeteer-core/src/common/bidi/Page.ts +++ b/packages/puppeteer-core/src/common/bidi/Page.ts @@ -269,6 +269,7 @@ export class Page extends PageBase { this.#removeFramesRecursively(child); } frame.dispose(); + this.#networkManager.clearMapAfterFrameDispose(frame); this.#frameTree.removeFrame(frame); this.emit(PageEmittedEvents.FrameDetached, frame); }