| 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 /** @module prefs */ | 18 /** @module prefs */ | 
| 19 | 19 | 
| 20 let {EventEmitter} = require("events"); | 20 "use strict"; | 
|  | 21 | 
|  | 22 const {EventEmitter} = require("events"); | 
| 21 | 23 | 
| 22 const keyPrefix = "pref:"; | 24 const keyPrefix = "pref:"; | 
| 23 | 25 | 
| 24 let eventEmitter = new EventEmitter(); | 26 let eventEmitter = new EventEmitter(); | 
| 25 let overrides = Object.create(null); | 27 let overrides = Object.create(null); | 
| 26 | 28 | 
| 27 /** @lends module:prefs.Prefs */ | 29 /** @lends module:prefs.Prefs */ | 
| 28 let defaults = Object.create(null); | 30 let defaults = Object.create(null); | 
| 29 | 31 | 
| 30 /** | 32 /** | 
| (...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 181   * @static | 183   * @static | 
| 182   */ | 184   */ | 
| 183 let Prefs = exports.Prefs = { | 185 let Prefs = exports.Prefs = { | 
| 184   /** | 186   /** | 
| 185    * Adds a callback that is called when the | 187    * Adds a callback that is called when the | 
| 186    * value of a specified preference changed. | 188    * value of a specified preference changed. | 
| 187    * | 189    * | 
| 188    * @param {string}   preference | 190    * @param {string}   preference | 
| 189    * @param {function} callback | 191    * @param {function} callback | 
| 190    */ | 192    */ | 
| 191   on: function(preference, callback) | 193   on(preference, callback) | 
| 192   { | 194   { | 
| 193     eventEmitter.on(preference, callback); | 195     eventEmitter.on(preference, callback); | 
| 194   }, | 196   }, | 
| 195 | 197 | 
| 196   /** | 198   /** | 
| 197    * Removes a callback for the specified preference. | 199    * Removes a callback for the specified preference. | 
| 198    * | 200    * | 
| 199    * @param {string}   preference | 201    * @param {string}   preference | 
| 200    * @param {function} callback | 202    * @param {function} callback | 
| 201    */ | 203    */ | 
| 202   off: function(preference, callback) | 204   off(preference, callback) | 
| 203   { | 205   { | 
| 204     eventEmitter.off(preference, callback); | 206     eventEmitter.off(preference, callback); | 
| 205   }, | 207   }, | 
| 206 | 208 | 
| 207   /** | 209   /** | 
| 208    * A promise that is fullfilled when all preferences have been loaded. | 210    * A promise that is fullfilled when all preferences have been loaded. | 
| 209    * Wait for this promise to be fulfilled before using preferences during | 211    * Wait for this promise to be fulfilled before using preferences during | 
| 210    * extension initialization. | 212    * extension initialization. | 
| 211    * | 213    * | 
| 212    * @type {Promise} | 214    * @type {Promise} | 
| (...skipping 10 matching lines...) Expand all  Loading... | 
| 223 } | 225 } | 
| 224 | 226 | 
| 225 function prefToKey(pref) | 227 function prefToKey(pref) | 
| 226 { | 228 { | 
| 227   return keyPrefix + pref; | 229   return keyPrefix + pref; | 
| 228 } | 230 } | 
| 229 | 231 | 
| 230 function addPreference(pref) | 232 function addPreference(pref) | 
| 231 { | 233 { | 
| 232   Object.defineProperty(Prefs, pref, { | 234   Object.defineProperty(Prefs, pref, { | 
| 233     get: function() | 235     get() { return (pref in overrides ? overrides : defaults)[pref]; }, | 
| 234     { | 236     set(value) | 
| 235       return (pref in overrides ? overrides : defaults)[pref]; |  | 
| 236     }, |  | 
| 237     set: function(value) |  | 
| 238     { | 237     { | 
| 239       let defaultValue = defaults[pref]; | 238       let defaultValue = defaults[pref]; | 
| 240 | 239 | 
| 241       if (typeof value != typeof defaultValue) | 240       if (typeof value != typeof defaultValue) | 
| 242         throw new Error("Attempt to change preference type"); | 241         throw new Error("Attempt to change preference type"); | 
| 243 | 242 | 
| 244       if (value == defaultValue) | 243       if (value == defaultValue) | 
| 245       { | 244       { | 
| 246         delete overrides[pref]; | 245         delete overrides[pref]; | 
| 247         ext.storage.remove(prefToKey(pref)); | 246         ext.storage.remove(prefToKey(pref)); | 
| 248       } | 247       } | 
| 249       else | 248       else | 
| 250       { | 249       { | 
| 251         overrides[pref] = value; | 250         overrides[pref] = value; | 
| 252         ext.storage.set(prefToKey(pref), value); | 251         ext.storage.set(prefToKey(pref), value); | 
| 253       } | 252       } | 
| 254     }, | 253     }, | 
| 255     enumerable: true | 254     enumerable: true | 
| 256   }); | 255   }); | 
| 257 } | 256 } | 
| 258 | 257 | 
| 259 function init() | 258 function init() | 
| 260 { | 259 { | 
| 261   let prefs = Object.keys(defaults); | 260   let prefs = Object.keys(defaults); | 
| 262   prefs.forEach(addPreference); | 261   prefs.forEach(addPreference); | 
| 263 | 262 | 
| 264   let localLoaded = new Promise(resolve => { | 263   let localLoaded = new Promise(resolve => { | 
| 265     ext.storage.get(prefs.map(prefToKey), function(items) | 264     ext.storage.get(prefs.map(prefToKey), items => | 
| 266     { | 265     { | 
| 267       for (let key in items) | 266       for (let key in items) | 
| 268         overrides[keyToPref(key)] = items[key]; | 267         overrides[keyToPref(key)] = items[key]; | 
| 269 | 268 | 
| 270       resolve(); | 269       resolve(); | 
| 271     }); | 270     }); | 
| 272   }); | 271   }); | 
| 273 | 272 | 
| 274   let managedLoaded = new Promise(resolve => { | 273   let managedLoaded = new Promise(resolve => { | 
| 275     if (require("info").platform == "chromium" && "managed" in chrome.storage) | 274     if (require("info").platform == "chromium" && "managed" in chrome.storage) | 
| 276     { | 275     { | 
| 277       chrome.storage.managed.get(null, function(items) | 276       chrome.storage.managed.get(null, items => | 
| 278       { | 277       { | 
| 279         // Opera doesn't support chrome.storage.managed, but instead simply | 278         // Opera doesn't support chrome.storage.managed, but instead simply | 
| 280         // removing the API, Opera sets chrome.runtime.lastError when using it. | 279         // removing the API, Opera sets chrome.runtime.lastError when using it. | 
| 281         // So we have to retrieve that error, to prevent it from showing up | 280         // So we have to retrieve that error, to prevent it from showing up | 
| 282         // in the console. | 281         // in the console. | 
| 283         chrome.runtime.lastError; | 282         chrome.runtime.lastError; | 
| 284 | 283 | 
| 285         for (let key in items) | 284         for (let key in items) | 
| 286           defaults[key] = items[key]; | 285           defaults[key] = items[key]; | 
| 287 | 286 | 
| 288         resolve(); | 287         resolve(); | 
| 289       }); | 288       }); | 
| 290     } | 289     } | 
| 291     else | 290     else | 
| 292     { | 291     { | 
| 293       resolve(); | 292       resolve(); | 
| 294     } | 293     } | 
| 295   }); | 294   }); | 
| 296 | 295 | 
| 297   function onLoaded() | 296   function onLoaded() | 
| 298   { | 297   { | 
| 299     ext.storage.onChanged.addListener(function(changes) | 298     ext.storage.onChanged.addListener(changes => | 
| 300     { | 299     { | 
| 301       for (let key in changes) | 300       for (let key in changes) | 
| 302       { | 301       { | 
| 303         let pref = keyToPref(key); | 302         let pref = keyToPref(key); | 
| 304         if (pref && pref in defaults) | 303         if (pref && pref in defaults) | 
| 305         { | 304         { | 
| 306           let change = changes[key]; | 305           let change = changes[key]; | 
| 307           if ("newValue" in change && change.newValue != defaults[pref]) | 306           if ("newValue" in change && change.newValue != defaults[pref]) | 
| 308             overrides[pref] = change.newValue; | 307             overrides[pref] = change.newValue; | 
| 309           else | 308           else | 
| 310             delete overrides[pref]; | 309             delete overrides[pref]; | 
| 311 | 310 | 
| 312           eventEmitter.emit(pref); | 311           eventEmitter.emit(pref); | 
| 313         } | 312         } | 
| 314       } | 313       } | 
| 315     }); | 314     }); | 
| 316   } | 315   } | 
| 317 | 316 | 
| 318   Prefs.untilLoaded = Promise.all([localLoaded, managedLoaded]).then(onLoaded); | 317   Prefs.untilLoaded = Promise.all([localLoaded, managedLoaded]).then(onLoaded); | 
| 319 } | 318 } | 
| 320 | 319 | 
| 321 init(); | 320 init(); | 
| OLD | NEW | 
|---|