diff --git a/src/vs/platform/electron/electron-main/electronMainService.ts b/src/vs/platform/electron/electron-main/electronMainService.ts index 54780c5ba48..bbc04080f59 100644 --- a/src/vs/platform/electron/electron-main/electronMainService.ts +++ b/src/vs/platform/electron/electron-main/electronMainService.ts @@ -94,4 +94,15 @@ export class ElectronMainService implements IElectronService { } } } + + async resolveProxy(url: string): Promise { + return new Promise(resolve => { + const window = this.window; + if (window && window.win && window.win.webContents && window.win.webContents.session) { + window.win.webContents.session.resolveProxy(url, proxy => resolve(proxy)); + } else { + resolve(); + } + }); + } } diff --git a/src/vs/platform/electron/node/electron.ts b/src/vs/platform/electron/node/electron.ts index c48fb8817b1..07c6b44ee05 100644 --- a/src/vs/platform/electron/node/electron.ts +++ b/src/vs/platform/electron/node/electron.ts @@ -34,4 +34,7 @@ export interface IElectronService { // Development openDevTools(options?: OpenDevToolsOptions): Promise; toggleDevTools(): Promise; + + // Connectivity + resolveProxy(url: string): Promise; } diff --git a/src/vs/platform/request/browser/requestService.ts b/src/vs/platform/request/browser/requestService.ts index 75c01b89111..76c608ad819 100644 --- a/src/vs/platform/request/browser/requestService.ts +++ b/src/vs/platform/request/browser/requestService.ts @@ -8,12 +8,13 @@ import { CancellationToken } from 'vs/base/common/cancellation'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ILogService } from 'vs/platform/log/common/log'; import { request } from 'vs/base/parts/request/browser/request'; +import { IRequestService } from 'vs/platform/request/common/request'; /** * This service exposes the `request` API, while using the global * or configured proxy settings. */ -export class RequestService { +export class RequestService implements IRequestService { _serviceBrand: undefined; @@ -32,4 +33,8 @@ export class RequestService { return request(options, token); } + + async resolveProxy(url: string): Promise { + return undefined; // not implemented in the web + } } diff --git a/src/vs/platform/request/common/request.ts b/src/vs/platform/request/common/request.ts index 2735ab1a20f..2bd8f1d7706 100644 --- a/src/vs/platform/request/common/request.ts +++ b/src/vs/platform/request/common/request.ts @@ -17,6 +17,8 @@ export interface IRequestService { _serviceBrand: undefined; request(options: IRequestOptions, token: CancellationToken): Promise; + + resolveProxy(url: string): Promise; } function isSuccess(context: IRequestContext): boolean { diff --git a/src/vs/platform/request/node/requestService.ts b/src/vs/platform/request/node/requestService.ts index 549f5033754..a5a4c033268 100644 --- a/src/vs/platform/request/node/requestService.ts +++ b/src/vs/platform/request/node/requestService.ts @@ -141,7 +141,9 @@ export class RequestService extends Disposable implements IRequestService { e(canceled()); }); }); - } + async resolveProxy(url: string): Promise { + return undefined; // currently not implemented in node + } } diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index ea47eb39278..dd05ccd2f8a 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -141,8 +141,6 @@ export interface IWindowsService { // TODO: this is a bit backwards startCrashReporter(config: CrashReporterStartOptions): Promise; - - resolveProxy(windowId: number, url: string): Promise; } export const IWindowService = createDecorator('windowService'); @@ -220,7 +218,6 @@ export interface IWindowService { unmaximizeWindow(): Promise; minimizeWindow(): Promise; onWindowTitleDoubleClick(): Promise; - resolveProxy(url: string): Promise; } export type MenuBarVisibility = 'default' | 'visible' | 'toggle' | 'hidden'; diff --git a/src/vs/platform/windows/common/windowsIpc.ts b/src/vs/platform/windows/common/windowsIpc.ts index e6305ff32e0..657b9529fdd 100644 --- a/src/vs/platform/windows/common/windowsIpc.ts +++ b/src/vs/platform/windows/common/windowsIpc.ts @@ -100,7 +100,6 @@ export class WindowsChannel implements IServerChannel { case 'getActiveWindowId': return this.service.getActiveWindowId(); case 'openExternal': return this.service.openExternal(arg); case 'startCrashReporter': return this.service.startCrashReporter(arg); - case 'resolveProxy': return this.service.resolveProxy(arg[0], arg[1]); } throw new Error(`Call not found: ${command}`); diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index 05224051390..e375526b32b 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -193,8 +193,4 @@ export class WindowsService implements IWindowsService { updateTouchBar(windowId: number, items: ISerializableCommandAction[][]): Promise { return this.channel.call('updateTouchBar', [windowId, items]); } - - resolveProxy(windowId: number, url: string): Promise { - return Promise.resolve(this.channel.call('resolveProxy', [windowId, url])); - } } diff --git a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts index da3308be5b6..98034eb8348 100644 --- a/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts +++ b/src/vs/platform/windows/electron-main/legacyWindowsMainService.ts @@ -337,19 +337,6 @@ export class LegacyWindowsMainService extends Disposable implements IWindowsServ this.windowsMainService.open({ context: OpenContext.API, cli, urisToOpen, gotoLineMode: true }); } - async resolveProxy(windowId: number, url: string): Promise { - return new Promise(resolve => { - const codeWindow = this.windowsMainService.getWindowById(windowId); - if (codeWindow) { - codeWindow.win.webContents.session.resolveProxy(url, proxy => { - resolve(proxy); - }); - } else { - resolve(); - } - }); - } - private withWindow(windowId: number, fn: (window: ICodeWindow) => T, fallback?: () => T): T | undefined { const codeWindow = this.windowsMainService.getWindowById(windowId); if (codeWindow) { diff --git a/src/vs/workbench/api/browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts index 11b31a4edda..f26b4091428 100644 --- a/src/vs/workbench/api/browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -12,7 +12,6 @@ import { isNative } from 'vs/base/common/platform'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { ILabelService } from 'vs/platform/label/common/label'; import { IFileMatch, IPatternInfo, ISearchProgressItem, ISearchService } from 'vs/workbench/services/search/common/search'; -import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkspaceContextService, WorkbenchState, IWorkspace } from 'vs/platform/workspace/common/workspace'; import { extHostNamedCustomer } from 'vs/workbench/api/common/extHostCustomers'; import { ITextQueryBuilderOptions, QueryBuilder } from 'vs/workbench/contrib/search/common/queryBuilder'; @@ -24,6 +23,7 @@ import { isEqualOrParent } from 'vs/base/common/resources'; import { INotificationService } from 'vs/platform/notification/common/notification'; import { withNullAsUndefined } from 'vs/base/common/types'; import { IFileService } from 'vs/platform/files/common/files'; +import { IRequestService } from 'vs/platform/request/common/request'; @extHostNamedCustomer(MainContext.MainThreadWorkspace) export class MainThreadWorkspace implements MainThreadWorkspaceShape { @@ -40,7 +40,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { @ITextFileService private readonly _textFileService: ITextFileService, @IWorkspaceEditingService private readonly _workspaceEditingService: IWorkspaceEditingService, @INotificationService private readonly _notificationService: INotificationService, - @IWindowService private readonly _windowService: IWindowService, + @IRequestService private readonly _requestService: IRequestService, @IInstantiationService private readonly _instantiationService: IInstantiationService, @ILabelService private readonly _labelService: ILabelService, @IEnvironmentService private readonly _environmentService: IEnvironmentService, @@ -218,6 +218,6 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { } $resolveProxy(url: string): Promise { - return this._windowService.resolveProxy(url); + return this._requestService.resolveProxy(url); } } diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index edd7a149463..34134454c1b 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -267,10 +267,6 @@ export class SimpleWindowService extends Disposable implements IWindowService { updateTouchBar(_items: ISerializableCommandAction[][]): Promise { return Promise.resolve(); } - - resolveProxy(url: string): Promise { - return Promise.resolve(undefined); - } } registerSingleton(IWindowService, SimpleWindowService); @@ -433,10 +429,6 @@ export class SimpleWindowsService implements IWindowsService { startCrashReporter(_config: CrashReporterStartOptions): Promise { return Promise.resolve(); } - - resolveProxy(windowId: number, url: string): Promise { - return Promise.resolve(undefined); - } } registerSingleton(IWindowsService, SimpleWindowsService); diff --git a/src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts b/src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts index e6ca4e0869b..f4f8c3bc578 100644 --- a/src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts +++ b/src/vs/workbench/contrib/stats/electron-browser/workspaceStats.ts @@ -9,13 +9,13 @@ import { URI } from 'vs/base/common/uri'; import { IFileService, IFileStat } from 'vs/platform/files/common/files'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace'; -import { IWindowService } from 'vs/platform/windows/common/windows'; import { IWorkbenchContribution } from 'vs/workbench/common/contributions'; import { endsWith } from 'vs/base/common/strings'; import { ITextFileService, } from 'vs/workbench/services/textfile/common/textfiles'; import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService'; import { IWorkspaceStatsService, Tags } from 'vs/workbench/contrib/stats/common/workspaceStats'; import { IWorkspaceInformation } from 'vs/platform/diagnostics/common/diagnostics'; +import { IRequestService } from 'vs/platform/request/common/request'; const SshProtocolMatcher = /^([^@:]+@)?([^:]+):/; const SshUrlMatcher = /^([^@:]+@)?([^:]+):(.+)$/; @@ -142,7 +142,7 @@ export class WorkspaceStats implements IWorkbenchContribution { @IFileService private readonly fileService: IFileService, @IWorkspaceContextService private readonly contextService: IWorkspaceContextService, @ITelemetryService private readonly telemetryService: ITelemetryService, - @IWindowService private readonly windowService: IWindowService, + @IRequestService private readonly requestService: IRequestService, @ITextFileService private readonly textFileService: ITextFileService, @ISharedProcessService private readonly sharedProcessService: ISharedProcessService, @IWorkspaceStatsService private readonly workspaceStatsService: IWorkspaceStatsService @@ -312,7 +312,7 @@ export class WorkspaceStats implements IWorkbenchContribution { } private reportProxyStats() { - this.windowService.resolveProxy('https://www.example.com/') + this.requestService.resolveProxy('https://www.example.com/') .then(proxy => { let type = proxy ? String(proxy).trim().split(/\s+/, 1)[0] : 'EMPTY'; if (['DIRECT', 'PROXY', 'HTTPS', 'SOCKS', 'EMPTY'].indexOf(type) === -1) { diff --git a/src/vs/workbench/services/host/browser/host.ts b/src/vs/workbench/services/host/browser/host.ts index 9345152db42..b07b74c29c9 100644 --- a/src/vs/workbench/services/host/browser/host.ts +++ b/src/vs/workbench/services/host/browser/host.ts @@ -26,5 +26,9 @@ export interface IHostService { //#endregion + //#region Lifecycle + restart(): Promise; + + //#endregion } diff --git a/src/vs/workbench/services/request/browser/requestService.ts b/src/vs/workbench/services/request/browser/requestService.ts index 13450f58132..4a1351d1346 100644 --- a/src/vs/workbench/services/request/browser/requestService.ts +++ b/src/vs/workbench/services/request/browser/requestService.ts @@ -9,9 +9,11 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur import { ILogService } from 'vs/platform/log/common/log'; import { RequestChannelClient } from 'vs/platform/request/common/requestIpc'; import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService'; -import { RequestService as BrowserRequestService } from 'vs/platform/request/browser/requestService'; +import { RequestService } from 'vs/platform/request/browser/requestService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IRequestService } from 'vs/platform/request/common/request'; -export class RequestService extends BrowserRequestService { +export class BrowserRequestService extends RequestService { private readonly remoteRequestChannel: RequestChannelClient | null; @@ -40,5 +42,6 @@ export class RequestService extends BrowserRequestService { throw error; } } - } + +registerSingleton(IRequestService, BrowserRequestService, true); diff --git a/src/vs/workbench/services/request/electron-browser/requestService.ts b/src/vs/workbench/services/request/electron-browser/requestService.ts new file mode 100644 index 00000000000..ad433fbcd2a --- /dev/null +++ b/src/vs/workbench/services/request/electron-browser/requestService.ts @@ -0,0 +1,28 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { ILogService } from 'vs/platform/log/common/log'; +import { RequestService } from 'vs/platform/request/browser/requestService'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { IRequestService } from 'vs/platform/request/common/request'; +import { IElectronService } from 'vs/platform/electron/node/electron'; + +export class NativeRequestService extends RequestService { + + constructor( + @IConfigurationService configurationService: IConfigurationService, + @ILogService logService: ILogService, + @IElectronService private electronService: IElectronService + ) { + super(configurationService, logService); + } + + async resolveProxy(url: string): Promise { + return this.electronService.resolveProxy(url); + } +} + +registerSingleton(IRequestService, NativeRequestService, true); diff --git a/src/vs/workbench/services/window/electron-browser/windowService.ts b/src/vs/workbench/services/window/electron-browser/windowService.ts index 07df06e586a..c28769bd553 100644 --- a/src/vs/workbench/services/window/electron-browser/windowService.ts +++ b/src/vs/workbench/services/window/electron-browser/windowService.ts @@ -133,10 +133,6 @@ export class WindowService extends Disposable implements IWindowService { return this.windowsService.updateTouchBar(this.windowId, items); } - resolveProxy(url: string): Promise { - return this.windowsService.resolveProxy(this.windowId, url); - } - private getRecentLabel(u: IURIToOpen): string { if (isFolderToOpen(u)) { return this.labelService.getWorkspaceLabel(u.folderUri, { verbose: true }); diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 1f3d59abf1c..59a1d2a712f 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -1266,10 +1266,6 @@ export class TestWindowService implements IWindowService { updateTouchBar(_items: ISerializableCommandAction[][]): Promise { return Promise.resolve(); } - - resolveProxy(url: string): Promise { - return Promise.resolve(undefined); - } } export class TestLifecycleService implements ILifecycleService { @@ -1464,10 +1460,6 @@ export class TestWindowsService implements IWindowsService { startCrashReporter(_config: CrashReporterStartOptions): Promise { return Promise.resolve(); } - - resolveProxy(windowId: number, url: string): Promise { - return Promise.resolve(undefined); - } } export class TestTextResourceConfigurationService implements ITextResourceConfigurationService { diff --git a/src/vs/workbench/workbench.desktop.main.ts b/src/vs/workbench/workbench.desktop.main.ts index 0f8210140cd..c798a95e0bb 100644 --- a/src/vs/workbench/workbench.desktop.main.ts +++ b/src/vs/workbench/workbench.desktop.main.ts @@ -51,12 +51,11 @@ import 'vs/workbench/services/url/electron-browser/urlService'; import 'vs/workbench/services/workspace/electron-browser/workspacesService'; import 'vs/workbench/services/userDataSync/electron-browser/userDataSyncService'; import 'vs/workbench/services/host/electron-browser/desktopHostService'; +import 'vs/workbench/services/request/electron-browser/requestService'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { ClipboardService } from 'vs/platform/clipboard/electron-browser/clipboardService'; -import { IRequestService } from 'vs/platform/request/common/request'; -import { RequestService } from 'vs/platform/request/browser/requestService'; import { LifecycleService } from 'vs/platform/lifecycle/electron-browser/lifecycleService'; import { ILifecycleService } from 'vs/platform/lifecycle/common/lifecycle'; import { ILocalizationsService } from 'vs/platform/localizations/common/localizations'; @@ -74,7 +73,6 @@ import { IElectronService } from 'vs/platform/electron/node/electron'; import { ElectronService } from 'vs/platform/electron/electron-browser/electronService'; registerSingleton(IClipboardService, ClipboardService, true); -registerSingleton(IRequestService, RequestService, true); registerSingleton(ILifecycleService, LifecycleService); registerSingleton(ILocalizationsService, LocalizationsService); registerSingleton(ISharedProcessService, SharedProcessService, true); diff --git a/src/vs/workbench/workbench.web.main.ts b/src/vs/workbench/workbench.web.main.ts index 209a7ac4b94..537b28b7967 100644 --- a/src/vs/workbench/workbench.web.main.ts +++ b/src/vs/workbench/workbench.web.main.ts @@ -43,11 +43,10 @@ import 'vs/workbench/contrib/stats/browser/workspaceStatsService'; import 'vs/workbench/services/workspace/browser/workspacesService'; import 'vs/workbench/services/dialogs/browser/dialogService'; import 'vs/workbench/services/host/browser/browserHostService'; +import 'vs/workbench/services/request/browser/requestService'; import 'vs/workbench/browser/web.simpleservices'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; -import { IRequestService } from 'vs/platform/request/common/request'; -import { RequestService } from 'vs/workbench/services/request/browser/requestService'; import { IClipboardService } from 'vs/platform/clipboard/common/clipboardService'; import { BrowserClipboardService } from 'vs/platform/clipboard/browser/clipboardService'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; @@ -66,7 +65,6 @@ import { IUserDataSyncStoreService, IUserDataSyncService } from 'vs/platform/use import { UserDataSyncStoreService } from 'vs/platform/userDataSync/common/userDataSyncStoreService'; import { UserDataSyncService } from 'vs/platform/userDataSync/common/userDataSyncService'; -registerSingleton(IRequestService, RequestService, true); registerSingleton(IExtensionManagementService, ExtensionManagementService); registerSingleton(IBackupFileService, BackupFileService); registerSingleton(IClipboardService, BrowserClipboardService, true);