diff --git a/extensions/typescript-language-features/package.json b/extensions/typescript-language-features/package.json index cf317858d04..877c0655ac8 100644 --- a/extensions/typescript-language-features/package.json +++ b/extensions/typescript-language-features/package.json @@ -10,7 +10,8 @@ "aiKey": "AIF-d9b70cd4-b9f9-4d70-929b-a071c400b217", "enableProposedApi": true, "workspaceTrust": { - "required": "onDemand" + "request": "onDemand", + "description": "The extension requires workspace trust when the workspace version is used because it executes code specified by the workspace." }, "engines": { "vscode": "^1.30.0" diff --git a/src/vs/platform/extensions/common/extensions.ts b/src/vs/platform/extensions/common/extensions.ts index dffd9588160..5a92f9860d0 100644 --- a/src/vs/platform/extensions/common/extensions.ts +++ b/src/vs/platform/extensions/common/extensions.ts @@ -158,8 +158,8 @@ export interface IExtensionContributions { } export type ExtensionKind = 'ui' | 'workspace' | 'web'; -export type ExtensionWorkspaceTrustRequirement = false | 'onStart' | 'onDemand'; -export type ExtensionWorkspaceTrust = { required: ExtensionWorkspaceTrustRequirement, description?: string }; +export type ExtensionWorkspaceTrustRequestType = 'never' | 'onStart' | 'onDemand'; +export type ExtensionWorkspaceTrust = { request: 'never'; } | { request: 'onStart' | 'onDemand', description: string }; export function isIExtensionIdentifier(thing: any): thing is IExtensionIdentifier { return thing @@ -307,13 +307,13 @@ export function isAuthenticaionProviderExtension(manifest: IExtensionManifest): return manifest.contributes && manifest.contributes.authentication ? manifest.contributes.authentication.length > 0 : false; } -export function getExtensionWorkspaceTrustRequirement(manifest: IExtensionManifest): ExtensionWorkspaceTrustRequirement { - if (manifest.workspaceTrust?.required !== undefined) { - return manifest.workspaceTrust.required; +export function getExtensionWorkspaceTrustRequestType(manifest: IExtensionManifest): ExtensionWorkspaceTrustRequestType { + if (manifest.workspaceTrust?.request !== undefined) { + return manifest.workspaceTrust.request; } if (!manifest.main) { - return false; + return 'never'; } return 'onStart'; diff --git a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts index 1358b25eaf9..69ab569b6e5 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionsList.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionsList.ts @@ -20,7 +20,7 @@ import { Label, RatingsWidget, InstallCountWidget, RecommendationWidget, RemoteB import { IExtensionService, toExtension } from 'vs/workbench/services/extensions/common/extensions'; import { IExtensionManagementServerService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; import { INotificationService } from 'vs/platform/notification/common/notification'; -import { getExtensionWorkspaceTrustRequirement, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; +import { getExtensionWorkspaceTrustRequestType, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; import { registerThemingParticipant, IColorTheme, ICssStyleCollector } from 'vs/platform/theme/common/themeService'; import { foreground, listActiveSelectionForeground, listActiveSelectionBackground, listInactiveSelectionForeground, listInactiveSelectionBackground, listFocusForeground, listFocusBackground, listHoverForeground, listHoverBackground } from 'vs/platform/theme/common/colorRegistry'; import { WORKBENCH_BACKGROUND } from 'vs/workbench/common/theme'; @@ -203,13 +203,14 @@ export class Renderer implements IPagedRenderer { data.author.textContent = extension.publisherDisplayName; data.description.textContent = extension.description; - if (extension.local?.manifest.workspaceTrust?.required) { + if (extension.local?.manifest.workspaceTrust?.request) { const trustRequirement = extension.local.manifest.workspaceTrust; - if (trustRequirement.description) { + const requestType = getExtensionWorkspaceTrustRequestType(extension.local.manifest); + if (requestType !== 'never' && trustRequirement.request !== 'never') { data.workspaceTrustDescription.textContent = trustRequirement.description; - } else if (getExtensionWorkspaceTrustRequirement(extension.local.manifest) === 'onStart') { + } else if (requestType === 'onStart') { data.workspaceTrustDescription.textContent = localize('onStartDefaultText', "A trusted workspace is required to enable this extension."); - } else if (getExtensionWorkspaceTrustRequirement(extension.local.manifest) === 'onDemand') { + } else if (requestType === 'onDemand') { data.workspaceTrustDescription.textContent = localize('onDemandDefaultText', "Some features require a trusted workspace."); } } diff --git a/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts b/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts index 94ef8fbcb39..2cf9305c386 100644 --- a/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts +++ b/src/vs/workbench/contrib/workspace/browser/workspaceTrustEditor.ts @@ -22,7 +22,7 @@ import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; -import { ExtensionWorkspaceTrustRequirement, getExtensionWorkspaceTrustRequirement } from 'vs/platform/extensions/common/extensions'; +import { ExtensionWorkspaceTrustRequestType, getExtensionWorkspaceTrustRequestType } from 'vs/platform/extensions/common/extensions'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { IPromptChoiceWithMenu } from 'vs/platform/notification/common/notification'; import { Link } from 'vs/platform/opener/browser/link'; @@ -295,8 +295,8 @@ export class WorkspaceTrustEditor extends EditorPane { // Features List const installedExtensions = await this.instantiationService.invokeFunction(getInstalledExtensions); - const onDemandExtensions = await this.getExtensionsByTrustRequirement(installedExtensions, 'onDemand'); - const onStartExtensions = await this.getExtensionsByTrustRequirement(installedExtensions, 'onStart'); + const onDemandExtensions = await this.getExtensionsByTrustRequestType(installedExtensions, 'onDemand'); + const onStartExtensions = await this.getExtensionsByTrustRequestType(installedExtensions, 'onStart'); this.renderExtensionList( localize('onStartExtensions', "Disabled Extensions"), @@ -317,8 +317,8 @@ export class WorkspaceTrustEditor extends EditorPane { this.rendering = false; } - private async getExtensionsByTrustRequirement(extensions: IExtensionStatus[], trustRequirement: ExtensionWorkspaceTrustRequirement): Promise { - const filtered = extensions.filter(ext => getExtensionWorkspaceTrustRequirement(ext.local.manifest) === trustRequirement); + private async getExtensionsByTrustRequestType(extensions: IExtensionStatus[], trustRequestType: ExtensionWorkspaceTrustRequestType): Promise { + const filtered = extensions.filter(ext => getExtensionWorkspaceTrustRequestType(ext.local.manifest) === trustRequestType); const ids = filtered.map(ext => ext.identifier.id); return getExtensions(ids, this.extensionWorkbenchService); diff --git a/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts b/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts index 90c0b952fa8..f046032b978 100644 --- a/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts +++ b/src/vs/workbench/services/extensionManagement/browser/extensionEnablementService.ts @@ -12,7 +12,7 @@ import { areSameExtensions } from 'vs/platform/extensionManagement/common/extens import { IWorkspaceContextService, WorkbenchState } from 'vs/platform/workspace/common/workspace'; import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; -import { getExtensionWorkspaceTrustRequirement, IExtension, isAuthenticaionProviderExtension, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; +import { getExtensionWorkspaceTrustRequestType, IExtension, isAuthenticaionProviderExtension, isLanguagePackExtension } from 'vs/platform/extensions/common/extensions'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ExtensionKindController } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; @@ -276,7 +276,7 @@ export class ExtensionEnablementService extends Disposable implements IWorkbench private _isDisabledByTrustRequirement(extension: IExtension): boolean { const workspaceTrustState = this.workspaceTrustService.getWorkspaceTrustState(); - if (getExtensionWorkspaceTrustRequirement(extension.manifest) === 'onStart') { + if (getExtensionWorkspaceTrustRequestType(extension.manifest) === 'onStart') { if (workspaceTrustState !== WorkspaceTrustState.Trusted) { this._addToWorkspaceDisabledExtensionsByTrustRequirement(extension); } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index 2d989d36f3e..81529b88b5e 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -8,7 +8,7 @@ import { ILocalExtension, IGalleryExtension, InstallExtensionEvent, DidInstallExtensionEvent, IExtensionIdentifier, DidUninstallExtensionEvent, IReportedExtension, IGalleryMetadata, IExtensionGalleryService, InstallOptions, UninstallOptions, INSTALL_ERROR_NOT_SUPPORTED } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IExtensionManagementServer, IExtensionManagementServerService, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement'; -import { ExtensionType, isLanguagePackExtension, IExtensionManifest, getExtensionWorkspaceTrustRequirement } from 'vs/platform/extensions/common/extensions'; +import { ExtensionType, isLanguagePackExtension, IExtensionManifest, getExtensionWorkspaceTrustRequestType } from 'vs/platform/extensions/common/extensions'; import { URI } from 'vs/base/common/uri'; import { Disposable } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; @@ -361,7 +361,7 @@ export class ExtensionManagementService extends Disposable implements IWorkbench } protected async checkForWorkspaceTrust(manifest: IExtensionManifest): Promise { - if (getExtensionWorkspaceTrustRequirement(manifest) === 'onStart') { + if (getExtensionWorkspaceTrustRequestType(manifest) === 'onStart') { const trustState = await this.workspaceTrustService.requestWorkspaceTrust({ modal: true, message: localize('extensionInstallWorkspaceTrustMessage', "Enabling this extension requires a trusted workspace."),