| 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-2016 Eyeo GmbH | 3  * Copyright (C) 2006-2016 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 | 
| 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
| 12  * GNU General Public License for more details. | 12  * GNU General Public License for more details. | 
| 13  * | 13  * | 
| 14  * You should have received a copy of the GNU General Public License | 14  * You should have received a copy of the GNU General Public License | 
| 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
| 16  */ | 16  */ | 
| 17 | 17 | 
| 18 /** | 18 /** | 
| 19  * @fileOverview Definition of Subscription class and its subclasses. | 19  * @fileOverview Definition of Subscription class and its subclasses. | 
| 20  */ | 20  */ | 
| 21 | 21 | 
| 22 let {ActiveFilter, BlockingFilter, WhitelistFilter, ElemHideBase} = require("fil
     terClasses"); | 22 let {ActiveFilter, BlockingFilter, WhitelistFilter, ElemHideBase} = require("fil
     terClasses"); | 
| 23 let {FilterNotifier} = require("filterNotifier"); | 23 let {FilterNotifier} = require("filterNotifier"); | 
|  | 24 let {desc} = require("coreUtils"); | 
| 24 | 25 | 
| 25 /** | 26 /** | 
| 26  * Abstract base class for filter subscriptions | 27  * Abstract base class for filter subscriptions | 
| 27  * | 28  * | 
| 28  * @param {String} url    download location of the subscription | 29  * @param {String} url    download location of the subscription | 
| 29  * @param {String} [title]  title of the filter subscription | 30  * @param {String} [title]  title of the filter subscription | 
| 30  * @constructor | 31  * @constructor | 
| 31  */ | 32  */ | 
| 32 function Subscription(url, title) | 33 function Subscription(url, title) | 
| 33 { | 34 { | 
| (...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 222  * @param {String} [title]  see Subscription() | 223  * @param {String} [title]  see Subscription() | 
| 223  * @constructor | 224  * @constructor | 
| 224  * @augments Subscription | 225  * @augments Subscription | 
| 225  */ | 226  */ | 
| 226 function SpecialSubscription(url, title) | 227 function SpecialSubscription(url, title) | 
| 227 { | 228 { | 
| 228   Subscription.call(this, url, title); | 229   Subscription.call(this, url, title); | 
| 229 } | 230 } | 
| 230 exports.SpecialSubscription = SpecialSubscription; | 231 exports.SpecialSubscription = SpecialSubscription; | 
| 231 | 232 | 
| 232 SpecialSubscription.prototype = | 233 SpecialSubscription.prototype = Object.create(Subscription.prototype, desc({ | 
| 233 { |  | 
| 234   __proto__: Subscription.prototype, |  | 
| 235 |  | 
| 236   /** | 234   /** | 
| 237    * Filter types that should be added to this subscription by default | 235    * Filter types that should be added to this subscription by default | 
| 238    * (entries should correspond to keys in SpecialSubscription.defaultsMap). | 236    * (entries should correspond to keys in SpecialSubscription.defaultsMap). | 
| 239    * @type string[] | 237    * @type string[] | 
| 240    */ | 238    */ | 
| 241   defaults: null, | 239   defaults: null, | 
| 242 | 240 | 
| 243   /** | 241   /** | 
| 244    * Tests whether a filter should be added to this group by default | 242    * Tests whether a filter should be added to this group by default | 
| 245    * @param {Filter} filter filter to be tested | 243    * @param {Filter} filter filter to be tested | 
| (...skipping 19 matching lines...) Expand all  Loading... | 
| 265    * See Subscription.serialize() | 263    * See Subscription.serialize() | 
| 266    */ | 264    */ | 
| 267   serialize: function(buffer) | 265   serialize: function(buffer) | 
| 268   { | 266   { | 
| 269     Subscription.prototype.serialize.call(this, buffer); | 267     Subscription.prototype.serialize.call(this, buffer); | 
| 270     if (this.defaults && this.defaults.length) | 268     if (this.defaults && this.defaults.length) | 
| 271       buffer.push("defaults=" + this.defaults.filter((type) => type in SpecialSu
     bscription.defaultsMap).join(" ")); | 269       buffer.push("defaults=" + this.defaults.filter((type) => type in SpecialSu
     bscription.defaultsMap).join(" ")); | 
| 272     if (this._lastDownload) | 270     if (this._lastDownload) | 
| 273       buffer.push("lastDownload=" + this._lastDownload); | 271       buffer.push("lastDownload=" + this._lastDownload); | 
| 274   } | 272   } | 
| 275 }; | 273 })); | 
| 276 | 274 | 
| 277 SpecialSubscription.defaultsMap = { | 275 SpecialSubscription.defaultsMap = Object.create(null, desc({ | 
| 278   __proto__: null, |  | 
| 279   "whitelist": WhitelistFilter, | 276   "whitelist": WhitelistFilter, | 
| 280   "blocking": BlockingFilter, | 277   "blocking": BlockingFilter, | 
| 281   "elemhide": ElemHideBase | 278   "elemhide": ElemHideBase | 
| 282 }; | 279 })); | 
| 283 | 280 | 
| 284 /** | 281 /** | 
| 285  * Creates a new user-defined filter group. | 282  * Creates a new user-defined filter group. | 
| 286  * @param {String} [title]  title of the new filter group | 283  * @param {String} [title]  title of the new filter group | 
| 287  * @result {SpecialSubscription} | 284  * @result {SpecialSubscription} | 
| 288  */ | 285  */ | 
| 289 SpecialSubscription.create = function(title) | 286 SpecialSubscription.create = function(title) | 
| 290 { | 287 { | 
| 291   let url; | 288   let url; | 
| 292   do | 289   do | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 320  * @param {String} [title]  see Subscription() | 317  * @param {String} [title]  see Subscription() | 
| 321  * @constructor | 318  * @constructor | 
| 322  * @augments Subscription | 319  * @augments Subscription | 
| 323  */ | 320  */ | 
| 324 function RegularSubscription(url, title) | 321 function RegularSubscription(url, title) | 
| 325 { | 322 { | 
| 326   Subscription.call(this, url, title || url); | 323   Subscription.call(this, url, title || url); | 
| 327 } | 324 } | 
| 328 exports.RegularSubscription = RegularSubscription; | 325 exports.RegularSubscription = RegularSubscription; | 
| 329 | 326 | 
| 330 RegularSubscription.prototype = | 327 RegularSubscription.prototype = Object.create(Subscription.prototype, desc({ | 
| 331 { |  | 
| 332   __proto__: Subscription.prototype, |  | 
| 333 |  | 
| 334   _homepage: null, | 328   _homepage: null, | 
| 335   _lastDownload: 0, | 329   _lastDownload: 0, | 
| 336 | 330 | 
| 337   /** | 331   /** | 
| 338    * Filter subscription homepage if known | 332    * Filter subscription homepage if known | 
| 339    * @type String | 333    * @type String | 
| 340    */ | 334    */ | 
| 341   get homepage() | 335   homepage: { | 
| 342   { | 336     get: function() | 
| 343     return this._homepage; |  | 
| 344   }, |  | 
| 345   set homepage(value) |  | 
| 346   { |  | 
| 347     if (value != this._homepage) |  | 
| 348     { | 337     { | 
| 349       let oldValue = this._homepage; | 338       return this._homepage; | 
| 350       this._homepage = value; | 339     }, | 
| 351       FilterNotifier.triggerListeners("subscription.homepage", this, value, oldV
     alue); | 340     set: function(value) | 
|  | 341     { | 
|  | 342       if (value != this._homepage) | 
|  | 343       { | 
|  | 344         let oldValue = this._homepage; | 
|  | 345         this._homepage = value; | 
|  | 346         FilterNotifier.triggerListeners("subscription.homepage", this, value, ol
     dValue); | 
|  | 347       } | 
|  | 348       return this._homepage; | 
| 352     } | 349     } | 
| 353     return this._homepage; |  | 
| 354   }, | 350   }, | 
| 355 | 351 | 
| 356   /** | 352   /** | 
| 357    * Time of the last subscription download (in seconds since the beginning of t
     he epoch) | 353    * Time of the last subscription download (in seconds since the beginning of t
     he epoch) | 
| 358    * @type Number | 354    * @type Number | 
| 359    */ | 355    */ | 
| 360   get lastDownload() | 356   lastDownload: { | 
| 361   { | 357     get: function() | 
| 362     return this._lastDownload; |  | 
| 363   }, |  | 
| 364   set lastDownload(value) |  | 
| 365   { |  | 
| 366     if (value != this._lastDownload) |  | 
| 367     { | 358     { | 
| 368       let oldValue = this._lastDownload; | 359       return this._lastDownload; | 
| 369       this._lastDownload = value; | 360     }, | 
| 370       FilterNotifier.triggerListeners("subscription.lastDownload", this, value, 
     oldValue); | 361     set: function(value) | 
|  | 362     { | 
|  | 363       if (value != this._lastDownload) | 
|  | 364       { | 
|  | 365         let oldValue = this._lastDownload; | 
|  | 366         this._lastDownload = value; | 
|  | 367         FilterNotifier.triggerListeners("subscription.lastDownload", this, value
     , oldValue); | 
|  | 368       } | 
|  | 369       return this._lastDownload; | 
| 371     } | 370     } | 
| 372     return this._lastDownload; |  | 
| 373   }, | 371   }, | 
| 374 | 372 | 
| 375   /** | 373   /** | 
| 376    * See Subscription.serialize() | 374    * See Subscription.serialize() | 
| 377    */ | 375    */ | 
| 378   serialize: function(buffer) | 376   serialize: function(buffer) | 
| 379   { | 377   { | 
| 380     Subscription.prototype.serialize.call(this, buffer); | 378     Subscription.prototype.serialize.call(this, buffer); | 
| 381     if (this._homepage) | 379     if (this._homepage) | 
| 382       buffer.push("homepage=" + this._homepage); | 380       buffer.push("homepage=" + this._homepage); | 
| 383     if (this._lastDownload) | 381     if (this._lastDownload) | 
| 384       buffer.push("lastDownload=" + this._lastDownload); | 382       buffer.push("lastDownload=" + this._lastDownload); | 
| 385   } | 383   } | 
| 386 }; | 384 })); | 
| 387 | 385 | 
| 388 /** | 386 /** | 
| 389  * Class for filter subscriptions updated externally (by other extension) | 387  * Class for filter subscriptions updated externally (by other extension) | 
| 390  * @param {String} url    see Subscription() | 388  * @param {String} url    see Subscription() | 
| 391  * @param {String} [title]  see Subscription() | 389  * @param {String} [title]  see Subscription() | 
| 392  * @constructor | 390  * @constructor | 
| 393  * @augments RegularSubscription | 391  * @augments RegularSubscription | 
| 394  */ | 392  */ | 
| 395 function ExternalSubscription(url, title) | 393 function ExternalSubscription(url, title) | 
| 396 { | 394 { | 
| 397   RegularSubscription.call(this, url, title); | 395   RegularSubscription.call(this, url, title); | 
| 398 } | 396 } | 
| 399 exports.ExternalSubscription = ExternalSubscription; | 397 exports.ExternalSubscription = ExternalSubscription; | 
| 400 | 398 | 
| 401 ExternalSubscription.prototype = | 399 ExternalSubscription.prototype = Object.create(RegularSubscription.prototype, de
     sc({ | 
| 402 { |  | 
| 403   __proto__: RegularSubscription.prototype, |  | 
| 404 |  | 
| 405   /** | 400   /** | 
| 406    * See Subscription.serialize() | 401    * See Subscription.serialize() | 
| 407    */ | 402    */ | 
| 408   serialize: function(buffer) | 403   serialize: function(buffer) | 
| 409   { | 404   { | 
| 410     throw new Error("Unexpected call, external subscriptions should not be seria
     lized"); | 405     throw new Error("Unexpected call, external subscriptions should not be seria
     lized"); | 
| 411   } | 406   } | 
| 412 }; | 407 })); | 
| 413 | 408 | 
| 414 /** | 409 /** | 
| 415  * Class for filter subscriptions updated externally (by other extension) | 410  * Class for filter subscriptions updated externally (by other extension) | 
| 416  * @param {String} url  see Subscription() | 411  * @param {String} url  see Subscription() | 
| 417  * @param {String} [title]  see Subscription() | 412  * @param {String} [title]  see Subscription() | 
| 418  * @constructor | 413  * @constructor | 
| 419  * @augments RegularSubscription | 414  * @augments RegularSubscription | 
| 420  */ | 415  */ | 
| 421 function DownloadableSubscription(url, title) | 416 function DownloadableSubscription(url, title) | 
| 422 { | 417 { | 
| 423   RegularSubscription.call(this, url, title); | 418   RegularSubscription.call(this, url, title); | 
| 424 } | 419 } | 
| 425 exports.DownloadableSubscription = DownloadableSubscription; | 420 exports.DownloadableSubscription = DownloadableSubscription; | 
| 426 | 421 | 
| 427 DownloadableSubscription.prototype = | 422 DownloadableSubscription.prototype = Object.create(RegularSubscription.prototype
     , desc({ | 
| 428 { |  | 
| 429   __proto__: RegularSubscription.prototype, |  | 
| 430 |  | 
| 431   _downloadStatus: null, | 423   _downloadStatus: null, | 
| 432   _lastCheck: 0, | 424   _lastCheck: 0, | 
| 433   _errors: 0, | 425   _errors: 0, | 
| 434 | 426 | 
| 435   /** | 427   /** | 
| 436    * Status of the last download (ID of a string) | 428    * Status of the last download (ID of a string) | 
| 437    * @type String | 429    * @type String | 
| 438    */ | 430    */ | 
| 439   get downloadStatus() | 431   downloadStatus: { | 
| 440   { | 432     get: function() | 
| 441     return this._downloadStatus; | 433     { | 
| 442   }, | 434       return this._downloadStatus; | 
| 443   set downloadStatus(value) | 435     }, | 
| 444   { | 436     set: function(value) | 
| 445     let oldValue = this._downloadStatus; | 437     { | 
| 446     this._downloadStatus = value; | 438       let oldValue = this._downloadStatus; | 
| 447     FilterNotifier.triggerListeners("subscription.downloadStatus", this, value, 
     oldValue); | 439       this._downloadStatus = value; | 
| 448     return this._downloadStatus; | 440       FilterNotifier.triggerListeners("subscription.downloadStatus", this, value
     , oldValue); | 
|  | 441       return this._downloadStatus; | 
|  | 442     } | 
| 449   }, | 443   }, | 
| 450 | 444 | 
| 451   /** | 445   /** | 
| 452    * Time of the last successful download (in seconds since the beginning of the | 446    * Time of the last successful download (in seconds since the beginning of the | 
| 453    * epoch). | 447    * epoch). | 
| 454    */ | 448    */ | 
| 455   lastSuccess: 0, | 449   lastSuccess: 0, | 
| 456 | 450 | 
| 457   /** | 451   /** | 
| 458    * Time when the subscription was considered for an update last time (in secon
     ds | 452    * Time when the subscription was considered for an update last time (in secon
     ds | 
| 459    * since the beginning of the epoch). This will be used to increase softExpira
     tion | 453    * since the beginning of the epoch). This will be used to increase softExpira
     tion | 
| 460    * if the user doesn't use Adblock Plus for some time. | 454    * if the user doesn't use Adblock Plus for some time. | 
| 461    * @type Number | 455    * @type Number | 
| 462    */ | 456    */ | 
| 463   get lastCheck() | 457   lastCheck: { | 
| 464   { | 458     get: function() | 
| 465     return this._lastCheck; |  | 
| 466   }, |  | 
| 467   set lastCheck(value) |  | 
| 468   { |  | 
| 469     if (value != this._lastCheck) |  | 
| 470     { | 459     { | 
| 471       let oldValue = this._lastCheck; | 460       return this._lastCheck; | 
| 472       this._lastCheck = value; | 461     }, | 
| 473       FilterNotifier.triggerListeners("subscription.lastCheck", this, value, old
     Value); | 462     set: function(value) | 
|  | 463     { | 
|  | 464       if (value != this._lastCheck) | 
|  | 465       { | 
|  | 466         let oldValue = this._lastCheck; | 
|  | 467         this._lastCheck = value; | 
|  | 468         FilterNotifier.triggerListeners("subscription.lastCheck", this, value, o
     ldValue); | 
|  | 469       } | 
|  | 470       return this._lastCheck; | 
| 474     } | 471     } | 
| 475     return this._lastCheck; |  | 
| 476   }, | 472   }, | 
| 477 | 473 | 
| 478   /** | 474   /** | 
| 479    * Hard expiration time of the filter subscription (in seconds since the begin
     ning of the epoch) | 475    * Hard expiration time of the filter subscription (in seconds since the begin
     ning of the epoch) | 
| 480    * @type Number | 476    * @type Number | 
| 481    */ | 477    */ | 
| 482   expires: 0, | 478   expires: 0, | 
| 483 | 479 | 
| 484   /** | 480   /** | 
| 485    * Soft expiration time of the filter subscription (in seconds since the begin
     ning of the epoch) | 481    * Soft expiration time of the filter subscription (in seconds since the begin
     ning of the epoch) | 
| 486    * @type Number | 482    * @type Number | 
| 487    */ | 483    */ | 
| 488   softExpiration: 0, | 484   softExpiration: 0, | 
| 489 | 485 | 
| 490   /** | 486   /** | 
| 491    * Number of download failures since last success | 487    * Number of download failures since last success | 
| 492    * @type Number | 488    * @type Number | 
| 493    */ | 489    */ | 
| 494   get errors() | 490   errors: { | 
| 495   { | 491     get: function() | 
| 496     return this._errors; |  | 
| 497   }, |  | 
| 498   set errors(value) |  | 
| 499   { |  | 
| 500     if (value != this._errors) |  | 
| 501     { | 492     { | 
| 502       let oldValue = this._errors; | 493       return this._errors; | 
| 503       this._errors = value; | 494     }, | 
| 504       FilterNotifier.triggerListeners("subscription.errors", this, value, oldVal
     ue); | 495     set: function(value) | 
|  | 496     { | 
|  | 497       if (value != this._errors) | 
|  | 498       { | 
|  | 499         let oldValue = this._errors; | 
|  | 500         this._errors = value; | 
|  | 501         FilterNotifier.triggerListeners("subscription.errors", this, value, oldV
     alue); | 
|  | 502       } | 
|  | 503       return this._errors; | 
| 505     } | 504     } | 
| 506     return this._errors; |  | 
| 507   }, | 505   }, | 
| 508 | 506 | 
| 509   /** | 507   /** | 
| 510    * Version of the subscription data retrieved on last successful download | 508    * Version of the subscription data retrieved on last successful download | 
| 511    * @type Number | 509    * @type Number | 
| 512    */ | 510    */ | 
| 513   version: 0, | 511   version: 0, | 
| 514 | 512 | 
| 515   /** | 513   /** | 
| 516    * Minimal Adblock Plus version required for this subscription | 514    * Minimal Adblock Plus version required for this subscription | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 542       buffer.push("softExpiration=" + this.softExpiration); | 540       buffer.push("softExpiration=" + this.softExpiration); | 
| 543     if (this.errors) | 541     if (this.errors) | 
| 544       buffer.push("errors=" + this.errors); | 542       buffer.push("errors=" + this.errors); | 
| 545     if (this.version) | 543     if (this.version) | 
| 546       buffer.push("version=" + this.version); | 544       buffer.push("version=" + this.version); | 
| 547     if (this.requiredVersion) | 545     if (this.requiredVersion) | 
| 548       buffer.push("requiredVersion=" + this.requiredVersion); | 546       buffer.push("requiredVersion=" + this.requiredVersion); | 
| 549     if (this.downloadCount) | 547     if (this.downloadCount) | 
| 550       buffer.push("downloadCount=" + this.downloadCount); | 548       buffer.push("downloadCount=" + this.downloadCount); | 
| 551   } | 549   } | 
| 552 }; | 550 })); | 
| OLD | NEW | 
|---|