diff --git a/src/vs/code/electron-main/windows.ts b/src/vs/code/electron-main/windows.ts index 9f83963bd69..66491a9a5c8 100644 --- a/src/vs/code/electron-main/windows.ts +++ b/src/vs/code/electron-main/windows.ts @@ -13,12 +13,12 @@ import { IEmptyWindowBackupInfo } from 'vs/platform/backup/node/backup'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; import { IStateService } from 'vs/platform/state/common/state'; import { CodeWindow, defaultWindowState } from 'vs/code/electron-main/window'; -import { ipcMain as ipc, screen, BrowserWindow, dialog, systemPreferences, FileFilter, shell } from 'electron'; +import { ipcMain as ipc, screen, BrowserWindow, dialog, systemPreferences, FileFilter, shell, MessageBoxReturnValue, MessageBoxOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue } from 'electron'; import { parseLineAndColumnAware } from 'vs/code/node/paths'; 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'; -import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, IPathsToWaitFor, IEnterWorkspaceResult, IMessageBoxResult, IURIToOpen, isFileToOpen, isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowSettings, OpenContext, IPath, IWindowConfiguration, INativeOpenDialogOptions, IPathsToWaitFor, IEnterWorkspaceResult, IURIToOpen, isFileToOpen, isWorkspaceToOpen, isFolderToOpen } from 'vs/platform/windows/common/windows'; import { getLastActiveWindow, findBestWindowOrFolderForFile, findWindowOnWorkspace, findWindowOnExtensionDevelopmentPath, findWindowOnWorkspaceOrFolderUri } from 'vs/code/node/windowsFinder'; import { Event as CommonEvent, Emitter } from 'vs/base/common/event'; import product from 'vs/platform/product/common/product'; @@ -227,7 +227,7 @@ export class WindowsManager extends Disposable implements IWindowsMainService { private registerListeners(): void { // React to workbench ready events from windows - ipc.on('vscode:workbenchReady', (event: Electron.Event, windowId: number) => { + ipc.on('vscode:workbenchReady', (event: Event, windowId: number) => { this.logService.trace('IPC#vscode-workbenchReady'); const win = this.getWindowById(windowId); @@ -1716,9 +1716,9 @@ export class WindowsManager extends Disposable implements IWindowsMainService { return; // Return early if the window has been going down already } - if (result.button === 0) { + if (result.response === 0) { window.reload(); - } else if (result.button === 2) { + } else if (result.response === 2) { this.onBeforeWindowClose(window); // 'close' event will not be fired on destroy(), so run it manually window.win.destroy(); // make sure to destroy the window as it is unresponsive } @@ -1739,9 +1739,9 @@ export class WindowsManager extends Disposable implements IWindowsMainService { return; // Return early if the window has been going down already } - if (result.button === 0) { + if (result.response === 0) { window.reload(); - } else if (result.button === 1) { + } else if (result.response === 1) { this.onBeforeWindowClose(window); // 'close' event will not be fired on destroy(), so run it manually window.win.destroy(); // make sure to destroy the window as it has crashed } @@ -1844,15 +1844,15 @@ export class WindowsManager extends Disposable implements IWindowsMainService { }); } - showMessageBox(options: Electron.MessageBoxOptions, win?: ICodeWindow): Promise { + showMessageBox(options: Electron.MessageBoxOptions, win?: ICodeWindow): Promise { return this.dialogs.showMessageBox(options, win); } - showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): Promise { + showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): Promise { return this.dialogs.showSaveDialog(options, win); } - showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): Promise { + showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): Promise { return this.dialogs.showOpenDialog(options, win); } @@ -1932,13 +1932,13 @@ class Dialogs { // Show Dialog const focusedWindow = (typeof options.windowId === 'number' ? this.windowsMainService.getWindowById(options.windowId) : undefined) || this.windowsMainService.getFocusedWindow(); - const paths = await this.showOpenDialog(dialogOptions, focusedWindow); - if (paths && paths.length > 0) { + const result = await this.showOpenDialog(dialogOptions, focusedWindow); + if (result && result.filePaths && result.filePaths.length > 0) { // Remember path in storage for next time - this.stateService.setItem(Dialogs.workingDirPickerStorageKey, dirname(paths[0])); + this.stateService.setItem(Dialogs.workingDirPickerStorageKey, dirname(result.filePaths[0])); - return paths; + return result.filePaths; } return; @@ -1958,20 +1958,17 @@ class Dialogs { return windowDialogQueue; } - showMessageBox(options: Electron.MessageBoxOptions, window?: ICodeWindow): Promise { + showMessageBox(options: MessageBoxOptions, window?: ICodeWindow): Promise { return this.getDialogQueue(window).queue(async () => { - let result: Electron.MessageBoxReturnValue; if (window) { - result = await dialog.showMessageBox(window.win, options); - } else { - result = await dialog.showMessageBox(options); + return dialog.showMessageBox(window.win, options); } - return { button: result.response, checkboxChecked: result.checkboxChecked }; + return dialog.showMessageBox(options); }); } - showSaveDialog(options: Electron.SaveDialogOptions, window?: ICodeWindow): Promise { + showSaveDialog(options: SaveDialogOptions, window?: ICodeWindow): Promise { function normalizePath(path: string | undefined): string | undefined { if (path && isMacintosh) { @@ -1982,18 +1979,20 @@ class Dialogs { } return this.getDialogQueue(window).queue(async () => { - let result: Electron.SaveDialogReturnValue; + let result: SaveDialogReturnValue; if (window) { result = await dialog.showSaveDialog(window.win, options); } else { result = await dialog.showSaveDialog(options); } - return normalizePath(result.filePath); + result.filePath = normalizePath(result.filePath); + + return result; }); } - showOpenDialog(options: Electron.OpenDialogOptions, window?: ICodeWindow): Promise { + showOpenDialog(options: OpenDialogOptions, window?: ICodeWindow): Promise { function normalizePaths(paths: string[] | undefined): string[] | undefined { if (paths && paths.length > 0 && isMacintosh) { @@ -2014,14 +2013,16 @@ class Dialogs { } // Show dialog - let result: Electron.OpenDialogReturnValue; + let result: OpenDialogReturnValue; if (window) { result = await dialog.showOpenDialog(window.win, options); } else { result = await dialog.showOpenDialog(options); } - return normalizePaths(result.filePaths); + result.filePaths = normalizePaths(result.filePaths); + + return result; }); } } @@ -2058,7 +2059,7 @@ class WorkspacesManager { // Prevent overwriting a workspace that is currently opened in another window if (findWindowOnWorkspace(this.windowsMainService.getWindows(), getWorkspaceIdentifier(path))) { - const options: Electron.MessageBoxOptions = { + const options: MessageBoxOptions = { title: product.nameLong, type: 'info', buttons: [localize('ok', "OK")], diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index 2fd83e38536..32a9e743690 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -5,7 +5,7 @@ import { IElectronService } from 'vs/platform/electron/node/electron'; import { IWindowsMainService, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; -import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions } from 'electron'; +import { MessageBoxOptions, MessageBoxReturnValue, shell, OpenDevToolsOptions, SaveDialogOptions, SaveDialogReturnValue, OpenDialogOptions, OpenDialogReturnValue } from 'electron'; import { ILifecycleMainService } from 'vs/platform/lifecycle/electron-main/lifecycleMainService'; import { OpenContext } from 'vs/platform/windows/common/windows'; import { isMacintosh } from 'vs/base/common/platform'; @@ -36,15 +36,22 @@ export class ElectronMainService implements IElectronService { //#endregion - async showMessageBox(options: MessageBoxOptions): Promise { - const result = await this.windowsMainService.showMessageBox(options, this.window); + //#region Dialog - return { - response: result.button, - checkboxChecked: !!result.checkboxChecked - }; + async showMessageBox(options: MessageBoxOptions): Promise { + return this.windowsMainService.showMessageBox(options, this.window); } + async showSaveDialog(options: SaveDialogOptions): Promise { + return this.windowsMainService.showSaveDialog(options, this.window); + } + + async showOpenDialog(options: OpenDialogOptions): Promise { + return this.windowsMainService.showOpenDialog(options, this.window); + } + + //#endregion + async showItemInFolder(path: string): Promise { shell.showItemInFolder(path); } diff --git a/src/vs/platform/electron/node/electron.ts b/src/vs/platform/electron/node/electron.ts index c2c1852c2c7..eb3f1cae46c 100644 --- a/src/vs/platform/electron/node/electron.ts +++ b/src/vs/platform/electron/node/electron.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions } from 'electron'; +import { MessageBoxOptions, MessageBoxReturnValue, OpenDevToolsOptions, SaveDialogOptions, OpenDialogOptions, OpenDialogReturnValue, SaveDialogReturnValue } from 'electron'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; export const IElectronService = createDecorator('electronService'); @@ -18,6 +18,8 @@ export interface IElectronService { // Dialogs showMessageBox(options: MessageBoxOptions): Promise; + showSaveDialog(options: SaveDialogOptions): Promise; + showOpenDialog(options: OpenDialogOptions): Promise; // OS showItemInFolder(path: string): Promise; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index cf1a04bfb56..9594c08f375 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -99,9 +99,6 @@ export interface IWindowsService { pickFileAndOpen(options: INativeOpenDialogOptions): Promise; pickFolderAndOpen(options: INativeOpenDialogOptions): Promise; pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise; - showMessageBox(windowId: number, options: MessageBoxOptions): Promise; - showSaveDialog(windowId: number, options: SaveDialogOptions): Promise; - showOpenDialog(windowId: number, options: OpenDialogOptions): Promise; reloadWindow(windowId: number, args?: ParsedArgs): Promise; closeWorkspace(windowId: number): Promise; @@ -156,11 +153,6 @@ export interface IWindowsService { export const IWindowService = createDecorator('windowService'); -export interface IMessageBoxResult { - button: number; - checkboxChecked?: boolean; -} - export interface IOpenSettings { forceNewWindow?: boolean; forceReuseWindow?: boolean; @@ -238,9 +230,6 @@ export interface IWindowService { unmaximizeWindow(): Promise; minimizeWindow(): Promise; onWindowTitleDoubleClick(): Promise; - showMessageBox(options: MessageBoxOptions): Promise; - showSaveDialog(options: SaveDialogOptions): Promise; - showOpenDialog(options: OpenDialogOptions): Promise; resolveProxy(url: string): Promise; } diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index f0d846c2d78..57a94a9a700 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -47,9 +47,6 @@ export class WindowsChannel implements IServerChannel { case 'pickFileAndOpen': return this.service.pickFileAndOpen(arg); case 'pickFolderAndOpen': return this.service.pickFolderAndOpen(arg); case 'pickWorkspaceAndOpen': return this.service.pickWorkspaceAndOpen(arg); - case 'showMessageBox': return this.service.showMessageBox(arg[0], arg[1]); - case 'showSaveDialog': return this.service.showSaveDialog(arg[0], arg[1]); - case 'showOpenDialog': return this.service.showOpenDialog(arg[0], arg[1]); case 'reloadWindow': return this.service.reloadWindow(arg[0], arg[1]); case 'closeWorkspace': return this.service.closeWorkspace(arg); case 'enterWorkspace': return this.service.enterWorkspace(arg[0], URI.revive(arg[1])); diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index a2167655ccb..f5a66f6b81e 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -5,7 +5,7 @@ import { Event } from 'vs/base/common/event'; import { IChannel } from 'vs/base/parts/ipc/common/ipc'; -import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IMessageBoxResult, MessageBoxOptions, SaveDialogOptions, OpenDialogOptions, IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows'; +import { IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, CrashReporterStartOptions, IURIToOpen, IOpenSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened, IRecent, isRecentWorkspace } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; @@ -47,18 +47,6 @@ export class WindowsService implements IWindowsService { return this.channel.call('pickWorkspaceAndOpen', options); } - showMessageBox(windowId: number, options: MessageBoxOptions): Promise { - return this.channel.call('showMessageBox', [windowId, options]); - } - - showSaveDialog(windowId: number, options: SaveDialogOptions): Promise { - return this.channel.call('showSaveDialog', [windowId, options]); - } - - showOpenDialog(windowId: number, options: OpenDialogOptions): Promise { - return this.channel.call('showOpenDialog', [windowId, options]); - } - reloadWindow(windowId: number, args?: ParsedArgs): Promise { return this.channel.call('reloadWindow', [windowId, args]); } diff --git a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts index 07458eebe97..4fe252829b5 100644 --- a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts +++ b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts @@ -6,9 +6,9 @@ import { Disposable, DisposableStore } from 'vs/base/common/lifecycle'; import { assign } from 'vs/base/common/objects'; import { URI } from 'vs/base/common/uri'; -import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IOpenSettings, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowsService, OpenContext, INativeOpenDialogOptions, IEnterWorkspaceResult, IOpenSettings, IURIToOpen } from 'vs/platform/windows/common/windows'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; -import { crashReporter, app, Menu } from 'electron'; +import { crashReporter, app, Menu, MessageBoxReturnValue, SaveDialogReturnValue, OpenDialogReturnValue } from 'electron'; import { Event } from 'vs/base/common/event'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import { IWindowsMainService, ISharedProcess, ICodeWindow } from 'vs/platform/windows/electron-main/windows'; @@ -81,19 +81,19 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ this.windowsMainService.pickWorkspaceAndOpen(options); } - async showMessageBox(windowId: number, options: Electron.MessageBoxOptions): Promise { + async showMessageBox(windowId: number, options: Electron.MessageBoxOptions): Promise { this.logService.trace('windowsService#showMessageBox', windowId); return this.withWindow(windowId, codeWindow => this.windowsMainService.showMessageBox(options, codeWindow), () => this.windowsMainService.showMessageBox(options))!; } - async showSaveDialog(windowId: number, options: Electron.SaveDialogOptions): Promise { + async showSaveDialog(windowId: number, options: Electron.SaveDialogOptions): Promise { this.logService.trace('windowsService#showSaveDialog', windowId); return this.withWindow(windowId, codeWindow => this.windowsMainService.showSaveDialog(options, codeWindow), () => this.windowsMainService.showSaveDialog(options))!; } - async showOpenDialog(windowId: number, options: Electron.OpenDialogOptions): Promise { + async showOpenDialog(windowId: number, options: Electron.OpenDialogOptions): Promise { this.logService.trace('windowsService#showOpenDialog', windowId); return this.withWindow(windowId, codeWindow => this.windowsMainService.showOpenDialog(options, codeWindow), () => this.windowsMainService.showOpenDialog(options))!; diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index 3ec831220e6..a7f1a1359ea 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { OpenContext, IWindowConfiguration, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IURIToOpen } from 'vs/platform/windows/common/windows'; +import { OpenContext, IWindowConfiguration, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen } from 'vs/platform/windows/common/windows'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { Event } from 'vs/base/common/event'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; @@ -11,6 +11,7 @@ import { IProcessEnvironment } from 'vs/base/common/platform'; import { IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { URI } from 'vs/base/common/uri'; +import { MessageBoxReturnValue, SaveDialogReturnValue, OpenDialogReturnValue } from 'electron'; export interface IWindowState { width?: number; @@ -101,9 +102,9 @@ export interface IWindowsMainService { pickFolderAndOpen(options: INativeOpenDialogOptions): Promise; pickFileAndOpen(options: INativeOpenDialogOptions): Promise; pickWorkspaceAndOpen(options: INativeOpenDialogOptions): Promise; - showMessageBox(options: Electron.MessageBoxOptions, win?: ICodeWindow): Promise; - showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): Promise; - showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): Promise; + showMessageBox(options: Electron.MessageBoxOptions, win?: ICodeWindow): Promise; + showSaveDialog(options: Electron.SaveDialogOptions, win?: ICodeWindow): Promise; + showOpenDialog(options: Electron.OpenDialogOptions, win?: ICodeWindow): Promise; focusLastActive(cli: ParsedArgs, context: OpenContext): ICodeWindow; getLastActiveWindow(): ICodeWindow | undefined; waitForWindowCloseOrLoad(windowId: number): Promise; diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 4f337b33d0b..2bf28b421bb 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -10,7 +10,7 @@ import { Event } from 'vs/base/common/event'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; -import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IMessageBoxResult, IWindowsService, IOpenSettings, IWindowSettings } from 'vs/platform/windows/common/windows'; +import { IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IURIToOpen, IWindowsService, IOpenSettings, IWindowSettings } from 'vs/platform/windows/common/windows'; import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; import { IRecentlyOpened, IRecent, isRecentFile, isRecentFolder } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; @@ -280,18 +280,6 @@ export class SimpleWindowService extends Disposable implements IWindowService { return Promise.resolve(); } - showMessageBox(_options: Electron.MessageBoxOptions): Promise { - return Promise.resolve({ button: 0 }); - } - - showSaveDialog(_options: Electron.SaveDialogOptions): Promise { - throw new Error('not implemented'); - } - - showOpenDialog(_options: Electron.OpenDialogOptions): Promise { - throw new Error('not implemented'); - } - updateTouchBar(_items: ISerializableCommandAction[][]): Promise { return Promise.resolve(); } @@ -478,18 +466,6 @@ export class SimpleWindowsService implements IWindowsService { return Promise.resolve(); } - showMessageBox(_windowId: number, _options: Electron.MessageBoxOptions): Promise { - throw new Error('not implemented'); - } - - showSaveDialog(_windowId: number, _options: Electron.SaveDialogOptions): Promise { - throw new Error('not implemented'); - } - - showOpenDialog(_windowId: number, _options: Electron.OpenDialogOptions): Promise { - throw new Error('not implemented'); - } - resolveProxy(windowId: number, url: string): Promise { return Promise.resolve(undefined); } diff --git a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts index d30cd3b7534..ffe0daa5e1c 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/runtimeExtensionsEditor.ts @@ -24,7 +24,6 @@ import { RunOnceScheduler } from 'vs/base/common/async'; import { clipboard } from 'electron'; import { EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; -import { IWindowService } from 'vs/platform/windows/common/windows'; import { IElectronService } from 'vs/platform/electron/node/electron'; import { writeFile } from 'vs/base/node/pfs'; import { IEnvironmentService } from 'vs/platform/environment/common/environment'; @@ -612,7 +611,7 @@ export class SaveExtensionHostProfileAction extends Action { constructor( id: string = SaveExtensionHostProfileAction.ID, label: string = SaveExtensionHostProfileAction.LABEL, - @IWindowService private readonly _windowService: IWindowService, + @IElectronService private readonly _electronService: IElectronService, @IEnvironmentService private readonly _environmentService: IEnvironmentService, @IExtensionHostProfileService private readonly _extensionHostProfileService: IExtensionHostProfileService, ) { @@ -627,7 +626,7 @@ export class SaveExtensionHostProfileAction extends Action { } private async _asyncRun(): Promise { - let picked = await this._windowService.showSaveDialog({ + let picked = await this._electronService.showSaveDialog({ title: 'Save Extension Host Profile', buttonLabel: 'Save', defaultPath: `CPU-${new Date().toISOString().replace(/[\-:]/g, '')}.cpuprofile`, @@ -637,13 +636,15 @@ export class SaveExtensionHostProfileAction extends Action { }] }); - if (!picked) { + if (!picked || !picked.filePath) { return; } const profileInfo = this._extensionHostProfileService.lastProfile; let dataToWrite: object = profileInfo ? profileInfo.data : {}; + let savePath = picked.filePath; + if (this._environmentService.isBuilt) { const profiler = await import('v8-inspect-profiler'); // when running from a not-development-build we remove @@ -654,9 +655,9 @@ export class SaveExtensionHostProfileAction extends Action { let tmp = profiler.rewriteAbsolutePaths({ profile: dataToWrite as any }, 'piiRemoved'); dataToWrite = tmp.profile; - picked = picked + '.txt'; + savePath = savePath + '.txt'; } - return writeFile(picked, JSON.stringify(profileInfo ? profileInfo.data : {}, null, '\t')); + return writeFile(savePath, JSON.stringify(profileInfo ? profileInfo.data : {}, null, '\t')); } } diff --git a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts index 974ab501949..3cc8d860ac5 100644 --- a/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts +++ b/src/vs/workbench/services/dialogs/electron-browser/dialogService.ts @@ -8,7 +8,6 @@ import * as os from 'os'; import product from 'vs/platform/product/common/product'; import Severity from 'vs/base/common/severity'; import { isLinux, isWindows } from 'vs/base/common/platform'; -import { IWindowService } from 'vs/platform/windows/common/windows'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; import { IDialogService, IConfirmation, IConfirmationResult, IDialogOptions, IShowResult } from 'vs/platform/dialogs/common/dialogs'; import { DialogService as HTMLDialogService } from 'vs/workbench/services/dialogs/browser/dialogService'; @@ -50,7 +49,6 @@ export class DialogService implements IDialogService { @ILogService logService: ILogService, @ILayoutService layoutService: ILayoutService, @IThemeService themeService: IThemeService, - @IWindowService windowService: IWindowService, @ISharedProcessService sharedProcessService: ISharedProcessService, @IKeybindingService keybindingService: IKeybindingService, @IProductService productService: IProductService, @@ -64,7 +62,7 @@ export class DialogService implements IDialogService { } // Electron dialog service else { - this.impl = new NativeDialogService(windowService, logService, sharedProcessService, electronService, clipboardService); + this.impl = new NativeDialogService(logService, sharedProcessService, electronService, clipboardService); } } @@ -86,7 +84,6 @@ class NativeDialogService implements IDialogService { _serviceBrand: undefined; constructor( - @IWindowService private readonly windowService: IWindowService, @ILogService private readonly logService: ILogService, @ISharedProcessService sharedProcessService: ISharedProcessService, @IElectronService private readonly electronService: IElectronService, @@ -100,9 +97,9 @@ class NativeDialogService implements IDialogService { const { options, buttonIndexMap } = this.massageMessageBoxOptions(this.getConfirmOptions(confirmation)); - const result = await this.windowService.showMessageBox(options); + const result = await this.electronService.showMessageBox(options); return { - confirmed: buttonIndexMap[result.button] === 0 ? true : false, + confirmed: buttonIndexMap[result.response] === 0 ? true : false, checkboxChecked: result.checkboxChecked }; } @@ -157,8 +154,8 @@ class NativeDialogService implements IDialogService { checkboxChecked: dialogOptions && dialogOptions.checkbox ? dialogOptions.checkbox.checked : undefined }); - const result = await this.windowService.showMessageBox(options); - return { choice: buttonIndexMap[result.button], checkboxChecked: result.checkboxChecked }; + const result = await this.electronService.showMessageBox(options); + return { choice: buttonIndexMap[result.response], checkboxChecked: result.checkboxChecked }; } private massageMessageBoxOptions(options: Electron.MessageBoxOptions): IMassagedMessageBoxOptions { diff --git a/src/vs/workbench/services/window/electron-browser/windowService.ts b/src/vs/workbench/services/window/electron-browser/windowService.ts index e9ed46b5136..a33d51d0d5f 100644 --- a/src/vs/workbench/services/window/electron-browser/windowService.ts +++ b/src/vs/workbench/services/window/electron-browser/windowService.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, IOpenSettings, IURIToOpen, isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService, INativeOpenDialogOptions, IEnterWorkspaceResult, IOpenSettings, IURIToOpen, isFolderToOpen, isWorkspaceToOpen } from 'vs/platform/windows/common/windows'; import { IRecentlyOpened, IRecent } from 'vs/platform/history/common/history'; import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; @@ -153,18 +153,6 @@ export class WindowService extends Disposable implements IWindowService { return this.windowsService.setDocumentEdited(this.windowId, flag); } - showMessageBox(options: Electron.MessageBoxOptions): Promise { - return this.windowsService.showMessageBox(this.windowId, options); - } - - showSaveDialog(options: Electron.SaveDialogOptions): Promise { - return this.windowsService.showSaveDialog(this.windowId, options); - } - - showOpenDialog(options: Electron.OpenDialogOptions): Promise { - return this.windowsService.showOpenDialog(this.windowId, options); - } - updateTouchBar(items: ISerializableCommandAction[][]): Promise { return this.windowsService.updateTouchBar(this.windowId, items); } diff --git a/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts index a97ea749b8a..ad09d02f6ea 100644 --- a/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts @@ -7,7 +7,7 @@ import { IWorkspaceEditingService } from 'vs/workbench/services/workspace/common import { URI } from 'vs/base/common/uri'; import * as nls from 'vs/nls'; import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; -import { IWindowService, MessageBoxOptions, IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; import { IJSONEditingService, JSONEditingError, JSONEditingErrorCode } from 'vs/workbench/services/configuration/common/jsonEditing'; import { IWorkspaceIdentifier, IWorkspaceFolderCreationData, IWorkspacesService, rewriteWorkspaceFileForNewLocation, WORKSPACE_FILTER } from 'vs/platform/workspaces/common/workspaces'; import { WorkspaceService } from 'vs/workbench/services/configuration/browser/configurationService'; @@ -323,14 +323,14 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { // Prevent overwriting a workspace that is currently opened in another window if (windows.some(window => !!window.workspace && isEqual(window.workspace.configPath, path))) { - const options: MessageBoxOptions = { - type: 'info', - buttons: [nls.localize('ok', "OK")], - message: nls.localize('workspaceOpenedMessage', "Unable to save workspace '{0}'", basename(path)), - detail: nls.localize('workspaceOpenedDetail', "The workspace is already opened in another window. Please close that window first and then try again."), - noLink: true - }; - await this.windowService.showMessageBox(options); + await this.dialogService.show( + Severity.Info, + nls.localize('workspaceOpenedMessage', "Unable to save workspace '{0}'", basename(path)), + [nls.localize('ok', "OK")], + { + detail: nls.localize('workspaceOpenedDetail', "The workspace is already opened in another window. Please close that window first and then try again.") + } + ); return false; } diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index da32cee197f..332d617b1dc 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -35,7 +35,7 @@ import { IModeService } from 'vs/editor/common/services/modeService'; import { IHistoryService } from 'vs/workbench/services/history/common/history'; import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; -import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, IMessageBoxResult, MenuBarVisibility, IURIToOpen, IOpenSettings, IWindowConfiguration } from 'vs/platform/windows/common/windows'; +import { IWindowsService, IWindowService, INativeOpenDialogOptions, IEnterWorkspaceResult, MenuBarVisibility, IURIToOpen, IOpenSettings, IWindowConfiguration } from 'vs/platform/windows/common/windows'; import { TestWorkspace } from 'vs/platform/workspace/test/common/testWorkspace'; import { createTextBufferFactoryFromStream } from 'vs/editor/common/model/textModel'; import { IEnvironmentService, ParsedArgs } from 'vs/platform/environment/common/environment'; @@ -1279,18 +1279,6 @@ export class TestWindowService implements IWindowService { return Promise.resolve(); } - showMessageBox(_options: Electron.MessageBoxOptions): Promise { - return Promise.resolve({ button: 0 }); - } - - showSaveDialog(_options: Electron.SaveDialogOptions): Promise { - throw new Error('not implemented'); - } - - showOpenDialog(_options: Electron.OpenDialogOptions): Promise { - throw new Error('not implemented'); - } - updateTouchBar(_items: ISerializableCommandAction[][]): Promise { return Promise.resolve(); } @@ -1509,18 +1497,6 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(); } - showMessageBox(_windowId: number, _options: Electron.MessageBoxOptions): Promise { - throw new Error('not implemented'); - } - - showSaveDialog(_windowId: number, _options: Electron.SaveDialogOptions): Promise { - throw new Error('not implemented'); - } - - showOpenDialog(_windowId: number, _options: Electron.OpenDialogOptions): Promise { - throw new Error('not implemented'); - } - resolveProxy(windowId: number, url: string): Promise { return Promise.resolve(undefined); }