Title: [91758] trunk/Source/WebKit2
Revision
91758
Author
[email protected]
Date
2011-07-26 09:56:28 -0700 (Tue, 26 Jul 2011)

Log Message

[Qt][WK2] Make the WebContextMenuProxyQt handle the full interactions between the views and the WebPageProxy
https://bugs.webkit.org/show_bug.cgi?id=64739

Reviewed by Andreas Kling.

Change the WebContextMenuProxyQt to be the intermediary between the WebPageProxy and our views regarding
the context menu.

The actions of the context menu are no longer the responsibility of QtWebPageProxy but are instead
created and handled directly by the WebContextMenuProxyQt.

* UIProcess/qt/QtWebPageProxy.cpp:
(QtWebPageProxy::createContextMenuProxy):
(QtWebPageProxy::triggerAction):
(QtWebPageProxy::action):
* UIProcess/qt/QtWebPageProxy.h:
* UIProcess/qt/WebContextMenuProxyQt.cpp:
(WebKit::WebContextMenuProxyQt::WebContextMenuProxyQt):
(WebKit::WebContextMenuProxyQt::create):
(WebKit::WebContextMenuProxyQt::actionTriggered):
(WebKit::WebContextMenuProxyQt::showContextMenu):
(WebKit::WebContextMenuProxyQt::hideContextMenu):
(WebKit::WebContextMenuProxyQt::createContextMenu):
* UIProcess/qt/WebContextMenuProxyQt.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (91757 => 91758)


--- trunk/Source/WebKit2/ChangeLog	2011-07-26 16:22:01 UTC (rev 91757)
+++ trunk/Source/WebKit2/ChangeLog	2011-07-26 16:56:28 UTC (rev 91758)
@@ -1,3 +1,30 @@
+2011-07-26  Benjamin Poulain  <[email protected]>
+
+        [Qt][WK2] Make the WebContextMenuProxyQt handle the full interactions between the views and the WebPageProxy
+        https://bugs.webkit.org/show_bug.cgi?id=64739
+
+        Reviewed by Andreas Kling.
+
+        Change the WebContextMenuProxyQt to be the intermediary between the WebPageProxy and our views regarding
+        the context menu.
+
+        The actions of the context menu are no longer the responsibility of QtWebPageProxy but are instead
+        created and handled directly by the WebContextMenuProxyQt.
+
+        * UIProcess/qt/QtWebPageProxy.cpp:
+        (QtWebPageProxy::createContextMenuProxy):
+        (QtWebPageProxy::triggerAction):
+        (QtWebPageProxy::action):
+        * UIProcess/qt/QtWebPageProxy.h:
+        * UIProcess/qt/WebContextMenuProxyQt.cpp:
+        (WebKit::WebContextMenuProxyQt::WebContextMenuProxyQt):
+        (WebKit::WebContextMenuProxyQt::create):
+        (WebKit::WebContextMenuProxyQt::actionTriggered):
+        (WebKit::WebContextMenuProxyQt::showContextMenu):
+        (WebKit::WebContextMenuProxyQt::hideContextMenu):
+        (WebKit::WebContextMenuProxyQt::createContextMenu):
+        * UIProcess/qt/WebContextMenuProxyQt.h:
+
 2011-07-26  Carlos Garcia Campos  <[email protected]>
 
         [GTK] Remove header webkitwebviewcommon.h

Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp (91757 => 91758)


--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp	2011-07-26 16:22:01 UTC (rev 91757)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.cpp	2011-07-26 16:56:28 UTC (rev 91758)
@@ -66,32 +66,6 @@
     return defaultContext;
 }
 
