From 978c72231a243f3cfc6bb22bcd7a8e9cef013ae3 Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Tue, 8 Jan 2019 15:40:22 +0100 Subject: [PATCH] Fix #66213 --- .../extensions/browser/extensionsWidgets.ts | 72 ++-- .../parts/extensions/common/extensions.ts | 34 ++ .../electron-browser/extensionEditor.ts | 39 +- .../electron-browser/extensionsActions.ts | 341 +++++------------- .../electron-browser/extensionsList.ts | 39 +- .../extensionsActions.test.ts | 141 ++++++-- 6 files changed, 299 insertions(+), 367 deletions(-) diff --git a/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts b/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts index 361ef310087..bf526b22aeb 100644 --- a/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts +++ b/src/vs/workbench/parts/extensions/browser/extensionsWidgets.ts @@ -4,61 +4,49 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/extensionsWidgets'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; -import { IExtension, IExtensionsWorkbenchService } from '../common/extensions'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { IExtension, IExtensionsWorkbenchService, IExtensionContainer } from '../common/extensions'; import { append, $, addClass } from 'vs/base/browser/dom'; import * as platform from 'vs/base/common/platform'; import { localize } from 'vs/nls'; -export interface IOptions { - extension?: IExtension; - small?: boolean; -} - -export class Label implements IDisposable { - - private listener: IDisposable; +export abstract class ExtensionWidget extends Disposable implements IExtensionContainer { private _extension: IExtension; get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.render(); } + set extension(extension: IExtension) { this._extension = extension; this.update(); } + update(): void { this.render(); } + abstract render(): void; +} + +export class Label extends ExtensionWidget { constructor( private element: HTMLElement, private fn: (extension: IExtension) => string, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService ) { + super(); this.render(); - this.listener = extensionsWorkbenchService.onChange(this.render, this); } - private render(): void { + render(): void { this.element.textContent = this.extension ? this.fn(this.extension) : ''; } - - dispose(): void { - this.listener = dispose(this.listener); - } } -export class InstallCountWidget implements IDisposable { - - private disposables: IDisposable[] = []; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.render(); } +export class InstallCountWidget extends ExtensionWidget { constructor( private container: HTMLElement, - private options: IOptions, + private small: boolean, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService ) { - this._extension = options.extension; - this.disposables.push(extensionsWorkbenchService.onChange(() => this.render())); + super(); addClass(container, 'extension-install-count'); this.render(); } - private render(): void { + render(): void { this.container.innerHTML = ''; if (!this.extension) { @@ -73,7 +61,7 @@ export class InstallCountWidget implements IDisposable { let installLabel: string; - if (this.options.small) { + if (this.small) { if (installCount > 1000000) { installLabel = `${Math.floor(installCount / 100000) / 10}M`; } else if (installCount > 1000) { @@ -90,36 +78,26 @@ export class InstallCountWidget implements IDisposable { const count = append(this.container, $('span.count')); count.textContent = installLabel; } - - dispose(): void { - this.disposables = dispose(this.disposables); - } } -export class RatingsWidget implements IDisposable { - - private disposables: IDisposable[] = []; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.render(); } +export class RatingsWidget extends ExtensionWidget { constructor( private container: HTMLElement, - private options: IOptions, + private small: boolean, @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService ) { - this._extension = options.extension; - this.disposables.push(extensionsWorkbenchService.onChange(() => this.render())); + super(); addClass(container, 'extension-ratings'); - if (options.small) { + if (this.small) { addClass(container, 'small'); } this.render(); } - private render(): void { + render(): void { this.container.innerHTML = ''; if (!this.extension) { @@ -130,13 +108,13 @@ export class RatingsWidget implements IDisposable { return; } - if (this.options.small && !this.extension.ratingCount) { + if (this.small && !this.extension.ratingCount) { return; } const rating = Math.round(this.extension.rating * 2) / 2; - if (this.options.small) { + if (this.small) { append(this.container, $('span.full.star')); const count = append(this.container, $('span.count')); @@ -154,8 +132,4 @@ export class RatingsWidget implements IDisposable { } } } - - dispose(): void { - this.disposables = dispose(this.disposables); - } } diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index 59736f2ae12..4420d4bffda 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -11,6 +11,8 @@ import { IQueryOptions, IExtensionManifest, LocalExtensionType, EnablementState, import { IViewContainersRegistry, ViewContainer, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; import { CancellationToken } from 'vs/base/common/cancellation'; +import { Disposable } from 'vs/base/common/lifecycle'; +import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; export const VIEWLET_ID = 'workbench.view.extensions'; export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); @@ -106,3 +108,35 @@ export interface IExtensionsConfiguration { showRecommendationsOnlyOnDemand: boolean; closeExtensionDetailsOnViewChange: boolean; } + +export interface IExtensionContainer { + extension: IExtension | null; + update(): void; +} + +export class ExtensionContainers extends Disposable { + + constructor( + private readonly containers: IExtensionContainer[], + @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService + ) { + super(); + this._register(extensionsWorkbenchService.onChange(this.update, this)); + } + + set extension(extension: IExtension) { + this.containers.forEach(c => c.extension = extension); + } + + private update(extension: IExtension): void { + for (const container of this.containers) { + if (extension && container.extension) { + if (areSameExtensions(container.extension.identifier, extension.identifier)) { + container.extension = extension; + } + } else { + container.update(); + } + } + } +} \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 2c02e266815..f62edf65327 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -23,7 +23,7 @@ import { IInstantiationService, ServicesAccessor } from 'vs/platform/instantiati import { IExtensionManifest, IKeyBinding, IView, IExtensionTipsService, LocalExtensionType, IViewContainer } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ResolvedKeybinding, KeyMod, KeyCode } from 'vs/base/common/keyCodes'; import { ExtensionsInput } from 'vs/workbench/parts/extensions/common/extensionsInput'; -import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension, IExtensionDependencies } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtensionsWorkbenchService, IExtensionsViewlet, VIEWLET_ID, IExtension, IExtensionDependencies, ExtensionContainers } from 'vs/workbench/parts/extensions/common/extensions'; import { RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets'; import { EditorOptions } from 'vs/workbench/common/editor'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; @@ -348,29 +348,26 @@ export class ExtensionEditor extends BaseEditor { this.repository.style.display = 'none'; } - const install = this.instantiationService.createInstance(InstallCountWidget, this.installCount, { extension }); - this.transientDisposables.push(install); - - const ratings = this.instantiationService.createInstance(RatingsWidget, this.rating, { extension }); - this.transientDisposables.push(ratings); - - const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, true); - const disabledStatusAction = this.instantiationService.createInstance(DisabledStatusLabelAction, runningExtensions); - const installAction = this.instantiationService.createInstance(CombinedInstallAction); - const updateAction = this.instantiationService.createInstance(UpdateAction); - const enableAction = this.instantiationService.createInstance(EnableDropDownAction, extension, runningExtensions); - const disableAction = this.instantiationService.createInstance(DisableDropDownAction, extension, runningExtensions); + const widgets = [ + this.instantiationService.createInstance(InstallCountWidget, this.installCount, false), + this.instantiationService.createInstance(RatingsWidget, this.rating, false) + ]; const reloadAction = this.instantiationService.createInstance(ReloadAction); - - installAction.extension = extension; - maliciousStatusAction.extension = extension; - disabledStatusAction.extension = extension; - updateAction.extension = extension; - reloadAction.extension = extension; + const actions = [ + reloadAction, + this.instantiationService.createInstance(UpdateAction), + this.instantiationService.createInstance(EnableDropDownAction, runningExtensions), + this.instantiationService.createInstance(DisableDropDownAction, runningExtensions), + this.instantiationService.createInstance(CombinedInstallAction), + this.instantiationService.createInstance(MaliciousStatusLabelAction, true), + this.instantiationService.createInstance(DisabledStatusLabelAction, runningExtensions) + ]; + const extensionContainers: ExtensionContainers = this.instantiationService.createInstance(ExtensionContainers, [...actions, ...widgets]); + extensionContainers.extension = extension; this.extensionActionBar.clear(); - this.extensionActionBar.push([reloadAction, updateAction, enableAction, disableAction, installAction, maliciousStatusAction, disabledStatusAction], { icon: true, label: true }); - this.transientDisposables.push(enableAction, updateAction, reloadAction, disableAction, installAction, maliciousStatusAction, disabledStatusAction); + this.extensionActionBar.push(actions, { icon: true, label: true }); + this.transientDisposables.push(...[...actions, extensionContainers]); this.setSubText(extension, reloadAction); this.content.innerHTML = ''; // Clear content before setting navbar actions. diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts index b8f9b174928..fc4eeedc3a8 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsActions.ts @@ -14,7 +14,7 @@ import * as json from 'vs/base/common/json'; import { ActionItem, Separator, IActionItemOptions } from 'vs/base/browser/ui/actionbar/actionbar'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IDisposable, dispose, Disposable } from 'vs/base/common/lifecycle'; -import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtension, ExtensionState, IExtensionsWorkbenchService, VIEWLET_ID, IExtensionsViewlet, AutoUpdateConfigurationKey, IExtensionContainer } from 'vs/workbench/parts/extensions/common/extensions'; import { ExtensionsConfigurationInitialContent } from 'vs/workbench/parts/extensions/common/extensionsFileTemplate'; import { LocalExtensionType, IExtensionEnablementService, IExtensionTipsService, EnablementState, ExtensionsLabel, IExtensionRecommendation, IGalleryExtension, IExtensionsConfigContent, IExtensionManagementServerService, IExtensionGalleryService, INSTALL_ERROR_MALICIOUS, INSTALL_ERROR_INCOMPATIBLE, IGalleryExtensionVersion } from 'vs/platform/extensionManagement/common/extensionManagement'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; @@ -57,7 +57,6 @@ import { alert } from 'vs/base/browser/ui/aria/aria'; import { ILabelService } from 'vs/platform/label/common/label'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { isUndefinedOrNull } from 'vs/base/common/types'; import { coalesce } from 'vs/base/common/arrays'; const promptDownloadManually = (extension: IGalleryExtension | undefined, message: string, error: Error, instantiationService: IInstantiationService, notificationService: INotificationService, openerService: IOpenerService) => { @@ -120,11 +119,14 @@ function getRelativeDateLabel(date: Date): string { return ''; } -export interface IExtensionAction extends IAction { - extension: IExtension; +export abstract class ExtensionAction extends Action implements IExtensionContainer { + private _extension: IExtension; + get extension(): IExtension { return this._extension; } + set extension(extension: IExtension) { this._extension = extension; this.update(); } + abstract update(): void; } -export class InstallAction extends Action { +export class InstallAction extends ExtensionAction { private static INSTALL_LABEL = localize('install', "Install"); private static INSTALLING_LABEL = localize('installing', "Installing"); @@ -132,12 +134,6 @@ export class InstallAction extends Action { private static readonly Class = 'extension-action prominent install'; private static readonly InstallingClass = 'extension-action install installing'; - private disposables: IDisposable[] = []; - - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.update(); } - constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -145,12 +141,10 @@ export class InstallAction extends Action { @IOpenerService private readonly openerService: IOpenerService ) { super(`extensions.install`, InstallAction.INSTALL_LABEL, InstallAction.Class, false); - - this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension))); this.update(); } - private update(extension?: IExtension): void { + update(): void { if (!this.extension || this.extension.type === LocalExtensionType.System) { this.enabled = false; this.class = InstallAction.Class; @@ -158,10 +152,6 @@ export class InstallAction extends Action { return; } - if (extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } - this.enabled = this.extensionsWorkbenchService.canInstall(this.extension) && this.extension.state === ExtensionState.Uninstalled; if (this.extension.state === ExtensionState.Installing) { @@ -196,14 +186,9 @@ export class InstallAction extends Action { return promptDownloadManually(extension.gallery, localize('failedToInstall', "Failed to install \'{0}\'.", extension.identifier.id), err, this.instantiationService, this.notificationService, this.openerService); }); } - - dispose(): void { - super.dispose(); - this.disposables = dispose(this.disposables); - } } -export class UninstallAction extends Action { +export class UninstallAction extends ExtensionAction { private static readonly UninstallLabel = localize('uninstallAction', "Uninstall"); private static readonly UninstallingLabel = localize('Uninstalling', "Uninstalling"); @@ -211,30 +196,19 @@ export class UninstallAction extends Action { private static readonly UninstallClass = 'extension-action uninstall'; private static readonly UnInstallingClass = 'extension-action uninstall uninstalling'; - private disposables: IDisposable[] = []; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.update(); } - constructor( - @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService + @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService ) { super('extensions.uninstall', UninstallAction.UninstallLabel, UninstallAction.UninstallClass, false); - - this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension))); this.update(); } - private update(extension?: IExtension): void { + update(): void { if (!this.extension) { this.enabled = false; return; } - if (extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } - const state = this.extension.state; if (state === ExtensionState.Uninstalling) { @@ -274,26 +248,14 @@ export class UninstallAction extends Action { alert(localize('uninstallExtensionComplete', "Please reload Visual Studio Code to complete the uninstallation of the extension {0}.", this.extension.displayName)); }); } - - dispose(): void { - super.dispose(); - this.disposables = dispose(this.disposables); - } } -export class CombinedInstallAction extends Action { +export class CombinedInstallAction extends ExtensionAction { private static readonly NoExtensionClass = 'extension-action prominent install no-extension'; private installAction: InstallAction; private uninstallAction: UninstallAction; private disposables: IDisposable[] = []; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { - this._extension = extension; - this.installAction.extension = extension; - this.uninstallAction.extension = extension; - } constructor( @IInstantiationService instantiationService: IInstantiationService @@ -304,12 +266,15 @@ export class CombinedInstallAction extends Action { this.uninstallAction = instantiationService.createInstance(UninstallAction); this.disposables.push(this.installAction, this.uninstallAction); - this.installAction.onDidChange(this.update, this, this.disposables); - this.uninstallAction.onDidChange(this.update, this, this.disposables); this.update(); } - private update(): void { + update(): void { + this.installAction.extension = this.extension; + this.uninstallAction.extension = this.extension; + this.installAction.update(); + this.uninstallAction.update(); + if (!this.extension || this.extension.type === LocalExtensionType.System) { this.enabled = false; this.class = CombinedInstallAction.NoExtensionClass; @@ -357,16 +322,11 @@ export class CombinedInstallAction extends Action { } } -export class UpdateAction extends Action { +export class UpdateAction extends ExtensionAction { private static readonly EnabledClass = 'extension-action prominent update'; private static readonly DisabledClass = `${UpdateAction.EnabledClass} disabled`; - private disposables: IDisposable[] = []; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.update(); } - constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService private readonly instantiationService: IInstantiationService, @@ -374,11 +334,10 @@ export class UpdateAction extends Action { @IOpenerService private readonly openerService: IOpenerService ) { super(`extensions.update`, '', UpdateAction.DisabledClass, false); - this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension))); this.update(); } - private update(extension?: IExtension): void { + update(): void { if (!this.extension) { this.enabled = false; this.class = UpdateAction.DisabledClass; @@ -386,10 +345,6 @@ export class UpdateAction extends Action { return; } - if (extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } - if (this.extension.type !== LocalExtensionType.User) { this.enabled = false; this.class = UpdateAction.DisabledClass; @@ -427,11 +382,6 @@ export class UpdateAction extends Action { private getUpdateLabel(version?: string): string { return version ? localize('updateTo', "Update to {0}", version) : localize('updateAction', "Update"); } - - dispose(): void { - super.dispose(); - this.disposables = dispose(this.disposables); - } } interface IExtensionActionItemOptions extends IActionItemOptions { @@ -470,7 +420,7 @@ export class ExtensionActionItem extends ActionItem { } } -export abstract class DropDownAction extends Action { +export abstract class ExtensionDropDownAction extends ExtensionAction { protected disposables: IDisposable[] = []; @@ -508,7 +458,7 @@ export class DropDownMenuActionItem extends ExtensionActionItem { private disposables: IDisposable[] = []; - constructor(action: DropDownAction, + constructor(action: ExtensionDropDownAction, tabOnlyOnFocus: boolean, @IContextMenuService private readonly contextMenuService: IContextMenuService ) { @@ -543,21 +493,13 @@ export class DropDownMenuActionItem extends ExtensionActionItem { } } -export class ManageExtensionAction extends DropDownAction { +export class ManageExtensionAction extends ExtensionDropDownAction { static readonly ID = 'extensions.manage'; private static readonly Class = 'extension-action manage'; private static readonly HideManageExtensionClass = `${ManageExtensionAction.Class} hide`; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { - this._extension = extension; - this.update(); - } - constructor( - @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, @IInstantiationService instantiationService: IInstantiationService, @IExtensionService private readonly extensionService: IExtensionService ) { @@ -566,33 +508,24 @@ export class ManageExtensionAction extends DropDownAction { this.tooltip = localize('manage', "Manage"); - this.disposables.push(extensionsWorkbenchService.onChange(extension => { - if (extension && this.extension) { - if (areSameExtensions(this.extension.identifier, extension.identifier)) { - this.extension = extension; - } - } else { - this.update(); - } - })); this.update(); } getActionGroups(runningExtensions: IExtensionDescription[]): IAction[][] { - const groups: IExtensionAction[][] = []; + const groups: ExtensionAction[][] = []; groups.push([ - this.instantiationService.createInstance(EnableGloballyAction, this.extension), - this.instantiationService.createInstance(CombinedEnableForWorkspaceAction, this.extension, runningExtensions) + this.instantiationService.createInstance(EnableGloballyAction), + this.instantiationService.createInstance(CombinedEnableForWorkspaceAction, runningExtensions) ]); groups.push([ - this.instantiationService.createInstance(DisableGloballyAction, this.extension, runningExtensions), - this.instantiationService.createInstance(DisableForWorkspaceAction, this.extension, runningExtensions) + this.instantiationService.createInstance(DisableGloballyAction, runningExtensions), + this.instantiationService.createInstance(DisableForWorkspaceAction, runningExtensions) ]); - const uninstallAction = this.instantiationService.createInstance(UninstallAction); - uninstallAction.extension = this.extension; - groups.push([uninstallAction]); - groups.push([this.instantiationService.createInstance(InstallAnotherVersionAction, this.extension)]); - groups.push([this.instantiationService.createInstance(ExtensionInfoAction, this.extension)]); + groups.push([this.instantiationService.createInstance(UninstallAction)]); + groups.push([this.instantiationService.createInstance(InstallAnotherVersionAction)]); + groups.push([this.instantiationService.createInstance(ExtensionInfoAction)]); + + groups.forEach(group => group.forEach(extensionAction => extensionAction.extension = this.extension)); return groups; } @@ -601,7 +534,7 @@ export class ManageExtensionAction extends DropDownAction { return this.extensionService.getExtensions().then(runtimeExtensions => super.run({ actionGroups: this.getActionGroups(runtimeExtensions), disposeActionsOnHide: true })); } - private update(): void { + update(): void { this.class = ManageExtensionAction.HideManageExtensionClass; this.enabled = false; if (this.extension) { @@ -613,12 +546,12 @@ export class ManageExtensionAction extends DropDownAction { } } -export class InstallAnotherVersionAction extends Action { +export class InstallAnotherVersionAction extends ExtensionAction { static readonly ID = 'workbench.extensions.action.install.anotherVersion'; static LABEL = localize('install another version', "Install Another Version..."); - constructor(readonly extension: IExtension, + constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionGalleryService private readonly extensionGalleryService: IExtensionGalleryService, @IQuickInputService private readonly quickInputService: IQuickInputService, @@ -627,6 +560,10 @@ export class InstallAnotherVersionAction extends Action { @IOpenerService private readonly openerService: IOpenerService ) { super(InstallAnotherVersionAction.ID, InstallAnotherVersionAction.LABEL); + this.update(); + } + + update(): void { this.enabled = this.extension && !!this.extension.gallery; } @@ -663,13 +600,18 @@ export class InstallAnotherVersionAction extends Action { } } -export class ExtensionInfoAction extends Action implements IExtensionAction { +export class ExtensionInfoAction extends ExtensionAction { static readonly ID = 'extensions.extensionInfo'; static readonly LABEL = localize('extensionInfoAction', "Copy Extension Information"); - constructor(readonly extension: IExtension) { + constructor() { super(ExtensionInfoAction.ID, ExtensionInfoAction.LABEL); + this.update(); + } + + update(): void { + this.enabled = !!this.extension; } run(): Promise { @@ -689,29 +631,30 @@ export class ExtensionInfoAction extends Action implements IExtensionAction { } } -export class CombinedEnableForWorkspaceAction extends Action implements IExtensionAction { +export class CombinedEnableForWorkspaceAction extends ExtensionAction { static readonly ID = 'extensions.enableForWorkspace'; static LABEL = localize('enableForWorkspaceAction', "Enable (Workspace)"); private enableForWorkspaceAction: EnableForWorkspaceAction; private installInRemoteServerAction: InstallInRemoteServerAction; - private disposables: IDisposable[] = []; - constructor(readonly extension: IExtension, readonly runningExtensions: IExtensionDescription[], + constructor(readonly runningExtensions: IExtensionDescription[], @IInstantiationService instantiationService: IInstantiationService ) { super(CombinedEnableForWorkspaceAction.ID, CombinedEnableForWorkspaceAction.LABEL); - this.enableForWorkspaceAction = instantiationService.createInstance(EnableForWorkspaceAction, extension); - this.enableForWorkspaceAction.onDidChange(({ enabled }) => { if (!isUndefinedOrNull(enabled)) { this.update(); } }, this, this.disposables); - this.installInRemoteServerAction = instantiationService.createInstance(InstallInRemoteServerAction, extension, runningExtensions); - this.installInRemoteServerAction.onDidChange(({ enabled }) => { if (!isUndefinedOrNull(enabled)) { this.update(); } }, this, this.disposables); + this.enableForWorkspaceAction = instantiationService.createInstance(EnableForWorkspaceAction); + this.installInRemoteServerAction = instantiationService.createInstance(InstallInRemoteServerAction, runningExtensions); this.update(); } - private update(): void { + update(): void { + this.enableForWorkspaceAction.extension = this.extension; + this.installInRemoteServerAction.extension = this.extension; + this.enableForWorkspaceAction.update(); + this.installInRemoteServerAction.update(); this.enabled = this.installInRemoteServerAction.enabled || this.enableForWorkspaceAction.enabled; } @@ -732,26 +675,20 @@ export class CombinedEnableForWorkspaceAction extends Action implements IExtensi } } -export class EnableForWorkspaceAction extends Action implements IExtensionAction { +export class EnableForWorkspaceAction extends ExtensionAction { static readonly ID = 'extensions.enableForWorkspace'; static LABEL = localize('enableForWorkspaceAction', "Enable (Workspace)"); - private disposables: IDisposable[] = []; - - constructor(readonly extension: IExtension, + constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService ) { super(EnableForWorkspaceAction.ID, EnableForWorkspaceAction.LABEL); - this.disposables.push(extensionsWorkbenchService.onChange(e => this.update(e))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.enabled = false; if (this.extension) { this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.enablementState === EnablementState.Disabled || this.extension.enablementState === EnablementState.WorkspaceDisabled) && !!this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local); @@ -761,21 +698,14 @@ export class EnableForWorkspaceAction extends Action implements IExtensionAction run(): Promise { return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.WorkspaceEnabled); } - - dispose(): void { - super.dispose(); - dispose(this.disposables); - } } -export class InstallInRemoteServerAction extends Action implements IExtensionAction { +export class InstallInRemoteServerAction extends ExtensionAction { static readonly ID = 'extensions.installInRemoteServerAction'; static LABEL = localize('enableForWorkspaceAction', "Enable (Workspace)"); - private disposables: IDisposable[] = []; - - constructor(readonly extension: IExtension, readonly runningExtensions: IExtensionDescription[], + constructor(readonly runningExtensions: IExtensionDescription[], @IExtensionsWorkbenchService extensionWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IConfigurationService private readonly configurationService: IConfigurationService, @@ -786,14 +716,10 @@ export class InstallInRemoteServerAction extends Action implements IExtensionAct @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService ) { super(InstallInRemoteServerAction.ID, InstallInRemoteServerAction.LABEL); - this.disposables.push(extensionsWorkbenchService.onChange(e => this.update(e))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.enabled = false; if (this.extensionManagementServerService.remoteExtensionManagementServer && this.extension && this.extension.locals && this.extension.locals.length > 0 @@ -831,35 +757,24 @@ export class InstallInRemoteServerAction extends Action implements IExtensionAct return this.extensionManagementServerService.remoteExtensionManagementServer!.extensionManagementService.unzip(zipLocation, this.extension.type!); } } - - dispose(): void { - super.dispose(); - dispose(this.disposables); - } } -export class EnableGloballyAction extends Action implements IExtensionAction { +export class EnableGloballyAction extends ExtensionAction { static readonly ID = 'extensions.enableGlobally'; static LABEL = localize('enableGloballyAction', "Enable"); - private disposables: IDisposable[] = []; - - constructor(readonly extension: IExtension, + constructor( @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService, @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IConfigurationService private readonly configurationService: IConfigurationService ) { super(EnableGloballyAction.ID, EnableGloballyAction.LABEL); - this.disposables.push(extensionsWorkbenchService.onChange(e => this.update(e))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.enabled = false; if (this.extension && this.extension.locals && this.extension.local) { if (!isUIExtension(this.extension.local.manifest, this.configurationService) && this.extensionManagementServerService.remoteExtensionManagementServer) { @@ -877,34 +792,23 @@ export class EnableGloballyAction extends Action implements IExtensionAction { run(): Promise { return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.Enabled); } - - dispose(): void { - super.dispose(); - dispose(this.disposables); - } } -export class DisableForWorkspaceAction extends Action implements IExtensionAction { +export class DisableForWorkspaceAction extends ExtensionAction { static readonly ID = 'extensions.disableForWorkspace'; static LABEL = localize('disableForWorkspaceAction', "Disable (Workspace)"); - private disposables: IDisposable[] = []; - - constructor(readonly extension: IExtension, readonly runningExtensions: IExtensionDescription[], + constructor(readonly runningExtensions: IExtensionDescription[], @IWorkspaceContextService private readonly workspaceContextService: IWorkspaceContextService, @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService ) { super(DisableForWorkspaceAction.ID, DisableForWorkspaceAction.LABEL); - this.disposables.push(extensionsWorkbenchService.onChange(e => this.update(e))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.enabled = false; if (this.extension && this.runningExtensions.some(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier) && this.workspaceContextService.getWorkbenchState() !== WorkbenchState.EMPTY)) { this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.enablementState === EnablementState.Enabled || this.extension.enablementState === EnablementState.WorkspaceEnabled) && !!this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local); @@ -914,33 +818,22 @@ export class DisableForWorkspaceAction extends Action implements IExtensionActio run(): Promise { return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.WorkspaceDisabled); } - - dispose(): void { - super.dispose(); - dispose(this.disposables); - } } -export class DisableGloballyAction extends Action implements IExtensionAction { +export class DisableGloballyAction extends ExtensionAction { static readonly ID = 'extensions.disableGlobally'; static LABEL = localize('disableGloballyAction', "Disable"); - private disposables: IDisposable[] = []; - - constructor(readonly extension: IExtension, readonly runningExtensions: IExtensionDescription[], + constructor(readonly runningExtensions: IExtensionDescription[], @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionEnablementService private readonly extensionEnablementService: IExtensionEnablementService ) { super(DisableGloballyAction.ID, DisableGloballyAction.LABEL); - this.disposables.push(extensionsWorkbenchService.onChange(e => this.update(e))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.enabled = false; if (this.extension && this.runningExtensions.some(e => areSameExtensions({ id: e.identifier.value }, this.extension.identifier))) { this.enabled = this.extension.state === ExtensionState.Installed && (this.extension.enablementState === EnablementState.Enabled || this.extension.enablementState === EnablementState.WorkspaceEnabled) && !!this.extension.local && this.extensionEnablementService.canChangeEnablement(this.extension.local); @@ -950,39 +843,26 @@ export class DisableGloballyAction extends Action implements IExtensionAction { run(): Promise { return this.extensionsWorkbenchService.setEnablement(this.extension, EnablementState.Disabled); } - - dispose(): void { - super.dispose(); - dispose(this.disposables); - } } -export class ExtensionEditorDropDownAction extends DropDownAction { +export abstract class ExtensionEditorDropDownAction extends ExtensionDropDownAction { private static readonly EnabledClass = 'extension-action extension-editor-dropdown-action'; private static readonly EnabledDropDownClass = 'extension-action extension-editor-dropdown-action dropdown enable'; private static readonly DisabledClass = `${ExtensionEditorDropDownAction.EnabledClass} disabled`; constructor( - id: string, label: string, - extension: IExtension, readonly actions: IAction[], - @IInstantiationService instantiationService: IInstantiationService, - @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, + id: string, private readonly initialLabel: string, + readonly actions: ExtensionAction[], + @IInstantiationService instantiationService: IInstantiationService ) { - super(id, label, ExtensionEditorDropDownAction.DisabledClass, false, false, instantiationService); - for (const action of this.actions) { - if (action instanceof Action) { - action.onDidChange(({ enabled }) => { - if (!isUndefinedOrNull(enabled)) { - this.update(); - } - }, this, this.disposables); - } - } + super(id, initialLabel, ExtensionEditorDropDownAction.DisabledClass, false, false, instantiationService); this.update(); } - private update(): void { + update(): void { + this.actions.forEach(a => a.extension = this.extension); + this.actions.forEach(a => a.update()); const enabledActions = this.actions.filter(a => a.enabled); this.enabled = enabledActions.length > 0; if (this.enabled) { @@ -990,6 +870,7 @@ export class ExtensionEditorDropDownAction extends DropDownAction { this.label = enabledActions[0].label; this.class = ExtensionEditorDropDownAction.EnabledClass; } else { + this.label = this.initialLabel; this.class = ExtensionEditorDropDownAction.EnabledDropDownClass; } } else { @@ -1011,28 +892,26 @@ export class ExtensionEditorDropDownAction extends DropDownAction { export class EnableDropDownAction extends ExtensionEditorDropDownAction { constructor( - extension: IExtension, runningExtensions: IExtensionDescription[], - @IInstantiationService instantiationService: IInstantiationService, - @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, + runningExtensions: IExtensionDescription[], + @IInstantiationService instantiationService: IInstantiationService ) { - super('extensions.enable', localize('enableAction', "Enable"), extension, [ - instantiationService.createInstance(EnableGloballyAction, extension), - instantiationService.createInstance(CombinedEnableForWorkspaceAction, extension, runningExtensions) - ], instantiationService, extensionsWorkbenchService); + super('extensions.enable', localize('enableAction', "Enable"), [ + instantiationService.createInstance(EnableGloballyAction), + instantiationService.createInstance(CombinedEnableForWorkspaceAction, runningExtensions) + ], instantiationService); } } export class DisableDropDownAction extends ExtensionEditorDropDownAction { constructor( - extension: IExtension, runningExtensions: IExtensionDescription[], - @IInstantiationService instantiationService: IInstantiationService, - @IExtensionsWorkbenchService extensionsWorkbenchService: IExtensionsWorkbenchService, + runningExtensions: IExtensionDescription[], + @IInstantiationService instantiationService: IInstantiationService ) { - super('extensions.disable', localize('disableAction', "Disable"), extension, [ - instantiationService.createInstance(DisableGloballyAction, extension, runningExtensions), - instantiationService.createInstance(DisableForWorkspaceAction, extension, runningExtensions) - ], instantiationService, extensionsWorkbenchService); + super('extensions.disable', localize('disableAction', "Disable"), [ + instantiationService.createInstance(DisableGloballyAction, runningExtensions), + instantiationService.createInstance(DisableForWorkspaceAction, runningExtensions) + ], instantiationService); } } @@ -1190,16 +1069,11 @@ export class UpdateAllAction extends Action { } } -export class ReloadAction extends Action { +export class ReloadAction extends ExtensionAction { private static readonly EnabledClass = 'extension-action reload'; private static readonly DisabledClass = `${ReloadAction.EnabledClass} disabled`; - private disposables: IDisposable[] = []; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.update(); } - private throttler: Throttler; constructor( @@ -1213,14 +1087,10 @@ export class ReloadAction extends Action { super('extensions.reload', localize('reloadAction', "Reload"), ReloadAction.DisabledClass, false); this.throttler = new Throttler(); - this.disposables.push(this.extensionsWorkbenchService.onChange(extension => this.update(extension))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.throttler.queue(() => { this.enabled = false; this.tooltip = ''; @@ -2336,14 +2206,10 @@ export class AddToWorkspaceRecommendationsAction extends AbstractConfigureRecomm } } -export class MaliciousStatusLabelAction extends Action { +export class MaliciousStatusLabelAction extends ExtensionAction { private static readonly Class = 'malicious-status'; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.update(); } - constructor(long: boolean) { const tooltip = localize('malicious tooltip', "This extension was reported to be problematic."); const label = long ? tooltip : localize('malicious', "Malicious"); @@ -2351,7 +2217,7 @@ export class MaliciousStatusLabelAction extends Action { this.tooltip = localize('malicious tooltip', "This extension was reported to be problematic."); } - private update(): void { + update(): void { if (this.extension && this.extension.isMalicious) { this.class = `${MaliciousStatusLabelAction.Class} malicious`; } else { @@ -2364,32 +2230,21 @@ export class MaliciousStatusLabelAction extends Action { } } -export class DisabledStatusLabelAction extends Action { +export class DisabledStatusLabelAction extends ExtensionAction { private static readonly Class = 'disable-status'; - private _extension: IExtension; - get extension(): IExtension { return this._extension; } - set extension(extension: IExtension) { this._extension = extension; this.update(); } - - private disposables: IDisposable[] = []; - constructor( private runningExtensions: IExtensionDescription[], - @IExtensionsWorkbenchService private readonly extensionsWorkbenchService: IExtensionsWorkbenchService, @IExtensionManagementServerService private readonly extensionManagementServerService: IExtensionManagementServerService, @IConfigurationService private readonly configurationService: IConfigurationService, @ILabelService private readonly labelService: ILabelService ) { super('extensions.install', localize('disabled', "Disabled"), `${DisabledStatusLabelAction.Class} hide`, false); - this.disposables.push(this.extensionsWorkbenchService.onChange((extension) => this.update(extension))); this.update(); } - private update(extension?: IExtension): void { - if (extension && this.extension && !areSameExtensions(this.extension.identifier, extension.identifier)) { - return; - } + update(): void { this.class = `${DisabledStatusLabelAction.Class} hide`; this.tooltip = ''; if (this.extension && this.extension.local && !this.extension.isMalicious && !this.runningExtensions.some(e => ExtensionIdentifier.equals(e.identifier, this.extension.identifier.id))) { diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts index 25da386997c..fca55b71ed5 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts @@ -13,7 +13,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, IExtensionsWorkbenchService } from 'vs/workbench/parts/extensions/common/extensions'; +import { IExtension, IExtensionsWorkbenchService, ExtensionContainers } from 'vs/workbench/parts/extensions/common/extensions'; import { InstallAction, UpdateAction, ManageExtensionAction, ReloadAction, extensionButtonProminentBackground, extensionButtonProminentForeground, MaliciousStatusLabelAction, ExtensionActionItem } from 'vs/workbench/parts/extensions/electron-browser/extensionsActions'; import { areSameExtensions } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { Label, RatingsWidget, InstallCountWidget } from 'vs/workbench/parts/extensions/browser/extensionsWidgets'; @@ -99,31 +99,28 @@ export class Renderer implements IPagedRenderer { }); actionbar.onDidRun(({ error }) => error && this.notificationService.error(error)); - const versionWidget = this.instantiationService.createInstance(Label, version, (e: IExtension) => e.version); - const installCountWidget = this.instantiationService.createInstance(InstallCountWidget, installCount, { small: true }); - const ratingsWidget = this.instantiationService.createInstance(RatingsWidget, ratings, { small: true }); - - const maliciousStatusAction = this.instantiationService.createInstance(MaliciousStatusLabelAction, false); - const installAction = this.instantiationService.createInstance(InstallAction); - const updateAction = this.instantiationService.createInstance(UpdateAction); - const reloadAction = this.instantiationService.createInstance(ReloadAction); - const manageAction = this.instantiationService.createInstance(ManageExtensionAction); - - actionbar.push([updateAction, reloadAction, installAction, maliciousStatusAction, manageAction], actionOptions); - const disposables = [versionWidget, installCountWidget, ratingsWidget, maliciousStatusAction, updateAction, installAction, reloadAction, manageAction, actionbar, bookmarkStyler]; + const widgets = [ + this.instantiationService.createInstance(Label, version, (e: IExtension) => e.version), + this.instantiationService.createInstance(InstallCountWidget, installCount, true), + this.instantiationService.createInstance(RatingsWidget, ratings, true) + ]; + const actions = [ + this.instantiationService.createInstance(UpdateAction), + this.instantiationService.createInstance(ReloadAction), + this.instantiationService.createInstance(InstallAction), + this.instantiationService.createInstance(MaliciousStatusLabelAction, false), + this.instantiationService.createInstance(ManageExtensionAction) + ]; + const extensionContainers: ExtensionContainers = this.instantiationService.createInstance(ExtensionContainers, [...actions, ...widgets]); + + actionbar.push(actions, actionOptions); + const disposables = [...actions, ...widgets, actionbar, bookmarkStyler, extensionContainers]; return { root, element, icon, name, installCount, ratings, author, description, disposables, actionbar, extensionDisposables: [], set extension(extension: IExtension) { - versionWidget.extension = extension; - installCountWidget.extension = extension; - ratingsWidget.extension = extension; - maliciousStatusAction.extension = extension; - installAction.extension = extension; - updateAction.extension = extension; - reloadAction.extension = extension; - manageAction.extension = extension; + extensionContainers.extension = extension; } }; } diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts index 5be41b5aea7..e6166dc3dda 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsActions.test.ts @@ -103,6 +103,7 @@ suite('ExtensionsActions Test', () => { test('Test Install action when state is installed', () => { const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); return workbenchService.queryLocal() @@ -121,6 +122,7 @@ suite('ExtensionsActions Test', () => { test('Test Install action when state is installing', () => { const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); return workbenchService.queryGallery() @@ -137,6 +139,7 @@ suite('ExtensionsActions Test', () => { test('Test Install action when state is uninstalled', () => { const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); return workbenchService.queryGallery() @@ -149,6 +152,7 @@ suite('ExtensionsActions Test', () => { test('Test Install action when extension is system action', () => { const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', {}, { type: LocalExtensionType.System }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -163,6 +167,7 @@ suite('ExtensionsActions Test', () => { test('Test Install action when extension doesnot has gallery', () => { const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.InstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -177,12 +182,14 @@ suite('ExtensionsActions Test', () => { test('Uninstall action is disabled when there is no extension', () => { const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); assert.ok(!testObject.enabled); }); test('Test Uninstall action when state is uninstalling', () => { const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -198,6 +205,7 @@ suite('ExtensionsActions Test', () => { test('Test Uninstall action when state is installed and is user extension', () => { const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -212,6 +220,7 @@ suite('ExtensionsActions Test', () => { test('Test Uninstall action when state is installed and is system extension', () => { const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', {}, { type: LocalExtensionType.System }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -226,6 +235,7 @@ suite('ExtensionsActions Test', () => { test('Test Uninstall action when state is installing and is user extension', () => { const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -242,6 +252,7 @@ suite('ExtensionsActions Test', () => { test('Test Uninstall action after extension is installed', () => { const testObject: ExtensionsActions.UninstallAction = instantiationService.createInstance(ExtensionsActions.UninstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -260,6 +271,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when there is no extension', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); assert.ok(!testObject.enabled); assert.equal('extension-action prominent install no-extension', testObject.class); @@ -267,6 +279,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when extension is system extension', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', {}, { type: LocalExtensionType.System }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -281,6 +294,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when installAction is enabled', () => { const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -295,6 +309,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when unInstallAction is enabled', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -309,6 +324,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when state is installing', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -325,6 +341,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when state is installing during update', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -343,6 +360,7 @@ suite('ExtensionsActions Test', () => { test('Test CombinedInstallAction when state is uninstalling', () => { const testObject: ExtensionsActions.CombinedInstallAction = instantiationService.createInstance(ExtensionsActions.CombinedInstallAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -358,12 +376,14 @@ suite('ExtensionsActions Test', () => { test('Test UpdateAction when there is no extension', () => { const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); assert.ok(!testObject.enabled); }); test('Test UpdateAction when extension is uninstalled', () => { const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); return instantiationService.get(IExtensionsWorkbenchService).queryGallery() @@ -375,6 +395,7 @@ suite('ExtensionsActions Test', () => { test('Test UpdateAction when extension is installed and not outdated', () => { const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -389,6 +410,7 @@ suite('ExtensionsActions Test', () => { test('Test UpdateAction when extension is installed outdated and system extension', () => { const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', { version: '1.0.0' }, { type: LocalExtensionType.System }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -403,6 +425,7 @@ suite('ExtensionsActions Test', () => { test('Test UpdateAction when extension is installed outdated and user extension', () => { const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -425,6 +448,7 @@ suite('ExtensionsActions Test', () => { test('Test UpdateAction when extension is installing and outdated and user extension', () => { const testObject: ExtensionsActions.UpdateAction = instantiationService.createInstance(ExtensionsActions.UpdateAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', { version: '1.0.0' }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -443,12 +467,14 @@ suite('ExtensionsActions Test', () => { test('Test ManageExtensionAction when there is no extension', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); assert.ok(!testObject.enabled); }); test('Test ManageExtensionAction when extension is installed', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -463,6 +489,7 @@ suite('ExtensionsActions Test', () => { test('Test ManageExtensionAction when extension is uninstalled', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -477,6 +504,7 @@ suite('ExtensionsActions Test', () => { test('Test ManageExtensionAction when extension is installing', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -493,6 +521,7 @@ suite('ExtensionsActions Test', () => { test('Test ManageExtensionAction when extension is queried from gallery and installed', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -510,6 +539,7 @@ suite('ExtensionsActions Test', () => { test('Test ManageExtensionAction when extension is system extension', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', {}, { type: LocalExtensionType.System }); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -524,6 +554,7 @@ suite('ExtensionsActions Test', () => { test('Test ManageExtensionAction when extension is uninstalling', () => { const testObject: ExtensionsActions.ManageExtensionAction = instantiationService.createInstance(ExtensionsActions.ManageExtensionAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -539,7 +570,7 @@ suite('ExtensionsActions Test', () => { }); test('Test EnableForWorkspaceAction when there is no extension', () => { - const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, null); + const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction); assert.ok(!testObject.enabled); }); @@ -550,7 +581,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, extensions[0]); + const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -563,7 +595,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, extensions[0]); + const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); @@ -577,7 +610,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, extensions[0]); + const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); @@ -592,14 +626,15 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction, extensions[0]); + const testObject: ExtensionsActions.EnableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.EnableForWorkspaceAction); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); }); test('Test EnableGloballyAction when there is no extension', () => { - const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, null); + const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction); assert.ok(!testObject.enabled); }); @@ -610,7 +645,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, extensions[0]); + const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -623,7 +659,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, extensions[0]); + const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -637,7 +674,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, extensions[0]); + const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); @@ -652,14 +690,15 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction, extensions[0]); + const testObject: ExtensionsActions.EnableGloballyAction = instantiationService.createInstance(ExtensionsActions.EnableGloballyAction); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); }); test('Test EnableAction when there is no extension', () => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, null, []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); assert.ok(!testObject.enabled); }); @@ -670,7 +709,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, extensions[0], []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -683,7 +723,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, extensions[0], []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); @@ -697,7 +738,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, extensions[0], []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); @@ -709,7 +751,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryGallery() .then(page => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, page.firstPage[0], []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); + testObject.extension = page.firstPage[0]; assert.ok(!testObject.enabled); }); }); @@ -720,7 +763,9 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryGallery() .then(page => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, page.firstPage[0], []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); + testObject.extension = page.firstPage[0]; + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); installEvent.fire({ identifier: gallery.identifier, gallery }); assert.ok(!testObject.enabled); @@ -733,14 +778,15 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, extensions[0], []); + const testObject: ExtensionsActions.EnableDropDownAction = instantiationService.createInstance(ExtensionsActions.EnableDropDownAction, []); + testObject.extension = extensions[0]; uninstallEvent.fire(local.identifier); assert.ok(!testObject.enabled); }); }); test('Test DisableForWorkspaceAction when there is no extension', () => { - const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, null, []); + const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, []); assert.ok(!testObject.enabled); }); @@ -753,7 +799,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, extensions[0], []); + const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, []); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -767,7 +814,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, extensions[0], []); + const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, []); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -779,13 +827,14 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, extensions[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableForWorkspaceAction = instantiationService.createInstance(ExtensionsActions.DisableForWorkspaceAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); test('Test DisableGloballyAction when there is no extension', () => { - const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, null, []); + const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, []); assert.ok(!testObject.enabled); }); @@ -798,7 +847,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, extensions[0], []); + const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, []); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -812,7 +862,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, extensions[0], []); + const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, []); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -824,13 +875,14 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, extensions[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableGloballyAction = instantiationService.createInstance(ExtensionsActions.DisableGloballyAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); test('Test DisableDropDownAction when there is no extension', () => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, null, []); + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, []); assert.ok(!testObject.enabled); }); @@ -841,7 +893,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, extensions[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = extensions[0]; assert.ok(testObject.enabled); }); }); @@ -854,7 +907,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, extensions[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -868,7 +922,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, extensions[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = extensions[0]; assert.ok(!testObject.enabled); }); }); @@ -880,7 +935,8 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryGallery() .then(page => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, page.firstPage[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = page.firstPage[0]; assert.ok(!testObject.enabled); }); }); @@ -891,8 +947,9 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryGallery() .then(page => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, page.firstPage[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); - + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = page.firstPage[0]; + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); installEvent.fire({ identifier: gallery.identifier, gallery }); assert.ok(!testObject.enabled); }); @@ -904,7 +961,9 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionsWorkbenchService).queryLocal() .then(extensions => { - const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, extensions[0], [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + const testObject: ExtensionsActions.DisableDropDownAction = instantiationService.createInstance(ExtensionsActions.DisableDropDownAction, [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); + testObject.extension = extensions[0]; + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); uninstallEvent.fire(local.identifier); assert.ok(!testObject.enabled); }); @@ -985,12 +1044,14 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when there is no extension', () => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); assert.ok(!testObject.enabled); }); test('Test ReloadAction when extension state is installing', () => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -1005,6 +1066,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension state is uninstalling', () => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -1019,6 +1081,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension is newly installed', async () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -1040,6 +1103,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension is installed and uninstalled', () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); return instantiationService.get(IExtensionsWorkbenchService).queryGallery() @@ -1058,6 +1122,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension is uninstalled', async () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal(); @@ -1077,6 +1142,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension is uninstalled and installed', () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.0', extensionLocation: URI.file('pub.a') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); return instantiationService.get(IExtensionsWorkbenchService).queryLocal() @@ -1097,6 +1163,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension is updated while running', async () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.1', extensionLocation: URI.file('pub.a') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', { version: '1.0.1' }); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -1121,6 +1188,7 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) .then(() => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); return workbenchService.queryLocal() @@ -1139,6 +1207,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension is disabled when running', () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), extensionLocation: URI.file('pub.a') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -1155,6 +1224,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when extension enablement is toggled when running', () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.0', extensionLocation: URI.file('pub.a') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a'); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); @@ -1173,6 +1243,7 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) .then(() => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); return workbenchService.queryLocal() @@ -1193,6 +1264,7 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) .then(() => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); return workbenchService.queryLocal() @@ -1211,6 +1283,7 @@ suite('ExtensionsActions Test', () => { return instantiationService.get(IExtensionEnablementService).setEnablement(local, EnablementState.Disabled) .then(() => { const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); return workbenchService.queryLocal() @@ -1233,6 +1306,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when a localization extension is newly installed', async () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.b'), extensionLocation: URI.file('pub.b') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const gallery = aGalleryExtension('a'); instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery)); @@ -1248,6 +1322,7 @@ suite('ExtensionsActions Test', () => { test('Test ReloadAction when a localization extension is updated while running', async () => { instantiationService.stubPromise(IExtensionService, 'getExtensions', [{ identifier: new ExtensionIdentifier('pub.a'), version: '1.0.1', extensionLocation: URI.file('pub.a') }]); const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.get(IExtensionsWorkbenchService).onChange(() => testObject.update()); const local = aLocalExtension('a', { version: '1.0.1', contributes: { localizations: [{ languageId: 'de', translations: [] }] } }); const workbenchService = instantiationService.get(IExtensionsWorkbenchService); instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); -- GitLab