// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';
base.requireStylesheet('tracks.timeline_model_track');
base.require('tracks.timeline_container_track');
base.require('tracks.timeline_cpu_track');
base.require('tracks.timeline_process_track');
base.require('ui');
base.exportTo('tracks', function() {
/**
* Visualizes a TimelineModel by building TimelineProcessTracks and
* TimelineCpuTracks.
* @constructor
*/
var TimelineModelTrack = base.ui.define(tracks.TimelineContainerTrack);
TimelineModelTrack.prototype = {
__proto__: tracks.TimelineContainerTrack.prototype,
decorate: function() {
this.classList.add('timeline-model-track');
this.measuringStick_ = new tracing.MeasuringStick();
this.measuringStick_.attach();
},
detach: function() {
tracks.TimelineContainerTrack.prototype.detach.call(this);
this.measuringStick_.detach();
},
get model() {
return this.model_;
},
set model(model) {
this.model_ = model;
this.updateHeadingWidth_();
this.updateChildTracks_();
},
updateHeadingWidth_: function() {
// Figure out all the headings.
var allHeadings = [];
this.model.getAllThreads().forEach(function(t) {
allHeadings.push(t.userFriendlyName);
});
this.model.getAllCounters().forEach(function(c) {
allHeadings.push(c.name);
});
this.model.getAllCpus().forEach(function(c) {
allHeadings.push('CPU ' + c.cpuNumber);
});
// Figure out the maximum heading size.
var maxHeadingWidth = 0;
var headingEl = document.createElement('div');
headingEl.style.position = 'fixed';
headingEl.className = 'timeline-canvas-based-track-title';
for (var i = 0; i < allHeadings.length; i++) {
var text = allHeadings[i];
headingEl.textContent = text + ':__';
var w = this.measuringStick_.measure(headingEl).width;
// Limit heading width to 300px.
if (w > 300)
w = 300;
if (w > maxHeadingWidth)
maxHeadingWidth = w;
}
this.headingWidth = maxHeadingWidth + 'px';
},
updateChildTracks_: function() {
this.detachAllChildren();
if (this.model_) {
var cpus = this.model_.getAllCpus();
cpus.sort(tracing.TimelineCpu.compare);
for (var i = 0; i < cpus.length; ++i) {
var cpu = cpus[i];
var track = new tracks.TimelineCpuTrack();
track.heading = 'CPU ' + cpu.cpuNumber + ':';
track.cpu = cpu;
this.addTrack_(track);
}
// Get a sorted list of processes.
var processes = this.model_.getAllProcesses();
processes.sort(tracing.TimelineProcess.compare);
for (var i = 0; i < processes.length; ++i) {
var process = processes[i];
var track = new tracks.TimelineProcessTrack();
track.process = process;
this.addTrack_(track);
}
}
}
};
return {
TimelineModelTrack: TimelineModelTrack
};
});