Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/ui_lazy/TimelineGrid.js

Issue 2466123002: DevTools: reformat front-end code to match chromium style. (Closed)
Patch Set: all done Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
3 * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org> 3 * Copyright (C) 2008, 2009 Anthony Ricaud <rik@webkit.org>
4 * Copyright (C) 2009 Google Inc. All rights reserved. 4 * Copyright (C) 2009 Google Inc. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
8 * are met: 8 * are met:
9 * 9 *
10 * 1. Redistributions of source code must retain the above copyright 10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer. 11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright 12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the 13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution. 14 * documentation and/or other materials provided with the distribution.
15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
16 * its contributors may be used to endorse or promote products derived 16 * its contributors may be used to endorse or promote products derived
17 * from this software without specific prior written permission. 17 * from this software without specific prior written permission.
18 * 18 *
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 /**
31 * @unrestricted
32 */
33 WebInspector.TimelineGrid = class {
34 constructor() {
35 this.element = createElement('div');
36 WebInspector.appendStyle(this.element, 'ui_lazy/timelineGrid.css');
30 37
31 /** 38 this._dividersElement = this.element.createChild('div', 'resources-dividers' );
32 * @constructor
33 */
34 WebInspector.TimelineGrid = function()
35 {
36 this.element = createElement("div");
37 WebInspector.appendStyle(this.element, "ui_lazy/timelineGrid.css");
38 39
39 this._dividersElement = this.element.createChild("div", "resources-dividers" ); 40 this._gridHeaderElement = createElement('div');
41 this._gridHeaderElement.classList.add('timeline-grid-header');
42 this._eventDividersElement = this._gridHeaderElement.createChild('div', 'res ources-event-dividers');
43 this._dividersLabelBarElement = this._gridHeaderElement.createChild('div', ' resources-dividers-label-bar');
44 this.element.appendChild(this._gridHeaderElement);
45 }
40 46
41 this._gridHeaderElement = createElement("div"); 47 /**
42 this._gridHeaderElement.classList.add("timeline-grid-header"); 48 * @param {!WebInspector.TimelineGrid.Calculator} calculator
43 this._eventDividersElement = this._gridHeaderElement.createChild("div", "res ources-event-dividers"); 49 * @param {number=} freeZoneAtLeft
44 this._dividersLabelBarElement = this._gridHeaderElement.createChild("div", " resources-dividers-label-bar"); 50 * @return {!{offsets: !Array.<number>, precision: number}}
45 this.element.appendChild(this._gridHeaderElement); 51 */
46 }; 52 static calculateDividerOffsets(calculator, freeZoneAtLeft) {
47 53 /** @const */ var minGridSlicePx = 64; // minimal distance between grid lin es.
48 /**
49 * @param {!WebInspector.TimelineGrid.Calculator} calculator
50 * @param {number=} freeZoneAtLeft
51 * @return {!{offsets: !Array.<number>, precision: number}}
52 */
53 WebInspector.TimelineGrid.calculateDividerOffsets = function(calculator, freeZon eAtLeft)
54 {
55 /** @const */ var minGridSlicePx = 64; // minimal distance between grid line s.
56 54
57 var clientWidth = calculator.computePosition(calculator.maximumBoundary()); 55 var clientWidth = calculator.computePosition(calculator.maximumBoundary());
58 var dividersCount = clientWidth / minGridSlicePx; 56 var dividersCount = clientWidth / minGridSlicePx;
59 var gridSliceTime = calculator.boundarySpan() / dividersCount; 57 var gridSliceTime = calculator.boundarySpan() / dividersCount;
60 var pixelsPerTime = clientWidth / calculator.boundarySpan(); 58 var pixelsPerTime = clientWidth / calculator.boundarySpan();
61 59
62 // Align gridSliceTime to a nearest round value. 60 // Align gridSliceTime to a nearest round value.
63 // We allow spans that fit into the formula: span = (1|2|5)x10^n, 61 // We allow spans that fit into the formula: span = (1|2|5)x10^n,
64 // e.g.: ... .1 .2 .5 1 2 5 10 20 50 ... 62 // e.g.: ... .1 .2 .5 1 2 5 10 20 50 ...
65 // After a span has been chosen make grid lines at multiples of the span. 63 // After a span has been chosen make grid lines at multiples of the span.
66 64
67 var logGridSliceTime = Math.ceil(Math.log(gridSliceTime) / Math.LN10); 65 var logGridSliceTime = Math.ceil(Math.log(gridSliceTime) / Math.LN10);
68 gridSliceTime = Math.pow(10, logGridSliceTime); 66 gridSliceTime = Math.pow(10, logGridSliceTime);
69 if (gridSliceTime * pixelsPerTime >= 5 * minGridSlicePx) 67 if (gridSliceTime * pixelsPerTime >= 5 * minGridSlicePx)
70 gridSliceTime = gridSliceTime / 5; 68 gridSliceTime = gridSliceTime / 5;
71 if (gridSliceTime * pixelsPerTime >= 2 * minGridSlicePx) 69 if (gridSliceTime * pixelsPerTime >= 2 * minGridSlicePx)
72 gridSliceTime = gridSliceTime / 2; 70 gridSliceTime = gridSliceTime / 2;
73 71
74 var leftBoundaryTime = calculator.minimumBoundary() - calculator.paddingLeft () / pixelsPerTime; 72 var leftBoundaryTime = calculator.minimumBoundary() - calculator.paddingLeft () / pixelsPerTime;
75 var firstDividerTime = Math.ceil((leftBoundaryTime - calculator.zeroTime()) / gridSliceTime) * gridSliceTime + calculator.zeroTime(); 73 var firstDividerTime =
74 Math.ceil((leftBoundaryTime - calculator.zeroTime()) / gridSliceTime) * gridSliceTime + calculator.zeroTime();
76 var lastDividerTime = calculator.maximumBoundary(); 75 var lastDividerTime = calculator.maximumBoundary();
77 // Add some extra space past the right boundary as the rightmost divider lab el text 76 // Add some extra space past the right boundary as the rightmost divider lab el text
78 // may be partially shown rather than just pop up when a new rightmost divid er gets into the view. 77 // may be partially shown rather than just pop up when a new rightmost divid er gets into the view.
79 lastDividerTime += minGridSlicePx / pixelsPerTime; 78 lastDividerTime += minGridSlicePx / pixelsPerTime;
80 dividersCount = Math.ceil((lastDividerTime - firstDividerTime) / gridSliceTi me); 79 dividersCount = Math.ceil((lastDividerTime - firstDividerTime) / gridSliceTi me);
81 80
82 if (!gridSliceTime) 81 if (!gridSliceTime)
83 dividersCount = 0; 82 dividersCount = 0;
84 83
85 var offsets = []; 84 var offsets = [];
86 for (var i = 0; i < dividersCount; ++i) { 85 for (var i = 0; i < dividersCount; ++i) {
87 var time = firstDividerTime + gridSliceTime * i; 86 var time = firstDividerTime + gridSliceTime * i;
88 if (calculator.computePosition(time) < freeZoneAtLeft) 87 if (calculator.computePosition(time) < freeZoneAtLeft)
89 continue; 88 continue;
90 offsets.push(time); 89 offsets.push(time);
91 } 90 }
92 91
93 return {offsets: offsets, precision: Math.max(0, -Math.floor(Math.log(gridSl iceTime * 1.01) / Math.LN10))}; 92 return {offsets: offsets, precision: Math.max(0, -Math.floor(Math.log(gridSl iceTime * 1.01) / Math.LN10))};
94 }; 93 }
95 94
96 /** 95 /**
97 * @param {!CanvasRenderingContext2D} context 96 * @param {!CanvasRenderingContext2D} context
98 * @param {!WebInspector.TimelineGrid.Calculator} calculator 97 * @param {!WebInspector.TimelineGrid.Calculator} calculator
99 * @param {number} paddingTop 98 * @param {number} paddingTop
100 * @param {number=} freeZoneAtLeft 99 * @param {number=} freeZoneAtLeft
101 */ 100 */
102 WebInspector.TimelineGrid.drawCanvasGrid = function(context, calculator, padding Top, freeZoneAtLeft) 101 static drawCanvasGrid(context, calculator, paddingTop, freeZoneAtLeft) {
103 {
104 context.save(); 102 context.save();
105 var ratio = window.devicePixelRatio; 103 var ratio = window.devicePixelRatio;
106 context.scale(ratio, ratio); 104 context.scale(ratio, ratio);
107 var width = context.canvas.width / window.devicePixelRatio; 105 var width = context.canvas.width / window.devicePixelRatio;
108 var height = context.canvas.height / window.devicePixelRatio; 106 var height = context.canvas.height / window.devicePixelRatio;
109 var dividersData = WebInspector.TimelineGrid.calculateDividerOffsets(calcula tor); 107 var dividersData = WebInspector.TimelineGrid.calculateDividerOffsets(calcula tor);
110 var dividerOffsets = dividersData.offsets; 108 var dividerOffsets = dividersData.offsets;
111 var precision = dividersData.precision; 109 var precision = dividersData.precision;
112 110
113 context.fillStyle = "rgba(255, 255, 255, 0.5)"; 111 context.fillStyle = 'rgba(255, 255, 255, 0.5)';
114 context.fillRect(0, 0, width, 15); 112 context.fillRect(0, 0, width, 15);
115 113
116 context.fillStyle = "#333"; 114 context.fillStyle = '#333';
117 context.strokeStyle = "rgba(0, 0, 0, 0.1)"; 115 context.strokeStyle = 'rgba(0, 0, 0, 0.1)';
118 context.textBaseline = "hanging"; 116 context.textBaseline = 'hanging';
119 context.font = "11px " + WebInspector.fontFamily(); 117 context.font = '11px ' + WebInspector.fontFamily();
120 context.lineWidth = 1; 118 context.lineWidth = 1;
121 119
122 context.translate(0.5, 0.5); 120 context.translate(0.5, 0.5);
123 const paddingRight = 4; 121 const paddingRight = 4;
124 freeZoneAtLeft = freeZoneAtLeft || 0; 122 freeZoneAtLeft = freeZoneAtLeft || 0;
125 for (var i = 0; i < dividerOffsets.length; ++i) { 123 for (var i = 0; i < dividerOffsets.length; ++i) {
126 var time = dividerOffsets[i]; 124 var time = dividerOffsets[i];
127 var position = calculator.computePosition(time); 125 var position = calculator.computePosition(time);
128 var text = calculator.formatValue(time, precision); 126 var text = calculator.formatValue(time, precision);
129 var textWidth = context.measureText(text).width; 127 var textWidth = context.measureText(text).width;
130 var textPosition = position - textWidth - paddingRight; 128 var textPosition = position - textWidth - paddingRight;
131 if (freeZoneAtLeft < textPosition) 129 if (freeZoneAtLeft < textPosition)
132 context.fillText(text, textPosition, paddingTop); 130 context.fillText(text, textPosition, paddingTop);
133 context.moveTo(position, 0); 131 context.moveTo(position, 0);
134 context.lineTo(position, height); 132 context.lineTo(position, height);
135 } 133 }
136 context.stroke(); 134 context.stroke();
137 context.restore(); 135 context.restore();
136 }
137
138 get dividersElement() {
139 return this._dividersElement;
140 }
141
142 get dividersLabelBarElement() {
143 return this._dividersLabelBarElement;
144 }
145
146 removeDividers() {
147 this._dividersElement.removeChildren();
148 this._dividersLabelBarElement.removeChildren();
149 }
150
151 /**
152 * @param {!WebInspector.TimelineGrid.Calculator} calculator
153 * @param {number=} freeZoneAtLeft
154 * @return {boolean}
155 */
156 updateDividers(calculator, freeZoneAtLeft) {
157 var dividersData = WebInspector.TimelineGrid.calculateDividerOffsets(calcula tor, freeZoneAtLeft);
158 var dividerOffsets = dividersData.offsets;
159 var precision = dividersData.precision;
160
161 var dividersElementClientWidth = this._dividersElement.clientWidth;
162
163 // Reuse divider elements and labels.
164 var divider = /** @type {?Element} */ (this._dividersElement.firstChild);
165 var dividerLabelBar = /** @type {?Element} */ (this._dividersLabelBarElement .firstChild);
166
167 for (var i = 0; i < dividerOffsets.length; ++i) {
168 if (!divider) {
169 divider = createElement('div');
170 divider.className = 'resources-divider';
171 this._dividersElement.appendChild(divider);
172
173 dividerLabelBar = createElement('div');
174 dividerLabelBar.className = 'resources-divider';
175 var label = createElement('div');
176 label.className = 'resources-divider-label';
177 dividerLabelBar._labelElement = label;
178 dividerLabelBar.appendChild(label);
179 this._dividersLabelBarElement.appendChild(dividerLabelBar);
180 }
181
182 var time = dividerOffsets[i];
183 var position = calculator.computePosition(time);
184 dividerLabelBar._labelElement.textContent = calculator.formatValue(time, p recision);
185
186 var percentLeft = 100 * position / dividersElementClientWidth;
187 divider.style.left = percentLeft + '%';
188 dividerLabelBar.style.left = percentLeft + '%';
189
190 divider = /** @type {?Element} */ (divider.nextSibling);
191 dividerLabelBar = /** @type {?Element} */ (dividerLabelBar.nextSibling);
192 }
193
194 // Remove extras.
195 while (divider) {
196 var nextDivider = divider.nextSibling;
197 this._dividersElement.removeChild(divider);
198 divider = nextDivider;
199 }
200 while (dividerLabelBar) {
201 var nextDivider = dividerLabelBar.nextSibling;
202 this._dividersLabelBarElement.removeChild(dividerLabelBar);
203 dividerLabelBar = nextDivider;
204 }
205 return true;
206 }
207
208 /**
209 * @param {!Element} divider
210 */
211 addEventDivider(divider) {
212 this._eventDividersElement.appendChild(divider);
213 }
214
215 /**
216 * @param {!Array.<!Element>} dividers
217 */
218 addEventDividers(dividers) {
219 this._gridHeaderElement.removeChild(this._eventDividersElement);
220 for (var divider of dividers)
221 this._eventDividersElement.appendChild(divider);
222 this._gridHeaderElement.appendChild(this._eventDividersElement);
223 }
224
225 removeEventDividers() {
226 this._eventDividersElement.removeChildren();
227 }
228
229 hideEventDividers() {
230 this._eventDividersElement.classList.add('hidden');
231 }
232
233 showEventDividers() {
234 this._eventDividersElement.classList.remove('hidden');
235 }
236
237 hideDividers() {
238 this._dividersElement.classList.add('hidden');
239 }
240
241 showDividers() {
242 this._dividersElement.classList.remove('hidden');
243 }
244
245 /**
246 * @param {number} scrollTop
247 */
248 setScrollTop(scrollTop) {
249 this._dividersLabelBarElement.style.top = scrollTop + 'px';
250 this._eventDividersElement.style.top = scrollTop + 'px';
251 }
138 }; 252 };
139 253
140 WebInspector.TimelineGrid.prototype = {
141 get dividersElement()
142 {
143 return this._dividersElement;
144 },
145
146 get dividersLabelBarElement()
147 {
148 return this._dividersLabelBarElement;
149 },
150
151 removeDividers: function()
152 {
153 this._dividersElement.removeChildren();
154 this._dividersLabelBarElement.removeChildren();
155 },
156
157 /**
158 * @param {!WebInspector.TimelineGrid.Calculator} calculator
159 * @param {number=} freeZoneAtLeft
160 * @return {boolean}
161 */
162 updateDividers: function(calculator, freeZoneAtLeft)
163 {
164 var dividersData = WebInspector.TimelineGrid.calculateDividerOffsets(cal culator, freeZoneAtLeft);
165 var dividerOffsets = dividersData.offsets;
166 var precision = dividersData.precision;
167
168 var dividersElementClientWidth = this._dividersElement.clientWidth;
169
170 // Reuse divider elements and labels.
171 var divider = /** @type {?Element} */ (this._dividersElement.firstChild) ;
172 var dividerLabelBar = /** @type {?Element} */ (this._dividersLabelBarEle ment.firstChild);
173
174 for (var i = 0; i < dividerOffsets.length; ++i) {
175 if (!divider) {
176 divider = createElement("div");
177 divider.className = "resources-divider";
178 this._dividersElement.appendChild(divider);
179
180 dividerLabelBar = createElement("div");
181 dividerLabelBar.className = "resources-divider";
182 var label = createElement("div");
183 label.className = "resources-divider-label";
184 dividerLabelBar._labelElement = label;
185 dividerLabelBar.appendChild(label);
186 this._dividersLabelBarElement.appendChild(dividerLabelBar);
187 }
188
189 var time = dividerOffsets[i];
190 var position = calculator.computePosition(time);
191 dividerLabelBar._labelElement.textContent = calculator.formatValue(t ime, precision);
192
193 var percentLeft = 100 * position / dividersElementClientWidth;
194 divider.style.left = percentLeft + "%";
195 dividerLabelBar.style.left = percentLeft + "%";
196
197 divider = /** @type {?Element} */ (divider.nextSibling);
198 dividerLabelBar = /** @type {?Element} */ (dividerLabelBar.nextSibli ng);
199 }
200
201 // Remove extras.
202 while (divider) {
203 var nextDivider = divider.nextSibling;
204 this._dividersElement.removeChild(divider);
205 divider = nextDivider;
206 }
207 while (dividerLabelBar) {
208 var nextDivider = dividerLabelBar.nextSibling;
209 this._dividersLabelBarElement.removeChild(dividerLabelBar);
210 dividerLabelBar = nextDivider;
211 }
212 return true;
213 },
214
215 /**
216 * @param {!Element} divider
217 */
218 addEventDivider: function(divider)
219 {
220 this._eventDividersElement.appendChild(divider);
221 },
222
223 /**
224 * @param {!Array.<!Element>} dividers
225 */
226 addEventDividers: function(dividers)
227 {
228 this._gridHeaderElement.removeChild(this._eventDividersElement);
229 for (var divider of dividers)
230 this._eventDividersElement.appendChild(divider);
231 this._gridHeaderElement.appendChild(this._eventDividersElement);
232 },
233
234 removeEventDividers: function()
235 {
236 this._eventDividersElement.removeChildren();
237 },
238
239 hideEventDividers: function()
240 {
241 this._eventDividersElement.classList.add("hidden");
242 },
243
244 showEventDividers: function()
245 {
246 this._eventDividersElement.classList.remove("hidden");
247 },
248
249 hideDividers: function()
250 {
251 this._dividersElement.classList.add("hidden");
252 },
253
254 showDividers: function()
255 {
256 this._dividersElement.classList.remove("hidden");
257 },
258
259 /**
260 * @param {number} scrollTop
261 */
262 setScrollTop: function(scrollTop)
263 {
264 this._dividersLabelBarElement.style.top = scrollTop + "px";
265 this._eventDividersElement.style.top = scrollTop + "px";
266 }
267 };
268 254
269 /** 255 /**
270 * @interface 256 * @interface
271 */ 257 */
272 WebInspector.TimelineGrid.Calculator = function() { }; 258 WebInspector.TimelineGrid.Calculator = function() {};
273 259
274 WebInspector.TimelineGrid.Calculator.prototype = { 260 WebInspector.TimelineGrid.Calculator.prototype = {
275 /** 261 /**
276 * @return {number} 262 * @return {number}
277 */ 263 */
278 paddingLeft: function() { }, 264 paddingLeft: function() {},
279 265
280 /** 266 /**
281 * @param {number} time 267 * @param {number} time
282 * @return {number} 268 * @return {number}
283 */ 269 */
284 computePosition: function(time) { }, 270 computePosition: function(time) {},
285 271
286 /** 272 /**
287 * @param {number} time 273 * @param {number} time
288 * @param {number=} precision 274 * @param {number=} precision
289 * @return {string} 275 * @return {string}
290 */ 276 */
291 formatValue: function(time, precision) { }, 277 formatValue: function(time, precision) {},
292 278
293 /** @return {number} */ 279 /** @return {number} */
294 minimumBoundary: function() { }, 280 minimumBoundary: function() {},
295 281
296 /** @return {number} */ 282 /** @return {number} */
297 zeroTime: function() { }, 283 zeroTime: function() {},
298 284
299 /** @return {number} */ 285 /** @return {number} */
300 maximumBoundary: function() { }, 286 maximumBoundary: function() {},
301 287
302 /** @return {number} */ 288 /** @return {number} */
303 boundarySpan: function() { } 289 boundarySpan: function() {}
304 }; 290 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698