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)')