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 commitd54b9bc638. This reverts commita34d392fe1. This reverts commit9bcf0b2369. This reverts commit4ea9758150.
This commit is contained in:
parent
a1694a3657
commit
5082331d46
|
|
@ -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
|
||||
~~~~~
|
||||
|
|
|
|||
|
|
@ -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.")
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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')
|
||||
|
|
|
|||
|
|
@ -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)')
|
||||
|
|
|
|||
Loading…
Reference in New Issue