/*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; import { IExtensionManifest, ExtensionUntrustedWorkspaceSupportType } from 'vs/platform/extensions/common/extensions'; import { ExtensionManifestPropertiesService } from 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; import { TestConfigurationService } from 'vs/platform/configuration/test/common/testConfigurationService'; import { TestProductService } from 'vs/workbench/test/common/workbenchTestServices'; import { TestInstantiationService } from 'vs/platform/instantiation/test/common/instantiationServiceMock'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { IProductService } from 'vs/platform/product/common/productService'; import { isWeb } from 'vs/base/common/platform'; import { TestWorkspaceTrustEnablementService } from 'vs/workbench/services/workspaces/test/common/testWorkspaceTrustService'; import { IWorkspaceTrustEnablementService } from 'vs/platform/workspace/common/workspaceTrust'; import { NullLogService } from 'vs/platform/log/common/log'; suite('ExtensionManifestPropertiesService - ExtensionKind', () => { let testObject = new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService(), new TestWorkspaceTrustEnablementService(), new NullLogService()); test('declarative with extension dependencies', () => { assert.deepStrictEqual(testObject.getExtensionKind({ extensionDependencies: ['ext1'] }), ['workspace', 'web']); }); test('declarative extension pack', () => { assert.deepStrictEqual(testObject.getExtensionKind({ extensionPack: ['ext1', 'ext2'] }), ['workspace', 'web']); }); test('declarative extension pack and extension dependencies', () => { assert.deepStrictEqual(testObject.getExtensionKind({ extensionPack: ['ext1', 'ext2'], extensionDependencies: ['ext1', 'ext2'] }), ['workspace', 'web']); }); test('declarative with unknown contribution point => workspace, web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ contributes: { 'unknownPoint': { something: true } } }), ['workspace', 'web']); }); test('declarative extension pack with unknown contribution point', () => { assert.deepStrictEqual(testObject.getExtensionKind({ extensionPack: ['ext1', 'ext2'], contributes: { 'unknownPoint': { something: true } } }), ['workspace', 'web']); }); test('simple declarative => ui, workspace, web', () => { assert.deepStrictEqual(testObject.getExtensionKind({}), ['ui', 'workspace', 'web']); }); test('only browser => web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ browser: 'main.browser.js' }), ['web']); }); test('only main => workspace', () => { assert.deepStrictEqual(testObject.getExtensionKind({ main: 'main.js' }), ['workspace']); }); test('main and browser => workspace, web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ main: 'main.js', browser: 'main.browser.js' }), ['workspace', 'web']); }); test('browser entry point with workspace extensionKind => workspace, web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ main: 'main.js', browser: 'main.browser.js', extensionKind: ['workspace'] }), ['workspace', 'web']); }); test('only browser entry point with out extensionKind => web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ browser: 'main.browser.js' }), ['web']); }); test('simple descriptive with workspace, ui extensionKind => workspace, ui, web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ extensionKind: ['workspace', 'ui'] }), ['workspace', 'ui', 'web']); }); test('opt out from web through settings even if it can run in web', () => { testObject = new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()); assert.deepStrictEqual(testObject.getExtensionKind({ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['ui', 'workspace']); }); test('opt out from web and include only workspace through settings even if it can run in web', () => { testObject = new ExtensionManifestPropertiesService(TestProductService, new TestConfigurationService({ remote: { extensionKind: { 'pub.a': ['-web', 'workspace'] } } }), new TestWorkspaceTrustEnablementService(), new NullLogService()); assert.deepStrictEqual(testObject.getExtensionKind({ browser: 'main.browser.js', publisher: 'pub', name: 'a' }), ['workspace']); }); test('extension cannot opt out from web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ browser: 'main.browser.js', extensionKind: ['-web'] }), ['web']); }); test('extension cannot opt into web', () => { assert.deepStrictEqual(testObject.getExtensionKind({ main: 'main.js', extensionKind: ['web', 'workspace', 'ui'] }), ['workspace', 'ui']); }); test('extension cannot opt into web only', () => { assert.deepStrictEqual(testObject.getExtensionKind({ main: 'main.js', extensionKind: ['web'] }), []); }); }); // Workspace Trust is disabled in web at the moment if (!isWeb) { suite('ExtensionManifestPropertiesService - ExtensionUntrustedWorkspaceSupportType', () => { let testObject: ExtensionManifestPropertiesService; let instantiationService: TestInstantiationService; let testConfigurationService: TestConfigurationService; setup(async () => { instantiationService = new TestInstantiationService(); testConfigurationService = new TestConfigurationService(); instantiationService.stub(IConfigurationService, testConfigurationService); }); teardown(() => testObject.dispose()); function assertUntrustedWorkspaceSupport(extensionMaifest: IExtensionManifest, expected: ExtensionUntrustedWorkspaceSupportType): void { testObject = instantiationService.createInstance(ExtensionManifestPropertiesService); const untrustedWorkspaceSupport = testObject.getExtensionUntrustedWorkspaceSupportType(extensionMaifest); assert.strictEqual(untrustedWorkspaceSupport, expected); } function getExtensionManifest(properties: any = {}): IExtensionManifest { return Object.create({ name: 'a', publisher: 'pub', version: '1.0.0', ...properties }) as IExtensionManifest; } test('test extension workspace trust request when main entry point is missing', () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest(); assertUntrustedWorkspaceSupport(extensionMaifest, true); }); test('test extension workspace trust request when workspace trust is disabled', async () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService(false)); const extensionMaifest = getExtensionManifest({ main: './out/extension.js' }); assertUntrustedWorkspaceSupport(extensionMaifest, true); }); test('test extension workspace trust request when "true" override exists in settings.json', async () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true } } }); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } }); assertUntrustedWorkspaceSupport(extensionMaifest, true); }); test('test extension workspace trust request when override (false) exists in settings.json', async () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false } } }); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } }); assertUntrustedWorkspaceSupport(extensionMaifest, false); }); test('test extension workspace trust request when override (true) for the version exists in settings.json', async () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '1.0.0' } } }); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } }); assertUntrustedWorkspaceSupport(extensionMaifest, true); }); test('test extension workspace trust request when override (false) for the version exists in settings.json', async () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: false, version: '1.0.0' } } }); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } }); assertUntrustedWorkspaceSupport(extensionMaifest, false); }); test('test extension workspace trust request when override for a different version exists in settings.json', async () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); await testConfigurationService.setUserConfiguration('extensions', { supportUntrustedWorkspaces: { 'pub.a': { supported: true, version: '2.0.0' } } }); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } }); assertUntrustedWorkspaceSupport(extensionMaifest, 'limited'); }); test('test extension workspace trust request when default (true) exists in product.json', () => { instantiationService.stub(IProductService, >{ extensionUntrustedWorkspaceSupport: { 'pub.a': { default: true } } }); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest({ main: './out/extension.js' }); assertUntrustedWorkspaceSupport(extensionMaifest, true); }); test('test extension workspace trust request when default (false) exists in product.json', () => { instantiationService.stub(IProductService, >{ extensionUntrustedWorkspaceSupport: { 'pub.a': { default: false } } }); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest({ main: './out/extension.js' }); assertUntrustedWorkspaceSupport(extensionMaifest, false); }); test('test extension workspace trust request when override (limited) exists in product.json', () => { instantiationService.stub(IProductService, >{ extensionUntrustedWorkspaceSupport: { 'pub.a': { override: 'limited' } } }); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } }); assertUntrustedWorkspaceSupport(extensionMaifest, 'limited'); }); test('test extension workspace trust request when override (false) exists in product.json', () => { instantiationService.stub(IProductService, >{ extensionUntrustedWorkspaceSupport: { 'pub.a': { override: false } } }); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: true } } }); assertUntrustedWorkspaceSupport(extensionMaifest, false); }); test('test extension workspace trust request when value exists in package.json', () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest({ main: './out/extension.js', capabilities: { untrustedWorkspaces: { supported: 'limited' } } }); assertUntrustedWorkspaceSupport(extensionMaifest, 'limited'); }); test('test extension workspace trust request when no value exists in package.json', () => { instantiationService.stub(IProductService, >{}); instantiationService.stub(IWorkspaceTrustEnablementService, new TestWorkspaceTrustEnablementService()); const extensionMaifest = getExtensionManifest({ main: './out/extension.js' }); assertUntrustedWorkspaceSupport(extensionMaifest, false); }); }); }