summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2020-07-20 16:21:48 +0200
committerFlorian Bruhin <me@the-compiler.org>2020-07-20 16:22:35 +0200
commit5082331d46a26f03e2adeecf94d4a61b6392a980 (patch)
tree7b082f823c6f45f9c6af23aafb0f2584e9d3d01b
parenta1694a365710c241bcfab8a4027482524eeff771 (diff)
downloadqutebrowser-5082331d46a26f03e2adeecf94d4a61b6392a980.tar.gz
qutebrowser-5082331d46a26f03e2adeecf94d4a61b6392a980.zip
Revert "Avoid leaving insert mode when page finished loading"
Causes problems because the insert mode leaving is asynchronous now, so due to the additional element check it actually happens later and can leave insert mode even after a different page is already focused. This reverts commit d54b9bc6383de8df6182957734917746c9123492. This reverts commit a34d392fe11dae105cbf3bce3f7b97ec43d53b1b. This reverts commit 9bcf0b2369b240b290080dc9dd59f2c2fe2ec603. This reverts commit 4ea97581506a57b77571042b173b774da72bfc97.
-rw-r--r--doc/changelog.asciidoc3
-rw-r--r--qutebrowser/mainwindow/tabbedbrowser.py35
-rw-r--r--tests/end2end/data/insert_mode_settings/html/delayed.html11
-rw-r--r--tests/end2end/data/qutebrowser.pngbin856 -> 0 bytes
-rw-r--r--tests/end2end/features/hints.feature4
-rw-r--r--tests/end2end/fixtures/webserver_sub.py44
-rw-r--r--tests/end2end/test_insert_mode.py20
7 files changed, 23 insertions, 94 deletions
diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc
index e7675d590..d3855c41a 100644
--- a/doc/changelog.asciidoc
+++ b/doc/changelog.asciidoc
@@ -38,9 +38,6 @@ Changed
all three settings. To review/change previously granted permissions, use
`:config-diff` and e.g.
`:config-unset -u example.org content.media.video_capture`.
-- When `input.insert_mode.leave_on_load` is enabled (the default), there are
- now additional heuristics to avoid leaving insert mode if an editable element
- is focused before the page finished loading.
Added
~~~~~
diff --git a/qutebrowser/mainwindow/tabbedbrowser.py b/qutebrowser/mainwindow/tabbedbrowser.py
index 619c54a0d..987fad3ac 100644
--- a/qutebrowser/mainwindow/tabbedbrowser.py
+++ b/qutebrowser/mainwindow/tabbedbrowser.py
@@ -35,7 +35,7 @@ from qutebrowser.mainwindow import tabwidget, mainwindow
from qutebrowser.browser import signalfilter, browsertab, history
from qutebrowser.utils import (log, usertypes, utils, qtutils, objreg,
urlutils, message, jinja)
-from qutebrowser.misc import quitter, objects
+from qutebrowser.misc import quitter
@attr.s
@@ -215,11 +215,7 @@ class TabbedBrowser(QWidget):
self.widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
# WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223
- self._leave_modes_on_load_finished = (
- qtutils.version_check('5.10', compiled=False) and
- objects.backend == usertypes.Backend.QtWebEngine)
-
- if self._leave_modes_on_load_finished:
+ if qtutils.version_check('5.10', compiled=False):
self.cur_load_finished.connect(self._leave_modes_on_load)
else:
self.cur_load_started.connect(self._leave_modes_on_load)
@@ -720,32 +716,21 @@ class TabbedBrowser(QWidget):
@pyqtSlot()
def _leave_modes_on_load(self):
"""Leave insert/hint mode when loading started."""
- tab = self.widget.currentWidget()
- if tab is None:
- return # type: ignore[unreachable]
-
- url = tab.url()
- if not url.isValid():
+ try:
+ url = self.current_url()
+ if not url.isValid():
+ url = None
+ except qtutils.QtValueError:
url = None
-
- def _leave_mode_cb(elem):
- """Leave insert mode if the current element isn't editable."""
- if elem is None or not elem.is_editable():
- modeman.leave(self._win_id, usertypes.KeyMode.insert,
- 'new page loaded', maybe=True)
-
if config.instance.get('input.insert_mode.leave_on_load',
url=url):
- if self._leave_modes_on_load_finished:
- tab.elements.find_focused(_leave_mode_cb)
- else:
- _leave_mode_cb(elem=None)
+ modeman.leave(self._win_id, usertypes.KeyMode.insert,
+ 'load started', maybe=True)
else:
log.modes.debug("Ignoring leave_on_load request due to setting.")
-
if config.cache['hints.leave_on_load']:
modeman.leave(self._win_id, usertypes.KeyMode.hint,
- 'new page loaded', maybe=True)
+ 'load started', maybe=True)
else:
log.modes.debug("Ignoring leave_on_load request due to setting.")
diff --git a/tests/end2end/data/insert_mode_settings/html/delayed.html b/tests/end2end/data/insert_mode_settings/html/delayed.html
deleted file mode 100644
index 8a0e93760..000000000
--- a/tests/end2end/data/insert_mode_settings/html/delayed.html
+++ /dev/null
@@ -1,11 +0,0 @@
-<!DOCTYPE html>
-<html>
- <head>
- <meta charset="utf-8">
- <title>Input with delayed load</title>
- </head>
- <body>
- <input id="qute-input" type="text" value=""/>
- <img src="/delayed-image">
- </body>
-</html>
diff --git a/tests/end2end/data/qutebrowser.png b/tests/end2end/data/qutebrowser.png
deleted file mode 100644
index 062fe402c..000000000
--- a/tests/end2end/data/qutebrowser.png
+++ /dev/null
Binary files differ
diff --git a/tests/end2end/features/hints.feature b/tests/end2end/features/hints.feature
index 7812428fc..c0c4fb1b3 100644
--- a/tests/end2end/features/hints.feature
+++ b/tests/end2end/features/hints.feature
@@ -458,14 +458,14 @@ Feature: Using hints
When I open data/hints/html/wrapped.html
And I hint with args "all"
And I run :reload
- Then "Leaving mode KeyMode.hint (reason: new page loaded)" should be logged
+ Then "Leaving mode KeyMode.hint (reason: load started)" should be logged
Scenario: Leaving hint mode on reload without leave_on_load
When I set hints.leave_on_load to false
And I open data/hints/html/simple.html
And I hint with args "all"
And I run :reload
- Then "Leaving mode KeyMode.hint (reason: new page loaded)" should not be logged
+ Then "Leaving mode KeyMode.hint (reason: load started)" should not be logged
### hints.auto_follow option
diff --git a/tests/end2end/fixtures/webserver_sub.py b/tests/end2end/fixtures/webserver_sub.py
index bfbd582d6..9902ab125 100644
--- a/tests/end2end/fixtures/webserver_sub.py
+++ b/tests/end2end/fixtures/webserver_sub.py
@@ -38,7 +38,7 @@ import cheroot.wsgi
import flask
app = flask.Flask(__name__)
-events = {'redirect-later': None, 'delayed-image': None}
+_redirect_later_event = None
@app.route('/')
@@ -68,32 +68,19 @@ def send_data(path):
return flask.send_from_directory(data_dir, path)
-def _delayed_wait(name):
- """Shared code for redirect-later/delayed-image."""
- events[name] = threading.Event()
- ok = events[name].wait(timeout=30 * 1000)
- assert ok
- events[name] = None
-
-
-def _delayed_continue(name):
- """Shared code for redirect_later_continue and delayed_image_continue."""
- if events[name] is None:
- return flask.Response(b'Timed out or no redirect pending.')
- else:
- events[name].set()
- return flask.Response(b'Continued.')
-
-
@app.route('/redirect-later')
def redirect_later():
"""302 redirect to / after the given delay.
If delay is -1, wait until a request on redirect-later-continue is done.
"""
+ global _redirect_later_event
delay = float(flask.request.args.get('delay', '1'))
if delay == -1:
- _delayed_wait('redirect-later')
+ _redirect_later_event = threading.Event()
+ ok = _redirect_later_event.wait(timeout=30 * 1000)
+ assert ok
+ _redirect_later_event = None
else:
time.sleep(delay)
x = flask.redirect('/')
@@ -103,20 +90,11 @@ def redirect_later():
@app.route('/redirect-later-continue')
def redirect_later_continue():
"""Continue a redirect-later request."""
- return _delayed_continue('redirect-later')
-
-
-@app.route('/delayed-image')
-def delayed_image():
- """Serve an image after a request on delayed-image-continue."""
- _delayed_wait('delayed-image')
- return send_data('qutebrowser.png')
-
-
-@app.route('/delayed-image-continue')
-def delayed_image_continue():
- """Continue a delayed-image request."""
- return _delayed_continue('delayed-image')
+ if _redirect_later_event is None:
+ return flask.Response(b'Timed out or no redirect pending.')
+ else:
+ _redirect_later_event.set()
+ return flask.Response(b'Continued redirect.')
@app.route('/redirect-self')
diff --git a/tests/end2end/test_insert_mode.py b/tests/end2end/test_insert_mode.py
index ceb2308c7..609e1f68b 100644
--- a/tests/end2end/test_insert_mode.py
+++ b/tests/end2end/test_insert_mode.py
@@ -102,23 +102,3 @@ def test_auto_leave_insert_mode_reload(quteproc, leave_on_load):
else:
quteproc.wait_for(
message='Ignoring leave_on_load request due to setting.')
-
-
-def test_auto_leave_insert_mode_delayed_load(quteproc):
- """Test insert mode leave behavior with a delayed load.
-
- If we finish loading after the user focused an insert field, we should not
- exit insert mode.
- """
- quteproc.set_setting('input.insert_mode.leave_on_load', 'true')
- quteproc.open_path('data/insert_mode_settings/html/delayed.html',
- wait=False)
- quteproc.wait_for(message="Changing title for idx 0 to "
- "'Input with delayed load'")
-
- quteproc.send_cmd(':click-element --force-event id qute-input')
- quteproc.wait_for(message='Entering mode KeyMode.insert (reason: *)')
-
- quteproc.open_path('delayed-image-continue', new_bg_tab=True)
- quteproc.ensure_not_logged(message='Leaving mode KeyMode.insert '
- '(reason: new page loaded)')