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.
7 tvcm.requireStylesheet('tracing.tracks.thread_track');
9 tvcm.require('tracing.tracks.container_track');
10 tvcm.require('tracing.tracks.slice_track');
11 tvcm.require('tracing.tracks.slice_group_track');
12 tvcm.require('tracing.tracks.async_slice_group_track');
13 tvcm.require('tracing.filter');
14 tvcm.require('tvcm.ui');
15 tvcm.require('tvcm.iteration_helpers');
17 tvcm.exportTo('tracing.tracks', function() {
20 * Visualizes a Thread using a series of of SliceTracks.
23 var ThreadTrack = tvcm.ui.define('thread-track',
24 tracing.tracks.ContainerTrack);
25 ThreadTrack.prototype = {
26 __proto__: tracing.tracks.ContainerTrack.prototype,
28 decorate: function(viewport) {
29 tracing.tracks.ContainerTrack.prototype.decorate.call(this, viewport);
30 this.classList.add('thread-track');
38 this.thread_ = thread;
39 this.updateContents_();
42 get hasVisibleContent() {
43 return this.tracks_.length > 0;
46 updateContents_: function() {
52 this.heading = this.thread_.userFriendlyName + ': ';
53 this.tooltip = this.thread_.userFriendlyDetails;
55 if (this.thread_.asyncSliceGroup.length) {
56 var asyncTrack = new tracing.tracks.AsyncSliceGroupTrack(this.viewport);
57 asyncTrack.group = this.thread_.asyncSliceGroup;
58 if (asyncTrack.hasVisibleContent)
59 this.appendChild(asyncTrack);
62 this.appendThreadSamplesTracks_();
64 if (this.thread_.timeSlices) {
65 var timeSlicesTrack = new tracing.tracks.SliceTrack(this.viewport);
66 timeSlicesTrack.heading = '';
67 timeSlicesTrack.height = '4px';
68 timeSlicesTrack.slices = this.thread_.timeSlices;
69 if (timeSlicesTrack.hasVisibleContent)
70 this.appendChild(timeSlicesTrack);
73 if (this.thread_.sliceGroup.length) {
74 var track = new tracing.tracks.SliceGroupTrack(this.viewport);
75 track.heading = this.thread_.userFriendlyName;
76 track.tooltip = this.thread_.userFriendlyDetails;
77 track.group = this.thread_.sliceGroup;
78 if (track.hasVisibleContent)
79 this.appendChild(track);
83 appendThreadSamplesTracks_: function() {
84 var threadSamples = this.thread_.samples;
85 if (threadSamples === undefined || threadSamples.length === 0)
87 var samplesByTitle = {};
88 threadSamples.forEach(function(sample) {
89 if (samplesByTitle[sample.title] === undefined)
90 samplesByTitle[sample.title] = [];
91 samplesByTitle[sample.title].push(sample);
94 var sampleTitles = tvcm.dictionaryKeys(samplesByTitle);
97 sampleTitles.forEach(function(sampleTitle) {
98 var samples = samplesByTitle[sampleTitle];
99 var samplesTrack = new tracing.tracks.SliceTrack(this.viewport);
100 samplesTrack.group = this.thread_;
101 samplesTrack.slices = samples;
102 samplesTrack.heading = this.thread_.userFriendlyName + ': ' +
104 samplesTrack.tooltip = this.thread_.userFriendlyDetails;
105 samplesTrack.selectionGenerator = function() {
106 var selection = new tracing.Selection();
107 for (var i = 0; i < samplesTrack.slices.length; i++) {
108 selection.push(samplesTrack.slices[i]);
112 this.appendChild(samplesTrack);
116 collapsedDidChange: function(collapsed) {
118 var h = parseInt(this.tracks[0].height);
119 for (var i = 0; i < this.tracks.length; ++i) {
121 this.tracks[i].height = Math.floor(h) + 'px';
123 this.tracks[i].style.display = 'none';
128 for (var i = 0; i < this.tracks.length; ++i) {
129 this.tracks[i].height = this.tracks[0].height;
130 this.tracks[i].style.display = '';
137 ThreadTrack: ThreadTrack