blob: feb1dbe51701b1e76bfb4eabb2bc1f3465ac2ff2 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
base.require('analysis.single_slice_selection_analysis');
base.require('analysis.slice_group_selection_analysis');
/**
* @fileoverview Conains classes for slice selectionsByTitle.
*
*/
base.exportTo('tracing.analysis', function() {
/**
*
* @constructor
* @extends {HTMLDivElement}
*/
var SliceSelectionAnalysis = tracing.ui.define('slice-selection-analysis');
SliceSelectionAnalysis.prototype = {
__proto__: HTMLDivElement.prototype,
decorate: function() {
this.selection_ = undefined;
},
set selection(s) {
if (s.getNumSliceHits() == 0)
throw new Error('Expected at least 1 slice in selection');
if (s.getNumCounterHits() != 0)
throw new Error('Expected only slices in selection');
this.selection_ = s;
this.updateContents_();
},
get selection() {
return this.selection_;
},
set verticalDisplay(bool) {
this.verticalDisplay_ = bool;
},
get verticalDisplay() {
return this.verticalDisplay_;
},
updateContents_: function() {
this.textContent = '';
if (!this.selection_.length)
return;
var sliceHitsSelection = this.selection_.getSliceHitsAsSelection();
if (sliceHitsSelection.length == 1) {
var childEl = new tracing.analysis.SingleSliceSelectionAnalysis();
childEl.verticalDisplay_ = true;
childEl.selection = sliceHitsSelection;
this.appendChild(childEl);
} else if (sliceHitsSelection.length > 1) {
var selectionsByTitle = this.buildSelectionsByTitleByTitle_(
this.selection_);
/*
* Create selectionsByTitle of slice hits organized by title
* and for each selection of hits, create a group analysis
* and append accordingly.
*/
// Initialize varibales for summary of groups.
var allGroupsDuration = 0;
var allGroupsOccurrences = 0;
var allGroupsEnd = undefined;
var allGroupsStart = undefined;
var addedHeader = false;
for (var groupTitle in selectionsByTitle) {
var childEl = new tracing.analysis.SliceGroupSelectionAnalysis();
if (!addedHeader) {
this.appendChild(childEl.createColumnTitleRow());
addedHeader = true;
}
childEl.selection = selectionsByTitle[groupTitle];
this.appendChild(childEl);
allGroupsDuration += childEl.roundedSelectionDuration;
allGroupsOccurrences += childEl.occurrences;
if (allGroupsEnd == undefined ||
childEl.selectionEndTime > allGroupsEnd) {
allGroupsEnd = childEl.selectionEndTime;
}
if (allGroupsStart == undefined ||
childEl.selectionStartTime < allGroupsStart) {
allGroupsStart = childEl.selectionStartTime;
}
}
// Construct and append the groups summary.
var groupSummaryEl = document.createElement('group-totals-summary');
this.appendDataRow_(groupSummaryEl, 'Totals',
tracing.analysis.tsRound(allGroupsDuration), allGroupsOccurrences);
this.appendDataRow_(groupSummaryEl, 'Selection Start',
tracing.analysis.tsRound(allGroupsStart));
this.appendDataRow_(groupSummaryEl, 'Selection End',
tracing.analysis.tsRound(allGroupsEnd));
this.appendChild(groupSummaryEl);
}
},
buildSelectionsByTitleByTitle_: function(sliceHits) {
var selectionsByTitle = {};
for (var i = 0; i < sliceHits.length; i++) {
var sliceHit = sliceHits[i];
var title = sliceHit.slice.title;
if (!selectionsByTitle[title])
selectionsByTitle[title] = new tracing.Selection();
selectionsByTitle[title].pushHit(sliceHit);
}
return selectionsByTitle;
},
appendDataRow_: function(parentContainer, title, value,
additional_valueCell) {
var rowEl = document.createElement('div');
rowEl.classList.add('analysis-table-row');
var el = document.createElement('span');
el.classList.add('analysis-table-row-title');
el.textContent = title;
rowEl.appendChild(el);
el = document.createElement('span');
el.classList.add('analysis-table-cell');
el.textContent = value;
rowEl.appendChild(el);
if (additional_valueCell) {
el = document.createElement('span');
el.classList.add('analyis-table-cell');
el.textContent = additional_valueCell;
rowEl.appendChild(el);
}
parentContainer.appendChild(rowEl);
}
};
return {
SliceSelectionAnalysis: SliceSelectionAnalysis
};
});