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
+ * {@link Filter.knownFilters}
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.
+ * For internal use only.
* @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