From 3eab6b5381275be6e03f8b1cfac28b664e6ffd12 Mon Sep 17 00:00:00 2001 From: Alex Rudenko Date: Mon, 6 May 2024 17:19:23 +0200 Subject: [PATCH] refactor: simplify worlds handling (#12400) --- packages/puppeteer-core/src/cdp/Frame.ts | 40 +++++++------------ .../puppeteer-core/src/cdp/FrameManager.ts | 4 +- .../puppeteer-core/src/cdp/IsolatedWorld.ts | 3 -- 3 files changed, 15 insertions(+), 32 deletions(-) diff --git a/packages/puppeteer-core/src/cdp/Frame.ts b/packages/puppeteer-core/src/cdp/Frame.ts index c7c2885a659..14de35f963f 100644 --- a/packages/puppeteer-core/src/cdp/Frame.ts +++ b/packages/puppeteer-core/src/cdp/Frame.ts @@ -35,15 +35,17 @@ import type {CdpPage} from './Page.js'; export class CdpFrame extends Frame { #url = ''; #detached = false; - #client!: CDPSession; - worlds!: IsolatedWorldChart; + #client: CDPSession; _frameManager: FrameManager; - override _id: string; _loaderId = ''; _lifecycleEvents = new Set(); + + override _id: string; override _parentId?: string; + worlds: IsolatedWorldChart; + constructor( frameManager: FrameManager, frameId: string, @@ -56,10 +58,16 @@ export class CdpFrame extends Frame { this._id = frameId; this._parentId = parentFrameId; this.#detached = false; + this.#client = client; this._loaderId = ''; - - this.updateClient(client); + this.worlds = { + [MAIN_WORLD]: new IsolatedWorld(this, this._frameManager.timeoutSettings), + [PUPPETEER_WORLD]: new IsolatedWorld( + this, + this._frameManager.timeoutSettings + ), + }; this.on(FrameEvent.FrameSwappedByActivation, () => { // Emulate loading process for swapped frames. @@ -85,28 +93,8 @@ export class CdpFrame extends Frame { this._id = id; } - updateClient(client: CDPSession, keepWorlds = false): void { + updateClient(client: CDPSession): void { this.#client = client; - if (!keepWorlds) { - // Clear the current contexts on previous world instances. - if (this.worlds) { - this.worlds[MAIN_WORLD].clearContext(); - this.worlds[PUPPETEER_WORLD].clearContext(); - } - this.worlds = { - [MAIN_WORLD]: new IsolatedWorld( - this, - this._frameManager.timeoutSettings - ), - [PUPPETEER_WORLD]: new IsolatedWorld( - this, - this._frameManager.timeoutSettings - ), - }; - } else { - this.worlds[MAIN_WORLD].frameUpdated(); - this.worlds[PUPPETEER_WORLD].frameUpdated(); - } } override page(): CdpPage { diff --git a/packages/puppeteer-core/src/cdp/FrameManager.ts b/packages/puppeteer-core/src/cdp/FrameManager.ts index db1e11b938c..13822fc6aa3 100644 --- a/packages/puppeteer-core/src/cdp/FrameManager.ts +++ b/packages/puppeteer-core/src/cdp/FrameManager.ts @@ -134,10 +134,8 @@ export class FrameManager extends EventEmitter { this.#frameNavigatedReceived.add(this.#client._target()._targetId); this._frameTree.removeFrame(frame); frame.updateId(this.#client._target()._targetId); - frame.mainRealm().clearContext(); - frame.isolatedRealm().clearContext(); this._frameTree.addFrame(frame); - frame.updateClient(client, true); + frame.updateClient(client); } this.setupEventListeners(client); client.once(CDPSessionEvent.Disconnected, () => { diff --git a/packages/puppeteer-core/src/cdp/IsolatedWorld.ts b/packages/puppeteer-core/src/cdp/IsolatedWorld.ts index 06355867339..29ed52cdf47 100644 --- a/packages/puppeteer-core/src/cdp/IsolatedWorld.ts +++ b/packages/puppeteer-core/src/cdp/IsolatedWorld.ts @@ -54,15 +54,12 @@ export class IsolatedWorld extends Realm { ) { super(timeoutSettings); this.#frameOrWorker = frameOrWorker; - this.frameUpdated(); } get environment(): CdpFrame | CdpWebWorker { return this.#frameOrWorker; } - frameUpdated(): void {} - get client(): CDPSession { return this.#frameOrWorker.client; }