12da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Copyright (c) 2012 The Chromium Authors. All rights reserved.
22da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// Use of this source code is governed by a BSD-style license that can be
32da489cd246702bee5938545b18a6f710ed214bcJamie Gennis// found in the LICENSE file.
42da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
52da489cd246702bee5938545b18a6f710ed214bcJamie Gennis'use strict';
62da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
72da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.require('tracks.timeline_container_track');
82da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.require('tracks.timeline_counter_track');
92da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.require('tracks.timeline_thread_track');
102da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.require('timeline_filter');
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.require('ui');
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
132da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.exportTo('tracks', function() {
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  /**
162da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * Visualizes a TimelineProcess by building TimelineThreadTracks and
172da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * TimelineCounterTracks.
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * @constructor
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   */
202da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  var TimelineProcessTrack = base.ui.define(tracks.TimelineContainerTrack);
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
222da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  TimelineProcessTrack.prototype = {
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
242da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    __proto__: tracks.TimelineContainerTrack.prototype,
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    decorate: function() {
272da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.classList.add('timeline-process-track');
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.categoryFilter_ = new tracing.TimelineFilter();
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    get process() {
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      return this.process_;
332da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    set process(process) {
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.process_ = process;
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.updateChildTracks_();
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    applyCategoryFilter_: function() {
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.visible = (this.categoryFilter.matchProcess(this.process) &&
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis                      !!this.numVisibleChildTracks);
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    updateChildTracks_: function() {
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.detach();
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (this.process_) {
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        // Add counter tracks for this process.
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        var counters = [];
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for (var tid in this.process.counters) {
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          counters.push(this.process.counters[tid]);
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        counters.sort(tracing.TimelineCounter.compare);
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        // Create the counters for this process.
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        counters.forEach(function(counter) {
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          var track = new tracks.TimelineCounterTrack();
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.heading = counter.name + ':';
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.counter = counter;
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          this.addTrack_(track);
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }.bind(this));
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        // Get a sorted list of threads.
642da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        var threads = [];
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for (var tid in this.process.threads)
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          threads.push(this.process.threads[tid]);
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        threads.sort(tracing.TimelineThread.compare);
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        // Create the threads.
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        threads.forEach(function(thread) {
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          var track = new tracks.TimelineThreadTrack();
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.heading = thread.userFriendlyName + ':';
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.tooltip = thread.userFriendlyDetails;
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.thread = thread;
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          this.addTrack_(track);
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }.bind(this));
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      }
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    }
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  return {
822da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    TimelineProcessTrack: TimelineProcessTrack
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis});
85