Skip to content

Commit 624618f

Browse files
authored
1 parent 961db7e commit 624618f

File tree

2 files changed

+80
-7
lines changed

2 files changed

+80
-7
lines changed

src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1030,12 +1030,12 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
10301030
const extensionInOtherServer = this.installed.filter(e => areSameExtensions(e.identifier, extension!.identifier) && e.server !== extension!.server)[0];
10311031
if (extensionInOtherServer) {
10321032
// This extension prefers to run on UI/Local side but is running in remote
1033-
if (runningExtensionServer === this.extensionManagementServerService.remoteExtensionManagementServer && this.extensionManifestPropertiesService.prefersExecuteOnUI(extension.local!.manifest)) {
1033+
if (runningExtensionServer === this.extensionManagementServerService.remoteExtensionManagementServer && this.extensionManifestPropertiesService.prefersExecuteOnUI(extension.local!.manifest) && extensionInOtherServer.server === this.extensionManagementServerService.localExtensionManagementServer) {
10341034
return nls.localize('enable locally', "Please reload Visual Studio Code to enable this extension locally.");
10351035
}
10361036

10371037
// This extension prefers to run on Workspace/Remote side but is running in local
1038-
if (runningExtensionServer === this.extensionManagementServerService.localExtensionManagementServer && this.extensionManifestPropertiesService.prefersExecuteOnWorkspace(extension.local!.manifest)) {
1038+
if (runningExtensionServer === this.extensionManagementServerService.localExtensionManagementServer && this.extensionManifestPropertiesService.prefersExecuteOnWorkspace(extension.local!.manifest) && extensionInOtherServer.server === this.extensionManagementServerService.remoteExtensionManagementServer) {
10391039
return nls.localize('enable remote', "Please reload Visual Studio Code to enable this extension in {0}.", this.extensionManagementServerService.remoteExtensionManagementServer?.label);
10401040
}
10411041
}

src/vs/workbench/contrib/extensions/test/electron-browser/extensionsActions.test.ts

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1646,6 +1646,62 @@ suite('ReloadAction', () => {
16461646
assert.ok(testObject.extension);
16471647
assert.ok(testObject.enabled);
16481648
});
1649+
1650+
test('Test ReloadAction when ui+workspace+web extension is installed in web and remote and running in remote', async () => {
1651+
// multi server setup
1652+
const gallery = aGalleryExtension('a');
1653+
const webExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeUserData }) });
1654+
const remoteExtension = aLocalExtension('a', { extensionKind: ['ui', 'workspace'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeRemote }) });
1655+
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, null, createExtensionManagementService([remoteExtension]), createExtensionManagementService([webExtension]));
1656+
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
1657+
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
1658+
instantiationService.stub(IExtensionService, <Partial<IExtensionService>>{
1659+
extensions: [toExtensionDescription(remoteExtension)],
1660+
onDidChangeExtensions: Event.None,
1661+
canAddExtension: (extension) => false,
1662+
whenInstalledExtensionsRegistered: () => Promise.resolve(true)
1663+
});
1664+
const workbenchService: IExtensionsWorkbenchService = instantiationService.createInstance(ExtensionsWorkbenchService);
1665+
instantiationService.set(IExtensionsWorkbenchService, workbenchService);
1666+
1667+
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
1668+
instantiationService.createInstance(ExtensionContainers, [testObject]);
1669+
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
1670+
1671+
await workbenchService.queryGallery(CancellationToken.None);
1672+
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
1673+
testObject.extension = extensions[0];
1674+
assert.ok(testObject.extension);
1675+
assert.ok(!testObject.enabled);
1676+
});
1677+
1678+
test('Test ReloadAction when workspace+ui+web extension is installed in web and local and running in local', async () => {
1679+
// multi server setup
1680+
const gallery = aGalleryExtension('a');
1681+
const webExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'], 'browser': 'browser.js' }, { location: URI.file('pub.a').with({ scheme: Schemas.vscodeUserData }) });
1682+
const localExtension = aLocalExtension('a', { extensionKind: ['workspace', 'ui'], 'browser': 'browser.js' }, { location: URI.file('pub.a') });
1683+
const extensionManagementServerService = aMultiExtensionManagementServerService(instantiationService, createExtensionManagementService([localExtension]), null, createExtensionManagementService([webExtension]));
1684+
instantiationService.stub(IExtensionManagementServerService, extensionManagementServerService);
1685+
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
1686+
instantiationService.stub(IExtensionService, <Partial<IExtensionService>>{
1687+
extensions: [toExtensionDescription(localExtension)],
1688+
onDidChangeExtensions: Event.None,
1689+
canAddExtension: (extension) => false,
1690+
whenInstalledExtensionsRegistered: () => Promise.resolve(true)
1691+
});
1692+
const workbenchService: IExtensionsWorkbenchService = instantiationService.createInstance(ExtensionsWorkbenchService);
1693+
instantiationService.set(IExtensionsWorkbenchService, workbenchService);
1694+
1695+
const testObject: ExtensionsActions.ReloadAction = instantiationService.createInstance(ExtensionsActions.ReloadAction);
1696+
instantiationService.createInstance(ExtensionContainers, [testObject]);
1697+
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(gallery));
1698+
1699+
await workbenchService.queryGallery(CancellationToken.None);
1700+
const extensions = await workbenchService.queryLocal(extensionManagementServerService.remoteExtensionManagementServer!);
1701+
testObject.extension = extensions[0];
1702+
assert.ok(testObject.extension);
1703+
assert.ok(!testObject.enabled);
1704+
});
16491705
});
16501706

