mirror of
https://github.com/gorhill/uBlock.git
synced 2024-11-10 09:07:54 +01:00
Improve element picker/zapper's handling of shadow roots
Related issue: - https://github.com/uBlockOrigin/uBlock-issues/issues/1850
This commit is contained in:
parent
560c81a585
commit
9ee8e7b607
1 changed files with 19 additions and 14 deletions
|
@ -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' ) {
|
||||
|
|
Loading…
Reference in a new issue