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-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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
252 } | 252 } |
253 | 253 |
254 function savePref(pref) | 254 function savePref(pref) |
255 { | 255 { |
256 ext.storage.set(prefToKey(pref), overrides[pref]); | 256 ext.storage.set(prefToKey(pref), overrides[pref]); |
257 } | 257 } |
258 | 258 |
259 let customSave = new Map(); | 259 let customSave = new Map(); |
260 if (require("info").platform == "gecko") | 260 if (require("info").platform == "gecko") |
261 { | 261 { |
262 // Saving one storage value causes all others to be saved as well on Gecko. | 262 // Saving one browser.storage value causes all others to be saved as well on |
263 // Make sure that updating ad counter doesn't cause the filters data to be | 263 // Gecko. Until that is rectified[1] we need to avoid saving the ad counter |
264 // saved frequently as a side-effect. | 264 // using browser.storage too often, since the filters data is saved as a |
265 const MIN_UPDATE_INTERVAL = 60 * 1000; | 265 // side-effect. We do this by using localStorage instead, only updating the |
266 let lastUpdate = -MIN_UPDATE_INTERVAL; | 266 // value saved in browser.storage when the extension first initializes. |
267 let updateScheduled = false; | 267 // Note: This workaround is sub-optimal since if the user clears browser data |
| 268 // localStorage is cleared. |
| 269 // [1] - https://bugzilla.mozilla.org/show_bug.cgi?id=1277612 |
268 customSave.set("blocked_total", pref => | 270 customSave.set("blocked_total", pref => |
269 { | 271 { |
270 if (updateScheduled) | 272 window.localStorage.setItem("blocked_total", overrides.blocked_total); |
271 return; | |
272 | |
273 let callback = () => | |
274 { | |
275 lastUpdate = performance.now(); | |
276 updateScheduled = false; | |
277 savePref(pref); | |
278 }; | |
279 | |
280 let timeElapsed = performance.now() - lastUpdate; | |
281 if (timeElapsed < MIN_UPDATE_INTERVAL) | |
282 { | |
283 setTimeout(callback, MIN_UPDATE_INTERVAL - timeElapsed); | |
284 updateScheduled = true; | |
285 } | |
286 else | |
287 callback(); | |
288 }); | 273 }); |
289 } | 274 } |
290 | 275 |
291 function addPreference(pref) | 276 function addPreference(pref) |
292 { | 277 { |
293 Object.defineProperty(Prefs, pref, { | 278 Object.defineProperty(Prefs, pref, { |
294 get() { return (pref in overrides ? overrides : defaults)[pref]; }, | 279 get() { return (pref in overrides ? overrides : defaults)[pref]; }, |
295 set(value) | 280 set(value) |
296 { | 281 { |
297 let defaultValue = defaults[pref]; | 282 let defaultValue = defaults[pref]; |
(...skipping 21 matching lines...) Expand all Loading... |
319 let prefs = Object.keys(defaults); | 304 let prefs = Object.keys(defaults); |
320 prefs.forEach(addPreference); | 305 prefs.forEach(addPreference); |
321 | 306 |
322 let localLoaded = new Promise(resolve => | 307 let localLoaded = new Promise(resolve => |
323 { | 308 { |
324 ext.storage.get(prefs.map(prefToKey), items => | 309 ext.storage.get(prefs.map(prefToKey), items => |
325 { | 310 { |
326 for (let key in items) | 311 for (let key in items) |
327 overrides[keyToPref(key)] = items[key]; | 312 overrides[keyToPref(key)] = items[key]; |
328 | 313 |
| 314 if (require("info").platform == "gecko") |
| 315 { |
| 316 let blockedTotal = window.localStorage.getItem("blocked_total"); |
| 317 if (typeof blockedTotal == "string") |
| 318 { |
| 319 blockedTotal = parseInt(blockedTotal, 10); |
| 320 if (blockedTotal > overrides.blocked_total) |
| 321 { |
| 322 overrides.blocked_total = blockedTotal; |
| 323 savePref("blocked_total"); |
| 324 } |
| 325 } |
| 326 } |
| 327 |
329 resolve(); | 328 resolve(); |
330 }); | 329 }); |
331 }); | 330 }); |
332 | 331 |
333 let managedLoaded = new Promise(resolve => | 332 let managedLoaded = new Promise(resolve => |
334 { | 333 { |
335 if (require("info").platform == "chromium" && "managed" in browser.storage) | 334 if (require("info").platform == "chromium" && "managed" in browser.storage) |
336 { | 335 { |
337 browser.storage.managed.get(null, items => | 336 browser.storage.managed.get(null, items => |
338 { | 337 { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
372 eventEmitter.emit(pref); | 371 eventEmitter.emit(pref); |
373 } | 372 } |
374 } | 373 } |
375 }); | 374 }); |
376 } | 375 } |
377 | 376 |
378 Prefs.untilLoaded = Promise.all([localLoaded, managedLoaded]).then(onLoaded); | 377 Prefs.untilLoaded = Promise.all([localLoaded, managedLoaded]).then(onLoaded); |
379 } | 378 } |
380 | 379 |
381 init(); | 380 init(); |
OLD | NEW |