// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('options', function() { ///////////////////////////////////////////////////////////////////////////// // Preferences class: /** * Preferences class manages access to Chrome profile preferences. * @constructor */ function Preferences() { } cr.addSingletonGetter(Preferences); /** * Sets value of a boolean preference. * and signals its changed value. * @param {string} name Preference name. * @param {boolean} value New preference value. * @param {string} metric User metrics identifier. */ Preferences.setBooleanPref = function(name, value, metric) { var argumentList = [name, Boolean(value)]; if (metric != undefined) argumentList.push(metric); chrome.send('setBooleanPref', argumentList); }; /** * Sets value of an integer preference. * and signals its changed value. * @param {string} name Preference name. * @param {number} value New preference value. * @param {string} metric User metrics identifier. */ Preferences.setIntegerPref = function(name, value, metric) { var argumentList = [name, Number(value)]; if (metric != undefined) argumentList.push(metric); chrome.send('setIntegerPref', argumentList); }; /** * Sets value of a double-valued preference. * and signals its changed value. * @param {string} name Preference name. * @param {number} value New preference value. * @param {string} metric User metrics identifier. */ Preferences.setDoublePref = function(name, value, metric) { var argumentList = [name, Number(value)]; if (metric != undefined) argumentList.push(metric); chrome.send('setDoublePref', argumentList); }; /** * Sets value of a string preference. * and signals its changed value. * @param {string} name Preference name. * @param {string} value New preference value. * @param {string} metric User metrics identifier. */ Preferences.setStringPref = function(name, value, metric) { var argumentList = [name, String(value)]; if (metric != undefined) argumentList.push(metric); chrome.send('setStringPref', argumentList); }; /** * Sets value of a JSON list preference. * and signals its changed value. * @param {string} name Preference name. * @param {Array} value New preference value. * @param {string} metric User metrics identifier. */ Preferences.setListPref = function(name, value, metric) { var argumentList = [name, JSON.stringify(value)]; if (metric != undefined) argumentList.push(metric); chrome.send('setListPref', argumentList); }; /** * Clears value of a JSON preference. * @param {string} name Preference name. * @param {string} metric User metrics identifier. */ Preferences.clearPref = function(name, metric) { var argumentList = [name]; if (metric != undefined) argumentList.push(metric); chrome.send('clearPref', argumentList); }; Preferences.prototype = { __proto__: cr.EventTarget.prototype, // Map of registered preferences. registeredPreferences_: {}, /** * Adds an event listener to the target. * @param {string} type The name of the event. * @param {!Function|{handleEvent:Function}} handler The handler for the * event. This is called when the event is dispatched. */ addEventListener: function(type, handler) { cr.EventTarget.prototype.addEventListener.call(this, type, handler); this.registeredPreferences_[type] = true; }, /** * Initializes preference reading and change notifications. */ initialize: function() { var params1 = ['Preferences.prefsFetchedCallback']; var params2 = ['Preferences.prefsChangedCallback']; for (var prefName in this.registeredPreferences_) { params1.push(prefName); params2.push(prefName); } chrome.send('fetchPrefs', params1); chrome.send('observePrefs', params2); }, /** * Helper function for flattening of dictionary passed via fetchPrefs * callback. * @param {string} prefix Preference name prefix. * @param {object} dict Map with preference values. */ flattenMapAndDispatchEvent_: function(prefix, dict) { for (var prefName in dict) { if (typeof dict[prefName] == 'object' && !this.registeredPreferences_[prefix + prefName]) { this.flattenMapAndDispatchEvent_(prefix + prefName + '.', dict[prefName]); } else { var event = new cr.Event(prefix + prefName); event.value = dict[prefName]; this.dispatchEvent(event); } } } }; /** * Callback for fetchPrefs method. * @param {object} dict Map of fetched property values. */ Preferences.prefsFetchedCallback = function(dict) { Preferences.getInstance().flattenMapAndDispatchEvent_('', dict); }; /** * Callback for observePrefs method. * @param {array} notification An array defining changed preference values. * notification[0] contains name of the change preference while its new value * is stored in notification[1]. */ Preferences.prefsChangedCallback = function(notification) { var event = new cr.Event(notification[0]); event.value = notification[1]; Preferences.getInstance().dispatchEvent(event); }; // Export return { Preferences: Preferences }; });