3 Copyright (c) 2013 The Chromium Authors. All rights reserved.
4 Use of this source code is governed by a BSD-style license that can be
5 found in the LICENSE file.
7 <link rel="import" href="/tvcm/settings.html">
12 tvcm.exportTo('tracing', function() {
13 var Settings = tvcm.Settings;
16 * A way to persist settings specific to parts of a trace model.
18 * This object should not be persisted because it builds up internal data
19 * structures that map model objects to settings keys. It should thus be
20 * created for the druation of whatever interaction(s) you're going to do with
21 * model settings, and then discarded.
23 * This system works on a notion of an object key: for an object's key, it
24 * considers all the other keys in the model. If it is unique, then the key is
25 * persisted to tvcm.Settings. However, if it is not unique, then the
26 * setting is stored on the object itself. Thus, objects with unique keys will
27 * be persisted across page reloads, whereas objects with nonunique keys will
30 function TraceModelSettings(model) {
32 this.objectsByKey_ = [];
33 this.nonuniqueKeys_ = [];
34 this.buildObjectsByKeyMap_();
35 this.removeNonuniqueKeysFromSettings_();
36 this.ephemeralSettingsByGUID_ = {};
39 TraceModelSettings.prototype = {
40 buildObjectsByKeyMap_: function() {
42 this.model.iterateAllPersistableObjects(function(o) {
46 var objectsByKey = {};
47 var NONUNIQUE_KEY = 'nonuniqueKey';
48 for (var i = 0; i < objects.length; i++) {
49 var object = objects[i];
50 var objectKey = object.getSettingsKey();
53 if (objectsByKey[objectKey] === undefined) {
54 objectsByKey[objectKey] = object;
57 objectsByKey[objectKey] = NONUNIQUE_KEY;
60 var nonuniqueKeys = {};
61 tvcm.dictionaryKeys(objectsByKey).forEach(function(objectKey) {
62 if (objectsByKey[objectKey] !== NONUNIQUE_KEY)
64 delete objectsByKey[objectKey];
65 nonuniqueKeys[objectKey] = true;
68 this.nonuniqueKeys = nonuniqueKeys;
69 this.objectsByKey_ = objectsByKey;
72 removeNonuniqueKeysFromSettings_: function() {
73 var settings = Settings.get('trace_model_settings', {});
74 var settingsChanged = false;
75 tvcm.dictionaryKeys(settings).forEach(function(objectKey) {
76 if (!this.nonuniqueKeys[objectKey])
78 settingsChanged = true;
79 delete settings[objectKey];
82 Settings.set('trace_model_settings', settings);
85 hasUniqueSettingKey: function(object) {
86 var objectKey = object.getSettingsKey();
89 return this.objectsByKey_[objectKey] !== undefined;
92 getSettingFor: function(object, objectLevelKey, defaultValue) {
93 var objectKey = object.getSettingsKey();
94 if (!objectKey || !this.objectsByKey_[objectKey]) {
95 var ephemeralValue = this.getEphemeralSettingsFor_(object)[objectLevelKey];
96 if (ephemeralValue !== undefined)
97 return ephemeralValue;
101 var settings = Settings.get('trace_model_settings', {});
102 if (!settings[objectKey])
103 settings[objectKey] = {};
104 var value = settings[objectKey][objectLevelKey];
105 if (value !== undefined)
110 setSettingFor: function(object, objectLevelKey, value) {
111 var objectKey = object.getSettingsKey();
112 if (!objectKey || !this.objectsByKey_[objectKey]) {
113 this.getEphemeralSettingsFor_(object)[objectLevelKey] = value;
117 var settings = Settings.get('trace_model_settings', {});
118 if (!settings[objectKey])
119 settings[objectKey] = {};
120 if (settings[objectKey][objectLevelKey] === value)
122 settings[objectKey][objectLevelKey] = value;
123 Settings.set('trace_model_settings', settings);
126 getEphemeralSettingsFor_: function(object) {
127 if (object.guid === undefined)
128 throw new Error('Only objects with GUIDs can be persisted');
129 if (this.ephemeralSettingsByGUID_[object.guid] === undefined)
130 this.ephemeralSettingsByGUID_[object.guid] = {};
131 return this.ephemeralSettingsByGUID_[object.guid];
136 TraceModelSettings: TraceModelSettings