Skip to content

Commit

Permalink
check for dependency exports (#228704)
Browse files Browse the repository at this point in the history
  • Loading branch information
sandy081 authored Sep 16, 2024
1 parent e6228eb commit 0417a90
Show file tree
Hide file tree
Showing 2 changed files with 68 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -467,11 +467,15 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench
}

private _isDisabledByExtensionDependency(extension: IExtension, extensions: ReadonlyArray<IExtension>, workspaceType: WorkspaceType, computedEnablementStates: Map<IExtension, EnablementState>): boolean {
// Find dependencies from the same server as of the extension
const dependencyExtensions = extension.manifest.extensionDependencies
? extensions.filter(e =>
extension.manifest.extensionDependencies!.some(id => areSameExtensions(e.identifier, { id }) && this.extensionManagementServerService.getExtensionManagementServer(e) === this.extensionManagementServerService.getExtensionManagementServer(extension)))
: [];

if (!extension.manifest.extensionDependencies) {
return false;
}

// Find dependency that is from the same server or does not exports any API
const dependencyExtensions = extensions.filter(e =>
extension.manifest.extensionDependencies?.some(id => areSameExtensions(e.identifier, { id })
&& (this.extensionManagementServerService.getExtensionManagementServer(e) === this.extensionManagementServerService.getExtensionManagementServer(extension) || ((e.manifest.main || e.manifest.browser) && e.manifest.api === 'none'))));

if (!dependencyExtensions.length) {
return false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -988,6 +988,65 @@ suite('ExtensionEnablementService Test', () => {
assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
});

test('test extension is not disabled when it has a dependency in another server', async () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
installed.push(...[target, depdencyOnAnotherServer]);
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();

assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
});

test('test extension is enabled when it has a dependency in another server which is disabled', async () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
const depdencyOnAnotherServer = aLocalExtension2('pub.b', {}, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
installed.push(...[target, depdencyOnAnotherServer]);
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);

assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
});

test('test extension is enabled when it has a dependency in another server which is disabled and with no exports and no main and no browser entrypoints', async () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
installed.push(...[target, depdencyOnAnotherServer]);
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);

assert.strictEqual(testObject.getEnablementState(target), EnablementState.EnabledGlobally);
});

test('test extension is disabled by dependency when it has a dependency in another server which is disabled and with no exports and has main entry point', async () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'], extensionKind: ['ui'] }, { location: URI.file(`pub.a`) });
const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', main: 'main.js' }, { location: URI.file(`pub.b`).with({ scheme: Schemas.vscodeRemote }) });
installed.push(...[target, depdencyOnAnotherServer]);
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);

assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);
});

test('test extension is disabled by dependency when it has a dependency in another server which is disabled and with no exports and has browser entry point', async () => {
instantiationService.stub(IExtensionManagementServerService, aMultiExtensionManagementServerService(instantiationService));
const target = aLocalExtension2('pub.a', { extensionDependencies: ['pub.b'] }, { location: URI.file(`pub.a`).with({ scheme: Schemas.vscodeRemote }) });
const depdencyOnAnotherServer = aLocalExtension2('pub.b', { api: 'none', browser: 'browser.js', extensionKind: 'ui' }, { location: URI.file(`pub.b`) });
installed.push(...[target, depdencyOnAnotherServer]);
testObject = disposableStore.add(new TestExtensionEnablementService(instantiationService));
await (<TestExtensionEnablementService>testObject).waitUntilInitialized();
await testObject.setEnablement([depdencyOnAnotherServer], EnablementState.DisabledGlobally);

assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByExtensionDependency);
});

test('test extension is disabled by invalidity', async () => {
const target = aLocalExtension2('pub.b', {}, { isValid: false });
assert.strictEqual(testObject.getEnablementState(target), EnablementState.DisabledByInvalidExtension);
Expand Down

0 comments on commit 0417a90

Please sign in to comment.