| Index: lib/elemHideExceptions.js | 
| =================================================================== | 
| --- a/lib/elemHideExceptions.js | 
| +++ b/lib/elemHideExceptions.js | 
| @@ -26,16 +26,22 @@ | 
| /** | 
| * Lookup table, lists of element hiding exceptions by selector | 
| * @type {Map.<string,ElemHideException[]>} | 
| */ | 
| let exceptions = new Map(); | 
| /** | 
| + * Set containing all known domains | 
| + * @type {Set.<string>} | 
| + */ | 
| +let knownDomains = new Set(); | 
| + | 
| +/** | 
| * Set containing known element exceptions | 
| * @type {Set.<ElemHideException>} | 
| */ | 
| let knownExceptions = new Set(); | 
| /** | 
| * Container for element hiding exceptions | 
| * @class | 
| @@ -56,17 +62,30 @@ | 
| * Add a new element hiding exception | 
| * @param {ElemHideException} exception | 
| */ | 
| add(exception) | 
| { | 
| if (knownExceptions.has(exception)) | 
| return; | 
| - let {selector} = exception; | 
| + let {domains, selector} = exception; | 
| + | 
| + if (domains) | 
| + { | 
| + for (let domain of domains.keys()) | 
| + { | 
| + // Note: Once a domain is known it never becomes unknown, even when all | 
| + // the filters containing that domain are removed. This is a best-case | 
| + // optimization. | 
| + if (domain != "") | 
| + knownDomains.add(domain); | 
| + } | 
| + } | 
| + | 
| let list = exceptions.get(selector); | 
| if (list) | 
| list.push(exception); | 
| else | 
| exceptions.set(selector, [exception]); | 
| knownExceptions.add(exception); | 
| @@ -92,16 +111,26 @@ | 
| knownExceptions.delete(exception); | 
| this.emit("removed", exception); | 
| filterNotifier.emit("elemhideupdate"); | 
| }, | 
| /** | 
| + * Checks whether a given domain is known. | 
| + * @param {string} domain | 
| + * @returns {boolean} | 
| + */ | 
| + isKnownDomain(domain) | 
| + { | 
| + return knownDomains.has(domain); | 
| + }, | 
| + | 
| + /** | 
| * Checks whether any exception rules are registered for a selector | 
| * @param {string} selector | 
| * @returns {boolean} | 
| */ | 
| hasExceptions(selector) | 
| { | 
| return exceptions.has(selector); | 
| }, |