diff --git a/src/vs/platform/workspace/common/workspaceTrust.ts b/src/vs/platform/workspace/common/workspaceTrust.ts index 93fc57c4774..36988361eb6 100644 --- a/src/vs/platform/workspace/common/workspaceTrust.ts +++ b/src/vs/platform/workspace/common/workspaceTrust.ts @@ -45,14 +45,14 @@ export interface IWorkspaceTrustModel { } export interface WorkspaceTrustRequestButton { - label: string; - type: 'ContinueWithTrust' | 'ContinueWithoutTrust' | 'Manage' | 'Cancel' + readonly label: string; + readonly type: 'ContinueWithTrust' | 'ContinueWithoutTrust' | 'Manage' | 'Cancel' } export interface WorkspaceTrustRequestOptions { - buttons?: WorkspaceTrustRequestButton[]; - message?: string; - modal: boolean; + readonly buttons?: WorkspaceTrustRequestButton[]; + readonly message?: string; + readonly modal: boolean; } export interface IWorkspaceTrustRequestModel { @@ -68,8 +68,8 @@ export interface IWorkspaceTrustRequestModel { } export interface WorkspaceTrustStateChangeEvent { - previousTrustState: WorkspaceTrustState; - currentTrustState: WorkspaceTrustState; + readonly previousTrustState: WorkspaceTrustState; + readonly currentTrustState: WorkspaceTrustState; } export type WorkspaceTrustChangeEvent = Event; @@ -84,7 +84,7 @@ export interface IWorkspaceTrustService { onDidChangeTrustState: WorkspaceTrustChangeEvent; getWorkspaceTrustState(): WorkspaceTrustState; isWorkspaceTrustEnabled(): boolean; - requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; + requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; } export interface IWorkspaceTrustUriInfo { diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 236e9ee80c6..d48a954994b 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -2806,12 +2806,12 @@ declare module 'vscode' { /** * Previous trust state of the workspace */ - previousTrustState: WorkspaceTrustState; + readonly previousTrustState: WorkspaceTrustState; /** * Current trust state of the workspace */ - currentTrustState: WorkspaceTrustState; + readonly currentTrustState: WorkspaceTrustState; } /** @@ -2822,7 +2822,7 @@ declare module 'vscode' { * When true, a modal dialog will be used to request workspace trust. * When false, a badge will be displayed on the Setting activity bar item */ - modal: boolean; + readonly modal: boolean; } export namespace workspace { @@ -2836,7 +2836,7 @@ declare module 'vscode' { * @param options Optional object describing the properties of the * workspace trust request */ - export function requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Thenable; + export function requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Thenable; /** * Event that fires when the trust state of the current workspace changes diff --git a/src/vs/workbench/api/browser/mainThreadWorkspace.ts b/src/vs/workbench/api/browser/mainThreadWorkspace.ts index 92e6a87eae4..46eae31ecc5 100644 --- a/src/vs/workbench/api/browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/browser/mainThreadWorkspace.ts @@ -208,7 +208,7 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { // --- trust --- - $requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise { + $requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise { return this._workspaceTrustService.requestWorkspaceTrust(options); } diff --git a/src/vs/workbench/api/common/extHost.protocol.ts b/src/vs/workbench/api/common/extHost.protocol.ts index 6f54b6892a9..356eb5c85c1 100644 --- a/src/vs/workbench/api/common/extHost.protocol.ts +++ b/src/vs/workbench/api/common/extHost.protocol.ts @@ -927,7 +927,7 @@ export interface MainThreadWorkspaceShape extends IDisposable { $saveAll(includeUntitled?: boolean): Promise; $updateWorkspaceFolders(extensionName: string, index: number, deleteCount: number, workspaceFoldersToAdd: { uri: UriComponents, name?: string; }[]): Promise; $resolveProxy(url: string): Promise; - $requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; + $requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise; } export interface IFileChangeDto { diff --git a/src/vs/workbench/api/common/extHostWorkspace.ts b/src/vs/workbench/api/common/extHostWorkspace.ts index f000bfba761..714df5a4e9b 100644 --- a/src/vs/workbench/api/common/extHostWorkspace.ts +++ b/src/vs/workbench/api/common/extHostWorkspace.ts @@ -563,7 +563,7 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape, IExtHostWorkspac return this._workspaceTrustState; } - requestWorkspaceTrust(options?: vscode.WorkspaceTrustRequestOptions): Promise { + requestWorkspaceTrust(options?: vscode.WorkspaceTrustRequestOptions): Promise { return this._proxy.$requestWorkspaceTrust(options); } diff --git a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts index 71692bbc298..2d989d36f3e 100644 --- a/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts +++ b/src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts @@ -362,22 +362,21 @@ export class ExtensionManagementService extends Disposable implements IWorkbench protected async checkForWorkspaceTrust(manifest: IExtensionManifest): Promise { if (getExtensionWorkspaceTrustRequirement(manifest) === 'onStart') { - try { - await this.workspaceTrustService.requestWorkspaceTrust({ - modal: true, - message: localize('extensionInstallWorkspaceTrustMessage', "Enabling this extension requires a trusted workspace."), - buttons: [ - { label: localize('extensionInstallWorkspaceTrustButton', "Trust Workspace & Install"), type: 'ContinueWithTrust' }, - { label: localize('extensionInstallWorkspaceTrustContinueButton', "Install"), type: 'ContinueWithoutTrust' }, - { label: localize('extensionInstallWorkspaceTrustManageButton', "Learn More"), type: 'Manage' } - ] - }); - return Promise.resolve(); - } - catch (error) { - return Promise.reject(error); + const trustState = await this.workspaceTrustService.requestWorkspaceTrust({ + modal: true, + message: localize('extensionInstallWorkspaceTrustMessage', "Enabling this extension requires a trusted workspace."), + buttons: [ + { label: localize('extensionInstallWorkspaceTrustButton', "Trust Workspace & Install"), type: 'ContinueWithTrust' }, + { label: localize('extensionInstallWorkspaceTrustContinueButton', "Install"), type: 'ContinueWithoutTrust' }, + { label: localize('extensionInstallWorkspaceTrustManageButton', "Learn More"), type: 'Manage' } + ] + }); + + if (!trustState) { + Promise.reject(canceled()); } } + return Promise.resolve(); } } diff --git a/src/vs/workbench/services/workspaces/common/workspaceTrust.ts b/src/vs/workbench/services/workspaces/common/workspaceTrust.ts index fd840dcacd7..9c748ad3e0b 100644 --- a/src/vs/workbench/services/workspaces/common/workspaceTrust.ts +++ b/src/vs/workbench/services/workspaces/common/workspaceTrust.ts @@ -15,7 +15,6 @@ import { IWorkspaceTrustModel, WorkspaceTrustRequestOptions, IWorkspaceTrustRequ import { EditorModel } from 'vs/workbench/common/editor'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { dirname, resolve } from 'vs/base/common/path'; -import { canceled } from 'vs/base/common/errors'; import { IUriIdentityService } from 'vs/workbench/services/uriIdentity/common/uriIdentity'; export const WORKSPACE_TRUST_ENABLED = 'workspace.trustEnabled'; @@ -220,11 +219,10 @@ export class WorkspaceTrustService extends Disposable implements IWorkspaceTrust readonly onDidChangeTrustState = this._onDidChangeTrustState.event; private _currentTrustState: WorkspaceTrustState = WorkspaceTrustState.Unknown; - private _trustRequestPromise?: Promise; - private _inFlightResolver?: (trustState: WorkspaceTrustState) => void; - private _modalTrustRequestPromise?: Promise; - private _modalTrustRequestResolver?: (trustState: WorkspaceTrustState) => void; - private _modalTrustRequestRejecter?: (error: Error) => void; + private _trustRequestPromise?: Promise; + private _inFlightResolver?: (trustState?: WorkspaceTrustState) => void; + private _modalTrustRequestPromise?: Promise; + private _modalTrustRequestResolver?: (trustState?: WorkspaceTrustState) => void; private _workspace: IWorkspace; private readonly _ctxWorkspaceTrustState: IContextKey; @@ -393,7 +391,6 @@ export class WorkspaceTrustService extends Disposable implements IWorkspaceTrust this._modalTrustRequestResolver(trustState === undefined ? this.currentTrustState : trustState); this._modalTrustRequestResolver = undefined; - this._modalTrustRequestRejecter = undefined; this._modalTrustRequestPromise = undefined; } if (this._inFlightResolver) { @@ -415,11 +412,10 @@ export class WorkspaceTrustService extends Disposable implements IWorkspaceTrust } private onTrustRequestCancelled(): void { - if (this._modalTrustRequestRejecter) { - this._modalTrustRequestRejecter(canceled()); + if (this._modalTrustRequestResolver) { + this._modalTrustRequestResolver(undefined); this._modalTrustRequestResolver = undefined; - this._modalTrustRequestRejecter = undefined; this._modalTrustRequestPromise = undefined; } } @@ -436,7 +432,7 @@ export class WorkspaceTrustService extends Disposable implements IWorkspaceTrust return this.configurationService.getValue(WORKSPACE_TRUST_ENABLED) ?? false; } - async requestWorkspaceTrust(options: WorkspaceTrustRequestOptions = { modal: true }): Promise { + async requestWorkspaceTrust(options: WorkspaceTrustRequestOptions = { modal: true }): Promise { // Trusted workspace if (this.currentTrustState === WorkspaceTrustState.Trusted) { return this.currentTrustState; @@ -450,21 +446,22 @@ export class WorkspaceTrustService extends Disposable implements IWorkspaceTrust // Modal request if (!this._modalTrustRequestPromise) { // Create promise - this._modalTrustRequestPromise = new Promise((resolve, reject) => { + this._modalTrustRequestPromise = new Promise(resolve => { this._modalTrustRequestResolver = resolve; - this._modalTrustRequestRejecter = reject; }); } else { - // Return existing promises + // Return existing promise return this._modalTrustRequestPromise; } } else { // Soft request if (!this._trustRequestPromise) { + // Create promise this._trustRequestPromise = new Promise(resolve => { this._inFlightResolver = resolve; }); } else { + // Return existing promise return this._trustRequestPromise; } } diff --git a/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts b/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts index bc2e1302c3e..9e713061352 100644 --- a/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts +++ b/src/vs/workbench/services/workspaces/test/common/testWorkspaceTrustService.ts @@ -22,7 +22,7 @@ export class TestWorkspaceTrustService implements IWorkspaceTrustService { return true; } - requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise { + requestWorkspaceTrust(options?: WorkspaceTrustRequestOptions): Promise { return Promise.resolve(WorkspaceTrustState.Trusted); } }