diff --git a/src/core/render_widget_host_view_qt.cpp b/src/core/render_widget_host_view_qt.cpp index f1c69fca323349385e5fc1479fa1711924ba72ee..f96329139d52876943ef45e7e5851b07668cfef4 100644 --- a/src/core/render_widget_host_view_qt.cpp +++ b/src/core/render_widget_host_view_qt.cpp @@ -422,7 +422,7 @@ void RenderWidgetHostViewQt::SetBackgroundColor(SkColor color) bool RenderWidgetHostViewQt::LockMouse() { mouse_locked_ = true; - m_lockedMousePosition = QCursor::pos(); + m_previousMousePosition = QCursor::pos(); m_delegate->lockMouse(); qApp->setOverrideCursor(Qt::BlankCursor); return true; @@ -938,11 +938,13 @@ void RenderWidgetHostViewQt::handleMouseEvent(QMouseEvent* event) m_clickHelper.lastPressPosition = QPointF(event->pos()).toPoint(); } - if (IsMouseLocked()) { - webEvent.movementX = -(m_lockedMousePosition.x() - event->globalX()); - webEvent.movementY = -(m_lockedMousePosition.y() - event->globalY()); - QCursor::setPos(m_lockedMousePosition); - } + webEvent.movementX = event->globalX() - m_previousMousePosition.x(); + webEvent.movementY = event->globalY() - m_previousMousePosition.y(); + + if (IsMouseLocked()) + QCursor::setPos(m_previousMousePosition); + else + m_previousMousePosition = event->globalPos(); if (m_imeInProgress && event->type() == QMouseEvent::MouseButtonPress) { m_imeInProgress = false; diff --git a/src/core/render_widget_host_view_qt.h b/src/core/render_widget_host_view_qt.h index 8871d88ce69cf80b1a9d2920fbb7ec335175d187..1dae96a537374800dfacf14bca76473d7781b6ea 100644 --- a/src/core/render_widget_host_view_qt.h +++ b/src/core/render_widget_host_view_qt.h @@ -242,7 +242,7 @@ private: ui::TextInputType m_currentInputType; bool m_imeInProgress; bool m_receivedEmptyImeText; - QPoint m_lockedMousePosition; + QPoint m_previousMousePosition; bool m_initPending; diff --git a/src/core/web_event_factory.cpp b/src/core/web_event_factory.cpp index ff5cc99a8b52d1e796e1c5ef0992da6dc7d96249..2cd15aa58f1c71cfde1d59bcd8127fb1f788b8d7 100644 --- a/src/core/web_event_factory.cpp +++ b/src/core/web_event_factory.cpp @@ -1205,6 +1205,8 @@ WebMouseEvent WebEventFactory::toWebMouseEvent(QHoverEvent *ev, double dpiScale) webKitEvent.x = webKitEvent.windowX = ev->pos().x() / dpiScale; webKitEvent.y = webKitEvent.windowY = ev->pos().y() / dpiScale; + webKitEvent.movementX = ev->pos().x() - ev->oldPos().x(); + webKitEvent.movementY = ev->pos().y() - ev->oldPos().y(); webKitEvent.type = webEventTypeForEvent(ev); return webKitEvent; diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp index 331c15ab8fb49edd31e14353df492bd6c57d2308..4d073e94c63469912d13c9626cc91a8870404c0b 100644 --- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp +++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp @@ -205,6 +205,7 @@ private Q_SLOTS: void toPlainTextLoadFinishedRace(); void setZoomFactor(); void mouseButtonTranslation(); + void mouseMovementProperties(); void printToPdf(); void viewSource(); @@ -4754,6 +4755,37 @@ void tst_QWebEnginePage::mouseButtonTranslation() QCOMPARE(evaluateJavaScriptSync(view.page(), "lastEvent.buttons").toInt(), 3); } +void tst_QWebEnginePage::mouseMovementProperties() +{ + QWebEngineView view; + ConsolePage page; + view.setPage(&page); + view.show(); + QTest::qWaitForWindowExposed(&view); + + QSignalSpy loadFinishedSpy(&page, SIGNAL(loadFinished(bool))); + page.setHtml(QStringLiteral( + "<html><head><script>\ + function onMouseMove(event) { console.log(event.movementX + \", \" + event.movementY); }; \ + </script></head>\ + <body>\ + <div style=\"height:600px;\" onmousemove=\"onMouseMove(event)\">\ + </div>\ + </body></html>")); + loadFinishedSpy.wait(); + + QTest::mouseMove(&view, QPoint(20, 20)); + QTRY_COMPARE(page.messages.count(), 1); + + QTest::mouseMove(&view, QPoint(30, 30)); + QTRY_COMPARE(page.messages.count(), 2); + QTRY_COMPARE(page.messages[1], QString("10, 10")); + + QTest::mouseMove(&view, QPoint(20, 20)); + QTRY_COMPARE(page.messages.count(), 3); + QTRY_COMPARE(page.messages[2], QString("-10, -10")); +} + QPoint tst_QWebEnginePage::elementCenter(QWebEnginePage *page, const QString &id) { QVariantList rectList = evaluateJavaScriptSync(page,