Hello community,

here is the log from the commit of package libqt5-qtwebengine for 
openSUSE:Leap:15.2 checked in at 2020-03-15 07:09:42
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/libqt5-qtwebengine (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.libqt5-qtwebengine.new.3160 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libqt5-qtwebengine"

Sun Mar 15 07:09:42 2020 rev:66 rq:784722 version:5.12.7

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/libqt5-qtwebengine/libqt5-qtwebengine.changes  
2020-02-10 16:41:37.363710490 +0100
+++ 
/work/SRC/openSUSE:Leap:15.2/.libqt5-qtwebengine.new.3160/libqt5-qtwebengine.changes
        2020-03-15 07:09:45.228905635 +0100
@@ -1,0 +2,6 @@
+Thu Mar 12 09:51:01 UTC 2020 - Wolfgang Bauer <[email protected]>
+
+- Fix an issue with selections breaking replying in KMail:
+  * QTBUG-81574.patch
+
+-------------------------------------------------------------------

New:
----
  QTBUG-81574.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libqt5-qtwebengine.spec ++++++
--- /var/tmp/diff_new_pack.HjLYl3/_old  2020-03-15 07:09:49.372908115 +0100
+++ /var/tmp/diff_new_pack.HjLYl3/_new  2020-03-15 07:09:49.376908117 +0100
@@ -73,6 +73,8 @@
 Patch9:         chromium-non-void-return.patch
 # PATCH-FIX-UPSTREAM reproducible.patch -- 
https://bugs.chromium.org/p/chromium/issues/detail?id=740363 boo#1047218
 Patch10:        reproducible.patch
+# PATCH-FIX-UPSTREAM 
https://codereview.qt-project.org/c/qt/qtwebengine/+/290321
+Patch11:        QTBUG-81574.patch
 # http://www.chromium.org/blink not ported to PowerPC
 ExcludeArch:    ppc ppc64 ppc64le s390 s390x
 # Try to fix i586 MemoryErrors with rpmlint

++++++ QTBUG-81574.patch ++++++
>From 7d56bbb4c1708f00f729bdfe2e8951c644c83194 Mon Sep 17 00:00:00 2001
From: Kirill Burtsev <[email protected]>
Date: Wed, 12 Feb 2020 16:15:34 +0100
Subject: [PATCH] Clear previous page text selection on new navigation 
unconditionally

Use direct code to clear SelectedText instead of CollapseSelection as it assumes
focused frame and might be ignored.

Fixes: QTBUG-81574
Change-Id: I01cf02967e118f407c8a3997e176d5b258478a5a
---

diff --git a/src/core/web_contents_adapter.cpp 
b/src/core/web_contents_adapter.cpp
index 8cc8179..a7579f9 100644
--- a/src/core/web_contents_adapter.cpp
+++ b/src/core/web_contents_adapter.cpp
@@ -65,6 +65,7 @@
 #include "base/run_loop.h"
 #include "base/values.h"
 #include "content/browser/renderer_host/render_view_host_impl.h"
+#include "content/browser/renderer_host/text_input_manager.h"
 #include "content/browser/web_contents/web_contents_impl.h"
 #include "content/public/browser/child_process_security_policy.h"
 #include "content/public/browser/devtools_agent_host.h"
@@ -661,6 +662,7 @@
         // Follow chrome::Navigate and invalidate the URL immediately.
         
adapter->m_webContentsDelegate->NavigationStateChanged(adapter->webContents(), 
content::INVALIDATE_TYPE_URL);
         adapter->focusIfNecessary();
+        adapter->resetSelection();
     };
 
     QWeakPointer<WebContentsAdapter> weakThis(sharedFromThis());
@@ -702,7 +704,7 @@
     params.override_user_agent = 
content::NavigationController::UA_OVERRIDE_TRUE;
     m_webContents->GetController().LoadURLWithParams(params);
     focusIfNecessary();
-    m_webContents->CollapseSelection();
+    resetSelection();
 }
 
 void WebContentsAdapter::save(const QString &filePath, int savePageFormat)
@@ -1614,6 +1621,17 @@
     return m_webContents->GetFocusedFrame() != nullptr;
 }
 
+void WebContentsAdapter::resetSelection()
+{
+    CHECK_INITIALIZED();
+    // unconditionally clears the selection in contrast to CollapseSelection, 
which checks focus state first
+    if (auto rwhv = static_cast<RenderWidgetHostViewQt 
*>(m_webContents->GetRenderWidgetHostView())) {
+        if (auto mgr = rwhv->GetTextInputManager())
+            if (auto selection = 
const_cast<content::TextInputManager::TextSelection 
*>(mgr->GetTextSelection(rwhv)))
+                selection->SetSelection(base::string16(), 0, gfx::Range(), 
false);
+    }
+}
+
 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 11f8f9c..f8f147f 100644
