blob: 43aba669bfc6e782caf4be75ce668d7e6b04c12d [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
base.requireStylesheet('tracks.timeline_thread_track');
base.require('tracks.timeline_container_track');
base.require('tracks.timeline_slice_track');
base.require('tracks.timeline_slice_group_track');
base.require('tracks.timeline_async_slice_group_track');
base.require('timeline_filter');
base.require('ui');
base.exportTo('tracks', function() {
/**
* Visualizes a TimelineThread using a series of of TimelineSliceTracks.
* @constructor
*/
var TimelineThreadTrack = base.ui.define(tracks.TimelineContainerTrack);
TimelineThreadTrack.prototype = {
__proto__: tracks.TimelineContainerTrack.prototype,
decorate: function() {
this.classList.add('timeline-thread-track');
this.categoryFilter_ = new tracing.TimelineFilter();
},
get thread() {
return this.thread_;
},
set thread(thread) {
this.thread_ = thread;
this.updateChildTracks_();
},
get tooltip() {
return this.tooltip_;
},
set tooltip(value) {
this.tooltip_ = value;
this.updateChildTracks_();
},
get heading() {
return this.heading_;
},
set heading(h) {
this.heading_ = h;
this.updateChildTracks_();
},
applyCategoryFilter_: function() {
this.updateVisibility_();
},
updateChildTracks_: function() {
this.detach();
if (this.thread_) {
var cpuTrack = new tracks.TimelineSliceTrack();
cpuTrack.heading = '';
cpuTrack.slices = this.thread_.cpuSlices;
cpuTrack.height = '4px';
cpuTrack.decorateHit = function(hit) {
hit.thread = this.thread_;
}
this.addTrack_(cpuTrack);
var asyncTrack = new tracks.TimelineAsyncSliceGroupTrack();
asyncTrack.categoryFilter = this.categoryFilter;
asyncTrack.decorateHit = function(hit) {
// TODO(simonjam): figure out how to associate subSlice hits back
// to their parent slice.
}
asyncTrack.group = this.thread_.asyncSlices;
this.addTrack_(asyncTrack);
var track = new tracks.TimelineSliceGroupTrack();
track.decorateHit = function(hit) {
hit.thread = this.thread_;
}
track.group = this.thread_;
this.addTrack_(track);
this.updateVisibility_();
}
this.addControlButtonElements_(this.tracks_.length >= 4);
},
updateVisibility_: function() {
if (!this.categoryFilter.matchThread(this.thread)) {
this.visible = false;
return;
}
var shouldBeVisible = false;
for (var i = 0; i < this.tracks_.length; ++i) {
var track = this.tracks_[i];
if (track.visible) {
shouldBeVisible = true;
if (i >= 1) {
track.heading = this.heading_;
track.tooltip = this.tooltip_;
break;
}
}
}
this.visible = shouldBeVisible;
},
collapsedDidChange: function(collapsed) {
if (collapsed) {
var h = parseInt(this.tracks_[0].height);
for (var i = 0; i < this.tracks_.length; ++i) {
if (h > 2) {
this.tracks_[i].height = Math.floor(h) + 'px';
} else {
this.tracks_[i].style.display = 'none';
}
h = h * 0.5;
}
} else {
for (var i = 0; i < this.tracks_.length; ++i) {
this.tracks_[i].height = this.tracks_[0].height;
this.tracks_[i].style.display = '';
}
}
}
};
return {
TimelineThreadTrack: TimelineThreadTrack
};
});