/* * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). * Copyright (C) 2010 Apple Inc. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public License * along with this library; see the file COPYING.LIB. If not, write to * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * */ #include "config.h" #if ENABLE(CONTEXT_MENUS) #include "WebContextMenu.h" #include "InjectedBundleHitTestResult.h" #include "InjectedBundleUserMessageCoders.h" #include "WebCoreArgumentCoders.h" #include "WebHitTestResult.h" #include "WebPage.h" #include "WebPageProxyMessages.h" #include "WebProcess.h" #include #include #include #include #include using namespace WebCore; namespace WebKit { WebContextMenu::WebContextMenu(WebPage* page) : m_page(page) { } WebContextMenu::~WebContextMenu() { } void WebContextMenu::show() { ContextMenuController* controller = m_page->corePage()->contextMenuController(); if (!controller) return; ContextMenu* menu = controller->contextMenu(); if (!menu) return; Node* node = controller->hitTestResult().innerNonSharedNode(); if (!node) return; Frame* frame = node->document()->frame(); if (!frame) return; FrameView* view = frame->view(); if (!view) return; // Give the bundle client a chance to process the menu. #if USE(CROSS_PLATFORM_CONTEXT_MENUS) const Vector& coreItems = menu->items(); #else Vector coreItems = contextMenuItemVector(menu->platformDescription()); #endif Vector proposedMenu = kitItems(coreItems, menu); Vector newMenu; RefPtr userData; RefPtr hitTestResult = InjectedBundleHitTestResult::create(controller->hitTestResult()); if (m_page->injectedBundleContextMenuClient().getCustomMenuFromDefaultItems(m_page, hitTestResult.get(), proposedMenu, newMenu, userData)) proposedMenu = newMenu; WebHitTestResult::Data webHitTestResultData(controller->hitTestResult()); // Mark the WebPage has having a shown context menu then notify the UIProcess. m_page->contextMenuShowing(); m_page->send(Messages::WebPageProxy::ShowContextMenu(view->contentsToWindow(controller->hitTestResult().roundedPoint()), webHitTestResultData, proposedMenu, InjectedBundleUserMessageEncoder(userData.get()))); } void WebContextMenu::itemSelected(const WebContextMenuItemData& item) { ContextMenuItem coreItem(ActionType, static_cast(item.action()), item.title()); m_page->corePage()->contextMenuController()->contextMenuItemSelected(&coreItem); } } // namespace WebKit #endif // ENABLE(CONTEXT_MENUS)