diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index d3855c41a..e7675d590 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -38,6 +38,9 @@ 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 987fad3ac..de0ec929b 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 +from qutebrowser.misc import quitter, objects @attr.s @@ -215,7 +215,11 @@ class TabbedBrowser(QWidget): self.widget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) # WORKAROUND for https://bugreports.qt.io/browse/QTBUG-65223 - if qtutils.version_check('5.10', compiled=False): + 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: self.cur_load_finished.connect(self._leave_modes_on_load) else: self.cur_load_started.connect(self._leave_modes_on_load) @@ -716,21 +720,32 @@ class TabbedBrowser(QWidget): @pyqtSlot() def _leave_modes_on_load(self): """Leave insert/hint mode when loading started.""" - try: - url = self.current_url() - if not url.isValid(): - url = None - except qtutils.QtValueError: + tab = self.widget.currentWidget() + if tab is None: + return + + url = tab.url() + if not url.isValid(): 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): - modeman.leave(self._win_id, usertypes.KeyMode.insert, - 'load started', maybe=True) + if self._leave_modes_on_load_finished: + tab.elements.find_focused(_leave_mode_cb) + else: + _leave_mode_cb(elem=None) 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, - 'load started', maybe=True) + 'new page loaded', 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 new file mode 100644 index 000000000..8a0e93760 --- /dev/null +++ b/tests/end2end/data/insert_mode_settings/html/delayed.html @@ -0,0 +1,11 @@ + + +
+ +