Index: lib/filterStorage.js |
=================================================================== |
--- a/lib/filterStorage.js |
+++ b/lib/filterStorage.js |
@@ -28,17 +28,17 @@ const {Filter, ActiveFilter} = require(" |
const {Subscription, SpecialSubscription, |
ExternalSubscription} = require("subscriptionClasses"); |
const {FilterNotifier} = require("filterNotifier"); |
/** |
* Version number of the filter storage file format. |
* @type {number} |
*/ |
-let formatVersion = 4; |
+let formatVersion = 5; |
/** |
* This class reads user's filters from disk, manages them in memory |
* and writes them back. |
* @class |
*/ |
let FilterStorage = exports.FilterStorage = |
{ |
@@ -116,50 +116,44 @@ let FilterStorage = exports.FilterStorag |
} |
} |
return generalSubscription; |
}, |
/** |
* Adds a filter subscription to the list |
* @param {Subscription} subscription filter subscription to be added |
- * @param {boolean} silent if true, no listeners will be triggered |
- * (to be used when filter list is reloaded) |
*/ |
- addSubscription(subscription, silent) |
+ addSubscription(subscription) |
{ |
if (subscription.url in FilterStorage.knownSubscriptions) |
return; |
FilterStorage.subscriptions.push(subscription); |
FilterStorage.knownSubscriptions[subscription.url] = subscription; |
addSubscriptionFilters(subscription); |
- if (!silent) |
- FilterNotifier.triggerListeners("subscription.added", subscription); |
+ FilterNotifier.triggerListeners("subscription.added", subscription); |
}, |
/** |
* Removes a filter subscription from the list |
* @param {Subscription} subscription filter subscription to be removed |
- * @param {boolean} silent if true, no listeners will be triggered |
- * (to be used when filter list is reloaded) |
*/ |
- removeSubscription(subscription, silent) |
+ removeSubscription(subscription) |
{ |
for (let i = 0; i < FilterStorage.subscriptions.length; i++) |
{ |
if (FilterStorage.subscriptions[i].url == subscription.url) |
{ |
removeSubscriptionFilters(subscription); |
FilterStorage.subscriptions.splice(i--, 1); |
delete FilterStorage.knownSubscriptions[subscription.url]; |
- if (!silent) |
- FilterNotifier.triggerListeners("subscription.removed", subscription); |
+ FilterNotifier.triggerListeners("subscription.removed", subscription); |
return; |
} |
} |
}, |
/** |
* Moves a subscription in the list to a new position. |
* @param {Subscription} subscription filter subscription to be moved |
@@ -206,21 +200,18 @@ let FilterStorage = exports.FilterStorag |
/** |
* Adds a user-defined filter to the list |
* @param {Filter} filter |
* @param {SpecialSubscription} [subscription] |
* particular group that the filter should be added to |
* @param {number} [position] |
* position within the subscription at which the filter should be added |
- * @param {boolean} silent |
- * if true, no listeners will be triggered (to be used when filter list is |
- * reloaded) |
*/ |
- addFilter(filter, subscription, position, silent) |
+ addFilter(filter, subscription, position) |
{ |
if (!subscription) |
{ |
if (filter.subscriptions.some(s => s instanceof SpecialSubscription && |
!s.disabled)) |
{ |
return; // No need to add |
} |
@@ -235,21 +226,18 @@ let FilterStorage = exports.FilterStorag |
} |
if (typeof position == "undefined") |
position = subscription.filters.length; |
if (filter.subscriptions.indexOf(subscription) < 0) |
filter.subscriptions.push(subscription); |
subscription.filters.splice(position, 0, filter); |
- if (!silent) |
- { |
- FilterNotifier.triggerListeners("filter.added", filter, subscription, |
- position); |
- } |
+ FilterNotifier.triggerListeners("filter.added", filter, subscription, |
+ position); |
}, |
/** |
* Removes a user-defined filter from the list |
* @param {Filter} filter |
* @param {SpecialSubscription} [subscription] a particular filter group that |
* the filter should be removed from (if ommited will be removed from all |
* subscriptions) |
@@ -379,45 +367,26 @@ let FilterStorage = exports.FilterStorag |
importData(silent) |
{ |
let parser = new INIParser(); |
return line => |
{ |
parser.process(line); |
if (line === null) |
{ |
- // Old special groups might have been converted, remove them if |
- // they are empty |
- let specialMap = new Set(["~il~", "~wl~", "~fl~", "~eh~"]); |
let knownSubscriptions = Object.create(null); |
- for (let i = 0; i < parser.subscriptions.length; i++) |
- { |
- let subscription = parser.subscriptions[i]; |
- if (subscription instanceof SpecialSubscription && |
- subscription.filters.length == 0 && |
- specialMap.has(subscription.url)) |
- { |
- parser.subscriptions.splice(i--, 1); |
- } |
- else |
- knownSubscriptions[subscription.url] = subscription; |
- } |
+ for (let subscription of parser.subscriptions) |
+ knownSubscriptions[subscription.url] = subscription; |
this.fileProperties = parser.fileProperties; |
this.subscriptions = parser.subscriptions; |
this.knownSubscriptions = knownSubscriptions; |
Filter.knownFilters = parser.knownFilters; |
Subscription.knownSubscriptions = parser.knownSubscriptions; |
- if (parser.userFilters) |
- { |
- for (let filter of parser.userFilters) |
- this.addFilter(Filter.fromText(filter), null, undefined, true); |
- } |
- |
if (!silent) |
FilterNotifier.triggerListeners("load"); |
} |
}; |
}, |
/** |
* Loads all subscriptions from the disk. |
@@ -508,47 +477,47 @@ let FilterStorage = exports.FilterStorag |
); |
yield "# Adblock Plus preferences"; |
yield "version=" + formatVersion; |
let saved = new Set(); |
let buf = []; |
+ // Save subscriptions |
+ for (let subscription of subscriptions) |
+ { |
+ yield ""; |
+ |
+ subscription.serialize(buf); |
+ if (subscription.filters.length) |
+ { |
+ buf.push("", "[Subscription filters]"); |
+ subscription.serializeFilters(buf); |
+ } |
+ for (let line of buf) |
+ yield line; |
+ buf.splice(0); |
+ } |
+ |
// Save filter data |
for (let subscription of subscriptions) |
{ |
for (let filter of subscription.filters) |
{ |
if (!saved.has(filter.text)) |
{ |
filter.serialize(buf); |
saved.add(filter.text); |
for (let line of buf) |
yield line; |
buf.splice(0); |
} |
} |
} |
- |
- // Save subscriptions |
- for (let subscription of subscriptions) |
- { |
- yield ""; |
- |
- subscription.serialize(buf); |
- if (subscription.filters.length) |
- { |
- buf.push("", "[Subscription filters]"); |
- subscription.serializeFilters(buf); |
- } |
- for (let line of buf) |
- yield line; |
- buf.splice(0); |
- } |
}, |
/** |
* Will be set to true if saveToDisk() is running (reentrance protection). |
* @type {boolean} |
*/ |
_saving: false, |
@@ -734,17 +703,16 @@ INIParser.prototype = |
linesProcessed: 0, |
subscriptions: null, |
knownFilters: null, |
knownSubscriptions: null, |
wantObj: true, |
fileProperties: null, |
curObj: null, |
curSection: null, |
- userFilters: null, |
process(val) |
{ |
let origKnownFilters = Filter.knownFilters; |
Filter.knownFilters = this.knownFilters; |
let origKnownSubscriptions = Subscription.knownSubscriptions; |
Subscription.knownSubscriptions = this.knownSubscriptions; |
let match; |
@@ -755,62 +723,54 @@ INIParser.prototype = |
else if (val === null || (match = /^\s*\[(.+)\]\s*$/.exec(val))) |
{ |
if (this.curObj) |
{ |
// Process current object before going to next section |
switch (this.curSection) |
{ |
case "filter": |
- case "pattern": |
if ("text" in this.curObj) |
Filter.fromObject(this.curObj); |
break; |
case "subscription": { |
let subscription = Subscription.fromObject(this.curObj); |
if (subscription) |
this.subscriptions.push(subscription); |
break; |
} |
case "subscription filters": |
- case "subscription patterns": |
if (this.subscriptions.length) |
{ |
let subscription = this.subscriptions[ |
this.subscriptions.length - 1 |
]; |
for (let text of this.curObj) |
{ |
let filter = Filter.fromText(text); |
subscription.filters.push(filter); |
filter.subscriptions.push(subscription); |
} |
} |
break; |
- case "user patterns": |
- this.userFilters = this.curObj; |
- break; |
} |
} |
if (val === null) |
return; |
this.curSection = match[1].toLowerCase(); |
switch (this.curSection) |
{ |
case "filter": |
- case "pattern": |
case "subscription": |
this.wantObj = true; |
this.curObj = {}; |
break; |
case "subscription filters": |
- case "subscription patterns": |
- case "user patterns": |
this.wantObj = false; |
this.curObj = []; |
break; |
default: |
this.wantObj = undefined; |
this.curObj = null; |
} |
} |