diff options
-rw-r--r-- | qutebrowser/browser/browsertab.py | 8 | ||||
-rw-r--r-- | qutebrowser/browser/commands.py | 11 | ||||
-rw-r--r-- | qutebrowser/browser/webengine/webenginetab.py | 31 | ||||
-rw-r--r-- | qutebrowser/browser/webkit/webkittab.py | 26 |
4 files changed, 36 insertions, 40 deletions
diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index 7745cff4b..f2ed3f084 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -377,7 +377,6 @@ class AbstractSearch(QObject): def search(self, text: str, *, ignore_case: usertypes.IgnoreCase = usertypes.IgnoreCase.never, reverse: bool = False, - wrap: bool = True, result_cb: _Callback = None) -> None: """Find the given text on the page. @@ -385,7 +384,6 @@ class AbstractSearch(QObject): text: The text to search for. ignore_case: Search case-insensitively. reverse: Reverse search direction. - wrap: Allow wrapping at the top or bottom of the page. result_cb: Called with a bool indicating whether a match was found. """ raise NotImplementedError @@ -394,18 +392,20 @@ class AbstractSearch(QObject): """Clear the current search.""" raise NotImplementedError - def prev_result(self, *, result_cb: _Callback = None) -> None: + def prev_result(self, *, wrap: bool = False, result_cb: _Callback = None) -> None: """Go to the previous result of the current search. Args: + wrap: Allow wrapping at the top or bottom of the page. result_cb: Called with a bool indicating whether a match was found. """ raise NotImplementedError - def next_result(self, *, result_cb: _Callback = None) -> None: + def next_result(self, *, wrap: bool = False, result_cb: _Callback = None) -> None: """Go to the next result of the current search. Args: + wrap: Allow wrapping at the top or bottom of the page. result_cb: Called with a bool indicating whether a match was found. """ raise NotImplementedError diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index 50dae13ea..073fe1c49 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -1597,7 +1597,6 @@ class CommandDispatcher: options = { 'ignore_case': config.val.search.ignore_case, 'reverse': reverse, - 'wrap': config.val.search.wrap, } self._tabbed_browser.search_text = text @@ -1641,10 +1640,11 @@ class CommandDispatcher: old_match=tab.search.match, options=window_options, text=window_text, prev=False) + wrap = config.val.search.wrap for _ in range(count - 1): - tab.search.next_result() - tab.search.next_result(result_cb=cb) + tab.search.next_result(wrap=wrap) + tab.search.next_result(result_cb=cb, wrap=wrap) @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', value=cmdutils.Value.count) @@ -1675,10 +1675,11 @@ class CommandDispatcher: old_match=tab.search.match, options=window_options, text=window_text, prev=True) + wrap = config.val.search.wrap for _ in range(count - 1): - tab.search.prev_result() - tab.search.prev_result(result_cb=cb) + tab.search.prev_result(wrap=wrap) + tab.search.prev_result(result_cb=cb, wrap=wrap) def _jseval_cb(self, out): """Show the data returned from JS.""" diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 3ad1d99a7..f1d1a0cbb 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -103,10 +103,6 @@ class WebEngineSearch(browsertab.AbstractSearch): Attributes: _flags: The QWebEnginePage.FindFlags of the last search. - _flag_wrap: An additional flag indicating whether the last search - used wrapping. - _nowrap_available: Whether the functionality to prevent wrapping - is available. _pending_searches: How many searches have been started but not called back yet. @@ -118,8 +114,6 @@ class WebEngineSearch(browsertab.AbstractSearch): super().__init__(tab, parent) self._flags = self._empty_flags() self._pending_searches = 0 - self._flag_wrap = None - self._nowrap_available = False # gets set in connect_signals def _empty_flags(self): return QWebEnginePage.FindFlags(0) @@ -150,7 +144,6 @@ class WebEngineSearch(browsertab.AbstractSearch): "to rebuild PyQtWebEngine.") return - self._nowrap_available = True self._widget.page().findTextFinished.connect(self._on_find_finished) def _find(self, text, flags, callback, caller): @@ -199,7 +192,7 @@ class WebEngineSearch(browsertab.AbstractSearch): self.match_changed.emit(self.match) def search(self, text, *, ignore_case=usertypes.IgnoreCase.never, - reverse=False, wrap=True, result_cb=None): + reverse=False, result_cb=None): # Don't go to next entry on duplicate search if self.text == text and self.search_displayed: log.webview.debug("Ignoring duplicate search request" @@ -210,7 +203,6 @@ class WebEngineSearch(browsertab.AbstractSearch): self.text = text self._flags = self._args_to_flags(reverse, ignore_case) self.match.reset() - self._flag_wrap = wrap self._find(text, self._flags, result_cb, 'search') @@ -222,33 +214,26 @@ class WebEngineSearch(browsertab.AbstractSearch): self.match.reset() self._widget.page().findText('') - def _prevent_wrapping(self, going_up: bool) -> bool: - """Whether wrapping should be prevented.""" - assert self._flag_wrap is not None - return ( - self._nowrap_available and - not self._flag_wrap and - self.match.at_limit(going_up) - ) - - def prev_result(self, *, result_cb=None): + def prev_result(self, *, wrap=False, result_cb=None): # The int() here makes sure we get a copy of the flags. flags = QWebEnginePage.FindFlags(int(self._flags)) + if flags & QWebEnginePage.FindBackward: - if self._prevent_wrapping(going_up=False): + if self.match.at_limit(going_up=False) and not wrap: result_cb(True) return flags &= ~QWebEnginePage.FindBackward else: - if self._prevent_wrapping(going_up=True): + if self.match.at_limit(going_up=True) and not wrap: result_cb(True) return flags |= QWebEnginePage.FindBackward + self._find(self.text, flags, result_cb, 'prev_result') - def next_result(self, *, result_cb=None): + def next_result(self, *, wrap=False, result_cb=None): going_up = self._flags & QWebEnginePage.FindBackward - if self._prevent_wrapping(going_up=going_up): + if self.match.at_limit(going_up=going_up) and not wrap: result_cb(True) return self._find(self.text, self._flags, result_cb, 'next_result') diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index 24d232c9c..05e48b2f6 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -115,14 +115,12 @@ 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): + def _args_to_flags(self, reverse, ignore_case): 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): @@ -164,12 +162,12 @@ class WebKitSearch(browsertab.AbstractSearch): '', QWebPage.HighlightAllOccurrences) # type: ignore[arg-type] def search(self, text, *, ignore_case=usertypes.IgnoreCase.never, - reverse=False, wrap=True, result_cb=None): + reverse=False, result_cb=None): # 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 {}, but resetting flags".format(text)) - self._flags = self._args_to_flags(reverse, ignore_case, wrap) + self._flags = self._args_to_flags(reverse, ignore_case) return # Clear old search results, this is done automatically on QtWebEngine. @@ -177,7 +175,7 @@ class WebKitSearch(browsertab.AbstractSearch): self.text = text self.search_displayed = True - self._flags = self._args_to_flags(reverse, ignore_case, wrap) + self._flags = self._args_to_flags(reverse, ignore_case) # 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) @@ -185,20 +183,32 @@ class WebKitSearch(browsertab.AbstractSearch): self._flags | QWebPage.HighlightAllOccurrences) self._call_cb(result_cb, found, text, self._flags, 'search') - def next_result(self, *, result_cb=None): + def next_result(self, *, wrap=False, result_cb=None): self.search_displayed = True + # The int() here makes sure we get a copy of the flags. + flags = QWebPage.FindFlags( + int(self._flags)) # type: ignore[call-overload] + + if wrap: + flags |= QWebPage.FindWrapsAroundDocument + found = self._widget.findText(self.text, self._flags) # type: ignore[arg-type] self._call_cb(result_cb, found, self.text, self._flags, 'next_result') - def prev_result(self, *, result_cb=None): + def prev_result(self, *, wrap=False, result_cb=None): self.search_displayed = True # The int() here makes sure we get a copy of the flags. flags = QWebPage.FindFlags( int(self._flags)) # type: ignore[call-overload] + if flags & QWebPage.FindBackward: flags &= ~QWebPage.FindBackward else: flags |= QWebPage.FindBackward + + if wrap: + flags |= QWebPage.FindWrapsAroundDocument + found = self._widget.findText(self.text, flags) # type: ignore[arg-type] self._call_cb(result_cb, found, self.text, flags, 'prev_result') |