diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index 75d630a1f11..d8aef8a7c55 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -83,6 +83,13 @@ export class ElectronMainService implements IElectronService { return this.lifecycleMainService.relaunch(options); } + async reload(): Promise { + const window = this.window; + if (window) { + return this.windowsMainService.reload(window); + } + } + async openDevTools(options?: OpenDevToolsOptions): Promise { const window = this.window; if (window) { diff --git a/src/vs/platform/electron/node/electron.ts b/src/vs/platform/electron/node/electron.ts index 5fa7a53cbe8..8da98114069 100644 --- a/src/vs/platform/electron/node/electron.ts +++ b/src/vs/platform/electron/node/electron.ts @@ -30,7 +30,10 @@ export interface IElectronService { // OS showItemInFolder(path: string): Promise; + + // Lifecycle relaunch(options?: { addArgs?: string[], removeArgs?: string[] }): Promise; + reload(): Promise; // Development openDevTools(options?: OpenDevToolsOptions): Promise; diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index dfbfae96146..684dfa0c7ad 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -94,7 +94,6 @@ export interface IWindowsService { readonly onWindowUnmaximize: Event; readonly onRecentlyOpenedChange: Event; - reloadWindow(windowId: number, args?: ParsedArgs): Promise; closeWorkspace(windowId: number): Promise; enterWorkspace(windowId: number, path: URI): Promise; setRepresentedFilename(windowId: number, fileName: string): Promise; @@ -196,7 +195,6 @@ export interface IWindowService { readonly windowId: number; - reloadWindow(args?: ParsedArgs): Promise; closeWorkspace(): Promise; updateTouchBar(items: ISerializableCommandAction[][]): Promise; enterWorkspace(path: URI): Promise; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index f08065e6658..2b9eb5fbc09 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -43,7 +43,6 @@ export class WindowsChannel implements IServerChannel { call(_: unknown, command: string, arg?: any): Promise { switch (command) { - 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])); case 'setRepresentedFilename': return this.service.setRepresentedFilename(arg[0], arg[1]); diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index c14a573254e..1d389ebf99f 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -31,10 +31,6 @@ export class WindowsService implements IWindowsService { this.channel = mainProcessService.getChannel('windows'); } - reloadWindow(windowId: number, args?: ParsedArgs): Promise { - return this.channel.call('reloadWindow', [windowId, args]); - } - closeWorkspace(windowId: number): Promise { return this.channel.call('closeWorkspace', windowId); } diff --git a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts index d2d5d527d89..4f323d9bdee 100644 --- a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts +++ b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts @@ -75,12 +75,6 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ return this.withWindow(windowId, codeWindow => this.windowsMainService.showOpenDialog(options, codeWindow), () => this.windowsMainService.showOpenDialog(options))!; } - async reloadWindow(windowId: number, args: ParsedArgs): Promise { - this.logService.trace('windowsService#reloadWindow', windowId); - - return this.withWindow(windowId, codeWindow => this.windowsMainService.reload(codeWindow, args)); - } - async updateTouchBar(windowId: number, items: ISerializableCommandAction[][]): Promise { this.logService.trace('windowsService#updateTouchBar', windowId); diff --git a/src/vs/platform/windows/electron-main/windows.ts b/src/vs/platform/windows/electron-main/windows.ts index bd865f8a115..dabe6e494a8 100644 --- a/src/vs/platform/windows/electron-main/windows.ts +++ b/src/vs/platform/windows/electron-main/windows.ts @@ -50,7 +50,7 @@ export interface ICodeWindow { addTabbedWindow(window: ICodeWindow): void; - load(config: IWindowConfiguration, isReload?: boolean, disableExtensions?: boolean): void; + load(config: IWindowConfiguration, isReload?: boolean): void; reload(configuration?: IWindowConfiguration, cli?: ParsedArgs): void; focus(): void; diff --git a/src/vs/workbench/api/browser/mainThreadExtensionService.ts b/src/vs/workbench/api/browser/mainThreadExtensionService.ts index 35d36d1814f..a20c38456a7 100644 --- a/src/vs/workbench/api/browser/mainThreadExtensionService.ts +++ b/src/vs/workbench/api/browser/mainThreadExtensionService.ts @@ -14,7 +14,7 @@ import { localize } from 'vs/nls'; import { Action } from 'vs/base/common/actions'; import { IExtensionEnablementService, EnablementState } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; @@ -26,7 +26,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha private readonly _extensionService: IExtensionService; private readonly _notificationService: INotificationService; private readonly _extensionsWorkbenchService: IExtensionsWorkbenchService; - private readonly _windowService: IWindowService; + private readonly _hostService: IHostService; private readonly _extensionEnablementService: IExtensionEnablementService; constructor( @@ -34,13 +34,13 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha @IExtensionService extensionService: IExtensionService, @INotificationService notificationService: INotificationService, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, - @IWindowService windowService: IWindowService, + @IHostService hostService: IHostService, @IExtensionEnablementService extensionEnablementService: IExtensionEnablementService ) { this._extensionService = extensionService; this._notificationService = notificationService; this._extensionsWorkbenchService = extensionsWorkbenchService; - this._windowService = windowService; + this._hostService = hostService; this._extensionEnablementService = extensionEnablementService; } @@ -93,7 +93,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha severity: Severity.Error, message: localize('reload window', "Cannot activate the '{0}' extension because it depends on the '{1}' extension, which is not loaded. Would you like to reload the window to load the extension?", extName, missingInstalledDependency.manifest.displayName || missingInstalledDependency.manifest.name), actions: { - primary: [new Action('reload', localize('reload', "Reload Window"), '', true, () => this._windowService.reloadWindow())] + primary: [new Action('reload', localize('reload', "Reload Window"), '', true, () => this._hostService.reload())] } }); } else { @@ -104,7 +104,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha actions: { primary: [new Action('enable', localize('enable dep', "Enable and Reload"), '', true, () => this._extensionEnablementService.setEnablement([missingInstalledDependency], enablementState === EnablementState.DisabledGlobally ? EnablementState.EnabledGlobally : EnablementState.EnabledWorkspace) - .then(() => this._windowService.reloadWindow(), e => this._notificationService.error(e)))] + .then(() => this._hostService.reload(), e => this._notificationService.error(e)))] } }); } @@ -120,7 +120,7 @@ export class MainThreadExtensionService implements MainThreadExtensionServiceSha actions: { primary: [new Action('install', localize('install missing dep', "Install and Reload"), '', true, () => this._extensionsWorkbenchService.install(dependencyExtension) - .then(() => this._windowService.reloadWindow(), e => this._notificationService.error(e)))] + .then(() => this._hostService.reload(), e => this._notificationService.error(e)))] } }); } else { diff --git a/src/vs/workbench/api/browser/mainThreadUrls.ts b/src/vs/workbench/api/browser/mainThreadUrls.ts index 397b831894d..c5f54274e72 100644 --- a/src/vs/workbench/api/browser/mainThreadUrls.ts +++ b/src/vs/workbench/api/browser/mainThreadUrls.ts @@ -8,7 +8,7 @@ import { extHostNamedCustomer } from '../common/extHostCustomers'; import { IURLService, IURLHandler } from 'vs/platform/url/common/url'; import { URI, UriComponents } from 'vs/base/common/uri'; import { IDisposable } from 'vs/base/common/lifecycle'; -import { IExtensionUrlHandler } from 'vs/workbench/services/extensions/common/extensionUrlHandler'; +import { IExtensionUrlHandler } from 'vs/workbench/services/extensions/browser/extensionUrlHandler'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; class ExtensionUrlHandler implements IURLHandler { diff --git a/src/vs/workbench/browser/actions/windowActions.ts b/src/vs/workbench/browser/actions/windowActions.ts index 56292fa3035..9bd97cd7f9f 100644 --- a/src/vs/workbench/browser/actions/windowActions.ts +++ b/src/vs/workbench/browser/actions/windowActions.ts @@ -213,13 +213,13 @@ export class ReloadWindowAction extends Action { constructor( id: string, label: string, - @IWindowService private readonly windowService: IWindowService + @IHostService private readonly hostService: IHostService ) { super(id, label); } async run(): Promise { - await this.windowService.reloadWindow(); + await this.hostService.reload(); return true; } diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 76dbaf6b4c2..5e2856b0153 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -91,12 +91,6 @@ export class SimpleWindowService extends Disposable implements IWindowService { return Promise.resolve(false); } - reloadWindow(): Promise { - window.location.reload(); - - return Promise.resolve(); - } - closeWorkspace(): Promise { return Promise.resolve(); } @@ -252,10 +246,6 @@ export class SimpleWindowsService implements IWindowsService { return Promise.resolve(true); } - reloadWindow(_windowId: number): Promise { - return Promise.resolve(); - } - closeWorkspace(_windowId: number): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index a18bcf9b4ba..79841147a99 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -25,7 +25,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { Query } from 'vs/workbench/contrib/extensions/common/extensionQuery'; import { IFileService, IFileContent } from 'vs/platform/files/common/files'; import { IWorkspaceContextService, WorkbenchState, IWorkspaceFolder } from 'vs/platform/workspace/common/workspace'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { CommandsRegistry, ICommandService } from 'vs/platform/commands/common/commands'; @@ -1158,7 +1158,7 @@ export class ReloadAction extends ExtensionAction { constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @IExtensionService private readonly extensionService: IExtensionService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService, @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService @@ -1261,7 +1261,7 @@ export class ReloadAction extends ExtensionAction { } run(): Promise { - return Promise.resolve(this.windowService.reloadWindow()); + return Promise.resolve(this.hostService.reload()); } } @@ -2786,7 +2786,7 @@ export class InstallVSIXAction extends Action { label = InstallVSIXAction.LABEL, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @INotificationService private readonly notificationService: INotificationService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @IFileDialogService private readonly fileDialogService: IFileDialogService, @IExtensionService private readonly extensionService: IExtensionService, @IInstantiationService private readonly instantiationService: IInstantiationService @@ -2813,7 +2813,7 @@ export class InstallVSIXAction extends Action { : localize('InstallVSIXAction.success', "Completed installing the extension {0}.", extension.displayName || extension.name); const actions = requireReload ? [{ label: localize('InstallVSIXAction.reloadNow', "Reload Now"), - run: () => this.windowService.reloadWindow() + run: () => this.hostService.reload() }] : []; this.notificationService.prompt( Severity.Info, @@ -2838,7 +2838,7 @@ export class ReinstallAction extends Action { @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IExtensionService private readonly extensionService: IExtensionService ) { @@ -2881,7 +2881,7 @@ export class ReinstallAction extends Action { : localize('ReinstallAction.success', "Reinstalling the extension {0} is completed.", extension.identifier.id); const actions = requireReload ? [{ label: localize('InstallVSIXAction.reloadNow', "Reload Now"), - run: () => this.windowService.reloadWindow() + run: () => this.hostService.reload() }] : []; this.notificationService.prompt( Severity.Info, @@ -2905,7 +2905,7 @@ export class InstallSpecificVersionOfExtensionAction extends Action { @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @IInstantiationService private readonly instantiationService: IInstantiationService, @IExtensionService private readonly extensionService: IExtensionService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService, @@ -2967,7 +2967,7 @@ export class InstallSpecificVersionOfExtensionAction extends Action { : localize('InstallAnotherVersionExtensionAction.success', "Installing the extension {0} is completed.", extension.identifier.id); const actions = requireReload ? [{ label: localize('InstallAnotherVersionExtensionAction.reloadNow', "Reload Now"), - run: () => this.windowService.reloadWindow() + run: () => this.hostService.reload() }] : []; this.notificationService.prompt( Severity.Info, @@ -2994,7 +2994,7 @@ export class InstallLocalExtensionsInRemoteAction extends Action { @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IQuickInputService private readonly quickInputService: IQuickInputService, @INotificationService private readonly notificationService: INotificationService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @IProgressService private readonly progressService: IProgressService, @IInstantiationService private readonly instantiationService: IInstantiationService ) { @@ -3107,7 +3107,7 @@ export class InstallLocalExtensionsInRemoteAction extends Action { message: localize('finished installing', "Successfully installed extensions in {0}. Please reload the window to enable them.", this.extensionManagementServerService.remoteExtensionManagementServer!.label), actions: { primary: [new Action('realod', localize('reload', "Reload Window"), '', true, - () => this.windowService.reloadWindow())] + () => this.hostService.reload())] } }); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts b/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts index 6474d2f3c58..07006b77f26 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsDependencyChecker.ts @@ -13,7 +13,7 @@ import { values } from 'vs/base/common/map'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { Action } from 'vs/base/common/actions'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { Disposable } from 'vs/base/common/lifecycle'; import { CancellationToken } from 'vs/base/common/cancellation'; @@ -23,7 +23,7 @@ export class ExtensionDependencyChecker extends Disposable implements IWorkbench @IExtensionService private readonly extensionService: IExtensionService, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @INotificationService private readonly notificationService: INotificationService, - @IWindowService private readonly windowService: IWindowService + @IHostService private readonly hostService: IHostService ) { super(); CommandsRegistry.registerCommand('workbench.extensions.installMissingDepenencies', () => this.installMissingDependencies()); @@ -69,7 +69,7 @@ export class ExtensionDependencyChecker extends Disposable implements IWorkbench message: localize('finished installing missing deps', "Finished installing missing dependencies. Please reload the window now."), actions: { primary: [new Action('realod', localize('reload', "Reload Window"), '', true, - () => this.windowService.reloadWindow())] + () => this.hostService.reload())] } }); } diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts index b4b05abc5ec..c3b64be310a 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts @@ -43,7 +43,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView import { getMaliciousExtensionsSet } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ILogService } from 'vs/platform/log/common/log'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IWorkbenchLayoutService } from 'vs/workbench/services/layout/browser/layoutService'; import { IAddedViewDescriptorRef } from 'vs/workbench/browser/parts/views/views'; import { ViewletPanel } from 'vs/workbench/browser/parts/views/panelViewlet'; @@ -641,7 +641,7 @@ export class MaliciousExtensionChecker implements IWorkbenchContribution { constructor( @IExtensionManagementService private readonly extensionsManagementService: IExtensionManagementService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @ILogService private readonly logService: ILogService, @INotificationService private readonly notificationService: INotificationService, @IEnvironmentService private readonly environmentService: IEnvironmentService @@ -672,7 +672,7 @@ export class MaliciousExtensionChecker implements IWorkbenchContribution { localize('malicious warning', "We have uninstalled '{0}' which was reported to be problematic.", e.identifier.id), [{ label: localize('reloadNow', "Reload Now"), - run: () => this.windowService.reloadWindow() + run: () => this.hostService.reload() }], { sticky: true } ); diff --git a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts index 688ea065c5c..8b376218f2e 100644 --- a/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts +++ b/src/vs/workbench/contrib/relauncher/browser/relauncher.contribution.ts @@ -153,7 +153,7 @@ export class WorkspaceChangeExtHostRelauncher extends Disposable implements IWor constructor( @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @IExtensionService extensionService: IExtensionService, - @IWindowService windowService: IWindowService, + @IHostService hostService: IHostService, @IWorkbenchEnvironmentService environmentService: IWorkbenchEnvironmentService ) { super(); @@ -164,7 +164,7 @@ export class WorkspaceChangeExtHostRelauncher extends Disposable implements IWor } if (environmentService.configuration.remoteAuthority) { - windowService.reloadWindow(); // TODO@aeschli, workaround + hostService.reload(); // TODO@aeschli, workaround } else if (isNative) { extensionService.restartExtensionHost(); } diff --git a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts index 8c3f215e67d..685b171a285 100644 --- a/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts +++ b/src/vs/workbench/contrib/tasks/browser/abstractTaskService.ts @@ -33,7 +33,7 @@ import { IStorageService, StorageScope } from 'vs/platform/storage/common/storag import { IProgressService, IProgressOptions, ProgressLocation } from 'vs/platform/progress/common/progress'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { IDialogService, IConfirmationResult } from 'vs/platform/dialogs/common/dialogs'; @@ -218,7 +218,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer @IStorageService private readonly storageService: IStorageService, @IProgressService private readonly progressService: IProgressService, @IOpenerService private readonly openerService: IOpenerService, - @IWindowService private readonly _windowService: IWindowService, + @IHostService private readonly _hostService: IHostService, @IDialogService private readonly dialogService: IDialogService, @INotificationService private readonly notificationService: INotificationService, @IContextKeyService contextKeyService: IContextKeyService, @@ -252,7 +252,7 @@ export abstract class AbstractTaskService extends Disposable implements ITaskSer ), [{ label: nls.localize('reloadWindow', "Reload Window"), - run: () => this._windowService.reloadWindow() + run: () => this._hostService.reload() }], { sticky: true } ); diff --git a/src/vs/workbench/contrib/welcome/gettingStarted/browser/telemetryOptOut.ts b/src/vs/workbench/contrib/welcome/gettingStarted/browser/telemetryOptOut.ts index c942edef9c9..135bc48f22d 100644 --- a/src/vs/workbench/contrib/welcome/gettingStarted/browser/telemetryOptOut.ts +++ b/src/vs/workbench/contrib/welcome/gettingStarted/browser/telemetryOptOut.ts @@ -11,7 +11,7 @@ import { INotificationService, Severity } from 'vs/platform/notification/common/ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { onUnexpectedError } from 'vs/base/common/errors'; -import { IWindowService, IWindowsService } from 'vs/platform/windows/common/windows'; +import { IWindowService } from 'vs/platform/windows/common/windows'; import { IExperimentService, ExperimentState } from 'vs/workbench/contrib/experiments/common/experimentService'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { language, locale } from 'vs/base/common/platform'; @@ -30,7 +30,6 @@ export class TelemetryOptOut implements IWorkbenchContribution { @IOpenerService openerService: IOpenerService, @INotificationService private readonly notificationService: INotificationService, @IWindowService windowService: IWindowService, - @IWindowsService windowsService: IWindowsService, @IHostService hostService: IHostService, @ITelemetryService private readonly telemetryService: ITelemetryService, @IExperimentService private readonly experimentService: IExperimentService, diff --git a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts index 42c41ecaa8d..68613fcc9b0 100644 --- a/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts +++ b/src/vs/workbench/contrib/welcome/page/browser/welcomePage.ts @@ -42,6 +42,7 @@ import { ExtensionType } from 'vs/platform/extensions/common/extensions'; import { joinPath } from 'vs/base/common/resources'; import { IRecentlyOpened, isRecentWorkspace, IRecentWorkspace, IRecentFolder, isRecentFolder } from 'vs/platform/history/common/history'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; const configurationKey = 'workbench.startupEditor'; const oldConfigurationKey = 'workbench.welcome.enabled'; @@ -262,7 +263,8 @@ class WelcomePage extends Disposable { @IExtensionTipsService private readonly tipsService: IExtensionTipsService, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @ILifecycleService lifecycleService: ILifecycleService, - @ITelemetryService private readonly telemetryService: ITelemetryService + @ITelemetryService private readonly telemetryService: ITelemetryService, + @IHostService private readonly hostService: IHostService ) { super(); this._register(lifecycleService.onShutdown(() => this.dispose())); @@ -490,7 +492,7 @@ class WelcomePage extends Disposable { extensionId: extensionSuggestion.id, outcome: installedExtension ? 'enabled' : 'installed', }); - return this.windowService.reloadWindow(); + return this.hostService.reload(); }); } else { /* __GDPR__FRAGMENT__ diff --git a/src/vs/workbench/electron-browser/actions/windowActions.ts b/src/vs/workbench/electron-browser/actions/windowActions.ts index 1a5b349eba4..9d7a145fcdf 100644 --- a/src/vs/workbench/electron-browser/actions/windowActions.ts +++ b/src/vs/workbench/electron-browser/actions/windowActions.ts @@ -18,6 +18,7 @@ import { getIconClasses } from 'vs/editor/common/services/getIconClasses'; import { ICommandHandler } from 'vs/platform/commands/common/commands'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { IElectronService } from 'vs/platform/electron/node/electron'; export class CloseCurrentWindowAction extends Action { @@ -132,21 +133,21 @@ export class ZoomResetAction extends BaseZoomAction { } } -export class ReloadWindowWithExtensionsDisabledAction extends Action { +export class RestartWithExtensionsDisabledAction extends Action { - static readonly ID = 'workbench.action.reloadWindowWithExtensionsDisabled'; - static LABEL = nls.localize('reloadWindowWithExntesionsDisabled', "Reload Window With Extensions Disabled"); + static readonly ID = 'workbench.action.restartWithExtensionsDisabled'; + static LABEL = nls.localize('restartWithExtensionsDisabled', "Restart With Extensions Disabled"); constructor( id: string, label: string, - @IWindowService private readonly windowService: IWindowService + @IElectronService private readonly electronService: IElectronService ) { super(id, label); } async run(): Promise { - await this.windowService.reloadWindow({ _: [], 'disable-extensions': true }); + await this.electronService.relaunch({ addArgs: ['--disable-extensions'] }); return true; } diff --git a/src/vs/workbench/electron-browser/desktop.contribution.ts b/src/vs/workbench/electron-browser/desktop.contribution.ts index d224806265f..6fd7e5f3966 100644 --- a/src/vs/workbench/electron-browser/desktop.contribution.ts +++ b/src/vs/workbench/electron-browser/desktop.contribution.ts @@ -12,7 +12,7 @@ import { IWorkbenchActionRegistry, Extensions } from 'vs/workbench/common/action import { KeyMod, KeyChord, KeyCode } from 'vs/base/common/keyCodes'; import { isWindows, isLinux, isMacintosh } from 'vs/base/common/platform'; import { ToggleSharedProcessAction, ToggleDevToolsAction } from 'vs/workbench/electron-browser/actions/developerActions'; -import { ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, QuickSwitchWindow, ReloadWindowWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; +import { ZoomResetAction, ZoomOutAction, ZoomInAction, CloseCurrentWindowAction, SwitchWindow, QuickSwitchWindow, RestartWithExtensionsDisabledAction, NewWindowTabHandler, ShowPreviousWindowTabHandler, ShowNextWindowTabHandler, MoveWindowTabToNewWindowHandler, MergeWindowTabsHandlerHandler, ToggleWindowTabsBarHandler } from 'vs/workbench/electron-browser/actions/windowActions'; import { SaveWorkspaceAsAction, DuplicateWorkspaceInNewWindowAction, CloseWorkspaceAction } from 'vs/workbench/electron-browser/actions/workspaceActions'; import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry'; @@ -105,7 +105,7 @@ import { IWindowService, IWindowsService } from 'vs/platform/windows/common/wind (function registerDeveloperActions(): void { const developerCategory = nls.localize('developer', "Developer"); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleSharedProcessAction, ToggleSharedProcessAction.ID, ToggleSharedProcessAction.LABEL), 'Developer: Toggle Shared Process', developerCategory); - registry.registerWorkbenchAction(new SyncActionDescriptor(ReloadWindowWithExtensionsDisabledAction, ReloadWindowWithExtensionsDisabledAction.ID, ReloadWindowWithExtensionsDisabledAction.LABEL), 'Developer: Reload Window With Extensions Disabled', developerCategory); + registry.registerWorkbenchAction(new SyncActionDescriptor(RestartWithExtensionsDisabledAction, RestartWithExtensionsDisabledAction.ID, RestartWithExtensionsDisabledAction.LABEL), 'Developer: Restart With Extensions Disabled', developerCategory); registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleDevToolsAction, ToggleDevToolsAction.ID, ToggleDevToolsAction.LABEL), 'Developer: Toggle Developer Tools', developerCategory); KeybindingsRegistry.registerKeybindingRule({ diff --git a/src/vs/workbench/services/extensions/common/extensionUrlHandler.ts b/src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts similarity index 98% rename from src/vs/workbench/services/extensions/common/extensionUrlHandler.ts rename to src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts index 4299e57ff73..c969bd3df55 100644 --- a/src/vs/workbench/services/extensions/common/extensionUrlHandler.ts +++ b/src/vs/workbench/services/extensions/browser/extensionUrlHandler.ts @@ -16,7 +16,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { INotificationHandle, INotificationService, Severity } from 'vs/platform/notification/common/notification'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IURLHandler, IURLService } from 'vs/platform/url/common/url'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -65,7 +65,7 @@ class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { @INotificationService private readonly notificationService: INotificationService, @IExtensionManagementService private readonly extensionManagementService: IExtensionManagementService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService, - @IWindowService private readonly windowService: IWindowService, + @IHostService private readonly hostService: IHostService, @IExtensionGalleryService private readonly galleryService: IExtensionGalleryService, @IStorageService private readonly storageService: IStorageService, @IConfigurationService private readonly configurationService: IConfigurationService @@ -269,7 +269,7 @@ class ExtensionUrlHandler implements IExtensionUrlHandler, IURLHandler { private async reloadAndHandle(url: URI): Promise { this.storageService.store(URL_TO_HANDLE, JSON.stringify(url.toJSON()), StorageScope.WORKSPACE); - await this.windowService.reloadWindow(); + await this.hostService.reload(); } // forget about all uris buffered more than 5 minutes ago diff --git a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts index c838ef2cc88..246f9400a00 100644 --- a/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-browser/cachedExtensionScanner.ts @@ -19,7 +19,7 @@ import { IExtensionEnablementService } from 'vs/workbench/services/extensionMana import { BUILTIN_MANIFEST_CACHE_FILE, MANIFEST_CACHE_FOLDER, USER_MANIFEST_CACHE_FILE, ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import product from 'vs/platform/product/common/product'; import { INotificationService, Severity } from 'vs/platform/notification/common/notification'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { ExtensionScanner, ExtensionScannerInput, IExtensionReference, IExtensionResolver, IRelaxedExtensionDescription } from 'vs/workbench/services/extensions/node/extensionPoints'; import { Translations, ILog } from 'vs/workbench/services/extensions/common/extensionPoints'; @@ -55,7 +55,7 @@ export class CachedExtensionScanner { @INotificationService private readonly _notificationService: INotificationService, @IEnvironmentService private readonly _environmentService: IEnvironmentService, @IExtensionEnablementService private readonly _extensionEnablementService: IExtensionEnablementService, - @IWindowService private readonly _windowService: IWindowService, + @IHostService private readonly _hostService: IHostService, ) { this.scannedExtensions = new Promise((resolve, reject) => { this._scannedExtensionsResolve = resolve; @@ -78,7 +78,7 @@ export class CachedExtensionScanner { public async startScanningExtensions(log: ILog): Promise { try { const translations = await this.translationConfig; - const { system, user, development } = await CachedExtensionScanner._scanInstalledExtensions(this._windowService, this._notificationService, this._environmentService, this._extensionEnablementService, log, translations); + const { system, user, development } = await CachedExtensionScanner._scanInstalledExtensions(this._hostService, this._notificationService, this._environmentService, this._extensionEnablementService, log, translations); let result = new Map(); system.forEach((systemExtension) => { @@ -111,7 +111,7 @@ export class CachedExtensionScanner { } } - private static async _validateExtensionsCache(windowService: IWindowService, notificationService: INotificationService, environmentService: IEnvironmentService, cacheKey: string, input: ExtensionScannerInput): Promise { + private static async _validateExtensionsCache(hostService: IHostService, notificationService: INotificationService, environmentService: IEnvironmentService, cacheKey: string, input: ExtensionScannerInput): Promise { const cacheFolder = path.join(environmentService.userDataPath, MANIFEST_CACHE_FOLDER); const cacheFile = path.join(cacheFolder, cacheKey); @@ -141,7 +141,7 @@ export class CachedExtensionScanner { nls.localize('extensionCache.invalid', "Extensions have been modified on disk. Please reload the window."), [{ label: nls.localize('reloadWindow', "Reload Window"), - run: () => windowService.reloadWindow() + run: () => hostService.reload() }] ); } @@ -177,7 +177,7 @@ export class CachedExtensionScanner { } } - private static async _scanExtensionsWithCache(windowService: IWindowService, notificationService: INotificationService, environmentService: IEnvironmentService, cacheKey: string, input: ExtensionScannerInput, log: ILog): Promise { + private static async _scanExtensionsWithCache(hostService: IHostService, notificationService: INotificationService, environmentService: IEnvironmentService, cacheKey: string, input: ExtensionScannerInput, log: ILog): Promise { if (input.devMode) { // Do not cache when running out of sources... return ExtensionScanner.scanExtensions(input, log); @@ -195,7 +195,7 @@ export class CachedExtensionScanner { // Validate the cache asynchronously after 5s setTimeout(async () => { try { - await this._validateExtensionsCache(windowService, notificationService, environmentService, cacheKey, input); + await this._validateExtensionsCache(hostService, notificationService, environmentService, cacheKey, input); } catch (err) { errors.onUnexpectedError(err); } @@ -234,7 +234,7 @@ export class CachedExtensionScanner { } private static _scanInstalledExtensions( - windowService: IWindowService, + hostService: IHostService, notificationService: INotificationService, environmentService: IEnvironmentService, extensionEnablementService: IExtensionEnablementService, @@ -248,7 +248,7 @@ export class CachedExtensionScanner { const locale = platform.language; const builtinExtensions = this._scanExtensionsWithCache( - windowService, + hostService, notificationService, environmentService, BUILTIN_MANIFEST_CACHE_FILE, @@ -279,7 +279,7 @@ export class CachedExtensionScanner { extensionEnablementService.allUserExtensionsDisabled || !environmentService.extensionsPath ? Promise.resolve([]) : this._scanExtensionsWithCache( - windowService, + hostService, notificationService, environmentService, USER_MANIFEST_CACHE_FILE, diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts index 4ceaca310a8..843c3b7808b 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionHost.ts @@ -38,6 +38,7 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { IExtensionHostDebugService } from 'vs/platform/debug/common/extensionHostDebug'; import { IExtensionHostStarter } from 'vs/workbench/services/extensions/common/extensions'; import { isEqualOrParent } from 'vs/base/common/resources'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; export class ExtensionHostProcessWorker implements IExtensionHostStarter { @@ -74,7 +75,8 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { @ITelemetryService private readonly _telemetryService: ITelemetryService, @ILogService private readonly _logService: ILogService, @ILabelService private readonly _labelService: ILabelService, - @IExtensionHostDebugService private readonly _extensionHostDebugService: IExtensionHostDebugService + @IExtensionHostDebugService private readonly _extensionHostDebugService: IExtensionHostDebugService, + @IHostService private readonly _hostService: IHostService ) { const devOpts = parseExtensionDevOptions(this._environmentService); this._isExtensionDevHost = devOpts.isExtensionDevHost; @@ -101,7 +103,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { })); this._toDispose.add(this._extensionHostDebugService.onReload(event => { if (this._isExtensionDevHost && this._environmentService.debugExtensionHost.debugId === event.sessionId) { - this._windowService.reloadWindow(); + this._hostService.reload(); } })); @@ -234,7 +236,7 @@ export class ExtensionHostProcessWorker implements IExtensionHostStarter { this._notificationService.prompt(Severity.Warning, msg, [{ label: nls.localize('reloadWindow', "Reload Window"), - run: () => this._windowService.reloadWindow() + run: () => this._hostService.reload() }], { sticky: true } ); diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 5f136395290..8e5a42159bb 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -69,7 +69,8 @@ export class ExtensionService extends AbstractExtensionService implements IExten @ILifecycleService private readonly _lifecycleService: ILifecycleService, @IWindowService protected readonly _windowService: IWindowService, @IStaticExtensionsService private readonly _staticExtensions: IStaticExtensionsService, - @IElectronService private readonly _electronService: IElectronService + @IElectronService private readonly _electronService: IElectronService, + @IHostService private readonly _hostService: IHostService ) { super( instantiationService, @@ -85,7 +86,7 @@ export class ExtensionService extends AbstractExtensionService implements IExten this._notificationService.prompt(Severity.Info, nls.localize('extensionsDisabled', "All installed extensions are temporarily disabled. Reload the window to return to the previous state."), [{ label: nls.localize('Reload', "Reload"), run: () => { - this._windowService.reloadWindow(); + this._hostService.reload(); } }]); } diff --git a/src/vs/workbench/services/host/browser/browserHostService.ts b/src/vs/workbench/services/host/browser/browserHostService.ts index ca0ded0846f..a5fdc02a5e1 100644 --- a/src/vs/workbench/services/host/browser/browserHostService.ts +++ b/src/vs/workbench/services/host/browser/browserHostService.ts @@ -64,6 +64,10 @@ export class BrowserHostService implements IHostService { //#endregion async restart(): Promise { + this.reload(); + } + + async reload(): Promise { window.location.reload(); } } diff --git a/src/vs/workbench/services/host/browser/host.ts b/src/vs/workbench/services/host/browser/host.ts index 036f77f068b..0e36ce74c48 100644 --- a/src/vs/workbench/services/host/browser/host.ts +++ b/src/vs/workbench/services/host/browser/host.ts @@ -31,6 +31,7 @@ export interface IHostService { //#region Lifecycle restart(): Promise; + reload(): Promise; //#endregion } diff --git a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts index 7ef6a1c24c5..13c2f6964af 100644 --- a/src/vs/workbench/services/host/electron-browser/desktopHostService.ts +++ b/src/vs/workbench/services/host/electron-browser/desktopHostService.ts @@ -30,6 +30,10 @@ export class DesktopHostService implements IHostService { restart(): Promise { return this.electronService.relaunch(); } + + reload(): Promise { + return this.electronService.reload(); + } } registerSingleton(IHostService, DesktopHostService, true); diff --git a/src/vs/workbench/services/update/browser/updateService.ts b/src/vs/workbench/services/update/browser/updateService.ts index 99ae2f77558..afdb075fe0b 100644 --- a/src/vs/workbench/services/update/browser/updateService.ts +++ b/src/vs/workbench/services/update/browser/updateService.ts @@ -7,7 +7,7 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IUpdateService, State, UpdateType } from 'vs/platform/update/common/update'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { IWindowService } from 'vs/platform/windows/common/windows'; +import { IHostService } from 'vs/workbench/services/host/browser/host'; import { Disposable } from 'vs/base/common/lifecycle'; export interface IUpdate { @@ -40,7 +40,7 @@ export class UpdateService extends Disposable implements IUpdateService { constructor( @IWorkbenchEnvironmentService private readonly environmentService: IWorkbenchEnvironmentService, - @IWindowService private readonly windowService: IWindowService + @IHostService private readonly hostService: IHostService ) { super(); @@ -84,11 +84,11 @@ export class UpdateService extends Disposable implements IUpdateService { } async applyUpdate(): Promise { - this.windowService.reloadWindow(); + this.hostService.reload(); } async quitAndInstall(): Promise { - this.windowService.reloadWindow(); + this.hostService.reload(); } } diff --git a/src/vs/workbench/services/window/electron-browser/windowService.ts b/src/vs/workbench/services/window/electron-browser/windowService.ts index d713803b151..4adb44a6a7e 100644 --- a/src/vs/workbench/services/window/electron-browser/windowService.ts +++ b/src/vs/workbench/services/window/electron-browser/windowService.ts @@ -7,7 +7,6 @@ import { Event } from 'vs/base/common/event'; import { IWindowService, IWindowsService, 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'; import { URI } from 'vs/base/common/uri'; import { Disposable } from 'vs/base/common/lifecycle'; import { ILabelService } from 'vs/platform/label/common/label'; @@ -53,10 +52,6 @@ export class WindowService extends Disposable implements IWindowService { return this._windowId; } - reloadWindow(args?: ParsedArgs): Promise { - return this.windowsService.reloadWindow(this.windowId, args); - } - closeWorkspace(): Promise { return this.windowsService.closeWorkspace(this.windowId); } diff --git a/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts b/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts index ad09d02f6ea..8d340e0df2c 100644 --- a/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts +++ b/src/vs/workbench/services/workspace/browser/workspaceEditingService.ts @@ -415,7 +415,7 @@ export class WorkspaceEditingService implements IWorkspaceEditingService { // TODO@aeschli: workaround until restarting works if (this.environmentService.configuration.remoteAuthority) { - this.windowService.reloadWindow(); + this.hostService.reload(); } // Restart the extension host: entering a workspace means a new location for diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 20e8d2f8383..eee0b0bf01a 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1196,10 +1196,6 @@ export class TestWindowService implements IWindowService { return Promise.resolve(false); } - reloadWindow(): Promise { - return Promise.resolve(); - } - closeWorkspace(): Promise { return Promise.resolve(); } @@ -1318,10 +1314,6 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(false); } - reloadWindow(_windowId: number): Promise { - return Promise.resolve(); - } - closeWorkspace(_windowId: number): Promise { return Promise.resolve(); } @@ -1542,6 +1534,7 @@ export class TestHostService implements IHostService { windowCount = Promise.resolve(1); restart(): Promise { return Promise.resolve(); } + reload(): Promise { return Promise.resolve(); } openEmptyWindow(options?: { reuse?: boolean }): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index 01fb2860af9..6086bc3cd75 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -56,7 +56,7 @@ import 'vs/workbench/browser/parts/views/views'; //#region --- workbench services -import 'vs/workbench/services/extensions/common/extensionUrlHandler'; +import 'vs/workbench/services/extensions/browser/extensionUrlHandler'; import 'vs/workbench/services/bulkEdit/browser/bulkEditService'; import 'vs/workbench/services/keybinding/common/keybindingEditing'; import 'vs/workbench/services/decorations/browser/decorationsService';