| // 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('tracing.tracks.trace_model_track'); |
| |
| base.require('base.measuring_stick'); |
| base.require('tracing.tracks.container_track'); |
| base.require('tracing.tracks.kernel_track'); |
| base.require('tracing.tracks.process_track'); |
| |
| base.require('ui'); |
| |
| base.exportTo('tracing.tracks', function() { |
| |
| /** |
| * Visualizes a Model by building ProcessTracks and |
| * CpuTracks. |
| * @constructor |
| */ |
| var TraceModelTrack = ui.define( |
| 'trace-model-track', tracing.tracks.ContainerTrack); |
| |
| TraceModelTrack.prototype = { |
| |
| __proto__: tracing.tracks.ContainerTrack.prototype, |
| |
| decorate: function(viewport) { |
| tracing.tracks.ContainerTrack.prototype.decorate.call(this, viewport); |
| this.classList.add('model-track'); |
| }, |
| |
| detach: function() { |
| tracing.tracks.ContainerTrack.prototype.detach.call(this); |
| }, |
| |
| get model() { |
| return this.model_; |
| }, |
| |
| set model(model) { |
| this.model_ = model; |
| this.updateContents_(); |
| }, |
| |
| get hasVisibleContent() { |
| return this.children.length > 0; |
| }, |
| |
| applyCategoryFilter_: function() { |
| this.updateContents_(); |
| }, |
| |
| updateContents_: function() { |
| this.textContent = ''; |
| if (!this.model_ || !this.categoryFilter) |
| return; |
| |
| var categoryFilter = this.categoryFilter; |
| |
| this.appendKernelTrack_(); |
| |
| // Get a sorted list of processes. |
| var processes = this.model_.getAllProcesses(); |
| processes.sort(tracing.trace_model.Process.compare); |
| |
| for (var i = 0; i < processes.length; ++i) { |
| var process = processes[i]; |
| if (!categoryFilter.matchProcess(process)) |
| return; |
| var track = new tracing.tracks.ProcessTrack(this.viewport); |
| track.categoryFilter = categoryFilter; |
| track.process = process; |
| if (!track.hasVisibleContent) |
| continue; |
| this.appendChild(track); |
| } |
| }, |
| |
| appendKernelTrack_: function() { |
| var kernel = this.model.kernel; |
| if (!this.categoryFilter.matchProcess(kernel)) |
| return; |
| var track = new tracing.tracks.KernelTrack(this.viewport); |
| track.categoryFilter = this.categoryFilter; |
| track.kernel = this.model.kernel; |
| if (!track.hasVisibleContent) |
| return; |
| this.appendChild(track); |
| }, |
| |
| drawTrack: function(type) { |
| switch (type) { |
| case tracing.tracks.DrawType.INSTANT_EVENT: |
| if (!this.model_.instantEvents || |
| this.model_.instantEvents.length === 0) |
| break; |
| |
| var ctx = this.context(); |
| if (ctx === undefined) |
| break; |
| |
| ctx.save(); |
| var worldBounds = this.setupCanvasForDraw_(); |
| this.drawInstantEvents_( |
| this.model_.instantEvents, worldBounds.left, worldBounds.right); |
| ctx.restore(); |
| break; |
| } |
| |
| tracing.tracks.ContainerTrack.prototype.drawTrack.call(this, type); |
| }, |
| |
| addIntersectingItemsInRangeToSelectionInWorldSpace: function( |
| loWX, hiWX, viewPixWidthWorld, selection) { |
| function onPickHit(instantEvent) { |
| var hit = selection.addSlice(this, instantEvent); |
| this.decorateHit(hit); |
| } |
| base.iterateOverIntersectingIntervals(this.model_.instantEvents, |
| function(x) { return x.start; }, |
| function(x) { return x.duration; }, |
| loWX, hiWX, |
| onPickHit.bind(this)); |
| |
| tracing.tracks.ContainerTrack.prototype. |
| addIntersectingItemsInRangeToSelectionInWorldSpace. |
| apply(this, arguments); |
| } |
| }; |
| |
| return { |
| TraceModelTrack: TraceModelTrack |
| }; |
| }); |