| // 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 |
| }; |
| }); |