1 // Copyright (c) 2013 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.
7 base.requireStylesheet('tracing.tracks.drawing_container');
9 base.require('base.raf');
10 base.require('tracing.tracks.track');
13 base.exportTo('tracing.tracks', function() {
23 var DrawingContainer = ui.define('drawing-container', tracing.tracks.Track);
25 DrawingContainer.prototype = {
26 __proto__: tracing.tracks.Track.prototype,
28 decorate: function(viewport) {
29 tracing.tracks.Track.prototype.decorate.call(this, viewport);
30 this.classList.add('drawing-container');
32 this.canvas_ = document.createElement('canvas');
33 this.canvas_.className = 'drawing-container-canvas';
34 this.canvas_.style.left = tracing.constants.HEADING_WIDTH + 'px';
35 this.appendChild(this.canvas_);
37 this.ctx_ = this.canvas_.getContext('2d');
39 this.viewportChange_ = this.viewportChange_.bind(this);
40 this.viewport.addEventListener('change', this.viewportChange_);
43 // Needed to support the calls in TimelineTrackView.
52 viewportChange_: function() {
56 invalidate: function() {
59 this.rafPending_ = true;
61 base.requestPreAnimationFrame(function() {
62 this.rafPending_ = false;
63 this.updateCanvasSizeIfNeeded_();
65 base.requestAnimationFrameInThisFrameIfPossible(function() {
66 this.drawTrackContents_();
71 drawTrackContents_: function() {
72 this.ctx_.clearRect(0, 0, this.canvas_.width, this.canvas_.height);
77 DrawType.INSTANT_EVENT,
81 if (this.viewport.showFlowEvents)
82 typesToDraw.push(DrawType.FLOW_ARROWS);
84 for (var idx in typesToDraw) {
85 for (var i = 0; i < this.children.length; ++i) {
86 if (!(this.children[i] instanceof tracing.tracks.Track))
88 this.children[i].drawTrack(typesToDraw[idx]);
92 var pixelRatio = window.devicePixelRatio || 1;
93 var bounds = this.canvas_.getBoundingClientRect();
94 var dt = this.viewport.currentDisplayTransform;
95 var viewLWorld = dt.xViewToWorld(0);
96 var viewRWorld = dt.xViewToWorld(
97 bounds.width * pixelRatio);
99 this.viewport.drawGridLines(this.ctx_, viewLWorld, viewRWorld);
102 updateCanvasSizeIfNeeded_: function() {
103 var visibleChildTracks =
104 base.asArray(this.children).filter(this.visibleFilter_);
106 var thisBounds = this.getBoundingClientRect();
108 var firstChildTrackBounds = visibleChildTracks[0].getBoundingClientRect();
109 var lastChildTrackBounds =
110 visibleChildTracks[visibleChildTracks.length - 1].
111 getBoundingClientRect();
113 var innerWidth = firstChildTrackBounds.width -
114 tracing.constants.HEADING_WIDTH;
115 var innerHeight = lastChildTrackBounds.bottom - firstChildTrackBounds.top;
117 var pixelRatio = window.devicePixelRatio || 1;
118 if (this.canvas_.width != innerWidth * pixelRatio) {
119 this.canvas_.width = innerWidth * pixelRatio;
120 this.canvas_.style.width = innerWidth + 'px';
123 if (this.canvas_.height != innerHeight * pixelRatio) {
124 this.canvas_.height = innerHeight * pixelRatio;
125 this.canvas_.style.height = innerHeight + 'px';
129 firstChildTrackBounds.top - thisBounds.top + this.scrollTop;
130 if (this.canvas_.style.top + 'px' !== canvasTop)
131 this.canvas_.style.top = canvasTop + 'px';
134 visibleFilter_: function(element) {
135 if (!(element instanceof tracing.tracks.Track))
137 return window.getComputedStyle(element).display !== 'none';
140 addClosestEventToSelection: function(
141 worldX, worldMaxDist, loY, hiY, selection) {
142 for (var i = 0; i < this.children.length; ++i) {
143 if (!(this.children[i] instanceof tracing.tracks.Track))
145 var trackClientRect = this.children[i].getBoundingClientRect();
146 var a = Math.max(loY, trackClientRect.top);
147 var b = Math.min(hiY, trackClientRect.bottom);
149 this.children[i].addClosestEventToSelection(
150 worldX, worldMaxDist, loY, hiY, selection);
154 tracing.tracks.Track.prototype.addClosestEventToSelection.
155 apply(this, arguments);
158 addEventsToTrackMap: function(eventToTrackMap) {
159 for (var i = 0; i < this.children.length; ++i) {
160 if (!(this.children[i] instanceof tracing.tracks.Track))
162 this.children[i].addEventsToTrackMap(eventToTrackMap);
168 DrawingContainer: DrawingContainer,