blob: 59c128b5522095491d14eef58ad79ed6ff3c1aad [file] [log] [blame]
<!DOCTYPE html>
<!--
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.
-->
<link rel="import" href="/core/analysis/analysis_link.html">
<link rel="import" href="/base/utils.html">
<link rel="import" href="/base/ui.html">
<polymer-element name="tv-c-analysis-generic-object-view"
is="HTMLUnknownElement">
<template>
<style>
:host {
display: block;
font-family: monospace;
}
</style>
<div id="content">
</div>
</template>
<script>
'use strict';
Polymer({
ready: function() {
this.object_ = undefined;
},
get object() {
return this.object_;
},
set object(object) {
this.object_ = object;
this.updateContents_();
},
updateContents_: function() {
this.$.content.textContent = '';
this.appendElementsForType_('', this.object_, 0, 0, 5, '');
},
appendElementsForType_: function(
label, object, indent, depth, maxDepth, suffix) {
if (depth > maxDepth) {
this.appendSimpleText_(
label, indent, '<recursion limit reached>', suffix);
return;
}
if (object === undefined) {
this.appendSimpleText_(label, indent, 'undefined', suffix);
return;
}
if (object === null) {
this.appendSimpleText_(label, indent, 'null', suffix);
return;
}
if (!(object instanceof Object)) {
var type = typeof object;
if (type == 'string') {
var objectReplaced = false;
if ((object[0] == '{' && object[object.length - 1] == '}') ||
(object[0] == '[' && object[object.length - 1] == ']')) {
try {
object = JSON.parse(object);
objectReplaced = true;
} catch (e) {
}
}
if (!objectReplaced)
return this.appendSimpleText_(
label, indent, '"' + object + '"', suffix);
else {
/* Fall through to the flow below */
}
} else {
return this.appendSimpleText_(label, indent, object, suffix);
}
}
if (object instanceof tv.c.trace_model.ObjectSnapshot) {
var link = document.createElement('tv-c-analysis-link');
link.selection = new tv.c.Selection(object);
this.appendElementWithLabel_(label, indent, link, suffix);
return;
}
if (object instanceof tv.c.trace_model.ObjectInstance) {
var link = document.createElement('tv-c-analysis-link');
link.selection = new tv.c.Selection(object);
this.appendElementWithLabel_(label, indent, link, suffix);
return;
}
if (object instanceof tv.b.Rect) {
this.appendSimpleText_(label, indent, object.toString(), suffix);
return;
}
if (object instanceof Array) {
this.appendElementsForArray_(
label, object, indent, depth, maxDepth, suffix);
return;
}
this.appendElementsForObject_(
label, object, indent, depth, maxDepth, suffix);
},
appendElementsForArray_: function(
label, object, indent, depth, maxDepth, suffix) {
if (object.length == 0) {
this.appendSimpleText_(label, indent, '[]', suffix);
return;
}
this.appendElementsForType_(
label + '[',
object[0],
indent, depth + 1, maxDepth,
object.length > 1 ? ',' : ']' + suffix);
for (var i = 1; i < object.length; i++) {
this.appendElementsForType_(
'',
object[i],
indent + label.length + 1, depth + 1, maxDepth,
i < object.length - 1 ? ',' : ']' + suffix);
}
return;
},
appendElementsForObject_: function(
label, object, indent, depth, maxDepth, suffix) {
var keys = tv.b.dictionaryKeys(object);
if (keys.length == 0) {
this.appendSimpleText_(label, indent, '{}', suffix);
return;
}
this.appendElementsForType_(
label + '{' + keys[0] + ': ',
object[keys[0]],
indent, depth, maxDepth,
keys.length > 1 ? ',' : '}' + suffix);
for (var i = 1; i < keys.length; i++) {
this.appendElementsForType_(
keys[i] + ': ',
object[keys[i]],
indent + label.length + 1, depth + 1, maxDepth,
i < keys.length - 1 ? ',' : '}' + suffix);
}
},
appendElementWithLabel_: function(label, indent, dataElement, suffix) {
var row = document.createElement('div');
var indentSpan = document.createElement('span');
indentSpan.style.whiteSpace = 'pre';
for (var i = 0; i < indent; i++)
indentSpan.textContent += ' ';
row.appendChild(indentSpan);
var labelSpan = document.createElement('span');
labelSpan.textContent = label;
row.appendChild(labelSpan);
row.appendChild(dataElement);
var suffixSpan = document.createElement('span');
suffixSpan.textContent = suffix;
row.appendChild(suffixSpan);
row.dataElement = dataElement;
this.$.content.appendChild(row);
},
appendSimpleText_: function(label, indent, text, suffix) {
var el = this.ownerDocument.createElement('span');
el.textContent = text;
this.appendElementWithLabel_(label, indent, el, suffix);
return el;
}
});
</script>
</polymer-element>
<polymer-element name="tv-c-analysis-generic-object-view-with-label"
is="HTMLUnknownElement">
<template>
<style>
:host {
display: block;
}
</style>
</template>
<script>
'use strict';
Polymer({
ready: function() {
this.labelEl_ = document.createElement('div');
this.genericObjectView_ =
document.createElement('tv-c-analysis-generic-object-view');
this.shadowRoot.appendChild(this.labelEl_);
this.shadowRoot.appendChild(this.genericObjectView_);
},
get label() {
return this.labelEl_.textContent;
},
set label(label) {
this.labelEl_.textContent = label;
},
get object() {
return this.genericObjectView_.object;
},
set object(object) {
this.genericObjectView_.object = object;
}
});
</script>
</polymer-element>