summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoruser202729 <25191436+user202729@users.noreply.github.com>2019-05-07 23:51:38 +0700
committerFlorian Bruhin <me@the-compiler.org>2019-05-11 18:32:02 +0200
commit1daf0a13031feff93cb075717d76ba7c385c23ac (patch)
tree6fde0410b6657fcf91617859d059ac47f8b9b62b
parent197c0b1c28453da7a839d54d5a812e061ffcef45 (diff)
downloadqutebrowser-1daf0a13031feff93cb075717d76ba7c385c23ac.tar.gz
qutebrowser-1daf0a13031feff93cb075717d76ba7c385c23ac.zip
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)
-rw-r--r--qutebrowser/browser/hints.py12
-rw-r--r--tests/end2end/features/hints.feature10
-rw-r--r--tests/unit/browser/test_hints.py6
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()