Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: lib/content/snippets.js

Issue 29851644: Issue 6848 - Add searchSelector parameter to hide-if-contains snippet (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Patch Set: Created Aug. 9, 2018, 3:40 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/content/snippets.js
===================================================================
--- a/lib/content/snippets.js
+++ b/lib/content/snippets.js
@@ -92,17 +92,17 @@
*/
function makeInjector(injectable, ...dependencies)
{
return (...args) => injectCode(stringifyFunctionCall(injectable, ...args),
dependencies);
}
/**
- * Hides an HTML element by settings its <code>style</code> attribute to
+ * Hides an HTML element by setting its <code>style</code> attribute to
* <code>display: none !important</code>.
*
* @param {HTMLElement} element The HTML element to hide.
*/
function hideElement(element)
{
element.style.setProperty("display", "none", "important");
@@ -115,16 +115,39 @@
{
element.style.setProperty("display", "none", "important");
}
})
.observe(element, {attributes: true, attributeFilter: ["style"]});
}
/**
+ * Hides an HTML element or one of its ancestors matching a CSS selector by
+ * setting its <code>style</code> attribute to
+ * <code>display: none !important</code>.
+ *
+ * @param {HTMLElement} element The HTML element or a descendant of the HTML
+ * element to hide.
+ * @param {string} [selector] The CSS selector that the HTML element or one of
+ * its ancestors must match for it to be hidden.
+ */
+function hideAncestor(element, selector = "*")
+{
+ do
+ {
+ if (element.matches(selector))
hub 2018/08/10 12:30:41 Wouldn't https://developer.mozilla.org/en-US/docs/
Manish Jethani 2018/08/10 14:57:02 Ah, you're right. Element.closest is perfect. It'
hub 2018/08/10 19:54:57 We support EdgeHTML 16 and up if I read things cor
+ {
+ hideElement(element);
+ break;
+ }
+ }
+ while (element = element.parentElement);
+}
+
+/**
* Observes changes to a DOM node using a <code>MutationObserver</code>.
*
* @param {Node} target The DOM node to observe for changes.
* @param {MutationObserverInit?} [options] Options that describe what DOM
* mutations should be reported to the callback.
* @param {function} callback A function that will be called on each DOM
* mutation, taking a <code>MutationRecord</code> as its parameter.
*/
@@ -211,29 +234,17 @@
// shadow has been removed.
if (!host || !root)
return;
// If the shadow contains the given text, check if the host or one of its
// ancestors matches the selector; if a matching element is found, hide
// it.
if (root.textContent.includes(search))
- {
- let element = host;
-
- do
- {
- if (element.matches(selector))
- {
- hideElement(element);
- break;
- }
- }
- while (element = element.parentElement);
- }
+ hideAncestor(host, selector);
}
Object.defineProperty(Element.prototype, "attachShadow", {
value(...args)
{
// Create the shadow root first. It doesn't matter if it's a closed
// shadow root, we keep the reference in a weak map.
let root = originalAttachShadow.apply(this, args);
@@ -253,34 +264,40 @@
shadows.set(observer, {host: this, root});
return root;
}
});
}
exports["hide-if-shadow-contains"] = makeInjector(hideIfShadowContains,
- hideElement);
+ hideAncestor, hideElement);
/**
- * Hides any HTML element if the text content of the element contains a given
- * string.
+ * Hides any HTML element or one of its ancestors matching a CSS selector if
+ * the text content of the element contains a given string.
*
- * @param {string} search The string to look for in every HTML element.
+ * @param {string} search The string to look for in HTML elements.
* @param {string} selector The CSS selector that an HTML element must match
* for it to be hidden.
+ * @param {string?} [searchSelector] The CSS selector that an HTML element
+ * containing the given string must match. Defaults to the value of the
+ * <code>selector</code> argument.
*/
-function hideIfContains(search, selector = "*")
+function hideIfContains(search, selector = "*", searchSelector = null)
{
+ if (searchSelector == null)
+ searchSelector = selector;
+
new MutationObserver(() =>
{
- for (let element of document.querySelectorAll(selector))
+ for (let element of document.querySelectorAll(searchSelector))
{
if (element.textContent.includes(search))
- hideElement(element);
+ hideAncestor(element, selector);
}
})
.observe(document, {childList: true, characterData: true, subtree: true});
}
exports["hide-if-contains"] = hideIfContains;
/**
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld