@@ -39,6 +39,10 @@ import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storag
39
39
import { IUriIdentityService } from 'vs/platform/uriIdentity/common/uriIdentity' ;
40
40
import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry' ;
41
41
42
+ function isResourceExtension ( extension : any ) : extension is IResourceExtension {
43
+ return extension && ! ! ( extension as IResourceExtension ) . manifest ;
44
+ }
45
+
42
46
export class ExtensionManagementService extends Disposable implements IWorkbenchExtensionManagementService {
43
47
44
48
declare readonly _serviceBrand : undefined ;
@@ -315,7 +319,14 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
315
319
return Promise . reject ( 'No Servers' ) ;
316
320
}
317
321
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 > {
319
330
if ( this . extensionManagementServerService . localExtensionManagementServer
320
331
&& await this . extensionManagementServerService . localExtensionManagementServer . extensionManagementService . canInstall ( gallery ) ) {
321
332
return true ;
@@ -337,6 +348,19 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
337
348
return false ;
338
349
}
339
350
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
+
340
364
async updateFromGallery ( gallery : IGalleryExtension , extension : ILocalExtension , installOptions ?: InstallOptions ) : Promise < ILocalExtension > {
341
365
const server = this . getServer ( extension ) ;
342
366
if ( ! server ) {
@@ -427,6 +451,9 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
427
451
}
428
452
429
453
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
+ }
430
457
if ( ! installOptions . isWorkspaceScoped ) {
431
458
return this . installFromLocation ( extension . location ) ;
432
459
}
0 commit comments