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.require('tracks.timeline_container_track');
8base.require('tracks.timeline_counter_track');
9base.require('tracks.timeline_thread_track');
10base.require('timeline_filter');
11base.require('ui');
12
13base.exportTo('tracks', function() {
14
15  /**
16   * Visualizes a TimelineProcess by building TimelineThreadTracks and
17   * TimelineCounterTracks.
18   * @constructor
19   */
20  var TimelineProcessTrack = base.ui.define(tracks.TimelineContainerTrack);
21
22  TimelineProcessTrack.prototype = {
23
24    __proto__: tracks.TimelineContainerTrack.prototype,
25
26    decorate: function() {
27      this.classList.add('timeline-process-track');
28      this.categoryFilter_ = new tracing.TimelineFilter();
29    },
30
31    get process() {
32      return this.process_;
33    },
34
35    set process(process) {
36      this.process_ = process;
37      this.updateChildTracks_();
38    },
39
40    applyCategoryFilter_: function() {
41      this.visible = (this.categoryFilter.matchProcess(this.process) &&
42                      !!this.numVisibleChildTracks);
43    },
44
45    updateChildTracks_: function() {
46      this.detach();
47      if (this.process_) {
48        // Add counter tracks for this process.
49        var counters = [];
50        for (var tid in this.process.counters) {
51          counters.push(this.process.counters[tid]);
52        }
53        counters.sort(tracing.TimelineCounter.compare);
54
55        // Create the counters for this process.
56        counters.forEach(function(counter) {
57          var track = new tracks.TimelineCounterTrack();
58          track.heading = counter.name + ':';
59          track.counter = counter;
60          this.addTrack_(track);
61        }.bind(this));
62
63        // Get a sorted list of threads.
64        var threads = [];
65        for (var tid in this.process.threads)
66          threads.push(this.process.threads[tid]);
67        threads.sort(tracing.TimelineThread.compare);
68
69        // Create the threads.
70        threads.forEach(function(thread) {
71          var track = new tracks.TimelineThreadTrack();
72          track.heading = thread.userFriendlyName + ':';
73          track.tooltip = thread.userFriendlyDetails;
74          track.thread = thread;
75          this.addTrack_(track);
76        }.bind(this));
77      }
78    }
79  };
80
81  return {
82    TimelineProcessTrack: TimelineProcessTrack
83  };
84});
85