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