Home | History | Annotate | Download | only in cc
      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 base.require('base.quad');
      8 base.require('tracing.trace_model.object_instance');
      9 
     10 base.exportTo('cc', function() {
     11   var convertedNameCache = {};
     12   function convertNameToJSConvention(name) {
     13     if (name in convertedNameCache)
     14       return convertedNameCache[name];
     15 
     16     if (name[0] == '_' ||
     17         name[name.length - 1] == '_') {
     18       convertedNameCache[name] = name;
     19       return name;
     20     }
     21 
     22     var words = name.split('_');
     23     if (words.length == 1) {
     24       convertedNameCache[name] = words[0];
     25       return words[0];
     26     }
     27 
     28     for (var i = 1; i < words.length; i++)
     29       words[i] = words[i][0].toUpperCase() + words[i].substring(1);
     30 
     31     convertedNameCache[name] = words.join('');
     32     return convertedNameCache[name];
     33   }
     34 
     35   function convertObjectFieldNamesToJSConventions(object) {
     36     base.iterObjectFieldsRecursively(
     37         object,
     38         function(object, fieldName, fieldValue) {
     39           delete object[fieldName];
     40           object[newFieldName] = fieldValue;
     41           return newFieldName;
     42         });
     43   }
     44 
     45   function convertQuadSuffixedTypesToQuads(object) {
     46     base.iterObjectFieldsRecursively(
     47         object,
     48         function(object, fieldName, fieldValue) {
     49         });
     50   }
     51 
     52   function convertObject(object) {
     53     convertObjectFieldNamesToJSConventions(object);
     54     convertQuadSuffixedTypesToQuads(object);
     55   }
     56 
     57   function moveRequiredFieldsFromArgsToToplevel(object, fields) {
     58     for (var i = 0; i < fields.length; i++) {
     59       var key = fields[i];
     60       if (object.args[key] === undefined)
     61         throw Error('Expected field ' + key + ' not found in args');
     62       if (object[key] !== undefined)
     63         throw Error('Field ' + key + ' already in object');
     64       object[key] = object.args[key];
     65       delete object.args[key];
     66     }
     67   }
     68 
     69   function moveOptionalFieldsFromArgsToToplevel(object, fields) {
     70     for (var i = 0; i < fields.length; i++) {
     71       var key = fields[i];
     72       if (object.args[key] === undefined)
     73         continue;
     74       if (object[key] !== undefined)
     75         throw Error('Field ' + key + ' already in object');
     76       object[key] = object.args[key];
     77       delete object.args[key];
     78     }
     79   }
     80 
     81   function preInitializeObject(object) {
     82     preInitializeObjectInner(object.args, false);
     83   }
     84 
     85   function preInitializeObjectInner(object, hasRecursed) {
     86     if (!(object instanceof Object))
     87       return;
     88 
     89     if (object instanceof Array) {
     90       for (var i = 0; i < object.length; i++)
     91         preInitializeObjectInner(object[i], true);
     92       return;
     93     }
     94 
     95     if (hasRecursed &&
     96         (object instanceof tracing.trace_model.ObjectSnapshot ||
     97          object instanceof tracing.trace_model.ObjectInstance))
     98       return;
     99 
    100     for (var key in object) {
    101       var newKey = convertNameToJSConvention(key);
    102       if (newKey != key) {
    103         var value = object[key];
    104         delete object[key];
    105         object[newKey] = value;
    106         key = newKey;
    107       }
    108 
    109       if (/Quad$/.test(key) && !(object[key] instanceof base.Quad)) {
    110         var q;
    111         try {
    112           q = base.Quad.From8Array(object[key]);
    113         } catch (e) {
    114           console.log(e);
    115         }
    116         object[key] = q;
    117         continue;
    118       }
    119 
    120       preInitializeObjectInner(object[key], true);
    121     }
    122   }
    123 
    124   return {
    125     preInitializeObject: preInitializeObject,
    126     convertNameToJSConvention: convertNameToJSConvention,
    127     moveRequiredFieldsFromArgsToToplevel: moveRequiredFieldsFromArgsToToplevel,
    128     moveOptionalFieldsFromArgsToToplevel: moveOptionalFieldsFromArgsToToplevel
    129   };
    130 });
    131