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

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/network/NetworkTimelineColumn.js

Issue 2418953002: [Devtools] Added simplified/latency view to network timeline experiment (Closed)
Patch Set: changes Created 4 years, 2 months 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
« no previous file with comments | « no previous file | third_party/WebKit/Source/devtools/front_end/network/networkLogView.css » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 /** 5 /**
6 * @constructor 6 * @constructor
7 * @extends {WebInspector.VBox} 7 * @extends {WebInspector.VBox}
8 * @param {!WebInspector.NetworkLogView} networkLogView 8 * @param {!WebInspector.NetworkLogView} networkLogView
9 * @param {!WebInspector.SortableDataGrid} dataGrid 9 * @param {!WebInspector.SortableDataGrid} dataGrid
10 */ 10 */
11 WebInspector.NetworkTimelineColumn = function(networkLogView, dataGrid) 11 WebInspector.NetworkTimelineColumn = function(networkLogView, dataGrid)
12 { 12 {
13 WebInspector.VBox.call(this, true); 13 WebInspector.VBox.call(this, true);
14 this.registerRequiredCSS("network/networkTimelineColumn.css"); 14 this.registerRequiredCSS("network/networkTimelineColumn.css");
15 15
16 this._canvas = this.contentElement.createChild("canvas"); 16 this._canvas = this.contentElement.createChild("canvas");
17 this._canvas.tabIndex = 1; 17 this._canvas.tabIndex = 1;
18 this.setDefaultFocusedElement(this._canvas); 18 this.setDefaultFocusedElement(this._canvas);
19 19
20 /** @const */ 20 /** @const */
21 this._leftPadding = 5; 21 this._leftPadding = 5;
22 /** @const */ 22 /** @const */
23 this._rightPadding = 5; 23 this._rightPadding = 5;
24 /** @const */
25 this._fontSize = 10;
24 26
25 this._dataGrid = dataGrid; 27 this._dataGrid = dataGrid;
26 this._networkLogView = networkLogView; 28 this._networkLogView = networkLogView;
27 29
28 this._popoverAnchor = this.contentElement.createChild("div", "network-timeli ne-popover"); 30 this._popoverAnchor = this.contentElement.createChild("div", "network-timeli ne-popover");
29 this._popoverHelper = new WebInspector.PopoverHelper(this._popoverAnchor, th is._getPopoverAnchor.bind(this), this._showPopover.bind(this)); 31 this._popoverHelper = new WebInspector.PopoverHelper(this._popoverAnchor, th is._getPopoverAnchor.bind(this), this._showPopover.bind(this));
30 32
31 this._vScrollElement = this.contentElement.createChild("div", "network-timel ine-v-scroll"); 33 this._vScrollElement = this.contentElement.createChild("div", "network-timel ine-v-scroll");
32 this._vScrollElement.addEventListener("scroll", this._onScroll.bind(this), { passive: true }); 34 this._vScrollElement.addEventListener("scroll", this._onScroll.bind(this), { passive: true });
33 this._vScrollElement.addEventListener("mousewheel", this._onMouseWheel.bind( this), { passive: true }); 35 this._vScrollElement.addEventListener("mousewheel", this._onMouseWheel.bind( this), { passive: true });
(...skipping 17 matching lines...) Expand all
51 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.PaddingChanged, this._updateHeight.bind(this)); 53 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.PaddingChanged, this._updateHeight.bind(this));
52 54
53 /** @type {!Array<!WebInspector.NetworkRequest>} */ 55 /** @type {!Array<!WebInspector.NetworkRequest>} */
54 this._requestData = []; 56 this._requestData = [];
55 57
56 /** @type {?WebInspector.NetworkRequest} */ 58 /** @type {?WebInspector.NetworkRequest} */
57 this._hoveredRequest = null; 59 this._hoveredRequest = null;
58 60
59 this._rowStripeColor = WebInspector.themeSupport.patchColor("#f5f5f5", WebIn spector.ThemeSupport.ColorUsage.Background); 61 this._rowStripeColor = WebInspector.themeSupport.patchColor("#f5f5f5", WebIn spector.ThemeSupport.ColorUsage.Background);
60 this._rowHoverColor = WebInspector.themeSupport.patchColor("#ebf2fc", WebIns pector.ThemeSupport.ColorUsage.Background); 62 this._rowHoverColor = WebInspector.themeSupport.patchColor("#ebf2fc", WebIns pector.ThemeSupport.ColorUsage.Background);
63
64 /** @type {!Map<!WebInspector.ResourceType, string>} */
65 this._borderColorsForResourceTypeCache = new Map();
66 /** @type {!Map<string, !CanvasGradient>} */
67 this._colorsForResourceTypeCache = new Map();
61 } 68 }
62 69
63 WebInspector.NetworkTimelineColumn.Events = { 70 WebInspector.NetworkTimelineColumn.Events = {
64 RequestHovered: Symbol("RequestHovered") 71 RequestHovered: Symbol("RequestHovered")
65 } 72 }
66 73
67 WebInspector.NetworkTimelineColumn._popoverShowDelay = 300; 74 WebInspector.NetworkTimelineColumn._popoverShowDelay = 300;
68 75
76 WebInspector.NetworkTimelineColumn._colorsForResourceType = {
77 document: "hsl(215, 100%, 80%)",
78 font: "hsl(8, 100%, 80%)",
79 media: "hsl(272, 64%, 80%)",
80 image: "hsl(272, 64%, 80%)",
81 script: "hsl(31, 100%, 80%)",
82 stylesheet: "hsl(90, 50%, 80%)",
83 texttrack: "hsl(8, 100%, 80%)",
84 websocket: "hsl(0, 0%, 95%)",
85 xhr: "hsl(53, 100%, 80%)",
86 other: "hsl(0, 0%, 95%)"
87 }
88
69 WebInspector.NetworkTimelineColumn.prototype = { 89 WebInspector.NetworkTimelineColumn.prototype = {
70 willHide: function() 90 willHide: function()
71 { 91 {
72 this._popoverHelper.hidePopover(); 92 this._popoverHelper.hidePopover();
73 }, 93 },
74 /** 94 /**
75 * @param {!Element} element 95 * @param {!Element} element
76 * @param {!Event} event 96 * @param {!Event} event
77 * @return {!Element|!AnchorBox|undefined} 97 * @return {!Element|!AnchorBox|undefined}
78 */ 98 */
79 _getPopoverAnchor: function(element, event) 99 _getPopoverAnchor: function(element, event)
80 { 100 {
81 if (!this._hoveredRequest) 101 if (!this._hoveredRequest)
82 return; 102 return;
83 return this._popoverAnchor; 103 return this._popoverAnchor;
84 }, 104 },
85 105
86 /** 106 /**
87 * @param {!Element} anchor 107 * @param {!Element} anchor
88 * @param {!WebInspector.Popover} popover 108 * @param {!WebInspector.Popover} popover
89 */ 109 */
90 _showPopover: function(anchor, popover) 110 _showPopover: function(anchor, popover)
91 { 111 {
92 if (!this._hoveredRequest) 112 if (!this._hoveredRequest)
93 return; 113 return;
94 var content = WebInspector.RequestTimingView.createTimingTable(this._hov eredRequest, this._networkLogView.timeCalculator().minimumBoundary()); 114 var content = WebInspector.RequestTimingView.createTimingTable(this._hov eredRequest, this._networkLogView.calculator().minimumBoundary());
95 popover.showForAnchor(content, anchor); 115 popover.showForAnchor(content, anchor);
96 }, 116 },
97 117
98 wasShown: function() 118 wasShown: function()
99 { 119 {
100 this.scheduleUpdate(); 120 this.scheduleUpdate();
101 }, 121 },
102 122
103 scheduleRefreshData: function() 123 scheduleRefreshData: function()
104 { 124 {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 { 174 {
155 this._dataGridScrollContainer.scrollTop = this._vScrollElement.scrollTop ; 175 this._dataGridScrollContainer.scrollTop = this._vScrollElement.scrollTop ;
156 this._popoverHelper.hidePopover(); 176 this._popoverHelper.hidePopover();
157 }, 177 },
158 178
159 _positionPopoverAnchor: function() 179 _positionPopoverAnchor: function()
160 { 180 {
161 if (!this._hoveredRequest) 181 if (!this._hoveredRequest)
162 return; 182 return;
163 var rowHeight = this._networkLogView.rowHeight(); 183 var rowHeight = this._networkLogView.rowHeight();
164 var range = WebInspector.RequestTimingView.calculateRequestTimeRanges(th is._hoveredRequest, 0).find(data => data.name === "total"); 184 var percentages = this._networkLogView.calculator().computeBarGraphPerce ntages(this._hoveredRequest);
165 var start = this._timeToPosition(range.start); 185 var availableWidth = this._offsetWidth - this._leftPadding - this._right Padding;
166 var end = this._timeToPosition(range.end); 186 var start = (percentages.start / 100) * availableWidth + this._leftPaddi ng;
187 var end = (percentages.end / 100) * availableWidth + this._leftPadding;
167 188
168 var rowIndex = this._requestData.findIndex(request => this._hoveredReque st === request); 189 var rowIndex = this._requestData.findIndex(request => this._hoveredReque st === request);
169 var barHeight = this._getBarHeight(range.name); 190 var barHeight = this._getBarHeight();
170 191
171 this._popoverAnchor.style.left = start + "px"; 192 this._popoverAnchor.style.left = start + "px";
172 this._popoverAnchor.style.width = (end - start) + "px" 193 this._popoverAnchor.style.width = (end - start) + "px"
173 this._popoverAnchor.style.height = barHeight + "px"; 194 this._popoverAnchor.style.height = barHeight + "px";
174 this._popoverAnchor.style.top = this._networkLogView.headerHeight() + (r owHeight * rowIndex - this._vScrollElement.scrollTop) + ((rowHeight - barHeight) / 2) + "px"; 195 this._popoverAnchor.style.top = this._networkLogView.headerHeight() + (r owHeight * rowIndex - this._vScrollElement.scrollTop) + ((rowHeight - barHeight) / 2) + "px";
175 }, 196 },
176 197
177 /** 198 /**
178 * @param {number} x 199 * @param {number} x
179 * @param {number} y 200 * @param {number} y
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
272 */ 293 */
273 _timeToPosition: function(time) 294 _timeToPosition: function(time)
274 { 295 {
275 var availableWidth = this._offsetWidth - this._leftPadding - this._right Padding; 296 var availableWidth = this._offsetWidth - this._leftPadding - this._right Padding;
276 var timeToPixel = availableWidth / (this._endTime - this._startTime); 297 var timeToPixel = availableWidth / (this._endTime - this._startTime);
277 return Math.floor(this._leftPadding + (time - this._startTime) * timeToP ixel); 298 return Math.floor(this._leftPadding + (time - this._startTime) * timeToP ixel);
278 }, 299 },
279 300
280 _draw: function() 301 _draw: function()
281 { 302 {
303 var useTimingBars = !WebInspector.moduleSetting("networkColorCodeResourc eTypes").get() && !this._networkLogView.calculator().startAtZero;
282 var requests = this._requestData; 304 var requests = this._requestData;
283 var context = this._canvas.getContext("2d"); 305 var context = this._canvas.getContext("2d");
284 context.save(); 306 context.save();
285 context.scale(window.devicePixelRatio, window.devicePixelRatio); 307 context.scale(window.devicePixelRatio, window.devicePixelRatio);
286 context.translate(0, this._networkLogView.headerHeight()); 308 context.translate(0, this._networkLogView.headerHeight());
287 context.rect(0, 0, this._offsetWidth, this._offsetHeight); 309 context.rect(0, 0, this._offsetWidth, this._offsetHeight);
288 context.clip(); 310 context.clip();
289 var rowHeight = this._networkLogView.rowHeight(); 311 var rowHeight = this._networkLogView.rowHeight();
290 var scrollTop = this._vScrollElement.scrollTop; 312 var scrollTop = this._vScrollElement.scrollTop;
291 var firstRequestIndex = Math.floor(scrollTop / rowHeight); 313 var firstRequestIndex = Math.floor(scrollTop / rowHeight);
292 var lastRequestIndex = Math.min(requests.length, firstRequestIndex + Mat h.ceil(this._offsetHeight / rowHeight)); 314 var lastRequestIndex = Math.min(requests.length, firstRequestIndex + Mat h.ceil(this._offsetHeight / rowHeight));
293 for (var i = firstRequestIndex; i < lastRequestIndex; i++) { 315 for (var i = firstRequestIndex; i < lastRequestIndex; i++) {
294 var rowOffset = rowHeight * i; 316 var rowOffset = rowHeight * i;
295 var request = requests[i]; 317 var request = requests[i];
296 this._decorateRow(context, request, i, rowOffset - scrollTop, rowHei ght); 318 this._decorateRow(context, request, i, rowOffset - scrollTop, rowHei ght);
297 var ranges = WebInspector.RequestTimingView.calculateRequestTimeRang es(request, 0); 319 if (useTimingBars)
298 for (var range of ranges) { 320 this._drawTimingBars(context, request, rowOffset - scrollTop);
299 if (range.name === WebInspector.RequestTimeRangeNames.Total || 321 else
300 range.name === WebInspector.RequestTimeRangeNames.Sending || 322 this._drawSimplifiedBars(context, request, rowOffset - scrollTop );
301 range.end - range.start === 0)
302 continue;
303 this._drawBar(context, range, rowOffset - scrollTop);
304 }
305 } 323 }
306 context.restore(); 324 context.restore();
307 this._drawDividers(context); 325 this._drawDividers(context);
308 }, 326 },
309 327
310 _drawDividers: function(context) 328 _drawDividers: function(context)
311 { 329 {
312 context.save(); 330 context.save();
313 /** @const */ 331 /** @const */
314 var minGridSlicePx = 64; // minimal distance between grid lines. 332 var minGridSlicePx = 64; // minimal distance between grid lines.
315 /** @const */
316 var fontSize = 10;
317 333
318 var drawableWidth = this._offsetWidth - this._leftPadding - this._rightP adding; 334 var drawableWidth = this._offsetWidth - this._leftPadding - this._rightP adding;
319 var timelineDuration = this._timelineDuration(); 335 var timelineDuration = this._timelineDuration();
320 var dividersCount = drawableWidth / minGridSlicePx; 336 var dividersCount = drawableWidth / minGridSlicePx;
321 var gridSliceTime = timelineDuration / dividersCount; 337 var gridSliceTime = timelineDuration / dividersCount;
322 var pixelsPerTime = drawableWidth / timelineDuration; 338 var pixelsPerTime = drawableWidth / timelineDuration;
323 339
324 // Align gridSliceTime to a nearest round value. 340 // Align gridSliceTime to a nearest round value.
325 // We allow spans that fit into the formula: span = (1|2|5)x10^n, 341 // We allow spans that fit into the formula: span = (1|2|5)x10^n,
326 // e.g.: ... .1 .2 .5 1 2 5 10 20 50 ... 342 // e.g.: ... .1 .2 .5 1 2 5 10 20 50 ...
327 // After a span has been chosen make grid lines at multiples of the span . 343 // After a span has been chosen make grid lines at multiples of the span .
328 344
329 var logGridSliceTime = Math.ceil(Math.log(gridSliceTime) / Math.LN10); 345 var logGridSliceTime = Math.ceil(Math.log(gridSliceTime) / Math.LN10);
330 gridSliceTime = Math.pow(10, logGridSliceTime); 346 gridSliceTime = Math.pow(10, logGridSliceTime);
331 if (gridSliceTime * pixelsPerTime >= 5 * minGridSlicePx) 347 if (gridSliceTime * pixelsPerTime >= 5 * minGridSlicePx)
332 gridSliceTime = gridSliceTime / 5; 348 gridSliceTime = gridSliceTime / 5;
333 if (gridSliceTime * pixelsPerTime >= 2 * minGridSlicePx) 349 if (gridSliceTime * pixelsPerTime >= 2 * minGridSlicePx)
334 gridSliceTime = gridSliceTime / 2; 350 gridSliceTime = gridSliceTime / 2;
335 351
336 context.lineWidth = 1; 352 context.lineWidth = 1;
337 context.strokeStyle = "rgba(0, 0, 0, .1)"; 353 context.strokeStyle = "rgba(0, 0, 0, .1)";
338 context.font = fontSize + "px sans-serif"; 354 context.font = this._fontSize + "px sans-serif";
339 context.fillStyle = "#444" 355 context.fillStyle = "#444"
340 gridSliceTime = gridSliceTime; 356 gridSliceTime = gridSliceTime;
341 for (var position = gridSliceTime * pixelsPerTime; position < drawableWi dth; position += gridSliceTime * pixelsPerTime) { 357 for (var position = gridSliceTime * pixelsPerTime; position < drawableWi dth; position += gridSliceTime * pixelsPerTime) {
342 // Added .5 because canvas drawing points are between pixels. 358 // Added .5 because canvas drawing points are between pixels.
343 var drawPosition = Math.floor(position) + this._leftPadding + .5; 359 var drawPosition = Math.floor(position) + this._leftPadding + .5;
344 context.beginPath(); 360 context.beginPath();
345 context.moveTo(drawPosition, 0); 361 context.moveTo(drawPosition, 0);
346 context.lineTo(drawPosition, this._offsetHeight); 362 context.lineTo(drawPosition, this._offsetHeight);
347 context.stroke(); 363 context.stroke();
348 if (position <= gridSliceTime * pixelsPerTime) 364 if (position <= gridSliceTime * pixelsPerTime)
349 continue; 365 continue;
350 var textData = Number.secondsToString(position / pixelsPerTime); 366 var textData = Number.secondsToString(position / pixelsPerTime);
351 context.fillText(textData, drawPosition - context.measureText(textDa ta).width - 2, Math.floor(this._networkLogView.headerHeight() - fontSize / 2)); 367 context.fillText(textData, drawPosition - context.measureText(textDa ta).width - 2, Math.floor(this._networkLogView.headerHeight() - this._fontSize / 2));
352 } 368 }
353 context.restore(); 369 context.restore();
354 }, 370 },
355 371
356 /** 372 /**
357 * @return {number} 373 * @return {number}
358 */ 374 */
359 _timelineDuration: function() 375 _timelineDuration: function()
360 { 376 {
361 return this._networkLogView.calculator().maximumBoundary() - this._netwo rkLogView.calculator().minimumBoundary(); 377 return this._networkLogView.calculator().maximumBoundary() - this._netwo rkLogView.calculator().minimumBoundary();
362 }, 378 },
363 379
364 /** 380 /**
365 * @param {!WebInspector.RequestTimeRangeNames} type 381 * @param {!WebInspector.RequestTimeRangeNames=} type
366 * @return {number} 382 * @return {number}
367 */ 383 */
368 _getBarHeight: function(type) 384 _getBarHeight: function(type)
369 { 385 {
370 var types = WebInspector.RequestTimeRangeNames; 386 var types = WebInspector.RequestTimeRangeNames;
371 switch (type) { 387 switch (type) {
372 case types.Connecting: 388 case types.Connecting:
373 case types.SSL: 389 case types.SSL:
374 case types.DNS: 390 case types.DNS:
375 case types.Proxy: 391 case types.Proxy:
376 case types.Blocking: 392 case types.Blocking:
377 case types.Push: 393 case types.Push:
378 case types.Queueing: 394 case types.Queueing:
379 return 7; 395 return 7;
380 default: 396 default:
381 return 13; 397 return 13;
382 } 398 }
383 }, 399 },
384 400
385 /** 401 /**
402 * @param {!WebInspector.NetworkRequest} request
403 * @return {string}
404 */
405 _borderColorForResourceType: function(request)
406 {
407 var resourceType = request.resourceType();
408 if (this._borderColorsForResourceTypeCache.has(resourceType))
409 return this._borderColorsForResourceTypeCache.get(resourceType);
410 var colorsForResourceType = WebInspector.NetworkTimelineColumn._colorsFo rResourceType;
411 var color = colorsForResourceType[resourceType] || colorsForResourceType .Other;
412 var parsedColor = WebInspector.Color.parse(color);
413 var hsla = parsedColor.hsla();
414 hsla[1] /= 2;
415 hsla[2] -= Math.min(hsla[2], 0.2);
416 var resultColor = /** @type {string} */ (parsedColor.asString(null))
dgozman 2016/10/19 19:52:33 semicolon
417 this._borderColorsForResourceTypeCache.set(resourceType, resultColor);
418 return resultColor;
419 },
420
421 /**
386 * @param {!CanvasRenderingContext2D} context 422 * @param {!CanvasRenderingContext2D} context
387 * @param {!WebInspector.RequestTimeRange} range 423 * @param {!WebInspector.NetworkRequest} request
424 * @return {string|!CanvasGradient}
425 */
426 _colorForResourceType: function(context, request)
427 {
428 var colorsForResourceType = WebInspector.NetworkTimelineColumn._colorsFo rResourceType;
429 var resourceType = request.resourceType();
430 var color = colorsForResourceType[resourceType] || colorsForResourceType .Other;
431 if (request.cached())
432 return color;
433
434 if (this._colorsForResourceTypeCache.has(color))
435 return this._colorsForResourceTypeCache.get(color);
436 var parsedColor = WebInspector.Color.parse(color);
437 var hsla = parsedColor.hsla();
438 hsla[1] -= Math.min(hsla[1], 0.28);
439 hsla[2] -= Math.min(hsla[2], 0.15);
440 var gradient = context.createLinearGradient(0, 0, 0, this._getBarHeight( ));
441 gradient.addColorStop(0, color);
442 gradient.addColorStop(1, /** @type {string} */ (parsedColor.asString(nul l)));
443 this._colorsForResourceTypeCache.set(color, gradient);
444 return gradient;
445 },
446
447 /**
448 * @param {!CanvasRenderingContext2D} context
449 * @param {!WebInspector.NetworkRequest} request
388 * @param {number} y 450 * @param {number} y
389 */ 451 */
390 _drawBar: function(context, range, y) 452 _drawSimplifiedBars: function(context, request, y)
391 { 453 {
454 /** @const */
455 var borderWidth = 1;
456
392 context.save(); 457 context.save();
458 var calculator = this._networkLogView.calculator();
459 var percentages = calculator.computeBarGraphPercentages(request);
460 var drawWidth = this._offsetWidth - this._leftPadding - this._rightPaddi ng;
461 var borderOffset = borderWidth % 2 === 0 ? 0 : .5;
462 var start = this._leftPadding + Math.floor((percentages.start / 100) * d rawWidth) + borderOffset;
463 var mid = this._leftPadding + Math.floor((percentages.middle / 100) * dr awWidth) + borderOffset;
464 var end = this._leftPadding + Math.floor((percentages.end / 100) * drawW idth) + borderOffset;
465 var height = this._getBarHeight();
466 y += Math.floor(this._networkLogView.rowHeight() / 2 - height / 2 + bord erWidth) - borderWidth / 2;
467
468 context.translate(0, y);
469 context.fillStyle = this._colorForResourceType(context, request);
470 context.strokeStyle = this._borderColorForResourceType(request);
471 context.lineWidth = borderWidth;
472
393 context.beginPath(); 473 context.beginPath();
394 var lineWidth = 0; 474 context.globalAlpha = .5;
395 var color = this._colorForType(range.name); 475 context.rect(start, 0, mid - start, height - borderWidth);
396 var borderColor = color; 476 context.fill();
397 if (range.name === WebInspector.RequestTimeRangeNames.Queueing) { 477 context.stroke();
398 borderColor = "lightgrey"; 478
399 lineWidth = 2; 479 var barWidth = Math.max(2, end - mid);
480 context.beginPath();
481 context.globalAlpha = 1;
482 context.rect(mid, 0, barWidth, height - borderWidth);
483 context.fill();
484 context.stroke();
485
486 if (request === this._hoveredRequest) {
487 var labels = calculator.computeBarGraphLabels(request);
488 this._drawSimplifiedBarDetails(context, labels.left, labels.right, s tart, mid, mid + barWidth + borderOffset)
400 } 489 }
401 if (range.name === WebInspector.RequestTimeRangeNames.Receiving) 490
402 lineWidth = 2;
403 context.fillStyle = color;
404 var height = this._getBarHeight(range.name);
405 y += Math.floor(this._networkLogView.rowHeight() / 2 - height / 2) + lin eWidth / 2;
406 var start = this._timeToPosition(range.start);
407 var end = this._timeToPosition(range.end);
408 context.rect(start, y, end - start, height - lineWidth);
409 if (lineWidth) {
410 context.lineWidth = lineWidth;
411 context.strokeStyle = borderColor;
412 context.stroke();
413 }
414 context.fill();
415 context.restore(); 491 context.restore();
416 }, 492 },
417 493
494 /**
495 * @param {!CanvasRenderingContext2D} context
496 * @param {string} leftText
497 * @param {string} rightText
498 * @param {number} startX
499 * @param {number} midX
500 * @param {number} endX
501 */
502 _drawSimplifiedBarDetails: function(context, leftText, rightText, startX, mi dX, endX)
503 {
504 /** @const */
505 var barDotLineLength = 10;
506
507 context.save();
508 var height = this._getBarHeight();
509 var leftLabelWidth = context.measureText(leftText).width;
510 var rightLabelWidth = context.measureText(rightText).width;
511 context.fillStyle = "#444";
512 context.strokeStyle = "#444";
513 if (leftLabelWidth < midX - startX) {
514 var midBarX = startX + (midX - startX) / 2 - leftLabelWidth / 2;
515 context.fillText(leftText, midBarX, this._fontSize);
516 } else if (barDotLineLength + leftLabelWidth + this._leftPadding < start X) {
517 context.beginPath();
518 context.arc(startX, Math.floor(height / 2), 2, 0, 2 * Math.PI);
519 context.fill();
520 context.fillText(leftText, startX - leftLabelWidth - barDotLineLengt h - 1, this._fontSize);
521 context.beginPath();
522 context.lineWidth = 1;
523 context.moveTo(startX - barDotLineLength, Math.floor(height / 2));
524 context.lineTo(startX, Math.floor(height / 2));
525 context.stroke();
526 }
527
528 if (rightLabelWidth < endX - midX) {
529 var midBarX = midX + (endX - midX) / 2 - rightLabelWidth / 2;
530 context.fillText(rightText, midBarX, this._fontSize);
531 } else if (endX + barDotLineLength + rightLabelWidth < this._offsetWidth - this._leftPadding - this._rightPadding) {
532 context.beginPath();
533 context.arc(endX, Math.floor(height / 2), 2, 0, 2 * Math.PI);
534 context.fill();
535 context.fillText(rightText, endX + barDotLineLength + 1, this._fontS ize);
536 context.beginPath();
537 context.lineWidth = 1;
538 context.moveTo(endX, Math.floor(height / 2));
539 context.lineTo(endX + barDotLineLength, Math.floor(height / 2));
540 context.stroke();
541 }
542 context.restore();
543 },
544
545 /**
546 * @param {!CanvasRenderingContext2D} context
547 * @param {!WebInspector.NetworkRequest} request
548 * @param {number} y
549 */
550 _drawTimingBars: function(context, request, y)
551 {
552 context.save();
553 var ranges = WebInspector.RequestTimingView.calculateRequestTimeRanges(r equest, 0);
554 for (var range of ranges) {
555 if (range.name === WebInspector.RequestTimeRangeNames.Total ||
556 range.name === WebInspector.RequestTimeRangeNames.Sending ||
557 range.end - range.start === 0)
558 continue;
559 context.beginPath();
560 var lineWidth = 0;
561 var color = this._colorForType(range.name);
562 var borderColor = color;
563 if (range.name === WebInspector.RequestTimeRangeNames.Queueing) {
564 borderColor = "lightgrey";
565 lineWidth = 2;
566 }
567 if (range.name === WebInspector.RequestTimeRangeNames.Receiving)
568 lineWidth = 2;
569 context.fillStyle = color;
570 var height = this._getBarHeight(range.name);
571 var middleBarY = y + Math.floor(this._networkLogView.rowHeight() / 2 - height / 2) + lineWidth / 2;
572 var start = this._timeToPosition(range.start);
573 var end = this._timeToPosition(range.end);
574 context.rect(start, middleBarY, end - start, height - lineWidth);
575 if (lineWidth) {
576 context.lineWidth = lineWidth;
577 context.strokeStyle = borderColor;
578 context.stroke();
579 }
580 context.fill();
581 }
582 context.restore();
583 },
584
418 /** 585 /**
419 * @param {!CanvasRenderingContext2D} context 586 * @param {!CanvasRenderingContext2D} context
420 * @param {!WebInspector.NetworkRequest} request 587 * @param {!WebInspector.NetworkRequest} request
421 * @param {number} rowNumber 588 * @param {number} rowNumber
422 * @param {number} y 589 * @param {number} y
423 * @param {number} rowHeight 590 * @param {number} rowHeight
424 */ 591 */
425 _decorateRow: function(context, request, rowNumber, y, rowHeight) 592 _decorateRow: function(context, request, rowNumber, y, rowHeight)
426 { 593 {
427 if (rowNumber % 2 === 1 && this._hoveredRequest !== request) 594 if (rowNumber % 2 === 1 && this._hoveredRequest !== request)
428 return; 595 return;
429 context.save(); 596 context.save();
430 context.beginPath(); 597 context.beginPath();
431 var color = this._rowStripeColor; 598 var color = this._rowStripeColor;
432 if (this._hoveredRequest === request) 599 if (this._hoveredRequest === request)
433 color = this._rowHoverColor; 600 color = this._rowHoverColor;
434 601
435 context.fillStyle = color; 602 context.fillStyle = color;
436 context.rect(0, y, this._offsetWidth, rowHeight); 603 context.rect(0, y, this._offsetWidth, rowHeight);
437 context.fill(); 604 context.fill();
438 context.restore(); 605 context.restore();
439 }, 606 },
440 607
441 __proto__: WebInspector.VBox.prototype 608 __proto__: WebInspector.VBox.prototype
442 } 609 }
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/devtools/front_end/network/networkLogView.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698