diff --git a/src/rpc/channels.ts b/src/rpc/channels.ts index 4a136428a3..d229ddb33a 100644 --- a/src/rpc/channels.ts +++ b/src/rpc/channels.ts @@ -274,7 +274,10 @@ export interface BrowserServerChannel extends Channel { close(params?: BrowserServerCloseParams): Promise; kill(params?: BrowserServerKillParams): Promise; } -export type BrowserServerCloseEvent = {}; +export type BrowserServerCloseEvent = { + exitCode?: number, + signal?: string, +}; export type BrowserServerCloseParams = {}; export type BrowserServerCloseResult = void; export type BrowserServerKillParams = {}; diff --git a/src/rpc/client/browserServer.ts b/src/rpc/client/browserServer.ts index d92899ee5d..726ede933a 100644 --- a/src/rpc/client/browserServer.ts +++ b/src/rpc/client/browserServer.ts @@ -25,8 +25,11 @@ export class BrowserServer extends ChannelOwner this.emit(Events.BrowserServer.Close)); + super(parent, type, guid, initializer, true); + this._channel.on('close', ({ exitCode, signal }) => { + this.emit(Events.BrowserServer.Close, exitCode === undefined ? null : exitCode, signal === undefined ? null : signal); + this._dispose(); + }); } process(): ChildProcess { diff --git a/src/rpc/client/validator.ts b/src/rpc/client/validator.ts index 557fba3472..d7c96fb275 100644 --- a/src/rpc/client/validator.ts +++ b/src/rpc/client/validator.ts @@ -242,7 +242,10 @@ scheme.BrowserServerInitializer = tObject({ wsEndpoint: tString, pid: tNumber, }); -scheme.BrowserServerCloseEvent = tObject({}); +scheme.BrowserServerCloseEvent = tObject({ + exitCode: tOptional(tNumber), + signal: tOptional(tString), +}); scheme.BrowserServerCloseParams = tOptional(tObject({})); scheme.BrowserServerCloseResult = tUndefined; scheme.BrowserServerKillParams = tOptional(tObject({})); diff --git a/src/rpc/protocol.yml b/src/rpc/protocol.yml index 51e2ce6e59..1646ebc174 100644 --- a/src/rpc/protocol.yml +++ b/src/rpc/protocol.yml @@ -354,7 +354,9 @@ BrowserServer: events: close: - + parameters: + exitCode: number? + signal: string? Browser: diff --git a/src/rpc/server/browserServerDispatcher.ts b/src/rpc/server/browserServerDispatcher.ts index f6ca580cf9..e01717d526 100644 --- a/src/rpc/server/browserServerDispatcher.ts +++ b/src/rpc/server/browserServerDispatcher.ts @@ -24,8 +24,14 @@ export class BrowserServerDispatcher extends Dispatcher { + this._dispatchEvent('close', { + exitCode: exitCode === null ? undefined : exitCode, + signal: signal === null ? undefined : signal, + }); + this._dispose(); }); - browserServer.on(Events.BrowserServer.Close, () => this._dispatchEvent('close')); } async close(): Promise { diff --git a/test/defaultbrowsercontext.jest.js b/test/defaultbrowsercontext.jest.js index 9ec51573f8..03c21166f3 100644 --- a/test/defaultbrowsercontext.jest.js +++ b/test/defaultbrowsercontext.jest.js @@ -327,8 +327,8 @@ describe('launchPersistentContext()', function() { const error = await browserType.launchPersistentContext(userDataDir, options).catch(e => e); expect(error.message).toContain('can not specify page'); }); - it('should have passed URL when launching with ignoreDefaultArgs: true', async ({browserType, defaultBrowserOptions, server, userDataDir}) => { - const args = require('..')[browserType.name()]._defaultArgs(defaultBrowserOptions, 'persistent', userDataDir, 0).filter(a => a !== 'about:blank'); + it.skip(USES_HOOKS)('should have passed URL when launching with ignoreDefaultArgs: true', async ({browserType, defaultBrowserOptions, server, userDataDir, toImpl}) => { + const args = toImpl(browserType)._defaultArgs(defaultBrowserOptions, 'persistent', userDataDir, 0).filter(a => a !== 'about:blank'); const options = { ...defaultBrowserOptions, args: [...args, server.EMPTY_PAGE], diff --git a/test/launcher.jest.js b/test/launcher.jest.js index fbacd0f8c5..18fd8545c4 100644 --- a/test/launcher.jest.js +++ b/test/launcher.jest.js @@ -274,10 +274,12 @@ describe('browserType.launchServer', function() { }); it('should fire close event', async ({browserType, defaultBrowserOptions}) => { const browserServer = await browserType.launchServer(defaultBrowserOptions); - await Promise.all([ - new Promise(f => browserServer.on('close', f)), + const [result] = await Promise.all([ + new Promise(f => browserServer.on('close', (exitCode, signal) => f({ exitCode, signal }))), browserServer.close(), ]); + expect(result.exitCode).toBe(0); + expect(result.signal).toBe(null); }); });