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.
8 <link rel="stylesheet" href="/tracing/analysis/generic_object_view.css">
10 <link rel="import" href="/tracing/analysis/analysis_link.html">
11 <link rel="import" href="/base/utils.html">
12 <link rel="import" href="/base/ui.html">
17 tv.exportTo('tracing.analysis', function() {
21 var GenericObjectView = tv.ui.define('x-generic-object-view');
23 GenericObjectView.prototype = {
24 __proto__: HTMLUnknownElement.prototype,
26 decorate: function() {
27 this.object_ = undefined;
35 this.object_ = object;
36 this.updateContents_();
39 updateContents_: function() {
40 this.textContent = '';
42 this.appendElementsForType_('', this.object_, 0, 0, 5, '');
45 appendElementsForType_: function(
46 label, object, indent, depth, maxDepth, suffix) {
47 if (depth > maxDepth) {
48 this.appendSimpleText_(
49 label, indent, '<recursion limit reached>', suffix);
53 if (object === undefined) {
54 this.appendSimpleText_(label, indent, 'undefined', suffix);
58 if (object === null) {
59 this.appendSimpleText_(label, indent, 'null', suffix);
63 if (!(object instanceof Object)) {
64 var type = typeof object;
65 if (type == 'string') {
66 var objectReplaced = false;
67 if ((object[0] == '{' && object[object.length - 1] == '}') ||
68 (object[0] == '[' && object[object.length - 1] == ']')) {
70 object = JSON.parse(object);
71 objectReplaced = true;
76 return this.appendSimpleText_(
77 label, indent, '"' + object + '"', suffix);
79 /* Fall through to the flow below */
82 return this.appendSimpleText_(label, indent, object, suffix);
86 if (object instanceof tracing.trace_model.ObjectSnapshot) {
87 var link = new tracing.analysis.ObjectSnapshotLink(object);
88 link.objectSnapshot = object;
89 this.appendElementWithLabel_(label, indent, link, suffix);
93 if (object instanceof tracing.trace_model.ObjectInstance) {
94 var link = new tracing.analysis.ObjectInstanceLink(object);
95 link.objectInstance = object;
96 this.appendElementWithLabel_(label, indent, link, suffix);
100 if (object instanceof tv.Rect) {
101 this.appendSimpleText_(label, indent, object.toString(), suffix);
105 if (object instanceof Array) {
106 this.appendElementsForArray_(
107 label, object, indent, depth, maxDepth, suffix);
111 this.appendElementsForObject_(
112 label, object, indent, depth, maxDepth, suffix);
115 appendElementsForArray_: function(
116 label, object, indent, depth, maxDepth, suffix) {
117 if (object.length == 0) {
118 this.appendSimpleText_(label, indent, '[]', suffix);
122 this.appendElementsForType_(
125 indent, depth + 1, maxDepth,
126 object.length > 1 ? ',' : ']' + suffix);
127 for (var i = 1; i < object.length; i++) {
128 this.appendElementsForType_(
131 indent + label.length + 1, depth + 1, maxDepth,
132 i < object.length - 1 ? ',' : ']' + suffix);
137 appendElementsForObject_: function(
138 label, object, indent, depth, maxDepth, suffix) {
139 var keys = tv.dictionaryKeys(object);
140 if (keys.length == 0) {
141 this.appendSimpleText_(label, indent, '{}', suffix);
145 this.appendElementsForType_(
146 label + '{' + keys[0] + ': ',
148 indent, depth, maxDepth,
149 keys.length > 1 ? ',' : '}' + suffix);
150 for (var i = 1; i < keys.length; i++) {
151 this.appendElementsForType_(
154 indent + label.length + 1, depth + 1, maxDepth,
155 i < keys.length - 1 ? ',' : '}' + suffix);
159 appendElementWithLabel_: function(label, indent, dataElement, suffix) {
160 var row = document.createElement('div');
162 var indentSpan = document.createElement('span');
163 indentSpan.style.whiteSpace = 'pre';
164 for (var i = 0; i < indent; i++)
165 indentSpan.textContent += ' ';
166 row.appendChild(indentSpan);
168 var labelSpan = document.createElement('span');
169 labelSpan.textContent = label;
170 row.appendChild(labelSpan);
172 row.appendChild(dataElement);
173 var suffixSpan = document.createElement('span');
174 suffixSpan.textContent = suffix;
175 row.appendChild(suffixSpan);
177 row.dataElement = dataElement;
178 this.appendChild(row);
181 appendSimpleText_: function(label, indent, text, suffix) {
182 var el = this.ownerDocument.createElement('span');
183 el.textContent = text;
184 this.appendElementWithLabel_(label, indent, el, suffix);
193 var GenericObjectViewWithLabel = tv.ui.define(
194 'x-generic-object-view-with-label');
196 GenericObjectViewWithLabel.prototype = {
197 __proto__: HTMLUnknownElement.prototype,
199 decorate: function() {
200 this.labelEl_ = document.createElement('div');
201 this.genericObjectView_ = new tracing.analysis.GenericObjectView();
202 this.appendChild(this.labelEl_);
203 this.appendChild(this.genericObjectView_);
207 return this.labelEl_.textContent;
211 this.labelEl_.textContent = label;
215 return this.genericObjectView_.object;
219 this.genericObjectView_.object = object;
224 GenericObjectView: GenericObjectView,
225 GenericObjectViewWithLabel: GenericObjectViewWithLabel