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 <benjamin.pasero@gmail.com>

* Update src/vs/base/browser/ui/menu/menubar.ts

Co-authored-by: Benjamin Pasero <benjamin.pasero@gmail.com>

* Update src/vs/base/browser/ui/menu/menubar.ts

Co-authored-by: Benjamin Pasero <benjamin.pasero@gmail.com>

* fix: potential memory leak when focusing another menu

---------

Co-authored-by: Benjamin Pasero <benjamin.pasero@gmail.com>
Co-authored-by: SteVen Batten <sbatten@microsoft.com>
This commit is contained in:
Simon Siefke
2023-12-20 16:15:34 -08:00
committed by GitHub
co-authored by Benjamin Pasero SteVen Batten
parent c60da32708
commit 8a45b1be23
+7 -4
View File
@@ -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;
}));