From ae2fe7d085685ed6c778df5c3cd3cd298c563ddd Mon Sep 17 00:00:00 2001 From: meganrogge Date: Mon, 1 Apr 2024 12:47:26 -0700 Subject: [PATCH] fix #146972 --- .../contrib/terminal/browser/terminalEditor.ts | 13 ++++++++++++- .../contrib/terminal/browser/terminalView.ts | 12 ++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts index 900fbaf9fed..2ada12ead31 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalEditor.ts @@ -5,7 +5,7 @@ import * as dom from 'vs/base/browser/dom'; import { IActionViewItem } from 'vs/base/browser/ui/actionbar/actionbar'; -import { IAction } from 'vs/base/common/actions'; +import { Action, IAction } from 'vs/base/common/actions'; import { CancellationToken } from 'vs/base/common/cancellation'; import { DropdownWithPrimaryActionViewItem } from 'vs/platform/actions/browser/dropdownWithPrimaryActionViewItem'; import { IMenu, IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions'; @@ -211,6 +211,7 @@ export class TerminalEditor extends EditorPane { if (action instanceof MenuItemAction) { const location = { viewColumn: ACTIVE_GROUP }; const actions = getTerminalActionBarArgs(location, this._terminalProfileService.availableProfiles, this._getDefaultProfileName(), this._terminalProfileService.contributedProfiles, this._terminalService, this._dropdownMenu); + this._registerDisposableActions(actions.dropdownAction, actions.dropdownMenuActions); const button = this._instantiationService.createInstance(DropdownWithPrimaryActionViewItem, action, actions.dropdownAction, actions.dropdownMenuActions, actions.className, this._contextMenuService, { hoverDelegate: options.hoverDelegate }); return button; } @@ -219,6 +220,16 @@ export class TerminalEditor extends EditorPane { return super.getActionViewItem(action, options); } + /** + * Actions might be of type Action (disposable) or Separator or SubmenuAction, which don't extend Disposable + */ + private _registerDisposableActions(dropdownAction: IAction, dropdownMenuActions: IAction[]): void { + if (dropdownAction instanceof Action) { + this._register(dropdownAction); + } + dropdownMenuActions.filter(a => a instanceof Action).forEach(a => this._register(a)); + } + private _getDefaultProfileName(): string { let defaultProfileName; try { diff --git a/src/vs/workbench/contrib/terminal/browser/terminalView.ts b/src/vs/workbench/contrib/terminal/browser/terminalView.ts index 7bf4f427bd0..3792bac9953 100644 --- a/src/vs/workbench/contrib/terminal/browser/terminalView.ts +++ b/src/vs/workbench/contrib/terminal/browser/terminalView.ts @@ -272,6 +272,7 @@ export class TerminalViewPane extends ViewPane { case TerminalCommandId.New: { if (action instanceof MenuItemAction) { const actions = getTerminalActionBarArgs(TerminalLocation.Panel, this._terminalProfileService.availableProfiles, this._getDefaultProfileName(), this._terminalProfileService.contributedProfiles, this._terminalService, this._dropdownMenu); + this._registerDisposableActions(actions.dropdownAction, actions.dropdownMenuActions); this._newDropdown?.dispose(); this._newDropdown = new DropdownWithPrimaryActionViewItem(action, actions.dropdownAction, actions.dropdownMenuActions, actions.className, this._contextMenuService, { hoverDelegate: options.hoverDelegate }, this._keybindingService, this._notificationService, this._contextKeyService, this._themeService, this._accessibilityService); this._updateTabActionBar(this._terminalProfileService.availableProfiles); @@ -282,6 +283,16 @@ export class TerminalViewPane extends ViewPane { return super.getActionViewItem(action, options); } + /** + * Actions might be of type Action (disposable) or Separator or SubmenuAction, which don't extend Disposable + */ + private _registerDisposableActions(dropdownAction: IAction, dropdownMenuActions: IAction[]): void { + if (dropdownAction instanceof Action) { + this._register(dropdownAction); + } + dropdownMenuActions.filter(a => a instanceof Action).forEach(a => this._register(a)); + } + private _getDefaultProfileName(): string { let defaultProfileName; try { @@ -298,6 +309,7 @@ export class TerminalViewPane extends ViewPane { private _updateTabActionBar(profiles: ITerminalProfile[]): void { const actions = getTerminalActionBarArgs(TerminalLocation.Panel, profiles, this._getDefaultProfileName(), this._terminalProfileService.contributedProfiles, this._terminalService, this._dropdownMenu); + this._registerDisposableActions(actions.dropdownAction, actions.dropdownMenuActions); this._newDropdown?.update(actions.dropdownAction, actions.dropdownMenuActions); }