From 38cecddcd18892fc48b407f1bf94d466305e1e35 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Wed, 18 Nov 2020 14:11:36 -0500 Subject: [PATCH] Improve zapper's detection of scroll-locked documents --- src/js/scriptlets/epicker.js | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/src/js/scriptlets/epicker.js b/src/js/scriptlets/epicker.js index f0b37e3e6..02f625225 100644 --- a/src/js/scriptlets/epicker.js +++ b/src/js/scriptlets/epicker.js @@ -921,12 +921,12 @@ const zapElementAtPoint = function(mx, my, options) { return; } - let elem = targetElements.length !== 0 && targetElements[0] || null; - if ( elem === null && mx !== undefined ) { - elem = elementFromPoint(mx, my); + let elemToRemove = targetElements.length !== 0 && targetElements[0] || null; + if ( elemToRemove === null && mx !== undefined ) { + elemToRemove = elementFromPoint(mx, my); } - if ( elem instanceof Element === false ) { return; } + if ( elemToRemove instanceof Element === false ) { return; } const getStyleValue = function(elem, prop) { const style = window.getComputedStyle(elem); @@ -934,23 +934,30 @@ const zapElementAtPoint = function(mx, my, options) { }; // Heuristic to detect scroll-locking: remove such lock when detected. - if ( - parseInt(getStyleValue(elem, 'zIndex'), 10) >= 1000 || - getStyleValue(elem, 'position') === 'fixed' - ) { + 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 ); + if ( maybeScrollLocked ) { const doc = document; if ( getStyleValue(doc.body, 'overflowY') === 'hidden' ) { doc.body.style.setProperty('overflow', 'auto', 'important'); } if ( getStyleValue(doc.body, 'position') === 'fixed' ) { - doc.body.style.setProperty('position', 'static', 'important'); + doc.body.style.setProperty('position', 'initial', 'important'); + } + if ( getStyleValue(doc.documentElement, 'position') === 'fixed' ) { + doc.documentElement.style.setProperty('position', 'initial', 'important'); } if ( getStyleValue(doc.documentElement, 'overflowY') === 'hidden' ) { doc.documentElement.style.setProperty('overflow', 'auto', 'important'); } } - - elem.remove(); + elemToRemove.remove(); highlightElementAtPoint(mx, my); };