From 5d8f09d270863c20c3e2da60cc704f9f652ff7ce Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 22 Apr 2021 11:18:09 +0200 Subject: [PATCH] adopt to new capabilities api proposal --- src/vs/base/common/product.ts | 2 +- .../platform/extensions/common/extensions.ts | 8 +++-- .../api/common/configurationExtensionPoint.ts | 2 +- .../browser/extensions.contribution.ts | 4 +-- .../extensionEnablementService.test.ts | 8 ++--- .../extensionManifestPropertiesService.ts | 16 ++++----- .../extensions/common/extensionsRegistry.ts | 34 ++++++++++++++++--- 7 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/vs/base/common/product.ts b/src/vs/base/common/product.ts index a1b386590bc..12c6daa8a86 100644 --- a/src/vs/base/common/product.ts +++ b/src/vs/base/common/product.ts @@ -122,7 +122,7 @@ export interface IProductConfiguration { readonly extensionSyncedKeys?: { readonly [extensionId: string]: string[]; }; readonly extensionAllowedProposedApi?: readonly string[]; readonly extensionWorkspaceTrustRequest?: { readonly [extensionId: string]: ExtensionWorkspaceTrustRequest }; - readonly extensionSupportsVirtualWorkspace?: { readonly [extensionId: string]: { default?: boolean, override?: boolean } }; + readonly extensionVirtualWorkspacesSupport?: { readonly [extensionId: string]: { default?: boolean, override?: boolean } }; readonly msftInternalDomains?: string[]; readonly linkProtectionTrustedDomains?: readonly string[]; diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index adb997729f3..cf82afca70c 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -165,7 +165,8 @@ export interface IExtensionContributions { export type ExtensionKind = 'ui' | 'workspace' | 'web'; export type ExtensionWorkspaceTrustRequestType = 'never' | 'onStart' | 'onDemand'; -export type ExtensionWorkspaceTrust = { request: 'never'; } | { request: 'onStart', description: string } | { request: 'onDemand', description: string, requiredForConfigurations?: string[] }; +export type ExtensionWorkspaceTrust = { request: 'never'; } | { request: 'onStart', description: string } | { request: 'onDemand', description: string }; +export type UntrustedWorkspaces = { supported: true; } | { supported: false, description: string } | { supported: boolean | 'limited', description: string, restrictedConfigurations?: string[] }; export function isIExtensionIdentifier(thing: any): thing is IExtensionIdentifier { return thing @@ -222,8 +223,11 @@ export interface IExtensionManifest { readonly enableProposedApi?: boolean; readonly api?: string; readonly scripts?: { [key: string]: string; }; + readonly capabilities?: { + readonly virtualWorkspaces?: boolean; + readonly untrustedWorkspaces?: UntrustedWorkspaces; + }; readonly workspaceTrust?: ExtensionWorkspaceTrust; - readonly supportsVirtualWorkspace?: boolean; } export const enum ExtensionType { diff --git a/src/vs/workbench/api/common/configurationExtensionPoint.ts b/src/vs/workbench/api/common/configurationExtensionPoint.ts index 928eebebce9..e090357f0ca 100644 --- a/src/vs/workbench/api/common/configurationExtensionPoint.ts +++ b/src/vs/workbench/api/common/configurationExtensionPoint.ts @@ -170,7 +170,7 @@ configurationExtPoint.setHandler((extensions, { added, removed }) => { validateProperties(configuration, extension); configuration.id = node.id || extension.description.identifier.value; - configuration.extensionInfo = { id: extension.description.identifier.value, requireTrustForConfigurations: extension.description.workspaceTrust?.request === 'onDemand' ? extension.description.workspaceTrust?.requiredForConfigurations : undefined }; + configuration.extensionInfo = { id: extension.description.identifier.value, requireTrustForConfigurations: extension.description.capabilities?.untrustedWorkspaces?.supported === 'limited' ? extension.description.capabilities?.untrustedWorkspaces.restrictedConfigurations : undefined }; configuration.title = configuration.title || extension.description.displayName || extension.description.identifier.value; configurations.push(configuration); return configurations; diff --git a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts index 3074b9cb1e7..e074f1ba742 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensions.contribution.ts @@ -176,9 +176,9 @@ Registry.as(ConfigurationExtensions.Configuration) description: localize('extensionsWebWorker', "Enable web worker extension host."), default: false }, - 'extensions.supportsVirtualWorkspace': { + 'extensions.supportVirtualWorkspaces': { type: 'object', - markdownDescription: localize('extensions.supportsVirtualWorkspace', "Override the virtual workspace support of an extension"), + markdownDescription: localize('extensions.supportVirtualWorkspaces', "Override the virtual workspaces support of an extension"), patternProperties: { '([a-z0-9A-Z][a-z0-9\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\-A-Z]*)$': { type: 'boolean', diff --git a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts index 1540cd505c1..49e0126904f 100644 --- a/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts +++ b/src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts @@ -478,7 +478,7 @@ suite('ExtensionEnablementService Test', () => { }); test('test extension does not support vitrual workspace is not enabled in virtual workspace', async () => { - const extension = aLocalExtension2('pub.a', { supportsVirtualWorkspace: false }); + const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }); instantiationService.stub(IWorkspaceContextService, 'getWorkspace', { folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(!testObject.isEnabled(extension)); @@ -486,14 +486,14 @@ suite('ExtensionEnablementService Test', () => { }); test('test canChangeEnablement return false when extension is disabled in virtual workspace', () => { - const extension = aLocalExtension2('pub.a', { supportsVirtualWorkspace: false }); + const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }); instantiationService.stub(IWorkspaceContextService, 'getWorkspace', { folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(!testObject.canChangeEnablement(extension)); }); test('test extension does not support vitrual workspace is enabled in virtual workspace', async () => { - const extension = aLocalExtension2('pub.a', { supportsVirtualWorkspace: false }); + const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: false } }); instantiationService.stub(IWorkspaceContextService, 'getWorkspace', { folders: [{ uri: URI.file('worskapceA') }] }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(testObject.isEnabled(extension)); @@ -501,7 +501,7 @@ suite('ExtensionEnablementService Test', () => { }); test('test extension supports virtual workspace is enabled in virtual workspace', async () => { - const extension = aLocalExtension2('pub.a', { supportsVirtualWorkspace: true }); + const extension = aLocalExtension2('pub.a', { capabilities: { virtualWorkspaces: true } }); instantiationService.stub(IWorkspaceContextService, 'getWorkspace', { folders: [{ uri: URI.file('worskapceA').with(({ scheme: 'virtual' })) }] }); testObject = new TestExtensionEnablementService(instantiationService); assert.ok(testObject.isEnabled(extension)); diff --git a/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts b/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts index cacab97b21b..90d98828e39 100644 --- a/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts +++ b/src/vs/workbench/services/extensions/common/extensionManifestPropertiesService.ts @@ -163,7 +163,7 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE return userConfiguredVirtualWorkspaceSupport; } - const productConfiguredWorkspaceSchemes = this.getProductWorkspaceSchemes(manifest); + const productConfiguredWorkspaceSchemes = this.getProductVirtualWorkspaceSupport(manifest); // check override from product if (productConfiguredWorkspaceSchemes?.override !== undefined) { @@ -171,8 +171,8 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE } // check the manifest - if (manifest.supportsVirtualWorkspace !== undefined) { - return manifest.supportsVirtualWorkspace; + if (manifest.capabilities?.virtualWorkspaces !== undefined) { + return manifest.capabilities?.virtualWorkspaces; } // check default from product @@ -254,12 +254,12 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE return this._configuredExtensionKindsMap.get(ExtensionIdentifier.toKey(extensionId)); } - private getProductWorkspaceSchemes(manifest: IExtensionManifest): { default?: boolean, override?: boolean } | undefined { + private getProductVirtualWorkspaceSupport(manifest: IExtensionManifest): { default?: boolean, override?: boolean } | undefined { if (this._productVirtualWorkspaceSupportMap === null) { const productWorkspaceSchemesMap = new Map(); - if (this.productService.extensionSupportsVirtualWorkspace) { - for (const id of Object.keys(this.productService.extensionSupportsVirtualWorkspace)) { - productWorkspaceSchemesMap.set(ExtensionIdentifier.toKey(id), this.productService.extensionSupportsVirtualWorkspace[id]); + if (this.productService.extensionVirtualWorkspacesSupport) { + for (const id of Object.keys(this.productService.extensionVirtualWorkspacesSupport)) { + productWorkspaceSchemesMap.set(ExtensionIdentifier.toKey(id), this.productService.extensionVirtualWorkspacesSupport[id]); } } this._productVirtualWorkspaceSupportMap = productWorkspaceSchemesMap; @@ -272,7 +272,7 @@ export class ExtensionManifestPropertiesService extends Disposable implements IE private getConfiguredVirtualWorkspaceSupport(manifest: IExtensionManifest): boolean | undefined { if (this._configuredVirtualWorkspaceSupportMap === null) { const configuredWorkspaceSchemesMap = new Map(); - const configuredWorkspaceSchemes = this.configurationService.getValue<{ [key: string]: boolean }>('extensions.supportsVirtualWorkspace') || {}; + const configuredWorkspaceSchemes = this.configurationService.getValue<{ [key: string]: boolean }>('extensions.supportVirtualWorkspaces') || {}; for (const id of Object.keys(configuredWorkspaceSchemes)) { if (configuredWorkspaceSchemes[id] !== undefined) { configuredWorkspaceSchemesMap.set(ExtensionIdentifier.toKey(id), configuredWorkspaceSchemes[id]); diff --git a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts index 94f8a35a6cd..b33767dc12e 100644 --- a/src/vs/workbench/services/extensions/common/extensionsRegistry.ts +++ b/src/vs/workbench/services/extensions/common/extensionsRegistry.ts @@ -415,10 +415,36 @@ export const schema: IJSONSchema = { } ] }, - supportsVirtualWorkspace: { - description: nls.localize('supportsVirtualWorkspace', "When disabled the extension is not enabled in the workspace that has all folders using custom scheme. Default is `true`."), - type: 'boolean', - default: true + capabilities: { + description: nls.localize('capabilities', "Define the capabilities the extension can support"), + type: 'object', + properties: { + virtualWorkspaces: { + description: nls.localize('virtualWorkspaces', "Support for virtual workspaces. Default is to support."), + type: 'boolean', + default: true + }, + untrustedWorkspaces: { + description: nls.localize('untrustedWorkspaces', "Support for untrusted workspaces. Default is not to support."), + type: 'object', + properties: { + supported: { + description: nls.localize('untrustedWorkspaces.supported', ""), + type: ['boolean', 'string'], + enum: [true, false, 'limited'], + default: true + }, + description: { + description: nls.localize('untrustedWorkspaces.description', ""), + type: 'string', + }, + restrictedConfigurations: { + description: nls.localize('description.restrictedConfigurations', "List of restricted configuration keys in untrusted workspaces. Workspace values of these configurations will not be applied in an untrusted workspace."), + type: 'array', + } + }, + } + }, }, scripts: { type: 'object',