From c9a3ffe1c5bb8a3158b5e4422c0d3f61514c20f0 Mon Sep 17 00:00:00 2001 From: Maxim Baz Date: Thu, 11 Apr 2019 21:59:28 +0200 Subject: [PATCH] Handle fields hidden with an opacity rule (#85) --- src/inject.js | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/inject.js b/src/inject.js index d217d0ec..c9b3435e 100644 --- a/src/inject.js +++ b/src/inject.js @@ -224,11 +224,11 @@ * @return array List of search results */ function queryAllVisible(parent, field, form) { - var result = []; - for (var i = 0; i < field.selectors.length; i++) { - var elems = parent.querySelectorAll(field.selectors[i]); - for (var j = 0; j < elems.length; j++) { - var elem = elems[j]; + const result = []; + for (let i = 0; i < field.selectors.length; i++) { + let elems = parent.querySelectorAll(field.selectors[i]); + for (let j = 0; j < elems.length; j++) { + let elem = elems[j]; // Select only elements from specified form if (form && form != elem.form) { continue; @@ -247,12 +247,12 @@ continue; } // Elem takes space on the screen, but it or its parent is hidden with a visibility style. - var style = window.getComputedStyle(elem); + let style = window.getComputedStyle(elem); if (style.visibility == "hidden") { continue; } // Elem is outside of the boundaries of the visible viewport. - var rect = elem.getBoundingClientRect(); + let rect = elem.getBoundingClientRect(); if ( rect.x + rect.width < 0 || rect.y + rect.height < 0 || @@ -260,6 +260,22 @@ ) { continue; } + // Elem is hidden by its or or its parent's opacity rules + const OPACITY_LIMIT = 0.1; + let opacity = 1; + for ( + let testElem = elem; + opacity >= OPACITY_LIMIT && testElem && testElem.nodeType === Node.ELEMENT_NODE; + testElem = testElem.parentNode + ) { + let style = window.getComputedStyle(testElem); + if (style.opacity) { + opacity *= parseFloat(style.opacity); + } + } + if (opacity < OPACITY_LIMIT) { + continue; + } // This element is visible, will use it. result.push(elem); }