| 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; |