05db6a4f217740b95ea6aab688a0bcf54d5ce494
[platform/framework/web/crosswalk.git] / src / third_party / trace-viewer / src / cc / util.js
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 'use strict';
6
7 tvcm.require('tvcm.quad');
8 tvcm.require('tvcm.rect');
9 tvcm.require('tracing.trace_model.object_instance');
10
11 tvcm.exportTo('cc', function() {
12   var convertedNameCache = {};
13   function convertNameToJSConvention(name) {
14     if (name in convertedNameCache)
15       return convertedNameCache[name];
16
17     if (name[0] == '_' ||
18         name[name.length - 1] == '_') {
19       convertedNameCache[name] = name;
20       return name;
21     }
22
23     var words = name.split('_');
24     if (words.length == 1) {
25       convertedNameCache[name] = words[0];
26       return words[0];
27     }
28
29     for (var i = 1; i < words.length; i++)
30       words[i] = words[i][0].toUpperCase() + words[i].substring(1);
31
32     convertedNameCache[name] = words.join('');
33     return convertedNameCache[name];
34   }
35
36   function convertObjectFieldNamesToJSConventions(object) {
37     tvcm.iterObjectFieldsRecursively(
38         object,
39         function(object, fieldName, fieldValue) {
40           delete object[fieldName];
41           object[newFieldName] = fieldValue;
42           return newFieldName;
43         });
44   }
45
46   function convertQuadSuffixedTypesToQuads(object) {
47     tvcm.iterObjectFieldsRecursively(
48         object,
49         function(object, fieldName, fieldValue) {
50         });
51   }
52
53   function convertObject(object) {
54     convertObjectFieldNamesToJSConventions(object);
55     convertQuadSuffixedTypesToQuads(object);
56   }
57
58   function moveRequiredFieldsFromArgsToToplevel(object, fields) {
59     for (var i = 0; i < fields.length; i++) {
60       var key = fields[i];
61       if (object.args[key] === undefined)
62         throw Error('Expected field ' + key + ' not found in args');
63       if (object[key] !== undefined)
64         throw Error('Field ' + key + ' already in object');
65       object[key] = object.args[key];
66       delete object.args[key];
67     }
68   }
69
70   function moveOptionalFieldsFromArgsToToplevel(object, fields) {
71     for (var i = 0; i < fields.length; i++) {
72       var key = fields[i];
73       if (object.args[key] === undefined)
74         continue;
75       if (object[key] !== undefined)
76         throw Error('Field ' + key + ' already in object');
77       object[key] = object.args[key];
78       delete object.args[key];
79     }
80   }
81
82   function preInitializeObject(object) {
83     preInitializeObjectInner(object.args, false);
84   }
85
86   function preInitializeObjectInner(object, hasRecursed) {
87     if (!(object instanceof Object))
88       return;
89
90     if (object instanceof Array) {
91       for (var i = 0; i < object.length; i++)
92         preInitializeObjectInner(object[i], true);
93       return;
94     }
95
96     if (hasRecursed &&
97         (object instanceof tracing.trace_model.ObjectSnapshot ||
98          object instanceof tracing.trace_model.ObjectInstance))
99       return;
100
101     for (var key in object) {
102       var newKey = convertNameToJSConvention(key);
103       if (newKey != key) {
104         var value = object[key];
105         delete object[key];
106         object[newKey] = value;
107         key = newKey;
108       }
109
110       // Convert objects with keys ending with Quad to tvcm.Quad type.
111       if (/Quad$/.test(key) && !(object[key] instanceof tvcm.Quad)) {
112         var q;
113         try {
114           q = tvcm.Quad.from8Array(object[key]);
115         } catch (e) {
116           console.log(e);
117         }
118         object[key] = q;
119         continue;
120       }
121
122       // Convert objects with keys ending with Rect to tvcm.Rect type.
123       if (/Rect$/.test(key) && !(object[key] instanceof tvcm.Rect)) {
124         var r;
125         try {
126           r = tvcm.Rect.fromArray(object[key]);
127         } catch (e) {
128           console.log(e);
129         }
130         object[key] = r;
131       }
132
133       preInitializeObjectInner(object[key], true);
134     }
135   }
136
137   return {
138     preInitializeObject: preInitializeObject,
139     convertNameToJSConvention: convertNameToJSConvention,
140     moveRequiredFieldsFromArgsToToplevel: moveRequiredFieldsFromArgsToToplevel,
141     moveOptionalFieldsFromArgsToToplevel: moveOptionalFieldsFromArgsToToplevel
142   };
143 });