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 @@
-
-
-
-
- Input with delayed load
-
-
-
-
-
-
diff --git a/tests/end2end/data/qutebrowser.png b/tests/end2end/data/qutebrowser.png
deleted file mode 100644
index 062fe402c..000000000
Binary files a/tests/end2end/data/qutebrowser.png and /dev/null 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)')