Merge remote-tracking branch 'origin/pr/3947'

This commit is contained in:
Florian Bruhin 2018-06-11 11:29:14 +02:00
commit 7f69920158
4 changed files with 68 additions and 6 deletions

View File

@ -335,6 +335,13 @@ class WebEngineCaret(browsertab.AbstractCaret):
""" """
if js_elem is None: if js_elem is None:
return return
if js_elem == "focused":
# we had a focused element, not a selected one. Just send <enter>
if tab:
self._tab.key_press(Qt.Key_Enter, modifier=Qt.ControlModifier)
else:
self._tab.key_press(Qt.Key_Enter)
assert isinstance(js_elem, dict), js_elem assert isinstance(js_elem, dict), js_elem
elem = webengineelem.WebEngineElement(js_elem, tab=self._tab) elem = webengineelem.WebEngineElement(js_elem, tab=self._tab)
if tab: if tab:
@ -364,7 +371,8 @@ class WebEngineCaret(browsertab.AbstractCaret):
else: else:
# click an existing blue selection # click an existing blue selection
js_code = javascript.assemble('webelem', 'find_selected_link') js_code = javascript.assemble('webelem',
'find_selected_focused_link')
self._tab.run_js_async(js_code, lambda jsret: self._tab.run_js_async(js_code, lambda jsret:
self._follow_selected_cb(jsret, tab)) self._follow_selected_cb(jsret, tab))

View File

@ -377,11 +377,26 @@ class WebKitCaret(browsertab.AbstractCaret):
QWebSettings.JavascriptEnabled): QWebSettings.JavascriptEnabled):
if tab: if tab:
self._tab.data.override_target = usertypes.ClickTarget.tab self._tab.data.override_target = usertypes.ClickTarget.tab
self._tab.run_js_async( self._tab.run_js_async("""
'window.getSelection().anchorNode.parentNode.click()') const aElm = document.activeElement;
if (window.getSelection().anchorNode) {
window.getSelection().anchorNode.parentNode.click();
} else if (aElm && aElm !== document.body) {
aElm.click();
}
""")
else: else:
selection = self._widget.selectedHtml() selection = self._widget.selectedHtml()
if not selection: if not selection:
# Getting here may mean we crashed, but we can't do anything
# about that until this commit is released:
# https://github.com/annulen/webkit/commit/0e75f3272d149bc64899c161f150eb341a2417af
# TODO find a way to check if something is focused
if tab:
self._tab.key_press(Qt.Key_Enter,
modifier=Qt.ControlModifier)
else:
self._tab.key_press(Qt.Key_Enter)
return return
try: try:
selected_element = xml.etree.ElementTree.fromstring( selected_element = xml.etree.ElementTree.fromstring(

View File

@ -243,6 +243,7 @@ window._qutebrowser.webelem = (function() {
}; };
// Runs a function in a frame until the result is not null, then return // Runs a function in a frame until the result is not null, then return
// If no frame succeds, return null
function run_frames(func) { function run_frames(func) {
for (let i = 0; i < window.frames.length; ++i) { for (let i = 0; i < window.frames.length; ++i) {
const frame = window.frames[i]; const frame = window.frames[i];
@ -328,8 +329,10 @@ window._qutebrowser.webelem = (function() {
return serialize_elem(elem); return serialize_elem(elem);
}; };
// Function for returning a selection to python (so we can click it) // Function for returning a selection or focus to python (so we can click
funcs.find_selected_link = () => { // it). If nothing is selected but there is something focused, returns
// "focused"
funcs.find_selected_focused_link = () => {
const elem = window.getSelection().baseNode; const elem = window.getSelection().baseNode;
if (elem) { if (elem) {
return serialize_elem(elem.parentNode); return serialize_elem(elem.parentNode);
@ -342,7 +345,11 @@ window._qutebrowser.webelem = (function() {
} }
return null; return null;
}); });
return serialized_frame_elem;
if (serialized_frame_elem) {
return serialized_frame_elem;
}
return funcs.find_focused() && "focused";
}; };
funcs.set_value = (id, value) => { funcs.set_value = (id, value) => {

View File

@ -321,6 +321,38 @@ Feature: Caret mode
- data/caret.html - data/caret.html
- data/hello.txt (active) - data/hello.txt (active)
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
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
# Search + caret mode # Search + caret mode
# https://bugreports.qt.io/browse/QTBUG-60673 # https://bugreports.qt.io/browse/QTBUG-60673