Home | History | Annotate | Download | only in analysis
      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 
      7 base.require('tracing.analysis.analyze_counters');
      8 base.require('tracing.analysis.analyze_slices');
      9 base.require('tracing.analysis.util');
     10 base.require('ui');
     11 base.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