summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-06-17 10:54:16 +0200
committerAllan Sandfeld Jensen <allan.jensen@theqtcompany.com>2016-06-17 10:54:16 +0200
commit807adfeec9f9dadb651e401b7dd69eeccda4dd7a (patch)
tree98790b3b20d4a49a6ce359ff4baa2f1934cba16e
parent1e52779f3c287d82820c91ddb0e9f666eef9054a (diff)
parent528088cb61eaacb63e87ea8e06f59d1536e43799 (diff)
Merge remote-tracking branch 'origin/5.6' into 5.7
-rw-r--r--LICENSE.GPLv32
-rw-r--r--LICENSE.LGPL32
m---------src/3rdparty0
-rw-r--r--src/core/render_widget_host_view_qt.cpp76
-rw-r--r--src/core/render_widget_host_view_qt.h1
-rw-r--r--src/core/web_contents_adapter_client.h1
-rw-r--r--src/core/web_event_factory.cpp6
-rw-r--r--src/webengine/api/qquickwebengineview.cpp6
-rw-r--r--src/webengine/api/qquickwebengineview_p.h4
-rw-r--r--src/webengine/api/qquickwebengineview_p_p.h3
-rw-r--r--src/webengine/doc/src/qtwebengine-overview.qdoc4
-rw-r--r--src/webengine/ui_delegates_manager.cpp27
-rw-r--r--src/webenginewidgets/api/qwebenginepage.cpp6
-rw-r--r--src/webenginewidgets/api/qwebenginepage_p.h1
-rw-r--r--src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc10
-rw-r--r--src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h2
-rw-r--r--tests/auto/quick/qmltests/data/tst_filePicker.qml18
-rw-r--r--tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp36
18 files changed, 159 insertions, 46 deletions
diff --git a/LICENSE.GPLv3 b/LICENSE.GPLv3
index 4e49b122a..71c4ad49c 100644
--- a/LICENSE.GPLv3
+++ b/LICENSE.GPLv3
@@ -3,7 +3,7 @@
The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.
Contact: http://www.qt.io/licensing/
- You may use, distribute and copy the Qt GUI Toolkit under the terms of
+ You may use, distribute and copy the Qt Toolkit under the terms of
GNU Lesser General Public License version 3. That license references
the General Public License version 3, that is displayed below. Other
portions of the Qt Toolkit may be licensed directly under this license.
diff --git a/LICENSE.LGPL3 b/LICENSE.LGPL3
index 26d0bf16f..1f78e0508 100644
--- a/LICENSE.LGPL3
+++ b/LICENSE.LGPL3
@@ -3,7 +3,7 @@
The Qt Toolkit is Copyright (C) 2015 The Qt Company Ltd.
Contact: http://www.qt.io/licensing/
- You may use, distribute and copy the Qt GUI Toolkit under the terms of
+ You may use, distribute and copy the Qt Toolkit under the terms of
GNU Lesser General Public License version 3, which is displayed below.
This license makes reference to the version 3 of the GNU General
Public License, which you can find in the LICENSE.GPLv3 file.
diff --git a/src/3rdparty b/src/3rdparty
-Subproject ba36da6c1f59da7687f6924cc558105dcd1c44d
+Subproject 77c17ae35f825cb70e46b880fb0b5ed7be83709
diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp
index a78e3a2c3..99e4da27e 100644
--- a/src/core/render_widget_host_view_qt.cpp
+++ b/src/core/render_widget_host_view_qt.cpp
@@ -71,6 +71,10 @@
#include "ui/events/gesture_detection/motion_event.h"
#include "ui/gfx/geometry/size_conversions.h"
+#if defined(USE_AURA)
+#include "ui/base/cursor/cursors_aura.h"
+#endif
+
#include <QEvent>
#include <QFocusEvent>
#include <QGuiApplication>
@@ -249,6 +253,7 @@ RenderWidgetHostViewQt::RenderWidgetHostViewQt(content::RenderWidgetHost* widget
RenderWidgetHostViewQt::~RenderWidgetHostViewQt()
{
+ QObject::disconnect(m_adapterClientDestroyedConnection);
#ifndef QT_NO_ACCESSIBILITY
QAccessible::removeActivationObserver(this);
#endif // QT_NO_ACCESSIBILITY
@@ -264,6 +269,10 @@ void RenderWidgetHostViewQt::setAdapterClient(WebContentsAdapterClient *adapterC
Q_ASSERT(!m_adapterClient);
m_adapterClient = adapterClient;
+ QObject::disconnect(m_adapterClientDestroyedConnection);
+ m_adapterClientDestroyedConnection = QObject::connect(adapterClient->holdingQObject(),
+ &QObject::destroyed, [this] {
+ m_adapterClient = nullptr; });
if (m_initPending)
InitAsChild(0);
}
@@ -434,7 +443,10 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor)
{
content::WebCursor::CursorInfo cursorInfo;
webCursor.GetCursorInfo(&cursorInfo);
- Qt::CursorShape shape;
+ Qt::CursorShape shape = Qt::ArrowCursor;
+#if defined(USE_AURA)
+ int auraType = -1;
+#endif
switch (cursorInfo.type) {
case blink::WebCursorInfo::TypePointer:
shape = Qt::ArrowCursor;
@@ -492,17 +504,42 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor)
case blink::WebCursorInfo::TypeMove:
shape = Qt::SizeAllCursor;
break;
+ case blink::WebCursorInfo::TypeProgress:
+ shape = Qt::BusyCursor;
+ break;
+#if defined(USE_AURA)
case blink::WebCursorInfo::TypeVerticalText:
+ auraType = ui::kCursorVerticalText;
+ break;
case blink::WebCursorInfo::TypeCell:
+ auraType = ui::kCursorCell;
+ break;
case blink::WebCursorInfo::TypeContextMenu:
+ auraType = ui::kCursorContextMenu;
+ break;
case blink::WebCursorInfo::TypeAlias:
- case blink::WebCursorInfo::TypeProgress:
+ auraType = ui::kCursorAlias;
+ break;
case blink::WebCursorInfo::TypeCopy:
+ auraType = ui::kCursorCopy;
+ break;
case blink::WebCursorInfo::TypeZoomIn:
+ auraType = ui::kCursorZoomIn;
+ break;
case blink::WebCursorInfo::TypeZoomOut:
- // FIXME: Load from the resource bundle.
- shape = Qt::ArrowCursor;
+ auraType = ui::kCursorZoomOut;
+ break;
+#else
+ case blink::WebCursorInfo::TypeVerticalText:
+ case blink::WebCursorInfo::TypeCell:
+ case blink::WebCursorInfo::TypeContextMenu:
+ case blink::WebCursorInfo::TypeAlias:
+ case blink::WebCursorInfo::TypeCopy:
+ case blink::WebCursorInfo::TypeZoomIn:
+ case blink::WebCursorInfo::TypeZoomOut:
+ // FIXME: Support on OS X
break;
+#endif
case blink::WebCursorInfo::TypeNoDrop:
case blink::WebCursorInfo::TypeNotAllowed:
shape = Qt::ForbiddenCursor;
@@ -519,16 +556,21 @@ void RenderWidgetHostViewQt::UpdateCursor(const content::WebCursor &webCursor)
case blink::WebCursorInfo::TypeCustom:
if (cursorInfo.custom_image.colorType() == SkColorType::kN32_SkColorType) {
QImage cursor = toQImage(cursorInfo.custom_image, QImage::Format_ARGB32);
- m_delegate->updateCursor(QCursor(QPixmap::fromImage(cursor)));
+ m_delegate->updateCursor(QCursor(QPixmap::fromImage(cursor), cursorInfo.hotspot.x(), cursorInfo.hotspot.y()));
return;
}
- // Use arrow cursor as fallback in case the Chromium implementation changes.
- shape = Qt::ArrowCursor;
break;
- default:
- Q_UNREACHABLE();
- shape = Qt::ArrowCursor;
}
+#if defined(USE_AURA)
+ if (auraType > 0) {
+ SkBitmap bitmap;
+ gfx::Point hotspot;
+ if (ui::GetCursorBitmap(auraType, &bitmap, &hotspot)) {
+ m_delegate->updateCursor(QCursor(QPixmap::fromImage(toQImage(bitmap)), hotspot.x(), hotspot.y()));
+ return;
+ }
+ }
+#endif
m_delegate->updateCursor(QCursor(shape));
}
@@ -874,7 +916,21 @@ bool RenderWidgetHostViewQt::IsPopup() const
void RenderWidgetHostViewQt::handleMouseEvent(QMouseEvent* event)
{
+ // Don't forward mouse events synthesized by the system, which are caused by genuine touch
+ // events. Chromium would then process for e.g. a mouse click handler twice, once due to the
+ // system synthesized mouse event, and another time due to a touch-to-gesture-to-mouse
+ // transformation done by Chromium.
+ if (event->source() == Qt::MouseEventSynthesizedBySystem)
+ return;
+
blink::WebMouseEvent webEvent = WebEventFactory::toWebMouseEvent(event, dpiScale());
+ if ((webEvent.type == blink::WebInputEvent::MouseDown || webEvent.type == blink::WebInputEvent::MouseUp)
+ && webEvent.button == blink::WebMouseEvent::ButtonNone) {
+ // Blink can only handle the 3 main mouse-buttons and may assert when processing mouse-down for no button.
+ return;
+ }
+
+
if (event->type() == QMouseEvent::MouseButtonPress) {
if (event->button() != m_clickHelper.lastPressButton
|| (event->timestamp() - m_clickHelper.lastPressTimestamp > static_cast<ulong>(qGuiApp->styleHints()->mouseDoubleClickInterval()))
diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h
index 8c9e6b9f3..67e7461b3 100644
--- a/src/core/render_widget_host_view_qt.h
+++ b/src/core/render_widget_host_view_qt.h
@@ -235,6 +235,7 @@ private:
bool m_didFirstVisuallyNonEmptyLayout;
uint32_t m_pendingOutputSurfaceId;
+ QMetaObject::Connection m_adapterClientDestroyedConnection;
WebContentsAdapterClient *m_adapterClient;
MultipleMouseClickHelper m_clickHelper;
diff --git a/src/core/web_contents_adapter_client.h b/src/core/web_contents_adapter_client.h
index c50f38b38..7be9ca7b9 100644
--- a/src/core/web_contents_adapter_client.h
+++ b/src/core/web_contents_adapter_client.h
@@ -258,6 +258,7 @@ public:
virtual void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions,
const QPixmap &pixmap, const QPoint &offset) = 0;
virtual bool isEnabled() const = 0;
+ virtual const QObject *holdingQObject() const = 0;
virtual QSharedPointer<BrowserContextAdapter> browserContextAdapter() = 0;
virtual WebContentsAdapter* webContentsAdapter() = 0;
diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp
index fddafd1d3..505a684eb 100644
--- a/src/core/web_event_factory.cpp
+++ b/src/core/web_event_factory.cpp
@@ -486,11 +486,11 @@ static inline double currentTimeForEvent(const QInputEvent* event)
static WebMouseEvent::Button mouseButtonForEvent(QMouseEvent *event)
{
- if (event->button() == Qt::LeftButton || (event->buttons() & Qt::LeftButton))
+ if (event->button() == Qt::LeftButton)
return WebMouseEvent::ButtonLeft;
- else if (event->button() == Qt::RightButton || (event->buttons() & Qt::RightButton))
+ else if (event->button() == Qt::RightButton)
return WebMouseEvent::ButtonRight;
- else if (event->button() == Qt::MidButton || (event->buttons() & Qt::MidButton))
+ else if (event->button() == Qt::MidButton)
return WebMouseEvent::ButtonMiddle;
return WebMouseEvent::ButtonNone;
}
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 59b5d17db..ac25cd4d2 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -670,6 +670,12 @@ WebEngineSettings *QQuickWebEngineViewPrivate::webEngineSettings() const
return m_settings->d_ptr.data();
}
+const QObject *QQuickWebEngineViewPrivate::holdingQObject() const
+{
+ Q_Q(const QQuickWebEngineView);
+ return q;
+}
+
void QQuickWebEngineViewPrivate::setDevicePixelRatio(qreal devicePixelRatio)
{
Q_Q(QQuickWebEngineView);
diff --git a/src/webengine/api/qquickwebengineview_p.h b/src/webengine/api/qquickwebengineview_p.h
index b72f79f30..b9555d2d9 100644
--- a/src/webengine/api/qquickwebengineview_p.h
+++ b/src/webengine/api/qquickwebengineview_p.h
@@ -503,8 +503,8 @@ Q_SIGNALS:
Q_REVISION(3) void webChannelWorldChanged(uint);
protected:
- void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry);
- void itemChange(ItemChange, const ItemChangeData &);
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) Q_DECL_OVERRIDE;
+ void itemChange(ItemChange, const ItemChangeData &) Q_DECL_OVERRIDE;
void dragEnterEvent(QDragEnterEvent *e) Q_DECL_OVERRIDE;
void dragLeaveEvent(QDragLeaveEvent *e) Q_DECL_OVERRIDE;
void dragMoveEvent(QDragMoveEvent *e) Q_DECL_OVERRIDE;
diff --git a/src/webengine/api/qquickwebengineview_p_p.h b/src/webengine/api/qquickwebengineview_p_p.h
index 909763614..1b5198110 100644
--- a/src/webengine/api/qquickwebengineview_p_p.h
+++ b/src/webengine/api/qquickwebengineview_p_p.h
@@ -175,7 +175,7 @@ public:
virtual QObject *accessibilityParentObject() Q_DECL_OVERRIDE;
#endif // QT_NO_ACCESSIBILITY
virtual QtWebEngineCore::WebEngineSettings *webEngineSettings() const Q_DECL_OVERRIDE;
- virtual void allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController);
+ virtual void allowCertificateError(const QSharedPointer<CertificateErrorController> &errorController) Q_DECL_OVERRIDE;
virtual void runGeolocationPermissionRequest(QUrl const&) Q_DECL_OVERRIDE;
virtual void showValidationMessage(const QRect &anchor, const QString &mainText, const QString &subText) Q_DECL_OVERRIDE;
virtual void hideValidationMessage() Q_DECL_OVERRIDE;
@@ -188,6 +188,7 @@ public:
void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions,
const QPixmap &pixmap, const QPoint &offset) Q_DECL_OVERRIDE;
virtual bool isEnabled() const Q_DECL_OVERRIDE;
+ const QObject *holdingQObject() const Q_DECL_OVERRIDE;
virtual QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContextAdapter() Q_DECL_OVERRIDE;
QtWebEngineCore::WebContentsAdapter *webContentsAdapter() Q_DECL_OVERRIDE;
diff --git a/src/webengine/doc/src/qtwebengine-overview.qdoc b/src/webengine/doc/src/qtwebengine-overview.qdoc
index 7ae3afaf4..064dfb44b 100644
--- a/src/webengine/doc/src/qtwebengine-overview.qdoc
+++ b/src/webengine/doc/src/qtwebengine-overview.qdoc
@@ -104,8 +104,8 @@
\l{https://chromium.googlesource.com/chromium/src/+/master/docs/chromium_browser_vs_google_chrome.md}{overview}
that is part of the documentation in the \l {Chromium Project} upstream source tree.
- This version of Qt WebEngine is based on Chromium snapshot version 45.0.2554.101, with
- additional security fixes from the 46, 47 and 48 branches of the \l {Chromium Project}.
+ This version of Qt WebEngine is based on Chromium version 45.0.2554.101, with
+ additional security fixes from newer versions.
\section2 Qt WebEngine Process
diff --git a/src/webengine/ui_delegates_manager.cpp b/src/webengine/ui_delegates_manager.cpp
index a82ed0f2e..6ff12b53f 100644
--- a/src/webengine/ui_delegates_manager.cpp
+++ b/src/webengine/ui_delegates_manager.cpp
@@ -209,7 +209,7 @@ void UIDelegatesManager::addMenuSeparator(QObject *menu)
QObject *UIDelegatesManager::addMenu(QObject *parentMenu, const QString &title, const QPoint& pos)
{
-
+ Q_ASSERT(parentMenu);
if (!ensureComponentLoaded(Menu))
return 0;
QQmlContext *context = qmlContext(m_view);
@@ -222,18 +222,18 @@ QObject *UIDelegatesManager::addMenu(QObject *parentMenu, const QString &title,
QQmlProperty(menu, QStringLiteral("title")).write(title);
if (!pos.isNull())
QQmlProperty(menu, QStringLiteral("pos")).write(pos);
- if (!parentMenu) {
- QQmlProperty doneSignal(menu, QStringLiteral("onDone"));
- static int deleteLaterIndex = menu->metaObject()->indexOfSlot("deleteLater()");
- if (doneSignal.isSignalProperty())
- QObject::connect(menu, doneSignal.method(), menu, menu->metaObject()->method(deleteLaterIndex));
- } else {
- menu->setParent(parentMenu);
- QQmlListReference entries(parentMenu, defaultPropertyName(parentMenu), qmlEngine(m_view));
- if (entries.isValid())
- entries.append(menu);
- }
+ menu->setParent(parentMenu);
+
+ QQmlProperty doneSignal(menu, QStringLiteral("onDone"));
+ static int deleteLaterIndex = menu->metaObject()->indexOfSlot("deleteLater()");
+ CHECK_QML_SIGNAL_PROPERTY(doneSignal, menuComponent->url());
+ QObject::connect(menu, doneSignal.method(), menu, menu->metaObject()->method(deleteLaterIndex));
+
+ QQmlListReference entries(parentMenu, defaultPropertyName(parentMenu), qmlEngine(m_view));
+ if (entries.isValid())
+ entries.append(menu);
+
menuComponent->completeCreate();
return menu;
}
@@ -401,9 +401,12 @@ void UIDelegatesManager::showDialog(QSharedPointer<AuthenticationDialogControlle
CHECK_QML_SIGNAL_PROPERTY(rejectSignal, authenticationDialogComponent->url());
static int acceptIndex = dialogController->metaObject()->indexOfSlot("accept(QString,QString)");
+ static int deleteLaterIndex = authenticationDialog->metaObject()->indexOfSlot("deleteLater()");
QObject::connect(authenticationDialog, acceptSignal.method(), dialogController.data(), dialogController->metaObject()->method(acceptIndex));
+ QObject::connect(authenticationDialog, acceptSignal.method(), authenticationDialog, authenticationDialog->metaObject()->method(deleteLaterIndex));
static int rejectIndex = dialogController->metaObject()->indexOfSlot("reject()");
QObject::connect(authenticationDialog, rejectSignal.method(), dialogController.data(), dialogController->metaObject()->method(rejectIndex));
+ QObject::connect(authenticationDialog, rejectSignal.method(), authenticationDialog, authenticationDialog->metaObject()->method(deleteLaterIndex));
authenticationDialogComponent->completeCreate();
QMetaObject::invokeMethod(authenticationDialog, "open");
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 3f11e5aef..bb0db402b 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -494,6 +494,12 @@ WebContentsAdapter *QWebEnginePagePrivate::webContentsAdapter()
return adapter.data();
}
+const QObject *QWebEnginePagePrivate::holdingQObject() const
+{
+ Q_Q(const QWebEnginePage);
+ return q;
+}
+
QWebEnginePage::QWebEnginePage(QObject* parent)
: QObject(parent)
, d_ptr(new QWebEnginePagePrivate())
diff --git a/src/webenginewidgets/api/qwebenginepage_p.h b/src/webenginewidgets/api/qwebenginepage_p.h
index 26ef80e9a..c0b1b9a4e 100644
--- a/src/webenginewidgets/api/qwebenginepage_p.h
+++ b/src/webenginewidgets/api/qwebenginepage_p.h
@@ -136,6 +136,7 @@ public:
void startDragging(const content::DropData &dropData, Qt::DropActions allowedActions,
const QPixmap &pixmap, const QPoint &offset) Q_DECL_OVERRIDE;
virtual bool isEnabled() const Q_DECL_OVERRIDE;
+ const QObject *holdingQObject() const Q_DECL_OVERRIDE;
virtual QSharedPointer<QtWebEngineCore::BrowserContextAdapter> browserContextAdapter() Q_DECL_OVERRIDE;
QtWebEngineCore::WebContentsAdapter *webContentsAdapter() Q_DECL_OVERRIDE;
diff --git a/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc b/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc
index 89d7cfb0c..f652b1d5f 100644
--- a/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc
+++ b/src/webenginewidgets/doc/src/qtwebkitportingguide.qdoc
@@ -207,7 +207,15 @@
connect(&page, SIGNAL(authenticationRequired(QNetworkReply*,QAuthenticator*)), this, SLOT(authenticate(QNetworkReply*,QAuthenticator*)));
\endcode
- This also affects the way in which certificates are managed. For more information, see
+ \note In Qt WebEngine, the QAuthenticator must be explicitly set to null to
+ cancel authentication:
+
+ \code
+ *authenticator = QAuthenticator();
+ \endcode
+
+ Omitting the \c QNetworkAccessManager also affects the way in which
+ certificates are managed. For more information, see
\l {Managing Certificates}.
\section1 Notes About Individual Methods
diff --git a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
index e98e06417..9fd0cdc48 100644
--- a/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
+++ b/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.h
@@ -91,7 +91,7 @@ protected:
void initializeGL() Q_DECL_OVERRIDE;
void paintGL() Q_DECL_OVERRIDE;
- QVariant inputMethodQuery(Qt::InputMethodQuery query) const;
+ QVariant inputMethodQuery(Qt::InputMethodQuery query) const Q_DECL_OVERRIDE;
private slots:
void onWindowPosChanged();
diff --git a/tests/auto/quick/qmltests/data/tst_filePicker.qml b/tests/auto/quick/qmltests/data/tst_filePicker.qml
index 117141935..4e74af733 100644
--- a/tests/auto/quick/qmltests/data/tst_filePicker.qml
+++ b/tests/auto/quick/qmltests/data/tst_filePicker.qml
@@ -68,10 +68,8 @@ TestWebEngineView {
FilePickerParams.selectedFilesUrl.push(Qt.resolvedUrl("test1.html"))
keyPress(Qt.Key_Enter) // Focus is on the button. Open FileDialog.
- wait(100) // The ui delegate is invoked asynchronously
- verify(FilePickerParams.filePickerOpened)
- titleSpy.wait()
- compare(webEngineView.title, "test1.html")
+ tryCompare(FilePickerParams, "filePickerOpened", true)
+ tryCompare(webEngineView, "title", "test1.html")
}
function test_acceptMultipleFilesSelection() {
@@ -83,10 +81,8 @@ TestWebEngineView {
FilePickerParams.selectedFilesUrl.push(Qt.resolvedUrl("test2.html"))
keyPress(Qt.Key_Enter) // Focus is on the button. Open FileDialog.
- wait(100)
- verify(FilePickerParams.filePickerOpened)
- titleSpy.wait()
- compare(webEngineView.title, "test1.html,test2.html")
+ tryCompare(FilePickerParams, "filePickerOpened", true)
+ tryCompare(webEngineView, "title", "test1.html,test2.html")
}
function test_acceptDirectory() {
@@ -97,10 +93,8 @@ TestWebEngineView {
FilePickerParams.selectedFilesUrl.push(Qt.resolvedUrl("../data"))
keyPress(Qt.Key_Enter) // Focus is on the button. Open FileDialog.
- wait(100) // The ui delegate is invoked asynchronously
- verify(FilePickerParams.filePickerOpened)
- titleSpy.wait()
- compare(webEngineView.title, "data")
+ tryCompare(FilePickerParams, "filePickerOpened", true)
+ tryCompare(webEngineView, "title", "data")
}
function test_reject() {
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index dbaa63f86..2f7bfb39f 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -236,6 +236,7 @@ private Q_SLOTS:
void toPlainTextLoadFinishedRace_data();
void toPlainTextLoadFinishedRace();
void setZoomFactor();
+ void mouseButtonTranslation();
void printToPdf();
@@ -4891,5 +4892,40 @@ void tst_QWebEnginePage::printToPdf()
QCOMPARE(failedInvalidLayoutSpy.waitForResult().length(), 0);
}
+void tst_QWebEnginePage::mouseButtonTranslation()
+{
+ QWebEngineView *view = new QWebEngineView;
+
+ QSignalSpy spy(view, SIGNAL(loadFinished(bool)));
+ view->setHtml(QStringLiteral(
+ "<html><head><script>\
+ var lastEvent = { 'button' : -1 }; \
+ function saveLastEvent(event) { console.log(event); lastEvent = event; }; \
+ </script></head>\
+ <body>\
+ <div style=\"height:600px;\" onmousedown=\"saveLastEvent(event)\">\
+ </div>\
+ </body></html>"));
+ view->show();
+ QTest::qWaitForWindowExposed(view);
+ QTRY_VERIFY(spy.count() == 1);
+
+ QVERIFY(view->focusProxy() != nullptr);
+
+ QMouseEvent evpres(QEvent::MouseButtonPress, view->rect().center(), Qt::LeftButton, Qt::LeftButton, Qt::NoModifier);
+ QGuiApplication::sendEvent(view->focusProxy(), &evpres);
+
+ QTRY_COMPARE(evaluateJavaScriptSync(view->page(), "lastEvent.button").toInt(), 0);
+ QCOMPARE(evaluateJavaScriptSync(view->page(), "lastEvent.buttons").toInt(), 1);
+
+ QMouseEvent evpres2(QEvent::MouseButtonPress, view->rect().center(), Qt::RightButton, Qt::LeftButton | Qt::RightButton, Qt::NoModifier);
+ QGuiApplication::sendEvent(view->focusProxy(), &evpres2);
+
+ QTRY_COMPARE(evaluateJavaScriptSync(view->page(), "lastEvent.button").toInt(), 2);
+ QCOMPARE(evaluateJavaScriptSync(view->page(), "lastEvent.buttons").toInt(), 3);
+
+ delete view;
+}
+
QTEST_MAIN(tst_QWebEnginePage)
#include "tst_qwebenginepage.moc"