| 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 |