-static WebCore::ContextMenuAction contextMenuActionForWebAction(QtWebPageProxy::WebAction action)
-{
-    switch (action) {
-    case QtWebPageProxy::OpenLink:
-        return WebCore::ContextMenuItemTagOpenLink;
-    case QtWebPageProxy::OpenLinkInNewWindow:
-        return WebCore::ContextMenuItemTagOpenLinkInNewWindow;
-    case QtWebPageProxy::CopyLinkToClipboard:
-        return WebCore::ContextMenuItemTagCopyLinkToClipboard;
-    case QtWebPageProxy::OpenImageInNewWindow:
-        return WebCore::ContextMenuItemTagOpenImageInNewWindow;
-    case QtWebPageProxy::Cut:
-        return WebCore::ContextMenuItemTagCut;
-    case QtWebPageProxy::Copy:
-        return WebCore::ContextMenuItemTagCopy;
-    case QtWebPageProxy::Paste:
-        return WebCore::ContextMenuItemTagPaste;
-    case QtWebPageProxy::SelectAll:
-        return WebCore::ContextMenuItemTagSelectAll;
-    default:
-        ASSERT(false);
-        break;
-    }
-    return WebCore::ContextMenuItemTagNoAction;
-}
-
 static inline Qt::DropActions dragOperationToDropActions(unsigned dragOperations)
 {
     Qt::DropActions result = Qt::IgnoreAction;
@@ -401,7 +375,7 @@
 
 PassRefPtr<WebContextMenuProxy> QtWebPageProxy::createContextMenuProxy(WebPageProxy*)
 {
-    return WebContextMenuProxyQt::create(this);
+    return WebContextMenuProxyQt::create(m_webPageProxy.get(), m_viewInterface);
 }
 
 void QtWebPageProxy::setFindIndicator(PassRefPtr<FindIndicator>, bool fadeOut)
@@ -441,16 +415,6 @@
     m_viewInterface->didChangeStatusText(text);
 }
 
-void QtWebPageProxy::showContextMenu(QSharedPointer<QMenu> menu)
-{
-    m_viewInterface->showContextMenu(menu);
-}
-
-void QtWebPageProxy::hideContextMenu()
-{
-    m_viewInterface->hideContextMenu();
-}
-
 void QtWebPageProxy::loadDidBegin()
 {
     m_viewInterface->loadDidBegin();
@@ -640,12 +604,8 @@
         m_webPageProxy->reload(/* reloadFromOrigin */ true);
         return;
     default:
-        break;
+        ASSERT_NOT_REACHED();
     }
-
-    QAction* qtAction = action(webAction);
-    WebKit::WebContextMenuItemData menuItemData(ActionType, contextMenuActionForWebAction(webAction), qtAction->text(), qtAction->isEnabled(), qtAction->isChecked());
-    m_webPageProxy->contextMenuItemSelected(menuItemData);
 }
 
 QAction* QtWebPageProxy::navigationAction(QtWebKit::NavigationAction which) const
@@ -679,18 +639,6 @@
     QtWebPageProxy* mutableSelf = const_cast<QtWebPageProxy*>(this);
 
     switch (action) {
-    case OpenLink:
-        text = contextMenuItemTagOpenLink();
-        break;
-    case OpenLinkInNewWindow:
-        text = contextMenuItemTagOpenLinkInNewWindow();
-        break;
-    case CopyLinkToClipboard:
-        text = contextMenuItemTagCopyLinkToClipboard();
-        break;
-    case OpenImageInNewWindow:
-        text = contextMenuItemTagOpenImageInNewWindow();
-        break;
     case Back:
         text = contextMenuItemTagGoBack();
         icon = style->standardIcon(QStyle::SP_ArrowBack);
@@ -707,18 +655,6 @@
         text = contextMenuItemTagReload();
         icon = style->standardIcon(QStyle::SP_BrowserReload);
         break;
-    case Cut:
-        text = contextMenuItemTagCut();
-        break;
-    case Copy:
-        text = contextMenuItemTagCopy();
-        break;
-    case Paste:
-        text = contextMenuItemTagPaste();
-        break;
-    case SelectAll:
-        text = contextMenuItemTagSelectAll();
-        break;
     case Undo: {
         QAction* undoAction = m_undoStack->createUndoAction(mutableSelf);
         m_actions[action] = undoAction;
@@ -730,7 +666,7 @@
         return redoAction;
     }
     default:
-        return 0;
+        ASSERT_NOT_REACHED();
         break;
     }
 

Modified: trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h (91757 => 91758)


--- trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h	2011-07-26 16:22:01 UTC (rev 91757)
+++ trunk/Source/WebKit2/UIProcess/qt/QtWebPageProxy.h	2011-07-26 16:56:28 UTC (rev 91758)
@@ -62,21 +62,11 @@
     enum WebAction {
         NoWebAction = - 1,
 
-        OpenLink,
-        OpenLinkInNewWindow,
-        CopyLinkToClipboard,
-        OpenImageInNewWindow,
-
         Back,
         Forward,
         Stop,
         Reload,
 
-        Cut,
-        Copy,
-        Paste,
-        SelectAll,
-
         Undo,
         Redo,
 
@@ -143,8 +133,6 @@
     void didChangeUrl(const QUrl&);
     void didChangeTitle(const QString&);
     void didChangeStatusText(const QString&);
-    void showContextMenu(QSharedPointer<QMenu>);
-    void hideContextMenu();
 
     void loadDidBegin();
     void loadDidSucceed();

Modified: trunk/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp (91757 => 91758)


--- trunk/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp	2011-07-26 16:22:01 UTC (rev 91757)
+++ trunk/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.cpp	2011-07-26 16:56:28 UTC (rev 91758)
@@ -35,49 +35,36 @@
 
 using namespace WebCore;
 
+Q_DECLARE_METATYPE(WebKit::WebContextMenuItemData);
+
 namespace WebKit {
 
-static QtWebPageProxy::WebAction webActionForContextMenuAction(WebCore::ContextMenuAction action)
+WebContextMenuProxyQt::WebContextMenuProxyQt(WebPageProxy* pageProxy, ViewInterface* viewInterface)
+    : m_webPageProxy(pageProxy)
+    , m_viewInterface(viewInterface)
 {
-    switch (action) {
-    case WebCore::ContextMenuItemTagOpenLink:
-        return QtWebPageProxy::OpenLink;
-    case WebCore::ContextMenuItemTagOpenLinkInNewWindow:
-        return QtWebPageProxy::OpenLinkInNewWindow;
-    case WebCore::ContextMenuItemTagCopyLinkToClipboard:
-        return QtWebPageProxy::CopyLinkToClipboard;
-    case WebCore::ContextMenuItemTagOpenImageInNewWindow:
-        return QtWebPageProxy::OpenImageInNewWindow;
-    case WebCore::ContextMenuItemTagGoBack:
-        return QtWebPageProxy::Back;
-    case WebCore::ContextMenuItemTagGoForward:
-        return QtWebPageProxy::Forward;
-    case WebCore::ContextMenuItemTagStop:
-        return QtWebPageProxy::Stop;
-    case WebCore::ContextMenuItemTagReload:
-        return QtWebPageProxy::Reload;
-    case WebCore::ContextMenuItemTagCut:
-        return QtWebPageProxy::Cut;
-    case WebCore::ContextMenuItemTagCopy:
-        return QtWebPageProxy::Copy;
-    case WebCore::ContextMenuItemTagPaste:
-        return QtWebPageProxy::Paste;
-    case WebCore::ContextMenuItemTagSelectAll:
-        return QtWebPageProxy::SelectAll;
-    default:
-        break;
-    }
-    return QtWebPageProxy::NoWebAction;
 }
 
-WebContextMenuProxyQt::WebContextMenuProxyQt(QtWebPageProxy* page)
-    : m_page(page)
+PassRefPtr<WebContextMenuProxyQt> WebContextMenuProxyQt::create(WebPageProxy* pageProxy, ViewInterface* viewInterface)
 {
+    return adoptRef(new WebContextMenuProxyQt(pageProxy, viewInterface));
 }
 
-PassRefPtr<WebContextMenuProxyQt> WebContextMenuProxyQt::create(QtWebPageProxy* page)
+void WebContextMenuProxyQt::actionTriggered(bool)
 {
-    return adoptRef(new WebContextMenuProxyQt(page));
+    QAction* qtAction = qobject_cast<QAction*>(sender());
+    if (!qtAction) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    QVariant data = ""
+    if (!data.canConvert<WebContextMenuItemData>()) {
+        ASSERT_NOT_REACHED();
+        return;
+    }
+
+    m_webPageProxy->contextMenuItemSelected(qtAction->data().value<WebContextMenuItemData>());
 }
 
 void WebContextMenuProxyQt::showContextMenu(const IntPoint& position, const Vector<WebContextMenuItemData>& items)
@@ -93,12 +80,12 @@
         menu = adoptPtr(new QMenu);
 
     menu->move(position);
-    m_page->showContextMenu(QSharedPointer<QMenu>(menu.leakPtr()));
+    m_viewInterface->showContextMenu(QSharedPointer<QMenu>(menu.leakPtr()));
 }
 
 void WebContextMenuProxyQt::hideContextMenu()
 {
-    m_page->hideContextMenu();
+    m_viewInterface->hideContextMenu();
 }
 
 PassOwnPtr<QMenu> WebContextMenuProxyQt::createContextMenu(const Vector<WebContextMenuItemData>& items) const
@@ -109,15 +96,15 @@
         switch (item.type()) {
         case WebCore::CheckableActionType: /* fall through */
         case WebCore::ActionType: {
-            QtWebPageProxy::WebAction action = ""
-            QAction* qtAction = m_page->action(action);
-            if (qtAction) {
-                qtAction->setEnabled(item.enabled());
-                qtAction->setChecked(item.checked());
-                qtAction->setCheckable(item.type() == WebCore::CheckableActionType);
+            QAction* qtAction = new QAction(menu.get());
+            qtAction->setData(QVariant::fromValue(item));
+            qtAction->setText(item.title());
+            qtAction->setEnabled(item.enabled());
+            qtAction->setChecked(item.checked());
+            qtAction->setCheckable(item.type() == WebCore::CheckableActionType);
+            connect(qtAction, SIGNAL(triggered(bool)), this, SLOT(actionTriggered(bool)), Qt::DirectConnection);
 
-                menu->addAction(qtAction);
-            }
+            menu->addAction(qtAction);
             break;
         }
         case WebCore::SeparatorType:
@@ -125,12 +112,11 @@
             break;
         case WebCore::SubmenuType:
             if (OwnPtr<QMenu> subMenu = createContextMenu(item.submenu())) {
-                subMenu->setParent(menu.get());
-                QMenu* const subMenuPtr = subMenu.leakPtr();
+                static_cast<QObject*>(subMenu.get())->setParent(menu.get());
                 subMenu->setTitle(item.title());
+                QMenu* const subMenuPtr = subMenu.leakPtr();
                 menu->addMenu(subMenuPtr);
             }
-
             break;
         }
     }
