From 5f2367739e1c200abf15bdfd95183bac740f264c Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Tue, 2 Nov 2021 12:13:24 -0400 Subject: Reset flags on duplicate search Reset flags when the user searches for the same text multiple times, instead of completely ignoring it. This fixes an issue where searching forward, and then searching backward for the same text, would not reset the search direction. --- qutebrowser/browser/webengine/webenginetab.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index ace23d14a..9d253a833 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -246,7 +246,13 @@ class WebEngineSearch(browsertab.AbstractSearch): # Don't go to next entry on duplicate search if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" - " for {}".format(text)) + " for {}, but resetting flags".format(text)) + # Reset flags + self._flags = self._empty_flags() + if self._is_case_sensitive(ignore_case): + self._flags |= QWebEnginePage.FindCaseSensitively + if reverse: + self._flags |= QWebEnginePage.FindBackward return self.text = text -- cgit v1.2.3-54-g00ecf From 4899cf269ea064193e76dacb0163880d86e295e9 Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Tue, 2 Nov 2021 12:16:07 -0400 Subject: Update duplicate search test --- tests/end2end/features/search.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/end2end/features/search.feature b/tests/end2end/features/search.feature index 5fafd19f0..c3f564fac 100644 --- a/tests/end2end/features/search.feature +++ b/tests/end2end/features/search.feature @@ -71,7 +71,7 @@ Feature: Searching on a page When I run :search foo And I wait for "search found foo" in the log And I run :search foo - Then "Ignoring duplicate search request for foo" should be logged + Then "Ignoring duplicate search request for foo, but resetting flags" should be logged ## search.ignore_case -- cgit v1.2.3-54-g00ecf From 0b1d9ed3bc9ab9dc4658d658a669f99f438fb2fc Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Tue, 2 Nov 2021 18:29:45 -0400 Subject: Reset flags on duplicate search with WebKit --- qutebrowser/browser/webkit/webkittab.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index df3491ec2..05e80295d 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -150,7 +150,16 @@ class WebKitSearch(browsertab.AbstractSearch): # Don't go to next entry on duplicate search if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" - " for {}".format(text)) + " for {}, but resetting flags".format(text)) + + # Reset flags + self._flags = self._empty_flags() + if self._is_case_sensitive(ignore_case): + self._flags |= QWebPage.FindCaseSensitively + if reverse: + self._flags |= QWebPage.FindBackward + if wrap: + self._flags |= QWebPage.FindWrapsAroundDocument return # Clear old search results, this is done automatically on QtWebEngine. -- cgit v1.2.3-54-g00ecf From 7c5eb1e22c86701b4cdee502ff0301fafde1932a Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Thu, 4 Nov 2021 12:38:13 -0400 Subject: Use a helper method to (re)set search flags --- qutebrowser/browser/webengine/webenginetab.py | 21 ++++++++++---------- qutebrowser/browser/webkit/webkittab.py | 28 ++++++++++++--------------- 2 files changed, 22 insertions(+), 27 deletions(-) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 9d253a833..926ccf133 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -200,6 +200,14 @@ class WebEngineSearch(browsertab.AbstractSearch): def _empty_flags(self): return QWebEnginePage.FindFlags(0) # type: ignore[call-overload] + def _args_to_flags(self, reverse, ignore_case): + flags = self._empty_flags() + if self._is_case_sensitive(ignore_case): + flags |= QWebEnginePage.FindCaseSensitively + if reverse: + flags |= QWebEnginePage.FindBackward + return flags + def connect_signals(self): self._wrap_handler.connect_signal(self._widget.page()) @@ -247,22 +255,13 @@ class WebEngineSearch(browsertab.AbstractSearch): if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" " for {}, but resetting flags".format(text)) - # Reset flags - self._flags = self._empty_flags() - if self._is_case_sensitive(ignore_case): - self._flags |= QWebEnginePage.FindCaseSensitively - if reverse: - self._flags |= QWebEnginePage.FindBackward + self._flags = self._args_to_flags(reverse, ignore_case) return self.text = text - self._flags = self._empty_flags() + self._flags = self._args_to_flags(reverse, ignore_case) self._wrap_handler.reset_match_data() self._wrap_handler.flag_wrap = wrap - if self._is_case_sensitive(ignore_case): - self._flags |= QWebEnginePage.FindCaseSensitively - if reverse: - self._flags |= QWebEnginePage.FindBackward self._find(text, self._flags, result_cb, 'search') diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 05e80295d..6575f532c 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -108,6 +108,16 @@ class WebKitSearch(browsertab.AbstractSearch): def _empty_flags(self): return QWebPage.FindFlags(0) # type: ignore[call-overload] + def _args_to_flags(self, reverse, ignore_case, wrap): + flags = self._empty_flags() + if self._is_case_sensitive(ignore_case): + flags |= QWebPage.FindCaseSensitively + if reverse: + flags |= QWebPage.FindBackward + if wrap: + flags |= QWebPage.FindWrapsAroundDocument + return flags + def _call_cb(self, callback, found, text, flags, caller): """Call the given callback if it's non-None. @@ -151,15 +161,7 @@ class WebKitSearch(browsertab.AbstractSearch): if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" " for {}, but resetting flags".format(text)) - - # Reset flags - self._flags = self._empty_flags() - if self._is_case_sensitive(ignore_case): - self._flags |= QWebPage.FindCaseSensitively - if reverse: - self._flags |= QWebPage.FindBackward - if wrap: - self._flags |= QWebPage.FindWrapsAroundDocument + self._flags = self._args_to_flags(reverse, ignore_case, reverse) return # Clear old search results, this is done automatically on QtWebEngine. @@ -167,13 +169,7 @@ class WebKitSearch(browsertab.AbstractSearch): self.text = text self.search_displayed = True - self._flags = self._empty_flags() - if self._is_case_sensitive(ignore_case): - self._flags |= QWebPage.FindCaseSensitively - if reverse: - self._flags |= QWebPage.FindBackward - if wrap: - self._flags |= QWebPage.FindWrapsAroundDocument + self._flags = self._args_to_flags(reverse, ignore_case, wrap) # We actually search *twice* - once to highlight everything, then again # to get a mark so we can navigate. found = self._widget.findText(text, self._flags) -- cgit v1.2.3-54-g00ecf From 437141ddea36be99220a619d28c1c18e1d1c3c6c Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Thu, 4 Nov 2021 16:10:53 -0400 Subject: Test resetting direction on duplicate searches --- tests/end2end/features/search.feature | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/end2end/features/search.feature b/tests/end2end/features/search.feature index c3f564fac..61deb3dcc 100644 --- a/tests/end2end/features/search.feature +++ b/tests/end2end/features/search.feature @@ -73,6 +73,24 @@ Feature: Searching on a page And I run :search foo Then "Ignoring duplicate search request for foo, but resetting flags" should be logged + Scenario: Reset search direction on duplicate search, forward-to-back + When I run :search baz + And I wait for "search found baz" in the log + And I run :search -r baz + And I wait for "Ignoring duplicate search request for baz, but resetting flags" in the log + And I run :search-next + And I wait for "next_result found baz with flags FindBackward" in the log + Then "BAZ" should be found + + Scenario: Reset search direction on duplicate search, back-to-forward + When I run :search -r baz + And I wait for "search found baz with flags FindBackward" in the log + And I run :search baz + And I wait for "Ignoring duplicate search request for baz, but resetting flags" in the log + And I run :search-next + And I wait for "next_result found baz" in the log + Then "Baz" should be found + ## search.ignore_case Scenario: Searching text with search.ignore_case = always -- cgit v1.2.3-54-g00ecf From 29a0980c5bd3c34e4e950dcaa09faaa20f25e4dd Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Thu, 4 Nov 2021 16:33:19 -0400 Subject: Send correct arguments to _args_to_flags Correctly send the 'wrap' argument to the helper method WebKitSearch._args_to_flags() instead of sending 'reverse' for a second time. --- qutebrowser/browser/webkit/webkittab.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 6575f532c..7a41b995c 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -161,7 +161,7 @@ class WebKitSearch(browsertab.AbstractSearch): if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" " for {}, but resetting flags".format(text)) - self._flags = self._args_to_flags(reverse, ignore_case, reverse) + self._flags = self._args_to_flags(reverse, ignore_case, wrap) return # Clear old search results, this is done automatically on QtWebEngine. -- cgit v1.2.3-54-g00ecf From 087c84c0d514563828d9aefa30b7ef814a1c098b Mon Sep 17 00:00:00 2001 From: Tim Gadanidis Date: Thu, 4 Nov 2021 17:15:17 -0400 Subject: Fix back-to-forward test search direction test Test originally expected "Baz" instead of "baz", which is what should actually be found if starting at the bottom and then searching forward (wrapping around). --- tests/end2end/features/search.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/end2end/features/search.feature b/tests/end2end/features/search.feature index 61deb3dcc..305b45690 100644 --- a/tests/end2end/features/search.feature +++ b/tests/end2end/features/search.feature @@ -89,7 +89,7 @@ Feature: Searching on a page And I wait for "Ignoring duplicate search request for baz, but resetting flags" in the log And I run :search-next And I wait for "next_result found baz" in the log - Then "Baz" should be found + Then "baz" should be found ## search.ignore_case -- cgit v1.2.3-54-g00ecf