From 8104c86bedd968c3dced598093028066e18587eb Mon Sep 17 00:00:00 2001 From: "vs-code-engineering[bot]" Date: Mon, 4 May 2026 12:01:30 +0000 Subject: [PATCH] [cherry-pick] Fix Agents welcome theme import cleanup --- .../welcome/browser/sessionsWalkthrough.ts | 10 +++++++--- .../services/vscode/common/themeImporter.ts | 11 +++-------- .../electron-browser/themeImporterService.ts | 16 ++++++++++++---- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/src/vs/sessions/contrib/welcome/browser/sessionsWalkthrough.ts b/src/vs/sessions/contrib/welcome/browser/sessionsWalkthrough.ts index 766e63c50d9f8..cc750dda39b35 100644 --- a/src/vs/sessions/contrib/welcome/browser/sessionsWalkthrough.ts +++ b/src/vs/sessions/contrib/welcome/browser/sessionsWalkthrough.ts @@ -394,11 +394,15 @@ export class SessionsWalkthroughOverlay extends Disposable { let vscodeThemeBtn: HTMLElement | undefined; let isVSCodeThemeSelected = false; let previewResult: IThemePreviewResult | undefined; + const disposePreview = () => { + previewResult?.dispose(); + previewResult = undefined; + }; for (const theme of themes) { const card = this._createThemeCard(stepDisposables, themeGrid, theme, themeCards, selectedThemeId, id => { selectedThemeId = id; isVSCodeThemeSelected = false; - previewResult?.reset(); + disposePreview(); if (vscodeThemeBtn) { vscodeThemeBtn.classList.remove('selected'); vscodeThemeBtn.setAttribute('aria-checked', 'false'); @@ -435,8 +439,8 @@ export class SessionsWalkthroughOverlay extends Disposable { previewResult = await this.themeImporterService.previewVSCodeTheme(); vscodeThemeBtn!.textContent = labelText; }; - // Reset preview on step teardown (escape) - stepDisposables.add(toDisposable(() => { previewResult?.reset(); })); + // Dispose preview on step teardown (escape) + stepDisposables.add(toDisposable(disposePreview)); stepDisposables.add(Gesture.addTarget(vscodeThemeBtn)); for (const eventType of [EventType.CLICK, TouchEventType.Tap]) { stepDisposables.add(addDisposableListener(vscodeThemeBtn, eventType, selectVSCodeTheme)); diff --git a/src/vs/sessions/services/vscode/common/themeImporter.ts b/src/vs/sessions/services/vscode/common/themeImporter.ts index abe24ebfa705d..9b1df8a9fe22f 100644 --- a/src/vs/sessions/services/vscode/common/themeImporter.ts +++ b/src/vs/sessions/services/vscode/common/themeImporter.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { IDisposable } from '../../../../base/common/lifecycle.js'; import { createDecorator } from '../../../../platform/instantiation/common/instantiation.js'; /** The VS Code configuration key for the active color theme. */ @@ -13,18 +14,12 @@ export const IThemeImporterService = createDecorator('ITh /** * Result of previewing the parent VS Code's color theme. */ -export interface IThemePreviewResult { +export interface IThemePreviewResult extends IDisposable { /** * Permanently imports the previewed theme into the Agents app by * copying the providing extension and installing it from there. */ apply(): Promise; - - /** - * Reverts the preview by uninstalling the temporarily installed - * extension. - */ - reset(): Promise; } /** @@ -46,7 +41,7 @@ export interface IThemeImporterService { /** * Temporarily installs the providing extension from the host's extensions * directory and applies the VS Code theme. Returns a cached - * {@link IThemePreviewResult} to apply or reset the preview. Returns + * {@link IThemePreviewResult} to apply or dispose the preview. Returns * `undefined` if the theme is already available or cannot be resolved. */ previewVSCodeTheme(): Promise; diff --git a/src/vs/sessions/services/vscode/electron-browser/themeImporterService.ts b/src/vs/sessions/services/vscode/electron-browser/themeImporterService.ts index a287a67622e15..92342b992cbcc 100644 --- a/src/vs/sessions/services/vscode/electron-browser/themeImporterService.ts +++ b/src/vs/sessions/services/vscode/electron-browser/themeImporterService.ts @@ -82,12 +82,20 @@ class ThemeImporterService extends Disposable implements IThemeImporterService { const installed = await this._installFromHostLocation(theme); await this._setTheme(theme.settingsId); + let applied = false; return { - apply: () => this._apply(theme), - reset: () => { + apply: async () => { + applied = true; this._previewPromise = undefined; - return this._reset(installed); + await this._apply(theme); + }, + dispose: () => { + this._previewPromise = undefined; + if (applied) { + return; + } + void this._disposePreview(installed); }, }; } catch (err) { @@ -118,7 +126,7 @@ class ThemeImporterService extends Disposable implements IThemeImporterService { } } - private async _reset(installed: ILocalExtension | undefined): Promise { + private async _disposePreview(installed: ILocalExtension | undefined): Promise { if (!installed) { return; }