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,