Index: lib/filterClasses.js |
=================================================================== |
--- a/lib/filterClasses.js |
+++ b/lib/filterClasses.js |
@@ -442,22 +442,44 @@ |
/** |
* Separator character used in domainSource property, must be |
* overridden by subclasses |
* @type {string} |
*/ |
domainSeparator: null, |
/** |
+ * Internal counter to keep track of the number of times the |
+ * {@link ActiveFilter#domains} property is accessed. |
+ * @type {number} |
+ * @private |
+ */ |
+ _domainsAccessCount: 0, |
+ |
+ /** |
+ * Maximum number of times the {@link ActiveFilter#domains} property can be |
+ * accessed before the value is cached. |
+ * @type {number} |
+ * @private |
+ */ |
+ _domainsAccessCacheThreshold: 3, |
+ |
+ /** |
* 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 > |
+ this._domainsAccessCacheThreshold; |
+ |
let domains = null; |
if (this.domainSource) |
{ |
let source = this.domainSource.toLowerCase(); |
let knownMap = knownDomainMaps.get(source); |
if (knownMap) |
@@ -498,25 +520,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, |