| LEFT | RIGHT | 
|---|
| 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 14 matching lines...) Expand all  Loading... | 
| 25 | 25 | 
| 26 const MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000; | 26 const MILLIS_IN_SECOND = exports.MILLIS_IN_SECOND = 1000; | 
| 27 const MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; | 27 const MILLIS_IN_MINUTE = exports.MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND; | 
| 28 const MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; | 28 const MILLIS_IN_HOUR = exports.MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE; | 
| 29 const MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; | 29 const MILLIS_IN_DAY = exports.MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR; | 
| 30 | 30 | 
| 31 class Downloader | 31 class Downloader | 
| 32 { | 32 { | 
| 33   /** | 33   /** | 
| 34    * Creates a new downloader instance. | 34    * Creates a new downloader instance. | 
| 35    * @param {Function} dataSource | 35    * @param {function} dataSource | 
| 36    *   Function that will yield downloadable objects on each check | 36    *   Function that will yield downloadable objects on each check | 
| 37    * @param {number} initialDelay | 37    * @param {number} initialDelay | 
| 38    *   Number of milliseconds to wait before the first check | 38    *   Number of milliseconds to wait before the first check | 
| 39    * @param {number} checkInterval | 39    * @param {number} checkInterval | 
| 40    *   Interval between the checks | 40    *   Interval between the checks | 
| 41    */ | 41    */ | 
| 42   constructor(dataSource, initialDelay, checkInterval) | 42   constructor(dataSource, initialDelay, checkInterval) | 
| 43   { | 43   { | 
| 44     /** | 44     /** | 
| 45      * Maximal time interval that the checks can be left out until the soft | 45      * Maximal time interval that the checks can be left out until the soft | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 62     this.maxExpirationInterval = 14 * MILLIS_IN_DAY; | 62     this.maxExpirationInterval = 14 * MILLIS_IN_DAY; | 
| 63 | 63 | 
| 64     /** | 64     /** | 
| 65      * Maximal number of redirects before the download is considered as failed. | 65      * Maximal number of redirects before the download is considered as failed. | 
| 66      * @type {number} | 66      * @type {number} | 
| 67      */ | 67      */ | 
| 68     this.maxRedirects = 5; | 68     this.maxRedirects = 5; | 
| 69 | 69 | 
| 70     /** | 70     /** | 
| 71      * Called whenever expiration intervals for an object need to be adapted. | 71      * Called whenever expiration intervals for an object need to be adapted. | 
| 72      * @type {Function} | 72      * @type {function?} | 
| 73      */ | 73      */ | 
| 74     this.onExpirationChange = null; | 74     this.onExpirationChange = null; | 
| 75 | 75 | 
| 76     /** | 76     /** | 
| 77      * Callback to be triggered whenever a download starts. | 77      * Callback to be triggered whenever a download starts. | 
| 78      * @type {Function} | 78      * @type {function?} | 
| 79      */ | 79      */ | 
| 80     this.onDownloadStarted = null; | 80     this.onDownloadStarted = null; | 
| 81 | 81 | 
| 82     /** | 82     /** | 
| 83      * Callback to be triggered whenever a download finishes successfully. The | 83      * Callback to be triggered whenever a download finishes successfully. The | 
| 84      * callback can return an error code to indicate that the data is wrong. | 84      * callback can return an error code to indicate that the data is wrong. | 
| 85      * @type {Function} | 85      * @type {function?} | 
| 86      */ | 86      */ | 
| 87     this.onDownloadSuccess = null; | 87     this.onDownloadSuccess = null; | 
| 88 | 88 | 
| 89     /** | 89     /** | 
| 90      * Callback to be triggered whenever a download fails. | 90      * Callback to be triggered whenever a download fails. | 
| 91      * @type {Function} | 91      * @type {function?} | 
| 92      */ | 92      */ | 
| 93     this.onDownloadError = null; | 93     this.onDownloadError = null; | 
| 94 | 94 | 
| 95     /** | 95     /** | 
| 96      * Function that will yield downloadable objects on each check. | 96      * Function that will yield downloadable objects on each check. | 
| 97      * @type {Function} | 97      * @type {function} | 
| 98      */ | 98      */ | 
| 99     this.dataSource = dataSource; | 99     this.dataSource = dataSource; | 
|  | 100 | 
| 100     /** | 101     /** | 
| 101      * Timer triggering the downloads. | 102      * Timer triggering the downloads. | 
| 102      * @type {nsITimer} | 103      * @type {nsITimer} | 
| 103      */ | 104      */ | 
| 104     this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 105     this._timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); | 
| 105     this._timer.initWithCallback(() => | 106     this._timer.initWithCallback(() => | 
| 106     { | 107     { | 
| 107       this._timer.delay = checkInterval; | 108       this._timer.delay = checkInterval; | 
| 108       this._doCheck(); | 109       this._doCheck(); | 
| 109     }, initialDelay, Ci.nsITimer.TYPE_REPEATING_SLACK); | 110     }, initialDelay, Ci.nsITimer.TYPE_REPEATING_SLACK); | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 166    * Stops the periodic checks. | 167    * Stops the periodic checks. | 
| 167    */ | 168    */ | 
| 168   cancel() | 169   cancel() | 
| 169   { | 170   { | 
| 170     this._timer.cancel(); | 171     this._timer.cancel(); | 
| 171   } | 172   } | 
| 172 | 173 | 
| 173   /** | 174   /** | 
| 174    * Checks whether an address is currently being downloaded. | 175    * Checks whether an address is currently being downloaded. | 
| 175    * @param {string} url | 176    * @param {string} url | 
| 176    * @return {boolean} | 177    * @returns {boolean} | 
| 177    */ | 178    */ | 
| 178   isDownloading(url) | 179   isDownloading(url) | 
| 179   { | 180   { | 
| 180     return this._downloading.has(url); | 181     return this._downloading.has(url); | 
| 181   } | 182   } | 
| 182 | 183 | 
| 183   /** | 184   /** | 
| 184    * Starts downloading for an object. | 185    * Starts downloading for an object. | 
| 185    * @param {Downloadable} downloadable | 186    * @param {Downloadable} downloadable | 
| 186    */ | 187    */ | 
| 187   download(downloadable) | 188   download(downloadable) | 
| 188   { | 189   { | 
| 189     // Make sure to detach download from the current execution context | 190     // Make sure to detach download from the current execution context | 
| 190     Utils.runAsync(this._download.bind(this, downloadable, 0)); | 191     Utils.runAsync(this._download.bind(this, downloadable, 0)); | 
| 191   } | 192   } | 
| 192 | 193 | 
| 193   /** | 194   /** | 
| 194    * Generates the real download URL for an object by appending various | 195    * Generates the real download URL for an object by appending various | 
| 195    * parameters. | 196    * parameters. | 
| 196    * @param {Downloadable} downloadable | 197    * @param {Downloadable} downloadable | 
| 197    * @return {string} | 198    * @returns {string} | 
| 198    */ | 199    */ | 
| 199   getDownloadUrl(downloadable) | 200   getDownloadUrl(downloadable) | 
| 200   { | 201   { | 
| 201     const {addonName, addonVersion, application, applicationVersion, | 202     const {addonName, addonVersion, application, applicationVersion, | 
| 202            platform, platformVersion} = require("info"); | 203            platform, platformVersion} = require("info"); | 
| 203     let url = downloadable.redirectURL || downloadable.url; | 204     let url = downloadable.redirectURL || downloadable.url; | 
| 204     if (url.includes("?")) | 205     if (url.includes("?")) | 
| 205       url += "&"; | 206       url += "&"; | 
| 206     else | 207     else | 
| 207       url += "?"; | 208       url += "?"; | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 335 | 336 | 
| 336     this._downloading.add(downloadable.url); | 337     this._downloading.add(downloadable.url); | 
| 337     if (this.onDownloadStarted) | 338     if (this.onDownloadStarted) | 
| 338       this.onDownloadStarted(downloadable); | 339       this.onDownloadStarted(downloadable); | 
| 339   } | 340   } | 
| 340 | 341 | 
| 341   /** | 342   /** | 
| 342    * Produces a soft and a hard expiration interval for a given supplied | 343    * Produces a soft and a hard expiration interval for a given supplied | 
| 343    * expiration interval. | 344    * expiration interval. | 
| 344    * @param {number} interval | 345    * @param {number} interval | 
| 345    * @return {Array} soft and hard expiration interval | 346    * @returns {Array.<number>} soft and hard expiration interval | 
| 346    */ | 347    */ | 
| 347   processExpirationInterval(interval) | 348   processExpirationInterval(interval) | 
| 348   { | 349   { | 
| 349     interval = Math.min(Math.max(interval, 0), this.maxExpirationInterval); | 350     interval = Math.min(Math.max(interval, 0), this.maxExpirationInterval); | 
| 350     let soft = Math.round(interval * (Math.random() * 0.4 + 0.8)); | 351     let soft = Math.round(interval * (Math.random() * 0.4 + 0.8)); | 
| 351     let hard = interval * 2; | 352     let hard = interval * 2; | 
| 352     let now = Date.now(); | 353     let now = Date.now(); | 
| 353     return [now + soft, now + hard]; | 354     return [now + soft, now + hard]; | 
| 354   } | 355   } | 
| 355 } | 356 } | 
|  | 357 | 
| 356 exports.Downloader = Downloader; | 358 exports.Downloader = Downloader; | 
| 357 | 359 | 
| 358 class Downloadable | 360 class Downloadable | 
| 359 { | 361 { | 
| 360   /** | 362   /** | 
| 361    * An object that can be downloaded by the downloadable | 363    * Creates an object that can be downloaded by the downloader. | 
| 362    * @param {string} url  URL that has to be requested for the object | 364    * @param {string} url  URL that has to be requested for the object | 
| 363    */ | 365    */ | 
| 364   constructor(url) | 366   constructor(url) | 
| 365   { | 367   { | 
|  | 368     /** | 
|  | 369      * URL that the download was redirected to if any. | 
|  | 370      * @type {string?} | 
|  | 371      */ | 
|  | 372     this.redirectURL = null; | 
|  | 373 | 
|  | 374     /** | 
|  | 375      * Time of last download error or 0 if the last download was successful. | 
|  | 376      * @type {number} | 
|  | 377      */ | 
|  | 378     this.lastError = 0; | 
|  | 379 | 
|  | 380     /** | 
|  | 381      * Time of last check whether the object needs downloading. | 
|  | 382      * @type {number} | 
|  | 383      */ | 
|  | 384     this.lastCheck = 0; | 
|  | 385 | 
|  | 386     /** | 
|  | 387      * Object version corresponding to the last successful download. | 
|  | 388      * @type {number} | 
|  | 389      */ | 
|  | 390     this.lastVersion = 0; | 
|  | 391 | 
|  | 392     /** | 
|  | 393      * Soft expiration interval; will increase if no checks are performed for a | 
|  | 394      * while. | 
|  | 395      * @type {number} | 
|  | 396      */ | 
|  | 397     this.softExpiration = 0; | 
|  | 398 | 
|  | 399     /** | 
|  | 400      * Hard expiration interval; this is fixed. | 
|  | 401      * @type {number} | 
|  | 402      */ | 
|  | 403     this.hardExpiration = 0; | 
|  | 404 | 
|  | 405     /** | 
|  | 406      * Number indicating how often the object was downloaded. | 
|  | 407      * @type {number} | 
|  | 408      */ | 
|  | 409     this.downloadCount = 0; | 
|  | 410 | 
| 366     /** | 411     /** | 
| 367      * URL that has to be requested for the object. | 412      * URL that has to be requested for the object. | 
| 368      * @type {string} | 413      * @type {string} | 
| 369      */ | 414      */ | 
| 370     this.url = null; |  | 
| 371 |  | 
| 372     /** |  | 
| 373      * URL that the download was redirected to if any. |  | 
| 374      * @type {string} |  | 
| 375      */ |  | 
| 376     this.redirectURL = null; |  | 
| 377 |  | 
| 378     /** |  | 
| 379      * Time of last download error or 0 if the last download was successful. |  | 
| 380      * @type {number} |  | 
| 381      */ |  | 
| 382     this.lastError = 0; |  | 
| 383 |  | 
| 384     /** |  | 
| 385      * Time of last check whether the object needs downloading. |  | 
| 386      * @type {number} |  | 
| 387      */ |  | 
| 388     this.lastCheck = 0; |  | 
| 389 |  | 
| 390     /** |  | 
| 391      * Object version corresponding to the last successful download. |  | 
| 392      * @type {number} |  | 
| 393      */ |  | 
| 394     this.lastVersion = 0; |  | 
| 395 |  | 
| 396     /** |  | 
| 397      * Soft expiration interval; will increase if no checks are performed for a |  | 
| 398      * while. |  | 
| 399      * @type {number} |  | 
| 400      */ |  | 
| 401     this.softExpiration = 0; |  | 
| 402 |  | 
| 403     /** |  | 
| 404      * Hard expiration interval; this is fixed. |  | 
| 405      * @type {number} |  | 
| 406      */ |  | 
| 407     this.hardExpiration = 0; |  | 
| 408 |  | 
| 409     /** |  | 
| 410      * Number indicating how often the object was downloaded. |  | 
| 411      * @type {number} |  | 
| 412      */ |  | 
| 413     this.downloadCount = 0; |  | 
| 414     this.url = url; | 415     this.url = url; | 
| 415   } | 416   } | 
| 416 } | 417 } | 
|  | 418 | 
| 417 exports.Downloadable = Downloadable; | 419 exports.Downloadable = Downloadable; | 
| LEFT | RIGHT | 
|---|