#85036 extension kind ui should run only on ui

This commit is contained in:
Sandeep Somavarapu 2019-11-26 09:13:54 +01:00
parent 5ec2e40b21
commit dc5bff3872
4 changed files with 72 additions and 51 deletions

View file

@ -1253,6 +1253,10 @@ export class ReloadAction extends ExtensionAction {
this.label = localize('reloadRequired', "Reload Required");
this.tooltip = localize('postUpdateTooltip', "Please reload Visual Studio Code to enable the updated extension.");
}
} else {
this.enabled = true;
this.label = localize('reloadRequired', "Reload Required");
this.tooltip = localize('postEnableTooltip', "Please reload Visual Studio Code to enable this extension.");
}
}
} else {

View file

@ -1463,7 +1463,7 @@ suite('ExtensionsActions Test', () => {
assert.equal(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
});
test('Test ReloadAction is disabled when remote ui extension is installed in local server', async () => {
test('Test ReloadAction when ui extension is disabled on remote server and installed in local server', async () => {
// multi server setup
const gallery = aGalleryExtension('a');
const localExtensionManagementService = createExtensionManagementService([]);
@ -1478,7 +1478,7 @@ suite('ExtensionsActions Test', () => {
const onDidChangeExtensionsEmitter: Emitter<void> = new Emitter<void>();
instantiationService.stub(IExtensionService, <Partial<IExtensionService>>{
getExtensions: () => Promise.resolve([ExtensionsActions.toExtensionDescription(remoteExtension)]),
getExtensions: () => Promise.resolve([]),
onDidChangeExtensions: onDidChangeExtensionsEmitter.event,
canAddExtension: (extension) => false
});
@ -1495,7 +1495,8 @@ suite('ExtensionsActions Test', () => {
const localExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file('pub.a') });
onDidInstallEvent.fire({ identifier: localExtension.identifier, local: localExtension, operation: InstallOperation.Install });
assert.ok(!testObject.enabled);
assert.ok(testObject.enabled);
assert.equal(testObject.tooltip, 'Please reload Visual Studio Code to enable this extension.');
});
test('Test ReloadAction for remote ui extension is disabled when it is installed and enabled in local server', async () => {
@ -1529,37 +1530,6 @@ suite('ExtensionsActions Test', () => {
assert.ok(!testObject.enabled);
});
test('Test ReloadAction for local ui extension is disabled when it is installed and enabled in remote server', async () => {
// multi server setup
const gallery = aGalleryExtension('a');
const localExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file('pub.a') });
const localExtensionManagementService = createExtensionManagementService([localExtension]);
const onDidInstallEvent = new Emitter<DidInstallExtensionEvent>();
localExtensionManagementService.onDidInstallExtension = onDidInstallEvent.event;
const remoteExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteExtension]));
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
instantiationService.stub(IExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
const workbenchService: IExtensionsWorkbenchService = instantiationService.createInstance(ExtensionsWorkbenchService);
instantiationService.set(IExtensionsWorkbenchService, workbenchService);
const onDidChangeExtensionsEmitter: Emitter<void> = new Emitter<void>();
instantiationService.stub(IExtensionService, <Partial<IExtensionService>>{
getExtensions: () => Promise.resolve([ExtensionsActions.toExtensionDescription(remoteExtension)]),
onDidChangeExtensions: onDidChangeExtensionsEmitter.event,
canAddExtension: (extension) => false
});
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
instantiationService.createInstance(ExtensionContainers, [testObject]);
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
await workbenchService.queryGallery(CancellationToken.None);
const extensions = await workbenchService.queryLocal(extensionManagementServerService.localExtensionManagementServer!);
testObject.extension = extensions[0];
assert.ok(testObject.extension);
assert.ok(!testObject.enabled);
});
test('Test remote install action is enabled for local workspace extension', async () => {
// multi server setup
const localWorkspaceExtension = aLocalExtension('a', { extensionKind: 'workspace' }, { location: URI.file(`pub.a`) });
@ -1913,7 +1883,7 @@ suite('ExtensionsActions Test', () => {
assert.ok(!testObject.enabled);
});
test('Test local install action is disabled for remote ui extension', async () => {
test('Test local install action is enabled for remote ui extension', async () => {
// multi server setup
const remoteUIExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));
@ -1929,7 +1899,9 @@ suite('ExtensionsActions Test', () => {
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
await workbenchService.queryGallery(CancellationToken.None);
testObject.extension = extensions[0];
assert.ok(!testObject.enabled);
assert.ok(testObject.enabled);
assert.equal('Install Locally', testObject.label);
assert.equal('extension-action prominent install', testObject.class);
});
test('Test local install action when installing remote ui extension', async () => {
@ -1953,10 +1925,54 @@ suite('ExtensionsActions Test', () => {
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
await workbenchService.queryGallery(CancellationToken.None);
testObject.extension = extensions[0];
assert.ok(testObject.enabled);
assert.equal('Install Locally', testObject.label);
assert.equal('extension-action prominent install', testObject.class);
onInstallExtension.fire({ identifier: remoteUIExtension.identifier, gallery });
assert.ok(testObject.enabled);
assert.equal('Installing', testObject.label);
assert.equal('extension-action install installing', testObject.class);
});
test('Test local install action when installing remote ui extension is finished', async () => {
// multi server setup
const localExtensionManagementService: IExtensionManagementService = createExtensionManagementService();
const onInstallExtension = new Emitter<InstallExtensionEvent>();
localExtensionManagementService.onInstallExtension = onInstallExtension.event;
const onDidInstallEvent = new Emitter<DidInstallExtensionEvent>();
localExtensionManagementService.onDidInstallExtension = onDidInstallEvent.event;
const remoteUIExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, localExtensionManagementService, createExtensionManagementService([remoteUIExtension]));
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
instantiationService.stub(IExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
const workbenchService: IExtensionsWorkbenchService = instantiationService.createInstance(ExtensionsWorkbenchService);
instantiationService.stub(IExtensionsWorkbenchService, workbenchService, 'open', undefined);
instantiationService.set(IExtensionsWorkbenchService, workbenchService);
const gallery = aGalleryExtension('a', { identifier: remoteUIExtension.identifier });
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
const testObject: ExtensionsActions.InstallAction = instantiationService.createInstance(ExtensionsActions.LocalInstallAction);
instantiationService.createInstance(ExtensionContainers, [testObject]);
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
await workbenchService.queryGallery(CancellationToken.None);
testObject.extension = extensions[0];
assert.ok(testObject.enabled);
assert.equal('Install Locally', testObject.label);
assert.equal('extension-action prominent install', testObject.class);
onInstallExtension.fire({ identifier: remoteUIExtension.identifier, gallery });
assert.ok(testObject.enabled);
assert.equal('Installing', testObject.label);
assert.equal('extension-action install installing', testObject.class);
const installedExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`) });
onDidInstallEvent.fire({ identifier: installedExtension.identifier, local: installedExtension, operation: InstallOperation.Install });
assert.ok(!testObject.enabled);
});
test('Test local install action is disabled for disabled remote ui extension', async () => {
test('Test local install action is enabled for disabled remote ui extension', async () => {
// multi server setup
const remoteUIExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));
@ -1973,7 +1989,9 @@ suite('ExtensionsActions Test', () => {
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
await workbenchService.queryGallery(CancellationToken.None);
testObject.extension = extensions[0];
assert.ok(!testObject.enabled);
assert.ok(testObject.enabled);
assert.equal('Install Locally', testObject.label);
assert.equal('extension-action prominent install', testObject.class);
});
test('Test local install action is disabled when extension is not set', async () => {
@ -2073,7 +2091,7 @@ suite('ExtensionsActions Test', () => {
assert.ok(!testObject.enabled);
});
test('Test local install action is disabled for remote UI extension if it uninstalled locally', async () => {
test('Test local install action is disabled for remoteUI extension if it is uninstalled locally', async () => {
// multi server setup
const extensionManagementService = instantiationService.get(IExtensionManagementService);
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), extensionManagementService);
@ -2091,13 +2109,14 @@ suite('ExtensionsActions Test', () => {
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
await workbenchService.queryGallery(CancellationToken.None);
testObject.extension = extensions[0];
assert.ok(!testObject.enabled);
assert.ok(testObject.enabled);
assert.equal('Install Locally', testObject.label);
uninstallEvent.fire(remoteUIExtension.identifier);
assert.ok(!testObject.enabled);
});
test('Test local install action is disabled for remote UI extension if it has gallery', async () => {
test('Test local install action is enabled for remote UI extension if it has gallery', async () => {
// multi server setup
const remoteUIExtension = aLocalExtension('a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService(), createExtensionManagementService([remoteUIExtension]));
@ -2113,7 +2132,7 @@ suite('ExtensionsActions Test', () => {
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
testObject.extension = extensions[0];
assert.ok(testObject.extension);
assert.ok(!testObject.enabled);
assert.ok(testObject.enabled);
});
test('Test local install action is disabled for remote UI system extension', async () => {

View file

@ -15,7 +15,7 @@ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/
import { isUndefinedOrNull } from 'vs/base/common/types';
import { ExtensionType, IExtension } from 'vs/platform/extensions/common/extensions';
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
import { canExecuteOnUI } from 'vs/workbench/services/extensions/common/extensionsUtil';
import { getExtensionKind } from 'vs/workbench/services/extensions/common/extensionsUtil';
import { registerSingleton } from 'vs/platform/instantiation/common/extensions';
import { IProductService } from 'vs/platform/product/common/productService';
@ -147,11 +147,9 @@ export class ExtensionEnablementService extends Disposable implements IExtension
private _isDisabledByExtensionKind(extension: IExtension): boolean {
if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) {
if (!canExecuteOnUI(extension.manifest, this.productService, this.configurationService)) {
// workspace extensions must run on the remote, but UI extensions can run on either side
const server = this.extensionManagementServerService.remoteExtensionManagementServer;
return this.extensionManagementServerService.getExtensionManagementServer(extension.location) !== server;
}
const extensionKind = getExtensionKind(extension.manifest, this.productService, this.configurationService);
const server = extensionKind[0] === 'ui' ? this.extensionManagementServerService.localExtensionManagementServer : this.extensionManagementServerService.remoteExtensionManagementServer;
return this.extensionManagementServerService.getExtensionManagementServer(extension.location) !== server;
}
return false;
}

View file

@ -437,8 +437,8 @@ suite('ExtensionEnablementService Test', () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
testObject = new TestExtensionEnablementService(instantiationService);
assert.ok(testObject.isEnabled(localWorkspaceExtension));
assert.deepEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.EnabledGlobally);
assert.ok(!testObject.isEnabled(localWorkspaceExtension));
assert.deepEqual(testObject.getEnablementState(localWorkspaceExtension), EnablementState.DisabledByExtensionKind);
});
test('test remote workspace extension is not disabled by kind', async () => {
@ -453,7 +453,7 @@ suite('ExtensionEnablementService Test', () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const localWorkspaceExtension = aLocalExtension2('pub.a', { extensionKind: 'ui' }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
testObject = new TestExtensionEnablementService(instantiationService);
assert.equal(testObject.canChangeEnablement(localWorkspaceExtension), true);
assert.equal(testObject.canChangeEnablement(localWorkspaceExtension), false);
});
test('test canChangeEnablement return true for remote workspace extension', () => {