Press enter to follow links instead of using js

This codepath may trigger a crash which was fixed by
0e75f3272d.
However, this commit does not make it more likely to happen, and this
patch was backported into arch (at least).

In the future, we may be able to use <enter> on qtwebkit with js,
without triggering this crash
This commit is contained in:
Jay Kamat 2018-06-09 12:11:22 -07:00
parent c33a887b2d
commit de127497a2
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5
4 changed files with 24 additions and 7 deletions

View File

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

View File

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

View File

@ -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) => {

View File

@ -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 <tab>
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 <tab>
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 <tab>
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 <tab>
And I run :follow-selected --tab
Then data/hello.txt should be loaded