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

Unified Diff: chrome/content/elemHideEmulation.js

Issue 29448560: Issue 5249 - Implement :-abp-contains() (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Patch Set: Rebased on patch for issue 3143. Created June 1, 2017, 6:29 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 | test/browser/elemHideEmulation.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/content/elemHideEmulation.js
===================================================================
--- a/chrome/content/elemHideEmulation.js
+++ b/chrome/content/elemHideEmulation.js
@@ -164,16 +164,21 @@
else if (match[1] == "has")
{
let hasSelector = new HasSelector(content.text);
if (!hasSelector.valid())
return {selectors: null, hide: false};
selectors.push(hasSelector);
hide = true;
}
+ else if (match[1] == "contains")
+ {
+ selectors.push(new ContainsSelector(content.text));
+ hide = true;
+ }
else
{
// this is an error, can't parse selector.
console.error(new SyntaxError("Failed parsing AdBlock Plus " +
`selector ${selector}, invalid ` +
`pseudo-class -abp-${match[1]}().`));
return {selectors: null, hide: false};
}
@@ -276,16 +281,40 @@
// we insert a space between the two. It becomes a no-op if selector
// doesn't have a combinator
if (subtree.querySelector(selector))
yield element;
}
}
};
+function ContainsSelector(textContent)
+{
+ this._text = textContent;
+}
+
+ContainsSelector.prototype = {
+
+ *getSelectors(prefix, subtree, stylesheet)
+ {
+ for (let element of this.getElements(prefix, subtree, stylesheet))
+ yield [makeSelector(element, ""), subtree];
+ },
+
+ *getElements(prefix, subtree, stylesheet)
+ {
+ let actualPrefix = (!prefix || incompletePrefixRegexp.test(prefix)) ?
+ prefix + "*" : prefix;
+ let elements = subtree.querySelectorAll(actualPrefix);
+ for (let element of elements)
+ if (element.textContent == this._text)
+ yield element;
+ }
+};
+
function PropsSelector(propertyExpression)
{
let regexpString;
if (propertyExpression.length >= 2 && propertyExpression[0] == "/" &&
propertyExpression[propertyExpression.length - 1] == "/")
{
regexpString = propertyExpression.slice(1, -1)
.replace("\\x7B ", "{").replace("\\x7D ", "}");
« no previous file with comments | « no previous file | test/browser/elemHideEmulation.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld