fix(close): fix the browser.close race (#3956)
This commit is contained in:
parent
c4a2732515
commit
0e76316f82
|
|
@ -26,7 +26,6 @@ import { headersObjectToArray } from '../utils/utils';
|
||||||
export class Browser extends ChannelOwner<channels.BrowserChannel, channels.BrowserInitializer> {
|
export class Browser extends ChannelOwner<channels.BrowserChannel, channels.BrowserInitializer> {
|
||||||
readonly _contexts = new Set<BrowserContext>();
|
readonly _contexts = new Set<BrowserContext>();
|
||||||
private _isConnected = true;
|
private _isConnected = true;
|
||||||
private _isClosedOrClosing = false;
|
|
||||||
private _closedPromise: Promise<void>;
|
private _closedPromise: Promise<void>;
|
||||||
_isRemote = false;
|
_isRemote = false;
|
||||||
|
|
||||||
|
|
@ -83,18 +82,22 @@ export class Browser extends ChannelOwner<channels.BrowserChannel, channels.Brow
|
||||||
}
|
}
|
||||||
|
|
||||||
async close(): Promise<void> {
|
async close(): Promise<void> {
|
||||||
return this._wrapApiCall('browser.close', async () => {
|
try {
|
||||||
if (!this._isClosedOrClosing) {
|
await this._wrapApiCall('browser.close', async () => {
|
||||||
this._isClosedOrClosing = true;
|
|
||||||
await this._channel.close();
|
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() {
|
_didClose() {
|
||||||
this._isConnected = false;
|
this._isConnected = false;
|
||||||
this.emit(Events.Browser.Disconnected);
|
this.emit(Events.Browser.Disconnected);
|
||||||
this._isClosedOrClosing = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -202,4 +202,14 @@ describe('connect', suite => {
|
||||||
|
|
||||||
await browser1.close();
|
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();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue