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.analysis_results'); 866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.util'); 1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.analysis_link'); 1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.analysis.generic_object_view'); 1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui'); 1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.analysis', function() { 1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var AnalysisResults = ui.define('div'); 1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis AnalysisResults.prototype = { 1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis __proto__: HTMLDivElement.prototype, 1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis decorate: function() { 2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.className = 'analysis-results'; 2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis clear: function() { 2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.textContent = ''; 2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis createSelectionChangingLink: function(text, selectionGenerator, 2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis opt_tooltip) { 3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var el = this.ownerDocument.createElement('a'); 3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.AnalysisLink.decorate(el); 3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis el.textContent = text; 3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis el.selectionGenerator = selectionGenerator; 3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_tooltip) 3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis el.title = opt_tooltip; 3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return el; 3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendElement_: function(parent, tagName, opt_text) { 4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var n = parent.ownerDocument.createElement(tagName); 4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis parent.appendChild(n); 4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_text != undefined) 4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis n.textContent = opt_text; 4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return n; 4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendText_: function(parent, text) { 4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var textElement = parent.ownerDocument.createTextNode(text); 4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis parent.appendChild(textNode); 5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return textNode; 5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendTableCell_: function(table, row, cellnum, text) { 5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var td = this.appendElement_(row, 'td', text); 5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis td.className = table.className + '-col-' + cellnum; 5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return td; 5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendTableCell: function(table, row, text) { 6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.appendTableCell_(table, row, row.children.length, text); 6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendTableCellWithTooltip_: function(table, row, cellnum, text, tooltip) { 6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (tooltip) { 6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var td = this.appendElement_(row, 'td'); 6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis td.className = table.className + '-col-' + cellnum; 6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var span = this.appendElement_(td, 'span', text); 6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis span.className = 'tooltip'; 6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis span.title = tooltip; 7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return td; 7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, cellnum, text); 7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Adds a table with the given className. 7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @return {HTMLTableElement} The newly created table. 7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendTable: function(className, numColumns) { 8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var table = this.appendElement_(this, 'table'); 8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis table.headerRow = this.appendElement_(table, 'tr'); 8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis table.className = className + ' analysis-table'; 8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis table.numColumns = numColumns; 8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return table; 8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates and appends a row to |table| with a left-aligned |label] 9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * header that spans all columns. 9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendTableHeader: function(table, label) { 9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var th = this.appendElement_(table.headerRow, 'th', label); 9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis th.className = 'analysis-table-header'; 9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendTableRow: function(table) { 9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return this.appendElement_(table, 'tr'); 9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates and appends a row to |table| with a left-aligned |label] 10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * in the first column and an optional |opt_value| in the second 10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * column. 10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendSummaryRow: function(table, label, opt_value) { 10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var row = this.appendElement_(table, 'tr'); 10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis row.className = 'analysis-table-row'; 10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, 0, label); 11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_value !== undefined) { 11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var objectView = new tracing.analysis.GenericObjectView(); 11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis objectView.object = opt_value; 11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis objectView.classList.add('analysis-table-col-1'); 11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis objectView.style.display = 'table-cell'; 11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis row.appendChild(objectView); 11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, 1, ''); 12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var i = 2; i < table.numColumns; i++) 12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, i, ''); 12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Adds a spacing row to spread out results. 12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendSpacingRow: function(table) { 12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var row = this.appendElement_(table, 'tr'); 13066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis row.className = 'analysis-table-row'; 13166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis for (var i = 0; i < table.numColumns; i++) 13266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, i, ' '); 13366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 13466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 13566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 13666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates and appends a row to |table| with a left-aligned |label] 13766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * in the first column and a millisecvond |time| value in the second 13866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * column. 13966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 14066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendSummaryRowTime: function(table, label, time) { 14166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendSummaryRow(table, label, 14266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(time) + ' ms'); 14366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }, 14466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 14566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis /** 14666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * Creates and appends a row to |table| that summarizes one or more slices, 14766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * or one or more counters. 14866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * The row has a left-aligned |label| in the first column, the |duration| 14966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * of the data in the second, the number of |occurrences| in the third. 15066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * @param {object=} opt_statistics May be undefined, or an object which 15166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * contains calculated staistics containing min/max/avg for slices, or 15266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis * min/max/avg/start/end for counters. 15366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis */ 15466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis appendDataRow: function( 15566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis table, label, opt_duration, opt_occurences, 15666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis opt_statistics, opt_selectionGenerator) { 15766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 15866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var tooltip = undefined; 15966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_statistics) { 16066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tooltip = 'Min Duration:\u0009' + 16166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.min) + 16266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' ms \u000DMax Duration:\u0009' + 16366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.max) + 16466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' ms \u000DAvg Duration:\u0009' + 16566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.avg) + 16666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' ms (\u03C3 = ' + 16766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.avg_stddev) + ')'; 16866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 16966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_statistics.start) { 17066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tooltip += '\u000DStart Time:\u0009' + 17166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.start) + ' ms'; 17266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 17366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_statistics.end) { 17466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tooltip += '\u000DEnd Time:\u0009' + 17566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.end) + ' ms'; 17666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 17766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_statistics.frequency && opt_statistics.frequency_stddev) { 17866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tooltip += '\u000DFrequency:\u0009' + 17966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.frequency) + 18066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis ' occurrences/s (\u03C3 = ' + 18166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tracing.analysis.tsRound(opt_statistics.frequency_stddev) + ')'; 18266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 18366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 18466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 18566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var row = this.appendElement_(table, 'tr'); 18666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis row.className = 'analysis-table-row'; 18766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 18866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (!opt_selectionGenerator) { 18966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCellWithTooltip_(table, row, 0, label, tooltip); 19066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 19166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis var labelEl = this.appendTableCellWithTooltip_( 19266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis table, row, 0, label, tooltip); 19366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis labelEl.textContent = ''; 19466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis labelEl.appendChild( 19566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.createSelectionChangingLink(label, opt_selectionGenerator, 19666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis tooltip)); 19766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 19866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 19966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_duration !== undefined) { 2006833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis if (opt_duration instanceof Array) { 2016833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis this.appendTableCellWithTooltip_(table, row, 1, 2026833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis '[' + opt_duration.join(', ') + ']', tooltip); 2036833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis } else { 2046833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis this.appendTableCellWithTooltip_(table, row, 1, 2056833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis tracing.analysis.tsRound(opt_duration) + ' ms', tooltip); 2066833e18b1d4077bf3a727b4422cc2acdbeee35a7Jamie Gennis } 20766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 20866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, 1, ''); 20966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 21066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 21166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis if (opt_occurences !== undefined) { 21266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCellWithTooltip_(table, row, 2, 21366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis String(opt_occurences) + ' occurrences', tooltip); 21466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis 21566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } else { 21666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis this.appendTableCell_(table, row, 2, ''); 21766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 21866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis } 21966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 22066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis return { 22166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis AnalysisResults: AnalysisResults 22266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis }; 22366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis}); 224