diff --git a/spec/context-menu-manager-spec.coffee b/spec/context-menu-manager-spec.coffee index ddced8452..b336361f8 100644 --- a/spec/context-menu-manager-spec.coffee +++ b/spec/context-menu-manager-spec.coffee @@ -156,3 +156,28 @@ describe "ContextMenuManager", -> catch error addError = error expect(addError.message).toContain('<>') + + it "calls `created` hooks for submenu items", -> + item = { + label: 'A', + command: 'B', + submenu: [ + { + label: 'C', + created: (event) -> @label = 'D', + } + ] + } + contextMenu.add('.grandchild': [item]) + + dispatchedEvent = {target: grandchild} + expect(contextMenu.templateForEvent(dispatchedEvent)).toEqual( + [ + label: 'A', + command: 'B', + submenu: [ + { + label: 'D', + } + ] + ]) diff --git a/src/context-menu-manager.coffee b/src/context-menu-manager.coffee index 869076beb..1d80dec09 100644 --- a/src/context-menu-manager.coffee +++ b/src/context-menu-manager.coffee @@ -136,12 +136,9 @@ class ContextMenuManager for itemSet in matchingItemSets for item in itemSet.items - continue if item.devMode and not @devMode - item = Object.create(item) - if typeof item.shouldDisplay is 'function' - continue unless item.shouldDisplay(event) - item.created?(event) - MenuHelpers.merge(currentTargetItems, item, itemSet.specificity) + itemForEvent = @cloneItemForEvent(item, event) + if itemForEvent + MenuHelpers.merge(currentTargetItems, itemForEvent, itemSet.specificity) for item in currentTargetItems MenuHelpers.merge(template, item, false) @@ -150,6 +147,19 @@ class ContextMenuManager template + # Returns an object compatible with `::add()` or `null`. + cloneItemForEvent: (item, event) -> + return null if item.devMode and not @devMode + item = Object.create(item) + if typeof item.shouldDisplay is 'function' + return null unless item.shouldDisplay(event) + item.created?(event) + if Array.isArray(item.submenu) + item.submenu = item.submenu + .map((submenuItem) => @cloneItemForEvent(submenuItem, event)) + .filter((submenuItem) -> submenuItem isnt null) + return item + convertLegacyItemsBySelector: (legacyItemsBySelector, devMode) -> itemsBySelector = {}