Improve element picker/zapper's handling of shadow roots

Related issue:
- https://github.com/uBlockOrigin/uBlock-issues/issues/1850
This commit is contained in:
Raymond Hill 2022-01-07 08:54:23 -05:00
parent 560c81a585
commit 9ee8e7b607
No known key found for this signature in database
GPG key ID: 25E1490B761470C2

View file

@ -83,17 +83,18 @@ const getElementBoundingClientRect = function(elem) {
if ( rect.width !== 0 && rect.height !== 0 ) {
return rect;
}
if ( elem.shadowRoot instanceof DocumentFragment ) {
return getElementBoundingClientRect(elem.shadowRoot);
}
let left = rect.left,
right = rect.right,
right = left + rect.width,
top = rect.top,
bottom = rect.bottom;
bottom = top + rect.height;
for ( const child of elem.children ) {
rect = getElementBoundingClientRect(child);
if ( rect.width === 0 || rect.height === 0 ) {
continue;
}
if ( rect.width === 0 || rect.height === 0 ) { continue; }
if ( rect.left < left ) { left = rect.left; }
if ( rect.right > right ) { right = rect.right; }
if ( rect.top < top ) { top = rect.top; }
@ -101,8 +102,10 @@ const getElementBoundingClientRect = function(elem) {
}
return {
bottom,
height: bottom - top,
left,
right,
top,
width: right - left
};
@ -940,20 +943,22 @@ const zapElementAtPoint = function(mx, my, options) {
if ( elemToRemove instanceof Element === false ) { return; }
const getStyleValue = function(elem, prop) {
const getStyleValue = (elem, prop) => {
const style = window.getComputedStyle(elem);
return style ? style[prop] : '';
};
// Heuristic to detect scroll-locking: remove such lock when detected.
let maybeScrollLocked = false;
let elem = elemToRemove;
do {
maybeScrollLocked =
parseInt(getStyleValue(elem, 'zIndex'), 10) >= 1000 ||
getStyleValue(elem, 'position') === 'fixed';
elem = elem.parentElement;
} while ( elem !== null && maybeScrollLocked === false );
let maybeScrollLocked = elemToRemove.shadowRoot instanceof DocumentFragment;
if ( maybeScrollLocked === false ) {
let elem = elemToRemove;
do {
maybeScrollLocked =
parseInt(getStyleValue(elem, 'zIndex'), 10) >= 1000 ||
getStyleValue(elem, 'position') === 'fixed';
elem = elem.parentElement;
} while ( elem !== null && maybeScrollLocked === false );
}
if ( maybeScrollLocked ) {
const doc = document;
if ( getStyleValue(doc.body, 'overflowY') === 'hidden' ) {