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
788448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.requireStylesheet('tracks.model_track');
888448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.require('tracks.container_track');
988448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.require('tracks.cpu_track');
1088448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.require('tracks.process_track');
112da489cd246702bee5938545b18a6f710ed214bcJamie Gennisbase.require('ui');
122da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1388448d9ae4dfff1805045790ef5f32495d62abccJeff Brownbase.exportTo('tracing.tracks', function() {
142da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
152da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  /**
1688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown   * Visualizes a Model by building ProcessTracks and
1788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown   * CpuTracks.
182da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   * @constructor
192da489cd246702bee5938545b18a6f710ed214bcJamie Gennis   */
2088448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  var ModelTrack = tracing.ui.define(tracing.tracks.ContainerTrack);
212da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2288448d9ae4dfff1805045790ef5f32495d62abccJeff Brown  ModelTrack.prototype = {
232da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
2488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    __proto__: tracing.tracks.ContainerTrack.prototype,
252da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
262da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    decorate: function() {
2788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      this.classList.add('model-track');
282da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.measuringStick_ = new tracing.MeasuringStick();
292da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.measuringStick_.attach();
302da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
312da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
322da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    detach: function() {
3388448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      tracing.tracks.ContainerTrack.prototype.detach.call(this);
342da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.measuringStick_.detach();
352da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
362da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
372da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    get model() {
382da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      return this.model_;
392da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
402da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
412da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    set model(model) {
422da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.model_ = model;
432da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.updateHeadingWidth_();
442da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.updateChildTracks_();
452da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
462da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
472da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    updateHeadingWidth_: function() {
482da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      // Figure out all the headings.
492da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var allHeadings = [];
502da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.model.getAllThreads().forEach(function(t) {
512da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        allHeadings.push(t.userFriendlyName);
522da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      });
532da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.model.getAllCounters().forEach(function(c) {
542da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        allHeadings.push(c.name);
552da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      });
562da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.model.getAllCpus().forEach(function(c) {
572da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        allHeadings.push('CPU ' + c.cpuNumber);
582da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      });
592da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
602da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      // Figure out the maximum heading size.
612da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var maxHeadingWidth = 0;
622da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      var headingEl = document.createElement('div');
632da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      headingEl.style.position = 'fixed';
6488448d9ae4dfff1805045790ef5f32495d62abccJeff Brown      headingEl.className = 'canvas-based-track-title';
652da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      for (var i = 0; i < allHeadings.length; i++) {
662da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        var text = allHeadings[i];
672da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        headingEl.textContent = text + ':__';
682da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        var w = this.measuringStick_.measure(headingEl).width;
692da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        // Limit heading width to 300px.
702da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        if (w > 300)
712da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          w = 300;
722da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        if (w > maxHeadingWidth)
732da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          maxHeadingWidth = w;
742da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      }
752da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.headingWidth = maxHeadingWidth + 'px';
762da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    },
772da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
782da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    updateChildTracks_: function() {
792da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      this.detachAllChildren();
802da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      if (this.model_) {
812da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        var cpus = this.model_.getAllCpus();
8206db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis        cpus.sort(tracing.model.Cpu.compare);
832da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
842da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for (var i = 0; i < cpus.length; ++i) {
852da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          var cpu = cpus[i];
8688448d9ae4dfff1805045790ef5f32495d62abccJeff Brown          var track = new tracing.tracks.CpuTrack();
872da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.heading = 'CPU ' + cpu.cpuNumber + ':';
882da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.cpu = cpu;
892da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          this.addTrack_(track);
902da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }
912da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
922da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        // Get a sorted list of processes.
932da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        var processes = this.model_.getAllProcesses();
9406db268ddce368501b62bd8999fcf2c3255b6de9Jamie Gennis        processes.sort(tracing.model.Process.compare);
952da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
962da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        for (var i = 0; i < processes.length; ++i) {
972da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          var process = processes[i];
9888448d9ae4dfff1805045790ef5f32495d62abccJeff Brown          var track = new tracing.tracks.ProcessTrack();
992da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          track.process = process;
1002da489cd246702bee5938545b18a6f710ed214bcJamie Gennis          this.addTrack_(track);
1012da489cd246702bee5938545b18a6f710ed214bcJamie Gennis        }
1022da489cd246702bee5938545b18a6f710ed214bcJamie Gennis      }
1032da489cd246702bee5938545b18a6f710ed214bcJamie Gennis    }
1042da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
1052da489cd246702bee5938545b18a6f710ed214bcJamie Gennis
1062da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  return {
10788448d9ae4dfff1805045790ef5f32495d62abccJeff Brown    ModelTrack: ModelTrack
1082da489cd246702bee5938545b18a6f710ed214bcJamie Gennis  };
1092da489cd246702bee5938545b18a6f710ed214bcJamie Gennis});
110