diff options
author | Florian Bruhin <me@the-compiler.org> | 2020-07-20 16:21:48 +0200 |
---|---|---|
committer | Florian Bruhin <me@the-compiler.org> | 2020-07-20 16:22:35 +0200 |
commit | 5082331d46a26f03e2adeecf94d4a61b6392a980 (patch) | |
tree | 7b082f823c6f45f9c6af23aafb0f2584e9d3d01b | |
parent | a1694a365710c241bcfab8a4027482524eeff771 (diff) | |
download | qutebrowser-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.asciidoc | 3 | ||||
-rw-r--r-- | qutebrowser/mainwindow/tabbedbrowser.py | 35 | ||||
-rw-r--r-- | tests/end2end/data/insert_mode_settings/html/delayed.html | 11 | ||||
-rw-r--r-- | tests/end2end/data/qutebrowser.png | bin | 856 -> 0 bytes | |||
-rw-r--r-- | tests/end2end/features/hints.feature | 4 | ||||
-rw-r--r-- | tests/end2end/fixtures/webserver_sub.py | 44 | ||||
-rw-r--r-- | tests/end2end/test_insert_mode.py | 20 |
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 Binary files differdeleted file mode 100644 index 062fe402c..000000000 --- a/tests/end2end/data/qutebrowser.png +++ /dev/null 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)') |