diff --git a/src/rpc/channels.ts b/src/rpc/channels.ts index 28765b291c..6fc4d7917f 100644 --- a/src/rpc/channels.ts +++ b/src/rpc/channels.ts @@ -1617,10 +1617,9 @@ export type ElectronLaunchResult = { }; // ----------- ElectronApplication ----------- -export type ElectronApplicationInitializer = { - context: BrowserContextChannel, -}; +export type ElectronApplicationInitializer = {}; export interface ElectronApplicationChannel extends Channel { + on(event: 'context', callback: (params: ElectronApplicationContextEvent) => void): this; on(event: 'close', callback: (params: ElectronApplicationCloseEvent) => void): this; on(event: 'window', callback: (params: ElectronApplicationWindowEvent) => void): this; newBrowserWindow(params: ElectronApplicationNewBrowserWindowParams): Promise; @@ -1628,6 +1627,9 @@ export interface ElectronApplicationChannel extends Channel { evaluateExpressionHandle(params: ElectronApplicationEvaluateExpressionHandleParams): Promise; close(params?: ElectronApplicationCloseParams): Promise; } +export type ElectronApplicationContextEvent = { + context: BrowserContextChannel, +}; export type ElectronApplicationCloseEvent = {}; export type ElectronApplicationWindowEvent = { page: PageChannel, diff --git a/src/rpc/client/channelOwner.ts b/src/rpc/client/channelOwner.ts index 411e13885a..90b251c0f3 100644 --- a/src/rpc/client/channelOwner.ts +++ b/src/rpc/client/channelOwner.ts @@ -15,10 +15,10 @@ */ import { EventEmitter } from 'events'; -import { Channel } from '../channels'; -import { Connection } from './connection'; +import type { Channel } from '../channels'; +import type { Connection } from './connection'; import { assert } from '../../helper'; -import { LoggerSink } from '../../loggerSink'; +import type { LoggerSink } from '../../loggerSink'; import { DebugLoggerSink } from '../../logger'; export abstract class ChannelOwner extends EventEmitter { @@ -37,11 +37,11 @@ export abstract class ChannelOwner } export class ElectronApplication extends ChannelOwner { - private _context: BrowserContext; + private _context?: BrowserContext; private _windows = new Set(); private _timeoutSettings = new TimeoutSettings(); @@ -60,8 +60,8 @@ export class ElectronApplication extends ChannelOwner this._context = BrowserContext.from(context)); this._channel.on('window', ({ page, browserWindow }) => { const window = Page.from(page); (window as any).browserWindow = JSHandle.from(browserWindow); @@ -71,6 +71,7 @@ export class ElectronApplication extends ChannelOwner { this.emit(ElectronEvents.ElectronApplication.Close); + this._dispose(); }); } @@ -90,7 +91,7 @@ export class ElectronApplication extends ChannelOwner implements ElectronApplicationChannel { constructor(scope: DispatcherScope, electronApplication: ElectronApplication) { - super(scope, electronApplication, 'ElectronApplication', { - context: new BrowserContextDispatcher(scope, electronApplication.context() as BrowserContextBase), + super(scope, electronApplication, 'ElectronApplication', {}, true); + this._dispatchEvent('context', { context: new BrowserContextDispatcher(this._scope, electronApplication.context() as BrowserContextBase) }); + electronApplication.on(ElectronEvents.ElectronApplication.Close, () => { + this._dispatchEvent('close'); + this._dispose(); }); - - electronApplication.on(ElectronEvents.ElectronApplication.Close, () => this._dispatchEvent('close')); electronApplication.on(ElectronEvents.ElectronApplication.Window, (page: ElectronPage) => { this._dispatchEvent('window', { page: lookupDispatcher(page),