From 4e38f9b7c9effbf51734dfa26acb8e4f4aafd312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Paul=20Mar=C3=A9chal?= Date: Thu, 26 Jul 2018 09:31:35 -0400 Subject: [PATCH] [core] Fix listener leak error on electron MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `electron-main-menu-factory` was registering a lot of listeners. This commit refactors the listeners into one, reducing the count and avoiding the error. Fix #2208. Signed-off-by: Paul Maréchal --- .../menu/electron-main-menu-factory.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts b/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts index 22fa4b2a2b1ee..b7d40e78bfae6 100644 --- a/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts +++ b/packages/core/src/electron-browser/menu/electron-main-menu-factory.ts @@ -26,13 +26,21 @@ import { PreferenceService, KeybindingRegistry, Keybinding, KeyCode, Key } from export class ElectronMainMenuFactory { protected _menu: Electron.Menu; + protected _toggledCommands: Set = new Set(); constructor( @inject(CommandRegistry) protected readonly commandRegistry: CommandRegistry, @inject(PreferenceService) protected readonly preferencesService: PreferenceService, @inject(MenuModelRegistry) protected readonly menuProvider: MenuModelRegistry, @inject(KeybindingRegistry) protected readonly keybindingRegistry: KeybindingRegistry - ) { } + ) { + this.preferencesService.onPreferenceChanged(() => { + for (const item of this._toggledCommands) { + this._menu.getMenuItemById(item).checked = this.commandRegistry.isToggled(item); + electron.remote.getCurrentWindow().setMenu(this._menu); + } + }); + } createMenuBar(): Electron.Menu { const menuModel = this.menuProvider.getMenu(MAIN_MENU_BAR); @@ -53,7 +61,6 @@ export class ElectronMainMenuFactory { } protected fillMenuTemplate(items: Electron.MenuItemConstructorOptions[], menuModel: CompositeMenuNode): Electron.MenuItemConstructorOptions[] { - const toggledCommands: string[] = []; for (const menu of menuModel.children) { if (menu instanceof CompositeMenuNode) { if (menu.label) { @@ -99,16 +106,10 @@ export class ElectronMainMenuFactory { accelerator }); if (this.commandRegistry.getToggledHandler(commandId)) { - toggledCommands.push(commandId); + this._toggledCommands.add(commandId); } } } - this.preferencesService.onPreferenceChanged(() => { - for (const item of toggledCommands) { - this._menu.getMenuItemById(item).checked = this.commandRegistry.isToggled(item); - electron.remote.getCurrentWindow().setMenu(this._menu); - } - }); return items; }