Index: lib/filterClasses.js |
=================================================================== |
--- a/lib/filterClasses.js |
+++ b/lib/filterClasses.js |
@@ -126,16 +126,27 @@ |
if (domains) |
domains.set("", !hasIncludes); |
} |
return domains; |
} |
/** |
+ * Checks whether the given filter object should be cached in |
+ * <code>{@link Filter.knownFilters}</code> based on properties of the object. |
+ * @param {Filter} filter |
+ * @returns {boolean} |
+ */ |
+function shouldCacheFilter(filter) |
+{ |
+ return !(filter instanceof ElemHideFilter); |
+} |
+ |
+/** |
* Abstract base class for filters |
* |
* @param {string} text string representation of the filter |
* @constructor |
*/ |
function Filter(text) |
{ |
this.text = text; |
@@ -206,19 +217,21 @@ |
*/ |
Filter.invalidCSPRegExp = /(;|^) ?(base-uri|referrer|report-to|report-uri|upgrade-insecure-requests)\b/i; |
/** |
* 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 {boolean} [forceCache] Whether to force-cache the filter object. |
+ * <em>For internal use only.<em> |
* @return {Filter} |
*/ |
-Filter.fromText = function(text) |
+Filter.fromText = function(text, forceCache = true) |
{ |
let filter = Filter.knownFilters.get(text); |
if (filter) |
return filter; |
if (text[0] == "!") |
{ |
filter = new CommentFilter(text); |
@@ -227,17 +240,19 @@ |
{ |
let match = text.includes("#") ? Filter.contentRegExp.exec(text) : null; |
if (match) |
filter = ContentFilter.fromText(text, match[1], match[2], match[3]); |
else |
filter = RegExpFilter.fromText(text); |
} |
- Filter.knownFilters.set(filter.text, filter); |
+ if (forceCache || shouldCacheFilter(filter)) |
+ Filter.knownFilters.set(filter.text, filter); |
+ |
return filter; |
}; |
/** |
* Deserializes a filter |
* |
* @param {Object} obj map of serialized properties and their values |
* @return {Filter} filter or null if the filter couldn't be created |