 Chromium Code Reviews
 Chromium Code Reviews Issue 10827141:
  Move handling of dialog preferences to Preferences class  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src
    
  
    Issue 10827141:
  Move handling of dialog preferences to Preferences class  (Closed) 
  Base URL: svn://svn.chromium.org/chrome/trunk/src| Index: chrome/browser/resources/options2/preferences.js | 
| diff --git a/chrome/browser/resources/options2/preferences.js b/chrome/browser/resources/options2/preferences.js | 
| index 807e45e2ffd6e878e292d294b199e9a4c4254a28..ddc738cbcb3ffce1450277b6243339fdb7fb8ef6 100644 | 
| --- a/chrome/browser/resources/options2/preferences.js | 
| +++ b/chrome/browser/resources/options2/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,117 @@ 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 | 
| 
James Hawkins
2012/08/02 20:33:32
Hmm, need to explain how this is used wrt set*Pref
 
bartfab (slow)
2012/08/31 14:14:30
Done.
 | 
| + * throughout the UI code but is not committed to Chrome yet. | 
| + * @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 +321,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 |