1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5'use strict';
6
7base.require('tracing.analysis.analyze_counters');
8base.require('tracing.analysis.analyze_slices');
9base.require('tracing.analysis.util');
10base.require('ui');
11base.exportTo('tracing.analysis', function() {
12
13  /**
14   * Analyzes the selection, outputting the analysis results into the provided
15   * results object.
16   *
17   * @param {AnalysisResults} results Where the analysis is placed.
18   * @param {Selection} selection What to analyze.
19   */
20  function analyzeSelection(results, selection) {
21    analyzeHitsByType(results, selection.getHitsOrganizedByType());
22  }
23
24  function analyzeHitsByType(results, hitsByType) {
25    var sliceHits = hitsByType.slices;
26    var counterSampleHits = hitsByType.counterSamples;
27    var objectHits = new tracing.Selection();
28    objectHits.addSelection(hitsByType.objectSnapshots);
29    objectHits.addSelection(hitsByType.objectInstances);
30
31    if (sliceHits.length == 1) {
32      tracing.analysis.analyzeSingleSliceHit(results, sliceHits[0]);
33    } else if (sliceHits.length > 1) {
34      tracing.analysis.analyzeMultipleSliceHits(results, sliceHits);
35    }
36
37    if (counterSampleHits.length == 1) {
38      tracing.analysis.analyzeSingleCounterSampleHit(
39          results, counterSampleHits[0]);
40    } else if (counterSampleHits.length > 1) {
41      tracing.analysis.analyzeMultipleCounterSampleHits(
42          results, counterSampleHits);
43    }
44
45    if (objectHits.length)
46      analyzeObjectHits(results, objectHits);
47  }
48
49  /**
50   * Extremely simplistic analysis of objects. Mainly exists to provide
51   * click-through to the main object's analysis view.
52   */
53  function analyzeObjectHits(results, objectHits) {
54    objectHits = base.asArray(objectHits).sort(base.Range.compareByMinTimes);
55
56    var table = results.appendTable('analysis-object-sample-table', 2);
57    results.appendTableHeader(table, 'Selected Objects:');
58
59    objectHits.forEach(function(hit) {
60      var row = results.appendTableRow(table);
61      var ts;
62      var objectText;
63      var selectionGenerator;
64      if (hit instanceof tracing.SelectionObjectSnapshotHit) {
65        var objectSnapshot = hit.objectSnapshot;
66        ts = tracing.analysis.tsRound(objectSnapshot.ts);
67        objectText = objectSnapshot.objectInstance.typeName + ' ' +
68            objectSnapshot.objectInstance.id;
69        selectionGenerator = function() {
70          var selection = new tracing.Selection();
71          selection.addObjectSnapshot(hit.track, objectSnapshot);
72          return selection;
73        };
74      } else {
75        var objectInstance = hit.objectInstance;
76
77        var deletionTs = objectInstance.deletionTs == Number.MAX_VALUE ?
78            '' : tracing.analysis.tsRound(objectInstance.deletionTs);
79        ts = tracing.analysis.tsRound(objectInstance.creationTs) +
80            '-' + deletionTs;
81
82        objectText = objectInstance.typeName + ' ' +
83            objectInstance.id;
84
85        selectionGenerator = function() {
86          var selection = new tracing.Selection();
87          selection.addObjectInstance(hit.track, objectInstance);
88          return selection;
89        };
90      }
91
92      results.appendTableCell(table, row, ts);
93      var linkContainer = results.appendTableCell(table, row, '');
94      linkContainer.appendChild(
95          results.createSelectionChangingLink(objectText, selectionGenerator));
96    });
97  }
98
99  return {
100    analyzeSelection: analyzeSelection,
101    analyzeHitsByType: analyzeHitsByType
102  };
103});
104