Skip to content

Commit 8743d95

Browse files
committed
introduce canInstall api in extension management service
1 parent e5be134 commit 8743d95

13 files changed

Lines changed: 90 additions & 29 deletions

src/vs/platform/extensionManagement/common/extensionGalleryService.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,8 @@ const PropertyType = {
115115
Dependency: 'Microsoft.VisualStudio.Code.ExtensionDependencies',
116116
ExtensionPack: 'Microsoft.VisualStudio.Code.ExtensionPack',
117117
Engine: 'Microsoft.VisualStudio.Code.Engine',
118-
LocalizedLanguages: 'Microsoft.VisualStudio.Code.LocalizedLanguages'
118+
LocalizedLanguages: 'Microsoft.VisualStudio.Code.LocalizedLanguages',
119+
WebExtension: 'Microsoft.VisualStudio.Code.WebExtension'
119120
};
120121

121122
interface ICriterium {
@@ -266,6 +267,11 @@ function getIsPreview(flags: string): boolean {
266267
return flags.indexOf('preview') !== -1;
267268
}
268269

270+
function getIsWebExtension(version: IRawGalleryExtensionVersion): boolean {
271+
const webExtensionProperty = version.properties ? version.properties.find(p => p.key === PropertyType.WebExtension) : undefined;
272+
return !!webExtensionProperty && webExtensionProperty.value === 'true';
273+
}
274+
269275
function toExtension(galleryExtension: IRawGalleryExtension, version: IRawGalleryExtensionVersion, index: number, query: Query, querySource?: string): IGalleryExtension {
270276
const assets = <IGalleryExtensionAssets>{
271277
manifest: getVersionAsset(version, AssetType.Manifest),
@@ -301,7 +307,8 @@ function toExtension(galleryExtension: IRawGalleryExtension, version: IRawGaller
301307
dependencies: getExtensions(version, PropertyType.Dependency),
302308
extensionPack: getExtensions(version, PropertyType.ExtensionPack),
303309
engine: getEngine(version),
304-
localizedLanguages: getLocalizedLanguages(version)
310+
localizedLanguages: getLocalizedLanguages(version),
311+
webExtension: getIsWebExtension(version)
305312
},
306313
/* __GDPR__FRAGMENT__
307314
"GalleryExtensionTelemetryData2" : {

src/vs/platform/extensionManagement/common/extensionManagement.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export interface IGalleryExtensionProperties {
1919
extensionPack?: string[];
2020
engine?: string;
2121
localizedLanguages?: string[];
22+
webExtension?: boolean;
2223
}
2324

2425
export interface IGalleryExtensionAsset {
@@ -204,6 +205,7 @@ export interface IExtensionManagementService {
204205
unzip(zipLocation: URI): Promise<IExtensionIdentifier>;
205206
getManifest(vsix: URI): Promise<IExtensionManifest>;
206207
install(vsix: URI, isMachineScoped?: boolean): Promise<ILocalExtension>;
208+
canInstall(extension: IGalleryExtension): Promise<boolean>;
207209
installFromGallery(extension: IGalleryExtension, isMachineScoped?: boolean): Promise<ILocalExtension>;
208210
uninstall(extension: ILocalExtension, force?: boolean): Promise<void>;
209211
reinstallFromGallery(extension: ILocalExtension): Promise<void>;

src/vs/platform/extensionManagement/common/extensionManagementIpc.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ export class ExtensionManagementChannel implements IServerChannel {
6363
case 'unzip': return this.service.unzip(transformIncomingURI(args[0], uriTransformer));
6464
case 'install': return this.service.install(transformIncomingURI(args[0], uriTransformer));
6565
case 'getManifest': return this.service.getManifest(transformIncomingURI(args[0], uriTransformer));
66+
case 'canInstall': return this.service.canInstall(args[0]);
6667
case 'installFromGallery': return this.service.installFromGallery(args[0]);
6768
case 'uninstall': return this.service.uninstall(transformIncomingExtension(args[0], uriTransformer), args[1]);
6869
case 'reinstallFromGallery': return this.service.reinstallFromGallery(transformIncomingExtension(args[0], uriTransformer));
@@ -104,6 +105,10 @@ export class ExtensionManagementChannelClient implements IExtensionManagementSer
104105
return Promise.resolve(this.channel.call<IExtensionManifest>('getManifest', [vsix]));
105106
}
106107

108+
async canInstall(extension: IGalleryExtension): Promise<boolean> {
109+
return true;
110+
}
111+
107112
installFromGallery(extension: IGalleryExtension): Promise<ILocalExtension> {
108113
return Promise.resolve(this.channel.call<ILocalExtension>('installFromGallery', [extension])).then(local => transformIncomingExtension(local, null));
109114
}

src/vs/platform/extensionManagement/node/extensionManagementService.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,10 @@ export class ExtensionManagementService extends Disposable implements IExtension
238238
));
239239
}
240240

241+
async canInstall(extension: IGalleryExtension): Promise<boolean> {
242+
return true;
243+
}
244+
241245
async installFromGallery(extension: IGalleryExtension, isMachineScoped?: boolean): Promise<ILocalExtension> {
242246
if (!this.galleryService.isEnabled()) {
243247
return Promise.reject(new Error(nls.localize('MarketPlaceDisabled', "Marketplace is not enabled")));

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ async function setupTest() {
101101
instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService {
102102
#localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', id: 'vscode-local' };
103103
constructor() {
104-
super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService), instantiationService.get(ILabelService));
104+
super(instantiationService.get(ISharedProcessService), instantiationService, instantiationService.get(IRemoteAgentService), instantiationService.get(ILabelService));
105105
}
106106
get localExtensionManagementServer(): IExtensionManagementServer { return this.#localExtensionManagementServer; }
107107
set localExtensionManagementServer(server: IExtensionManagementServer) { }

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ import { RemoteAgentService } from 'vs/workbench/services/remote/electron-browse
4040
import { ExtensionIdentifier, ExtensionType, IExtensionDescription } from 'vs/platform/extensions/common/extensions';
4141
import { ISharedProcessService } from 'vs/platform/ipc/electron-browser/sharedProcessService';
4242
import { ExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/electron-browser/extensionManagementServerService';
43-
import { IProductService } from 'vs/platform/product/common/productService';
4443
import { ILabelService } from 'vs/platform/label/common/label';
4544
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
4645
import { MockContextKeyService } from 'vs/platform/keybinding/test/common/mockKeybindingService';
@@ -101,7 +100,7 @@ suite('ExtensionsListView Tests', () => {
101100
instantiationService.stub(IExtensionManagementServerService, new class extends ExtensionManagementServerService {
102101
#localExtensionManagementServer: IExtensionManagementServer = { extensionManagementService: instantiationService.get(IExtensionManagementService), label: 'local', id: 'vscode-local' };
103102
constructor() {
104-
super(instantiationService.get(ISharedProcessService), instantiationService.get(IRemoteAgentService), instantiationService.get(IExtensionGalleryService), instantiationService.get(IConfigurationService), instantiationService.get(IProductService), instantiationService.get(ILogService), instantiationService.get(ILabelService));
103+
super(instantiationService.get(ISharedProcessService), instantiationService, instantiationService.get(IRemoteAgentService), instantiationService.get(ILabelService));
105104
}
106105
get localExtensionManagementServer(): IExtensionManagementServer { return this.#localExtensionManagementServer; }
107106
set localExtensionManagementServer(server: IExtensionManagementServer) { }

src/vs/workbench/electron-sandbox/sandbox.simpleservices.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -840,6 +840,7 @@ class SimpleExtensionManagementService implements IExtensionManagementService {
840840
async unzip(zipLocation: URI): Promise<IExtensionIdentifier> { throw new Error('Method not implemented.'); }
841841
async getManifest(vsix: URI): Promise<IExtensionManifest> { throw new Error('Method not implemented.'); }
842842
async install(vsix: URI, isMachineScoped?: boolean): Promise<ILocalExtension> { throw new Error('Method not implemented.'); }
843+
async canInstall(extension: IGalleryExtension): Promise<boolean> { throw new Error('Method not implemented.'); }
843844
async installFromGallery(extension: IGalleryExtension, isMachineScoped?: boolean): Promise<ILocalExtension> { throw new Error('Method not implemented.'); }
844845
async uninstall(extension: ILocalExtension, force?: boolean): Promise<void> { }
845846
async reinstallFromGallery(extension: ILocalExtension): Promise<void> { }

src/vs/workbench/services/extensionManagement/common/extensionManagementServerService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import { localize } from 'vs/nls';
77
import { IExtensionManagementServer, IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
8-
import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
98
import { IRemoteAgentService } from 'vs/workbench/services/remote/common/remoteAgentService';
109
import { REMOTE_HOST_SCHEME } from 'vs/platform/remote/common/remoteHosts';
1110
import { IChannel } from 'vs/base/parts/ipc/common/ipc';
@@ -15,6 +14,7 @@ import { isWeb } from 'vs/base/common/platform';
1514
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
1615
import { WebExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/webExtensionManagementService';
1716
import { IExtension } from 'vs/platform/extensions/common/extensions';
17+
import { WebRemoteExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/remoteExtensionManagementService';
1818

1919
export class ExtensionManagementServerService implements IExtensionManagementServerService {
2020

@@ -31,7 +31,7 @@ export class ExtensionManagementServerService implements IExtensionManagementSer
3131
) {
3232
const remoteAgentConnection = remoteAgentService.getConnection();
3333
if (remoteAgentConnection) {
34-
const extensionManagementService = new ExtensionManagementChannelClient(remoteAgentConnection!.getChannel<IChannel>('extensions'));
34+
const extensionManagementService = instantiationService.createInstance(WebRemoteExtensionManagementService, remoteAgentConnection!.getChannel<IChannel>('extensions'));
3535
this.remoteExtensionManagementServer = {
3636
id: 'remote',
3737
extensionManagementService,

src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,15 @@ export class ExtensionManagementService extends Disposable implements IExtension
189189
return Promise.reject('No Servers');
190190
}
191191

192+
async canInstall(gallery: IGalleryExtension): Promise<boolean> {
193+
for (const server of this.servers) {
194+
if (await server.extensionManagementService.canInstall(gallery)) {
195+
return true;
196+
}
197+
}
198+
return false;
199+
}
200+
192201
async installFromGallery(gallery: IGalleryExtension): Promise<ILocalExtension> {
193202

194203
// Only local server, install without any checks
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*---------------------------------------------------------------------------------------------
2+
* Copyright (c) Microsoft Corporation. All rights reserved.
3+
* Licensed under the MIT License. See License.txt in the project root for license information.
4+
*--------------------------------------------------------------------------------------------*/
5+
6+
import { IChannel } from 'vs/base/parts/ipc/common/ipc';
7+
import { IExtensionManagementService, IGalleryExtension, IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement';
8+
import { canExecuteOnWorkspace } from 'vs/workbench/services/extensions/common/extensionsUtil';
9+
import { CancellationToken } from 'vs/base/common/cancellation';
10+
import { IProductService } from 'vs/platform/product/common/productService';
11+
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
12+
import { ExtensionManagementChannelClient } from 'vs/platform/extensionManagement/common/extensionManagementIpc';
13+
14+
export class WebRemoteExtensionManagementService extends ExtensionManagementChannelClient implements IExtensionManagementService {
15+
16+
constructor(
17+
channel: IChannel,
18+
@IExtensionGalleryService protected readonly galleryService: IExtensionGalleryService,
19+
@IConfigurationService protected readonly configurationService: IConfigurationService,
20+
@IProductService protected readonly productService: IProductService
21+
) {
22+
super(channel);
23+
}
24+
25+
async canInstall(extension: IGalleryExtension): Promise<boolean> {
26+
const manifest = await this.galleryService.getManifest(extension, CancellationToken.None);
27+
return !!manifest && canExecuteOnWorkspace(manifest, this.productService, this.configurationService);
28+
}
29+
30+
}

0 commit comments

Comments
 (0)