From 1daf0a13031feff93cb075717d76ba7c385c23ac Mon Sep 17 00:00:00 2001 From: user202729 <25191436+user202729@users.noreply.github.com> Date: Tue, 7 May 2019 23:51:38 +0700 Subject: Check if the tab is current in HintManager._start_cb Fixes #3892. (cherry picked from commit 489cc98a9ed9cf73e3562f7a06e220a54658f7ee) (cherry picked from commit 3db3679b47d5650bb34ffd972ed4524f698fa535) (cherry picked from commit 29a9b8c13ae8c92d48a3ac62feb8625d5bf7d57e) (cherry picked from commit e413401d39b0fb4813d85056d085dafd669b1e40) (cherry picked from commit 2b064ef1922135eacbb69512761bc09c1e8640fc) (cherry picked from commit 6fc85a5551393899990410c00bf05f3d369e3e37) (cherry picked from commit 18d797a1718c62db3621768f101196c1323be3de) --- qutebrowser/browser/hints.py | 12 ++++++++++++ tests/end2end/features/hints.feature | 10 ++++++++++ tests/unit/browser/test_hints.py | 6 ++++-- 3 files changed, 26 insertions(+), 2 deletions(-) diff --git a/qutebrowser/browser/hints.py b/qutebrowser/browser/hints.py index a5f6874ee..ed63d6f02 100644 --- a/qutebrowser/browser/hints.py +++ b/qutebrowser/browser/hints.py @@ -599,6 +599,18 @@ class HintManager(QObject): message.error("No elements found.") return + # Because _start_cb is called asynchronously, it's possible that the + # user switched to another tab or closed the tab/window. In that case + # we should not start hinting. + tabbed_browser = objreg.get('tabbed-browser', default=None, + scope='window', window=self._win_id) + tab = tabbed_browser.widget.currentWidget() + if tab.tab_id != self._tab_id: + log.hints.debug( + "Current tab changed ({} -> {}) before _start_cb is run." + .format(self._tab_id, tab.tab_id)) + return + strings = self._hint_strings(elems) log.hints.debug("hints: {}".format(', '.join(strings))) diff --git a/tests/end2end/features/hints.feature b/tests/end2end/features/hints.feature index cb146e1ae..7932d2e98 100644 --- a/tests/end2end/features/hints.feature +++ b/tests/end2end/features/hints.feature @@ -19,6 +19,16 @@ Feature: Using hints When I run :hint --mode=foobar Then the error "Invalid mode: Invalid value 'foobar' - valid values: number, letter, word" should be shown + Scenario: Switching tab between :hint and start_cb (issue 3892) + When I open data/hints/html/simple.html + And I open data/hints/html/simple.html in a new tab + And I run :hint ;; tab-prev + And I wait for regex "hints: .*|Current tab changed \(\d* -> \d*\) before _start_cb is run\." in the log + # 'hints: .*' is logged when _start_cb is called before tab-prev (on + # qtwebkit, _start_cb is called synchronously) + And I run :follow-hint a + Then the error "follow-hint: This command is only allowed in hint mode, not normal." should be shown + ### Opening in current or new tab Scenario: Following a hint and force to open in current tab. diff --git a/tests/unit/browser/test_hints.py b/tests/unit/browser/test_hints.py index 925a3a28a..99500065d 100644 --- a/tests/unit/browser/test_hints.py +++ b/tests/unit/browser/test_hints.py @@ -58,7 +58,8 @@ def test_show_benchmark(benchmark, tabbed_browser, qtbot, message_bridge, with qtbot.wait_signal(tab.load_finished): tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html')) - manager = qutebrowser.browser.hints.HintManager(0, 0) + manager = qutebrowser.browser.hints.HintManager( + win_id=0, tab_id=tab.tab_id) def bench(): with qtbot.wait_signal(mode_manager.entered): @@ -78,7 +79,8 @@ def test_match_benchmark(benchmark, tabbed_browser, qtbot, message_bridge, with qtbot.wait_signal(tab.load_finished): tab.load_url(QUrl('qute://testdata/data/hints/benchmark.html')) - manager = qutebrowser.browser.hints.HintManager(0, 0) + manager = qutebrowser.browser.hints.HintManager( + win_id=0, tab_id=tab.tab_id) with qtbot.wait_signal(mode_manager.entered): manager.start() -- cgit v1.2.3-54-g00ecf