• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2012 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.requireStylesheet('tracing.tracks.thread_track');
8
9base.require('tracing.tracks.container_track');
10base.require('tracing.tracks.slice_track');
11base.require('tracing.tracks.slice_group_track');
12base.require('tracing.tracks.async_slice_group_track');
13base.require('tracing.filter');
14base.require('ui');
15
16base.exportTo('tracing.tracks', function() {
17
18  /**
19   * Visualizes a Thread using a series of of SliceTracks.
20   * @constructor
21   */
22  var ThreadTrack = ui.define('thread-track', tracing.tracks.ContainerTrack);
23  ThreadTrack.prototype = {
24    __proto__: tracing.tracks.ContainerTrack.prototype,
25
26    decorate: function(viewport) {
27      tracing.tracks.ContainerTrack.prototype.decorate.call(this, viewport);
28      this.classList.add('thread-track');
29    },
30
31    get thread() {
32      return this.thread_;
33    },
34
35    set thread(thread) {
36      this.thread_ = thread;
37      this.updateContents_();
38    },
39
40    get hasVisibleContent() {
41      return this.tracks_.length > 0;
42    },
43
44    updateContents_: function() {
45      this.detach();
46
47      if (!this.thread_)
48        return;
49
50      this.heading = this.thread_.userFriendlyName + ': ';
51      this.tooltip = this.thread_.userFriendlyDetails;
52
53      if (this.thread_.asyncSliceGroup.length) {
54        var asyncTrack = new tracing.tracks.AsyncSliceGroupTrack(this.viewport);
55        asyncTrack.categoryFilter = this.categoryFilter;
56        asyncTrack.decorateHit = function(hit) {
57          // TODO(simonjam): figure out how to associate subSlice hits back
58          // to their parent slice.
59        };
60        asyncTrack.group = this.thread_.asyncSliceGroup;
61        if (asyncTrack.hasVisibleContent)
62          this.appendChild(asyncTrack);
63      }
64
65      if (this.thread_.samples.length) {
66        var samplesTrack = new tracing.tracks.SliceTrack(this.viewport);
67        samplesTrack.categoryFilter = samplesTrack;
68        samplesTrack.group = this.thread_;
69        samplesTrack.slices = this.thread_.samples;
70        samplesTrack.decorateHit = function(hit) {
71          // TODO(johnmccutchan): Figure out what else should be associated
72          // with the hit.
73          hit.thread = this.thread_;
74        }
75        this.appendChild(samplesTrack);
76      }
77
78      if (this.thread_.cpuSlices) {
79        var cpuTrack = new tracing.tracks.SliceTrack(this.viewport);
80        cpuTrack.categoryFilter = this.categoryFilter;
81        cpuTrack.heading = '';
82        cpuTrack.height = '4px';
83        cpuTrack.decorateHit = function(hit) {
84          hit.thread = this.thread_;
85        }
86        cpuTrack.slices = this.thread_.cpuSlices;
87        if (cpuTrack.hasVisibleContent)
88          this.appendChild(cpuTrack);
89      }
90
91      if (this.thread_.sliceGroup.length) {
92        var track = new tracing.tracks.SliceGroupTrack(this.viewport);
93        track.categoryFilter = this.categoryFilter;
94        track.heading = this.thread_.userFriendlyName;
95        track.tooltip = this.thread_.userFriendlyDetails;
96
97        track.decorateHit = function(hit) {
98          hit.thread = this.thread_;
99        };
100        track.group = this.thread_.sliceGroup;
101        if (track.hasVisibleContent)
102          this.appendChild(track);
103      }
104    },
105
106    collapsedDidChange: function(collapsed) {
107      if (collapsed) {
108        var h = parseInt(this.tracks[0].height);
109        for (var i = 0; i < this.tracks.length; ++i) {
110          if (h > 2) {
111            this.tracks[i].height = Math.floor(h) + 'px';
112          } else {
113            this.tracks[i].style.display = 'none';
114          }
115          h = h * 0.5;
116        }
117      } else {
118        for (var i = 0; i < this.tracks.length; ++i) {
119          this.tracks[i].height = this.tracks[0].height;
120          this.tracks[i].style.display = '';
121        }
122      }
123    }
124  };
125
126  return {
127    ThreadTrack: ThreadTrack
128  };
129});
130