diff --git a/src/resources/api_nw_menu.js b/src/resources/api_nw_menu.js index 1a7893c580..c9c1a5aaca 100644 --- a/src/resources/api_nw_menu.js +++ b/src/resources/api_nw_menu.js @@ -34,13 +34,23 @@ Menu.prototype.__defineSetter__('items', function(val) { }); Menu.prototype.append = function(menu_item) { - privates(this).items.push(menu_item); + const isSeparator = menu_item.type === 'separator' + const items = privates(this).items + + // https://github.com/nwjs/chromium.src/blob/nw45-log/ui/base/models/simple_menu_model.h#L117 + if (isSeparator && (items.length === 0 || items[items.length - 1].type === 'separator')) { + return menu_item._destroy() + } + + items.push(menu_item); + nw.MenuItem.eventRegistry.add(menu_item); if (!menu_item.native) nw.Obj.callObjectMethod(this.id, 'Menu', 'Append', [ menu_item.id ]); }; Menu.prototype.insert = function(menu_item, i) { privates(this).items.splice(i, 0, menu_item); + nw.MenuItem.eventRegistry.add(menu_item); if (!menu_item.native) nw.Obj.callObjectMethod(this.id, 'Menu', 'Insert', [ menu_item.id, i ]); } @@ -49,11 +59,14 @@ Menu.prototype.remove = function(menu_item) { var pos_hint = privates(this).items.indexOf(menu_item); nw.Obj.callObjectMethod(this.id, 'Menu', 'Remove', [ menu_item.id, pos_hint ]); privates(this).items.splice(pos_hint, 1); + nw.MenuItem.eventRegistry.remove(menu_item); } Menu.prototype.removeAt = function(i) { - nw.Obj.callObjectMethod(this.id, 'Menu', 'Remove', [ privates(this).items[i].id, i ]); - privates(this).items.splice(i, 1); + const items = privates(this).items; + nw.Obj.callObjectMethod(this.id, 'Menu', 'Remove', [ items[i].id, i ]); + nw.MenuItem.eventRegistry.remove(items[i]); + items.splice(i, 1); } Menu.prototype.popup = function(x, y) { diff --git a/src/resources/api_nw_menuitem.js b/src/resources/api_nw_menuitem.js index fdf968bbfb..1d99317854 100644 --- a/src/resources/api_nw_menuitem.js +++ b/src/resources/api_nw_menuitem.js @@ -4,7 +4,7 @@ var messagingNatives = requireNative('messaging_natives'); var util = nw.require('util'); var EventEmitter = nw.require('events').EventEmitter; -var menuItems = { objs : {}, clickEvent: {} }; +var menuItems = { objs : Object.create(null), clickEvent: {} }; menuItems.clickEvent = bindingUtil.createCustomEvent("NWObjectclick", false, false); menuItems.clickEvent.addListener(function(id) { var obj = menuItems.objs[id]; @@ -78,7 +78,6 @@ function MenuItem(option) { this.id = id; privates(this).option = option; - menuItems.objs[id] = this; // All properties must be set after initialization. if (!option.hasOwnProperty('icon')) option.shadowIcon = ''; @@ -97,8 +96,17 @@ function MenuItem(option) { } +MenuItem.eventRegistry = { + add: function (menu_item) { + menuItems.objs[menu_item.id] = menu_item; + }, + remove: function (menu_item) { + delete menuItems.objs[menu_item.id] + } +}; + MenuItem.prototype._destroy = function () { - menuItems.objs[this.id] = null; + MenuItem.eventRegistry.remove(this); }; util.inherits(MenuItem, EventEmitter);