// Copyright (c) 2013 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('tracing.analysis.analyze_counters');
base.require('tracing.analysis.analyze_slices');
base.require('tracing.analysis.util');
base.require('ui');
base.exportTo('tracing.analysis', function() {
/**
* Analyzes the selection, outputting the analysis results into the provided
* results object.
*
* @param {AnalysisResults} results Where the analysis is placed.
* @param {Selection} selection What to analyze.
*/
function analyzeSelection(results, selection) {
analyzeHitsByType(results, selection.getHitsOrganizedByType());
}
function analyzeHitsByType(results, hitsByType) {
var sliceHits = hitsByType.slices;
var counterSampleHits = hitsByType.counterSamples;
var objectHits = new tracing.Selection();
objectHits.addSelection(hitsByType.objectSnapshots);
objectHits.addSelection(hitsByType.objectInstances);
if (sliceHits.length == 1) {
tracing.analysis.analyzeSingleSliceHit(results, sliceHits[0]);
} else if (sliceHits.length > 1) {
tracing.analysis.analyzeMultipleSliceHits(results, sliceHits);
}
if (counterSampleHits.length == 1) {
tracing.analysis.analyzeSingleCounterSampleHit(
results, counterSampleHits[0]);
} else if (counterSampleHits.length > 1) {
tracing.analysis.analyzeMultipleCounterSampleHits(
results, counterSampleHits);
}
if (objectHits.length)
analyzeObjectHits(results, objectHits);
}
/**
* Extremely simplistic analysis of objects. Mainly exists to provide
* click-through to the main object's analysis view.
*/
function analyzeObjectHits(results, objectHits) {
objectHits = base.asArray(objectHits).sort(base.Range.compareByMinTimes);
var table = results.appendTable('analysis-object-sample-table', 2);
results.appendTableHeader(table, 'Selected Objects:');
objectHits.forEach(function(hit) {
var row = results.appendTableRow(table);
var ts;
var objectText;
var selectionGenerator;
if (hit instanceof tracing.SelectionObjectSnapshotHit) {
var objectSnapshot = hit.objectSnapshot;
ts = tracing.analysis.tsRound(objectSnapshot.ts);
objectText = objectSnapshot.objectInstance.typeName + ' ' +
objectSnapshot.objectInstance.id;
selectionGenerator = function() {
var selection = new tracing.Selection();
selection.addObjectSnapshot(hit.track, objectSnapshot);
return selection;
};
} else {
var objectInstance = hit.objectInstance;
var deletionTs = objectInstance.deletionTs == Number.MAX_VALUE ?
'' : tracing.analysis.tsRound(objectInstance.deletionTs);
ts = tracing.analysis.tsRound(objectInstance.creationTs) +
'-' + deletionTs;
objectText = objectInstance.typeName + ' ' +
objectInstance.id;
selectionGenerator = function() {
var selection = new tracing.Selection();
selection.addObjectInstance(hit.track, objectInstance);
return selection;
};
}
results.appendTableCell(table, row, ts);
var linkContainer = results.appendTableCell(table, row, '');
linkContainer.appendChild(
results.createSelectionChangingLink(objectText, selectionGenerator));
});
}
return {
analyzeSelection: analyzeSelection,
analyzeHitsByType: analyzeHitsByType
};
});