Merge pull request #10486 from atom/bf-fix-submenu-items

Honor `created()` function for an item in a submenu.
This commit is contained in:
Max Brunsfeld
2016-01-25 13:31:25 -08:00
2 changed files with 41 additions and 6 deletions

View File

@@ -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',
}
]
])

View File

@@ -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 = {}