Add support for following tab selected elements to :follow-selected

This commit is contained in:
Jay Kamat 2018-05-25 12:37:30 -07:00
parent 12e0edbcd0
commit c33a887b2d
No known key found for this signature in database
GPG Key ID: 5D2E399600F4F7B5
4 changed files with 44 additions and 5 deletions

View File

@ -364,7 +364,7 @@ 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,8 +377,14 @@ 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:

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];
@ -329,7 +330,8 @@ window._qutebrowser.webelem = (function() {
}; };
// Function for returning a selection to python (so we can click it) // Function for returning a selection to python (so we can click it)
funcs.find_selected_link = () => { // If there is no selection, get the currently focused element.
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 +344,12 @@ window._qutebrowser.webelem = (function() {
} }
return null; return null;
}); });
return serialized_frame_elem;
if (serialized_frame_elem) {
return serialized_frame_elem;
}
// No selected element, return focused element
return funcs.find_focused();
}; };
funcs.set_value = (id, value) => { funcs.set_value = (id, value) => {

View File

@ -321,6 +321,32 @@ Feature: Caret mode
- data/caret.html - data/caret.html
- data/hello.txt (active) - 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 :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 :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 :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 :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