diff --git a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts index 126e91c9c064e7efc17ce3f2b6b3c838272f6853..b92990bded03e30b0ef5a31bf09123f1e7e8139c 100644 --- a/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/electron-browser/extensionsList.ts @@ -12,7 +12,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { IPagedRenderer } from 'vs/base/browser/ui/list/listPaging'; import { Event } from 'vs/base/common/event'; import { domEvent } from 'vs/base/browser/event'; -import { IExtension, ExtensionContainers } from 'vs/workbench/contrib/extensions/common/extensions'; +import { IExtension, ExtensionContainers, ExtensionState, IExtensionsWorkbenchService } from 'vs/workbench/contrib/extensions/common/extensions'; import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, MaliciousStatusLabelAction, ExtensionActionItem, StatusLabelAction, RemoteInstallAction } from 'vs/workbench/contrib/extensions/electron-browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteBadgeWidget } from 'vs/workbench/contrib/extensions/electron-browser/extensionsWidgets'; @@ -54,7 +54,8 @@ export class Renderer implements IPagedRenderer { @IInstantiationService private readonly instantiationService: IInstantiationService, @INotificationService private readonly notificationService: INotificationService, @IExtensionService private readonly extensionService: IExtensionService, - @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService + @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, + @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService ) { } get templateId() { return 'extension'; } @@ -133,6 +134,11 @@ export class Renderer implements IPagedRenderer { renderElement(extension: IExtension, index: number, data: ITemplateData): void { removeClass(data.element, 'loading'); + if (extension.state !== ExtensionState.Uninstalled && !extension.server) { + // Get the extension if it is installed and has no server information + extension = this.extensionsWorkbenchService.local.filter(e => e.server === extension.server && areSameExtensions(e.identifier, extension.identifier))[0] || extension; + } + data.extensionDisposables = dispose(data.extensionDisposables); const updateEnablement = async () => { diff --git a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts index 4cfaf1aa5021ea1eedf47fd5719fd63397868214..4fbf7de22c75825cd9de7418bef8a1cebe819b08 100644 --- a/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/contrib/extensions/node/extensionsWorkbenchService.ts @@ -502,7 +502,7 @@ class Extensions extends Disposable { } } - private getExtensionState(extension: Extension): ExtensionState { + getExtensionState(extension: Extension): ExtensionState { if (extension.gallery && this.installing.some(e => !!e.gallery && areSameExtensions(e.gallery.identifier, extension.gallery!.identifier))) { return ExtensionState.Installing; } @@ -680,7 +680,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension if (installed) { return installed; } - const extension = new Extension(this.galleryService, ext => ExtensionState.Uninstalled, undefined, undefined, gallery, this.telemetryService, this.logService, this.fileService); + const extension = new Extension(this.galleryService, ext => this.getExtensionState(ext), undefined, undefined, gallery, this.telemetryService, this.logService, this.fileService); if (maliciousExtensionSet.has(extension.identifier.id)) { extension.isMalicious = true; } @@ -702,6 +702,16 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension return null; } + private getExtensionState(extension: Extension): ExtensionState { + if (this.remoteExtensions) { + const state = this.remoteExtensions.getExtensionState(extension); + if (state !== ExtensionState.Uninstalled) { + return state; + } + } + return this.localExtensions.getExtensionState(extension); + } + checkForUpdates(): Promise { return Promise.resolve(this.syncDelayer.trigger(() => this.syncWithGallery(), 0)); }