| Index: lib/filterListener.js | 
| =================================================================== | 
| --- a/lib/filterListener.js | 
| +++ b/lib/filterListener.js | 
| @@ -214,77 +214,87 @@ | 
| 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 addSubscriptionFilters(subscription) | 
| { | 
| // 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 = subscription.filterCount; | 
| 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(subscription.filterAt(current)); | 
| } | 
|  | 
| function onSubscriptionAdded(subscription) | 
| { | 
| FilterListener.setDirty(1); | 
|  | 
| if (!subscription.disabled) | 
| -    addFilters(subscription.filters); | 
| +    addSubscriptionFilters(subscription); | 
| } | 
|  | 
| function onSubscriptionRemoved(subscription) | 
| { | 
| FilterListener.setDirty(1); | 
|  | 
| if (!subscription.disabled) | 
| -    subscription.filters.forEach(removeFilter); | 
| +  { | 
| +    for (let filter of subscription.filters()) | 
| +      removeFilter(filter); | 
| +  } | 
| } | 
|  | 
| function onSubscriptionDisabled(subscription, newValue) | 
| { | 
| FilterListener.setDirty(1); | 
|  | 
| if (filterStorage.knownSubscriptions.has(subscription.url)) | 
| { | 
| if (newValue == false) | 
| -      addFilters(subscription.filters); | 
| +    { | 
| +      addSubscriptionFilters(subscription); | 
| +    } | 
| else | 
| -      subscription.filters.forEach(removeFilter); | 
| +    { | 
| +      for (let filter of subscription.filters()) | 
| +        removeFilter(filter); | 
| +    } | 
| } | 
| } | 
|  | 
| function onSubscriptionUpdated(subscription, oldFilters) | 
| { | 
| FilterListener.setDirty(1); | 
|  | 
| if (!subscription.disabled && | 
| filterStorage.knownSubscriptions.has(subscription.url)) | 
| { | 
| -    oldFilters.forEach(removeFilter); | 
| -    addFilters(subscription.filters); | 
| +    for (let filter of oldFilters) | 
| +      removeFilter(filter); | 
| + | 
| +    addSubscriptionFilters(subscription); | 
| } | 
| } | 
|  | 
| function onFilterHitCount(filter, newValue) | 
| { | 
| if (newValue == 0) | 
| FilterListener.setDirty(0); | 
| else | 
| @@ -331,19 +341,20 @@ | 
| { | 
| isDirty = 0; | 
|  | 
| defaultMatcher.clear(); | 
| ElemHide.clear(); | 
| ElemHideEmulation.clear(); | 
| ElemHideExceptions.clear(); | 
| Snippets.clear(); | 
| + | 
| for (let subscription of filterStorage.subscriptions()) | 
| { | 
| if (!subscription.disabled) | 
| -      addFilters(subscription.filters); | 
| +      addSubscriptionFilters(subscription); | 
| } | 
| } | 
|  | 
| function onSave() | 
| { | 
| isDirty = 0; | 
| } | 
|  |