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

Unified Diff: lib/filterClasses.js

Issue 29383960: Issue 3143 - Filter elements with :-abp-has() (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore
Patch Set: Non regexp based parser. Created May 3, 2017, 9:24 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 | « chrome/content/elemHideEmulation.js ('k') | test/browser/elemHideEmulation.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/filterClasses.js
===================================================================
--- a/lib/filterClasses.js
+++ b/lib/filterClasses.js
@@ -921,16 +921,18 @@
selectorDomain: null,
/**
* CSS selector for the HTML elements that should be hidden
* @type {string}
*/
selector: null
});
+var abpSelectorRegExp = /\[-abp-selector=(["'])(.+)\1\]/;
+
/**
* Creates an element hiding filter from a pre-parsed text representation
*
* @param {string} text same as in Filter()
* @param {string} domain
* domain part of the text representation (can be empty)
* @param {boolean} isException exception rule indicator
* @param {string} tagName tag name part (can be empty)
@@ -983,23 +985,32 @@
// Note: The ElemHide.prototype.domainSeparator is duplicated here, if that
// changes this must be changed too.
if (domain && /(^|,)~?(,|$)/.test(domain))
return new InvalidFilter(text, "filter_invalid_domain");
if (isException)
return new ElemHideException(text, domain, selector);
- if (selector.indexOf("[-abp-properties=") != -1)
+ if ((selector.indexOf("[-abp-properties=") != -1) ||
+ (selector.indexOf("[-abp-selector=") != -1))
{
// Element hiding emulation filters are inefficient so we need to make sure
// that they're only applied if they specify active domains
if (!/,[^~][^,.]*\.[^,]/.test("," + domain))
return new InvalidFilter(text, "filter_elemhideemulation_nodomain");
+ var match = abpSelectorRegExp.exec(selector);
+ if (match)
+ {
+ var prefix = selector.substr(0, match.index).trim();
+ var suffix = selector.substr(match.index + match[0].length).trim();
+ var unwrappedSelector = prefix + match[2] + suffix;
+ return new ElemHideEmulationFilter(text, domain, unwrappedSelector);
+ }
return new ElemHideEmulationFilter(text, domain, selector);
}
return new ElemHideFilter(text, domain, selector);
};
/**
* Class for element hiding filters
« no previous file with comments | « chrome/content/elemHideEmulation.js ('k') | test/browser/elemHideEmulation.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld