Index: lib/filterClasses.js |
=================================================================== |
--- a/lib/filterClasses.js |
+++ b/lib/filterClasses.js |
@@ -429,16 +429,23 @@ |
let oldValue = this._lastHit; |
this._lastHit = value; |
filterNotifier.emit("filter.lastHit", this, value, oldValue); |
} |
return this._lastHit; |
}, |
/** |
+ * Internal counter to keep track of the number of times the |
+ * {@link ActiveFilter#domains} property is accessed. |
+ * @type {number} |
+ */ |
+ _domainsAccessCount: 0, |
+ |
+ /** |
* String that the domains property should be generated from |
* @type {?string} |
*/ |
domainSource: null, |
/** |
* Separator character used in domainSource property, must be |
* overridden by subclasses |
@@ -448,16 +455,21 @@ |
/** |
* Map containing domains that this filter should match on/not match |
* on or null if the filter should match on all domains |
* @type {?Map.<string,boolean>} |
*/ |
get domains() |
{ |
+ // For some filter types this property is accessed only rarely, especially |
+ // when the subscriptions are initially loaded. We defer any caching for |
+ // such filters. |
+ let cacheValue = ++this._domainsAccessCount > 3; |
+ |
let domains = null; |
if (this.domainSource) |
{ |
let source = this.domainSource.toLowerCase(); |
let knownMap = knownDomainMaps.get(source); |
if (knownMap) |
@@ -498,25 +510,28 @@ |
domains.set(domain, include); |
} |
if (domains) |
domains.set("", !hasIncludes); |
} |
- if (domains) |
+ if (!domains || cacheValue) |
knownDomainMaps.set(source, domains); |
} |
- this.domainSource = null; |
+ if (!domains || cacheValue) |
+ this.domainSource = null; |
} |
- Object.defineProperty(this, "domains", {value: domains}); |
- return this.domains; |
+ if (!domains || cacheValue) |
+ Object.defineProperty(this, "domains", {value: domains}); |
+ |
+ return domains; |
}, |
/** |
* Array containing public keys of websites that this filter should apply to |
* @type {?string[]} |
*/ |
sitekeys: null, |