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: Added test for :-abp-contains Created June 21, 2017, 9:38 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') | test/browser/elemHideEmulation.js » ('J')
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
@@ -225,16 +225,41 @@
// 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 = {
+ requiresHiding: true,
+
+ *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)
Wladimir Palant 2017/06/28 10:47:24 An exact match is definitely not what we want here
hub 2017/06/28 14:39:10 Done.
+ 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 ", "}");
@@ -318,16 +343,18 @@
selectors.push(new PropsSelector(content.text));
else if (match[1] == "has")
{
let hasSelectors = this.parseSelector(content.text);
if (hasSelectors == null)
return null;
selectors.push(new HasSelector(hasSelectors));
}
+ else if (match[1] == "contains")
+ selectors.push(new ContainsSelector(content.text));
else
{
// this is an error, can't parse selector.
this.window.console.error(
new SyntaxError("Failed to parse Adblock Plus " +
`selector ${selector}, invalid ` +
`pseudo-class :-abp-${match[1]}().`));
return null;
« no previous file with comments | « no previous file | test/browser/elemHideEmulation.js » ('j') | test/browser/elemHideEmulation.js » ('J')

Powered by Google App Engine
This is Rietveld