From 9428660efe8d0df0a1e0710cd115b9315ad28b97 Mon Sep 17 00:00:00 2001 From: Pavel Date: Tue, 22 Sep 2020 10:52:26 -0700 Subject: [PATCH] fix(close): fix the browser.close race --- src/client/browser.ts | 19 +++++++++++-------- test/browsertype-connect.spec.ts | 10 ++++++++++ 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/src/client/browser.ts b/src/client/browser.ts index 84c0865af95ad..804ee010f6e98 100644 --- a/src/client/browser.ts +++ b/src/client/browser.ts @@ -26,7 +26,6 @@ import { headersObjectToArray } from '../utils/utils'; export class Browser extends ChannelOwner { readonly _contexts = new Set(); private _isConnected = true; - private _isClosedOrClosing = false; private _closedPromise: Promise; _isRemote = false; @@ -83,18 +82,22 @@ export class Browser extends ChannelOwner { - return this._wrapApiCall('browser.close', async () => { - if (!this._isClosedOrClosing) { - this._isClosedOrClosing = true; + try { + await this._wrapApiCall('browser.close', async () => { await this._channel.close(); - } - await this._closedPromise; - }); + await this._closedPromise; + }); + } catch (e) { + if (e.message === 'browser.close: Browser has been closed') + return; + if (e.message === 'browser.close: Target browser or context has been closed') + return; + throw e; + } } _didClose() { this._isConnected = false; this.emit(Events.Browser.Disconnected); - this._isClosedOrClosing = true; } } diff --git a/test/browsertype-connect.spec.ts b/test/browsertype-connect.spec.ts index 03fcdb9085d49..85bb13186af5a 100644 --- a/test/browsertype-connect.spec.ts +++ b/test/browsertype-connect.spec.ts @@ -202,4 +202,14 @@ describe('connect', suite => { await browser1.close(); }); + + it('should not throw on close after disconnect', async ({browserType, remoteServer, server}) => { + const remote = await browserType.connect({ wsEndpoint: remoteServer.wsEndpoint() }); + await remote.newPage(); + await Promise.all([ + new Promise(f => remote.on('disconnected', f)), + remoteServer.close() + ]); + await remote.close(); + }); });