From 8007de360293198f1ce94a39c2b6e4f6b9ec2d7f Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Mon, 22 Jul 2019 18:01:34 +0200 Subject: [PATCH] fix #77764 --- .../extensions/browser/extensionsActions.ts | 2 +- .../extensionsActions.test.ts | 30 ++++++++++++++----- .../electron-browser/extensionService.ts | 4 +-- 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts index 9ff2539cdb6..ea26aa79a2c 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsActions.ts @@ -1200,7 +1200,7 @@ export class ReloadAction extends ExtensionAction { const isSameExtensionRunning = runningExtension && this.extension.server === this.extensionManagementServerService.getExtensionManagementServer(runningExtension.extensionLocation); if (isUninstalled) { - if (isSameExtensionRunning) { + if (isSameExtensionRunning && !this.extensionService.canRemoveExtension(runningExtension)) { this.enabled = true; this.label = localize('reloadRequired', "Reload Required"); this.tooltip = localize('postUninstallTooltip', "Please reload Visual Studio Code to complete the uninstallation of this extension."); diff --git a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts index 3936d501162..c13fb820c2a 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts @@ -1160,15 +1160,29 @@ suite('ExtensionsActions Test', () => { const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal(); testObject.extension = extensions[0]; - return new Promise(c => { - testObject.onDidChange(() => { - if (testObject.enabled && testObject.tooltip === 'Please reload Visual Studio Code to complete the uninstallation of this extension.') { - c(); - } - }); - uninstallEvent.fire(local.identifier); - didUninstallEvent.fire({ identifier: local.identifier }); + uninstallEvent.fire(local.identifier); + didUninstallEvent.fire({ identifier: local.identifier }); + assert.ok(testObject.enabled); + assert.equal(testObject.tooltip, 'Please reload Visual Studio Code to complete the uninstallation of this extension.'); + }); + + test('Test ReloadAction when extension is uninstalled and can be removed', async () => { + const local = aLocalExtension('a'); + instantiationService.stub(IExtensionService, >{ + getExtensions: () => Promise.resolve([ExtensionsActions.toExtensionDescription(local)]), + onDidChangeExtensions: new Emitter().event, + canRemoveExtension: (extension) => true, + canAddExtension: (extension) => true }); + const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction); + instantiationService.createInstance(ExtensionContainers, [testObject]); + instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', [local]); + const extensions = await instantiationService.get(IExtensionsWorkbenchService).queryLocal(); + testObject.extension = extensions[0]; + + uninstallEvent.fire(local.identifier); + didUninstallEvent.fire({ identifier: local.identifier }); + assert.ok(!testObject.enabled); }); test('Test ReloadAction when extension is uninstalled and installed', async () => { diff --git a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts index 53d85cbeaa8..e7350dc0c0c 100644 --- a/src/vs/workbench/services/extensions/electron-browser/extensionService.ts +++ b/src/vs/workbench/services/extensions/electron-browser/extensionService.ts @@ -203,6 +203,8 @@ export class ExtensionService extends AbstractExtensionService implements IExten // Update the local registry const result = this._registry.deltaExtensions(toAdd, toRemove.map(e => e.identifier)); + this._onDidChangeExtensions.fire(undefined); + toRemove = toRemove.concat(result.removedDueToLooping); if (result.removedDueToLooping.length > 0) { this._logOrShowMessage(Severity.Error, nls.localize('looping', "The following extensions contain dependency loops and have been disabled: {0}", result.removedDueToLooping.map(e => `'${e.identifier.value}'`).join(', '))); @@ -219,8 +221,6 @@ export class ExtensionService extends AbstractExtensionService implements IExten await this._extensionHostProcessManagers[0].deltaExtensions(toAdd, toRemove.map(e => e.identifier)); } - this._onDidChangeExtensions.fire(undefined); - for (let i = 0; i < toAdd.length; i++) { this._activateAddedExtensionIfNeeded(toAdd[i]); }