From d681a19ddc2bd4d3a9ac0a3dfdcd42895d7f1d7b Mon Sep 17 00:00:00 2001 From: Tyler James Leonhardt Date: Mon, 24 Jun 2024 15:44:17 -0700 Subject: [PATCH] Make ExtHostSecrets disposable (#217619) Also register a few disposables. I don't have too much time to figure out how to register these properly (hence the TODO), and maybe this is more in @jrieken's territory... but wanted to have _something_ in place for now. --- src/vs/workbench/api/common/extHostExtensionService.ts | 7 ++++--- src/vs/workbench/api/common/extHostSecrets.ts | 9 ++++++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/vs/workbench/api/common/extHostExtensionService.ts b/src/vs/workbench/api/common/extHostExtensionService.ts index 6947479c2b8..97935e89d08 100644 --- a/src/vs/workbench/api/common/extHostExtensionService.ts +++ b/src/vs/workbench/api/common/extHostExtensionService.ts @@ -498,9 +498,10 @@ export abstract class AbstractExtHostExtensionService extends Disposable impleme private _loadExtensionContext(extensionDescription: IExtensionDescription): Promise { const lanuageModelAccessInformation = this._extHostLanguageModels.createLanguageModelAccessInformation(extensionDescription); - const globalState = new ExtensionGlobalMemento(extensionDescription, this._storage); - const workspaceState = new ExtensionMemento(extensionDescription.identifier.value, false, this._storage); - const secrets = new ExtensionSecrets(extensionDescription, this._secretState); + // TODO: These should probably be disposed when the extension deactivates + const globalState = this._register(new ExtensionGlobalMemento(extensionDescription, this._storage)); + const workspaceState = this._register(new ExtensionMemento(extensionDescription.identifier.value, false, this._storage)); + const secrets = this._register(new ExtensionSecrets(extensionDescription, this._secretState)); const extensionMode = extensionDescription.isUnderDevelopment ? (this._initData.environment.extensionTestsLocationURI ? ExtensionMode.Test : ExtensionMode.Development) : ExtensionMode.Production; diff --git a/src/vs/workbench/api/common/extHostSecrets.ts b/src/vs/workbench/api/common/extHostSecrets.ts index 4b1e284b604..13fb3293a35 100644 --- a/src/vs/workbench/api/common/extHostSecrets.ts +++ b/src/vs/workbench/api/common/extHostSecrets.ts @@ -10,6 +10,7 @@ import type * as vscode from 'vscode'; import { ExtHostSecretState } from 'vs/workbench/api/common/extHostSecretState'; import { ExtensionIdentifier, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { Event } from 'vs/base/common/event'; +import { DisposableStore } from 'vs/base/common/lifecycle'; export class ExtensionSecrets implements vscode.SecretStorage { @@ -17,6 +18,7 @@ export class ExtensionSecrets implements vscode.SecretStorage { readonly #secretState: ExtHostSecretState; readonly onDidChange: Event; + readonly disposables = new DisposableStore(); constructor(extensionDescription: IExtensionDescription, secretState: ExtHostSecretState) { this._id = ExtensionIdentifier.toKey(extensionDescription.identifier); @@ -24,10 +26,15 @@ export class ExtensionSecrets implements vscode.SecretStorage { this.onDidChange = Event.map( Event.filter(this.#secretState.onDidChangePassword, e => e.extensionId === this._id), - e => ({ key: e.key }) + e => ({ key: e.key }), + this.disposables ); } + dispose() { + this.disposables.dispose(); + } + get(key: string): Promise { return this.#secretState.get(this._id, key); }