Title: [100762] trunk/Source/WebKit2
Revision
100762
Author
[email protected]
Date
2011-11-18 05:56:59 -0800 (Fri, 18 Nov 2011)

Log Message

[Qt][WK2] Layer violation: WebPopupMenuProxyQtDesktop.cpp uses files from WebKit/qt https://bugs.webkit.org/show_bug.cgi?id=72696

Reviewed by Kenneth Rohde Christiansen.

Implement the WK2 desktop popup by simply subclassing QComboBox and doing the
same thing as QtWebComboBox from WK1 (a few lines of code).

* UIProcess/qt/WebPopupMenuProxyQtDesktop.cpp:
(WebKit::WebPopupMenuProxyQtDesktop::WebPopupMenuProxyQtDesktop):
(WebKit::WebPopupMenuProxyQtDesktop::~WebPopupMenuProxyQtDesktop):
(WebKit::WebPopupMenuProxyQtDesktop::showPopupMenu):
(WebKit::WebPopupMenuProxyQtDesktop::hidePopupMenu):
(WebKit::WebPopupMenuProxyQtDesktop::eventFilter):
(WebKit::WebPopupMenuProxyQtDesktop::setSelectedIndex):
(WebKit::WebPopupMenuProxyQtDesktop::populate):
* UIProcess/qt/WebPopupMenuProxyQtDesktop.h:

Modified Paths

Diff

Modified: trunk/Source/WebKit2/ChangeLog (100761 => 100762)


--- trunk/Source/WebKit2/ChangeLog	2011-11-18 13:52:04 UTC (rev 100761)
+++ trunk/Source/WebKit2/ChangeLog	2011-11-18 13:56:59 UTC (rev 100762)
@@ -1,3 +1,23 @@
+2011-11-18  Simon Hausmann  <[email protected]>
+
+        [Qt][WK2] Layer violation: WebPopupMenuProxyQtDesktop.cpp uses files from WebKit/qt
+        https://bugs.webkit.org/show_bug.cgi?id=72696
+
+        Reviewed by Kenneth Rohde Christiansen.
+
+        Implement the WK2 desktop popup by simply subclassing QComboBox and doing the
+        same thing as QtWebComboBox from WK1 (a few lines of code).
+
+        * UIProcess/qt/WebPopupMenuProxyQtDesktop.cpp:
+        (WebKit::WebPopupMenuProxyQtDesktop::WebPopupMenuProxyQtDesktop):
+        (WebKit::WebPopupMenuProxyQtDesktop::~WebPopupMenuProxyQtDesktop):
+        (WebKit::WebPopupMenuProxyQtDesktop::showPopupMenu):
+        (WebKit::WebPopupMenuProxyQtDesktop::hidePopupMenu):
+        (WebKit::WebPopupMenuProxyQtDesktop::eventFilter):
+        (WebKit::WebPopupMenuProxyQtDesktop::setSelectedIndex):
+        (WebKit::WebPopupMenuProxyQtDesktop::populate):
+        * UIProcess/qt/WebPopupMenuProxyQtDesktop.h:
+
 2011-11-18  Zeno Albisser  <[email protected]>
 
         [Qt][WK2] setViewportInteractionEngine must also set the InteractionEngine for the tap recognizer.

Modified: trunk/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQtDesktop.cpp (100761 => 100762)


--- trunk/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQtDesktop.cpp	2011-11-18 13:52:04 UTC (rev 100761)
+++ trunk/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQtDesktop.cpp	2011-11-18 13:56:59 UTC (rev 100762)
@@ -27,81 +27,84 @@
 #include "WebPopupMenuProxyQtDesktop.h"
 
 #include "PlatformPopupMenuData.h"
-#include "WebPopupItem.h"
+#include <QAbstractItemView>
+#include <QCoreApplication>
 #include <QtDeclarative/QQuickCanvas>
 #include <QtDeclarative/QQuickItem>
+#include <QMouseEvent>
 #include <QStandardItemModel>
