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

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

Issue 2523633003: [Devtools] Prepare network log view for grouping support (Closed)
Patch Set: fixed request === null and possible filter out issue Created 4 years 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 // 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 * @unrestricted 5 * @unrestricted
6 */ 6 */
7 Network.NetworkWaterfallColumn = class extends UI.VBox { 7 Network.NetworkWaterfallColumn = class extends UI.VBox {
8 /** 8 /**
9 * @param {number} rowHeight 9 * @param {number} rowHeight
10 * @param {!Network.NetworkTimeCalculator} calculator 10 * @param {!Network.NetworkTimeCalculator} calculator
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 wasShown() { 72 wasShown() {
73 this.update(); 73 this.update();
74 } 74 }
75 75
76 /** 76 /**
77 * @param {!Element} element 77 * @param {!Element} element
78 * @param {!Event} event 78 * @param {!Event} event
79 * @return {!AnchorBox|undefined} 79 * @return {!AnchorBox|undefined}
80 */ 80 */
81 _getPopoverAnchor(element, event) { 81 _getPopoverAnchor(element, event) {
82 if (!this._hoveredNode) 82 var request = this._hoveredNode ? this._hoveredNode.request() : null;
83 if (!request)
83 return; 84 return;
84 var useTimingBars = !Common.moduleSetting('networkColorCodeResourceTypes').g et() && !this._calculator.startAtZero; 85 var useTimingBars = !Common.moduleSetting('networkColorCodeResourceTypes').g et() && !this._calculator.startAtZero;
85 if (useTimingBars) { 86 if (useTimingBars) {
86 var range = Network.RequestTimingView.calculateRequestTimeRanges(this._hov eredNode.request(), 0) 87 var range = Network.RequestTimingView.calculateRequestTimeRanges(request, 0)
87 .find(data => data.name === Network.RequestTimeRangeNames. Total); 88 .find(data => data.name === Network.RequestTimeRangeNames. Total);
88 var start = this._timeToPosition(range.start); 89 var start = this._timeToPosition(range.start);
89 var end = this._timeToPosition(range.end); 90 var end = this._timeToPosition(range.end);
90 } else { 91 } else {
91 var range = this._getSimplifiedBarRange(this._hoveredNode, 0); 92 var range = this._getSimplifiedBarRange(request, 0);
92 var start = range.start; 93 var start = range.start;
93 var end = range.end; 94 var end = range.end;
94 } 95 }
95 96
96 if (end - start < 50) { 97 if (end - start < 50) {
97 var halfWidth = (end - start) / 2; 98 var halfWidth = (end - start) / 2;
98 start = start + halfWidth - 25; 99 start = start + halfWidth - 25;
99 end = end - halfWidth + 25; 100 end = end - halfWidth + 25;
100 } 101 }
101 102
(...skipping 13 matching lines...) Expand all
115 anchorBox.width = end - start; 116 anchorBox.width = end - start;
116 anchorBox.height = barHeight; 117 anchorBox.height = barHeight;
117 return anchorBox; 118 return anchorBox;
118 } 119 }
119 120
120 /** 121 /**
121 * @param {!Element|!AnchorBox} anchor 122 * @param {!Element|!AnchorBox} anchor
122 * @param {!UI.Popover} popover 123 * @param {!UI.Popover} popover
123 */ 124 */
124 _showPopover(anchor, popover) { 125 _showPopover(anchor, popover) {
125 if (!this._hoveredNode) 126 var request = this._hoveredNode ? this._hoveredNode.request() : null;
127 if (!request)
126 return; 128 return;
127 var content = 129 var content = Network.RequestTimingView.createTimingTable(request, this._cal culator.minimumBoundary());
128 Network.RequestTimingView.createTimingTable(this._hoveredNode.request(), this._calculator.minimumBoundary());
129 popover.showForAnchor(content, anchor); 130 popover.showForAnchor(content, anchor);
130 } 131 }
131 132
132 /** 133 /**
133 * @param {?Network.NetworkDataGridNode} node 134 * @param {?Network.NetworkDataGridNode} node
134 * @param {boolean} highlightInitiatorChain 135 * @param {boolean} highlightInitiatorChain
135 */ 136 */
136 setHoveredNode(node, highlightInitiatorChain) { 137 setHoveredNode(node, highlightInitiatorChain) {
137 this._hoveredNode = node; 138 this._hoveredNode = node;
138 this._initiatorGraph = (highlightInitiatorChain && node) ? node.request().in itiatorGraph() : null; 139 this._initiatorGraph = null;
140 var request = node ? node.request() : null;
141 if (highlightInitiatorChain && request)
142 this._initiatorGraph = request.initiatorGraph();
139 this.update(); 143 this.update();
140 } 144 }
141 145
142 /** 146 /**
143 * @param {number} height 147 * @param {number} height
144 */ 148 */
145 setRowHeight(height) { 149 setRowHeight(height) {
146 this._rowHeight = height; 150 this._rowHeight = height;
147 } 151 }
148 152
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 case types.Blocking: 350 case types.Blocking:
347 case types.Push: 351 case types.Push:
348 case types.Queueing: 352 case types.Queueing:
349 return 7; 353 return 7;
350 default: 354 default:
351 return 13; 355 return 13;
352 } 356 }
353 } 357 }
354 358
355 /** 359 /**
356 * @param {!Network.NetworkDataGridNode} node 360 * @param {!SDK.NetworkRequest} request
357 * @return {string} 361 * @return {string}
358 */ 362 */
359 _borderColorForResourceType(node) { 363 _borderColorForResourceType(request) {
360 var resourceType = node.request().resourceType(); 364 var resourceType = request.resourceType();
361 if (this._borderColorsForResourceTypeCache.has(resourceType)) 365 if (this._borderColorsForResourceTypeCache.has(resourceType))
362 return this._borderColorsForResourceTypeCache.get(resourceType); 366 return this._borderColorsForResourceTypeCache.get(resourceType);
363 var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourc eType; 367 var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourc eType;
364 var color = colorsForResourceType[resourceType] || colorsForResourceType.Oth er; 368 var color = colorsForResourceType[resourceType] || colorsForResourceType.Oth er;
365 var parsedColor = Common.Color.parse(color); 369 var parsedColor = Common.Color.parse(color);
366 var hsla = parsedColor.hsla(); 370 var hsla = parsedColor.hsla();
367 hsla[1] /= 2; 371 hsla[1] /= 2;
368 hsla[2] -= Math.min(hsla[2], 0.2); 372 hsla[2] -= Math.min(hsla[2], 0.2);
369 var resultColor = /** @type {string} */ (parsedColor.asString(null)); 373 var resultColor = /** @type {string} */ (parsedColor.asString(null));
370 this._borderColorsForResourceTypeCache.set(resourceType, resultColor); 374 this._borderColorsForResourceTypeCache.set(resourceType, resultColor);
371 return resultColor; 375 return resultColor;
372 } 376 }
373 377
374 /** 378 /**
375 * @param {!CanvasRenderingContext2D} context 379 * @param {!CanvasRenderingContext2D} context
376 * @param {!Network.NetworkDataGridNode} node 380 * @param {!SDK.NetworkRequest} request
377 * @return {string|!CanvasGradient} 381 * @return {string|!CanvasGradient}
378 */ 382 */
379 _colorForResourceType(context, node) { 383 _colorForResourceType(context, request) {
380 var request = node.request();
381 var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourc eType; 384 var colorsForResourceType = Network.NetworkWaterfallColumn._colorsForResourc eType;
382 var resourceType = request.resourceType(); 385 var resourceType = request.resourceType();
383 var color = colorsForResourceType[resourceType] || colorsForResourceType.Oth er; 386 var color = colorsForResourceType[resourceType] || colorsForResourceType.Oth er;
384 if (request.cached()) 387 if (request.cached())
385 return color; 388 return color;
386 389
387 if (this._colorsForResourceTypeCache.has(color)) 390 if (this._colorsForResourceTypeCache.has(color))
388 return this._colorsForResourceTypeCache.get(color); 391 return this._colorsForResourceTypeCache.get(color);
389 var parsedColor = Common.Color.parse(color); 392 var parsedColor = Common.Color.parse(color);
390 var hsla = parsedColor.hsla(); 393 var hsla = parsedColor.hsla();
391 hsla[1] -= Math.min(hsla[1], 0.28); 394 hsla[1] -= Math.min(hsla[1], 0.28);
392 hsla[2] -= Math.min(hsla[2], 0.15); 395 hsla[2] -= Math.min(hsla[2], 0.15);
393 var gradient = context.createLinearGradient(0, 0, 0, this._getBarHeight()); 396 var gradient = context.createLinearGradient(0, 0, 0, this._getBarHeight());
394 gradient.addColorStop(0, color); 397 gradient.addColorStop(0, color);
395 gradient.addColorStop(1, /** @type {string} */ (parsedColor.asString(null))) ; 398 gradient.addColorStop(1, /** @type {string} */ (parsedColor.asString(null))) ;
396 this._colorsForResourceTypeCache.set(color, gradient); 399 this._colorsForResourceTypeCache.set(color, gradient);
397 return gradient; 400 return gradient;
398 } 401 }
399 402
400 /** 403 /**
401 * @param {!Network.NetworkDataGridNode} node 404 * @param {!SDK.NetworkRequest} request
402 * @param {number} borderOffset 405 * @param {number} borderOffset
403 * @return {!{start: number, mid: number, end: number}} 406 * @return {!{start: number, mid: number, end: number}}
404 */ 407 */
405 _getSimplifiedBarRange(node, borderOffset) { 408 _getSimplifiedBarRange(request, borderOffset) {
406 var drawWidth = this._offsetWidth - this._leftPadding; 409 var drawWidth = this._offsetWidth - this._leftPadding;
407 var percentages = this._calculator.computeBarGraphPercentages(node.request() ); 410 var percentages = this._calculator.computeBarGraphPercentages(request);
408 return { 411 return {
409 start: this._leftPadding + Math.floor((percentages.start / 100) * drawWidt h) + borderOffset, 412 start: this._leftPadding + Math.floor((percentages.start / 100) * drawWidt h) + borderOffset,
410 mid: this._leftPadding + Math.floor((percentages.middle / 100) * drawWidth ) + borderOffset, 413 mid: this._leftPadding + Math.floor((percentages.middle / 100) * drawWidth ) + borderOffset,
411 end: this._leftPadding + Math.floor((percentages.end / 100) * drawWidth) + borderOffset 414 end: this._leftPadding + Math.floor((percentages.end / 100) * drawWidth) + borderOffset
412 }; 415 };
413 } 416 }
414 417
415 /** 418 /**
416 * @param {!CanvasRenderingContext2D} context 419 * @param {!CanvasRenderingContext2D} context
417 * @param {!Network.NetworkDataGridNode} node 420 * @param {!Network.NetworkDataGridNode} node
418 * @param {number} y 421 * @param {number} y
419 */ 422 */
420 _drawSimplifiedBars(context, node, y) { 423 _drawSimplifiedBars(context, node, y) {
424 var request = node.request();
425 if (!request)
426 return;
421 const borderWidth = 1; 427 const borderWidth = 1;
422 var borderOffset = borderWidth % 2 === 0 ? 0 : 0.5; 428 var borderOffset = borderWidth % 2 === 0 ? 0 : 0.5;
423 429
424 context.save(); 430 context.save();
425 var ranges = this._getSimplifiedBarRange(node, borderOffset); 431 var ranges = this._getSimplifiedBarRange(request, borderOffset);
426 var height = this._getBarHeight(); 432 var height = this._getBarHeight();
427 y += Math.floor(this._rowHeight / 2 - height / 2 + borderWidth) - borderWidt h / 2; 433 y += Math.floor(this._rowHeight / 2 - height / 2 + borderWidth) - borderWidt h / 2;
428 434
429 context.translate(0, y); 435 context.translate(0, y);
430 context.fillStyle = this._colorForResourceType(context, node); 436 context.fillStyle = this._colorForResourceType(context, request);
431 context.strokeStyle = this._borderColorForResourceType(node); 437 context.strokeStyle = this._borderColorForResourceType(request);
432 context.lineWidth = borderWidth; 438 context.lineWidth = borderWidth;
433 439
434 context.beginPath(); 440 context.beginPath();
435 context.globalAlpha = 0.5; 441 context.globalAlpha = 0.5;
436 context.rect(ranges.start, 0, ranges.mid - ranges.start, height - borderWidt h); 442 context.rect(ranges.start, 0, ranges.mid - ranges.start, height - borderWidt h);
437 context.fill(); 443 context.fill();
438 context.stroke(); 444 context.stroke();
439 445
440 var barWidth = Math.max(2, ranges.end - ranges.mid); 446 var barWidth = Math.max(2, ranges.end - ranges.mid);
441 context.beginPath(); 447 context.beginPath();
442 context.globalAlpha = 1; 448 context.globalAlpha = 1;
443 context.rect(ranges.mid, 0, barWidth, height - borderWidth); 449 context.rect(ranges.mid, 0, barWidth, height - borderWidth);
444 context.fill(); 450 context.fill();
445 context.stroke(); 451 context.stroke();
446 452
447 /** @type {?{left: string, right: string, tooltip: (string|undefined)}} */ 453 /** @type {?{left: string, right: string, tooltip: (string|undefined)}} */
448 var labels = null; 454 var labels = null;
449 if (node === this._hoveredNode) { 455 if (node === this._hoveredNode) {
450 labels = this._calculator.computeBarGraphLabels(node.request()); 456 labels = this._calculator.computeBarGraphLabels(request);
451 this._drawSimplifiedBarDetails( 457 this._drawSimplifiedBarDetails(
452 context, labels.left, labels.right, ranges.start, ranges.mid, ranges.m id + barWidth + borderOffset); 458 context, labels.left, labels.right, ranges.start, ranges.mid, ranges.m id + barWidth + borderOffset);
453 } 459 }
454 460
455 if (!this._calculator.startAtZero) { 461 if (!this._calculator.startAtZero) {
456 var queueingRange = Network.RequestTimingView.calculateRequestTimeRanges(n ode.request(), 0) 462 var queueingRange = Network.RequestTimingView.calculateRequestTimeRanges(r equest, 0)
457 .find(data => data.name === Network.RequestTimeRan geNames.Total); 463 .find(data => data.name === Network.RequestTimeRan geNames.Total);
458 var leftLabelWidth = labels ? context.measureText(labels.left).width : 0; 464 var leftLabelWidth = labels ? context.measureText(labels.left).width : 0;
459 var leftTextPlacedInBar = leftLabelWidth < ranges.mid - ranges.start; 465 var leftTextPlacedInBar = leftLabelWidth < ranges.mid - ranges.start;
460 const wiskerTextPadding = 13; 466 const wiskerTextPadding = 13;
461 var textOffset = (labels && !leftTextPlacedInBar) ? leftLabelWidth + wiske rTextPadding : 0; 467 var textOffset = (labels && !leftTextPlacedInBar) ? leftLabelWidth + wiske rTextPadding : 0;
462 var queueingStart = this._timeToPosition(queueingRange.start); 468 var queueingStart = this._timeToPosition(queueingRange.start);
463 if (ranges.start - textOffset > queueingStart) { 469 if (ranges.start - textOffset > queueingStart) {
464 context.beginPath(); 470 context.beginPath();
465 context.globalAlpha = 1; 471 context.globalAlpha = 1;
466 context.strokeStyle = UI.themeSupport.patchColor('#a5a5a5', UI.ThemeSupp ort.ColorUsage.Foreground); 472 context.strokeStyle = UI.themeSupport.patchColor('#a5a5a5', UI.ThemeSupp ort.ColorUsage.Foreground);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
526 } 532 }
527 context.restore(); 533 context.restore();
528 } 534 }
529 535
530 /** 536 /**
531 * @param {!CanvasRenderingContext2D} context 537 * @param {!CanvasRenderingContext2D} context
532 * @param {!Network.NetworkDataGridNode} node 538 * @param {!Network.NetworkDataGridNode} node
533 * @param {number} y 539 * @param {number} y
534 */ 540 */
535 _drawTimingBars(context, node, y) { 541 _drawTimingBars(context, node, y) {
542 var request = node.request();
543 if (!request)
544 return;
536 context.save(); 545 context.save();
537 var ranges = Network.RequestTimingView.calculateRequestTimeRanges(node.reque st(), 0); 546 var ranges = Network.RequestTimingView.calculateRequestTimeRanges(request, 0 );
538 for (var range of ranges) { 547 for (var range of ranges) {
539 if (range.name === Network.RequestTimeRangeNames.Total || range.name === N etwork.RequestTimeRangeNames.Sending || 548 if (range.name === Network.RequestTimeRangeNames.Total || range.name === N etwork.RequestTimeRangeNames.Sending ||
540 range.end - range.start === 0) 549 range.end - range.start === 0)
541 continue; 550 continue;
542 context.beginPath(); 551 context.beginPath();
543 var lineWidth = 0; 552 var lineWidth = 0;
544 var color = this._colorForType(range.name); 553 var color = this._colorForType(range.name);
545 var borderColor = color; 554 var borderColor = color;
546 if (range.name === Network.RequestTimeRangeNames.Queueing) { 555 if (range.name === Network.RequestTimeRangeNames.Queueing) {
547 borderColor = 'lightgrey'; 556 borderColor = 'lightgrey';
(...skipping 18 matching lines...) Expand all
566 } 575 }
567 576
568 /** 577 /**
569 * @param {!CanvasRenderingContext2D} context 578 * @param {!CanvasRenderingContext2D} context
570 * @param {!Network.NetworkDataGridNode} node 579 * @param {!Network.NetworkDataGridNode} node
571 * @param {number} rowNumber 580 * @param {number} rowNumber
572 * @param {number} y 581 * @param {number} y
573 */ 582 */
574 _decorateRow(context, node, rowNumber, y) { 583 _decorateRow(context, node, rowNumber, y) {
575 var isOddRow = rowNumber % 2 === 1; 584 var isOddRow = rowNumber % 2 === 1;
576 if (isOddRow && this._hoveredNode !== node && !node.isNavigationRequest() && !this._initiatorGraph) 585 if (isOddRow && this._hoveredNode !== node && !node.hasNavigationRequest() & & !this._initiatorGraph)
577 return; 586 return;
578 587
579 var color = getRowColor.call(this); 588 var color = getRowColor.call(this);
580 if (color === 'transparent') 589 if (color === 'transparent')
581 return; 590 return;
582 context.save(); 591 context.save();
583 context.beginPath(); 592 context.beginPath();
584 context.fillStyle = color; 593 context.fillStyle = color;
585 context.rect(0, y, this._offsetWidth, this._rowHeight); 594 context.rect(0, y, this._offsetWidth, this._rowHeight);
586 context.fill(); 595 context.fill();
587 context.restore(); 596 context.restore();
588 597
589 /** 598 /**
590 * @return {string} 599 * @return {string}
591 * @this {Network.NetworkWaterfallColumn} 600 * @this {Network.NetworkWaterfallColumn}
592 */ 601 */
593 function getRowColor() { 602 function getRowColor() {
594 var request = node.request();
595 if (this._hoveredNode === node) 603 if (this._hoveredNode === node)
596 return this._rowHoverColor; 604 return this._rowHoverColor;
597 if (this._initiatorGraph) { 605 var request = node.request();
606 if (request && this._initiatorGraph) {
598 if (this._initiatorGraph.initiators.has(request)) 607 if (this._initiatorGraph.initiators.has(request))
599 return this._parentInitiatorColor; 608 return this._parentInitiatorColor;
600 if (this._initiatorGraph.initiated.has(request)) 609 if (this._initiatorGraph.initiated.has(request))
601 return this._initiatedColor; 610 return this._initiatedColor;
602 } 611 }
603 if (node.isNavigationRequest()) 612 if (node.hasNavigationRequest())
604 return this._rowNavigationRequestColor; 613 return this._rowNavigationRequestColor;
605 if (rowNumber % 2 === 1) 614 if (rowNumber % 2 === 1)
606 return 'transparent'; 615 return 'transparent';
607 return this._rowStripeColor; 616 return this._rowStripeColor;
608 } 617 }
609 } 618 }
610 }; 619 };
611 620
612 Network.NetworkWaterfallColumn._colorsForResourceType = { 621 Network.NetworkWaterfallColumn._colorsForResourceType = {
613 document: 'hsl(215, 100%, 80%)', 622 document: 'hsl(215, 100%, 80%)',
614 font: 'hsl(8, 100%, 80%)', 623 font: 'hsl(8, 100%, 80%)',
615 media: 'hsl(90, 50%, 80%)', 624 media: 'hsl(90, 50%, 80%)',
616 image: 'hsl(90, 50%, 80%)', 625 image: 'hsl(90, 50%, 80%)',
617 script: 'hsl(31, 100%, 80%)', 626 script: 'hsl(31, 100%, 80%)',
618 stylesheet: 'hsl(272, 64%, 80%)', 627 stylesheet: 'hsl(272, 64%, 80%)',
619 texttrack: 'hsl(8, 100%, 80%)', 628 texttrack: 'hsl(8, 100%, 80%)',
620 websocket: 'hsl(0, 0%, 95%)', 629 websocket: 'hsl(0, 0%, 95%)',
621 xhr: 'hsl(53, 100%, 80%)', 630 xhr: 'hsl(53, 100%, 80%)',
622 other: 'hsl(0, 0%, 95%)' 631 other: 'hsl(0, 0%, 95%)'
623 }; 632 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698