diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index edfe1c63b..0a8e62ecd 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -335,6 +335,11 @@ class WebEngineCaret(browsertab.AbstractCaret): """ if js_elem is None: return + if js_elem == "focused": + # we had a focused element, not a selected one. Just send + self._tab.key_press(Qt.Key_Enter) + return + assert isinstance(js_elem, dict), js_elem elem = webengineelem.WebEngineElement(js_elem, tab=self._tab) if tab: @@ -364,7 +369,8 @@ class WebEngineCaret(browsertab.AbstractCaret): else: # click an existing blue selection - js_code = javascript.assemble('webelem', 'find_selected_focused_link') + js_code = javascript.assemble('webelem', + 'find_selected_focused_link') self._tab.run_js_async(js_code, lambda jsret: self._follow_selected_cb(jsret, tab)) diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index c47ad10d1..67f04886f 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -388,6 +388,11 @@ class WebKitCaret(browsertab.AbstractCaret): else: selection = self._widget.selectedHtml() if not selection: + # Getting here may mean we crashed, but we can't do anything + # about that: + # https://github.com/annulen/webkit/commit/0e75f3272d149bc64899c161f150eb341a2417af + # TODO find a way to check if something is focused + self._tab.key_press(Qt.Key_Enter) return try: selected_element = xml.etree.ElementTree.fromstring( diff --git a/qutebrowser/javascript/webelem.js b/qutebrowser/javascript/webelem.js index b5aec6637..ad18899f6 100644 --- a/qutebrowser/javascript/webelem.js +++ b/qutebrowser/javascript/webelem.js @@ -329,8 +329,9 @@ window._qutebrowser.webelem = (function() { return serialize_elem(elem); }; - // Function for returning a selection to python (so we can click it) - // If there is no selection, get the currently focused element. + // Function for returning a selection or focus to python (so we can click + // it). If nothing is selected but there is something focused, returns + // "focused" funcs.find_selected_focused_link = () => { const elem = window.getSelection().baseNode; if (elem) { @@ -348,8 +349,7 @@ window._qutebrowser.webelem = (function() { if (serialized_frame_elem) { return serialized_frame_elem; } - // No selected element, return focused element - return funcs.find_focused(); + return funcs.find_focused() && "focused"; }; funcs.set_value = (id, value) => { diff --git a/tests/end2end/features/caret.feature b/tests/end2end/features/caret.feature index 72ff6d085..268828edd 100644 --- a/tests/end2end/features/caret.feature +++ b/tests/end2end/features/caret.feature @@ -321,28 +321,34 @@ Feature: Caret mode - data/caret.html - data/hello.txt (active) - @qtwebkit_skip: getting focused element not possible without js Scenario: :follow-selected with link tabbing (without JS) When I set content.javascript.enabled to false + And I run :leave-mode + And I run :jseval document.activeElement.blur(); And I run :fake-key And I run :follow-selected Then data/hello.txt should be loaded Scenario: :follow-selected with link tabbing (with JS) When I set content.javascript.enabled to true + And I run :leave-mode + And I run :jseval document.activeElement.blur(); And I run :fake-key And I run :follow-selected Then data/hello.txt should be loaded - @qtwebkit_skip: getting focused element not possible without js Scenario: :follow-selected with link tabbing in a tab (without JS) When I set content.javascript.enabled to false + And I run :leave-mode + And I run :jseval document.activeElement.blur(); And I run :fake-key And I run :follow-selected --tab Then data/hello.txt should be loaded Scenario: :follow-selected with link tabbing in a tab (with JS) When I set content.javascript.enabled to true + And I run :leave-mode + And I run :jseval document.activeElement.blur(); And I run :fake-key And I run :follow-selected --tab Then data/hello.txt should be loaded