OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "config.h" | 5 #include "config.h" |
6 #include "core/page/CustomContextMenuProvider.h" | 6 #include "core/page/CustomContextMenuProvider.h" |
7 | 7 |
8 #include "core/dom/Document.h" | 8 #include "core/dom/Document.h" |
9 #include "core/dom/ElementTraversal.h" | 9 #include "core/dom/ElementTraversal.h" |
10 #include "core/events/EventDispatcher.h" | 10 #include "core/events/EventDispatcher.h" |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
62 // Avoid separators at the start of any menu and submenu. | 62 // Avoid separators at the start of any menu and submenu. |
63 if (!contextMenu.items().size()) | 63 if (!contextMenu.items().size()) |
64 return; | 64 return; |
65 | 65 |
66 // Collapse all sequences of two or more adjacent separators in the menu or | 66 // Collapse all sequences of two or more adjacent separators in the menu or |
67 // any submenus to a single separator. | 67 // any submenus to a single separator. |
68 ContextMenuItem lastItem = contextMenu.items().last(); | 68 ContextMenuItem lastItem = contextMenu.items().last(); |
69 if (lastItem.type() == SeparatorType) | 69 if (lastItem.type() == SeparatorType) |
70 return; | 70 return; |
71 | 71 |
72 contextMenu.appendItem(ContextMenuItem(SeparatorType, ContextMenuItemCustomT agNoAction, String())); | 72 contextMenu.appendItem(ContextMenuItem(SeparatorType, ContextMenuItemCustomT agNoAction, String(), String())); |
73 } | 73 } |
74 | 74 |
75 void CustomContextMenuProvider::appendMenuItem(HTMLMenuItemElement* menuItem, Co ntextMenu& contextMenu) | 75 void CustomContextMenuProvider::appendMenuItem(HTMLMenuItemElement* menuItem, Co ntextMenu& contextMenu) |
76 { | 76 { |
77 // Avoid menuitems with no label. | 77 // Avoid menuitems with no label. |
78 String labelString = menuItem->fastGetAttribute(labelAttr); | 78 String labelString = menuItem->fastGetAttribute(labelAttr); |
79 if (labelString.isEmpty()) | 79 if (labelString.isEmpty()) |
80 return; | 80 return; |
81 | 81 |
82 m_menuItems.append(menuItem); | 82 m_menuItems.append(menuItem); |
83 | 83 |
84 bool enabled = !menuItem->fastHasAttribute(disabledAttr); | 84 bool enabled = !menuItem->fastHasAttribute(disabledAttr); |
85 String icon = menuItem->fastGetAttribute(iconAttr); | |
pals
2015/01/02 12:07:47
We need to resolve icon's url relative to the elem
pals
2015/01/02 13:05:42
Done.
| |
85 ContextMenuAction action = static_cast<ContextMenuAction>(ContextMenuItemBas eCustomTag + m_menuItems.size() - 1); | 86 ContextMenuAction action = static_cast<ContextMenuAction>(ContextMenuItemBas eCustomTag + m_menuItems.size() - 1); |
86 if (equalIgnoringCase(menuItem->fastGetAttribute(typeAttr), "checkbox")) | 87 if (equalIgnoringCase(menuItem->fastGetAttribute(typeAttr), "checkbox")) |
87 contextMenu.appendItem(ContextMenuItem(CheckableActionType, action, labe lString, enabled, menuItem->fastHasAttribute(checkedAttr))); | 88 contextMenu.appendItem(ContextMenuItem(CheckableActionType, action, labe lString, icon, enabled, menuItem->fastHasAttribute(checkedAttr))); |
88 else | 89 else |
89 contextMenu.appendItem(ContextMenuItem(ActionType, action, labelString, enabled, false)); | 90 contextMenu.appendItem(ContextMenuItem(ActionType, action, labelString, icon, enabled, false)); |
90 } | 91 } |
91 | 92 |
92 void CustomContextMenuProvider::populateContextMenuItems(const HTMLMenuElement& menu, ContextMenu& contextMenu) | 93 void CustomContextMenuProvider::populateContextMenuItems(const HTMLMenuElement& menu, ContextMenu& contextMenu) |
93 { | 94 { |
94 HTMLElement* nextElement = Traversal<HTMLElement>::firstWithin(menu); | 95 HTMLElement* nextElement = Traversal<HTMLElement>::firstWithin(menu); |
95 while (nextElement) { | 96 while (nextElement) { |
96 if (isHTMLHRElement(*nextElement)) { | 97 if (isHTMLHRElement(*nextElement)) { |
97 appendSeparator(contextMenu); | 98 appendSeparator(contextMenu); |
98 nextElement = Traversal<HTMLElement>::next(*nextElement, &menu); | 99 nextElement = Traversal<HTMLElement>::next(*nextElement, &menu); |
99 } else if (isHTMLMenuElement(*nextElement)) { | 100 } else if (isHTMLMenuElement(*nextElement)) { |
100 ContextMenu subMenu; | 101 ContextMenu subMenu; |
101 String labelString = nextElement->fastGetAttribute(labelAttr); | 102 String labelString = nextElement->fastGetAttribute(labelAttr); |
102 if (labelString.isNull()) { | 103 if (labelString.isNull()) { |
103 appendSeparator(contextMenu); | 104 appendSeparator(contextMenu); |
104 populateContextMenuItems(*toHTMLMenuElement(nextElement), contex tMenu); | 105 populateContextMenuItems(*toHTMLMenuElement(nextElement), contex tMenu); |
105 appendSeparator(contextMenu); | 106 appendSeparator(contextMenu); |
106 } else if (!labelString.isEmpty()) { | 107 } else if (!labelString.isEmpty()) { |
107 populateContextMenuItems(*toHTMLMenuElement(nextElement), subMen u); | 108 populateContextMenuItems(*toHTMLMenuElement(nextElement), subMen u); |
108 contextMenu.appendItem(ContextMenuItem(SubmenuType, ContextMenuI temCustomTagNoAction, labelString, &subMenu)); | 109 contextMenu.appendItem(ContextMenuItem(SubmenuType, ContextMenuI temCustomTagNoAction, labelString, String(), &subMenu)); |
109 } | 110 } |
110 nextElement = Traversal<HTMLElement>::nextSibling(*nextElement); | 111 nextElement = Traversal<HTMLElement>::nextSibling(*nextElement); |
111 } else if (isHTMLMenuItemElement(*nextElement)) { | 112 } else if (isHTMLMenuItemElement(*nextElement)) { |
112 appendMenuItem(toHTMLMenuItemElement(nextElement), contextMenu); | 113 appendMenuItem(toHTMLMenuItemElement(nextElement), contextMenu); |
113 if (ContextMenuItemBaseCustomTag + m_menuItems.size() >= ContextMenu ItemLastCustomTag) | 114 if (ContextMenuItemBaseCustomTag + m_menuItems.size() >= ContextMenu ItemLastCustomTag) |
114 break; | 115 break; |
115 nextElement = Traversal<HTMLElement>::next(*nextElement, &menu); | 116 nextElement = Traversal<HTMLElement>::next(*nextElement, &menu); |
116 } else { | 117 } else { |
117 nextElement = Traversal<HTMLElement>::next(*nextElement, &menu); | 118 nextElement = Traversal<HTMLElement>::next(*nextElement, &menu); |
118 } | 119 } |
119 } | 120 } |
120 | 121 |
121 // Remove separators at the end of the menu and any submenus. | 122 // Remove separators at the end of the menu and any submenus. |
122 while (contextMenu.items().size() && contextMenu.items().last().type() == Se paratorType) | 123 while (contextMenu.items().size() && contextMenu.items().last().type() == Se paratorType) |
123 contextMenu.removeLastItem(); | 124 contextMenu.removeLastItem(); |
124 } | 125 } |
125 | 126 |
126 HTMLElement* CustomContextMenuProvider::menuItemAt(unsigned menuId) | 127 HTMLElement* CustomContextMenuProvider::menuItemAt(unsigned menuId) |
127 { | 128 { |
128 int itemIndex = menuId - ContextMenuItemBaseCustomTag; | 129 int itemIndex = menuId - ContextMenuItemBaseCustomTag; |
129 if (itemIndex < 0 || static_cast<unsigned long>(itemIndex) >= m_menuItems.si ze()) | 130 if (itemIndex < 0 || static_cast<unsigned long>(itemIndex) >= m_menuItems.si ze()) |
130 return nullptr; | 131 return nullptr; |
131 return m_menuItems[itemIndex].get(); | 132 return m_menuItems[itemIndex].get(); |
132 } | 133 } |
133 | 134 |
134 } // namespace blink | 135 } // namespace blink |
OLD | NEW |