diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index 3d8f9389aed72bec49d6ba148bef5c7a4034a20c..187565a7618ed1a15cb80bdee054bbeb8e8fd7e7 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -322,7 +322,7 @@ void QWebEnginePagePrivate::iconChanged(const QUrl &url)
 void QWebEnginePagePrivate::loadProgressChanged(int progress)
 {
     Q_Q(QWebEnginePage);
-    Q_EMIT q->loadProgress(progress);
+    QTimer::singleShot(0, q, [q, progress] () { Q_EMIT q->loadProgress(progress); });
 }
 
 void QWebEnginePagePrivate::didUpdateTargetURL(const QUrl &hoveredUrl)
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index 8b36d5a6fa6beb8aa736fffc9f4e1b45065bd0aa..cb6e9e405a49a6608c60ebbe1e3ad975218d9560 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -2216,11 +2216,13 @@ public:
         connect(page, SIGNAL(loadProgress(int)), SLOT(onLoadProgress(int)));
 
         QState* waitingForLoadStarted = new QState(this);
+        QState* waitingForFirstLoadProgress = new QState(this);
         QState* waitingForLastLoadProgress = new QState(this);
         QState* waitingForLoadFinished = new QState(this);
         QFinalState* final = new QFinalState(this);
 
-        waitingForLoadStarted->addTransition(page, SIGNAL(loadStarted()), waitingForLastLoadProgress);
+        waitingForLoadStarted->addTransition(page, SIGNAL(loadStarted()), waitingForFirstLoadProgress);
+        waitingForFirstLoadProgress->addTransition(this, SIGNAL(firstLoadProgress()), waitingForLastLoadProgress);
         waitingForLastLoadProgress->addTransition(this, SIGNAL(lastLoadProgress()), waitingForLoadFinished);
         waitingForLoadFinished->addTransition(page, SIGNAL(loadFinished(bool)), final);
 
@@ -2234,10 +2236,13 @@ public:
 public Q_SLOTS:
     void onLoadProgress(int progress)
     {
-        if (progress == 100)
+        if (progress == 0)
+            emit firstLoadProgress();
+        else if (progress == 100)
             emit lastLoadProgress();
     }
 Q_SIGNALS:
+    void firstLoadProgress();
     void lastLoadProgress();
 };