Implement is_visible for same-origin frames
This commit is contained in:
parent
012e63520f
commit
8500509532
@ -55,6 +55,18 @@ window._qutebrowser.webelem = (function() {
|
|||||||
return frame.frameElement.getBoundingClientRect();
|
return frame.frameElement.getBoundingClientRect();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add an offset rect to a base rect, for use with frames
|
||||||
|
function add_offset_rect(base, offset) {
|
||||||
|
return {
|
||||||
|
"top": base.top + offset.top,
|
||||||
|
"left": base.left + offset.left,
|
||||||
|
"bottom": base.bottom + offset.top,
|
||||||
|
"right": base.right + offset.left,
|
||||||
|
"height": base.height,
|
||||||
|
"width": base.width,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
function get_caret_position(elem, frame) {
|
function get_caret_position(elem, frame) {
|
||||||
// With older Chromium versions (and QtWebKit), InvalidStateError will
|
// With older Chromium versions (and QtWebKit), InvalidStateError will
|
||||||
// be thrown if elem doesn't have selectionStart.
|
// be thrown if elem doesn't have selectionStart.
|
||||||
@ -126,14 +138,9 @@ window._qutebrowser.webelem = (function() {
|
|||||||
|
|
||||||
for (let k = 0; k < client_rects.length; ++k) {
|
for (let k = 0; k < client_rects.length; ++k) {
|
||||||
const rect = client_rects[k];
|
const rect = client_rects[k];
|
||||||
out.rects.push({
|
out.rects.push(
|
||||||
"top": rect.top + frame_offset_rect.top,
|
add_offset_rect(rect, frame_offset_rect)
|
||||||
"right": rect.right + frame_offset_rect.right,
|
);
|
||||||
"bottom": rect.bottom + frame_offset_rect.bottom,
|
|
||||||
"left": rect.left + frame_offset_rect.left,
|
|
||||||
"height": rect.height,
|
|
||||||
"width": rect.width,
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// console.log(JSON.stringify(out));
|
// console.log(JSON.stringify(out));
|
||||||
@ -141,9 +148,7 @@ window._qutebrowser.webelem = (function() {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
function is_visible(elem) {
|
function is_visible(elem, frame = null) {
|
||||||
// FIXME:qtwebengine Handle frames and iframes
|
|
||||||
|
|
||||||
// Adopted from vimperator:
|
// Adopted from vimperator:
|
||||||
// https://github.com/vimperator/vimperator-labs/blob/vimperator-3.14.0/common/content/hints.js#L259-L285
|
// https://github.com/vimperator/vimperator-labs/blob/vimperator-3.14.0/common/content/hints.js#L259-L285
|
||||||
// FIXME:qtwebengine we might need something more sophisticated like
|
// FIXME:qtwebengine we might need something more sophisticated like
|
||||||
@ -151,7 +156,8 @@ window._qutebrowser.webelem = (function() {
|
|||||||
// https://github.com/1995eaton/chromium-vim/blob/1.2.85/content_scripts/dom.js#L74-L134
|
// https://github.com/1995eaton/chromium-vim/blob/1.2.85/content_scripts/dom.js#L74-L134
|
||||||
|
|
||||||
const win = elem.ownerDocument.defaultView;
|
const win = elem.ownerDocument.defaultView;
|
||||||
let rect = elem.getBoundingClientRect();
|
const offset_rect = get_frame_offset(frame);
|
||||||
|
let rect = add_offset_rect(elem.getBoundingClientRect(), offset_rect);
|
||||||
|
|
||||||
if (!rect ||
|
if (!rect ||
|
||||||
rect.top > window.innerHeight ||
|
rect.top > window.innerHeight ||
|
||||||
@ -212,7 +218,8 @@ window._qutebrowser.webelem = (function() {
|
|||||||
const subelems = frame.document.
|
const subelems = frame.document.
|
||||||
querySelectorAll(selector);
|
querySelectorAll(selector);
|
||||||
for (let elem_num = 0; elem_num < subelems.length; ++elem_num) {
|
for (let elem_num = 0; elem_num < subelems.length; ++elem_num) {
|
||||||
if (!only_visible || is_visible(subelems[elem_num])) {
|
if (!only_visible ||
|
||||||
|
is_visible(subelems[elem_num], frame)) {
|
||||||
out.push(serialize_elem(subelems[elem_num], frame));
|
out.push(serialize_elem(subelems[elem_num], frame));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user