From d4ff203d812ab6c62ce9127f09f0f32848d5ff0d Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 18 Jul 2017 10:42:08 +0200 Subject: [PATCH] simplify closeExtensionHostWindow via broadcast --- src/vs/code/node/windowsFinder.ts | 20 ------------------- src/vs/platform/windows/common/windows.ts | 2 -- src/vs/platform/windows/common/windowsIpc.ts | 6 ------ .../windows/electron-main/windowsService.ts | 11 ---------- .../electron-browser/extensionHost.ts | 19 ++++++++++++++++-- .../debug/electron-browser/debugService.ts | 7 +++++-- .../workbench/test/workbenchTestServices.ts | 5 ----- 7 files changed, 22 insertions(+), 48 deletions(-) diff --git a/src/vs/code/node/windowsFinder.ts b/src/vs/code/node/windowsFinder.ts index 588a42f6c0e..d01352a9e10 100644 --- a/src/vs/code/node/windowsFinder.ts +++ b/src/vs/code/node/windowsFinder.ts @@ -144,25 +144,5 @@ export function findWindowOnWorkspace(windows: W[], wor } } - return null; -} - -export function findExtensionDevelopmentWindow(windows: W[], extensionDevelopmentPath?: string): W { - if (windows.length) { - const res = windows.filter(w => { - - // match on extension development path - if (typeof extensionDevelopmentPath === 'string' && paths.isEqual(w.extensionDevelopmentPath, extensionDevelopmentPath, !platform.isLinux /* ignorecase */)) { - return true; - } - - return false; - }); - - if (res && res.length) { - return res[0]; - } - } - return null; } \ No newline at end of file diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 3638739e9b8..d1e96b27509 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -58,8 +58,6 @@ export interface IWindowsService { getWindows(): TPromise<{ id: number; workspace?: IWorkspaceIdentifier; folderPath?: string; title: string; filename?: string; }[]>; getWindowCount(): TPromise; log(severity: string, ...messages: string[]): TPromise; - // TODO@joao: what? - closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise; showItemInFolder(path: string): TPromise; // This needs to be handled from browser process to prevent diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index a88576402f9..7a62ca9a3bb 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -46,7 +46,6 @@ export interface IWindowsChannel extends IChannel { call(command: 'whenSharedProcessReady'): TPromise; call(command: 'toggleSharedProcess'): TPromise; call(command: 'log', arg: [string, string[]]): TPromise; - call(command: 'closeExtensionHostWindow', arg: string[]): TPromise; call(command: 'showItemInFolder', arg: string): TPromise; call(command: 'openExternal', arg: string): TPromise; call(command: 'startCrashReporter', arg: Electron.CrashReporterStartOptions): TPromise; @@ -98,7 +97,6 @@ export class WindowsChannel implements IWindowsChannel { case 'toggleSharedProcess': return this.service.toggleSharedProcess(); case 'quit': return this.service.quit(); case 'log': return this.service.log(arg[0], arg[1]); - case 'closeExtensionHostWindow': return this.service.closeExtensionHostWindow(arg); case 'showItemInFolder': return this.service.showItemInFolder(arg); case 'openExternal': return this.service.openExternal(arg); case 'startCrashReporter': return this.service.startCrashReporter(arg); @@ -243,10 +241,6 @@ export class WindowsChannelClient implements IWindowsService { return this.channel.call('log', [severity, messages]); } - closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise { - return this.channel.call('closeExtensionHostWindow', extensionDevelopmentPaths); - } - showItemInFolder(path: string): TPromise { return this.channel.call('showItemInFolder', path); } diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index a8c11b4b7cd..8bcb95579a5 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -19,7 +19,6 @@ import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry'; import { ILifecycleService } from "vs/platform/lifecycle/electron-main/lifecycleMain"; import { IWindowsMainService, ISharedProcess } from "vs/platform/windows/electron-main/windows"; import { IHistoryMainService, IRecentlyOpened } from "vs/platform/history/common/history"; -import { findExtensionDevelopmentWindow } from "vs/code/node/windowsFinder"; import { IWorkspaceIdentifier } from "vs/platform/workspaces/common/workspaces"; export class WindowsService implements IWindowsService, IDisposable { @@ -282,16 +281,6 @@ export class WindowsService implements IWindowsService, IDisposable { return TPromise.as(null); } - closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise { - extensionDevelopmentPaths.map(extensionDevelopmentPath => findExtensionDevelopmentWindow(this.windowsMainService.getWindows(), extensionDevelopmentPath)).forEach(extensionDevelopmentWindow => { - if (extensionDevelopmentWindow) { - extensionDevelopmentWindow.win.close(); - } - }); - - return TPromise.as(null); - } - showItemInFolder(path: string): TPromise { shell.showItemInFolder(path); return TPromise.as(null); diff --git a/src/vs/workbench/electron-browser/extensionHost.ts b/src/vs/workbench/electron-browser/extensionHost.ts index fe455e2d818..abcd2eb5993 100644 --- a/src/vs/workbench/electron-browser/extensionHost.ts +++ b/src/vs/workbench/electron-browser/extensionHost.ts @@ -12,7 +12,7 @@ import * as objects from 'vs/base/common/objects'; import URI from 'vs/base/common/uri'; import { TPromise } from 'vs/base/common/winjs.base'; import { Action } from 'vs/base/common/actions'; -import { isWindows } from 'vs/base/common/platform'; +import { isWindows, isLinux } from 'vs/base/common/platform'; import { findFreePort } from 'vs/base/node/ports'; import { IMessageService, Severity } from 'vs/platform/message/common/message'; import { ILifecycleService, ShutdownEvent } from 'vs/platform/lifecycle/common/lifecycle'; @@ -34,11 +34,13 @@ import { IInitData, IWorkspaceData } from 'vs/workbench/api/node/extHost.protoco import { MainProcessExtensionService } from 'vs/workbench/api/electron-browser/mainThreadExtensionService'; import { IWorkspaceConfigurationService } from 'vs/workbench/services/configuration/common/configuration'; import { ICrashReporterService } from 'vs/workbench/services/crashReporter/common/crashReporterService'; -import { IBroadcastService } from "vs/platform/broadcast/electron-browser/broadcastService"; +import { IBroadcastService, IBroadcast } from "vs/platform/broadcast/electron-browser/broadcastService"; +import { isEqual } from "vs/base/common/paths"; export const EXTENSION_LOG_BROADCAST_CHANNEL = 'vscode:extensionLog'; export const EXTENSION_ATTACH_BROADCAST_CHANNEL = 'vscode:extensionAttach'; export const EXTENSION_TERMINATE_BROADCAST_CHANNEL = 'vscode:extensionTerminate'; +export const EXTENSION_CLOSE_EXTHOST_BROADCAST_CHANNEL = 'vscode:extensionCloseExtensionHost'; export interface ILogEntry { type: string; @@ -108,6 +110,19 @@ export class ExtensionHostProcessWorker { lifecycleService.onWillShutdown(this._onWillShutdown, this); lifecycleService.onShutdown(reason => this.terminate()); + + broadcastService.onBroadcast(b => this.onBroadcast(b)); + } + + private onBroadcast(broadcast: IBroadcast): void { + + // Close Ext Host Window Request + if (broadcast.channel === EXTENSION_CLOSE_EXTHOST_BROADCAST_CHANNEL && this.isExtensionDevelopmentHost) { + const extensionPaths = broadcast.payload as string[]; + if (Array.isArray(extensionPaths) && extensionPaths.some(path => isEqual(this.environmentService.extensionDevelopmentPath, path, !isLinux))) { + this.windowService.closeWindow(); + } + } } public start(extensionService: MainProcessExtensionService): void { diff --git a/src/vs/workbench/parts/debug/electron-browser/debugService.ts b/src/vs/workbench/parts/debug/electron-browser/debugService.ts index bbc9faab89e..d8f95688ff1 100644 --- a/src/vs/workbench/parts/debug/electron-browser/debugService.ts +++ b/src/vs/workbench/parts/debug/electron-browser/debugService.ts @@ -48,7 +48,7 @@ import { ITextFileService } from 'vs/workbench/services/textfile/common/textfile import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; -import { ILogEntry, EXTENSION_LOG_BROADCAST_CHANNEL, EXTENSION_ATTACH_BROADCAST_CHANNEL, EXTENSION_TERMINATE_BROADCAST_CHANNEL } from 'vs/workbench/electron-browser/extensionHost'; +import { ILogEntry, EXTENSION_LOG_BROADCAST_CHANNEL, EXTENSION_ATTACH_BROADCAST_CHANNEL, EXTENSION_TERMINATE_BROADCAST_CHANNEL, EXTENSION_CLOSE_EXTHOST_BROADCAST_CHANNEL } from 'vs/workbench/electron-browser/extensionHost'; import { IBroadcastService, IBroadcast } from "vs/platform/broadcast/electron-browser/broadcastService"; const DEBUG_BREAKPOINTS_KEY = 'debug.breakpoint'; @@ -418,7 +418,10 @@ export class DebugService implements debug.IDebugService { const process = this.viewModel.focusedProcess; if (process && session && process.getId() === session.getId() && strings.equalsIgnoreCase(process.configuration.type, 'extensionhost') && this.sessionStates.get(session.getId()) === debug.State.Running && process && this.contextService.hasWorkspace() && process.configuration.noDebug) { - this.windowsService.closeExtensionHostWindow(this.contextService.getWorkspace().roots.map(r => r.fsPath)); + this.broadcastService.broadcast({ + channel: EXTENSION_CLOSE_EXTHOST_BROADCAST_CHANNEL, + payload: this.contextService.getWorkspace().roots.map(r => r.fsPath) + }); } if (session && session.getId() === event.body.sessionId) { this.onSessionEnd(session); diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 917b1301481..655c342ec35 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1096,11 +1096,6 @@ export class TestWindowsService implements IWindowsService { return TPromise.as(void 0); } - // TODO@joao: what? - closeExtensionHostWindow(extensionDevelopmentPaths: string[]): TPromise { - return TPromise.as(void 0); - } - showItemInFolder(path: string): TPromise { return TPromise.as(void 0); } -- GitLab