| Index: lib/filterStorage.js |
| =================================================================== |
| --- a/lib/filterStorage.js |
| +++ b/lib/filterStorage.js |
| @@ -123,16 +123,43 @@ |
| * @type {number} |
| */ |
| get subscriptionCount() |
| { |
| return this.knownSubscriptions.size; |
| } |
| /** |
| + * Yields subscriptions in the storage to which the given filter belongs. |
| + * @param {Filter} filter |
| + * @yields {Subscription} |
| + */ |
| + *subscriptionsForFilter(filter) |
| + { |
| + if (!filter.subscriptionsAdded) |
| + addSubscriptionsToFilter(filter); |
| + |
| + yield* filter.subscriptions(); |
| + } |
| + |
| + /** |
| + * Returns the number of subscriptions in the storage to which the given |
| + * filter belongs. |
| + * @param {Filter} filter |
| + * @return {number} |
| + */ |
| + getSubscriptionCountForFilter(filter) |
| + { |
| + if (!filter.subscriptionsAdded) |
| + addSubscriptionsToFilter(filter); |
| + |
| + return filter.subscriptionCount; |
| + } |
| + |
| + /** |
| * Finds the filter group that a filter should be added to by default. Will |
| * return <code>null</code> if this group doesn't exist yet. |
| * @param {Filter} filter |
| * @returns {?SpecialSubscription} |
| */ |
| getGroupForFilter(filter) |
| { |
| let generalSubscription = null; |
| @@ -221,17 +248,17 @@ |
| * @param {number} [position] The position within the subscription at which |
| * the filter should be added. If not specified, the filter is added at the |
| * end of the subscription. |
| */ |
| addFilter(filter, subscription, position) |
| { |
| if (!subscription) |
| { |
| - for (let currentSubscription of filter.subscriptions()) |
| + for (let currentSubscription of this.subscriptionsForFilter(filter)) |
| { |
| if (currentSubscription instanceof SpecialSubscription && |
| !currentSubscription.disabled) |
| { |
| return; // No need to add |
| } |
| } |
| subscription = this.getGroupForFilter(filter); |
| @@ -260,17 +287,17 @@ |
| * removed from all subscriptions. |
| * @param {number} [position] The position within the subscription at which |
| * the filter should be removed. If not specified, all instances of the |
| * filter will be removed. |
| */ |
| removeFilter(filter, subscription, position) |
| { |
| let subscriptions = ( |
| - subscription ? [subscription] : filter.subscriptions() |
| + subscription ? [subscription] : this.subscriptionsForFilter(filter) |
| ); |
| for (let currentSubscription of subscriptions) |
| { |
| if (currentSubscription instanceof SpecialSubscription) |
| { |
| let positions = []; |
| if (typeof position == "undefined") |
| { |
| @@ -657,16 +684,32 @@ |
| * Reads the user's filters from disk, manages them in memory, and writes them |
| * back to disk. |
| */ |
| let filterStorage = new FilterStorage(); |
| exports.filterStorage = filterStorage; |
| /** |
| + * Adds to a filter any subscriptions in the storage to which the filter |
| + * belongs. |
| + * @param {Filter} filter |
| + */ |
| +function addSubscriptionsToFilter(filter) |
| +{ |
| + for (let subscription of filterStorage.subscriptions()) |
| + { |
| + if (subscription.hasFilter(filter)) |
| + filter.addSubscription(subscription); |
| + } |
| + |
| + filter.subscriptionsAdded = true; |
| +} |
| + |
| +/** |
| * Connects a subscription to its filters without any notifications. |
| * @param {Subscription} subscription The subscription that should be |
| * connected to its filters. |
| * @param {?Array.<Filter>} [filters] A list of filters to which the |
| * subscription should be connected. If this is not given, the subscription |
| * is connected to its own filters. |
| */ |
| function connectSubscriptionFilters(subscription, filters) |