166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2013 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.requireStylesheet('tracing.analysis.generic_object_view');
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('base.utils');
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.analysis_link');
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui');
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.analysis', function() {
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  /**
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * @constructor
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   */
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var GenericObjectView = ui.define('x-generic-object-view');
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  GenericObjectView.prototype = {
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    __proto__: HTMLUnknownElement.prototype,
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    decorate: function() {
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.object_ = undefined;
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get object() {
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return this.object_;
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    set object(object) {
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.object_ = object;
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.updateContents_();
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    updateContents_: function() {
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.textContent = '';
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendElementsForType_('', this.object_, 0, 0, 5, '');
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    appendElementsForType_: function(
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        label, object, indent, depth, maxDepth, suffix) {
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (depth > maxDepth) {
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendSimpleText_(
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            label, indent, '<recursion limit reached>', suffix);
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (object === undefined) {
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendSimpleText_(label, indent, 'undefined', suffix);
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (object === null) {
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendSimpleText_(label, indent, 'null', suffix);
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!(object instanceof Object)) {
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var type = typeof object;
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if (type == 'string') {
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.appendSimpleText_(label, indent, '"' + object + '"', suffix);
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        } else {
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.appendSimpleText_(label, indent, object, suffix);
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (object instanceof tracing.trace_model.ObjectSnapshot) {
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var link = new tracing.analysis.ObjectSnapshotLink(object);
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        link.objectSnapshot = object;
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendElementWithLabel_(label, indent, link, suffix);
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (object instanceof tracing.trace_model.ObjectInstance) {
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var link = new tracing.analysis.ObjectInstanceLink(object);
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        link.objectInstance = object;
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendElementWithLabel_(label, indent, link, suffix);
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (object instanceof Array) {
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendElementsForArray_(
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            label, object, indent, depth, maxDepth, suffix);
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendElementsForObject_(
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          label, object, indent, depth, maxDepth, suffix);
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    appendElementsForArray_: function(
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        label, object, indent, depth, maxDepth, suffix) {
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (object.length == 0) {
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendSimpleText_(label, indent, '[]', suffix);
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendElementsForType_(
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          label + '[',
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          object[0],
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          indent, depth + 1, maxDepth,
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          object.length > 1 ? ',' : ']' + suffix);
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      for (var i = 1; i < object.length; i++) {
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendElementsForType_(
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            '',
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            object[i],
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            indent + label.length + 1, depth + 1, maxDepth,
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            i < object.length - 1 ? ',' : ']' + suffix);
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return;
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    appendElementsForObject_: function(
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        label, object, indent, depth, maxDepth, suffix) {
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var keys = base.dictionaryKeys(object);
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (keys.length == 0) {
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendSimpleText_(label, indent, '{}', suffix);
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendElementsForType_(
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          label + '{' + keys[0] + ': ',
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          object[keys[0]],
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          indent, depth, maxDepth,
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          keys.length > 1 ? ',' : '}' + suffix);
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      for (var i = 1; i < keys.length; i++) {
13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendElementsForType_(
13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            keys[i] + ': ',
13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            object[keys[i]],
13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            indent + label.length + 1, depth + 1, maxDepth,
13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            i < keys.length - 1 ? ',' : '}' + suffix);
13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    appendElementWithLabel_: function(label, indent, dataElement, suffix) {
13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var row = document.createElement('div');
14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var indentSpan = document.createElement('span');
14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      indentSpan.style.whiteSpace = 'pre';
14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      for (var i = 0; i < indent; i++)
14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        indentSpan.textContent += ' ';
14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      row.appendChild(indentSpan);
14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var labelSpan = document.createElement('span');
14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      labelSpan.textContent = label;
14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      row.appendChild(labelSpan);
15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      row.appendChild(dataElement);
15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var suffixSpan = document.createElement('span');
15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      suffixSpan.textContent = suffix;
15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      row.appendChild(suffixSpan);
15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      row.dataElement = dataElement;
15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendChild(row);
15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    appendSimpleText_: function(label, indent, text, suffix) {
16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      var el = this.ownerDocument.createElement('span');
16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      el.textContent = text;
16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.appendElementWithLabel_(label, indent, el, suffix);
16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return el;
16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  return {
17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    GenericObjectView: GenericObjectView
17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
173