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 d54b9bc638.
This reverts commit a34d392fe1.
This reverts commit 9bcf0b2369.
This reverts commit 4ea9758150.
This commit is contained in:
Florian Bruhin 2020-07-20 16:21:48 +02:00
parent a1694a3657
commit 5082331d46
7 changed files with 23 additions and 94 deletions

View File

@ -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
~~~~~

View File

@ -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.")

View File

@ -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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 856 B

View File

@ -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

View File

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

View File

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