diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts index e5d5553f9e3..8f3331b6e85 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsViewlet.ts @@ -40,8 +40,6 @@ import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/edi import { IEditorGroupService } from 'vs/workbench/services/group/common/groupService'; import { IMessageService, CloseAction } from 'vs/platform/message/common/message'; import Severity from 'vs/base/common/severity'; -import { IURLService } from 'vs/platform/url/common/url'; -import URI from 'vs/base/common/uri'; import { IActivityService, ProgressBadge, NumberBadge } from 'vs/workbench/services/activity/common/activityService'; interface SearchInputEvent extends Event { @@ -70,7 +68,6 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { @IWorkbenchEditorService private editorService: IWorkbenchEditorService, @IEditorGroupService private editorInputService: IEditorGroupService, @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService, - @IURLService urlService: IURLService, @IExtensionTipsService private tipsService: IExtensionTipsService, @IMessageService private messageService: IMessageService, @IViewletService private viewletService: IViewletService @@ -78,10 +75,6 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { super(VIEWLET_ID, telemetryService); this.searchDelayer = new ThrottledDelayer(500); - chain(urlService.onOpenURL) - .filter(uri => /^extension/.test(uri.path)) - .on(this.onOpenExtensionUrl, this, this.disposables); - this.disposables.push(viewletService.onDidViewletOpen(this.onViewletOpen, this, this.disposables)); } @@ -309,26 +302,6 @@ export class ExtensionsViewlet extends Viewlet implements IExtensionsViewlet { this.list.reveal(this.list.getFocus()[0]); } - private onOpenExtensionUrl(uri: URI): void { - const match = /^extension\/([^/]+)$/.exec(uri.path); - - if (!match) { - return; - } - - const extensionId = match[1]; - - this.extensionsWorkbenchService.queryGallery({ names: [extensionId] }) - .done(result => { - if (result.total < 1) { - return; - } - - const extension = result.firstPage[0]; - this.openExtension(extension); - }); - } - private progress(promise: TPromise): TPromise { const progressRunner = this.progressService.show(true); return always(promise, () => progressRunner.done()); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index e0df38f173a..771f330c530 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -8,7 +8,7 @@ import 'vs/css!./media/extensionsViewlet'; import { localize } from 'vs/nls'; import paths = require('vs/base/common/paths'); -import Event, { Emitter } from 'vs/base/common/event'; +import Event, { Emitter, chain } from 'vs/base/common/event'; import { index } from 'vs/base/common/arrays'; import { assign } from 'vs/base/common/objects'; import { isUUID } from 'vs/base/common/uuid'; @@ -37,6 +37,8 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IWorkbenchEditorService } from 'vs/workbench/services/editor/common/editorService'; import { Content } from 'vs/workbench/parts/extensions/electron-browser/extensionsFileTemplate'; import { ReloadWindowAction } from 'vs/workbench/electron-browser/actions'; +import { IURLService } from 'vs/platform/url/common/url'; +import { ExtensionsInput } from './extensionsInput'; interface IExtensionStateProvider { (extension: Extension): ExtensionState; @@ -266,7 +268,8 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { @IExtensionGalleryService private galleryService: IExtensionGalleryService, @IConfigurationService private configurationService: IConfigurationService, @ITelemetryService private telemetryService: ITelemetryService, - @IMessageService private messageService: IMessageService + @IMessageService private messageService: IMessageService, + @IURLService urlService: IURLService ) { this.stateProvider = ext => this.getExtensionState(ext); @@ -277,6 +280,10 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { this.syncDelayer = new ThrottledDelayer(ExtensionsWorkbenchService.SyncPeriod); + chain(urlService.onOpenURL) + .filter(uri => /^extension/.test(uri.path)) + .on(this.onOpenExtensionUrl, this, this.disposables); + this.queryLocal().done(() => this.eventuallySyncWithGallery(true)); } @@ -528,6 +535,31 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { this.messageService.show(Severity.Error, err); } + private onOpenExtensionUrl(uri: URI): void { + const match = /^extension\/([^/]+)$/.exec(uri.path); + + if (!match) { + return; + } + + const extensionId = match[1]; + + this.queryGallery({ names: [extensionId] }) + .done(result => { + if (result.total < 1) { + return; + } + + const extension = result.firstPage[0]; + this.openExtension(extension); + }); + } + + private openExtension(extension: IExtension): void { + this.editorService.openEditor(this.instantiationService.createInstance(ExtensionsInput, extension)) + .done(null, err => this.onError(err)); + } + openExtensionsFile(sideBySide?: boolean): TPromise { if (!this.contextService.getWorkspace()) { this.messageService.show(Severity.Info, localize('ConfigureWorkspaceRecommendations.noWorkspace', 'Recommendations are only available on a workspace folder.'));