@@ -39,6 +39,10 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag
3939import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' ;
4040import { 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+
4246export 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