Browse Source

less aggressive implementation of "remove hidden elements"

Gildas 7 years ago
parent
commit
07f2827354
1 changed files with 40 additions and 8 deletions
  1. 40 8
      lib/single-file/doc-helper.js

+ 40 - 8
lib/single-file/doc-helper.js

@@ -118,16 +118,48 @@ this.docHelper = this.docHelper || (() => {
 	}
 
 	function hiddenElement(element, ignoredTags) {
-		if (ignoredTags.includes(element.tagName)) {
-			return false;
-		} else {
-			let hidden = element.hidden || (element.style && (element.style.display == "none" || element.style.opacity == "0" || element.style.visibility == "hidden"));
-			if (!hidden) {
-				const boundingRect = element.getBoundingClientRect();
-				hidden = !boundingRect.width && !boundingRect.height;
+		let cacheElementsHidden = new Map();
+		let hidden = testHiddenElement(element, ignoredTags, cacheElementsHidden);
+		if (!hidden) {
+			let parentElement = element.parentElement;
+			if (parentElement) {
+				let parentElementHidden = testHiddenElement(parentElement, ignoredTags, cacheElementsHidden);
+				while (parentElement && !parentElementHidden) {
+					parentElement = parentElement.parentElement;
+					if (parentElement) {
+						parentElementHidden = testHiddenElement(parentElement, ignoredTags, cacheElementsHidden);
+					}
+				}
+				return parentElementHidden;
+			}
+		}
+		return hidden;
+	}
+
+	function testHiddenElement(element, ignoredTags, cacheElementsHidden) {
+		let hidden = cacheElementsHidden.get(element);
+		if (hidden === undefined) {
+			if (!ignoredTags.includes(element.tagName)) {
+				hidden = element.hidden;
+				if (!hidden) {
+					const elementStyle = element.style;
+					hidden = elementStyle && elementStyle.display == "none";
+					if (!hidden) {
+						const style = getComputedStyle(element);
+						if (style) {
+							hidden = style.display == "none";
+							if (!hidden && (style.opacity == "0" || style.visibility == "hidden")) {
+								const boundingRect = element.getBoundingClientRect();
+								hidden = !boundingRect.width && !boundingRect.height;
+							}
+						}
+					}
+				}
 			}
-			return hidden;
+			hidden = Boolean(hidden);
+			cacheElementsHidden.set(element, hidden);
 		}
+		return hidden;
 	}
 
 	function postProcessDoc(doc, options) {