Index: lib/filterStorage.js |
=================================================================== |
--- a/lib/filterStorage.js |
+++ b/lib/filterStorage.js |
@@ -143,16 +143,21 @@ |
for (let i = 0; i < FilterStorage.subscriptions.length; i++) |
{ |
if (FilterStorage.subscriptions[i].url == subscription.url) |
{ |
removeSubscriptionFilters(subscription); |
FilterStorage.subscriptions.splice(i--, 1); |
FilterStorage.knownSubscriptions.delete(subscription.url); |
+ |
+ // This should be the last remaining reference to the Subscription |
+ // object. |
+ Subscription.knownSubscriptions.delete(subscription.url); |
+ |
FilterNotifier.triggerListeners("subscription.removed", subscription); |
return; |
} |
} |
}, |
/** |
* Moves a subscription in the list to a new position. |
@@ -672,19 +677,24 @@ |
*/ |
function removeSubscriptionFilters(subscription) |
{ |
if (!FilterStorage.knownSubscriptions.has(subscription.url)) |
return; |
for (let filter of subscription.filters) |
{ |
- let i = filter.subscriptions.indexOf(subscription); |
- if (i >= 0) |
- filter.subscriptions.splice(i, 1); |
+ let index = 0; |
+ |
+ // The same filter can occur more than once in a subscription. We could |
+ // avoid making duplicate subscription entries in a Filter object in |
+ // INIParser, but we don't do this in order to avoid slowing down the |
+ // loading of the initial subscriptions from disk. |
+ while ((index = filter.subscriptions.indexOf(subscription), index) != -1) |
+ filter.subscriptions.splice(index, 1); |
} |
} |
/** |
* Listener returned by FilterStorage.importData(), parses filter data. |
* @constructor |
*/ |
function INIParser() |