--- a/src/core/web_contents_adapter.h
+++ b/src/core/web_contents_adapter.h
@@ -229,6 +229,7 @@
     void focusIfNecessary();
     bool isFindTextInProgress() const;
     bool hasFocusedFrame() const;
+    void resetSelection();
 
     // meant to be used within WebEngineCore only
     void initialize(content::SiteInstance *site);
diff --git a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp 
b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
index 8cdcc9f..94b3f16 100644
--- a/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
+++ b/tests/auto/widgets/qwebenginepage/tst_qwebenginepage.cpp
@@ -879,7 +879,7 @@
     CursorTrackedPage(QWidget *parent = 0): QWebEnginePage(parent) {
     }
 
-    QString selectedText() {
+    QString jsSelectedText() {
         return evaluateJavaScriptSync(this, 
"window.getSelection().toString()").toString();
     }
 
@@ -895,10 +895,6 @@
     int isSelectionCollapsed() {
         return evaluateJavaScriptSync(this, 
"window.getSelection().getRangeAt(0).collapsed").toBool();
     }
-    bool hasSelection()
-    {
-        return !selectedText().isEmpty();
-    }
 };
 
 void tst_QWebEnginePage::cursorMovements()
@@ -1101,18 +1097,19 @@
 
 void tst_QWebEnginePage::textSelection()
 {
-    QWebEngineView view;
-    CursorTrackedPage *page = new CursorTrackedPage(&view);
-    QString content("<html><body><p id=one>The quick brown fox</p>" \
+    CursorTrackedPage page;
+
+    QString textToSelect("The quick brown fox");
+    QString content = QString("<html><body><p id=one>%1</p>" \
         "<p id=two>jumps over the lazy dog</p>" \
-        "<p>May the source<br/>be with you!</p></body></html>");
-    page->setView(&view);
-    QSignalSpy loadSpy(&view, SIGNAL(loadFinished(bool)));
-    page->setHtml(content);
+        "<p>May the source<br/>be with 
you!</p></body></html>").arg(textToSelect);
+
+    QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool)));
+    page.setHtml(content);
     QTRY_COMPARE(loadSpy.count(), 1);
 
     // these actions must exist
-    QVERIFY(page->action(QWebEnginePage::SelectAll) != 0);
+    QVERIFY(page.action(QWebEnginePage::SelectAll) != 0);
 #if defined(QWEBENGINEPAGE_SELECTACTIONS)
     QVERIFY(page->action(QWebEnginePage::SelectNextChar) != 0);
     QVERIFY(page->action(QWebEnginePage::SelectPreviousChar) != 0);
@@ -1144,25 +1140,38 @@
 #endif
 
     // ..but SelectAll is disabled because the page has no focus due to 
disabled FocusOnNavigationEnabled.
-    QCOMPARE(page->action(QWebEnginePage::SelectAll)->isEnabled(), false);
+    QCOMPARE(page.action(QWebEnginePage::SelectAll)->isEnabled(), false);
 
     // Verify hasSelection returns false since there is no selection yet...
-    QCOMPARE(page->hasSelection(), false);
+    QVERIFY(!page.hasSelection());
+    QVERIFY(page.jsSelectedText().isEmpty());
 
     // this will select the first paragraph
     QString selectScript = "var range = document.createRange(); " \
         "var node = document.getElementById(\"one\"); " \
         "range.selectNode(node); " \
         "getSelection().addRange(range);";
-    evaluateJavaScriptSync(page, selectScript);
-    QCOMPARE(page->selectedText().trimmed(), QString::fromLatin1("The quick 
brown fox"));
+    evaluateJavaScriptSync(&page, selectScript);
+
 #if defined(QWEBENGINEPAGE_SELECTEDHTML)
     QRegExp regExp(" style=\".*\"");
     regExp.setMinimal(true);
     QCOMPARE(page->selectedHtml().trimmed().replace(regExp, ""), 
QString::fromLatin1("<p id=\"one\">The quick brown fox</p>"));
 #endif
     // Make sure hasSelection returns true, since there is selected text now...
-    QCOMPARE(page->hasSelection(), true);
+    QTRY_VERIFY(page.hasSelection());
+    QCOMPARE(page.selectedText().trimmed(), textToSelect);
+
+    QCOMPARE(page.jsSelectedText().trimmed(), textToSelect);
+
+    // navigate away and check that selection is cleared
+    page.load(QUrl("about:blank"));
+    QTRY_COMPARE(loadSpy.count(), 2);
+
+    QVERIFY(!page.hasSelection());
+    QVERIFY(page.selectedText().isEmpty());
+
+    QVERIFY(page.jsSelectedText().isEmpty());
 
 #if defined(QWEBENGINEPAGE_SELECTACTIONS)
     // here the actions are enabled after a selection has been created

Reply via email to