summaryrefslogtreecommitdiff
path: root/chromium/chrome/browser/resources/settings/prefs/prefs.js
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/chrome/browser/resources/settings/prefs/prefs.js')
-rw-r--r--chromium/chrome/browser/resources/settings/prefs/prefs.js335
1 files changed, 0 insertions, 335 deletions
diff --git a/chromium/chrome/browser/resources/settings/prefs/prefs.js b/chromium/chrome/browser/resources/settings/prefs/prefs.js
deleted file mode 100644
index 55626d18fae..00000000000
--- a/chromium/chrome/browser/resources/settings/prefs/prefs.js
+++ /dev/null
@@ -1,335 +0,0 @@
-/* Copyright 2015 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. */
-
-/**
- * @fileoverview
- * 'settings-prefs' exposes a singleton model of Chrome settings and
- * preferences, which listens to changes to Chrome prefs whitelisted in
- * chrome.settingsPrivate. When changing prefs in this element's 'prefs'
- * property via the UI, the singleton model tries to set those preferences in
- * Chrome. Whether or not the calls to settingsPrivate.setPref succeed, 'prefs'
- * is eventually consistent with the Chrome pref store.
- */
-
-(function() {
-'use strict';
-
-/**
- * Checks whether two values are recursively equal. Only compares serializable
- * data (primitives, serializable arrays and serializable objects).
- * @param {*} val1 Value to compare.
- * @param {*} val2 Value to compare with val1.
- * @return {boolean} True if the values are recursively equal.
- */
-function deepEqual(val1, val2) {
- if (val1 === val2) {
- return true;
- }
-
- if (Array.isArray(val1) || Array.isArray(val2)) {
- if (!Array.isArray(val1) || !Array.isArray(val2)) {
- return false;
- }
- return arraysEqual(
- /** @type {!Array} */ (val1),
- /** @type {!Array} */ (val2));
- }
-
- if (val1 instanceof Object && val2 instanceof Object) {
- return objectsEqual(val1, val2);
- }
-
- return false;
-}
-
-/**
- * @param {!Array} arr1
- * @param {!Array} arr2
- * @return {boolean} True if the arrays are recursively equal.
- */
-function arraysEqual(arr1, arr2) {
- if (arr1.length != arr2.length) {
- return false;
- }
-
- for (let i = 0; i < arr1.length; i++) {
- if (!deepEqual(arr1[i], arr2[i])) {
- return false;
- }
- }
-
- return true;
-}
-
-/**
- * @param {!Object} obj1
- * @param {!Object} obj2
- * @return {boolean} True if the objects are recursively equal.
- */
-function objectsEqual(obj1, obj2) {
- const keys1 = Object.keys(obj1);
- const keys2 = Object.keys(obj2);
- if (keys1.length != keys2.length) {
- return false;
- }
-
- for (let i = 0; i < keys1.length; i++) {
- const key = keys1[i];
- if (!deepEqual(obj1[key], obj2[key])) {
- return false;
- }
- }
-
- return true;
-}
-
-/**
- * Returns a recursive copy of the value.
- * @param {*} val Value to copy. Should be a primitive or only contain
- * serializable data (primitives, serializable arrays and
- * serializable objects).
- * @return {*} A deep copy of the value.
- */
-function deepCopy(val) {
- if (!(val instanceof Object)) {
- return val;
- }
- return Array.isArray(val) ? deepCopyArray(/** @type {!Array} */ (val)) :
- deepCopyObject(val);
-}
-
-/**
- * @param {!Array} arr
- * @return {!Array} Deep copy of the array.
- */
-function deepCopyArray(arr) {
- const copy = [];
- for (let i = 0; i < arr.length; i++) {
- copy.push(deepCopy(arr[i]));
- }
- return copy;
-}
-
-/**
- * @param {!Object} obj
- * @return {!Object} Deep copy of the object.
- */
-function deepCopyObject(obj) {
- const copy = {};
- const keys = Object.keys(obj);
- for (let i = 0; i < keys.length; i++) {
- const key = keys[i];
- copy[key] = deepCopy(obj[key]);
- }
- return copy;
-}
-
-Polymer({
- is: 'settings-prefs',
-
- properties: {
- /**
- * Object containing all preferences, for use by Polymer controls.
- * @type {Object|undefined}
- */
- prefs: {
- type: Object,
- notify: true,
- },
-
- /**
- * Map of pref keys to values representing the state of the Chrome
- * pref store as of the last update from the API.
- * @type {Object<*>}
- * @private
- */
- lastPrefValues_: {
- type: Object,
- value: function() {
- return {};
- },
- },
- },
-
- observers: [
- 'prefsChanged_(prefs.*)',
- ],
-
- /** @type {SettingsPrivate} */
- settingsApi_: /** @type {SettingsPrivate} */ (chrome.settingsPrivate),
-
- /** @override */
- created: function() {
- if (!CrSettingsPrefs.deferInitialization) {
- this.initialize();
- }
- },
-
- /** @override */
- detached: function() {
- CrSettingsPrefs.resetForTesting();
- },
-
- /**
- * @param {SettingsPrivate=} opt_settingsApi SettingsPrivate implementation
- * to use (chrome.settingsPrivate by default).
- */
- initialize: function(opt_settingsApi) {
- // Only initialize once (or after resetForTesting() is called).
- if (this.initialized_) {
- return;
- }
- this.initialized_ = true;
-
- if (opt_settingsApi) {
- this.settingsApi_ = opt_settingsApi;
- }
-
- /** @private {function(!Array<!chrome.settingsPrivate.PrefObject>)} */
- this.boundPrefsChanged_ = this.onSettingsPrivatePrefsChanged_.bind(this);
- this.settingsApi_.onPrefsChanged.addListener(this.boundPrefsChanged_);
- this.settingsApi_.getAllPrefs(
- this.onSettingsPrivatePrefsFetched_.bind(this));
- },
-
- /**
- * @param {!{path: string}} e
- * @private
- */
- prefsChanged_: function(e) {
- // |prefs| can be directly set or unset in tests.
- if (!CrSettingsPrefs.isInitialized || e.path == 'prefs') {
- return;
- }
-
- const key = this.getPrefKeyFromPath_(e.path);
- const prefStoreValue = this.lastPrefValues_[key];
-
- const prefObj = /** @type {chrome.settingsPrivate.PrefObject} */ (
- this.get(key, this.prefs));
-
- // If settingsPrivate already has this value, ignore it. (Otherwise,
- // a change event from settingsPrivate could make us call
- // settingsPrivate.setPref and potentially trigger an IPC loop.)
- if (!deepEqual(prefStoreValue, prefObj.value)) {
- this.settingsApi_.setPref(
- key, prefObj.value,
- /* pageId */ '',
- /* callback */ this.setPrefCallback_.bind(this, key));
- }
- },
-
- /**
- * Called when prefs in the underlying Chrome pref store are changed.
- * @param {!Array<!chrome.settingsPrivate.PrefObject>} prefs
- * The prefs that changed.
- * @private
- */
- onSettingsPrivatePrefsChanged_: function(prefs) {
- if (CrSettingsPrefs.isInitialized) {
- this.updatePrefs_(prefs);
- }
- },
-
- /**
- * Called when prefs are fetched from settingsPrivate.
- * @param {!Array<!chrome.settingsPrivate.PrefObject>} prefs
- * @private
- */
- onSettingsPrivatePrefsFetched_: function(prefs) {
- this.updatePrefs_(prefs);
- CrSettingsPrefs.setInitialized();
- },
-
- /**
- * Checks the result of calling settingsPrivate.setPref.
- * @param {string} key The key used in the call to setPref.
- * @param {boolean} success True if setting the pref succeeded.
- * @private
- */
- setPrefCallback_: function(key, success) {
- if (!success) {
- this.refresh(key);
- }
- },
-
- /**
- * Get the current pref value from chrome.settingsPrivate to ensure the UI
- * stays up to date.
- * @param {string} key
- */
- refresh: function(key) {
- this.settingsApi_.getPref(key, pref => {
- this.updatePrefs_([pref]);
- });
- },
-
- /**
- * Updates the prefs model with the given prefs.
- * @param {!Array<!chrome.settingsPrivate.PrefObject>} newPrefs
- * @private
- */
- updatePrefs_: function(newPrefs) {
- // Use the existing prefs object or create it.
- const prefs = this.prefs || {};
- newPrefs.forEach(function(newPrefObj) {
- // Use the PrefObject from settingsPrivate to create a copy in
- // lastPrefValues_ at the pref's key.
- this.lastPrefValues_[newPrefObj.key] = deepCopy(newPrefObj.value);
-
- if (!deepEqual(this.get(newPrefObj.key, prefs), newPrefObj)) {
- // Add the pref to |prefs|.
- cr.exportPath(newPrefObj.key, newPrefObj, prefs);
- // If this.prefs already exists, notify listeners of the change.
- if (prefs == this.prefs) {
- this.notifyPath('prefs.' + newPrefObj.key, newPrefObj);
- }
- }
- }, this);
- if (!this.prefs) {
- this.prefs = prefs;
- }
- },
-
- /**
- * Given a 'property-changed' path, returns the key of the preference the
- * path refers to. E.g., if the path of the changed property is
- * 'prefs.search.suggest_enabled.value', the key of the pref that changed is
- * 'search.suggest_enabled'.
- * @param {string} path
- * @return {string}
- * @private
- */
- getPrefKeyFromPath_: function(path) {
- // Skip the first token, which refers to the member variable (this.prefs).
- const parts = path.split('.');
- assert(parts.shift() == 'prefs', 'Path doesn\'t begin with \'prefs\'');
-
- for (let i = 1; i <= parts.length; i++) {
- const key = parts.slice(0, i).join('.');
- // The lastPrefValues_ keys match the pref keys.
- if (this.lastPrefValues_.hasOwnProperty(key)) {
- return key;
- }
- }
- return '';
- },
-
- /**
- * Resets the element so it can be re-initialized with a new prefs state.
- */
- resetForTesting: function() {
- if (!this.initialized_) {
- return;
- }
- this.prefs = undefined;
- this.lastPrefValues_ = {};
- this.initialized_ = false;
- // Remove the listener added in initialize().
- this.settingsApi_.onPrefsChanged.removeListener(this.boundPrefsChanged_);
- this.settingsApi_ =
- /** @type {SettingsPrivate} */ (chrome.settingsPrivate);
- },
-});
-})();