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

Unified Diff: lib/content/elemHideEmulation.js

Issue 29613805: Issue 6034 - :-abp-contains() accept a regular expression (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore/
Patch Set: Fix a test breakage from previous change. Address jsdoc comment. Created Jan. 8, 2018, 5:53 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: lib/content/elemHideEmulation.js
===================================================================
--- a/lib/content/elemHideEmulation.js
+++ b/lib/content/elemHideEmulation.js
@@ -117,16 +117,34 @@
}
styles.sort();
return {
style: styles.join(" "),
subSelectors: splitSelector(rule.selectorText)
};
}
+/**
+ * Check if a text argument is a regexp.
+ * @param {string} text argument.
Manish Jethani 2018/01/09 07:53:02 This should be: @param {string} text the text a
hub 2018/01/09 18:33:06 Done.
+ * @return {?string} an unescaped RegExp string. null if it is not a
+ * regexp, ie not surrounded by '/'.
+ */
+function checkRegExpParameter(text)
+{
+ let regexpString = null;
+ if (text.length >= 2 && text[0] == "/" &&
+ text[text.length - 1] == "/")
+ {
+ regexpString = text.slice(1, -1)
+ .replace("\\7B ", "{").replace("\\7D ", "}");
Manish Jethani 2018/01/09 07:53:02 Why is this needed? If it's for legacy reasons, ma
hub 2018/01/09 18:33:06 We still want to have a valid CSS selector syntax.
Manish Jethani 2018/01/10 11:22:14 Acknowledged.
Manish Jethani 2018/01/16 12:00:22 Why does this have to be valid CSS selector syntax
+ }
+ return regexpString;
+}
+
function* evaluate(chain, index, prefix, subtree, styles)
{
if (index >= chain.length)
{
yield prefix;
return;
}
for (let [selector, element] of
@@ -219,54 +237,60 @@
}
yield null;
}
}
};
function ContainsSelector(textContent)
{
- this._text = textContent;
+ let regexpString = checkRegExpParameter(textContent);
+ if (regexpString)
+ this._regexp = new RegExp(regexpString);
Manish Jethani 2018/01/09 07:53:02 We have to consider what happens if the regular ex
lainverse 2018/01/09 10:49:22 I think it should be either "RegExp(regexpString,
+ else
+ this._text = textContent;
}
ContainsSelector.prototype = {
requiresHiding: true,
+ match(element)
+ {
+ if (this._regexp)
+ return this._regexp.test(element.textContent);
+
+ return element.textContent.includes(this._text);
lainverse 2018/01/09 10:49:22 I wasn't quite sure that "string.includes()" actua
hub 2018/01/09 18:33:06 I'll rewrite this part taking the comments above i
+ },
+
*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.includes(this._text))
+ if (this.match(element))
yield element;
else
yield null;
}
}
};
function PropsSelector(propertyExpression)
{
- let regexpString;
- if (propertyExpression.length >= 2 && propertyExpression[0] == "/" &&
- propertyExpression[propertyExpression.length - 1] == "/")
- {
- regexpString = propertyExpression.slice(1, -1)
- .replace("\\7B ", "{").replace("\\7D ", "}");
- }
- else
+ let regexpString = checkRegExpParameter(propertyExpression);
+ if (!regexpString)
regexpString = filterToRegExp(propertyExpression);
this._regexp = new RegExp(regexpString, "i");
}
PropsSelector.prototype = {
preferHideWithSelector: true,
dependsOnStyles: true,
« 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