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;
};