From f3fdb0d2200ee1fa06bb8620f8bef84a37ab753a Mon Sep 17 00:00:00 2001
From: Peter Varga <pvarga@inf.u-szeged.hu>
Date: Fri, 3 Nov 2017 10:12:31 +0100
Subject: [PATCH] Do not stop findText on navigation if no finding in progress

Avoid unnecessary unselect calls to prevent to lose active focus on an
input field during background load.

Task-number: QTBUG-64082
Change-Id: I13e8e2a96254360a78329d6ea2b6858da86a2b5a
Reviewed-by: Viktor Engelmann <viktor.engelmann@qt.io>
---
 src/core/web_contents_adapter.cpp           | 6 ++++++
 src/core/web_contents_adapter.h             | 1 +
 src/webengine/api/qquickwebengineview.cpp   | 2 +-
 src/webenginewidgets/api/qwebenginepage.cpp | 2 +-
 4 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/src/core/web_contents_adapter.cpp b/src/core/web_contents_adapter.cpp
index 7c74bb7fd..1930e7a0e 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -1427,6 +1427,12 @@ void WebContentsAdapter::focusIfNecessary()
         d->webContents->Focus();
 }
 
+bool WebContentsAdapter::isFindTextInProgress() const
+{
+    Q_D(const WebContentsAdapter);
+    return d->lastFindRequestId != d->webContentsDelegate->lastReceivedFindReply();
+}
+
 WebContentsAdapterClient::RenderProcessTerminationStatus
 WebContentsAdapterClient::renderProcessExitStatus(int terminationStatus) {
     auto status = WebContentsAdapterClient::RenderProcessTerminationStatus(-1);
diff --git a/src/core/web_contents_adapter.h b/src/core/web_contents_adapter.h
index 67fcbe7af..51fd2891d 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -184,6 +184,7 @@ public:
     void viewSource();
     bool canViewSource();
     void focusIfNecessary();
+    bool isFindTextInProgress() const;
 
 
 private:
diff --git a/src/webengine/api/qquickwebengineview.cpp b/src/webengine/api/qquickwebengineview.cpp
index 53f4f5855..25f578528 100644
--- a/src/webengine/api/qquickwebengineview.cpp
+++ b/src/webengine/api/qquickwebengineview.cpp
@@ -356,7 +356,7 @@ void QQuickWebEngineViewPrivate::navigationRequested(int navigationType, const Q
     Q_EMIT q->navigationRequested(&navigationRequest);
 
     navigationRequestAction = navigationRequest.action();
-    if ((navigationRequestAction == WebContentsAdapterClient::AcceptRequest) && adapter)
+    if ((navigationRequestAction == WebContentsAdapterClient::AcceptRequest) && adapter && adapter->isFindTextInProgress())
         adapter->stopFinding();
 }
 
diff --git a/src/webenginewidgets/api/qwebenginepage.cpp b/src/webenginewidgets/api/qwebenginepage.cpp
index c583c7f51..9d8d52886 100644
--- a/src/webenginewidgets/api/qwebenginepage.cpp
+++ b/src/webenginewidgets/api/qwebenginepage.cpp
@@ -1433,7 +1433,7 @@ void QWebEnginePagePrivate::navigationRequested(int navigationType, const QUrl &
 {
     Q_Q(QWebEnginePage);
     bool accepted = q->acceptNavigationRequest(url, static_cast<QWebEnginePage::NavigationType>(navigationType), isMainFrame);
-    if (accepted && adapter)
+    if (accepted && adapter && adapter->isFindTextInProgress())
         adapter->stopFinding();
     navigationRequestAction = accepted ? WebContentsAdapterClient::AcceptRequest : WebContentsAdapterClient::IgnoreRequest;
 }
-- 
GitLab