Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(703)

Side by Side Diff: chrome/browser/resources/settings/prefs/prefs.js

Issue 1346833003: Lazy init prefs in MD Settings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/resources/settings/checkbox/checkbox.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* Copyright 2015 The Chromium Authors. All rights reserved. 1 /* Copyright 2015 The Chromium Authors. All rights reserved.
2 * Use of this source code is governed by a BSD-style license that can be 2 * Use of this source code is governed by a BSD-style license that can be
3 * found in the LICENSE file. */ 3 * found in the LICENSE file. */
4 4
5 /** 5 /**
6 * @fileoverview 6 * @fileoverview
7 * 'cr-settings-prefs' models Chrome settings and preferences, listening for 7 * 'cr-settings-prefs' models Chrome settings and preferences, listening for
8 * changes to Chrome prefs whitelisted in chrome.settingsPrivate. 8 * changes to Chrome prefs whitelisted in chrome.settingsPrivate.
9 * When changing prefs in this element's 'prefs' property via the UI, this 9 * When changing prefs in this element's 'prefs' property via the UI, this
10 * element tries to set those preferences in Chrome. Whether or not the calls to 10 * element tries to set those preferences in Chrome. Whether or not the calls to
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 80
81 Polymer({ 81 Polymer({
82 is: 'cr-settings-prefs', 82 is: 'cr-settings-prefs',
83 83
84 properties: { 84 properties: {
85 /** 85 /**
86 * Object containing all preferences, for use by Polymer controls. 86 * Object containing all preferences, for use by Polymer controls.
87 */ 87 */
88 prefs: { 88 prefs: {
89 type: Object, 89 type: Object,
90 value: function() { return {}; },
91 notify: true, 90 notify: true,
92 }, 91 },
93 92
94 /** 93 /**
95 * Map of pref keys to PrefWrapper objects representing the state of the 94 * Map of pref keys to PrefWrapper objects representing the state of the
96 * Chrome pref store. 95 * Chrome pref store.
97 * @type {Object<PrefWrapper>} 96 * @type {Object<PrefWrapper>}
98 * @private 97 * @private
99 */ 98 */
100 prefWrappers_: { 99 prefWrappers_: {
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 181
183 // Get the current pref value from chrome.settingsPrivate to ensure the 182 // Get the current pref value from chrome.settingsPrivate to ensure the
184 // UI stays up to date. 183 // UI stays up to date.
185 chrome.settingsPrivate.getPref(key, function(pref) { 184 chrome.settingsPrivate.getPref(key, function(pref) {
186 this.updatePrefs_([pref]); 185 this.updatePrefs_([pref]);
187 }.bind(this)); 186 }.bind(this));
188 }, 187 },
189 188
190 /** 189 /**
191 * Updates the prefs model with the given prefs. 190 * Updates the prefs model with the given prefs.
192 * @param {!Array<!chrome.settingsPrivate.PrefObject>} prefs 191 * @param {!Array<!chrome.settingsPrivate.PrefObject>} newPrefs
193 * @private 192 * @private
194 */ 193 */
195 updatePrefs_: function(prefs) { 194 updatePrefs_: function(newPrefs) {
196 prefs.forEach(function(newPrefObj) { 195 // Use the existing prefs object or create it.
196 var prefs = this.prefs || {};
197 newPrefs.forEach(function(newPrefObj) {
197 // Use the PrefObject from settingsPrivate to create a PrefWrapper in 198 // Use the PrefObject from settingsPrivate to create a PrefWrapper in
198 // prefWrappers_ at the pref's key. 199 // prefWrappers_ at the pref's key.
199 this.prefWrappers_[newPrefObj.key] = 200 this.prefWrappers_[newPrefObj.key] =
200 this.createPrefWrapper_(newPrefObj); 201 this.createPrefWrapper_(newPrefObj);
201 202
202 // Set or update the pref in |prefs|. This triggers observers in the UI, 203 // Add the pref to |prefs|.
203 // which update controls associated with the pref. 204 cr.exportPath(newPrefObj.key, newPrefObj, prefs);
204 this.setPref_(newPrefObj); 205 // If this.prefs already exists, notify listeners of the change.
206 if (prefs == this.prefs)
207 this.notifyPath('prefs.' + newPrefObj.key, newPrefObj);
205 }, this); 208 }, this);
209 if (!this.prefs)
210 this.prefs = prefs;
206 }, 211 },
207 212
208 /** 213 /**
209 * Given a 'property-changed' path, returns the key of the preference the 214 * Given a 'property-changed' path, returns the key of the preference the
210 * path refers to. E.g., if the path of the changed property is 215 * path refers to. E.g., if the path of the changed property is
211 * 'prefs.search.suggest_enabled.value', the key of the pref that changed is 216 * 'prefs.search.suggest_enabled.value', the key of the pref that changed is
212 * 'search.suggest_enabled'. 217 * 'search.suggest_enabled'.
213 * @param {string} path 218 * @param {string} path
214 * @return {string} 219 * @return {string}
215 * @private 220 * @private
216 */ 221 */
217 getPrefKeyFromPath_: function(path) { 222 getPrefKeyFromPath_: function(path) {
218 // Skip the first token, which refers to the member variable (this.prefs). 223 // Skip the first token, which refers to the member variable (this.prefs).
219 var parts = path.split('.'); 224 var parts = path.split('.');
220 assert(parts.shift() == 'prefs'); 225 assert(parts.shift() == 'prefs');
221 226
222 for (let i = 1; i <= parts.length; i++) { 227 for (let i = 1; i <= parts.length; i++) {
223 let key = parts.slice(0, i).join('.'); 228 let key = parts.slice(0, i).join('.');
224 // The prefWrappers_ keys match the pref keys. 229 // The prefWrappers_ keys match the pref keys.
225 if (this.prefWrappers_[key] != undefined) 230 if (this.prefWrappers_[key] != undefined)
226 return key; 231 return key;
227 } 232 }
228 return ''; 233 return '';
229 }, 234 },
230 235
231 /** 236 /**
232 * Sets or updates the pref denoted by newPrefObj.key in the publicy exposed
233 * |prefs| property.
234 * @param {chrome.settingsPrivate.PrefObject} newPrefObj The pref object to
235 * update the pref with.
236 * @private
237 */
238 setPref_: function(newPrefObj) {
239 // Check if the pref exists already in the Polymer |prefs| object.
240 if (this.get(newPrefObj.key, this.prefs)) {
241 // Update just the value, notifying listeners of the change.
242 this.set('prefs.' + newPrefObj.key + '.value', newPrefObj.value);
243 } else {
244 // Add the pref to |prefs|. cr.exportPath doesn't use Polymer.Base.set,
245 // which is OK because the nested property update events aren't useful.
246 cr.exportPath(newPrefObj.key, newPrefObj, this.prefs);
247 // Notify listeners of the change at the preference key.
248 this.notifyPath('prefs.' + newPrefObj.key, newPrefObj);
249 }
250 },
251
252 /**
253 * Creates a PrefWrapper object from a chrome.settingsPrivate pref. 237 * Creates a PrefWrapper object from a chrome.settingsPrivate pref.
254 * @param {!chrome.settingsPrivate.PrefObject} prefObj 238 * @param {!chrome.settingsPrivate.PrefObject} prefObj
255 * PrefObject received from chrome.settingsPrivate. 239 * PrefObject received from chrome.settingsPrivate.
256 * @return {PrefWrapper} An object containing a copy of the PrefObject's 240 * @return {PrefWrapper} An object containing a copy of the PrefObject's
257 * value. 241 * value.
258 * @private 242 * @private
259 */ 243 */
260 createPrefWrapper_: function(prefObj) { 244 createPrefWrapper_: function(prefObj) {
261 return prefObj.type == chrome.settingsPrivate.PrefType.LIST ? 245 return prefObj.type == chrome.settingsPrivate.PrefType.LIST ?
262 new ListPrefWrapper(prefObj) : new PrefWrapper(prefObj); 246 new ListPrefWrapper(prefObj) : new PrefWrapper(prefObj);
263 }, 247 },
264 }); 248 });
265 })(); 249 })();
OLDNEW
« no previous file with comments | « chrome/browser/resources/settings/checkbox/checkbox.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698