| Index: Source/core/html/HTMLMenuElement.cpp
|
| diff --git a/Source/core/html/HTMLMenuElement.cpp b/Source/core/html/HTMLMenuElement.cpp
|
| index e043ed557b9176a4132984b499a9040c536cdf3f..221988b2f19420c5d0823c5d9067563c1cc46631 100644
|
| --- a/Source/core/html/HTMLMenuElement.cpp
|
| +++ b/Source/core/html/HTMLMenuElement.cpp
|
| @@ -21,9 +21,14 @@
|
| */
|
|
|
| #include "config.h"
|
| +
|
| #include "core/html/HTMLMenuElement.h"
|
|
|
| -#include "HTMLNames.h"
|
| +#include "core/dom/ElementTraversal.h"
|
| +#include "core/events/RelatedEvent.h"
|
| +#include "core/html/HTMLMenuItemElement.h"
|
| +#include "core/page/ContextMenuController.h"
|
| +#include "core/page/Page.h"
|
|
|
| namespace WebCore {
|
|
|
| @@ -40,4 +45,50 @@ PassRefPtrWillBeRawPtr<HTMLMenuElement> HTMLMenuElement::create(Document& docume
|
| return adoptRefWillBeRefCountedGarbageCollected(new HTMLMenuElement(document));
|
| }
|
|
|
| +CustomContextMenuProvider& HTMLMenuElement::ensureMenuProvider()
|
| +{
|
| + if (!m_menuProvider) {
|
| + ContextMenu menu;
|
| + populateContextMenuItems(this, menu);
|
| + m_menuProvider = CustomContextMenuProvider::create(this, menu.items());
|
| + }
|
| + return *m_menuProvider;
|
| +}
|
| +
|
| +void HTMLMenuElement::populateContextMenuItems(HTMLMenuElement* menu, ContextMenu& contextMenu)
|
| +{
|
| + Element* nextElement = ElementTraversal::firstWithin(*menu);
|
| + while (nextElement) {
|
| + if (nextElement->hasTagName(HTMLNames::menuTag)) {
|
| + ContextMenu subMenu;
|
| + populateContextMenuItems(toHTMLMenuElement(nextElement), subMenu);
|
| + contextMenu.appendItem(ContextMenuItem(SubmenuType, ContextMenuItemCustomTagNoAction, nextElement->fastGetAttribute(HTMLNames::labelAttr), &subMenu));
|
| + nextElement = ElementTraversal::nextSibling(*nextElement);
|
| + } else if (nextElement->hasTagName(HTMLNames::menuitemTag)) {
|
| + m_menuItems.append(toHTMLElement(nextElement));
|
| + contextMenu.appendItem(ContextMenuItem(ActionType, static_cast<ContextMenuAction>(ContextMenuItemBaseCustomTag + m_menuItems.size() - 1), nextElement->fastGetAttribute(HTMLNames::labelAttr)));
|
| + if (ContextMenuItemBaseCustomTag + m_menuItems.size() >= ContextMenuItemLastCustomTag)
|
| + break;
|
| + nextElement = ElementTraversal::next(*nextElement, menu);
|
| + }
|
| + }
|
| +}
|
| +
|
| +void HTMLMenuElement::defaultEventHandler(Event* event)
|
| +{
|
| + if (event->type() == EventTypeNames::show && event->isRelatedEvent()) {
|
| + m_subject = toHTMLElement(toRelatedEvent(event)->relatedTarget()->toNode());
|
| + ensureMenuProvider();
|
| + event->setDefaultHandled();
|
| + }
|
| +}
|
| +
|
| +HTMLElement* HTMLMenuElement::menuItemAt(unsigned menuId)
|
| +{
|
| + if (menuId < ContextMenuItemBaseCustomTag || menuId > ContextMenuItemLastCustomTag)
|
| + return 0;
|
| + int itemNumber = menuId - ContextMenuItemBaseCustomTag;
|
| + return m_menuItems[itemNumber];
|
| +}
|
| +
|
| }
|
|
|