Index: lib/filterListener.js |
=================================================================== |
--- a/lib/filterListener.js |
+++ b/lib/filterListener.js |
@@ -27,17 +27,17 @@ |
const {filterStorage} = require("./filterStorage"); |
const {filterNotifier} = require("./filterNotifier"); |
const {ElemHide} = require("./elemHide"); |
const {ElemHideEmulation} = require("./elemHideEmulation"); |
const {ElemHideExceptions} = require("./elemHideExceptions"); |
const {Snippets} = require("./snippets"); |
const {defaultMatcher} = require("./matcher"); |
-const {ActiveFilter, RegExpFilter, |
+const {Filter, ActiveFilter, RegExpFilter, |
ElemHideBase, ElemHideFilter, ElemHideEmulationFilter, |
SnippetFilter} = require("./filterClasses"); |
const {SpecialSubscription} = require("./subscriptionClasses"); |
const {Prefs} = require("prefs"); |
/** |
* Increases on filter changes, filters will be saved if it exceeds 1. |
* @type {number} |
@@ -214,76 +214,89 @@ |
ElemHideExceptions.remove(filter); |
} |
else if (filter instanceof SnippetFilter) |
Snippets.remove(filter); |
} |
const primes = [101, 109, 131, 149, 163, 179, 193, 211, 229, 241]; |
-function addFilters(filters) |
+function addFilters(filters, filterObjects) |
{ |
// We add filters using pseudo-random ordering. Reason is that ElemHide will |
// assign consecutive filter IDs that might be visible to the website. The |
// randomization makes sure that no conclusion can be made about the actual |
// filters applying there. We have ten prime numbers to use as iteration step, |
// any of those can be chosen as long as the array length isn't divisible by |
// it. |
- let len = filters.length; |
+ let len = filterObjects ? filterObjects.length : filters.length; |
if (!len) |
return; |
let current = (Math.random() * len) | 0; |
let step; |
do |
{ |
step = primes[(Math.random() * primes.length) | 0]; |
} while (len % step == 0); |
for (let i = 0; i < len; i++, current = (current + step) % len) |
- addFilter(filters[current]); |
+ { |
+ addFilter(filterObjects ? filterObjects[current] : |
+ Filter.fromText(filters[current])); |
+ } |
} |
function onSubscriptionAdded(subscription) |
{ |
FilterListener.setDirty(1); |
if (!subscription.disabled) |
addFilters(subscription.filters); |
} |
function onSubscriptionRemoved(subscription) |
{ |
FilterListener.setDirty(1); |
if (!subscription.disabled) |
- subscription.filters.forEach(removeFilter); |
+ { |
+ for (let text of subscription.filters) |
+ removeFilter(Filter.fromText(text)); |
+ } |
} |
function onSubscriptionDisabled(subscription, newValue) |
{ |
FilterListener.setDirty(1); |
if (filterStorage.knownSubscriptions.has(subscription.url)) |
{ |
if (newValue == false) |
+ { |
addFilters(subscription.filters); |
+ } |
else |
- subscription.filters.forEach(removeFilter); |
+ { |
+ for (let text of subscription.filters) |
+ removeFilter(Filter.fromText(text)); |
+ } |
} |
} |
function onSubscriptionUpdated(subscription, oldFilters) |
{ |
FilterListener.setDirty(1); |
if (!subscription.disabled && |
filterStorage.knownSubscriptions.has(subscription.url)) |
{ |
- oldFilters.forEach(removeFilter); |
+ for (let text of oldFilters) |
+ removeFilter(Filter.fromText(text)); |
+ |
addFilters(subscription.filters); |
} |
} |
function onFilterHitCount(filter, newValue) |
{ |
if (newValue == 0) |
FilterListener.setDirty(0); |
@@ -334,16 +347,18 @@ |
defaultMatcher.clear(); |
ElemHide.clear(); |
ElemHideEmulation.clear(); |
ElemHideExceptions.clear(); |
Snippets.clear(); |
for (let subscription of filterStorage.subscriptions()) |
{ |
if (!subscription.disabled) |
- addFilters(subscription.filters); |
+ addFilters(subscription.filters, subscription.filterObjects); |
+ |
+ subscription.filterObjects = null; |
} |
} |
function onSave() |
{ |
isDirty = 0; |
} |