| 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, |