| 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-2015 Eyeo GmbH | 3 * Copyright (C) 2006-2015 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 let Prefs = exports.Prefs = { | 162 let Prefs = exports.Prefs = { |
| 163 /** | 163 /** |
| 164 * Fired when the value of a preference changes. | 164 * Fired when the value of a preference changes. |
| 165 * | 165 * |
| 166 * @event | 166 * @event |
| 167 * @property {string} pref The name of the preference that changed. | 167 * @property {string} pref The name of the preference that changed. |
| 168 */ | 168 */ |
| 169 onChanged: new ext._EventTarget(), | 169 onChanged: new ext._EventTarget(), |
| 170 | 170 |
| 171 /** | 171 /** |
| 172 * Fired when all preferences have been loaded. You must wait for | 172 * A promise that is fullfilled when all preferences have been loaded. |
| 173 * this event before using preferences during extension initialization. | 173 * Wait for this promise to be fulfilled before using preferences during |
| 174 * extension initialization. |
| 174 * | 175 * |
| 175 * @event | 176 * @type {Promise} |
| 176 */ | 177 */ |
| 177 onLoaded: new ext._EventTarget() | 178 isLoaded: null |
| 178 }; | 179 }; |
| 179 | 180 |
| 180 function keyToPref(key) | 181 function keyToPref(key) |
| 181 { | 182 { |
| 182 if (key.indexOf(keyPrefix) != 0) | 183 if (key.indexOf(keyPrefix) != 0) |
| 183 return null; | 184 return null; |
| 184 | 185 |
| 185 return key.substr(keyPrefix.length); | 186 return key.substr(keyPrefix.length); |
| 186 } | 187 } |
| 187 | 188 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 217 }, | 218 }, |
| 218 enumerable: true | 219 enumerable: true |
| 219 }); | 220 }); |
| 220 } | 221 } |
| 221 | 222 |
| 222 function init() | 223 function init() |
| 223 { | 224 { |
| 224 let prefs = Object.keys(defaults); | 225 let prefs = Object.keys(defaults); |
| 225 prefs.forEach(addPreference); | 226 prefs.forEach(addPreference); |
| 226 | 227 |
| 227 let localLoaded = false; | 228 let localLoaded = new Promise(resolve => { |
| 228 let managedLoaded = false; | 229 ext.storage.get(prefs.map(prefToKey), function(items) |
| 230 { |
| 231 for (let key in items) |
| 232 overrides[keyToPref(key)] = items[key]; |
| 229 | 233 |
| 230 let checkLoaded = function() | 234 resolve(); |
| 235 }); |
| 236 }); |
| 237 |
| 238 let managedLoaded = new Promise(resolve => { |
| 239 if (require("info").platform == "chromium" && "managed" in chrome.storage) |
| 240 { |
| 241 chrome.storage.managed.get(null, function(items) |
| 242 { |
| 243 // Opera doesn't support chrome.storage.managed, but instead simply |
| 244 // removing the API, Opera sets chrome.runtime.lastError when using it. |
| 245 // So we have to retrieve that error, to prevent it from showing up |
| 246 // in the console. |
| 247 chrome.runtime.lastError; |
| 248 |
| 249 for (let key in items) |
| 250 defaults[key] = items[key]; |
| 251 |
| 252 resolve(); |
| 253 }); |
| 254 } |
| 255 else |
| 256 { |
| 257 resolve(); |
| 258 } |
| 259 }); |
| 260 |
| 261 function onLoaded() |
| 231 { | 262 { |
| 232 if (!localLoaded || !managedLoaded) | |
| 233 return; | |
| 234 | |
| 235 ext.storage.onChanged.addListener(function(changes) | 263 ext.storage.onChanged.addListener(function(changes) |
| 236 { | 264 { |
| 237 for (let key in changes) | 265 for (let key in changes) |
| 238 { | 266 { |
| 239 let pref = keyToPref(key); | 267 let pref = keyToPref(key); |
| 240 if (pref && pref in defaults) | 268 if (pref && pref in defaults) |
| 241 { | 269 { |
| 242 let change = changes[key]; | 270 let change = changes[key]; |
| 243 if ("newValue" in change && change.newValue != defaults[pref]) | 271 if ("newValue" in change && change.newValue != defaults[pref]) |
| 244 overrides[pref] = change.newValue; | 272 overrides[pref] = change.newValue; |
| 245 else | 273 else |
| 246 delete overrides[pref]; | 274 delete overrides[pref]; |
| 247 | 275 |
| 248 Prefs.onChanged._dispatch(pref); | 276 Prefs.onChanged._dispatch(pref); |
| 249 } | 277 } |
| 250 } | 278 } |
| 251 }); | 279 }); |
| 280 } |
| 252 | 281 |
| 253 Prefs.onLoaded._dispatch(); | 282 Prefs.isLoaded = Promise.all([localLoaded, managedLoaded]).then(onLoaded); |
| 254 }; | |
| 255 | |
| 256 ext.storage.get(prefs.map(prefToKey), function(items) | |
| 257 { | |
| 258 for (let key in items) | |
| 259 overrides[keyToPref(key)] = items[key]; | |
| 260 | |
| 261 localLoaded = true; | |
| 262 checkLoaded(); | |
| 263 }); | |
| 264 | |
| 265 if (require("info").platform == "chromium" && "managed" in chrome.storage) | |
| 266 { | |
| 267 chrome.storage.managed.get(null, function(items) | |
| 268 { | |
| 269 // Opera doesn't support chrome.storage.managed, but instead simply | |
| 270 // removing the API, Opera sets chrome.runtime.lastError when using it. | |
| 271 // So we have to retrieve that error, to prevent it from showing up | |
| 272 // in the console. | |
| 273 chrome.runtime.lastError; | |
| 274 | |
| 275 for (let key in items) | |
| 276 defaults[key] = items[key]; | |
| 277 | |
| 278 managedLoaded = true; | |
| 279 checkLoaded(); | |
| 280 }); | |
| 281 } | |
| 282 else | |
| 283 { | |
| 284 managedLoaded = true; | |
| 285 checkLoaded(); | |
| 286 } | |
| 287 } | 283 } |
| 288 | 284 |
| 289 init(); | 285 init(); |
| OLD | NEW |