diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index e2a5b65a496..3c6ddd175d0 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -47,6 +47,7 @@ import { RemoteAuthorityResolverService } from 'vs/platform/remote/node/remoteAu import { IRemoteAuthorityResolverService } from 'vs/platform/remote/common/remoteAuthorityResolver'; import { RemoteAuthorityResolverChannel } from 'vs/platform/remote/node/remoteAuthorityResolverChannel'; import { StaticRouter } from 'vs/base/parts/ipc/node/ipc'; +import { DefaultURITransformer } from 'vs/base/common/uriIpc'; export interface ISharedProcessConfiguration { readonly machineId: string; @@ -141,7 +142,7 @@ function main(server: Server, initData: ISharedProcessInitData, configuration: I server.registerChannel('remoteAuthorityResolver', remoteAuthorityResolverChannel); const extensionManagementService = accessor.get(IExtensionManagementService); - const channel = new ExtensionManagementChannel(extensionManagementService); + const channel = new ExtensionManagementChannel(extensionManagementService, () => DefaultURITransformer); server.registerChannel('extensions', channel); // clean up deprecated extensions diff --git a/src/vs/platform/download/node/downloadIpc.ts b/src/vs/platform/download/node/downloadIpc.ts index 9eb24d0f3e7..8d082d30fb8 100644 --- a/src/vs/platform/download/node/downloadIpc.ts +++ b/src/vs/platform/download/node/downloadIpc.ts @@ -45,10 +45,10 @@ export class DownloadServiceChannelClient implements IDownloadService { _serviceBrand: any; - constructor(private channel: IChannel, private uriTransformer: IURITransformer) { } + constructor(private channel: IChannel, private getUriTransformer: () => IURITransformer) { } download(from: URI, to: string): Promise { - from = this.uriTransformer.transformOutgoing(from); + from = this.getUriTransformer().transformOutgoing(from); const dirName = path.dirname(to); let out: fs.WriteStream; return new Promise((c, e) => { diff --git a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts index 3d31fdf08d6..8c2303550bf 100644 --- a/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts +++ b/src/vs/platform/extensionManagement/node/extensionManagementIpc.ts @@ -16,17 +16,18 @@ export class ExtensionManagementChannel implements IServerChannel { onUninstallExtension: Event; onDidUninstallExtension: Event; - constructor(private service: IExtensionManagementService) { + constructor(private service: IExtensionManagementService, private getUriTransformer: (requestContext: any) => IURITransformer) { this.onInstallExtension = buffer(service.onInstallExtension, true); this.onDidInstallExtension = buffer(service.onDidInstallExtension, true); this.onUninstallExtension = buffer(service.onUninstallExtension, true); this.onDidUninstallExtension = buffer(service.onDidUninstallExtension, true); } - listen(_, event: string): Event { + listen(context, event: string): Event { + const uriTransformer = this.getUriTransformer(context); switch (event) { case 'onInstallExtension': return this.onInstallExtension; - case 'onDidInstallExtension': return this.onDidInstallExtension; + case 'onDidInstallExtension': return mapEvent(this.onDidInstallExtension, i => ({ ...i, local: this._transformOutgoing(i.local, uriTransformer) })); case 'onUninstallExtension': return this.onUninstallExtension; case 'onDidUninstallExtension': return this.onDidUninstallExtension; } @@ -34,24 +35,31 @@ export class ExtensionManagementChannel implements IServerChannel { throw new Error('Invalid listen'); } - call(_, command: string, args?: any): Thenable { + call(context, command: string, args?: any): Thenable { + const uriTransformer = this.getUriTransformer(context); switch (command) { - case 'zip': return this.service.zip(this._transform(args[0])); - case 'unzip': return this.service.unzip(URI.revive(args[0]), args[1]); - case 'install': return this.service.install(URI.revive(args[0])); + case 'zip': return this.service.zip(this._transformIncoming(args[0], uriTransformer)).then(uri => uriTransformer.transformOutgoing(uri)); + case 'unzip': return this.service.unzip(URI.revive(uriTransformer.transformIncoming(args[0])), args[1]); + case 'install': return this.service.install(URI.revive(uriTransformer.transformIncoming(args[0]))); case 'installFromGallery': return this.service.installFromGallery(args[0]); - case 'uninstall': return this.service.uninstall(this._transform(args[0]), args[1]); - case 'reinstallFromGallery': return this.service.reinstallFromGallery(this._transform(args[0])); - case 'getInstalled': return this.service.getInstalled(args[0]); - case 'updateMetadata': return this.service.updateMetadata(this._transform(args[0]), args[1]); + case 'uninstall': return this.service.uninstall(this._transformIncoming(args[0], uriTransformer), args[1]); + case 'reinstallFromGallery': return this.service.reinstallFromGallery(this._transformIncoming(args[0], uriTransformer)); + case 'getInstalled': return this.service.getInstalled(args[0]).then(extensions => extensions.map(e => this._transformOutgoing(e, uriTransformer))); + case 'updateMetadata': return this.service.updateMetadata(this._transformIncoming(args[0], uriTransformer), args[1]).then(e => this._transformOutgoing(e, uriTransformer)); case 'getExtensionsReport': return this.service.getExtensionsReport(); } throw new Error('Invalid call'); } - private _transform(extension: ILocalExtension): ILocalExtension { - return extension ? { ...extension, ...{ location: URI.revive(extension.location) } } : extension; + private _transformIncoming(extension: ILocalExtension, uriTransformer: IURITransformer): ILocalExtension { + return extension ? { ...extension, ...{ location: URI.revive(uriTransformer.transformIncoming(extension.location)) } } : extension; + } + + private _transformOutgoing(extension: ILocalExtension, uriTransformer: IURITransformer): ILocalExtension; + private _transformOutgoing(extension: ILocalExtension | undefined, uriTransformer: IURITransformer): ILocalExtension | undefined; + private _transformOutgoing(extension: ILocalExtension | undefined, uriTransformer: IURITransformer): ILocalExtension | undefined { + return extension ? { ...extension, ...{ location: uriTransformer.transformOutgoing(extension.location) } } : extension; } } @@ -59,7 +67,7 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer _serviceBrand: any; - constructor(private channel: IChannel, private uriTransformer: IURITransformer) { } + constructor(private channel: IChannel) { } get onInstallExtension(): Event { return this.channel.listen('onInstallExtension'); } get onDidInstallExtension(): Event { return mapEvent(this.channel.listen('onDidInstallExtension'), i => ({ ...i, local: this._transformIncoming(i.local) })); } @@ -67,15 +75,15 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer get onDidUninstallExtension(): Event { return this.channel.listen('onDidUninstallExtension'); } zip(extension: ILocalExtension): Promise { - return Promise.resolve(this.channel.call('zip', [this._transformOutgoing(extension)]).then(result => URI.revive(this.uriTransformer.transformIncoming(result)))); + return Promise.resolve(this.channel.call('zip', [extension]).then(result => URI.revive(result))); } unzip(zipLocation: URI, type: LocalExtensionType): Promise { - return Promise.resolve(this.channel.call('unzip', [this.uriTransformer.transformOutgoing(zipLocation), type])); + return Promise.resolve(this.channel.call('unzip', [zipLocation, type])); } install(vsix: URI): Promise { - return Promise.resolve(this.channel.call('install', [this.uriTransformer.transformOutgoing(vsix)])); + return Promise.resolve(this.channel.call('install', [vsix])); } installFromGallery(extension: IGalleryExtension): Promise { @@ -83,11 +91,11 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer } uninstall(extension: ILocalExtension, force = false): Promise { - return Promise.resolve(this.channel.call('uninstall', [this._transformOutgoing(extension)!, force])); + return Promise.resolve(this.channel.call('uninstall', [extension!, force])); } reinstallFromGallery(extension: ILocalExtension): Promise { - return Promise.resolve(this.channel.call('reinstallFromGallery', [this._transformOutgoing(extension)])); + return Promise.resolve(this.channel.call('reinstallFromGallery', [extension])); } getInstalled(type: LocalExtensionType | null = null): Promise { @@ -96,7 +104,7 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer } updateMetadata(local: ILocalExtension, metadata: IGalleryMetadata): Promise { - return Promise.resolve(this.channel.call('updateMetadata', [this._transformOutgoing(local), metadata])) + return Promise.resolve(this.channel.call('updateMetadata', [local, metadata])) .then(extension => this._transformIncoming(extension)); } @@ -107,13 +115,6 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer private _transformIncoming(extension: ILocalExtension): ILocalExtension; private _transformIncoming(extension: ILocalExtension | undefined): ILocalExtension | undefined; private _transformIncoming(extension: ILocalExtension | undefined): ILocalExtension | undefined { - return extension ? { ...extension, ...{ location: URI.revive(this.uriTransformer.transformIncoming(extension.location)) } } : extension; + return extension ? { ...extension, ...{ location: URI.revive(extension.location) } } : extension; } - - private _transformOutgoing(extension: ILocalExtension): ILocalExtension; - private _transformOutgoing(extension: ILocalExtension | undefined): ILocalExtension | undefined; - private _transformOutgoing(extension: ILocalExtension | undefined): ILocalExtension | undefined { - return extension ? { ...extension, ...{ location: this.uriTransformer.transformOutgoing(extension.location) } } : extension; - } - } \ No newline at end of file diff --git a/src/vs/workbench/electron-browser/shell.ts b/src/vs/workbench/electron-browser/shell.ts index 359f095b2af..21ea489dee4 100644 --- a/src/vs/workbench/electron-browser/shell.ts +++ b/src/vs/workbench/electron-browser/shell.ts @@ -94,7 +94,6 @@ import { IOpenerService } from 'vs/platform/opener/common/opener'; import { OpenerService } from 'vs/editor/browser/services/openerService'; import { SearchHistoryService } from 'vs/workbench/services/search/node/searchHistoryService'; import { ExtensionManagementServerService } from 'vs/workbench/services/extensions/node/extensionManagementServerService'; -import { DefaultURITransformer } from 'vs/base/common/uriIpc'; import { ExtensionGalleryService } from 'vs/platform/extensionManagement/node/extensionGalleryService'; import { LogLevelSetterChannel } from 'vs/platform/log/node/logIpc'; import { ILabelService, LabelService } from 'vs/platform/label/common/label'; @@ -471,7 +470,7 @@ export class WorkbenchShell extends Disposable { } const extensionManagementChannel = getDelayedChannel(sharedProcess.then(c => c.getChannel('extensions'))); - const extensionManagementChannelClient = new ExtensionManagementChannelClient(extensionManagementChannel, DefaultURITransformer); + const extensionManagementChannelClient = new ExtensionManagementChannelClient(extensionManagementChannel); serviceCollection.set(IExtensionManagementServerService, new SyncDescriptor(ExtensionManagementServerService, [extensionManagementChannelClient])); serviceCollection.set(IExtensionManagementService, new SyncDescriptor(MulitExtensionManagementService));