Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / trace_viewer / tracing / trace_model_settings.html
1 <!DOCTYPE html>
2 <!--
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.
6 -->
7 <link rel="import" href="/tvcm/settings.html">
8
9 <script>
10 'use strict';
11
12 tvcm.exportTo('tracing', function() {
13   var Settings = tvcm.Settings;
14
15   /**
16    * A way to persist settings specific to parts of a trace model.
17    *
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.
22    *
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
28    * not.
29    */
30   function TraceModelSettings(model) {
31     this.model = model;
32     this.objectsByKey_ = [];
33     this.nonuniqueKeys_ = [];
34     this.buildObjectsByKeyMap_();
35     this.removeNonuniqueKeysFromSettings_();
36     this.ephemeralSettingsByGUID_ = {};
37   }
38
39   TraceModelSettings.prototype = {
40     buildObjectsByKeyMap_: function() {
41       var objects = [];
42       this.model.iterateAllPersistableObjects(function(o) {
43         objects.push(o);
44       });
45
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();
51         if (!objectKey)
52           continue;
53         if (objectsByKey[objectKey] === undefined) {
54           objectsByKey[objectKey] = object;
55           continue;
56         }
57         objectsByKey[objectKey] = NONUNIQUE_KEY;
58       }
59
60       var nonuniqueKeys = {};
61       tvcm.dictionaryKeys(objectsByKey).forEach(function(objectKey) {
62         if (objectsByKey[objectKey] !== NONUNIQUE_KEY)
63           return;
64         delete objectsByKey[objectKey];
65         nonuniqueKeys[objectKey] = true;
66       });
67
68       this.nonuniqueKeys = nonuniqueKeys;
69       this.objectsByKey_ = objectsByKey;
70     },
71
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])
77           return;
78         settingsChanged = true;
79         delete settings[objectKey];
80       }, this);
81       if (settingsChanged)
82         Settings.set('trace_model_settings', settings);
83     },
84
85     hasUniqueSettingKey: function(object) {
86       var objectKey = object.getSettingsKey();
87       if (!objectKey)
88         return false;
89       return this.objectsByKey_[objectKey] !== undefined;
90     },
91
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;
98         return defaultValue;
99       }
100
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)
106         return value;
107       return defaultValue;
108     },
109
110     setSettingFor: function(object, objectLevelKey, value) {
111       var objectKey = object.getSettingsKey();
112       if (!objectKey || !this.objectsByKey_[objectKey]) {
113         this.getEphemeralSettingsFor_(object)[objectLevelKey] = value;
114         return;
115       }
116
117       var settings = Settings.get('trace_model_settings', {});
118       if (!settings[objectKey])
119         settings[objectKey] = {};
120       if (settings[objectKey][objectLevelKey] === value)
121         return;
122       settings[objectKey][objectLevelKey] = value;
123       Settings.set('trace_model_settings', settings);
124     },
125
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];
132     }
133   };
134
135   return {
136     TraceModelSettings: TraceModelSettings
137   };
138 });
139 </script>