| Index: chrome/browser/resources/options/preferences.js
|
| diff --git a/chrome/browser/resources/options/preferences.js b/chrome/browser/resources/options/preferences.js
|
| index 807e45e2ffd6e878e292d294b199e9a4c4254a28..6da0dcd4c1b309d22f62ad5dd0d45fa7e62319e3 100644
|
| --- a/chrome/browser/resources/options/preferences.js
|
| +++ b/chrome/browser/resources/options/preferences.js
|
| @@ -1,4 +1,4 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| +// Copyright (c) 2012 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.
|
|
|
| @@ -17,89 +17,127 @@ cr.define('options', function() {
|
| cr.addSingletonGetter(Preferences);
|
|
|
| /**
|
| - * Sets value of a boolean preference.
|
| - * and signals its changed value.
|
| + * Sets a Boolean preference and signals its new value.
|
| * @param {string} name Preference name.
|
| * @param {boolean} value New preference value.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.setBooleanPref = function(name, value, metric) {
|
| + Preferences.setBooleanPref = function(name, value, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().setPrefNoCommit_(name, 'bool', Boolean(value));
|
| + return;
|
| + }
|
| +
|
| 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.
|
| + * Sets an integer preference and signals its new value.
|
| * @param {string} name Preference name.
|
| * @param {number} value New preference value.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.setIntegerPref = function(name, value, metric) {
|
| + Preferences.setIntegerPref = function(name, value, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().setPrefNoCommit_(name, 'int', Number(value));
|
| + return;
|
| + }
|
| +
|
| 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.
|
| + * Sets a double-valued preference and signals its new value.
|
| * @param {string} name Preference name.
|
| * @param {number} value New preference value.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.setDoublePref = function(name, value, metric) {
|
| + Preferences.setDoublePref = function(name, value, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().setPrefNoCommit_(name, 'double', Number(value));
|
| + return;
|
| + }
|
| +
|
| 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.
|
| + * Sets a string preference and signals its new value.
|
| * @param {string} name Preference name.
|
| * @param {string} value New preference value.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.setStringPref = function(name, value, metric) {
|
| + Preferences.setStringPref = function(name, value, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().setPrefNoCommit_(name, 'string', String(value));
|
| + return;
|
| + }
|
| +
|
| var argumentList = [name, String(value)];
|
| if (metric != undefined) argumentList.push(metric);
|
| chrome.send('setStringPref', argumentList);
|
| };
|
|
|
| /**
|
| - * Sets value of a string preference that represents a URL
|
| - * and signals its changed value. The value will be fixed to be a valid URL.
|
| + * Sets a string preference that represents a URL and signals its new value.
|
| + * The value will be fixed to be a valid URL when it gets committed to Chrome.
|
| * @param {string} name Preference name.
|
| * @param {string} value New preference value.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.setURLPref = function(name, value, metric) {
|
| + Preferences.setURLPref = function(name, value, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().setPrefNoCommit_(name, 'url', String(value));
|
| + return;
|
| + }
|
| +
|
| var argumentList = [name, String(value)];
|
| if (metric != undefined) argumentList.push(metric);
|
| chrome.send('setURLPref', argumentList);
|
| };
|
|
|
| /**
|
| - * Sets value of a JSON list preference.
|
| - * and signals its changed value.
|
| + * Sets a JSON list preference and signals its new value.
|
| * @param {string} name Preference name.
|
| * @param {Array} value New preference value.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.setListPref = function(name, value, metric) {
|
| + Preferences.setListPref = function(name, value, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().setPrefNoCommit_(name, 'list', value);
|
| + return;
|
| + }
|
| +
|
| var argumentList = [name, JSON.stringify(value)];
|
| if (metric != undefined) argumentList.push(metric);
|
| chrome.send('setListPref', argumentList);
|
| };
|
|
|
| /**
|
| - * Clears value of a JSON preference.
|
| + * Clears the user setting for a preference and signals its new effective
|
| + * value.
|
| * @param {string} name Preference name.
|
| + * @param {boolean} commit Whether to commit the change to Chrome.
|
| * @param {string} metric User metrics identifier.
|
| */
|
| - Preferences.clearPref = function(name, metric) {
|
| + Preferences.clearPref = function(name, commit, metric) {
|
| + if (!commit) {
|
| + Preferences.getInstance().clearPrefNoCommit_(name);
|
| + return;
|
| + }
|
| +
|
| var argumentList = [name];
|
| if (metric != undefined) argumentList.push(metric);
|
| chrome.send('clearPref', argumentList);
|
| @@ -119,7 +157,8 @@ cr.define('options', function() {
|
| */
|
| addEventListener: function(type, handler) {
|
| cr.EventTarget.prototype.addEventListener.call(this, type, handler);
|
| - this.registeredPreferences_[type] = true;
|
| + if (!(type in this.registeredPreferences_))
|
| + this.registeredPreferences_[type] = {};
|
| },
|
|
|
| /**
|
| @@ -141,6 +180,7 @@ cr.define('options', function() {
|
| * callback.
|
| * @param {string} prefix Preference name prefix.
|
| * @param {object} dict Map with preference values.
|
| + * @private
|
| */
|
| flattenMapAndDispatchEvent_: function(prefix, dict) {
|
| for (var prefName in dict) {
|
| @@ -150,10 +190,119 @@ cr.define('options', function() {
|
| dict[prefName]);
|
| } else {
|
| var event = new cr.Event(prefix + prefName);
|
| + this.registeredPreferences_[prefix + prefName].orig = dict[prefName];
|
| event.value = dict[prefName];
|
| this.dispatchEvent(event);
|
| }
|
| }
|
| + },
|
| +
|
| + /**
|
| + * Sets a preference and signals its new value. The change is propagated
|
| + * throughout the UI code but is not committed to Chrome yet. The new value
|
| + * and its data type are stored so that commitPref() can later be used to
|
| + * invoke the appropriate set*Pref() method and actually commit the change.
|
| + * @param {string} name Preference name.
|
| + * @param {string} type Preference data type.
|
| + * @param {*} value New preference value.
|
| + * @private
|
| + */
|
| + setPrefNoCommit_: function(name, type, value) {
|
| + var pref = this.registeredPreferences_[name];
|
| + pref.action = 'set';
|
| + pref.type = type;
|
| + pref.value = value;
|
| +
|
| + var event = new cr.Event(name);
|
| + // Decorate pref value as CoreOptionsHandler::CreateValueForPref() does.
|
| + event.value = {
|
| + value: value,
|
| + recommendedValue: pref.orig.recommendedValue,
|
| + disabled: pref.orig.disabled,
|
| + };
|
| + this.dispatchEvent(event);
|
| + },
|
| +
|
| + /**
|
| + * Clears a preference and signals its new value. The change is propagated
|
| + * throughout the UI code but is not committed to Chrome yet.
|
| + * @param {string} name Preference name.
|
| + * @private
|
| + */
|
| + clearPrefNoCommit_: function(name) {
|
| + var pref = this.registeredPreferences_[name];
|
| + pref.action = 'clear';
|
| + delete pref.type;
|
| + delete pref.value;
|
| +
|
| + var event = new cr.Event(name);
|
| + // Decorate pref value as CoreOptionsHandler::CreateValueForPref() does.
|
| + event.value = {
|
| + value: pref.orig.recommendedValue,
|
| + controlledBy: 'recommended',
|
| + recommendedValue: pref.orig.recommendedValue,
|
| + disabled: pref.orig.disabled,
|
| + };
|
| + this.dispatchEvent(event);
|
| + },
|
| +
|
| + /**
|
| + * Commits a preference change to Chrome and signals the new preference
|
| + * value. Does nothing if there is no uncommitted change.
|
| + * @param {string} name Preference name.
|
| + * @param {string} metric User metrics identifier.
|
| + */
|
| + commitPref: function(name, metric) {
|
| + var pref = this.registeredPreferences_[name];
|
| + switch (pref.action) {
|
| + case 'set':
|
| + switch (pref.type) {
|
| + case 'bool':
|
| + Preferences.setBooleanPref(name, pref.value, true, metric);
|
| + break;
|
| + case 'int':
|
| + Preferences.setIntegerPref(name, pref.value, true, metric);
|
| + break;
|
| + case 'double':
|
| + Preferences.setDoublePref(name, pref.value, true, metric);
|
| + break;
|
| + case 'string':
|
| + Preferences.setStringPref(name, pref.value, true, metric);
|
| + break;
|
| + case 'url':
|
| + Preferences.setURLPref(name, pref.value, true, metric);
|
| + break;
|
| + case 'list':
|
| + Preferences.setListPref(name, pref.value, true, metric);
|
| + break;
|
| + }
|
| + break;
|
| + case 'clear':
|
| + Preferences.clearPref(name, true, metric);
|
| + break;
|
| + }
|
| + delete pref.action;
|
| + delete pref.type;
|
| + delete pref.value;
|
| + },
|
| +
|
| + /**
|
| + * Rolls back a preference change and signals the original preference value.
|
| + * Does nothing if there is no uncommitted change.
|
| + * @param {string} name Preference name.
|
| + */
|
| + rollbackPref: function(name) {
|
| + var pref = this.registeredPreferences_[name];
|
| + if (!pref.action)
|
| + return;
|
| +
|
| + delete pref.action;
|
| + delete pref.type;
|
| + delete pref.value;
|
| +
|
| + var event = new cr.Event(name);
|
| + event.value = pref.orig;
|
| + this.dispatchEvent(event);
|
| }
|
| };
|
|
|
| @@ -174,7 +323,9 @@ cr.define('options', function() {
|
| Preferences.prefsChangedCallback = function(notification) {
|
| var event = new cr.Event(notification[0]);
|
| event.value = notification[1];
|
| - Preferences.getInstance().dispatchEvent(event);
|
| + prefs = Preferences.getInstance();
|
| + prefs.registeredPreferences_[notification[0]] = {orig: notification[1]};
|
| + prefs.dispatchEvent(event);
|
| };
|
|
|
| // Export
|
|
|