+#include "WebPopupItem.h"
 
 using namespace WebCore;
 
 namespace WebKit {
 
 WebPopupMenuProxyQtDesktop::WebPopupMenuProxyQtDesktop(WebPopupMenuProxy::Client* client, QQuickItem* webViewItem)
-    : QObject()
-    , WebPopupMenuProxy(client)
-    , m_comboBox(new QtWebComboBox)
+    : WebPopupMenuProxy(client)
     , m_webViewItem(webViewItem)
     , m_selectedIndex(-1)
 {
-    QtWebComboBox* comboBox = m_comboBox.data();
+    window()->winId(); // Ensure that the combobox has a window
+    Q_ASSERT(window()->windowHandle());
+    window()->windowHandle()->setTransientParent(m_webViewItem->canvas());
 
-    comboBox->window()->winId(); // Ensure that the combobox has a window
-    Q_ASSERT(comboBox->window()->windowHandle());
-    comboBox->window()->windowHandle()->setTransientParent(m_webViewItem->canvas());
-
-    connect(comboBox, SIGNAL(activated(int)), SLOT(setSelectedIndex(int)));
-    connect(comboBox, SIGNAL(didHide()), SLOT(onPopupMenuHidden()), Qt::QueuedConnection);
+    connect(this, SIGNAL(activated(int)), SLOT(setSelectedIndex(int)));
+    // Install an event filter on the view inside the combo box popup to make sure we know
+    // when the popup got closed. E.g. QComboBox::hidePopup() won't be called when the popup
+    // is closed by a mouse wheel event outside its window.
+    view()->installEventFilter(this);
 }
 
 WebPopupMenuProxyQtDesktop::~WebPopupMenuProxyQtDesktop()
 {
-    delete m_comboBox.data();
 }
 
 void WebPopupMenuProxyQtDesktop::showPopupMenu(const IntRect& rect, WebCore::TextDirection, double, const Vector<WebPopupItem>& items, const PlatformPopupMenuData&, int32_t selectedIndex)
 {
-    QtWebComboBox* comboBox = m_comboBox.data();
     m_selectedIndex = selectedIndex;
     populate(items);
-    comboBox->setCurrentIndex(selectedIndex);
-    comboBox->setGeometry(m_webViewItem->mapRectToScene(QRect(rect)).toRect());
-    comboBox->showPopupAtCursorPosition();
+    setCurrentIndex(selectedIndex);
+    setGeometry(m_webViewItem->mapRectToScene(QRect(rect)).toRect());
+
+    QMouseEvent event(QEvent::MouseButtonPress, QCursor::pos(), Qt::LeftButton,
+                      Qt::LeftButton, Qt::NoModifier);
+    QCoreApplication::sendEvent(this, &event);
 }
 
 void WebPopupMenuProxyQtDesktop::hidePopupMenu()
 {
-    if (m_comboBox)
-        m_comboBox.data()->hidePopup();
+    hidePopup();
 }
 
-void WebPopupMenuProxyQtDesktop::setSelectedIndex(int index)
+bool WebPopupMenuProxyQtDesktop::eventFilter(QObject *watched, QEvent *event)
 {
-    m_selectedIndex = index;
+    Q_ASSERT(watched == view());
+    if (event->type() == QEvent::Hide) {
+        if (m_client)
+            m_client->valueChangedForPopupMenu(this, m_selectedIndex);
+    }
+    return false;
 }
 
-void WebPopupMenuProxyQtDesktop::onPopupMenuHidden()
+void WebPopupMenuProxyQtDesktop::setSelectedIndex(int index)
 {
-    if (m_client)
-        m_client->valueChangedForPopupMenu(this, m_selectedIndex);
+    m_selectedIndex = index;
 }
 
 void WebPopupMenuProxyQtDesktop::populate(const Vector<WebPopupItem>& items)
 {
-    QtWebComboBox* comboBox = m_comboBox.data();
-    Q_ASSERT(comboBox);
+    clear();
 
-    comboBox->clear();
-
-    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(comboBox->model());
+    QStandardItemModel* model = qobject_cast<QStandardItemModel*>(this->model());
     Q_ASSERT(model);
 
     for (size_t i = 0; i < items.size(); ++i) {
         const WebPopupItem& item = items.at(i);
         if (item.m_type == WebPopupItem::Separator) {
-            comboBox->insertSeparator(i);
+            insertSeparator(i);
             continue;
         }
-        comboBox->insertItem(i, item.m_text);
+        insertItem(i, item.m_text);
         model->item(i)->setToolTip(item.m_toolTip);
         model->item(i)->setEnabled(item.m_isEnabled);
     }

Modified: trunk/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQtDesktop.h (100761 => 100762)


--- trunk/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQtDesktop.h	2011-11-18 13:52:04 UTC (rev 100761)
+++ trunk/Source/WebKit2/UIProcess/qt/WebPopupMenuProxyQtDesktop.h	2011-11-18 13:56:59 UTC (rev 100762)
@@ -26,10 +26,10 @@
 #ifndef WebPopupMenuProxyQtDesktop_h
 #define WebPopupMenuProxyQtDesktop_h
 
-#include "QtWebComboBox.h"
 #include "WebPopupMenuProxy.h"
-#include <QtCore/QObject>
-#include <QtCore/QWeakPointer>
+#include <QComboBox>
+#include <QObject>
+#include <QWeakPointer>
 
 class QQuickItem;
 
@@ -39,7 +39,7 @@
 
 namespace WebKit {
 
-class WebPopupMenuProxyQtDesktop : public QObject, public WebPopupMenuProxy {
+class WebPopupMenuProxyQtDesktop : public QComboBox, public WebPopupMenuProxy {
     Q_OBJECT
 
 public:
@@ -53,17 +53,15 @@
     virtual void showPopupMenu(const WebCore::IntRect&, WebCore::TextDirection, double pageScaleFactor, const Vector<WebPopupItem>&, const PlatformPopupMenuData&, int32_t selectedIndex);
     virtual void hidePopupMenu();
 
+    virtual bool eventFilter(QObject* watched, QEvent*);
+
 private Q_SLOTS:
     void setSelectedIndex(int);
-    void onPopupMenuHidden();
 
 private:
     WebPopupMenuProxyQtDesktop(WebPopupMenuProxy::Client*, QQuickItem* webViewItem);
     void populate(const Vector<WebPopupItem>&);
 
-    // Qt guarded pointer because QWidgets have their own memory management and
-    // when closing the UI the combobox will be deleted before we are.
-    QWeakPointer<WebCore::QtWebComboBox> m_comboBox;
     QQuickItem* m_webViewItem;
     int32_t m_selectedIndex;
 };
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to