| Index: chrome/browser/resources/profiler.js
|
| ===================================================================
|
| --- chrome/browser/resources/profiler.js (revision 110545)
|
| +++ chrome/browser/resources/profiler.js (working copy)
|
| @@ -876,148 +876,6 @@
|
| // HTML drawing code
|
| // --------------------------------------------------------------------------
|
|
|
| - /**
|
| - * Draws a title into |parent| that describes |groupKey|.
|
| - */
|
| - function drawGroupTitle(parent, groupKey) {
|
| - if (groupKey.length == 0) {
|
| - // Empty group key means there was no grouping.
|
| - return;
|
| - }
|
| -
|
| - var parent = addNode(parent, 'div');
|
| - parent.className = 'group-title-container';
|
| -
|
| - // Each component of the group key represents the "key=value" constraint for
|
| - // this group. Show these as an AND separated list.
|
| - for (var i = 0; i < groupKey.length; ++i) {
|
| - if (i > 0)
|
| - addNode(parent, 'i', ' and ');
|
| - var e = groupKey[i];
|
| - addNode(parent, 'b', getNameForKey(e.key) + ' = ');
|
| - addNode(parent, 'span', e.value);
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Renders the information for a particular group.
|
| - */
|
| - function drawGroup(parent, groupData, columns,
|
| - columnOnClickHandler, currentSortKeys, displaySettings,
|
| - expandHandler, shrinkHandler, showAllHandler,
|
| - showNoneHandler) {
|
| - var div = addNode(parent, 'div');
|
| - div.className = 'group-container';
|
| -
|
| - drawGroupTitle(div, groupData.key);
|
| -
|
| - var table = addNode(div, 'table');
|
| -
|
| - drawDataTable(table, groupData, columns, columnOnClickHandler,
|
| - currentSortKeys, displaySettings.limit,
|
| - expandHandler, shrinkHandler, showAllHandler,
|
| - showNoneHandler);
|
| - }
|
| -
|
| - /**
|
| - * Renders a row that describes all the aggregate values for |columns|.
|
| - */
|
| - function drawAggregateRow(tbody, aggregates, columns) {
|
| - var tr = addNode(tbody, 'tr');
|
| - tr.className = 'aggregator-row';
|
| -
|
| - for (var i = 0; i < columns.length; ++i) {
|
| - var key = columns[i];
|
| - var td = addNode(tr, 'td');
|
| -
|
| - // Most of our outputs are numeric, so we want to align them to the right.
|
| - // However for the unique counts we will center.
|
| - if (KEY_PROPERTIES[key].aggregator == UniquifyAggregator) {
|
| - td.align = 'center';
|
| - } else {
|
| - td.align = 'right';
|
| - }
|
| -
|
| - var aggregator = aggregates[key];
|
| - if (aggregator)
|
| - td.innerText = aggregator.getValueAsText();
|
| - }
|
| - }
|
| -
|
| - /**
|
| - * Renders a table which summarizes all |column| fields for |data|.
|
| - */
|
| - function drawDataTable(table, data, columns, columnOnClickHandler,
|
| - currentSortKeys, limit, expandHandler, shrinkHandler,
|
| - showAllHandler, showNoneHandler) {
|
| - table.className = 'results-table';
|
| - var thead = addNode(table, 'thead');
|
| - var tbody = addNode(table, 'tbody');
|
| -
|
| - drawAggregateRow(thead, data.aggregates, columns);
|
| - drawTableHeader(thead, columns, columnOnClickHandler, currentSortKeys);
|
| - drawTableBody(tbody, data.rows, columns, limit);
|
| - drawTruncationRow(tbody, data.rows.length, limit, columns.length,
|
| - expandHandler, shrinkHandler, showAllHandler,
|
| - showNoneHandler);
|
| - }
|
| -
|
| - /**
|
| - * Renders a row which describes how many rows the table has, how many are
|
| - * currently hidden, and a set of buttons to show more.
|
| - */
|
| - function drawTruncationRow(tbody, numRows, limit, numColumns,
|
| - expandHandler, shrinkHandler, showAllHandler,
|
| - showNoneHandler) {
|
| - var numHiddenRows = Math.max(numRows - limit, 0);
|
| - var numVisibleRows = numRows - numHiddenRows;
|
| -
|
| - var tr = addNode(tbody, 'tr');
|
| - tr.className = 'truncation-row';
|
| - var td = addNode(tr, 'td');
|
| - td.colSpan = numColumns;
|
| -
|
| - addText(td, numRows + ' rows');
|
| - if (numHiddenRows > 0) {
|
| - var s = addNode(td, 'span', ' (' + numHiddenRows + ' hidden) ');
|
| - s.style.color = 'red';
|
| - }
|
| -
|
| - if (numVisibleRows > LIMIT_INCREMENT)
|
| - addNode(td, 'button', 'Show less').onclick = shrinkHandler;
|
| - if (numVisibleRows > 0)
|
| - addNode(td, 'button', 'Show none').onclick = showNoneHandler;
|
| -
|
| - if (numHiddenRows > 0) {
|
| - addNode(td, 'button', 'Show more').onclick = expandHandler;
|
| - addNode(td, 'button', 'Show all').onclick = showAllHandler;
|
| - }
|
| - }
|
| -
|
| - function drawTableHeader(thead, columns, columnOnClickHandler,
|
| - currentSortKeys) {
|
| - var tr = addNode(thead, 'tr');
|
| - for (var i = 0; i < columns.length; ++i) {
|
| - var key = columns[i];
|
| - var th = addNode(tr, 'th', getNameForKey(key));
|
| - th.onclick = columnOnClickHandler.bind(this, key);
|
| -
|
| - // Draw an indicator if we are currently sorted on this column.
|
| - // TODO(eroman): Should use an icon instead of asterisk!
|
| - for (var j = 0; j < currentSortKeys.length; ++j) {
|
| - if (sortKeysMatch(currentSortKeys[j], key)) {
|
| - var sortIndicator = addNode(th, 'span', '*');
|
| - sortIndicator.style.color = 'red';
|
| - if (sortKeyIsReversed(currentSortKeys[j])) {
|
| - // Use double-asterisk for descending columns.
|
| - addText(sortIndicator, '*');
|
| - }
|
| - break;
|
| - }
|
| - }
|
| - }
|
| - }
|
| -
|
| function getTextValueForProperty(key, value) {
|
| if (value == undefined) {
|
| // A value may be undefined as a result of having merging rows. We
|
| @@ -1081,22 +939,6 @@
|
| }
|
| }
|
|
|
| - function drawTableBody(tbody, rows, columns, limit) {
|
| - for (var i = 0; i < rows.length && i < limit; ++i) {
|
| - var e = rows[i];
|
| -
|
| - var tr = addNode(tbody, 'tr');
|
| -
|
| - for (var c = 0; c < columns.length; ++c) {
|
| - var key = columns[c];
|
| - var value = e[key];
|
| -
|
| - var td = addNode(tr, 'td');
|
| - drawValueToCell(td, key, value);
|
| - }
|
| - }
|
| - }
|
| -
|
| // --------------------------------------------------------------------------
|
| // Helper code for handling the sort and grouping dropdowns.
|
| // --------------------------------------------------------------------------
|
| @@ -1380,25 +1222,172 @@
|
|
|
| var columns = this.getVisibleColumnKeys_();
|
|
|
| - var columnOnClickHandler = this.onClickColumn_.bind(this);
|
| -
|
| // Draw each group.
|
| for (var i = 0; i < this.sortedGroupKeys_.length; ++i) {
|
| var k = this.sortedGroupKeys_[i];
|
| - drawGroup(parent,
|
| - this.groupedData_[k],
|
| - columns,
|
| - columnOnClickHandler,
|
| - this.currentSortKeys_,
|
| - this.getGroupDisplaySettings_(k),
|
| - this.changeGroupDisplayLimit_.bind(this, k, LIMIT_INCREMENT),
|
| - this.changeGroupDisplayLimit_.bind(this, k, -LIMIT_INCREMENT),
|
| - this.changeGroupDisplayLimit_.bind(this, k, Infinity),
|
| - this.changeGroupDisplayLimit_.bind(this, k, -Infinity));
|
| + this.drawGroup_(parent, k, columns);
|
| }
|
| },
|
|
|
| /**
|
| + * Renders the information for a particular group.
|
| + */
|
| + drawGroup_: function(parent, groupKey, columns) {
|
| + var groupData = this.groupedData_[groupKey];
|
| +
|
| + var div = addNode(parent, 'div');
|
| + div.className = 'group-container';
|
| +
|
| + this.drawGroupTitle_(div, groupData.key);
|
| +
|
| + var table = addNode(div, 'table');
|
| +
|
| + this.drawDataTable_(table, groupData, columns, groupKey);
|
| + },
|
| +
|
| + /**
|
| + * Draws a title into |parent| that describes |groupKey|.
|
| + */
|
| + drawGroupTitle_: function(parent, groupKey) {
|
| + if (groupKey.length == 0) {
|
| + // Empty group key means there was no grouping.
|
| + return;
|
| + }
|
| +
|
| + var parent = addNode(parent, 'div');
|
| + parent.className = 'group-title-container';
|
| +
|
| + // Each component of the group key represents the "key=value" constraint
|
| + // for this group. Show these as an AND separated list.
|
| + for (var i = 0; i < groupKey.length; ++i) {
|
| + if (i > 0)
|
| + addNode(parent, 'i', ' and ');
|
| + var e = groupKey[i];
|
| + addNode(parent, 'b', getNameForKey(e.key) + ' = ');
|
| + addNode(parent, 'span', e.value);
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Renders a table which summarizes all |column| fields for |data|.
|
| + */
|
| + drawDataTable_: function(table, data, columns, groupKey) {
|
| + table.className = 'results-table';
|
| + var thead = addNode(table, 'thead');
|
| + var tbody = addNode(table, 'tbody');
|
| +
|
| + var displaySettings = this.getGroupDisplaySettings_(groupKey);
|
| + var limit = displaySettings.limit;
|
| +
|
| + this.drawAggregateRow_(thead, data.aggregates, columns);
|
| + this.drawTableHeader_(thead, columns);
|
| + this.drawTableBody_(tbody, data.rows, columns, limit);
|
| + this.drawTruncationRow_(tbody, data.rows.length, limit, columns.length,
|
| + groupKey);
|
| + },
|
| +
|
| + drawTableHeader_: function(thead, columns) {
|
| + var tr = addNode(thead, 'tr');
|
| + for (var i = 0; i < columns.length; ++i) {
|
| + var key = columns[i];
|
| + var th = addNode(tr, 'th', getNameForKey(key));
|
| + th.onclick = this.onClickColumn_.bind(this, key);
|
| +
|
| + // Draw an indicator if we are currently sorted on this column.
|
| + // TODO(eroman): Should use an icon instead of asterisk!
|
| + for (var j = 0; j < this.currentSortKeys_.length; ++j) {
|
| + if (sortKeysMatch(this.currentSortKeys_[j], key)) {
|
| + var sortIndicator = addNode(th, 'span', '*');
|
| + sortIndicator.style.color = 'red';
|
| + if (sortKeyIsReversed(this.currentSortKeys_[j])) {
|
| + // Use double-asterisk for descending columns.
|
| + addText(sortIndicator, '*');
|
| + }
|
| + break;
|
| + }
|
| + }
|
| + }
|
| + },
|
| +
|
| + drawTableBody_: function(tbody, rows, columns, limit) {
|
| + for (var i = 0; i < rows.length && i < limit; ++i) {
|
| + var e = rows[i];
|
| +
|
| + var tr = addNode(tbody, 'tr');
|
| +
|
| + for (var c = 0; c < columns.length; ++c) {
|
| + var key = columns[c];
|
| + var value = e[key];
|
| +
|
| + var td = addNode(tr, 'td');
|
| + drawValueToCell(td, key, value);
|
| + }
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Renders a row that describes all the aggregate values for |columns|.
|
| + */
|
| + drawAggregateRow_: function(tbody, aggregates, columns) {
|
| + var tr = addNode(tbody, 'tr');
|
| + tr.className = 'aggregator-row';
|
| +
|
| + for (var i = 0; i < columns.length; ++i) {
|
| + var key = columns[i];
|
| + var td = addNode(tr, 'td');
|
| +
|
| + // Most of our outputs are numeric, so we want to align them to the
|
| + // right. However for the unique counts we will center.
|
| + if (KEY_PROPERTIES[key].aggregator == UniquifyAggregator) {
|
| + td.align = 'center';
|
| + } else {
|
| + td.align = 'right';
|
| + }
|
| +
|
| + var aggregator = aggregates[key];
|
| + if (aggregator)
|
| + td.innerText = aggregator.getValueAsText();
|
| + }
|
| + },
|
| +
|
| + /**
|
| + * Renders a row which describes how many rows the table has, how many are
|
| + * currently hidden, and a set of buttons to show more.
|
| + */
|
| + drawTruncationRow_: function(tbody, numRows, limit, numColumns, groupKey) {
|
| + var numHiddenRows = Math.max(numRows - limit, 0);
|
| + var numVisibleRows = numRows - numHiddenRows;
|
| +
|
| + var tr = addNode(tbody, 'tr');
|
| + tr.className = 'truncation-row';
|
| + var td = addNode(tr, 'td');
|
| + td.colSpan = numColumns;
|
| +
|
| + addText(td, numRows + ' rows');
|
| + if (numHiddenRows > 0) {
|
| + var s = addNode(td, 'span', ' (' + numHiddenRows + ' hidden) ');
|
| + s.style.color = 'red';
|
| + }
|
| +
|
| + if (numVisibleRows > LIMIT_INCREMENT) {
|
| + addNode(td, 'button', 'Show less').onclick =
|
| + this.changeGroupDisplayLimit_.bind(
|
| + this, groupKey, -LIMIT_INCREMENT);
|
| + }
|
| + if (numVisibleRows > 0) {
|
| + addNode(td, 'button', 'Show none').onclick =
|
| + this.changeGroupDisplayLimit_.bind(this, groupKey, -Infinity);
|
| + }
|
| +
|
| + if (numHiddenRows > 0) {
|
| + addNode(td, 'button', 'Show more').onclick =
|
| + this.changeGroupDisplayLimit_.bind(this, groupKey, LIMIT_INCREMENT);
|
| + addNode(td, 'button', 'Show all').onclick =
|
| + this.changeGroupDisplayLimit_.bind(this, groupKey, Infinity);
|
| + }
|
| + },
|
| +
|
| + /**
|
| * Adjusts the row limit for group |groupKey| by |delta|.
|
| */
|
| changeGroupDisplayLimit_: function(groupKey, delta) {
|
|
|