From f22dcae3b74b41b059677ff75318e1cdc28f8ed0 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Mon, 15 Jun 2020 17:56:18 +0200 Subject: [PATCH] ipc - have an explicit method to mark a window ready --- src/vs/code/electron-main/window.ts | 12 ++++++-- src/vs/platform/electron/common/electron.ts | 1 + .../electron-main/electronMainService.ts | 7 +++++ .../platform/windows/electron-main/windows.ts | 3 -- .../electron-main/windowsMainService.ts | 30 ++++++------------- src/vs/workbench/electron-browser/window.ts | 4 +-- .../electron-browser/workbenchTestServices.ts | 1 + 7 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/vs/code/electron-main/window.ts b/src/vs/code/electron-main/window.ts index 0207eb26fce..a98bf7a6703 100644 --- a/src/vs/code/electron-main/window.ts +++ b/src/vs/code/electron-main/window.ts @@ -91,15 +91,18 @@ export class CodeWindow extends Disposable implements ICodeWindow { private static readonly MAX_URL_LENGTH = 2 * 1024 * 1024; // https://cs.chromium.org/chromium/src/url/url_constants.cc?l=32 + private readonly _onLoad = this._register(new Emitter()); + readonly onLoad = this._onLoad.event; + + private readonly _onReady = this._register(new Emitter()); + readonly onReady = this._onReady.event; + private readonly _onClose = this._register(new Emitter()); readonly onClose = this._onClose.event; private readonly _onDestroy = this._register(new Emitter()); readonly onDestroy = this._onDestroy.event; - private readonly _onLoad = this._register(new Emitter()); - readonly onLoad = this._onLoad.event; - private hiddenTitleBarStyle: boolean | undefined; private showTimeoutHandle: NodeJS.Timeout | undefined; private _lastFocusTime: number; @@ -346,6 +349,9 @@ export class CodeWindow extends Disposable implements ICodeWindow { while (this.whenReadyCallbacks.length) { this.whenReadyCallbacks.pop()!(this); } + + // Events + this._onReady.fire(); } ready(): Promise { diff --git a/src/vs/platform/electron/common/electron.ts b/src/vs/platform/electron/common/electron.ts index 6d349e0c95e..5d8f4aa73db 100644 --- a/src/vs/platform/electron/common/electron.ts +++ b/src/vs/platform/electron/common/electron.ts @@ -82,6 +82,7 @@ export interface ICommonElectronService { toggleWindowTabsBar(): Promise; // Lifecycle + notifyReady(): Promise relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise; reload(options?: { disableExtensions?: boolean }): Promise; closeWindow(): Promise; diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index 3c29badf961..e467824f42a 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -370,6 +370,13 @@ export class ElectronMainService implements IElectronMainService { //#region Lifecycle + async notifyReady(windowId: number | undefined): Promise { + const window = this.windowById(windowId); + if (window) { + window.setReady(); + } + } + async relaunch(windowId: number | undefined, options?: { addArgs?: string[], removeArgs?: string[] }): Promise { return this.lifecycleMainService.relaunch(options); } diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index d0bc4f841bb..8df91e318a8 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -33,9 +33,6 @@ export const enum WindowMode { export interface ICodeWindow extends IDisposable { - readonly onClose: Event; - readonly onDestroy: Event; - readonly whenClosedOrLoaded: Promise; readonly id: number; diff --git a/src/vs/platform/windows/electron-main/windowsMainService.ts b/src/vs/platform/windows/electron-main/windowsMainService.ts index 7320936684c..7b98cfd1b48 100644 --- a/src/vs/platform/windows/electron-main/windowsMainService.ts +++ b/src/vs/platform/windows/electron-main/windowsMainService.ts @@ -15,7 +15,7 @@ import { ParsedArgs } from 'vs/platform/environment/node/argv'; import { INativeEnvironmentService } from 'vs/platform/environment/node/environmentService'; import { IStateService } from 'vs/platform/state/node/state'; import { CodeWindow, defaultWindowState } from 'vs/code/electron-main/window'; -import { ipcMain as ipc, screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; +import { screen, BrowserWindow, MessageBoxOptions, Display, app, nativeTheme } from 'electron'; import { ILifecycleMainService, UnloadReason, LifecycleMainService, LifecycleMainPhase } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; @@ -212,19 +212,6 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic private registerListeners(): void { - // React to workbench ready events from windows - ipc.on('vscode:workbenchReady', (event: Event, windowId: number) => { - this.logService.trace('IPC#vscode-workbenchReady'); - - const win = this.getWindowById(windowId); - if (win) { - win.setReady(); - - // Event - this._onWindowReady.fire(win); - } - }); - // React to HC color scheme changes (Windows) if (isWindows) { nativeTheme.on('updated', () => { @@ -1434,24 +1421,25 @@ export class WindowsMainService extends Disposable implements IWindowsMainServic if (options.forceNewTabbedWindow) { const activeWindow = this.getLastActiveWindow(); if (activeWindow) { - activeWindow.addTabbedWindow(window); + activeWindow.addTabbedWindow(createdWindow); } } // Add to our list of windows - WindowsMainService.WINDOWS.push(window); + WindowsMainService.WINDOWS.push(createdWindow); // Indicate number change via event this._onWindowsCountChanged.fire({ oldCount: WindowsMainService.WINDOWS.length - 1, newCount: WindowsMainService.WINDOWS.length }); // Window Events - once(window.onClose)(() => this.onWindowClosed(createdWindow)); - once(window.onDestroy)(() => this.onBeforeWindowClose(createdWindow)); // try to save state before destroy because close will not fire - window.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own - window.win.webContents.on('devtools-reload-page', () => this.lifecycleMainService.reload(createdWindow)); + once(createdWindow.onReady)(() => this._onWindowReady.fire(createdWindow)); + once(createdWindow.onClose)(() => this.onWindowClosed(createdWindow)); + once(createdWindow.onDestroy)(() => this.onBeforeWindowClose(createdWindow)); // try to save state before destroy because close will not fire + createdWindow.win.webContents.removeAllListeners('devtools-reload-page'); // remove built in listener so we can handle this on our own + createdWindow.win.webContents.on('devtools-reload-page', () => this.lifecycleMainService.reload(createdWindow)); // Lifecycle - (this.lifecycleMainService as LifecycleMainService).registerWindow(window); + (this.lifecycleMainService as LifecycleMainService).registerWindow(createdWindow); } // Existing window diff --git a/src/vs/workbench/electron-browser/window.ts b/src/vs/workbench/electron-browser/window.ts index 4aaee4d11c9..1107f2a1bcb 100644 --- a/src/vs/workbench/electron-browser/window.ts +++ b/src/vs/workbench/electron-browser/window.ts @@ -397,8 +397,8 @@ export class NativeWindow extends Disposable { // Handle open calls this.setupOpenHandlers(); - // Emit event when vscode is ready - this.lifecycleService.when(LifecyclePhase.Ready).then(() => ipcRenderer.send('vscode:workbenchReady', this.electronService.windowId)); + // Notify main side when window ready + this.lifecycleService.when(LifecyclePhase.Ready).then(() => this.electronService.notifyReady()); // Integrity warning this.integrityService.isPure().then(res => this.titleService.updateProperties({ isPure: res.isPure })); diff --git a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts index 87ef63231c8..8a8af3eddbe 100644 --- a/src/vs/workbench/test/electron-browser/workbenchTestServices.ts +++ b/src/vs/workbench/test/electron-browser/workbenchTestServices.ts @@ -213,6 +213,7 @@ export class TestElectronService implements IElectronService { async moveWindowTabToNewWindow(): Promise { } async mergeAllWindowTabs(): Promise { } async toggleWindowTabsBar(): Promise { } + async notifyReady(): Promise { } async relaunch(options?: { addArgs?: string[] | undefined; removeArgs?: string[] | undefined; } | undefined): Promise { } async reload(): Promise { } async closeWindow(): Promise { }