Home | History | Annotate | Download | only in tracks
      1 <!DOCTYPE html>
      2 <!--
      3 Copyright (c) 2013 The Chromium Authors. All rights reserved.
      4 Use of this source code is governed by a BSD-style license that can be
      5 found in the LICENSE file.
      6 -->
      7 
      8 <link rel="import" href="/tracing/core/filter.html">
      9 <link rel="import" href="/tracing/model/event_set.html">
     10 <link rel="import" href="/tracing/model/model.html">
     11 <link rel="import" href="/tracing/ui/base/ui.html">
     12 <link rel="import" href="/tracing/ui/tracks/container_track.html">
     13 <link rel="import" href="/tracing/ui/tracks/slice_track.html">
     14 
     15 <script>
     16 'use strict';
     17 
     18 tr.exportTo('tr.ui.tracks', function() {
     19 
     20   /**
     21    * Visualizes a Cpu using a series of SliceTracks.
     22    * @constructor
     23    */
     24   var CpuTrack =
     25       tr.ui.b.define('cpu-track', tr.ui.tracks.ContainerTrack);
     26   CpuTrack.prototype = {
     27     __proto__: tr.ui.tracks.ContainerTrack.prototype,
     28 
     29     decorate: function(viewport) {
     30       tr.ui.tracks.ContainerTrack.prototype.decorate.call(this, viewport);
     31       this.classList.add('cpu-track');
     32       this.detailedMode_ = true;
     33     },
     34 
     35     get cpu() {
     36       return this.cpu_;
     37     },
     38 
     39     set cpu(cpu) {
     40       this.cpu_ = cpu;
     41       this.updateContents_();
     42     },
     43 
     44     get detailedMode() {
     45       return this.detailedMode_;
     46     },
     47 
     48     set detailedMode(detailedMode) {
     49       this.detailedMode_ = detailedMode;
     50       this.updateContents_();
     51     },
     52 
     53     get tooltip() {
     54       return this.tooltip_;
     55     },
     56 
     57     set tooltip(value) {
     58       this.tooltip_ = value;
     59       this.updateContents_();
     60     },
     61 
     62     get hasVisibleContent() {
     63       if (this.cpu_ === undefined)
     64         return false;
     65       var cpu = this.cpu_;
     66       if (cpu.slices.length)
     67         return true;
     68       if (cpu.samples && cpu.samples.length)
     69         return true;
     70       if (tr.b.dictionaryLength(cpu.counters) > 0)
     71         return true;
     72       return false;
     73     },
     74 
     75     updateContents_: function() {
     76       this.detach();
     77       if (!this.cpu_)
     78         return;
     79       var slices = this.cpu_.slices;
     80       if (slices.length) {
     81         var track = new tr.ui.tracks.SliceTrack(this.viewport);
     82         track.slices = slices;
     83         track.heading = this.cpu_.userFriendlyName + ':';
     84         this.appendChild(track);
     85       }
     86 
     87       if (this.detailedMode_) {
     88         this.appendSamplesTracks_();
     89 
     90         for (var counterName in this.cpu_.counters) {
     91           var counter = this.cpu_.counters[counterName];
     92           track = new tr.ui.tracks.CounterTrack(this.viewport);
     93           track.heading = this.cpu_.userFriendlyName + ' ' +
     94               counter.name + ':';
     95           track.counter = counter;
     96           this.appendChild(track);
     97         }
     98       }
     99     },
    100 
    101     appendSamplesTracks_: function() {
    102       var samples = this.cpu_.samples;
    103       if (samples === undefined || samples.length === 0)
    104         return;
    105       var samplesByTitle = {};
    106       samples.forEach(function(sample) {
    107         if (samplesByTitle[sample.title] === undefined)
    108           samplesByTitle[sample.title] = [];
    109         samplesByTitle[sample.title].push(sample);
    110       });
    111 
    112       var sampleTitles = tr.b.dictionaryKeys(samplesByTitle);
    113       sampleTitles.sort();
    114 
    115       sampleTitles.forEach(function(sampleTitle) {
    116         var samples = samplesByTitle[sampleTitle];
    117         var samplesTrack = new tr.ui.tracks.SliceTrack(this.viewport);
    118         samplesTrack.group = this.cpu_;
    119         samplesTrack.slices = samples;
    120         samplesTrack.heading = this.cpu_.userFriendlyName + ': ' +
    121             sampleTitle;
    122         samplesTrack.tooltip = this.cpu_.userFriendlyDetails;
    123         samplesTrack.selectionGenerator = function() {
    124           var selection = new tr.model.EventSet();
    125           for (var i = 0; i < samplesTrack.slices.length; i++) {
    126             selection.push(samplesTrack.slices[i]);
    127           }
    128           return selection;
    129         };
    130         this.appendChild(samplesTrack);
    131       }, this);
    132     }
    133   };
    134 
    135   return {
    136     CpuTrack: CpuTrack
    137   };
    138 });
    139 </script>
    140