move extension url handling to service

This commit is contained in:
Joao Moreno 2016-09-16 10:37:27 +02:00
parent e3f46b1466
commit 340f4590cc
2 changed files with 34 additions and 29 deletions

View file

@ -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<T>(promise: TPromise<T>): TPromise<T> {
const progressRunner = this.progressService.show(true);
return always(promise, () => progressRunner.done());

View file

@ -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<void>(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<any> {
if (!this.contextService.getWorkspace()) {
this.messageService.show(Severity.Info, localize('ConfigureWorkspaceRecommendations.noWorkspace', 'Recommendations are only available on a workspace folder.'));