From 9e09bd369d402f7073e1f091d5c914d0b68d6231 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Tue, 2 Feb 2021 10:21:42 -0800 Subject: [PATCH] fix(oopifs): ignore target closure when broadcasting across oopifs (#5246) --- src/server/chromium/crPage.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/server/chromium/crPage.ts b/src/server/chromium/crPage.ts index 5aa3892b01..eebdbdb4a6 100644 --- a/src/server/chromium/crPage.ts +++ b/src/server/chromium/crPage.ts @@ -93,7 +93,17 @@ export class CRPage implements PageDelegate { } private async _forAllFrameSessions(cb: (frame: FrameSession) => Promise) { - await Promise.all(Array.from(this._sessions.values()).map(frame => cb(frame))); + const frameSessions = Array.from(this._sessions.values()); + await Promise.all(frameSessions.map(frameSession => { + if (frameSession._isMainFrame()) + return cb(frameSession); + return cb(frameSession).catch(e => { + // Broadcasting a message to the closed iframe shoule be a noop. + if (e.message && (e.message.includes('Target closed.') || e.message.includes('Session closed.'))) + return; + throw e; + }); + })); } private _sessionForFrame(frame: frames.Frame): FrameSession { @@ -348,7 +358,7 @@ class FrameSession { }); } - private _isMainFrame(): boolean { + _isMainFrame(): boolean { return this._targetId === this._crPage._targetId; }