166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved.
266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// Use of this source code is governed by a BSD-style license that can be
366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis// found in the LICENSE file.
466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis'use strict';
666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.requireStylesheet('tracing.tracks.thread_track');
866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.tracks.container_track');
1066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.tracks.slice_track');
1166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.tracks.slice_group_track');
1266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.tracks.async_slice_group_track');
1366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('tracing.filter');
1466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.require('ui');
1566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennisbase.exportTo('tracing.tracks', function() {
1766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
1866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  /**
1966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * Visualizes a Thread using a series of of SliceTracks.
2066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   * @constructor
2166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis   */
2266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  var ThreadTrack = ui.define('thread-track', tracing.tracks.ContainerTrack);
2366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  ThreadTrack.prototype = {
2466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    __proto__: tracing.tracks.ContainerTrack.prototype,
2566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
2666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    decorate: function(viewport) {
2766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      tracing.tracks.ContainerTrack.prototype.decorate.call(this, viewport);
2866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.classList.add('thread-track');
2966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get thread() {
3266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return this.thread_;
3366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
3566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    set thread(thread) {
3666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.thread_ = thread;
3766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.updateContents_();
3866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
3966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    get hasVisibleContent() {
4166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      return this.tracks_.length > 0;
4266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
4366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    updateContents_: function() {
4566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.detach();
4666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
4766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (!this.thread_)
4866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        return;
4966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.heading = this.thread_.userFriendlyName + ': ';
5166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      this.tooltip = this.thread_.userFriendlyDetails;
5266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
5366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.thread_.asyncSliceGroup.length) {
5466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var asyncTrack = new tracing.tracks.AsyncSliceGroupTrack(this.viewport);
5566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        asyncTrack.categoryFilter = this.categoryFilter;
5666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        asyncTrack.decorateHit = function(hit) {
5766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          // TODO(simonjam): figure out how to associate subSlice hits back
5866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          // to their parent slice.
5966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        };
6066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        asyncTrack.group = this.thread_.asyncSliceGroup;
6166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if (asyncTrack.hasVisibleContent)
6266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.appendChild(asyncTrack);
6366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
6466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
6566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.thread_.samples.length) {
6666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var samplesTrack = new tracing.tracks.SliceTrack(this.viewport);
6766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        samplesTrack.categoryFilter = samplesTrack;
6866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        samplesTrack.group = this.thread_;
6966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        samplesTrack.slices = this.thread_.samples;
7066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        samplesTrack.decorateHit = function(hit) {
7166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          // TODO(johnmccutchan): Figure out what else should be associated
7266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          // with the hit.
7366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          hit.thread = this.thread_;
7466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
7566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        this.appendChild(samplesTrack);
7666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
7766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
7866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.thread_.cpuSlices) {
7966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var cpuTrack = new tracing.tracks.SliceTrack(this.viewport);
8066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        cpuTrack.categoryFilter = this.categoryFilter;
8166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        cpuTrack.heading = '';
8266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        cpuTrack.height = '4px';
8366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        cpuTrack.decorateHit = function(hit) {
8466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          hit.thread = this.thread_;
8566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
8666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        cpuTrack.slices = this.thread_.cpuSlices;
8766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if (cpuTrack.hasVisibleContent)
8866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.appendChild(cpuTrack);
8966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
9066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (this.thread_.sliceGroup.length) {
9266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var track = new tracing.tracks.SliceGroupTrack(this.viewport);
9366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        track.categoryFilter = this.categoryFilter;
9466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        track.heading = this.thread_.userFriendlyName;
9566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        track.tooltip = this.thread_.userFriendlyDetails;
9666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
9766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        track.decorateHit = function(hit) {
9866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          hit.thread = this.thread_;
9966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        };
10066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        track.group = this.thread_.sliceGroup;
10166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        if (track.hasVisibleContent)
10266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.appendChild(track);
10366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
10466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    },
10566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
10666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    collapsedDidChange: function(collapsed) {
10766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      if (collapsed) {
10866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        var h = parseInt(this.tracks[0].height);
10966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        for (var i = 0; i < this.tracks.length; ++i) {
11066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          if (h > 2) {
11166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            this.tracks[i].height = Math.floor(h) + 'px';
11266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          } else {
11366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis            this.tracks[i].style.display = 'none';
11466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          }
11566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          h = h * 0.5;
11666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
11766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      } else {
11866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        for (var i = 0; i < this.tracks.length; ++i) {
11966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.tracks[i].height = this.tracks[0].height;
12066a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis          this.tracks[i].style.display = '';
12166a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis        }
12266a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis      }
12366a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    }
12466a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
12566a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis
12666a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  return {
12766a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis    ThreadTrack: ThreadTrack
12866a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis  };
12966a37686207944273ced825e0e8b6b6375f8c3deJamie Gennis});
130