| Index: chrome/browser/resources/options/pref_ui.js
|
| diff --git a/chrome/browser/resources/options/pref_ui.js b/chrome/browser/resources/options/pref_ui.js
|
| index 539c4d83f9b7ce2251e1e8990ddf545eb6065a9a..f1a2194361e92491120fed23405022202f46d554 100644
|
| --- a/chrome/browser/resources/options/pref_ui.js
|
| +++ b/chrome/browser/resources/options/pref_ui.js
|
| @@ -39,26 +39,13 @@ cr.define('options', function() {
|
| el.disabled = Object.keys(el.disabledReasons).length > 0;
|
| }
|
|
|
| - /**
|
| - * Helper function to update element's state from pref change event.
|
| - * @private
|
| - * @param {!HTMLElement} el The element to update.
|
| - * @param {!Event} event The pref change event.
|
| - */
|
| - function updateElementState_(el, event) {
|
| - updateDisabledState_(el, 'notUserModifiable', event.value.disabled);
|
| - el.controlledBy = event.value.controlledBy;
|
| - OptionsPage.updateManagedBannerVisibility();
|
| - }
|
| -
|
| /////////////////////////////////////////////////////////////////////////////
|
| - // PrefCheckbox class:
|
| - // TODO(jhawkins): Refactor all this copy-pasted code!
|
| + // PrefInputElement class:
|
|
|
| // Define a constructor that uses an input element as its underlying element.
|
| - var PrefCheckbox = cr.ui.define('input');
|
| + var PrefInputElement = function() {};
|
|
|
| - PrefCheckbox.prototype = {
|
| + PrefInputElement.prototype = {
|
| // Set up the prototype chain
|
| __proto__: HTMLInputElement.prototype,
|
|
|
| @@ -66,51 +53,39 @@ cr.define('options', function() {
|
| * Initialization function for the cr.ui framework.
|
| */
|
| decorate: function() {
|
| - this.type = 'checkbox';
|
| var self = this;
|
|
|
| - this.initializeValueType(this.getAttribute('value-type'));
|
| + // Listen for user events.
|
| + this.addEventListener('change', this.handleChange_.bind(this));
|
|
|
| - // Listen to pref changes.
|
| + // Listen for pref changes.
|
| Preferences.getInstance().addEventListener(this.pref, function(event) {
|
| - var value = event.value.value;
|
| - self.checked = self.inverted_pref ? !value : value;
|
| - updateElementState_(self, event);
|
| + self.updateStateFromPref_(event);
|
| + updateDisabledState_(self, 'notUserModifiable', event.value.disabled);
|
| + self.controlledBy = event.value.controlledBy;
|
| + OptionsPage.updateManagedBannerVisibility();
|
| });
|
| -
|
| - // Listen to user events.
|
| - this.addEventListener('change', this.updatePreferenceValue_.bind(this));
|
| },
|
|
|
| /**
|
| - * Handler that updates the associated pref when the user changes the input
|
| - * element's value.
|
| + * Handle changes to the input element's state made by the user. If a custom
|
| + * change handler does not suppress it, a default handler is invoked that
|
| + * updates the associated pref.
|
| * @param {Event} event Change event.
|
| * @private
|
| */
|
| - updatePreferenceValue_: function(event) {
|
| - if (this.customChangeHandler(event))
|
| - return;
|
| -
|
| - var value = this.inverted_pref ? !this.checked : this.checked;
|
| - switch (this.valueType) {
|
| - case 'number':
|
| - Preferences.setIntegerPref(this.pref, Number(value),
|
| - !this.dialogPref, this.metric);
|
| - break;
|
| - case 'boolean':
|
| - Preferences.setBooleanPref(this.pref, value,
|
| - !this.dialogPref, this.metric);
|
| - break;
|
| - }
|
| + handleChange_: function(event) {
|
| + if (!this.customChangeHandler(event))
|
| + this.updatePrefFromState_();
|
| },
|
|
|
| /**
|
| - * Sets up options in checkbox element.
|
| - * @param {String} valueType The preference type for this checkbox.
|
| + * Update the input element's state when the associated pref changes.
|
| + * @param {Event} event Pref change event.
|
| + * @private
|
| */
|
| - initializeValueType: function(valueType) {
|
| - this.valueType = valueType || 'boolean';
|
| + updateStateFromPref_: function(event) {
|
| + this.value = event.value.value;
|
| },
|
|
|
| /**
|
| @@ -121,11 +96,12 @@ cr.define('options', function() {
|
| },
|
|
|
| /**
|
| - * Handler that is called when the user changes the input element's value.
|
| - * If it returns false, the default handler is executed next, updating the
|
| - * associated pref to its new value. If it returns true, the default handler
|
| - * is skipped (i.e., this works like stopPropagation or cancelBubble).
|
| - * @param {Event} event Change event.
|
| + * Custom change handler that is invoked first when the user makes changes
|
| + * to the input element's state. If it returns false, a default handler is
|
| + * invoked next that updates the associated pref. If it returns true, the
|
| + * default handler is suppressed (i.e., this works like stopPropagation or
|
| + * cancelBubble).
|
| + * @param {Event} event Input element change event.
|
| */
|
| customChangeHandler: function(event) {
|
| return false;
|
| @@ -133,236 +109,156 @@ cr.define('options', function() {
|
| };
|
|
|
| /**
|
| - * The preference name.
|
| + * The name of the associated preference.
|
| * @type {string}
|
| */
|
| - cr.defineProperty(PrefCheckbox, 'pref', cr.PropertyKind.ATTR);
|
| + cr.defineProperty(PrefInputElement, 'pref', cr.PropertyKind.ATTR);
|
|
|
| /**
|
| - * A special preference type specific to dialogs. Changes take effect in the
|
| - * settings UI immediately but are only actually committed when the user
|
| - * confirms the dialog. If the user cancels the dialog instead, the changes
|
| - * are rolled back in the settings UI and never committed.
|
| - * @type {boolean}
|
| + * The data type of the associated preference, only relevant for derived
|
| + * classes that support different data types.
|
| + * @type {string}
|
| */
|
| - cr.defineProperty(PrefCheckbox, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
| + cr.defineProperty(PrefInputElement, 'dataType', cr.PropertyKind.ATTR);
|
|
|
| /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| - * @type {string}
|
| + * Whether this input element is part of a dialog. If so, changes take effect
|
| + * in the settings UI immediately but are only actually committed when the
|
| + * user confirms the dialog. If the user cancels the dialog instead, the
|
| + * changes are rolled back in the settings UI and never committed.
|
| + * @type {boolean}
|
| */
|
| - cr.defineProperty(PrefCheckbox, 'controlledBy', cr.PropertyKind.ATTR);
|
| + cr.defineProperty(PrefInputElement, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
|
|
| /**
|
| - * The user metric string.
|
| + * Whether the associated preference is controlled by a source other than the
|
| + * user's setting (can be 'policy', 'extension' or 'recommended').
|
| * @type {string}
|
| */
|
| - cr.defineProperty(PrefCheckbox, 'metric', cr.PropertyKind.ATTR);
|
| + cr.defineProperty(PrefInputElement, 'controlledBy', cr.PropertyKind.ATTR);
|
|
|
| /**
|
| - * Whether to use inverted pref value.
|
| - * @type {boolean}
|
| + * The user metric string.
|
| + * @type {string}
|
| */
|
| - cr.defineProperty(PrefCheckbox, 'inverted_pref', cr.PropertyKind.BOOL_ATTR);
|
| + cr.defineProperty(PrefInputElement, 'metric', cr.PropertyKind.ATTR);
|
|
|
| /////////////////////////////////////////////////////////////////////////////
|
| - // PrefRadio class:
|
| + // PrefCheckbox class:
|
|
|
| - //Define a constructor that uses an input element as its underlying element.
|
| - var PrefRadio = cr.ui.define('input');
|
| + // Define a constructor that uses an input element as its underlying element.
|
| + var PrefCheckbox = cr.ui.define('input');
|
|
|
| - PrefRadio.prototype = {
|
| + PrefCheckbox.prototype = {
|
| // Set up the prototype chain
|
| - __proto__: HTMLInputElement.prototype,
|
| -
|
| - // Stores the initialized value of the preference used to reset the input
|
| - // in resetPrefState().
|
| - storedValue_: null,
|
| + __proto__: PrefInputElement.prototype,
|
|
|
| /**
|
| * Initialization function for the cr.ui framework.
|
| */
|
| decorate: function() {
|
| - this.type = 'radio';
|
| - var self = this;
|
| -
|
| - // Listen to pref changes.
|
| - Preferences.getInstance().addEventListener(this.pref, function(event) {
|
| - self.checked = String(event.value.value) == self.value;
|
| - updateElementState_(self, event);
|
| - });
|
| -
|
| - // Listen to user events.
|
| - this.addEventListener('change', this.updatePreferenceValue_.bind(this));
|
| + PrefInputElement.prototype.decorate.call(this);
|
| + this.type = 'checkbox';
|
| },
|
|
|
| /**
|
| - * Handler that updates the associated pref when the user changes the input
|
| - * element's value.
|
| - * @param {Event} event Change event.
|
| + * Update the associated pref when when the user makes changes to the
|
| + * checkbox state.
|
| * @private
|
| */
|
| - updatePreferenceValue_: function(event) {
|
| - if (this.customChangeHandler(event))
|
| - return;
|
| -
|
| - if (this.value == 'true' || this.value == 'false') {
|
| - var value = String(this.value);
|
| - Preferences.setBooleanPref(this.pref, value == String(this.checked),
|
| - !this.dialogPref, this.metric);
|
| - } else {
|
| - Preferences.setIntegerPref(this.pref, parseInt(this.value, 10),
|
| - !this.dialogPref, this.metric);
|
| - }
|
| - },
|
| -
|
| - /**
|
| - * See |updateDisabledState_| above.
|
| - */
|
| - setDisabled: function(reason, disabled) {
|
| - updateDisabledState_(this, reason, disabled);
|
| + updatePrefFromState_: function() {
|
| + var value = this.inverted_pref ? !this.checked : this.checked;
|
| + Preferences.setBooleanPref(this.pref, value,
|
| + !this.dialogPref, this.metric);
|
| },
|
|
|
| /**
|
| - * Handler that is called when the user changes the input element's value.
|
| - * If it returns false, the default handler is executed next, updating the
|
| - * associated pref to its new value. If it returns true, the default handler
|
| - * is skipped (i.e., this works like stopPropagation or cancelBubble).
|
| - * @param {Event} event Change event.
|
| + * Update the checkbox state when the associated pref changes.
|
| + * @param {Event} event Pref change event.
|
| + * @private
|
| */
|
| - customChangeHandler: function(event) {
|
| - return false;
|
| + updateStateFromPref_: function(event) {
|
| + var value = Boolean(event.value.value);
|
| + this.checked = this.inverted_pref ? !value : value;
|
| },
|
| };
|
|
|
| /**
|
| - * The preference name.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefRadio, 'pref', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * A special preference type specific to dialogs. Changes take effect in the
|
| - * settings UI immediately but are only actually committed when the user
|
| - * confirms the dialog. If the user cancels the dialog instead, the changes
|
| - * are rolled back in the settings UI and never committed.
|
| + * Whether the mapping between checkbox state and associated pref is inverted.
|
| * @type {boolean}
|
| */
|
| - cr.defineProperty(PrefRadio, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
| -
|
| - /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefRadio, 'controlledBy', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * The user metric string.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefRadio, 'metric', cr.PropertyKind.ATTR);
|
| + cr.defineProperty(PrefCheckbox, 'inverted_pref', cr.PropertyKind.BOOL_ATTR);
|
|
|
| /////////////////////////////////////////////////////////////////////////////
|
| - // PrefNumeric class:
|
| + // PrefNumber class:
|
|
|
| // Define a constructor that uses an input element as its underlying element.
|
| - var PrefNumeric = function() {};
|
| - PrefNumeric.prototype = {
|
| + var PrefNumber = cr.ui.define('input');
|
| +
|
| + PrefNumber.prototype = {
|
| // Set up the prototype chain
|
| - __proto__: HTMLInputElement.prototype,
|
| + __proto__: PrefInputElement.prototype,
|
|
|
| /**
|
| * Initialization function for the cr.ui framework.
|
| */
|
| decorate: function() {
|
| - var self = this;
|
| -
|
| - // Listen to pref changes.
|
| - Preferences.getInstance().addEventListener(this.pref, function(event) {
|
| - self.value = event.value.value;
|
| - updateElementState_(self, event);
|
| - });
|
| -
|
| - // Listen to user events.
|
| - this.addEventListener('change', function(event) {
|
| - if (self.validity.valid) {
|
| - Preferences.setIntegerPref(self.pref, self.value,
|
| - !self.dialogPref, self.metric);
|
| - }
|
| - });
|
| + PrefInputElement.prototype.decorate.call(this);
|
| + this.type = 'number';
|
| },
|
|
|
| /**
|
| - * See |updateDisabledState_| above.
|
| + * Update the associated pref when when the user inputs a number.
|
| + * @private
|
| */
|
| - setDisabled: function(reason, disabled) {
|
| - updateDisabledState_(this, reason, disabled);
|
| + updatePrefFromState_: function() {
|
| + if (this.validity.valid) {
|
| + Preferences.setIntegerPref(this.pref, this.value,
|
| + !this.dialogPref, this.metric);
|
| + }
|
| },
|
| };
|
|
|
| - /**
|
| - * The preference name.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefNumeric, 'pref', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * A special preference type specific to dialogs. Changes take effect in the
|
| - * settings UI immediately but are only actually committed when the user
|
| - * confirms the dialog. If the user cancels the dialog instead, the changes
|
| - * are rolled back in the settings UI and never committed.
|
| - * @type {boolean}
|
| - */
|
| - cr.defineProperty(PrefRadio, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
| -
|
| - /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefNumeric, 'controlledBy', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * The user metric string.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefNumeric, 'metric', cr.PropertyKind.ATTR);
|
| -
|
| /////////////////////////////////////////////////////////////////////////////
|
| - // PrefNumber class:
|
| + // PrefRadio class:
|
|
|
| - // Define a constructor that uses an input element as its underlying element.
|
| - var PrefNumber = cr.ui.define('input');
|
| + //Define a constructor that uses an input element as its underlying element.
|
| + var PrefRadio = cr.ui.define('input');
|
|
|
| - PrefNumber.prototype = {
|
| + PrefRadio.prototype = {
|
| // Set up the prototype chain
|
| - __proto__: PrefNumeric.prototype,
|
| + __proto__: PrefInputElement.prototype,
|
|
|
| /**
|
| * Initialization function for the cr.ui framework.
|
| */
|
| decorate: function() {
|
| - this.type = 'number';
|
| - PrefNumeric.prototype.decorate.call(this);
|
| - var self = this;
|
| + PrefInputElement.prototype.decorate.call(this);
|
| + this.type = 'radio';
|
| + },
|
|
|
| - // Listen to user events.
|
| - this.addEventListener('input',
|
| - function(e) {
|
| - if (self.validity.valid) {
|
| - Preferences.setIntegerPref(self.pref, self.value,
|
| - !self.dialogPref, self.metric);
|
| - }
|
| - });
|
| + /**
|
| + * Update the associated pref when when the user selects the radio button.
|
| + * @private
|
| + */
|
| + updatePrefFromState_: function() {
|
| + if (this.value == 'true' || this.value == 'false') {
|
| + Preferences.setBooleanPref(this.pref,
|
| + this.value == String(this.checked),
|
| + !this.dialogPref, this.metric);
|
| + } else {
|
| + Preferences.setIntegerPref(this.pref, this.value,
|
| + !this.dialogPref, this.metric);
|
| + }
|
| },
|
|
|
| /**
|
| - * See |updateDisabledState_| above.
|
| + * Update the radio button state when the associated pref changes.
|
| + * @param {Event} event Pref change event.
|
| + * @private
|
| */
|
| - setDisabled: function(reason, disabled) {
|
| - updateDisabledState_(this, reason, disabled);
|
| + updateStateFromPref_: function(event) {
|
| + this.checked = this.value == String(event.value.value);
|
| },
|
| };
|
|
|
| @@ -374,10 +270,10 @@ cr.define('options', function() {
|
|
|
| PrefRange.prototype = {
|
| // Set up the prototype chain
|
| - __proto__: HTMLInputElement.prototype,
|
| + __proto__: PrefInputElement.prototype,
|
|
|
| /**
|
| - * The map from input range value to the corresponding preference value.
|
| + * The map from slider position to corresponding pref value.
|
| */
|
| valueMap: undefined,
|
|
|
| @@ -385,105 +281,66 @@ cr.define('options', function() {
|
| * Initialization function for the cr.ui framework.
|
| */
|
| decorate: function() {
|
| + PrefInputElement.prototype.decorate.call(this);
|
| this.type = 'range';
|
|
|
| - // Update the UI when the pref changes.
|
| - Preferences.getInstance().addEventListener(
|
| - this.pref, this.onPrefChange_.bind(this));
|
| -
|
| - // Listen to user events.
|
| + // Listen for user events.
|
| // TODO(jhawkins): Add onmousewheel handling once the associated WK bug is
|
| // fixed.
|
| // https://bugs.webkit.org/show_bug.cgi?id=52256
|
| - this.addEventListener('keyup', this.updatePreferenceValue_.bind(this));
|
| - this.addEventListener('mouseup', this.updatePreferenceValue_.bind(this));
|
| + this.addEventListener('keyup', this.handleRelease_.bind(this));
|
| + this.addEventListener('mouseup', this.handleRelease_.bind(this));
|
| },
|
|
|
| /**
|
| - * Event listener that updates the input element when the associated pref
|
| - * changes.
|
| - * @param {Event} event The event that details the pref change.
|
| + * Update the associated pref when when the user releases the slider.
|
| * @private
|
| */
|
| - onPrefChange_: function(event) {
|
| - var value = event.value.value;
|
| - this.value = this.valueMap ? this.valueMap.indexOf(value) : value;
|
| + updatePrefFromState_: function() {
|
| + Preferences.setIntegerPref(this.pref, this.mapPositionToPref(this.value),
|
| + !this.dialogPref, this.metric);
|
| },
|
|
|
| /**
|
| - * Handler that updates the associated pref when the user changes the input
|
| - * element's value.
|
| - * This handler is called when the user completes the change by releasing
|
| - * the slider.
|
| - * @param {Event} event Change event.
|
| + * Ignore changes to the slider position made by the user while the slider
|
| + * has not been released.
|
| * @private
|
| */
|
| - updatePreferenceValue_: function(event) {
|
| - if (this.customChangeHandler(event))
|
| - return;
|
| -
|
| - Preferences.setIntegerPref(this.pref, this.mapValueToRange(this.value),
|
| - !this.dialogPref, this.metric);
|
| + handleChange_: function() {
|
| },
|
|
|
| /**
|
| - * Maps the value of this element into the range provided by the client,
|
| - * represented by |valueMap|.
|
| - * @param {number} value The value to map.
|
| + * Handle changes to the slider position made by the user when the slider is
|
| + * released. If a custom change handler does not suppress it, a default
|
| + * handler is invoked that updates the associated pref.
|
| + * @param {Event} event Change event.
|
| + * @private
|
| */
|
| - mapValueToRange: function(value) {
|
| - return this.valueMap ? this.valueMap[value] : value;
|
| + handleRelease_: function(event) {
|
| + if (!this.customChangeHandler(event))
|
| + this.updatePrefFromState_();
|
| },
|
|
|
| /**
|
| - * See |updateDisabledState_| above.
|
| + * Update the slider position when the associated pref changes.
|
| + * @param {Event} event Pref change event.
|
| + * @private
|
| */
|
| - setDisabled: function(reason, disabled) {
|
| - updateDisabledState_(this, reason, disabled);
|
| + updateStateFromPref_: function(event) {
|
| + var value = event.value.value;
|
| + this.value = this.valueMap ? this.valueMap.indexOf(value) : value;
|
| },
|
|
|
| /**
|
| - * Handler that is called when the user changes the input element's value.
|
| - * If it returns false, the default handler is executed next, updating the
|
| - * associated pref to its new value. If it returns true, the default handler
|
| - * is skipped (i.e., this works like stopPropagation or cancelBubble).
|
| - * This handler is called when the user completes the change by releasing
|
| - * the slider.
|
| - * @param {Event} event Change event.
|
| + * Map slider position to the range of values provided by the client,
|
| + * represented by |valueMap|.
|
| + * @param {number} position The slider position to map.
|
| */
|
| - customChangeHandler: function(event) {
|
| - return false;
|
| + mapPositionToPref: function(position) {
|
| + return this.valueMap ? this.valueMap[position] : position;
|
| },
|
| };
|
|
|
| - /**
|
| - * The preference name.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefRange, 'pref', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * A special preference type specific to dialogs. Changes take effect in the
|
| - * settings UI immediately but are only actually committed when the user
|
| - * confirms the dialog. If the user cancels the dialog instead, the changes
|
| - * are rolled back in the settings UI and never committed.
|
| - * @type {boolean}
|
| - */
|
| - cr.defineProperty(PrefRadio, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
| -
|
| - /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefRange, 'controlledBy', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * The user metric string.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefRange, 'metric', cr.PropertyKind.ATTR);
|
| -
|
| /////////////////////////////////////////////////////////////////////////////
|
| // PrefSelect class:
|
|
|
| @@ -492,127 +349,67 @@ cr.define('options', function() {
|
|
|
| PrefSelect.prototype = {
|
| // Set up the prototype chain
|
| - __proto__: HTMLSelectElement.prototype,
|
| + __proto__: PrefInputElement.prototype,
|
|
|
| /**
|
| - * Initialization function for the cr.ui framework.
|
| - */
|
| - decorate: function() {
|
| - // Listen to pref changes.
|
| - Preferences.getInstance().addEventListener(
|
| - this.pref, this.onPrefChange_.bind(this));
|
| -
|
| - // Listen to user events.
|
| - this.addEventListener('change', this.updatePreferenceValue_.bind(this));
|
| - },
|
| -
|
| - /**
|
| - * Event listener that updates the input element when the associated pref
|
| - * changes.
|
| - * @param {Event} event The event that details the pref change.
|
| + * Update the associated pref when when the user selects an item.
|
| * @private
|
| */
|
| - onPrefChange_: function(event) {
|
| - // Make sure |value| is a string, because the value is stored as a string
|
| - // in the HTMLOptionElement.
|
| - var value = event.value.value.toString();
|
| -
|
| - updateElementState_(this, event);
|
| -
|
| - var found = false;
|
| - for (var i = 0; i < this.options.length; i++) {
|
| - if (this.options[i].value == value) {
|
| - this.selectedIndex = i;
|
| - found = true;
|
| - }
|
| - }
|
| -
|
| - // Item not found, select first item.
|
| - if (!found)
|
| - this.selectedIndex = 0;
|
| -
|
| - if (this.onchange)
|
| - this.onchange(event);
|
| - },
|
| -
|
| - /**
|
| - * Handler that updates the associated pref when the user changes the input
|
| - * element's value.
|
| - * @param {Event} event Change event.
|
| - * @private
|
| - */
|
| - updatePreferenceValue_: function(event) {
|
| - if (!this.dataType) {
|
| - console.error('undefined data type for <select> pref');
|
| - return;
|
| - }
|
| -
|
| - var prefValue = this.options[this.selectedIndex].value;
|
| + updatePrefFromState_: function() {
|
| + var value = this.options[this.selectedIndex].value;
|
| switch (this.dataType) {
|
| case 'number':
|
| - Preferences.setIntegerPref(this.pref, prefValue,
|
| + Preferences.setIntegerPref(this.pref, value,
|
| !this.dialogPref, this.metric);
|
| break;
|
| case 'double':
|
| - Preferences.setDoublePref(this.pref, prefValue,
|
| + Preferences.setDoublePref(this.pref, value,
|
| !this.dialogPref, this.metric);
|
| break;
|
| case 'boolean':
|
| - var value = (prefValue == 'true');
|
| - Preferences.setBooleanPref(this.pref, value,
|
| + Preferences.setBooleanPref(this.pref, value == 'true',
|
| !this.dialogPref, this.metric);
|
| break;
|
| case 'string':
|
| - Preferences.setStringPref(this.pref, prefValue,
|
| + Preferences.setStringPref(this.pref, value,
|
| !this.dialogPref, this.metric);
|
| break;
|
| default:
|
| - console.error('unknown data type for <select> pref: ' +
|
| + console.error('Unknown data type for <select> UI element: ' +
|
| this.dataType);
|
| }
|
| },
|
|
|
| /**
|
| - * See |updateDisabledState_| above.
|
| + * Update the selected item when the associated pref changes.
|
| + * @param {Event} event Pref change event.
|
| + * @private
|
| */
|
| - setDisabled: function(reason, disabled) {
|
| - updateDisabledState_(this, reason, disabled);
|
| - },
|
| - };
|
| -
|
| - /**
|
| - * The preference name.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefSelect, 'pref', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefSelect, 'controlledBy', cr.PropertyKind.ATTR);
|
| + updateStateFromPref_: function(event) {
|
| + // Make sure the value is a string, because the value is stored as a
|
| + // string in the HTMLOptionElement.
|
| + value = String(event.value.value);
|
|
|
| - /**
|
| - * A special preference type specific to dialogs. Changes take effect in the
|
| - * settings UI immediately but are only actually committed when the user
|
| - * confirms the dialog. If the user cancels the dialog instead, the changes
|
| - * are rolled back in the settings UI and never committed.
|
| - * @type {boolean}
|
| - */
|
| - cr.defineProperty(PrefSelect, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
| + var found = false;
|
| + for (var i = 0; i < this.options.length; i++) {
|
| + if (this.options[i].value == value) {
|
| + this.selectedIndex = i;
|
| + found = true;
|
| + }
|
| + }
|
|
|
| - /**
|
| - * The user metric string.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefSelect, 'metric', cr.PropertyKind.ATTR);
|
| + // Item not found, select first item.
|
| + if (!found)
|
| + this.selectedIndex = 0;
|
|
|
| - /**
|
| - * The data type for the preference options.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefSelect, 'dataType', cr.PropertyKind.ATTR);
|
| + // The "onchange" event automatically fires when the user makes a manual
|
| + // change. It should never be fired for a programmatic change. However,
|
| + // these two lines were here already and it is hard to tell who may be
|
| + // relying on them.
|
| + if (this.onchange)
|
| + this.onchange(event);
|
| + },
|
| + };
|
|
|
| /////////////////////////////////////////////////////////////////////////////
|
| // PrefTextField class:
|
| @@ -622,36 +419,27 @@ cr.define('options', function() {
|
|
|
| PrefTextField.prototype = {
|
| // Set up the prototype chain
|
| - __proto__: HTMLInputElement.prototype,
|
| + __proto__: PrefInputElement.prototype,
|
|
|
| /**
|
| * Initialization function for the cr.ui framework.
|
| */
|
| decorate: function() {
|
| + PrefInputElement.prototype.decorate.call(this);
|
| var self = this;
|
|
|
| - // Listen to pref changes.
|
| - Preferences.getInstance().addEventListener(this.pref, function(event) {
|
| - self.value = event.value.value;
|
| - updateElementState_(self, event);
|
| - });
|
| -
|
| - // Listen to user events.
|
| - this.addEventListener('change', this.updatePreferenceValue_.bind(this));
|
| -
|
| - window.addEventListener('unload', function(event) {
|
| + // Listen for user events.
|
| + window.addEventListener('unload', function() {
|
| if (document.activeElement == self)
|
| self.blur();
|
| });
|
| },
|
|
|
| /**
|
| - * Handler that updates the associated pref when the user changes the input
|
| - * element's value.
|
| - * @param {Event} event Change event.
|
| + * Update the associated pref when when the user inputs text.
|
| * @private
|
| */
|
| - updatePreferenceValue_: function(event) {
|
| + updatePrefFromState_: function(event) {
|
| switch (this.dataType) {
|
| case 'number':
|
| Preferences.setIntegerPref(this.pref, this.value,
|
| @@ -671,49 +459,8 @@ cr.define('options', function() {
|
| break;
|
| }
|
| },
|
| -
|
| - /**
|
| - * See |updateDisabledState_| above.
|
| - */
|
| - setDisabled: function(reason, disabled) {
|
| - updateDisabledState_(this, reason, disabled);
|
| - },
|
| };
|
|
|
| - /**
|
| - * The preference name.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefTextField, 'pref', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * A special preference type specific to dialogs. Changes take effect in the
|
| - * settings UI immediately but are only actually committed when the user
|
| - * confirms the dialog. If the user cancels the dialog instead, the changes
|
| - * are rolled back in the settings UI and never committed.
|
| - * @type {boolean}
|
| - */
|
| - cr.defineProperty(PrefTextField, 'dialogPref', cr.PropertyKind.BOOL_ATTR);
|
| -
|
| - /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefTextField, 'controlledBy', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * The user metric string.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefTextField, 'metric', cr.PropertyKind.ATTR);
|
| -
|
| - /**
|
| - * The data type for the preference options.
|
| - * @type {string}
|
| - */
|
| - cr.defineProperty(PrefTextField, 'dataType', cr.PropertyKind.ATTR);
|
| -
|
| /////////////////////////////////////////////////////////////////////////////
|
| // PrefButton class:
|
|
|
| @@ -725,24 +472,22 @@ cr.define('options', function() {
|
| __proto__: HTMLButtonElement.prototype,
|
|
|
| /**
|
| - * Initialization function for the cr.ui framework.
|
| - */
|
| + * Initialization function for the cr.ui framework.
|
| + */
|
| decorate: function() {
|
| var self = this;
|
|
|
| - // Listen to pref changes. This element behaves like a normal button and
|
| - // doesn't affect the underlying preference; it just becomes disabled
|
| - // when the preference is managed, and its value is false.
|
| - // This is useful for buttons that should be disabled when the underlying
|
| - // boolean preference is set to false by a policy or extension.
|
| + // Listen for pref changes.
|
| + // This element behaves like a normal button and does not affect the
|
| + // underlying preference; it just becomes disabled when the preference is
|
| + // managed, and its value is false. This is useful for buttons that should
|
| + // be disabled when the underlying Boolean preference is set to false by a
|
| + // policy or extension.
|
| Preferences.getInstance().addEventListener(this.pref, function(event) {
|
| - var e = {
|
| - value: {
|
| - 'disabled': event.value.disabled && !event.value.value,
|
| - 'controlledBy': event.value.controlledBy
|
| - }
|
| - };
|
| - updateElementState_(self, e);
|
| + updateDisabledState_(self, 'notUserModifiable',
|
| + event.value.disabled && !event.value.value);
|
| + self.controlledBy = event.value.controlledBy;
|
| + OptionsPage.updateManagedBannerVisibility();
|
| });
|
| },
|
|
|
| @@ -755,14 +500,14 @@ cr.define('options', function() {
|
| };
|
|
|
| /**
|
| - * The preference name.
|
| + * The name of the associated preference.
|
| * @type {string}
|
| */
|
| cr.defineProperty(PrefButton, 'pref', cr.PropertyKind.ATTR);
|
|
|
| /**
|
| - * Whether the preference is controlled by something else than the user's
|
| - * settings (either 'policy' or 'extension').
|
| + * Whether the associated preference is controlled by a source other than the
|
| + * user's setting (can be 'policy', 'extension' or 'recommended').
|
| * @type {string}
|
| */
|
| cr.defineProperty(PrefButton, 'controlledBy', cr.PropertyKind.ATTR);
|
| @@ -771,7 +516,6 @@ cr.define('options', function() {
|
| return {
|
| PrefCheckbox: PrefCheckbox,
|
| PrefNumber: PrefNumber,
|
| - PrefNumeric: PrefNumeric,
|
| PrefRadio: PrefRadio,
|
| PrefRange: PrefRange,
|
| PrefSelect: PrefSelect,
|
|
|