Index: lib/elemHide.js |
=================================================================== |
--- a/lib/elemHide.js |
+++ b/lib/elemHide.js |
@@ -16,16 +16,17 @@ |
*/ |
"use strict"; |
/** |
* @fileOverview Element hiding implementation. |
*/ |
+const {Filter} = require("./filterClasses"); |
Manish Jethani
2019/04/07 18:14:11
I have minimized the changes in this file for now
|
const {ElemHideExceptions} = require("./elemHideExceptions"); |
const {filterNotifier} = require("./filterNotifier"); |
const {normalizeHostname, domainSuffixes} = require("./url"); |
const {Cache} = require("./caching"); |
/** |
* The maximum number of selectors in a CSS rule. This is used by |
* <code>{@link createStyleSheet}</code> to split up a long list of selectors |
@@ -129,17 +130,17 @@ |
{ |
// There's no need to note that a filter is generically disabled. |
if (!isIncluded && domain == "") |
continue; |
let filters = filtersByDomain.get(domain); |
if (!filters) |
filtersByDomain.set(domain, filters = new Map()); |
- filters.set(filter, isIncluded); |
+ filters.set(filter.text, isIncluded ? filter.selector : null); |
} |
} |
/** |
* Returns a list of selectors that apply on each website unconditionally. |
* @returns {string[]} |
*/ |
function getUnconditionalSelectors() |
@@ -166,30 +167,26 @@ |
let excluded = new Set(); |
for (let currentDomain of domainSuffixes(domain, !specificOnly)) |
{ |
let filters = filtersByDomain.get(currentDomain); |
if (filters) |
{ |
- for (let [filter, isIncluded] of filters) |
+ for (let [text, selector] of filters) |
{ |
- if (!isIncluded) |
+ if (!selector) |
{ |
- excluded.add(filter); |
+ excluded.add(text); |
} |
- else |
+ else if ((excluded.size == 0 || !excluded.has(text)) && |
+ !ElemHideExceptions.getException(selector, domain)) |
{ |
- let {selector} = filter; |
- if ((excluded.size == 0 || !excluded.has(filter)) && |
- !ElemHideExceptions.getException(selector, domain)) |
- { |
- selectors.push(selector); |
- } |
+ selectors.push(selector); |
} |
} |
} |
} |
return selectors; |
} |
@@ -212,33 +209,30 @@ |
let excluded = new Set(); |
for (let currentDomain of domainSuffixes(domain, !specificOnly)) |
{ |
let filters = filtersByDomain.get(currentDomain); |
if (filters) |
{ |
- for (let [filter, isIncluded] of filters) |
+ for (let [text, selector] of filters) |
{ |
- if (!isIncluded) |
- { |
- excluded.add(filter); |
- } |
- else if (excluded.size == 0 || !excluded.has(filter)) |
+ if (!selector) |
{ |
- { |
- let {selector} = filter; |
- let exception = ElemHideExceptions.getException(selector, domain); |
+ excluded.add(text); |
+ } |
+ else if (excluded.size == 0 || !excluded.has(text)) |
+ { |
+ let exception = ElemHideExceptions.getException(selector, domain); |
- if (exception) |
- exceptions.push(exception); |
- else |
- selectors.push(selector); |
- } |
+ if (exception) |
+ exceptions.push(exception); |
+ else |
+ selectors.push(selector); |
} |
} |
} |
} |
return {selectors, exceptions}; |
} |
@@ -304,17 +298,18 @@ |
} |
} |
// If this is the first exception for a previously unconditionally applied |
// element hiding selector we need to take care to update the lookups. |
let unconditionalFilterForSelector = filterBySelector.get(selector); |
if (unconditionalFilterForSelector) |
{ |
- addToFiltersByDomain(unconditionalFilterForSelector); |
+ addToFiltersByDomain(Filter.fromText(unconditionalFilterForSelector, |
+ false)); |
filterBySelector.delete(selector); |
unconditionalSelectors = null; |
defaultStyleSheet = null; |
} |
}); |
/** |
* Container for element hiding filters |
@@ -341,80 +336,84 @@ |
}, |
/** |
* Add a new element hiding filter |
* @param {ElemHideFilter} filter |
*/ |
add(filter) |
{ |
- if (knownFilters.has(filter)) |
+ let {text} = filter; |
+ |
+ if (knownFilters.has(text)) |
return; |
styleSheetCache.clear(); |
commonStyleSheet = null; |
let {domains, selector} = filter; |
if (!(domains || ElemHideExceptions.hasExceptions(selector))) |
{ |
// The new filter's selector is unconditionally applied to all domains |
- filterBySelector.set(selector, filter); |
+ filterBySelector.set(selector, text); |
unconditionalSelectors = null; |
defaultStyleSheet = null; |
} |
else |
{ |
// The new filter's selector only applies to some domains |
addToFiltersByDomain(filter, domains); |
} |
- knownFilters.add(filter); |
+ knownFilters.add(text); |
filterNotifier.emit("elemhideupdate"); |
}, |
/** |
* Removes an element hiding filter |
* @param {ElemHideFilter} filter |
*/ |
remove(filter) |
{ |
- if (!knownFilters.has(filter)) |
+ let {text} = filter; |
+ |
+ if (!knownFilters.has(text)) |
return; |
styleSheetCache.clear(); |
commonStyleSheet = null; |
let {selector} = filter; |
// Unconditially applied element hiding filters |
- if (filterBySelector.get(selector) == filter) |
+ if (filterBySelector.get(selector) == text) |
{ |
filterBySelector.delete(selector); |
unconditionalSelectors = null; |
defaultStyleSheet = null; |
} |
// Conditionally applied element hiding filters |
else |
{ |
let domains = filter.domains || defaultDomains; |
for (let domain of domains.keys()) |
{ |
let filters = filtersByDomain.get(domain); |
if (filters) |
{ |
- filters.delete(filter); |
+ filters.delete(text); |
if (filters.size == 0) |
filtersByDomain.delete(domain); |
} |
} |
} |
- knownFilters.delete(filter); |
+ knownFilters.delete(text); |
filterNotifier.emit("elemhideupdate"); |
}, |
/** |
* @typedef {object} ElemHideStyleSheet |
* @property {string} code CSS code. |
* @property {Array.<string>} selectors List of selectors. |
*/ |