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 7 base.requireStylesheet('tracks.model_track'); 8 base.require('tracks.container_track'); 9 base.require('tracks.cpu_track'); 10 base.require('tracks.process_track'); 11 base.require('ui'); 12 13 base.exportTo('tracing.tracks', function() { 14 15 /** 16 * Visualizes a Model by building ProcessTracks and 17 * CpuTracks. 18 * @constructor 19 */ 20 var ModelTrack = tracing.ui.define(tracing.tracks.ContainerTrack); 21 22 ModelTrack.prototype = { 23 24 __proto__: tracing.tracks.ContainerTrack.prototype, 25 26 decorate: function() { 27 this.classList.add('model-track'); 28 this.measuringStick_ = new tracing.MeasuringStick(); 29 this.measuringStick_.attach(); 30 }, 31 32 detach: function() { 33 tracing.tracks.ContainerTrack.prototype.detach.call(this); 34 this.measuringStick_.detach(); 35 }, 36 37 get model() { 38 return this.model_; 39 }, 40 41 set model(model) { 42 this.model_ = model; 43 this.updateHeadingWidth_(); 44 this.updateChildTracks_(); 45 }, 46 47 updateHeadingWidth_: function() { 48 // Figure out all the headings. 49 var allHeadings = []; 50 this.model.getAllThreads().forEach(function(t) { 51 allHeadings.push(t.userFriendlyName); 52 }); 53 this.model.getAllCounters().forEach(function(c) { 54 allHeadings.push(c.name); 55 }); 56 this.model.getAllCpus().forEach(function(c) { 57 allHeadings.push('CPU ' + c.cpuNumber); 58 }); 59 60 // Figure out the maximum heading size. 61 var maxHeadingWidth = 0; 62 var headingEl = document.createElement('div'); 63 headingEl.style.position = 'fixed'; 64 headingEl.className = 'canvas-based-track-title'; 65 for (var i = 0; i < allHeadings.length; i++) { 66 var text = allHeadings[i]; 67 headingEl.textContent = text + ':__'; 68 var w = this.measuringStick_.measure(headingEl).width; 69 // Limit heading width to 300px. 70 if (w > 300) 71 w = 300; 72 if (w > maxHeadingWidth) 73 maxHeadingWidth = w; 74 } 75 this.headingWidth = maxHeadingWidth + 'px'; 76 }, 77 78 updateChildTracks_: function() { 79 this.detachAllChildren(); 80 if (this.model_) { 81 var cpus = this.model_.getAllCpus(); 82 cpus.sort(tracing.model.Cpu.compare); 83 84 for (var i = 0; i < cpus.length; ++i) { 85 var cpu = cpus[i]; 86 var track = new tracing.tracks.CpuTrack(); 87 track.heading = 'CPU ' + cpu.cpuNumber + ':'; 88 track.cpu = cpu; 89 this.addTrack_(track); 90 } 91 92 // Get a sorted list of processes. 93 var processes = this.model_.getAllProcesses(); 94 processes.sort(tracing.model.Process.compare); 95 96 for (var i = 0; i < processes.length; ++i) { 97 var process = processes[i]; 98 var track = new tracing.tracks.ProcessTrack(); 99 track.process = process; 100 this.addTrack_(track); 101 } 102 } 103 } 104 }; 105 106 return { 107 ModelTrack: ModelTrack 108 }; 109 }); 110