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

Unified Diff: lib/filterClasses.js

Issue 29375915: Issue 4878 - Start using ESLint for adblockpluscore (Closed)
Patch Set: Fixed valid-jsdoc failures and addressed nits Created March 10, 2017, 6:54 a.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 | « lib/events.js ('k') | lib/filterListener.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: lib/filterClasses.js
diff --git a/lib/filterClasses.js b/lib/filterClasses.js
index 8ef7869d34c8bc4cefc54f54854d3264ef64ac35..be6510ada7da753ec9c6e31ea3680cf14173ec6b 100644
--- a/lib/filterClasses.js
+++ b/lib/filterClasses.js
@@ -15,18 +15,20 @@
* along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
*/
+"use strict";
+
/**
* @fileOverview Definition of Filter class and its subclasses.
*/
-let {FilterNotifier} = require("filterNotifier");
-let {extend} = require("coreUtils");
-let {filterToRegExp} = require("common");
+const {FilterNotifier} = require("filterNotifier");
+const {extend} = require("coreUtils");
+const {filterToRegExp} = require("common");
/**
* Abstract base class for filters
*
- * @param {String} text string representation of the filter
+ * @param {string} text string representation of the filter
* @constructor
*/
function Filter(text)
@@ -40,19 +42,19 @@ Filter.prototype =
{
/**
* String representation of the filter
- * @type String
+ * @type {string}
*/
text: null,
/**
* Filter subscriptions the filter belongs to
- * @type Subscription[]
+ * @type {Subscription[]}
*/
subscriptions: null,
/**
* Filter type as a string, e.g. "blocking".
- * @type String
+ * @type {string}
*/
get type()
{
@@ -63,13 +65,13 @@ Filter.prototype =
* Serializes the filter to an array of strings for writing out on the disk.
* @param {string[]} buffer buffer to push the serialization results into
*/
- serialize: function(buffer)
+ serialize(buffer)
{
buffer.push("[Filter]");
buffer.push("text=" + this.text);
},
- toString: function()
+ toString()
{
return this.text;
}
@@ -77,31 +79,31 @@ Filter.prototype =
/**
* Cache for known filters, maps string representation to filter objects.
- * @type Object
+ * @type {Object}
*/
Filter.knownFilters = Object.create(null);
/**
* Regular expression that element hiding filters should match
- * @type RegExp
+ * @type {RegExp}
*/
-Filter.elemhideRegExp = /^([^\/\*\|\@"!]*?)#(\@)?(?:([\w\-]+|\*)((?:\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\))*)|#(.+))$/;
+Filter.elemhideRegExp = /^([^/*|@"!]*?)#(@)?(?:([\w-]+|\*)((?:\([\w-]+(?:[$^*]?=[^()"]*)?\))*)|#(.+))$/;
/**
* Regular expression that RegExp filters specified as RegExps should match
- * @type RegExp
+ * @type {RegExp}
*/
-Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)?$/;
+Filter.regexpRegExp = /^(@@)?\/.*\/(?:\$~?[\w-]+(?:=[^,\s]+)?(?:,~?[\w-]+(?:=[^,\s]+)?)*)?$/;
/**
* Regular expression that options on a RegExp filter should match
- * @type RegExp
+ * @type {RegExp}
*/
-Filter.optionsRegExp = /\$(~?[\w\-]+(?:=[^,\s]+)?(?:,~?[\w\-]+(?:=[^,\s]+)?)*)$/;
+Filter.optionsRegExp = /\$(~?[\w-]+(?:=[^,\s]+)?(?:,~?[\w-]+(?:=[^,\s]+)?)*)$/;
/**
- * Creates a filter of correct type from its text representation - does the basic parsing and
- * calls the right constructor then.
+ * Creates a filter of correct type from its text representation - does the
+ * basic parsing and calls the right constructor then.
*
- * @param {String} text as in Filter()
+ * @param {string} text as in Filter()
* @return {Filter}
*/
Filter.fromText = function(text)
@@ -110,9 +112,13 @@ Filter.fromText = function(text)
return Filter.knownFilters[text];
let ret;
- let match = (text.indexOf("#") >= 0 ? Filter.elemhideRegExp.exec(text) : null);
+ let match = (text.includes("#") ? Filter.elemhideRegExp.exec(text) : null);
if (match)
- ret = ElemHideBase.fromText(text, match[1], !!match[2], match[3], match[4], match[5]);
+ {
+ ret = ElemHideBase.fromText(
+ text, match[1], !!match[2], match[3], match[4], match[5]
+ );
+ }
else if (text[0] == "!")
ret = new CommentFilter(text);
else
@@ -136,9 +142,9 @@ Filter.fromObject = function(obj)
if ("disabled" in obj)
ret._disabled = (obj.disabled == "true");
if ("hitCount" in obj)
- ret._hitCount = parseInt(obj.hitCount) || 0;
+ ret._hitCount = parseInt(obj.hitCount, 10) || 0;
if ("lastHit" in obj)
- ret._lastHit = parseInt(obj.lastHit) || 0;
+ ret._lastHit = parseInt(obj.lastHit, 10) || 0;
}
return ret;
};
@@ -146,8 +152,10 @@ Filter.fromObject = function(obj)
/**
* Removes unnecessary whitespaces from filter text, will only return null if
* the input parameter is null.
+ * @param {string} text
+ * @return {string}
*/
-Filter.normalize = function(/**String*/ text) /**String*/
+Filter.normalize = function(text)
{
if (!text)
return text;
@@ -162,12 +170,12 @@ Filter.normalize = function(/**String*/ text) /**String*/
}
else if (Filter.elemhideRegExp.test(text))
{
- // Special treatment for element hiding filters, right side is allowed to contain spaces
- let [, domain, separator, selector] = /^(.*?)(#\@?#?)(.*)$/.exec(text);
+ // Special treatment for element hiding filters, right side is allowed to
+ // contain spaces
+ let [, domain, separator, selector] = /^(.*?)(#@?#?)(.*)$/.exec(text);
return domain.replace(/\s/g, "") + separator + selector.trim();
}
- else
- return text.replace(/\s/g, "");
+ return text.replace(/\s/g, "");
};
/**
@@ -177,8 +185,8 @@ Filter.toRegExp = filterToRegExp;
/**
* Class for invalid filters
- * @param {String} text see Filter()
- * @param {String} reason Reason why this filter is invalid
+ * @param {string} text see Filter()
+ * @param {string} reason Reason why this filter is invalid
* @constructor
* @augments Filter
*/
@@ -195,19 +203,20 @@ InvalidFilter.prototype = extend(Filter, {
/**
* Reason why this filter is invalid
- * @type String
+ * @type {string}
*/
reason: null,
/**
* See Filter.serialize()
+ * @inheritdoc
*/
- serialize: function(buffer) {}
+ serialize(buffer) {}
});
/**
* Class for comments
- * @param {String} text see Filter()
+ * @param {string} text see Filter()
* @constructor
* @augments Filter
*/
@@ -222,14 +231,18 @@ CommentFilter.prototype = extend(Filter, {
/**
* See Filter.serialize()
+ * @inheritdoc
*/
- serialize: function(buffer) {}
+ serialize(buffer) {}
});
/**
* Abstract base class for filters that can get hits
- * @param {String} text see Filter()
- * @param {String} [domains] Domains that the filter is restricted to separated by domainSeparator e.g. "foo.com|bar.com|~baz.com"
+ * @param {string} text
+ * see Filter()
+ * @param {string} [domains]
+ * Domains that the filter is restricted to separated by domainSeparator
+ * e.g. "foo.com|bar.com|~baz.com"
* @constructor
* @augments Filter
*/
@@ -248,7 +261,7 @@ ActiveFilter.prototype = extend(Filter, {
/**
* Defines whether the filter is disabled
- * @type Boolean
+ * @type {boolean}
*/
get disabled()
{
@@ -267,7 +280,7 @@ ActiveFilter.prototype = extend(Filter, {
/**
* Number of hits on the filter since the last reset
- * @type Number
+ * @type {number}
*/
get hitCount()
{
@@ -285,8 +298,9 @@ ActiveFilter.prototype = extend(Filter, {
},
/**
- * Last time the filter had a hit (in milliseconds since the beginning of the epoch)
- * @type Number
+ * Last time the filter had a hit (in milliseconds since the beginning of the
+ * epoch)
+ * @type {number}
*/
get lastHit()
{
@@ -305,33 +319,35 @@ ActiveFilter.prototype = extend(Filter, {
/**
* String that the domains property should be generated from
- * @type String
+ * @type {string}
*/
domainSource: null,
/**
- * Separator character used in domainSource property, must be overridden by subclasses
- * @type String
+ * Separator character used in domainSource property, must be
+ * overridden by subclasses
+ * @type {string}
*/
domainSeparator: null,
/**
* Determines whether the trailing dot in domain names isn't important and
* should be ignored, must be overridden by subclasses.
- * @type Boolean
+ * @type {boolean}
*/
ignoreTrailingDot: true,
/**
* Determines whether domainSource is already upper-case,
* can be overridden by subclasses.
- * @type Boolean
+ * @type {boolean}
*/
domainSourceIsUpperCase: false,
/**
- * Map containing domains that this filter should match on/not match on or null if the filter should match on all domains
- * @type Object
+ * Map containing domains that this filter should match on/not match
+ * on or null if the filter should match on all domains
+ * @type {Object}
*/
get domains()
{
@@ -346,7 +362,8 @@ ActiveFilter.prototype = extend(Filter, {
if (this.domainSource)
{
let source = this.domainSource;
- if (!this.domainSourceIsUpperCase) {
+ if (!this.domainSourceIsUpperCase)
+ {
// RegExpFilter already have uppercase domains
source = source.toUpperCase();
}
@@ -401,28 +418,33 @@ ActiveFilter.prototype = extend(Filter, {
/**
* Array containing public keys of websites that this filter should apply to
- * @type string[]
+ * @type {string[]}
*/
sitekeys: null,
/**
* Checks whether this filter is active on a domain.
- * @param {String} docDomain domain name of the document that loads the URL
- * @param {String} [sitekey] public key provided by the document
- * @return {Boolean} true in case of the filter being active
+ * @param {string} docDomain domain name of the document that loads the URL
+ * @param {string} [sitekey] public key provided by the document
+ * @return {boolean} true in case of the filter being active
*/
- isActiveOnDomain: function(docDomain, sitekey)
+ isActiveOnDomain(docDomain, sitekey)
{
- // Sitekeys are case-sensitive so we shouldn't convert them to upper-case to avoid false
- // positives here. Instead we need to change the way filter options are parsed.
- if (this.sitekeys && (!sitekey || this.sitekeys.indexOf(sitekey.toUpperCase()) < 0))
+ // Sitekeys are case-sensitive so we shouldn't convert them to
+ // upper-case to avoid false positives here. Instead we need to
+ // change the way filter options are parsed.
+ if (this.sitekeys &&
+ (!sitekey || this.sitekeys.indexOf(sitekey.toUpperCase()) < 0))
+ {
return false;
+ }
// If no domains are set the rule matches everywhere
if (!this.domains)
return true;
- // If the document has no host name, match only if the filter isn't restricted to specific domains
+ // If the document has no host name, match only if the filter
+ // isn't restricted to specific domains
if (!docDomain)
return this.domains[""];
@@ -445,8 +467,10 @@ ActiveFilter.prototype = extend(Filter, {
/**
* Checks whether this filter is active only on a domain and its subdomains.
+ * @param {string} docDomain
+ * @return {boolean}
*/
- isActiveOnlyOnDomain: function(/**String*/ docDomain) /**Boolean*/
+ isActiveOnlyOnDomain(docDomain)
{
if (!docDomain || !this.domains || this.domains[""])
return false;
@@ -456,16 +480,25 @@ ActiveFilter.prototype = extend(Filter, {
docDomain = docDomain.toUpperCase();
for (let domain in this.domains)
- if (this.domains[domain] && domain != docDomain && (domain.length <= docDomain.length || domain.indexOf("." + docDomain) != domain.length - docDomain.length - 1))
- return false;
+ {
+ if (this.domains[domain] && domain != docDomain)
+ {
+ if (domain.length <= docDomain.length)
+ return false;
+
+ if (!domain.endsWith("." + docDomain))
+ return false;
+ }
+ }
return true;
},
/**
* Checks whether this filter is generic or specific
+ * @return {boolean}
*/
- isGeneric: function() /**Boolean*/
+ isGeneric()
{
return !(this.sitekeys && this.sitekeys.length) &&
(!this.domains || this.domains[""]);
@@ -473,8 +506,9 @@ ActiveFilter.prototype = extend(Filter, {
/**
* See Filter.serialize()
+ * @inheritdoc
*/
- serialize: function(buffer)
+ serialize(buffer)
{
if (this._disabled || this._hitCount || this._lastHit)
{
@@ -491,17 +525,27 @@ ActiveFilter.prototype = extend(Filter, {
/**
* Abstract base class for RegExp-based filters
- * @param {String} text see Filter()
- * @param {String} regexpSource filter part that the regular expression should be build from
- * @param {Number} [contentType] Content types the filter applies to, combination of values from RegExpFilter.typeMap
- * @param {Boolean} [matchCase] Defines whether the filter should distinguish between lower and upper case letters
- * @param {String} [domains] Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com"
- * @param {Boolean} [thirdParty] Defines whether the filter should apply to third-party or first-party content only
- * @param {String} [sitekeys] Public keys of websites that this filter should apply to
+ * @param {string} text see Filter()
+ * @param {string} regexpSource
+ * filter part that the regular expression should be build from
+ * @param {number} [contentType]
+ * Content types the filter applies to, combination of values from
+ * RegExpFilter.typeMap
+ * @param {boolean} [matchCase]
+ * Defines whether the filter should distinguish between lower and upper case
+ * letters
+ * @param {string} [domains]
+ * Domains that the filter is restricted to, e.g. "foo.com|bar.com|~baz.com"
+ * @param {boolean} [thirdParty]
+ * Defines whether the filter should apply to third-party or first-party
+ * content only
+ * @param {string} [sitekeys]
+ * Public keys of websites that this filter should apply to
* @constructor
* @augments ActiveFilter
*/
-function RegExpFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys)
+function RegExpFilter(text, regexpSource, contentType, matchCase, domains,
+ thirdParty, sitekeys)
{
ActiveFilter.call(this, text, domains, sitekeys);
@@ -514,10 +558,14 @@ function RegExpFilter(text, regexpSource, contentType, matchCase, domains, third
if (sitekeys != null)
this.sitekeySource = sitekeys;
- if (regexpSource.length >= 2 && regexpSource[0] == "/" && regexpSource[regexpSource.length - 1] == "/")
+ if (regexpSource.length >= 2 &&
+ regexpSource[0] == "/" &&
+ regexpSource[regexpSource.length - 1] == "/")
{
- // The filter is a regular expression - convert it immediately to catch syntax errors
- let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2), this.matchCase ? "" : "i");
+ // The filter is a regular expression - convert it immediately to
+ // catch syntax errors
+ let regexp = new RegExp(regexpSource.substr(1, regexpSource.length - 2),
+ this.matchCase ? "" : "i");
Object.defineProperty(this, "regexp", {value: regexp});
}
else
@@ -535,8 +583,9 @@ RegExpFilter.prototype = extend(ActiveFilter, {
domainSourceIsUpperCase: true,
/**
- * Number of filters contained, will always be 1 (required to optimize Matcher).
- * @type Integer
+ * Number of filters contained, will always be 1 (required to
+ * optimize Matcher).
+ * @type {number}
*/
length: 1,
@@ -546,13 +595,14 @@ RegExpFilter.prototype = extend(ActiveFilter, {
domainSeparator: "|",
/**
- * Expression from which a regular expression should be generated - for delayed creation of the regexp property
- * @type String
+ * Expression from which a regular expression should be generated -
+ * for delayed creation of the regexp property
+ * @type {string}
*/
regexpSource: null,
/**
* Regular expression to be used when testing against this filter
- * @type RegExp
+ * @type {RegExp}
*/
get regexp()
{
@@ -568,30 +618,33 @@ RegExpFilter.prototype = extend(ActiveFilter, {
return regexp;
},
/**
- * Content types the filter applies to, combination of values from RegExpFilter.typeMap
- * @type Number
+ * Content types the filter applies to, combination of values from
+ * RegExpFilter.typeMap
+ * @type {number}
*/
contentType: 0x7FFFFFFF,
/**
- * Defines whether the filter should distinguish between lower and upper case letters
- * @type Boolean
+ * Defines whether the filter should distinguish between lower and
+ * upper case letters
+ * @type {boolean}
*/
matchCase: false,
/**
- * Defines whether the filter should apply to third-party or first-party content only. Can be null (apply to all content).
- * @type Boolean
+ * Defines whether the filter should apply to third-party or
+ * first-party content only. Can be null (apply to all content).
+ * @type {boolean}
*/
thirdParty: null,
/**
* String that the sitekey property should be generated from
- * @type String
+ * @type {string}
*/
sitekeySource: null,
/**
* Array containing public keys of websites that this filter should apply to
- * @type string[]
+ * @type {string[]}
*/
get sitekeys()
{
@@ -609,20 +662,23 @@ RegExpFilter.prototype = extend(ActiveFilter, {
this.sitekeySource = null;
}
- Object.defineProperty(this, "sitekeys", {value: sitekeys, enumerable: true});
+ Object.defineProperty(
+ this, "sitekeys", {value: sitekeys, enumerable: true}
+ );
return this.sitekeys;
},
/**
* Tests whether the URL matches this filter
- * @param {String} location URL to be tested
+ * @param {string} location URL to be tested
* @param {number} typeMask bitmask of content / request types to match
- * @param {String} docDomain domain name of the document that loads the URL
- * @param {Boolean} thirdParty should be true if the URL is a third-party request
- * @param {String} sitekey public key provided by the document
- * @return {Boolean} true in case of a match
+ * @param {string} docDomain domain name of the document that loads the URL
+ * @param {boolean} thirdParty should be true if the URL is a third-party
+ * request
+ * @param {string} sitekey public key provided by the document
+ * @return {boolean} true in case of a match
*/
- matches: function(location, typeMask, docDomain, thirdParty, sitekey)
+ matches(location, typeMask, docDomain, thirdParty, sitekey)
{
if (this.contentType & typeMask &&
(this.thirdParty == null || this.thirdParty == thirdParty) &&
@@ -630,20 +686,19 @@ RegExpFilter.prototype = extend(ActiveFilter, {
{
return true;
}
-
return false;
}
});
// Required to optimize Matcher, see also RegExpFilter.prototype.length
-Object.defineProperty(RegExpFilter.prototype, "0",
-{
- get: function() { return this; }
+Object.defineProperty(RegExpFilter.prototype, "0", {
+ get() { return this; }
});
/**
* Creates a RegExp filter from its text representation
- * @param {String} text same as in Filter()
+ * @param {string} text same as in Filter()
+ * @return {Filter}
*/
RegExpFilter.fromText = function(text)
{
@@ -686,7 +741,7 @@ RegExpFilter.fromText = function(text)
else if (option[0] == "~" && option.substr(1) in RegExpFilter.typeMap)
{
if (contentType == null)
- contentType = RegExpFilter.prototype.contentType;
+ ({contentType} = RegExpFilter.prototype);
contentType &= ~RegExpFilter.typeMap[option.substr(1)];
}
else if (option == "MATCH_CASE")
@@ -713,9 +768,12 @@ RegExpFilter.fromText = function(text)
try
{
if (blocking)
- return new BlockingFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys, collapse);
- else
- return new WhitelistFilter(origText, text, contentType, matchCase, domains, thirdParty, sitekeys);
+ {
+ return new BlockingFilter(origText, text, contentType, matchCase, domains,
+ thirdParty, sitekeys, collapse);
+ }
+ return new WhitelistFilter(origText, text, contentType, matchCase, domains,
+ thirdParty, sitekeys);
}
catch (e)
{
@@ -761,20 +819,23 @@ RegExpFilter.prototype.contentType &= ~(RegExpFilter.typeMap.DOCUMENT |
/**
* Class for blocking filters
- * @param {String} text see Filter()
- * @param {String} regexpSource see RegExpFilter()
- * @param {Number} contentType see RegExpFilter()
- * @param {Boolean} matchCase see RegExpFilter()
- * @param {String} domains see RegExpFilter()
- * @param {Boolean} thirdParty see RegExpFilter()
- * @param {String} sitekeys see RegExpFilter()
- * @param {Boolean} collapse defines whether the filter should collapse blocked content, can be null
+ * @param {string} text see Filter()
+ * @param {string} regexpSource see RegExpFilter()
+ * @param {number} contentType see RegExpFilter()
+ * @param {boolean} matchCase see RegExpFilter()
+ * @param {string} domains see RegExpFilter()
+ * @param {boolean} thirdParty see RegExpFilter()
+ * @param {string} sitekeys see RegExpFilter()
+ * @param {boolean} collapse
+ * defines whether the filter should collapse blocked content, can be null
* @constructor
* @augments RegExpFilter
*/
-function BlockingFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys, collapse)
+function BlockingFilter(text, regexpSource, contentType, matchCase, domains,
+ thirdParty, sitekeys, collapse)
{
- RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys);
+ RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains,
+ thirdParty, sitekeys);
this.collapse = collapse;
}
@@ -784,27 +845,30 @@ BlockingFilter.prototype = extend(RegExpFilter, {
type: "blocking",
/**
- * Defines whether the filter should collapse blocked content. Can be null (use the global preference).
- * @type Boolean
+ * Defines whether the filter should collapse blocked content.
+ * Can be null (use the global preference).
+ * @type {boolean}
*/
collapse: null
});
/**
* Class for whitelist filters
- * @param {String} text see Filter()
- * @param {String} regexpSource see RegExpFilter()
- * @param {Number} contentType see RegExpFilter()
- * @param {Boolean} matchCase see RegExpFilter()
- * @param {String} domains see RegExpFilter()
- * @param {Boolean} thirdParty see RegExpFilter()
- * @param {String} sitekeys see RegExpFilter()
+ * @param {string} text see Filter()
+ * @param {string} regexpSource see RegExpFilter()
+ * @param {number} contentType see RegExpFilter()
+ * @param {boolean} matchCase see RegExpFilter()
+ * @param {string} domains see RegExpFilter()
+ * @param {boolean} thirdParty see RegExpFilter()
+ * @param {string} sitekeys see RegExpFilter()
* @constructor
* @augments RegExpFilter
*/
-function WhitelistFilter(text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys)
+function WhitelistFilter(text, regexpSource, contentType, matchCase, domains,
+ thirdParty, sitekeys)
{
- RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains, thirdParty, sitekeys);
+ RegExpFilter.call(this, text, regexpSource, contentType, matchCase, domains,
+ thirdParty, sitekeys);
}
exports.WhitelistFilter = WhitelistFilter;
@@ -814,9 +878,11 @@ WhitelistFilter.prototype = extend(RegExpFilter, {
/**
* Base class for element hiding filters
- * @param {String} text see Filter()
- * @param {String} [domains] Host names or domains the filter should be restricted to
- * @param {String} selector CSS selector for the HTML elements that should be hidden
+ * @param {string} text see Filter()
+ * @param {string} [domains] Host names or domains the filter should be
+ * restricted to
+ * @param {string} selector CSS selector for the HTML elements that should be
+ * hidden
* @constructor
* @augments ActiveFilter
*/
@@ -825,7 +891,10 @@ function ElemHideBase(text, domains, selector)
ActiveFilter.call(this, text, domains || null);
if (domains)
- this.selectorDomain = domains.replace(/,~[^,]+/g, "").replace(/^~[^,]+,?/, "").toLowerCase();
+ {
+ this.selectorDomain = domains.replace(/,~[^,]+/g, "")
+ .replace(/^~[^,]+,?/, "").toLowerCase();
+ }
// Braces are being escaped to prevent CSS rule injection.
this.selector = selector.replace("{", "\\x7B ").replace("}", "\\x7D ");
@@ -844,13 +913,14 @@ ElemHideBase.prototype = extend(ActiveFilter, {
ignoreTrailingDot: false,
/**
- * Host name or domain the filter should be restricted to (can be null for no restriction)
- * @type String
+ * Host name or domain the filter should be restricted to (can be null for
+ * no restriction)
+ * @type {string}
*/
selectorDomain: null,
/**
* CSS selector for the HTML elements that should be hidden
- * @type String
+ * @type {string}
*/
selector: null
});
@@ -858,15 +928,18 @@ ElemHideBase.prototype = extend(ActiveFilter, {
/**
* 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)
- * @param {String} attrRules attribute matching rules (can be empty)
- * @param {String} selector raw CSS selector (can be empty)
- * @return {ElemHideFilter|ElemHideException|ElemHideEmulationFilter|InvalidFilter}
+ * @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)
+ * @param {string} attrRules attribute matching rules (can be empty)
+ * @param {string} selector raw CSS selector (can be empty)
+ * @return {ElemHideFilter|ElemHideException|
+ * ElemHideEmulationFilter|InvalidFilter}
*/
-ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules, selector)
+ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules,
+ selector)
{
if (!selector)
{
@@ -877,7 +950,7 @@ ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules,
let additional = "";
if (attrRules)
{
- attrRules = attrRules.match(/\([\w\-]+(?:[$^*]?=[^\(\)"]*)?\)/g);
+ attrRules = attrRules.match(/\([\w-]+(?:[$^*]?=[^()"]*)?\)/g);
for (let rule of attrRules)
{
rule = rule.substr(1, rule.length - 2);
@@ -898,7 +971,7 @@ ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules,
}
if (id)
- selector = tagName + "." + id + additional + "," + tagName + "#" + id + additional;
+ selector = `${tagName}.${id}${additional},${tagName}#${id}${additional}`;
else if (tagName || additional)
selector = tagName + additional;
else
@@ -929,9 +1002,9 @@ ElemHideBase.fromText = function(text, domain, isException, tagName, attrRules,
/**
* Class for element hiding filters
- * @param {String} text see Filter()
- * @param {String} domains see ElemHideBase()
- * @param {String} selector see ElemHideBase()
+ * @param {string} text see Filter()
+ * @param {string} domains see ElemHideBase()
+ * @param {string} selector see ElemHideBase()
* @constructor
* @augments ElemHideBase
*/
@@ -947,9 +1020,9 @@ ElemHideFilter.prototype = extend(ElemHideBase, {
/**
* Class for element hiding exceptions
- * @param {String} text see Filter()
- * @param {String} domains see ElemHideBase()
- * @param {String} selector see ElemHideBase()
+ * @param {string} text see Filter()
+ * @param {string} domains see ElemHideBase()
+ * @param {string} selector see ElemHideBase()
* @constructor
* @augments ElemHideBase
*/
@@ -965,9 +1038,9 @@ ElemHideException.prototype = extend(ElemHideBase, {
/**
* Class for element hiding emulation filters
- * @param {String} text see Filter()
- * @param {String} domains see ElemHideBase()
- * @param {String} selector see ElemHideBase()
+ * @param {string} text see Filter()
+ * @param {string} domains see ElemHideBase()
+ * @param {string} selector see ElemHideBase()
* @constructor
* @augments ElemHideBase
*/
« no previous file with comments | « lib/events.js ('k') | lib/filterListener.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld