From ce21019c7d2640877ded25a53c5d51231829d12c Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Wed, 11 Dec 2019 13:06:11 -0700 Subject: [PATCH] fix(webkit): make sure each message is dispatch in separate task (#212) --- src/webkit/Connection.ts | 12 ++++++++++-- src/webkit/Target.ts | 2 +- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/webkit/Connection.ts b/src/webkit/Connection.ts index d3a93c88d0..ef0eafc5bf 100644 --- a/src/webkit/Connection.ts +++ b/src/webkit/Connection.ts @@ -36,6 +36,7 @@ export class Connection extends EventEmitter { private readonly _sessions = new Map(); private _incomingMessageQueue: string[] = []; private _dispatchTimerId?: NodeJS.Timer; + private _sameDispatchTask: boolean = false; _closed = false; @@ -71,10 +72,15 @@ export class Connection extends EventEmitter { } private _onMessage(message: string) { - if (this._incomingMessageQueue.length || this._delay) + if (this._sameDispatchTask || this._incomingMessageQueue.length || this._delay) this._enqueueMessage(message); - else + else { + this._sameDispatchTask = true; + // This is for the case when several messages come in a batch and read + // in a loop by transport ending up in the same task. + Promise.resolve().then(() => this._sameDispatchTask = false); this._dispatchMessage(message); + } } private _enqueueMessage(message: string) { @@ -100,6 +106,8 @@ export class Connection extends EventEmitter { } private _dispatchOneMessageFromQueue() { + if (this._closed) + return; const message = this._incomingMessageQueue.shift(); try { this._dispatchMessage(message); diff --git a/src/webkit/Target.ts b/src/webkit/Target.ts index 338cf94caf..31e577ccb5 100644 --- a/src/webkit/Target.ts +++ b/src/webkit/Target.ts @@ -57,7 +57,7 @@ export class Target { await (this._page._delegate as FrameManager)._initializeSession(session).catch(e => { // Swallow initialization errors due to newer target swap in, // since we will reinitialize again. - if (!isSwappedOutError(e)) + if (this._page) throw e; }); }