| Left: | ||
| Right: |
| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-present eyeo GmbH | 3 * Copyright (C) 2006-present eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 73 */ | 73 */ |
| 74 firstRun: false, | 74 firstRun: false, |
| 75 | 75 |
| 76 /** | 76 /** |
| 77 * Map of properties listed in the filter storage file before the sections | 77 * Map of properties listed in the filter storage file before the sections |
| 78 * start. Right now this should be only the format version. | 78 * start. Right now this should be only the format version. |
| 79 */ | 79 */ |
| 80 fileProperties: Object.create(null), | 80 fileProperties: Object.create(null), |
| 81 | 81 |
| 82 /** | 82 /** |
| 83 * List of filter subscriptions containing all filters | 83 * Generator for filter subscriptions containing all filters |
|
Manish Jethani
2018/09/21 09:21:58
We could just say "Yields filter subscriptions con
Jon Sonesen
2018/09/27 15:14:05
Done.
| |
| 84 * @type {Subscription[]} | 84 * @type {Subscription.Generator} |
|
Manish Jethani
2018/09/21 09:21:58
This is a function now rather than a property, so
Jon Sonesen
2018/09/27 15:14:04
Done.
| |
| 85 */ | 85 */ |
| 86 subscriptions: [], | 86 *subscriptions() |
| 87 { | |
| 88 for (let subscription of this.knownSubscriptions.values()) | |
|
Manish Jethani
2018/09/21 09:21:58
We could replace the body of this function with th
Jon Sonesen
2018/09/27 15:14:05
Done.
| |
| 89 yield subscription; | |
| 90 }, | |
| 91 | |
| 92 subscriptionCount() | |
|
Manish Jethani
2018/09/21 09:21:58
This needs JSDoc.
How about:
Number of known s
Jon Sonesen
2018/09/27 15:14:04
Done.
| |
| 93 { | |
| 94 return this.knownSubscriptions.size; | |
| 95 }, | |
| 87 | 96 |
| 88 /** | 97 /** |
| 89 * Map of subscriptions already on the list, by their URL/identifier | 98 * Map of subscriptions already on the list, by their URL/identifier |
| 90 * @type {Map.<string,Subscription>} | 99 * @type {Map.<string,Subscription>} |
| 91 */ | 100 */ |
| 92 knownSubscriptions: new Map(), | 101 knownSubscriptions: new Map(), |
| 93 | 102 |
| 94 /** | 103 /** |
| 95 * Finds the filter group that a filter should be added to by default. Will | 104 * Finds the filter group that a filter should be added to by default. Will |
| 96 * return null if this group doesn't exist yet. | 105 * return null if this group doesn't exist yet. |
| 97 * @param {Filter} filter | 106 * @param {Filter} filter |
| 98 * @return {?SpecialSubscription} | 107 * @return {?SpecialSubscription} |
| 99 */ | 108 */ |
| 100 getGroupForFilter(filter) | 109 getGroupForFilter(filter) |
| 101 { | 110 { |
| 102 let generalSubscription = null; | 111 let generalSubscription = null; |
| 103 for (let subscription of FilterStorage.subscriptions) | 112 for (let subscription of FilterStorage.subscriptions()) |
| 104 { | 113 { |
| 105 if (subscription instanceof SpecialSubscription && !subscription.disabled) | 114 if (subscription instanceof SpecialSubscription && !subscription.disabled) |
| 106 { | 115 { |
| 107 // Always prefer specialized subscriptions | 116 // Always prefer specialized subscriptions |
| 108 if (subscription.isDefaultFor(filter)) | 117 if (subscription.isDefaultFor(filter)) |
| 109 return subscription; | 118 return subscription; |
| 110 | 119 |
| 111 // If this is a general subscription - store it as fallback | 120 // If this is a general subscription - store it as fallback |
| 112 if (!generalSubscription && | 121 if (!generalSubscription && |
| 113 (!subscription.defaults || !subscription.defaults.length)) | 122 (!subscription.defaults || !subscription.defaults.length)) |
| 114 { | 123 { |
| 115 generalSubscription = subscription; | 124 generalSubscription = subscription; |
| 116 } | 125 } |
| 117 } | 126 } |
| 118 } | 127 } |
| 119 return generalSubscription; | 128 return generalSubscription; |
| 120 }, | 129 }, |
| 121 | 130 |
| 122 /** | 131 /** |
| 123 * Adds a filter subscription to the list | 132 * Adds a filter subscription to the list |
| 124 * @param {Subscription} subscription filter subscription to be added | 133 * @param {Subscription} subscription filter subscription to be added |
| 125 */ | 134 */ |
| 126 addSubscription(subscription) | 135 addSubscription(subscription) |
| 127 { | 136 { |
| 128 if (FilterStorage.knownSubscriptions.has(subscription.url)) | 137 if (FilterStorage.knownSubscriptions.has(subscription.url)) |
| 129 return; | 138 return; |
| 130 | 139 |
| 131 FilterStorage.subscriptions.push(subscription); | |
| 132 FilterStorage.knownSubscriptions.set(subscription.url, subscription); | 140 FilterStorage.knownSubscriptions.set(subscription.url, subscription); |
| 133 addSubscriptionFilters(subscription); | 141 addSubscriptionFilters(subscription); |
| 134 | 142 |
| 135 filterNotifier.emit("subscription.added", subscription); | 143 filterNotifier.emit("subscription.added", subscription); |
| 136 }, | 144 }, |
| 137 | 145 |
| 138 /** | 146 /** |
| 139 * Removes a filter subscription from the list | 147 * Removes a filter subscription from the list |
| 140 * @param {Subscription} subscription filter subscription to be removed | 148 * @param {Subscription} subscription filter subscription to be removed |
| 141 */ | 149 */ |
| 142 removeSubscription(subscription) | 150 removeSubscription(subscription) |
| 143 { | 151 { |
| 144 for (let i = 0; i < FilterStorage.subscriptions.length; i++) | 152 if (!FilterStorage.knownSubscriptions.has(subscription.url)) |
| 145 { | 153 return; |
|
Manish Jethani
2018/09/21 09:21:59
It seems when we have a check like this we normall
Jon Sonesen
2018/09/27 15:14:04
Done.
| |
| 146 if (FilterStorage.subscriptions[i].url == subscription.url) | 154 removeSubscriptionFilters(subscription); |
| 147 { | 155 FilterStorage.knownSubscriptions.delete(subscription.url); |
| 148 removeSubscriptionFilters(subscription); | |
| 149 | 156 |
| 150 FilterStorage.subscriptions.splice(i--, 1); | 157 // This should be the last remaining reference to the Subscription |
| 151 FilterStorage.knownSubscriptions.delete(subscription.url); | 158 // object. |
| 159 Subscription.knownSubscriptions.delete(subscription.url); | |
| 152 | 160 |
| 153 // This should be the last remaining reference to the Subscription | 161 filterNotifier.emit("subscription.removed", subscription); |
| 154 // object. | |
| 155 Subscription.knownSubscriptions.delete(subscription.url); | |
| 156 | |
| 157 filterNotifier.emit("subscription.removed", subscription); | |
| 158 return; | |
| 159 } | |
| 160 } | |
| 161 }, | |
| 162 | |
| 163 /** | |
| 164 * Moves a subscription in the list to a new position. | |
| 165 * @param {Subscription} subscription filter subscription to be moved | |
| 166 * @param {Subscription} [insertBefore] filter subscription to insert before | |
| 167 * (if omitted the subscription will be put at the end of the list) | |
| 168 */ | |
| 169 moveSubscription(subscription, insertBefore) | |
| 170 { | |
| 171 let currentPos = FilterStorage.subscriptions.indexOf(subscription); | |
| 172 if (currentPos < 0) | |
| 173 return; | |
| 174 | |
| 175 let newPos = -1; | |
| 176 if (insertBefore) | |
| 177 newPos = FilterStorage.subscriptions.indexOf(insertBefore); | |
| 178 | |
| 179 if (newPos < 0) | |
| 180 newPos = FilterStorage.subscriptions.length; | |
| 181 | |
| 182 if (currentPos < newPos) | |
| 183 newPos--; | |
| 184 if (currentPos == newPos) | |
| 185 return; | |
| 186 | |
| 187 FilterStorage.subscriptions.splice(currentPos, 1); | |
| 188 FilterStorage.subscriptions.splice(newPos, 0, subscription); | |
| 189 filterNotifier.emit("subscription.moved", subscription); | |
| 190 }, | 162 }, |
| 191 | 163 |
| 192 /** | 164 /** |
| 193 * Replaces the list of filters in a subscription by a new list | 165 * Replaces the list of filters in a subscription by a new list |
| 194 * @param {Subscription} subscription filter subscription to be updated | 166 * @param {Subscription} subscription filter subscription to be updated |
| 195 * @param {Filter[]} filters new filter list | 167 * @param {Filter[]} filters new filter list |
| 196 */ | 168 */ |
| 197 updateSubscriptionFilters(subscription, filters) | 169 updateSubscriptionFilters(subscription, filters) |
| 198 { | 170 { |
| 199 removeSubscriptionFilters(subscription); | 171 removeSubscriptionFilters(subscription); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 366 return line => | 338 return line => |
| 367 { | 339 { |
| 368 parser.process(line); | 340 parser.process(line); |
| 369 if (line === null) | 341 if (line === null) |
| 370 { | 342 { |
| 371 let knownSubscriptions = new Map(); | 343 let knownSubscriptions = new Map(); |
| 372 for (let subscription of parser.subscriptions) | 344 for (let subscription of parser.subscriptions) |
| 373 knownSubscriptions.set(subscription.url, subscription); | 345 knownSubscriptions.set(subscription.url, subscription); |
| 374 | 346 |
| 375 this.fileProperties = parser.fileProperties; | 347 this.fileProperties = parser.fileProperties; |
| 376 this.subscriptions = parser.subscriptions; | |
| 377 this.knownSubscriptions = knownSubscriptions; | 348 this.knownSubscriptions = knownSubscriptions; |
| 378 Filter.knownFilters = parser.knownFilters; | 349 Filter.knownFilters = parser.knownFilters; |
| 379 Subscription.knownSubscriptions = parser.knownSubscriptions; | 350 Subscription.knownSubscriptions = parser.knownSubscriptions; |
| 380 | 351 |
| 381 if (!silent) | 352 if (!silent) |
| 382 filterNotifier.emit("load"); | 353 filterNotifier.emit("load"); |
| 383 } | 354 } |
| 384 }; | 355 }; |
| 385 }, | 356 }, |
| 386 | 357 |
| 387 /** | 358 /** |
| 388 * Loads all subscriptions from the disk. | 359 * Loads all subscriptions from the disk. |
| 389 * @return {Promise} promise resolved or rejected when loading is complete | 360 * @return {Promise} promise resolved or rejected when loading is complete |
| 390 */ | 361 */ |
| 391 loadFromDisk() | 362 loadFromDisk() |
| 392 { | 363 { |
| 393 let tryBackup = backupIndex => | 364 let tryBackup = backupIndex => |
| 394 { | 365 { |
| 395 return this.restoreBackup(backupIndex, true).then(() => | 366 return this.restoreBackup(backupIndex, true).then(() => |
| 396 { | 367 { |
| 397 if (this.subscriptions.length == 0) | 368 if (this.subscriptionCount == 0) |
| 398 return tryBackup(backupIndex + 1); | 369 return tryBackup(backupIndex + 1); |
| 399 }).catch(error => | 370 }).catch(error => |
| 400 { | 371 { |
| 401 // Give up | 372 // Give up |
| 402 }); | 373 }); |
| 403 }; | 374 }; |
| 404 | 375 |
| 405 return IO.statFile(this.sourceFile).then(statData => | 376 return IO.statFile(this.sourceFile).then(statData => |
| 406 { | 377 { |
| 407 if (!statData.exists) | 378 if (!statData.exists) |
| 408 { | 379 { |
| 409 this.firstRun = true; | 380 this.firstRun = true; |
| 410 return; | 381 return; |
| 411 } | 382 } |
| 412 | 383 |
| 413 let parser = this.importData(true); | 384 let parser = this.importData(true); |
| 414 return IO.readFromFile(this.sourceFile, parser).then(() => | 385 return IO.readFromFile(this.sourceFile, parser).then(() => |
| 415 { | 386 { |
| 416 parser(null); | 387 parser(null); |
| 417 if (this.subscriptions.length == 0) | 388 if (this.subscriptionCount == 0) |
| 418 { | 389 { |
| 419 // No filter subscriptions in the file, this isn't right. | 390 // No filter subscriptions in the file, this isn't right. |
| 420 throw new Error("No data in the file"); | 391 throw new Error("No data in the file"); |
| 421 } | 392 } |
| 422 }); | 393 }); |
| 423 }).catch(error => | 394 }).catch(error => |
| 424 { | 395 { |
| 425 Cu.reportError(error); | 396 Cu.reportError(error); |
| 426 return tryBackup(1); | 397 return tryBackup(1); |
| 427 }).then(() => | 398 }).then(() => |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 461 return this.saveToDisk(); | 432 return this.saveToDisk(); |
| 462 }); | 433 }); |
| 463 }, | 434 }, |
| 464 | 435 |
| 465 /** | 436 /** |
| 466 * Generator serializing filter data and yielding it line by line. | 437 * Generator serializing filter data and yielding it line by line. |
| 467 */ | 438 */ |
| 468 *exportData() | 439 *exportData() |
| 469 { | 440 { |
| 470 // Do not persist external subscriptions | 441 // Do not persist external subscriptions |
| 471 let subscriptions = this.subscriptions.filter( | 442 let subscriptions = [...this.subscriptions()].filter( |
| 472 s => !(s instanceof ExternalSubscription) | 443 s => !(s instanceof ExternalSubscription) |
| 473 ); | 444 ); |
| 474 | 445 |
| 475 yield "# Adblock Plus preferences"; | 446 yield "# Adblock Plus preferences"; |
| 476 yield "version=" + formatVersion; | 447 yield "version=" + formatVersion; |
| 477 | 448 |
| 478 let saved = new Set(); | 449 let saved = new Set(); |
| 479 let buf = []; | 450 let buf = []; |
| 480 | 451 |
| 481 // Save subscriptions | 452 // Save subscriptions |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 * @param {Subscription} subscription filter subscription to be removed | 642 * @param {Subscription} subscription filter subscription to be removed |
| 672 */ | 643 */ |
| 673 function removeSubscriptionFilters(subscription) | 644 function removeSubscriptionFilters(subscription) |
| 674 { | 645 { |
| 675 if (!FilterStorage.knownSubscriptions.has(subscription.url)) | 646 if (!FilterStorage.knownSubscriptions.has(subscription.url)) |
| 676 return; | 647 return; |
| 677 | 648 |
| 678 for (let filter of subscription.filters) | 649 for (let filter of subscription.filters) |
| 679 filter.removeSubscription(subscription); | 650 filter.removeSubscription(subscription); |
| 680 } | 651 } |
| OLD | NEW |