16511707
suite('RemoteInstallAction', () => {
@@ -2519,34 +2575,51 @@ function aSingleRemoteExtensionManagementServerService(instantiationService: Tes
25192575
};
25202576
}
25212577

2522-
function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IProfileAwareExtensionManagementService, remoteExtensionManagementService?: IProfileAwareExtensionManagementService): IExtensionManagementServerService {
2523-
const localExtensionManagementServer: IExtensionManagementServer = {
2578+
function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IProfileAwareExtensionManagementService | null, remoteExtensionManagementService?: IProfileAwareExtensionManagementService | null, webExtensionManagementService?: IProfileAwareExtensionManagementService): IExtensionManagementServerService {
2579+
const localExtensionManagementServer: IExtensionManagementServer | null = localExtensionManagementService === null ? null : {
25242580
id: 'vscode-local',
25252581
label: 'local',
25262582
extensionManagementService: localExtensionManagementService || createExtensionManagementService(),
25272583
};
2528-
const remoteExtensionManagementServer: IExtensionManagementServer = {
2584+
const remoteExtensionManagementServer: IExtensionManagementServer | null = remoteExtensionManagementService === null ? null : {
25292585
id: 'vscode-remote',
25302586
label: 'remote',
25312587
extensionManagementService: remoteExtensionManagementService || createExtensionManagementService(),
25322588
};
2589+
const webExtensionManagementServer: IExtensionManagementServer | null = webExtensionManagementService ? {
2590+
id: 'vscode-web',
2591+
label: 'web',
2592+
extensionManagementService: webExtensionManagementService,
2593+
} : null;
25332594
return {
25342595
_serviceBrand: undefined,
25352596
localExtensionManagementServer,
25362597
remoteExtensionManagementServer,
2537-
webExtensionManagementServer: null,
2598+
webExtensionManagementServer,
25382599
getExtensionManagementServer: (extension: IExtension) => {
25392600
if (extension.location.scheme === Schemas.file) {
25402601
return localExtensionManagementServer;
25412602
}
25422603
if (extension.location.scheme === Schemas.vscodeRemote) {
25432604
return remoteExtensionManagementServer;
25442605
}
2606+
if (extension.location.scheme === Schemas.vscodeUserData) {
2607+
return webExtensionManagementServer;
2608+
}
25452609
throw new Error('');
25462610
},
25472611
getExtensionInstallLocation(extension: IExtension): ExtensionInstallLocation | null {
25482612
const server = this.getExtensionManagementServer(extension);
2549-
return server === remoteExtensionManagementServer ? ExtensionInstallLocation.Remote : ExtensionInstallLocation.Local;
2613+
if (server === null) {
2614+
return null;
2615+
}
2616+
if (server === remoteExtensionManagementServer) {
2617+
return ExtensionInstallLocation.Remote;
2618+
}
2619+
if (server === webExtensionManagementServer) {
2620+
return ExtensionInstallLocation.Web;
2621+
}
2622+
return ExtensionInstallLocation.Local;
25502623
}
25512624
};
25522625
}

0 commit comments

Comments
 (0)