Index: chrome/browser/resources/profiler.js |
=================================================================== |
--- chrome/browser/resources/profiler.js (revision 110464) |
+++ chrome/browser/resources/profiler.js (working copy) |
@@ -541,6 +541,24 @@ |
*/ |
var PROCESS_DATA_DELAY_MS = 500; |
+ /** |
+ * The initial number of rows to display (the rest are hidden) when no |
+ * grouping is selected. We use a higher limit than when grouping is used |
+ * since there is a lot of vertical real estate. |
+ */ |
+ var INITIAL_UNGROUPED_ROW_LIMIT = 30; |
+ |
+ /** |
+ * The initial number of rows to display (rest are hidden) for each group. |
+ */ |
+ var INITIAL_GROUP_ROW_LIMIT = 10; |
+ |
+ /** |
+ * The number of extra rows to show/hide when clicking the "Show more" or |
+ * "Show less" buttons. |
+ */ |
+ var LIMIT_INCREMENT = 10; |
+ |
// -------------------------------------------------------------------------- |
// General utility functions |
// -------------------------------------------------------------------------- |
@@ -885,7 +903,9 @@ |
* Renders the information for a particular group. |
*/ |
function drawGroup(parent, groupData, columns, |
- columnOnClickHandler, currentSortKeys) { |
+ columnOnClickHandler, currentSortKeys, displaySettings, |
+ expandHandler, shrinkHandler, showAllHandler, |
+ showNoneHandler) { |
var div = addNode(parent, 'div'); |
div.className = 'group-container'; |
@@ -894,7 +914,9 @@ |
var table = addNode(div, 'table'); |
drawDataTable(table, groupData, columns, columnOnClickHandler, |
- currentSortKeys); |
+ currentSortKeys, displaySettings.limit, |
+ expandHandler, shrinkHandler, showAllHandler, |
+ showNoneHandler); |
} |
/** |
@@ -926,16 +948,52 @@ |
* Renders a table which summarizes all |column| fields for |data|. |
*/ |
function drawDataTable(table, data, columns, columnOnClickHandler, |
- currentSortKeys) { |
+ 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); |
+ 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'); |
@@ -1023,8 +1081,8 @@ |
} |
} |
- function drawTableBody(tbody, rows, columns) { |
- for (var i = 0; i < rows.length; ++i) { |
+ 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'); |
@@ -1326,12 +1384,63 @@ |
// Draw each group. |
for (var i = 0; i < this.sortedGroupKeys_.length; ++i) { |
- var groupData = this.groupedData_[this.sortedGroupKeys_[i]]; |
- drawGroup(parent, groupData, columns, |
- columnOnClickHandler, this.currentSortKeys_); |
+ 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)); |
} |
}, |
+ /** |
+ * Adjusts the row limit for group |groupKey| by |delta|. |
+ */ |
+ changeGroupDisplayLimit_: function(groupKey, delta) { |
+ // Get the current settings for this group. |
+ var settings = this.getGroupDisplaySettings_(groupKey, true); |
+ |
+ // Compute the adjusted limit. |
+ var newLimit = settings.limit; |
+ var totalNumRows = this.groupedData_[groupKey].rows.length; |
+ newLimit = Math.min(totalNumRows, newLimit); |
+ newLimit += delta; |
+ newLimit = Math.max(0, newLimit); |
+ |
+ // Update the settings with the new limit. |
+ settings.limit = newLimit; |
+ |
+ // TODO(eroman): It isn't necessary to redraw *all* the data. Really we |
+ // just need to insert the missing rows (everything else stays the same)! |
+ this.redrawData_(); |
+ }, |
+ |
+ /** |
+ * Returns the rendering settings for group |groupKey|. This includes things |
+ * like how many rows to display in the table. |
+ */ |
+ getGroupDisplaySettings_: function(groupKey, opt_create) { |
+ var settings = this.groupDisplaySettings_[groupKey]; |
+ if (!settings) { |
+ // If we don't have any settings for this group yet, create some |
+ // default ones. |
+ if (groupKey == '[]') { |
+ // (groupKey of '[]' is what we use for ungrouped data). |
+ settings = {limit: INITIAL_UNGROUPED_ROW_LIMIT}; |
+ } else { |
+ settings = {limit: INITIAL_GROUP_ROW_LIMIT}; |
+ } |
+ if (opt_create) |
+ this.groupDisplaySettings_[groupKey] = settings; |
+ } |
+ return settings; |
+ }, |
+ |
init_: function() { |
// Data goes through the following pipeline: |
// (1) Raw data received from browser, and transformed into our own |
@@ -1352,6 +1461,8 @@ |
this.groupedData_ = {}; |
this.sortedGroupKeys_ = []; |
+ this.groupDisplaySettings_ = {}; |
+ |
this.fillSelectionCheckboxes_($(COLUMN_TOGGLES_CONTAINER_ID)); |
this.fillMergeCheckboxes_($(COLUMN_MERGE_TOGGLES_CONTAINER_ID)); |