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