| // Copyright (c) 2013 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. |
| |
| 'use strict'; |
| |
| base.require('base.quad'); |
| base.require('tracing.trace_model.object_instance'); |
| |
| base.exportTo('cc', function() { |
| var convertedNameCache = {}; |
| function convertNameToJSConvention(name) { |
| if (name in convertedNameCache) |
| return convertedNameCache[name]; |
| |
| if (name[0] == '_' || |
| name[name.length - 1] == '_') { |
| convertedNameCache[name] = name; |
| return name; |
| } |
| |
| var words = name.split('_'); |
| if (words.length == 1) { |
| convertedNameCache[name] = words[0]; |
| return words[0]; |
| } |
| |
| for (var i = 1; i < words.length; i++) |
| words[i] = words[i][0].toUpperCase() + words[i].substring(1); |
| |
| convertedNameCache[name] = words.join(''); |
| return convertedNameCache[name]; |
| } |
| |
| function convertObjectFieldNamesToJSConventions(object) { |
| base.iterObjectFieldsRecursively( |
| object, |
| function(object, fieldName, fieldValue) { |
| delete object[fieldName]; |
| object[newFieldName] = fieldValue; |
| return newFieldName; |
| }); |
| } |
| |
| function convertQuadSuffixedTypesToQuads(object) { |
| base.iterObjectFieldsRecursively( |
| object, |
| function(object, fieldName, fieldValue) { |
| }); |
| } |
| |
| function convertObject(object) { |
| convertObjectFieldNamesToJSConventions(object); |
| convertQuadSuffixedTypesToQuads(object); |
| } |
| |
| function moveRequiredFieldsFromArgsToToplevel(object, fields) { |
| for (var i = 0; i < fields.length; i++) { |
| var key = fields[i]; |
| if (object.args[key] === undefined) |
| throw Error('Expected field ' + key + ' not found in args'); |
| if (object[key] !== undefined) |
| throw Error('Field ' + key + ' already in object'); |
| object[key] = object.args[key]; |
| delete object.args[key]; |
| } |
| } |
| |
| function moveOptionalFieldsFromArgsToToplevel(object, fields) { |
| for (var i = 0; i < fields.length; i++) { |
| var key = fields[i]; |
| if (object.args[key] === undefined) |
| continue; |
| if (object[key] !== undefined) |
| throw Error('Field ' + key + ' already in object'); |
| object[key] = object.args[key]; |
| delete object.args[key]; |
| } |
| } |
| |
| function preInitializeObject(object) { |
| preInitializeObjectInner(object.args, false); |
| } |
| |
| function preInitializeObjectInner(object, hasRecursed) { |
| if (!(object instanceof Object)) |
| return; |
| |
| if (object instanceof Array) { |
| for (var i = 0; i < object.length; i++) |
| preInitializeObjectInner(object[i], true); |
| return; |
| } |
| |
| if (hasRecursed && |
| (object instanceof tracing.trace_model.ObjectSnapshot || |
| object instanceof tracing.trace_model.ObjectInstance)) |
| return; |
| |
| for (var key in object) { |
| var newKey = convertNameToJSConvention(key); |
| if (newKey != key) { |
| var value = object[key]; |
| delete object[key]; |
| object[newKey] = value; |
| key = newKey; |
| } |
| |
| if (/Quad$/.test(key) && !(object[key] instanceof base.Quad)) { |
| var q; |
| try { |
| q = base.Quad.From8Array(object[key]); |
| } catch (e) { |
| console.log(e); |
| } |
| object[key] = q; |
| continue; |
| } |
| |
| preInitializeObjectInner(object[key], true); |
| } |
| } |
| |
| return { |
| preInitializeObject: preInitializeObject, |
| convertNameToJSConvention: convertNameToJSConvention, |
| moveRequiredFieldsFromArgsToToplevel: moveRequiredFieldsFromArgsToToplevel, |
| moveOptionalFieldsFromArgsToToplevel: moveOptionalFieldsFromArgsToToplevel |
| }; |
| }); |