@@ -151,4 +137,6 @@
     return menu.release();
 }
 
+#include "moc_WebContextMenuProxyQt.cpp"
+
 } // namespace WebKit

Modified: trunk/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.h (91757 => 91758)


--- trunk/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.h	2011-07-26 16:22:01 UTC (rev 91757)
+++ trunk/Source/WebKit2/UIProcess/qt/WebContextMenuProxyQt.h	2011-07-26 16:56:28 UTC (rev 91758)
@@ -29,26 +29,37 @@
 
 #include "WebContextMenuProxy.h"
 #include <PassOwnPtr.h>
+#include <QtCore/QObject>
 
 class QMenu;
 class QtWebPageProxy;
+
+namespace WebKit {
+class ViewInterface;
 class WebContextMenuItemData;
+class WebPageProxy;
+}
 
 namespace WebKit {
 
-class WebContextMenuProxyQt : public WebContextMenuProxy {
+class WebContextMenuProxyQt : public QObject, public WebContextMenuProxy {
+    Q_OBJECT
 public:
-    static PassRefPtr<WebContextMenuProxyQt> create(QtWebPageProxy*);
+    static PassRefPtr<WebContextMenuProxyQt> create(WebPageProxy*, ViewInterface*);
 
+private Q_SLOTS:
+    void actionTriggered(bool);
+
 private:
-    WebContextMenuProxyQt(QtWebPageProxy*);
+    WebContextMenuProxyQt(WebPageProxy*, ViewInterface*);
 
     virtual void showContextMenu(const WebCore::IntPoint&, const Vector<WebContextMenuItemData>&);
     virtual void hideContextMenu();
 
     PassOwnPtr<QMenu> createContextMenu(const Vector<WebContextMenuItemData>& items) const;
 
-    QtWebPageProxy* const m_page;
+    WebPageProxy* const m_webPageProxy;
+    ViewInterface* const m_viewInterface;
 };
 
 } // namespace WebKit
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to