From 8a45b1be239c807d4635fbfc56058ee99e0a30ed Mon Sep 17 00:00:00 2001 From: Simon Siefke Date: Thu, 21 Dec 2023 01:15:34 +0100 Subject: [PATCH] fix: memory leak in menubar (#198052) * fix: memory leak in menubar * Update src/vs/base/browser/ui/menu/menubar.ts Co-authored-by: Benjamin Pasero * Update src/vs/base/browser/ui/menu/menubar.ts Co-authored-by: Benjamin Pasero * Update src/vs/base/browser/ui/menu/menubar.ts Co-authored-by: Benjamin Pasero * fix: potential memory leak when focusing another menu --------- Co-authored-by: Benjamin Pasero Co-authored-by: SteVen Batten --- src/vs/base/browser/ui/menu/menubar.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/vs/base/browser/ui/menu/menubar.ts b/src/vs/base/browser/ui/menu/menubar.ts index 5c6ff94f205..2e58738bdab 100644 --- a/src/vs/base/browser/ui/menu/menubar.ts +++ b/src/vs/base/browser/ui/menu/menubar.ts @@ -17,7 +17,7 @@ import { ThemeIcon } from 'vs/base/common/themables'; import { Emitter, Event } from 'vs/base/common/event'; import { KeyCode, KeyMod, ScanCode, ScanCodeUtils } from 'vs/base/common/keyCodes'; import { ResolvedKeybinding } from 'vs/base/common/keybindings'; -import { Disposable, dispose, IDisposable } from 'vs/base/common/lifecycle'; +import { Disposable, DisposableStore, dispose, IDisposable } from 'vs/base/common/lifecycle'; import { isMacintosh } from 'vs/base/common/platform'; import * as strings from 'vs/base/common/strings'; import 'vs/css!./menubar'; @@ -87,6 +87,8 @@ export class MenuBar extends Disposable { private numMenusShown: number = 0; private overflowLayoutScheduled: IDisposable | undefined = undefined; + private readonly menuDisposables = this._register(new DisposableStore()); + constructor(private container: HTMLElement, private options: IMenuBarOptions, private menuStyle: IMenuStyles) { super(); @@ -751,6 +753,7 @@ export class MenuBar extends Disposable { } if (this.focusedMenu) { + this.cleanupCustomMenu(); this.showCustomMenu(this.focusedMenu.index, this.openedViaKeyboard); } break; @@ -985,6 +988,7 @@ export class MenuBar extends Disposable { this.focusedMenu = { index: this.focusedMenu.index }; } + this.menuDisposables.clear(); } private showCustomMenu(menuIndex: number, selectFirst = true): void { @@ -1025,9 +1029,8 @@ export class MenuBar extends Disposable { useEventAsContext: true }; - const menuWidget = this._register(new Menu(menuHolder, customMenu.actions, menuOptions, this.menuStyle)); - - this._register(menuWidget.onDidCancel(() => { + const menuWidget = this.menuDisposables.add(new Menu(menuHolder, customMenu.actions, menuOptions, this.menuStyle)); + this.menuDisposables.add(menuWidget.onDidCancel(() => { this.focusState = MenubarState.FOCUSED; }));