override virtual workspace capability in web and enable web extensions

This commit is contained in:
Sandeep Somavarapu 2021-07-01 11:54:17 +02:00
parent 5278e78731
commit 8904d9f25b
No known key found for this signature in database
GPG key ID: 1FED25EC4646638B
3 changed files with 48 additions and 9 deletions

View file

@ -2111,21 +2111,27 @@ export class SystemDisabledWarningAction extends ExtensionAction {
}
if (isVirtualWorkspace(this.contextService.getWorkspace())) {
const virtualSupportType = this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(this.extension.local.manifest);
if (virtualSupportType !== true) {
if (this.extension.enablementState === EnablementState.DisabledByVirtualWorkspace) {
this.class = `${SystemDisabledWarningAction.INFO_CLASS}`;
const details = getWorkpaceSupportTypeMessage(this.extension.local.manifest.capabilities?.virtualWorkspaces);
this.tooltip = details || (virtualSupportType === 'limited' ?
localize('extension limited because of virtual workspace', "This extension has limited features because the current workspace is virtual.") :
localize('disabled because of virtual workspace', "This extension has been disabled because it does not support virtual workspaces."));
this.tooltip = localize('disabled because of virtual workspace', "This extension has been disabled because it does not support virtual workspaces.");
return;
}
const virtualSupportType = this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(this.extension.local.manifest);
const details = getWorkpaceSupportTypeMessage(this.extension.local.manifest.capabilities?.virtualWorkspaces);
if (virtualSupportType === 'limited' || details) {
this.class = `${SystemDisabledWarningAction.INFO_CLASS}`;
this.tooltip = localize('extension limited because of virtual workspace', "This extension has limited features because the current workspace is virtual.");
}
return;
}
if (this.extension.enablementState === EnablementState.DisabledByExtensionDependency) {
this.class = `${SystemDisabledWarningAction.WARNING_CLASS}`;
this.tooltip = localize('extension disabled because of dependency', "This extension has been disabled because it depends on an extension that is disabled.");
return;
}
if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) {
if (isLanguagePackExtension(this.extension.local.manifest)) {
if (!this.extensionsWorkbenchService.installed.some(e => areSameExtensions(e.identifier, this.extension!.identifier) && e.server !== this.extension!.server)) {
@ -2137,6 +2143,7 @@ export class SystemDisabledWarningAction extends ExtensionAction {
return;
}
}
if (this.extension.enablementState === EnablementState.DisabledByExtensionKind) {
if (!this.extensionsWorkbenchService.installed.some(e => areSameExtensions(e.identifier, this.extension!.identifier) && e.server !== this.extension!.server)) {
const server = this.extensionManagementServerService.localExtensionManagementServer === this.extension.server ? this.extensionManagementServerService.remoteExtensionManagementServer : this.extensionManagementServerService.localExtensionManagementServer;
@ -2149,6 +2156,7 @@ export class SystemDisabledWarningAction extends ExtensionAction {
return;
}
}
if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) {
const runningExtension = this._runningExtensions.filter(e => areSameExtensions({ id: e.identifier.value, uuid: e.uuid }, this.extension!.identifier))[0];
const runningExtensionServer = runningExtension ? this.extensionManagementServerService.getExtensionManagementServer(toExtension(runningExtension)) : null;
@ -2167,6 +2175,7 @@ export class SystemDisabledWarningAction extends ExtensionAction {
return;
}
}
if (this.workspaceTrustService.workspaceTrustEnabled && !this.workspaceTrustService.isWorkpaceTrusted() && this.extension.enablementState === EnablementState.DisabledByTrustRequirement) {
const untrustedSupportType = this.extensionManifestPropertiesService.getExtensionUntrustedWorkspaceSupportType(this.extension.local.manifest);
const untrustedDetails = getWorkpaceSupportTypeMessage(this.extension.local.manifest.capabilities?.untrustedWorkspaces);

View file

@ -278,10 +278,22 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
}
private _isDisabledByVirtualWorkspace(extension: IExtension): boolean {
if (isVirtualWorkspace(this.contextService.getWorkspace())) {
return this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(extension.manifest) === false;
// Not a virtual workspace
if (!isVirtualWorkspace(this.contextService.getWorkspace())) {
return false;
}
return false;
// Supports virtual workspace
if (this.extensionManifestPropertiesService.getExtensionVirtualWorkspaceSupportType(extension.manifest) !== false) {
return false;
}
// Web extension from web extension management server
if (this.extensionManagementServerService.getExtensionManagementServer(extension) === this.extensionManagementServerService.webExtensionManagementServer && this.extensionManifestPropertiesService.canExecuteOnWeb(extension.manifest)) {
return false;
}
return true;
}
private _isDisabledByExtensionKind(extension: IExtension): boolean {

View file

@ -505,6 +505,24 @@ suite('ExtensionEnablementService Test', () => {
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);
});
test('test web extension from web extension management server and does not support vitrual workspace is enabled in virtual workspace', async () => {
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'web' }) });
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
testObject = new TestExtensionEnablementService(instantiationService);
assert.ok(testObject.isEnabled(extension));
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.EnabledGlobally);
});
test('test web extension from remote extension management server and does not support vitrual workspace is disabled in virtual workspace', async () => {
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService(null, anExtensionManagementServer('vscode-remote', instantiationService), anExtensionManagementServer('web', instantiationService)));
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false }, browser: 'browser.js' }, { location: URI.file(`pub.a`).with({ scheme: 'vscode-remote' }) });
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });
testObject = new TestExtensionEnablementService(instantiationService);
assert.ok(!testObject.isEnabled(extension));
assert.deepStrictEqual(testObject.getEnablementState(extension), EnablementState.DisabledByVirtualWorkspace);
});
test('test canChangeEnablement return false when extension is disabled in virtual workspace', () => {
const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } });
instantiationService.stub(IWorkspaceContextService, 'getWorkspace', <IWorkspace>{ folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] });