165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/* 265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without 665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions 765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met: 865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright 965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer. 1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright 1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * notice, this list of conditions and the following disclaimer in the 1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * documentation and/or other materials provided with the distribution. 1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE. 2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */ 2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h" 2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WebContextMenuProxyQt.h" 2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <IntPoint.h> 3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <OwnPtr.h> 3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <WebContextMenuItemData.h> 3365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <qmenu.h> 3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <qwkpage.h> 3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochusing namespace WebCore; 3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochnamespace WebKit { 3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochstatic QWKPage::WebAction webActionForContextMenuAction(WebCore::ContextMenuAction action) 4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (action) { 4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagOpenLink: 4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::OpenLink; 4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagOpenLinkInNewWindow: 4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::OpenLinkInNewWindow; 4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagCopyLinkToClipboard: 4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::CopyLinkToClipboard; 4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagOpenImageInNewWindow: 5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::OpenImageInNewWindow; 5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagGoBack: 5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Back; 5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagGoForward: 5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Forward; 5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagStop: 5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Stop; 5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagReload: 5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Reload; 5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagCut: 6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Cut; 6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagCopy: 6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Copy; 6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagPaste: 6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::Paste; 6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ContextMenuItemTagSelectAll: 6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::SelectAll; 6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch default: 6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return QWKPage::NoWebAction; 7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochWebContextMenuProxyQt::WebContextMenuProxyQt(QWKPage* page) 7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch : m_page(page) 7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben MurdochPassRefPtr<WebContextMenuProxyQt> WebContextMenuProxyQt::create(QWKPage* page) 7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 8065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch return adoptRef(new WebContextMenuProxyQt(page)); 8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebContextMenuProxyQt::showContextMenu(const IntPoint& position, const Vector<WebContextMenuItemData>& items) 8465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 852bde8e466a4451c7319e3a072d118917957d6554Steve Block if (items.isEmpty()) 862bde8e466a4451c7319e3a072d118917957d6554Steve Block return; 872bde8e466a4451c7319e3a072d118917957d6554Steve Block 8881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnPtr<QMenu> menu = createContextMenu(items); 8981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // We send the signal, even with no items, because the client should be able to show custom items 9181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch // even if WebKit has nothing to show. 9281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!menu) 9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch menu = adoptPtr(new QMenu); 9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch menu->move(position); 9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch emit m_page->showContextMenu(QSharedPointer<QMenu>(menu.leakPtr())); 9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WebContextMenuProxyQt::hideContextMenu() 10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 10381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochPassOwnPtr<QMenu> WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemData>& items) const 10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{ 10581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch OwnPtr<QMenu> menu = adoptPtr(new QMenu); 10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (int i = 0; i < items.size(); ++i) { 10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch const WebContextMenuItemData& item = items.at(i); 10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch switch (item.type()) { 10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::CheckableActionType: /* fall through */ 11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::ActionType: { 11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch QWKPage::WebAction action = webActionForContextMenuAction(item.action()); 11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch QAction* qtAction = m_page->action(action); 11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (qtAction) { 11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch qtAction->setEnabled(item.enabled()); 11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch qtAction->setChecked(item.checked()); 11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch qtAction->setCheckable(item.type() == WebCore::CheckableActionType); 11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch menu->addAction(qtAction); 11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::SeparatorType: 12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch menu->addSeparator(); 12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch case WebCore::SubmenuType: 12681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (OwnPtr<QMenu> subMenu = createContextMenu(item.submenu())) { 12781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch subMenu->setParent(menu.get()); 12881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch QMenu* const subMenuPtr = subMenu.leakPtr(); 12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch subMenu->setTitle(item.title()); 13081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch menu->addMenu(subMenuPtr); 13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch break; 13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch // Do not show sub-menus with just disabled actions. 13881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (menu->isEmpty()) 13981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return PassOwnPtr<QMenu>(); 14081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch 14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch bool isAnyActionEnabled = false; 14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch QList<QAction *> actions = menu->actions(); 14365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch for (int i = 0; i < actions.count(); ++i) { 14465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch if (actions.at(i)->isVisible()) 14565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch isAnyActionEnabled |= actions.at(i)->isEnabled(); 14665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch } 14781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch if (!isAnyActionEnabled) 14881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return PassOwnPtr<QMenu>(); 14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch return menu.release(); 15165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} 15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch 15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch} // namespace WebKit 154