diff options
Diffstat (limited to 'WebCore/page/ContextMenuController.cpp')
| -rw-r--r-- | WebCore/page/ContextMenuController.cpp | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/WebCore/page/ContextMenuController.cpp b/WebCore/page/ContextMenuController.cpp index 7d773ca..726dee9 100644 --- a/WebCore/page/ContextMenuController.cpp +++ b/WebCore/page/ContextMenuController.cpp @@ -31,6 +31,7 @@ #include "Chrome.h" #include "ContextMenu.h" #include "ContextMenuClient.h" +#include "ContextMenuSelectionHandler.h" #include "Document.h" #include "DocumentFragment.h" #include "DocumentLoader.h" @@ -66,6 +67,7 @@ ContextMenuController::ContextMenuController(Page* page, ContextMenuClient* clie : m_page(page) , m_client(client) , m_contextMenu(0) + , m_selectionHandler(0) { ASSERT_ARG(page, page); ASSERT_ARG(client, client); @@ -79,13 +81,40 @@ ContextMenuController::~ContextMenuController() void ContextMenuController::clearContextMenu() { m_contextMenu.set(0); + if (m_selectionHandler) + m_selectionHandler->contextMenuCleared(); + m_selectionHandler = 0; } void ContextMenuController::handleContextMenuEvent(Event* event) { - ASSERT(event->type() == eventNames().contextmenuEvent); - if (!event->isMouseEvent()) + m_contextMenu.set(createContextMenu(event)); + if (!m_contextMenu) return; + m_contextMenu->populate(); + showContextMenu(event); +} + +void ContextMenuController::showContextMenu(Event* event, Vector<ContextMenuItem>& items, PassRefPtr<ContextMenuSelectionHandler> selectionHandler) +{ + m_selectionHandler = selectionHandler; + + m_contextMenu.set(createContextMenu(event)); + if (!m_contextMenu) { + clearContextMenu(); + return; + } + for (size_t i = 0; i < items.size(); ++i) { + ContextMenuItem& item = items[i]; + m_contextMenu->appendItem(item); + } + showContextMenu(event); +} + +ContextMenu* ContextMenuController::createContextMenu(Event* event) +{ + if (!event->isMouseEvent()) + return 0; MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); HitTestResult result(mouseEvent->absoluteLocation()); @@ -93,18 +122,18 @@ void ContextMenuController::handleContextMenuEvent(Event* event) result = frame->eventHandler()->hitTestResultAtPoint(mouseEvent->absoluteLocation(), false); if (!result.innerNonSharedNode()) - return; + return 0; + return new ContextMenu(result); +} - m_contextMenu.set(new ContextMenu(result)); - m_contextMenu->populate(); +void ContextMenuController::showContextMenu(Event* event) +{ #if ENABLE(INSPECTOR) if (m_page->inspectorController()->enabled()) m_contextMenu->addInspectElementItem(); #endif - PlatformMenuDescription customMenu = m_client->getCustomMenuFromDefaultItems(m_contextMenu.get()); m_contextMenu->setPlatformDescription(customMenu); - event->setDefaultHandled(); } @@ -126,6 +155,12 @@ void ContextMenuController::contextMenuItemSelected(ContextMenuItem* item) return; } + if (item->action() >= ContextMenuItemBaseCustomTag) { + ASSERT(m_selectionHandler); + m_selectionHandler->contextMenuItemSelected(item); + return; + } + HitTestResult result = m_contextMenu->hitTestResult(); Frame* frame = result.innerNonSharedNode()->document()->frame(); if (!frame) |
