Skip to content

Commit 0699aca

Browse files
authored
1 parent 49101b1 commit 0699aca

File tree

5 files changed

+42
-5
lines changed

5 files changed

+42
-5
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,11 @@ export class ExtensionRecommendationNotificationService extends Disposable imple
444444
}
445445
if (resourceExtensions.length) {
446446
const extensions = await this.extensionsWorkbenchService.getResourceExtensions(resourceExtensions, true);
447-
result.push(...extensions);
447+
for (const extension of extensions) {
448+
if (await this.extensionsWorkbenchService.canInstall(extension)) {
449+
result.push(extension);
450+
}
451+
}
448452
}
449453
}
450454
return result;

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -910,7 +910,11 @@ export class ExtensionsListView extends ViewPane {
910910
}
911911
if (resourceExtensions.length) {
912912
const extensions = await this.extensionsWorkbenchService.getResourceExtensions(resourceExtensions, true);
913-
result.push(...extensions);
913+
for (const extension of extensions) {
914+
if (await this.extensionsWorkbenchService.canInstall(extension)) {
915+
result.push(extension);
916+
}
917+
}
914918
}
915919
}
916920
return result;

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,7 +1028,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
10281028
changedExtensions.push(...extensions);
10291029
}
10301030
if (workspaceExtensions.length) {
1031-
const extensions = await this.getResourceExtensions(workspaceExtensions.map(e => e.extensionLocation), true)
1031+
const extensions = await this.getResourceExtensions(workspaceExtensions.map(e => e.extensionLocation), true);
10321032
changedExtensions.push(...extensions);
10331033
}
10341034
for (const changedExtension of changedExtensions) {
@@ -1891,7 +1891,7 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
18911891
return false;
18921892
}
18931893

1894-
if (extension.resourceExtension) {
1894+
if (extension.resourceExtension && await this.extensionManagementService.canInstall(extension.resourceExtension)) {
18951895
return true;
18961896
}
18971897

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ export interface IWorkbenchExtensionManagementService extends IProfileAwareExten
6969
getExtensions(locations: URI[]): Promise<IResourceExtension[]>;
7070
getInstalledWorkspaceExtensions(includeInvalid: boolean): Promise<ILocalExtension[]>;
7171

72+
canInstall(extension: IGalleryExtension | IResourceExtension): Promise<boolean>;
73+
7274
installVSIX(location: URI, manifest: IExtensionManifest, installOptions?: InstallOptions): Promise<ILocalExtension>;
7375
installFromLocation(location: URI): Promise<ILocalExtension>;
7476
installResourceExtension(extension: IResourceExtension, installOptions: InstallOptions): Promise<ILocalExtension>;

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

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag
3939
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity';
4040
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry';
4141

42+
function isResourceExtension(extension: any): extension is IResourceExtension {
43+
return extension && !!(extension as IResourceExtension).manifest;
44+
}
45+
4246
export class ExtensionManagementService extends Disposable implements IWorkbenchExtensionManagementService {
4347

4448
declare readonly _serviceBrand: undefined;
@@ -315,7 +319,14 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
315319
return Promise.reject('No Servers');
316320
}
317321

318-
async canInstall(gallery: IGalleryExtension): Promise<boolean> {
322+
async canInstall(extension: IGalleryExtension | IResourceExtension): Promise<boolean> {
323+
if (isResourceExtension(extension)) {
324+
return this.canInstallResourceExtension(extension);
325+
}
326+
return this.canInstallGalleryExtension(extension);
327+
}
328+
329+
private async canInstallGalleryExtension(gallery: IGalleryExtension): Promise<boolean> {
319330
if (this.extensionManagementServerService.localExtensionManagementServer
320331
&& await this.extensionManagementServerService.localExtensionManagementServer.extensionManagementService.canInstall(gallery)) {
321332
return true;
@@ -337,6 +348,19 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
337348
return false;
338349
}
339350

351+
private canInstallResourceExtension(extension: IResourceExtension): boolean {
352+
if (this.extensionManagementServerService.localExtensionManagementServer) {
353+
return true;
354+
}
355+
if (this.extensionManagementServerService.remoteExtensionManagementServer && this.extensionManifestPropertiesService.canExecuteOnWorkspace(extension.manifest)) {
356+
return true;
357+
}
358+
if (this.extensionManagementServerService.webExtensionManagementServer && this.extensionManifestPropertiesService.canExecuteOnWeb(extension.manifest)) {
359+
return true;
360+
}
361+
return false;
362+
}
363+
340364
async updateFromGallery(gallery: IGalleryExtension, extension: ILocalExtension, installOptions?: InstallOptions): Promise<ILocalExtension> {
341365
const server = this.getServer(extension);
342366
if (!server) {
@@ -427,6 +451,9 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
427451
}
428452

429453
async installResourceExtension(extension: IResourceExtension, installOptions: InstallOptions): Promise<ILocalExtension> {
454+
if (!this.canInstallResourceExtension(extension)) {
455+
throw new Error('This extension cannot be installed in the current workspace.');
456+
}
430457
if (!installOptions.isWorkspaceScoped) {
431458
return this.installFromLocation(extension.location);
432459
}

0 commit comments

Comments
 (0)