From d9890f1102d91790856bbc57d3bd3dd5eecff055 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Fri, 24 Jul 2020 16:22:20 -0700 Subject: [PATCH] feat(rpc): make ElectronApplication a scope (#3159) --- src/rpc/channels.ts | 8 +++++--- src/rpc/client/channelOwner.ts | 10 +++++----- src/rpc/client/connection.ts | 4 ++-- src/rpc/client/electron.ts | 9 +++++---- src/rpc/protocol.yml | 8 +++++--- src/rpc/server/electronDispatcher.ts | 9 +++++---- 6 files changed, 27 insertions(+), 21 deletions(-) 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),