Publish Vulpes Preview 15 sources for desktop, Android and Tundra
Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
This commit is contained in:
parent
93e3a48004
commit
b38dea0597
25901 changed files with 9982925 additions and 369 deletions
147
gaia/apps/settings/js/modules/settings_cache.js
Executable file
147
gaia/apps/settings/js/modules/settings_cache.js
Executable file
|
|
@ -0,0 +1,147 @@
|
|||
/**
|
||||
* SettingsCache is a singleton that caches mozSettings values for fast
|
||||
* access.
|
||||
*
|
||||
* @module SettingsCache
|
||||
*/
|
||||
define(function() {
|
||||
'use strict';
|
||||
var _settings = window.navigator.mozSettings;
|
||||
|
||||
// Cache of all current settings values. There's some large stuff
|
||||
// in here, but not much useful can be done with the settings app
|
||||
// without these, so we keep this around most of the time.
|
||||
var _settingsCache = null;
|
||||
|
||||
// True when a request has already been made to fill the settings
|
||||
// cache. When this is true, no further get("*") requests should be
|
||||
// made; instead, pending callbacks should be added to
|
||||
// _pendingSettingsCallbacks.
|
||||
var _settingsCacheRequestSent = null;
|
||||
|
||||
// There can be race conditions in which we need settings values,
|
||||
// but haven't filled the cache yet. This array tracks those
|
||||
// listeners.
|
||||
var _pendingSettingsCallbacks = [];
|
||||
|
||||
var _callbacks = [];
|
||||
|
||||
var _onSettingsChange = function sc_onSettingsChange(event) {
|
||||
var key = event.settingName;
|
||||
var value = event.settingValue;
|
||||
|
||||
// Always update the cache if it's present, even if the DOM
|
||||
// isn't loaded yet.
|
||||
if (_settingsCache) {
|
||||
_settingsCache[key] = value;
|
||||
}
|
||||
|
||||
_callbacks.forEach(function(callback) {
|
||||
callback(event);
|
||||
});
|
||||
};
|
||||
|
||||
if (_settings) {
|
||||
_settings.onsettingchange = _onSettingsChange;
|
||||
}
|
||||
|
||||
/**
|
||||
* Event reporting that a setting value is changed.
|
||||
*
|
||||
* @event module:SettingsCache#settingsChange
|
||||
* @property {MozSettingsEvent} event
|
||||
*/
|
||||
var SettingsCache = {
|
||||
// the reset function is for unit tests
|
||||
reset: function sc_reset() {
|
||||
_settings = window.navigator.mozSettings;
|
||||
if (_settings) {
|
||||
_settings.onsettingchange = _onSettingsChange;
|
||||
}
|
||||
_settingsCache = null;
|
||||
_settingsCacheRequestSent = null;
|
||||
_pendingSettingsCallbacks = [];
|
||||
_callbacks = [];
|
||||
},
|
||||
|
||||
get cache() {
|
||||
return _settingsCache;
|
||||
},
|
||||
|
||||
/**
|
||||
* Where callback is a function to be called with a request object for a
|
||||
* successful fetch of settings values, when those values are ready.
|
||||
*
|
||||
* @alias module:SettingsCache#getSettings
|
||||
* @param {Function} callback
|
||||
*/
|
||||
getSettings: function sc_getSettings(callback) {
|
||||
if (!_settings) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (_settingsCache && callback) {
|
||||
// Fast-path that we hope to always hit: our settings cache is
|
||||
// already available, so invoke the callback now.
|
||||
callback(_settingsCache);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!_settingsCacheRequestSent && !_settingsCache) {
|
||||
_settingsCacheRequestSent = true;
|
||||
var lock = _settings.createLock();
|
||||
var request = lock.get('*');
|
||||
request.onsuccess = function(e) {
|
||||
var result = request.result;
|
||||
var cachedResult = {};
|
||||
for (var attr in result) {
|
||||
cachedResult[attr] = result[attr];
|
||||
}
|
||||
_settingsCache = cachedResult;
|
||||
var cbk;
|
||||
while ((cbk = _pendingSettingsCallbacks.pop())) {
|
||||
cbk(result);
|
||||
}
|
||||
};
|
||||
}
|
||||
if (callback) {
|
||||
_pendingSettingsCallbacks.push(callback);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @alias module:SettingsCache#addEventListener
|
||||
* @param {String} eventName
|
||||
* @param {Function} callback
|
||||
*/
|
||||
addEventListener: function sc_addEventListener(eventName, callback) {
|
||||
if (eventName !== 'settingsChange') {
|
||||
return;
|
||||
}
|
||||
var index = _callbacks.indexOf(callback);
|
||||
if (index === -1) {
|
||||
_callbacks.push(callback);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* @alias module:SettingsCache#removeEventListener
|
||||
* @param {String} eventName
|
||||
* @param {Function} callback
|
||||
*/
|
||||
removeEventListener: function sc_removeEventListsner(eventName, callback) {
|
||||
if (eventName !== 'settingsChange') {
|
||||
return;
|
||||
}
|
||||
var index = _callbacks.indexOf(callback);
|
||||
if (index !== -1) {
|
||||
_callbacks.splice(index, 1);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// Make a request for settings to warm the cache, since we need it
|
||||
// very soon in startup after the DOM is available.
|
||||
SettingsCache.getSettings(null);
|
||||
return SettingsCache;
|
||||
});
|
||||
Loading…
Reference in a new issue