diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 726a2efab..48113167f 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -150,6 +150,8 @@ class WebEngineSearch(browsertab.AbstractSearch): self._pending_searches = 0 self.match = browsertab.SearchMatch() self._old_match = browsertab.SearchMatch() + self._debounce_timer = usertypes.Timer(self) + self._debounce_timer.setSingleShot(True) def _store_flags(self, reverse, ignore_case): self._flags.case_sensitive = self._is_case_sensitive(ignore_case) @@ -212,7 +214,7 @@ class WebEngineSearch(browsertab.AbstractSearch): log.webview.debug(f"Active search match: {self.match}") self.match_changed.emit(self.match) - def search(self, text, *, ignore_case=usertypes.IgnoreCase.never, + def _search(self, text, *, ignore_case=usertypes.IgnoreCase.never, reverse=False, result_cb=None): # Don't go to next entry on duplicate search if self.text == text and self.search_displayed: @@ -227,6 +229,20 @@ class WebEngineSearch(browsertab.AbstractSearch): self._find(text, self._flags, result_cb, 'search') + def search(self, *args, **kwargs): + delay = config.val.search.delay + if delay: + self._debounce_timer.stop() + + self._debounce_timer.timeout.disconnect() + self._debounce_timer.timeout.connect( + lambda: self._search(*args, **kwargs) + ) + + self._debounce_timer.start(delay) + else: + self._search(*args, **kwargs) + def clear(self): if self.search_displayed: self.cleared.emit() diff --git a/qutebrowser/config/configdata.yml b/qutebrowser/config/configdata.yml index b221a70dc..8a21b7546 100644 --- a/qutebrowser/config/configdata.yml +++ b/qutebrowser/config/configdata.yml @@ -50,6 +50,16 @@ changelog_after_upgrade: ignore_case: renamed: search.ignore_case +search.delay: + type: + name: Int + minval: 0 + maxval: maxint + default: 400 + desc: Delay (in milliseconds) between last keystroke when searching and the + search being submitted. Larger values produce fewer redundant searches but + also delay receiving search results. + search.ignore_case: type: IgnoreCase default: smart diff --git a/tests/end2end/features/test_marks_bdd.py b/tests/end2end/features/test_marks_bdd.py index 914f6d46c..3cbc1bb91 100644 --- a/tests/end2end/features/test_marks_bdd.py +++ b/tests/end2end/features/test_marks_bdd.py @@ -13,6 +13,11 @@ def turn_on_scroll_logging(quteproc): quteproc.turn_on_scroll_logging(no_scroll_filtering=True) +@pytest.fixture(autouse=True) +def disable_search_delay(quteproc): + quteproc.set_setting('search.delay', '0') + + @bdd.then(bdd.parsers.parse("the page should be scrolled to {x} {y}")) def check_y(request, quteproc, x, y): data = quteproc.get_session()