OLD | NEW |
---|---|
1 /** | 1 /** |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
84 this._windowLeft = 0.0; | 84 this._windowLeft = 0.0; |
85 this._windowRight = 1.0; | 85 this._windowRight = 1.0; |
86 this._timeWindowLeft = 0; | 86 this._timeWindowLeft = 0; |
87 this._timeWindowRight = Infinity; | 87 this._timeWindowRight = Infinity; |
88 this._rangeSelectionStart = 0; | 88 this._rangeSelectionStart = 0; |
89 this._rangeSelectionEnd = 0; | 89 this._rangeSelectionEnd = 0; |
90 this._barHeight = 17; | 90 this._barHeight = 17; |
91 this._textBaseline = 5; | 91 this._textBaseline = 5; |
92 this._textPadding = 5; | 92 this._textPadding = 5; |
93 this._paddingLeft = 0; | 93 this._paddingLeft = 0; |
94 var markerPadding = 2; | 94 this._markerRadius = 6; |
95 this._markerRadius = this._barHeight / 2 - markerPadding; | |
96 | 95 |
97 /** @const */ | 96 /** @const */ |
98 this._headerLeftPadding = 6; | 97 this._headerLeftPadding = 6; |
99 /** @const */ | 98 /** @const */ |
100 this._arrowSide = 8; | 99 this._arrowSide = 8; |
101 /** @const */ | 100 /** @const */ |
102 this._expansionArrowIndent = this._headerLeftPadding + this._arrowSide / 2; | 101 this._expansionArrowIndent = this._headerLeftPadding + this._arrowSide / 2; |
103 /** @const */ | 102 /** @const */ |
104 this._headerLabelXPadding = 3; | 103 this._headerLabelXPadding = 3; |
105 /** @const */ | 104 /** @const */ |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
203 if (!timelineData) | 202 if (!timelineData) |
204 return; | 203 return; |
205 // Think in terms of not where we are, but where we'll be after animation (i f present) | 204 // Think in terms of not where we are, but where we'll be after animation (i f present) |
206 var timeLeft = this._cancelWindowTimesAnimation ? this._pendingAnimationTime Left : this._timeWindowLeft; | 205 var timeLeft = this._cancelWindowTimesAnimation ? this._pendingAnimationTime Left : this._timeWindowLeft; |
207 var timeRight = this._cancelWindowTimesAnimation ? this._pendingAnimationTim eRight : this._timeWindowRight; | 206 var timeRight = this._cancelWindowTimesAnimation ? this._pendingAnimationTim eRight : this._timeWindowRight; |
208 var entryStartTime = timelineData.entryStartTimes[entryIndex]; | 207 var entryStartTime = timelineData.entryStartTimes[entryIndex]; |
209 var entryTotalTime = timelineData.entryTotalTimes[entryIndex]; | 208 var entryTotalTime = timelineData.entryTotalTimes[entryIndex]; |
210 var entryEndTime = entryStartTime + entryTotalTime; | 209 var entryEndTime = entryStartTime + entryTotalTime; |
211 var minEntryTimeWindow = Math.min(entryTotalTime, timeRight - timeLeft); | 210 var minEntryTimeWindow = Math.min(entryTotalTime, timeRight - timeLeft); |
212 | 211 |
213 var y = this._levelToHeight(timelineData.entryLevels[entryIndex]); | 212 var level = timelineData.entryLevels[entryIndex]; |
214 this.setScrollOffset(y, this._barHeight); | 213 this.setScrollOffset(this._levelToOffset(level), this._levelHeight(level)); |
215 | 214 |
216 var minVisibleWidthPx = 30; | 215 var minVisibleWidthPx = 30; |
217 var futurePixelToTime = (timeRight - timeLeft) / this._offsetWidth; | 216 var futurePixelToTime = (timeRight - timeLeft) / this._offsetWidth; |
218 minEntryTimeWindow = Math.max(minEntryTimeWindow, futurePixelToTime * minVis ibleWidthPx); | 217 minEntryTimeWindow = Math.max(minEntryTimeWindow, futurePixelToTime * minVis ibleWidthPx); |
219 if (timeLeft > entryEndTime) { | 218 if (timeLeft > entryEndTime) { |
220 var delta = timeLeft - entryEndTime + minEntryTimeWindow; | 219 var delta = timeLeft - entryEndTime + minEntryTimeWindow; |
221 this._flameChartDelegate.requestWindowTimes(timeLeft - delta, timeRight - delta); | 220 this._flameChartDelegate.requestWindowTimes(timeLeft - delta, timeRight - delta); |
222 } else if (timeRight < entryStartTime) { | 221 } else if (timeRight < entryStartTime) { |
223 var delta = entryStartTime - timeRight + minEntryTimeWindow; | 222 var delta = entryStartTime - timeRight + minEntryTimeWindow; |
224 this._flameChartDelegate.requestWindowTimes(timeLeft + delta, timeRight + delta); | 223 this._flameChartDelegate.requestWindowTimes(timeLeft + delta, timeRight + delta); |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
455 return -1; | 454 return -1; |
456 y += this.getScrollOffset(); | 455 y += this.getScrollOffset(); |
457 var timelineData = this._timelineData(); | 456 var timelineData = this._timelineData(); |
458 if (!timelineData) | 457 if (!timelineData) |
459 return -1; | 458 return -1; |
460 var cursorTime = this._cursorTime(x); | 459 var cursorTime = this._cursorTime(x); |
461 var cursorLevel = this._visibleLevelOffsets.upperBound(y) - 1; | 460 var cursorLevel = this._visibleLevelOffsets.upperBound(y) - 1; |
462 if (cursorLevel < 0 || !this._visibleLevels[cursorLevel]) | 461 if (cursorLevel < 0 || !this._visibleLevels[cursorLevel]) |
463 return -1; | 462 return -1; |
464 var offsetFromLevel = y - this._visibleLevelOffsets[cursorLevel]; | 463 var offsetFromLevel = y - this._visibleLevelOffsets[cursorLevel]; |
465 if (offsetFromLevel > this._barHeight) | 464 if (offsetFromLevel > this._levelHeight(cursorLevel)) |
466 return -1; | 465 return -1; |
467 var entryStartTimes = timelineData.entryStartTimes; | 466 var entryStartTimes = timelineData.entryStartTimes; |
468 var entryTotalTimes = timelineData.entryTotalTimes; | 467 var entryTotalTimes = timelineData.entryTotalTimes; |
469 var entryIndexes = this._timelineLevels[cursorLevel]; | 468 var entryIndexes = this._timelineLevels[cursorLevel]; |
470 if (!entryIndexes || !entryIndexes.length) | 469 if (!entryIndexes || !entryIndexes.length) |
471 return -1; | 470 return -1; |
472 | 471 |
473 /** | 472 /** |
474 * @param {number} time | 473 * @param {number} time |
475 * @param {number} entryIndex | 474 * @param {number} entryIndex |
476 * @return {number} | 475 * @return {number} |
477 */ | 476 */ |
478 function comparator(time, entryIndex) { | 477 function comparator(time, entryIndex) { |
479 return time - entryStartTimes[entryIndex]; | 478 return time - entryStartTimes[entryIndex]; |
480 } | 479 } |
481 var indexOnLevel = Math.max(entryIndexes.upperBound(cursorTime, comparator) - 1, 0); | 480 var indexOnLevel = Math.max(entryIndexes.upperBound(cursorTime, comparator) - 1, 0); |
482 | 481 |
483 /** | 482 /** |
484 * @this {PerfUI.FlameChart} | 483 * @this {PerfUI.FlameChart} |
485 * @param {number} entryIndex | 484 * @param {number} entryIndex |
486 * @return {boolean} | 485 * @return {boolean} |
487 */ | 486 */ |
488 function checkEntryHit(entryIndex) { | 487 function checkEntryHit(entryIndex) { |
489 if (entryIndex === undefined) | 488 if (entryIndex === undefined) |
490 return false; | 489 return false; |
491 var startTime = entryStartTimes[entryIndex]; | 490 var startTime = entryStartTimes[entryIndex]; |
492 var duration = entryTotalTimes[entryIndex]; | 491 var duration = entryTotalTimes[entryIndex]; |
493 if (isNaN(duration)) { | 492 if (isNaN(duration)) { |
494 var dx = (startTime - cursorTime) / this._pixelToTime; | 493 var dx = (startTime - cursorTime) / this._pixelToTime; |
495 var dy = this._barHeight / 2 - offsetFromLevel; | 494 var dy = this._levelHeight(cursorLevel) / 2 - offsetFromLevel; |
496 return dx * dx + dy * dy < this._markerRadius * this._markerRadius; | 495 return dx * dx + dy * dy < this._markerRadius * this._markerRadius; |
497 } | 496 } |
498 var endTime = startTime + duration; | 497 var endTime = startTime + duration; |
499 var barThreshold = 3 * this._pixelToTime; | 498 var barThreshold = 3 * this._pixelToTime; |
500 return startTime - barThreshold < cursorTime && cursorTime < endTime + bar Threshold; | 499 return startTime - barThreshold < cursorTime && cursorTime < endTime + bar Threshold; |
501 } | 500 } |
502 | 501 |
503 var entryIndex = entryIndexes[indexOnLevel]; | 502 var entryIndex = entryIndexes[indexOnLevel]; |
504 if (checkEntryHit.call(this, entryIndex)) | 503 if (checkEntryHit.call(this, entryIndex)) |
505 return entryIndex; | 504 return entryIndex; |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
589 var timeWindowRight = this._timeWindowRight; | 588 var timeWindowRight = this._timeWindowRight; |
590 var timeWindowLeft = this._timeWindowLeft - this._paddingLeft / this._timeTo Pixel; | 589 var timeWindowLeft = this._timeWindowLeft - this._paddingLeft / this._timeTo Pixel; |
591 var entryTotalTimes = timelineData.entryTotalTimes; | 590 var entryTotalTimes = timelineData.entryTotalTimes; |
592 var entryStartTimes = timelineData.entryStartTimes; | 591 var entryStartTimes = timelineData.entryStartTimes; |
593 var entryLevels = timelineData.entryLevels; | 592 var entryLevels = timelineData.entryLevels; |
594 | 593 |
595 var titleIndices = []; | 594 var titleIndices = []; |
596 var markerIndices = []; | 595 var markerIndices = []; |
597 var textPadding = this._textPadding; | 596 var textPadding = this._textPadding; |
598 var minTextWidth = 2 * textPadding + UI.measureTextWidth(context, '\u2026'); | 597 var minTextWidth = 2 * textPadding + UI.measureTextWidth(context, '\u2026'); |
599 var barHeight = this._barHeight; | |
600 var minVisibleBarLevel = Math.max(this._visibleLevelOffsets.upperBound(top) - 1, 0); | 598 var minVisibleBarLevel = Math.max(this._visibleLevelOffsets.upperBound(top) - 1, 0); |
601 | 599 |
602 /** @type {!Map<string, !Array<number>>} */ | 600 /** @type {!Map<string, !Array<number>>} */ |
603 var colorBuckets = new Map(); | 601 var colorBuckets = new Map(); |
604 for (var level = minVisibleBarLevel; level < this._dataProvider.maxStackDept h(); ++level) { | 602 for (var level = minVisibleBarLevel; level < this._dataProvider.maxStackDept h(); ++level) { |
605 if (this._levelToHeight(level) > top + height) | 603 if (this._levelToOffset(level) > top + height) |
606 break; | 604 break; |
607 if (!this._visibleLevels[level]) | 605 if (!this._visibleLevels[level]) |
608 continue; | 606 continue; |
609 | 607 |
610 // Entries are ordered by start time within a level, so find the last visi ble entry. | 608 // Entries are ordered by start time within a level, so find the last visi ble entry. |
611 var levelIndexes = this._timelineLevels[level]; | 609 var levelIndexes = this._timelineLevels[level]; |
612 var rightIndexOnLevel = | 610 var rightIndexOnLevel = |
613 levelIndexes.lowerBound(timeWindowRight, (time, entryIndex) => time - entryStartTimes[entryIndex]) - 1; | 611 levelIndexes.lowerBound(timeWindowRight, (time, entryIndex) => time - entryStartTimes[entryIndex]) - 1; |
614 var lastDrawOffset = Infinity; | 612 var lastDrawOffset = Infinity; |
615 for (var entryIndexOnLevel = rightIndexOnLevel; entryIndexOnLevel >= 0; -- entryIndexOnLevel) { | 613 for (var entryIndexOnLevel = rightIndexOnLevel; entryIndexOnLevel >= 0; -- entryIndexOnLevel) { |
(...skipping 25 matching lines...) Expand all Loading... | |
641 var color = colors[c]; | 639 var color = colors[c]; |
642 var indexes = colorBuckets.get(color); | 640 var indexes = colorBuckets.get(color); |
643 context.beginPath(); | 641 context.beginPath(); |
644 context.fillStyle = color; | 642 context.fillStyle = color; |
645 for (var i = 0; i < indexes.length; ++i) { | 643 for (var i = 0; i < indexes.length; ++i) { |
646 var entryIndex = indexes[i]; | 644 var entryIndex = indexes[i]; |
647 var entryStartTime = entryStartTimes[entryIndex]; | 645 var entryStartTime = entryStartTimes[entryIndex]; |
648 var barX = this._timeToPositionClipped(entryStartTime); | 646 var barX = this._timeToPositionClipped(entryStartTime); |
649 var duration = entryTotalTimes[entryIndex]; | 647 var duration = entryTotalTimes[entryIndex]; |
650 var barLevel = entryLevels[entryIndex]; | 648 var barLevel = entryLevels[entryIndex]; |
651 var barY = this._levelToHeight(barLevel); | 649 var barHeight = this._levelHeight(barLevel); |
650 var barY = this._levelToOffset(barLevel); | |
652 if (isNaN(duration)) { | 651 if (isNaN(duration)) { |
653 context.moveTo(barX + this._markerRadius, barY + barHeight / 2); | 652 context.moveTo(barX + this._markerRadius, barY + barHeight / 2); |
654 context.arc(barX, barY + barHeight / 2, this._markerRadius, 0, Math.PI * 2); | 653 context.arc(barX, barY + barHeight / 2, this._markerRadius, 0, Math.PI * 2); |
655 markerIndices.push(entryIndex); | 654 markerIndices.push(entryIndex); |
656 continue; | 655 continue; |
657 } | 656 } |
658 var barRight = this._timeToPositionClipped(entryStartTime + duration); | 657 var barRight = this._timeToPositionClipped(entryStartTime + duration); |
659 var barWidth = Math.max(barRight - barX, 1); | 658 var barWidth = Math.max(barRight - barX, 1); |
660 context.rect(barX, barY, barWidth - 0.4, barHeight - 1); | 659 context.rect(barX, barY, barWidth - 0.4, barHeight - 1); |
661 if (barWidth > minTextWidth || this._dataProvider.forceDecoration(entryI ndex)) | 660 if (barWidth > minTextWidth || this._dataProvider.forceDecoration(entryI ndex)) |
662 titleIndices.push(entryIndex); | 661 titleIndices.push(entryIndex); |
663 } | 662 } |
664 context.fill(); | 663 context.fill(); |
665 } | 664 } |
666 | 665 |
667 context.strokeStyle = 'rgba(0, 0, 0, 0.2)'; | 666 context.strokeStyle = 'rgba(0, 0, 0, 0.2)'; |
668 context.beginPath(); | 667 context.beginPath(); |
669 for (var m = 0; m < markerIndices.length; ++m) { | 668 for (var m = 0; m < markerIndices.length; ++m) { |
670 var entryIndex = markerIndices[m]; | 669 var entryIndex = markerIndices[m]; |
671 var entryStartTime = entryStartTimes[entryIndex]; | 670 var entryStartTime = entryStartTimes[entryIndex]; |
672 var barX = this._timeToPositionClipped(entryStartTime); | 671 var barX = this._timeToPositionClipped(entryStartTime); |
673 var barLevel = entryLevels[entryIndex]; | 672 var barLevel = entryLevels[entryIndex]; |
674 var barY = this._levelToHeight(barLevel); | 673 var y = this._levelToOffset(barLevel) + this._levelHeight(barLevel) / 2; |
675 context.moveTo(barX + this._markerRadius, barY + barHeight / 2); | 674 context.moveTo(barX + this._markerRadius, y); |
676 context.arc(barX, barY + barHeight / 2, this._markerRadius, 0, Math.PI * 2 ); | 675 context.arc(barX, y, this._markerRadius, 0, Math.PI * 2); |
677 } | 676 } |
678 context.stroke(); | 677 context.stroke(); |
679 | 678 |
680 context.textBaseline = 'alphabetic'; | 679 context.textBaseline = 'alphabetic'; |
681 var textBaseHeight = this._barHeight - this._textBaseline; | |
682 | |
683 for (var i = 0; i < titleIndices.length; ++i) { | 680 for (var i = 0; i < titleIndices.length; ++i) { |
684 var entryIndex = titleIndices[i]; | 681 var entryIndex = titleIndices[i]; |
685 var entryStartTime = entryStartTimes[entryIndex]; | 682 var entryStartTime = entryStartTimes[entryIndex]; |
686 var barX = this._timeToPositionClipped(entryStartTime); | 683 var barX = this._timeToPositionClipped(entryStartTime); |
687 var barRight = Math.min(this._timeToPositionClipped(entryStartTime + entry TotalTimes[entryIndex]), width) + 1; | 684 var barRight = Math.min(this._timeToPositionClipped(entryStartTime + entry TotalTimes[entryIndex]), width) + 1; |
688 var barWidth = barRight - barX; | 685 var barWidth = barRight - barX; |
689 var barLevel = entryLevels[entryIndex]; | 686 var barLevel = entryLevels[entryIndex]; |
690 var barY = this._levelToHeight(barLevel); | 687 var barY = this._levelToOffset(barLevel); |
691 var text = this._dataProvider.entryTitle(entryIndex); | 688 var text = this._dataProvider.entryTitle(entryIndex); |
692 if (text && text.length) { | 689 if (text && text.length) { |
693 context.font = this._dataProvider.entryFont(entryIndex) || defaultFont; | 690 context.font = this._dataProvider.entryFont(entryIndex) || defaultFont; |
694 text = UI.trimTextMiddle(context, text, barWidth - 2 * textPadding); | 691 text = UI.trimTextMiddle(context, text, barWidth - 2 * textPadding); |
695 } | 692 } |
696 var unclippedBarX = this._timeToPosition(entryStartTime); | 693 var unclippedBarX = this._timeToPosition(entryStartTime); |
694 var barHeight = this._levelHeight(barLevel); | |
697 if (this._dataProvider.decorateEntry( | 695 if (this._dataProvider.decorateEntry( |
698 entryIndex, context, text, barX, barY, barWidth, barHeight, unclip pedBarX, this._timeToPixel)) | 696 entryIndex, context, text, barX, barY, barWidth, barHeight, unclip pedBarX, this._timeToPixel)) |
699 continue; | 697 continue; |
700 if (!text || !text.length) | 698 if (!text || !text.length) |
701 continue; | 699 continue; |
702 context.fillStyle = this._dataProvider.textColor(entryIndex); | 700 context.fillStyle = this._dataProvider.textColor(entryIndex); |
703 context.fillText(text, barX + textPadding, barY + textBaseHeight); | 701 context.fillText(text, barX + textPadding, barY + barHeight - this._textBa seline); |
704 } | 702 } |
705 | 703 |
706 context.restore(); | 704 context.restore(); |
707 | 705 |
708 this._drawGroupHeaders(width, height); | 706 this._drawGroupHeaders(width, height); |
709 this._drawFlowEvents(context, width, height); | 707 this._drawFlowEvents(context, width, height); |
710 this._drawMarkers(); | 708 this._drawMarkers(); |
711 var headerHeight = this._rulerEnabled ? PerfUI.FlameChart.HeaderHeight : 0; | 709 var headerHeight = this._rulerEnabled ? PerfUI.FlameChart.HeaderHeight : 0; |
712 PerfUI.TimelineGrid.drawCanvasGrid(context, this._calculator, 3, headerHeigh t); | 710 PerfUI.TimelineGrid.drawCanvasGrid(context, this._calculator, 3, headerHeigh t); |
713 | 711 |
714 this._updateElementPosition(this._highlightElement, this._highlightedEntryIn dex); | 712 this._updateElementPosition(this._highlightElement, this._highlightedEntryIn dex); |
715 this._updateElementPosition(this._selectedElement, this._selectedEntryIndex) ; | 713 this._updateElementPosition(this._selectedElement, this._selectedEntryIndex) ; |
716 this._updateMarkerHighlight(); | 714 this._updateMarkerHighlight(); |
717 } | 715 } |
718 | 716 |
719 /** | 717 /** |
720 * @param {number} width | 718 * @param {number} width |
721 * @param {number} height | 719 * @param {number} height |
722 */ | 720 */ |
723 _drawGroupHeaders(width, height) { | 721 _drawGroupHeaders(width, height) { |
724 var context = /** @type {!CanvasRenderingContext2D} */ (this._canvas.getCont ext('2d')); | 722 var context = /** @type {!CanvasRenderingContext2D} */ (this._canvas.getCont ext('2d')); |
725 var top = this.getScrollOffset(); | 723 var top = this.getScrollOffset(); |
726 var ratio = window.devicePixelRatio; | 724 var ratio = window.devicePixelRatio; |
727 var barHeight = this._barHeight; | |
728 var textBaseHeight = barHeight - this._textBaseline; | |
729 var groups = this._rawTimelineData.groups || []; | 725 var groups = this._rawTimelineData.groups || []; |
730 if (!groups.length) | 726 if (!groups.length) |
731 return; | 727 return; |
732 | 728 |
733 var groupOffsets = this._groupOffsets; | 729 var groupOffsets = this._groupOffsets; |
734 var lastGroupOffset = Array.prototype.peekLast.call(groupOffsets); | 730 var lastGroupOffset = Array.prototype.peekLast.call(groupOffsets); |
735 var colorUsage = UI.ThemeSupport.ColorUsage; | 731 var colorUsage = UI.ThemeSupport.ColorUsage; |
736 | 732 |
737 context.save(); | 733 context.save(); |
738 context.scale(ratio, ratio); | 734 context.scale(ratio, ratio); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
778 }); | 774 }); |
779 | 775 |
780 context.save(); | 776 context.save(); |
781 forEachGroup.call(this, (offset, index, group) => { | 777 forEachGroup.call(this, (offset, index, group) => { |
782 context.font = group.style.font; | 778 context.font = group.style.font; |
783 if (this._isGroupCollapsible(index) && !group.expanded || group.style.shar eHeaderLine) { | 779 if (this._isGroupCollapsible(index) && !group.expanded || group.style.shar eHeaderLine) { |
784 var width = this._labelWidthForGroup(context, group) + 2; | 780 var width = this._labelWidthForGroup(context, group) + 2; |
785 context.fillStyle = Common.Color.parse(group.style.backgroundColor).setA lpha(0.8).asString(null); | 781 context.fillStyle = Common.Color.parse(group.style.backgroundColor).setA lpha(0.8).asString(null); |
786 context.fillRect( | 782 context.fillRect( |
787 this._headerLeftPadding - this._headerLabelXPadding, offset + this._ headerLabelYPadding, width, | 783 this._headerLeftPadding - this._headerLabelXPadding, offset + this._ headerLabelYPadding, width, |
788 barHeight - 2 * this._headerLabelYPadding); | 784 group.style.height - 2 * this._headerLabelYPadding); |
789 } | 785 } |
790 context.fillStyle = group.style.color; | 786 context.fillStyle = group.style.color; |
791 context.fillText( | 787 context.fillText( |
792 group.name, Math.floor(this._expansionArrowIndent * (group.style.nesti ngLevel + 1) + this._arrowSide), | 788 group.name, Math.floor(this._expansionArrowIndent * (group.style.nesti ngLevel + 1) + this._arrowSide), |
793 offset + textBaseHeight); | 789 offset + group.style.height - this._textBaseline); |
794 }); | 790 }); |
795 context.restore(); | 791 context.restore(); |
796 | 792 |
797 context.fillStyle = UI.themeSupport.patchColorText('#6e6e6e', colorUsage.For eground); | 793 context.fillStyle = UI.themeSupport.patchColorText('#6e6e6e', colorUsage.For eground); |
798 context.beginPath(); | 794 context.beginPath(); |
799 forEachGroup.call(this, (offset, index, group) => { | 795 forEachGroup.call(this, (offset, index, group) => { |
800 if (this._isGroupCollapsible(index)) { | 796 if (this._isGroupCollapsible(index)) { |
801 drawExpansionArrow.call( | 797 drawExpansionArrow.call( |
802 this, this._expansionArrowIndent * (group.style.nestingLevel + 1), | 798 this, this._expansionArrowIndent * (group.style.nestingLevel + 1), |
803 offset + textBaseHeight - this._arrowSide / 2, !!group.expanded); | 799 offset + group.style.height - this._textBaseline - this._arrowSide / 2, !!group.expanded); |
804 } | 800 } |
805 }); | 801 }); |
806 context.fill(); | 802 context.fill(); |
807 | 803 |
808 context.strokeStyle = UI.themeSupport.patchColorText('#ddd', colorUsage.Back ground); | 804 context.strokeStyle = UI.themeSupport.patchColorText('#ddd', colorUsage.Back ground); |
809 context.beginPath(); | 805 context.beginPath(); |
810 context.stroke(); | 806 context.stroke(); |
811 | 807 |
812 context.restore(); | 808 context.restore(); |
813 | 809 |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
877 /** | 873 /** |
878 * @param {!PerfUI.FlameChart.Group} group | 874 * @param {!PerfUI.FlameChart.Group} group |
879 * @param {number} y | 875 * @param {number} y |
880 * @param {number} endLevel | 876 * @param {number} endLevel |
881 */ | 877 */ |
882 _drawCollapsedOverviewForGroup(group, y, endLevel) { | 878 _drawCollapsedOverviewForGroup(group, y, endLevel) { |
883 var range = new Common.SegmentedRange(mergeCallback); | 879 var range = new Common.SegmentedRange(mergeCallback); |
884 var timeWindowRight = this._timeWindowRight; | 880 var timeWindowRight = this._timeWindowRight; |
885 var timeWindowLeft = this._timeWindowLeft - this._paddingLeft / this._timeTo Pixel; | 881 var timeWindowLeft = this._timeWindowLeft - this._paddingLeft / this._timeTo Pixel; |
886 var context = /** @type {!CanvasRenderingContext2D} */ (this._canvas.getCont ext('2d')); | 882 var context = /** @type {!CanvasRenderingContext2D} */ (this._canvas.getCont ext('2d')); |
887 var barHeight = this._barHeight - 1; | 883 var barHeight = group.style.height; |
888 var entryStartTimes = this._rawTimelineData.entryStartTimes; | 884 var entryStartTimes = this._rawTimelineData.entryStartTimes; |
889 var entryTotalTimes = this._rawTimelineData.entryTotalTimes; | 885 var entryTotalTimes = this._rawTimelineData.entryTotalTimes; |
890 | 886 |
891 for (var level = group.startLevel; level < endLevel; ++level) { | 887 for (var level = group.startLevel; level < endLevel; ++level) { |
892 var levelIndexes = this._timelineLevels[level]; | 888 var levelIndexes = this._timelineLevels[level]; |
893 var rightIndexOnLevel = | 889 var rightIndexOnLevel = |
894 levelIndexes.lowerBound(timeWindowRight, (time, entryIndex) => time - entryStartTimes[entryIndex]) - 1; | 890 levelIndexes.lowerBound(timeWindowRight, (time, entryIndex) => time - entryStartTimes[entryIndex]) - 1; |
895 var lastDrawOffset = Infinity; | 891 var lastDrawOffset = Infinity; |
896 | 892 |
897 for (var entryIndexOnLevel = rightIndexOnLevel; entryIndexOnLevel >= 0; -- entryIndexOnLevel) { | 893 for (var entryIndexOnLevel = rightIndexOnLevel; entryIndexOnLevel >= 0; -- entryIndexOnLevel) { |
898 var entryIndex = levelIndexes[entryIndexOnLevel]; | 894 var entryIndex = levelIndexes[entryIndexOnLevel]; |
899 var entryStartTime = entryStartTimes[entryIndex]; | 895 var entryStartTime = entryStartTimes[entryIndex]; |
900 var barX = this._timeToPositionClipped(entryStartTime); | 896 var barX = this._timeToPositionClipped(entryStartTime); |
901 var entryEndTime = entryStartTime + entryTotalTimes[entryIndex]; | 897 var entryEndTime = entryStartTime + entryTotalTimes[entryIndex]; |
902 if (isNaN(entryEndTime) || barX >= lastDrawOffset) | 898 if (isNaN(entryEndTime) || barX >= lastDrawOffset) |
903 continue; | 899 continue; |
904 if (entryEndTime <= timeWindowLeft) | 900 if (entryEndTime <= timeWindowLeft) |
905 break; | 901 break; |
906 lastDrawOffset = barX; | 902 lastDrawOffset = barX; |
907 var color = this._dataProvider.entryColor(entryIndex); | 903 var color = this._dataProvider.entryColor(entryIndex); |
908 var endBarX = this._timeToPositionClipped(entryEndTime); | 904 var endBarX = this._timeToPositionClipped(entryEndTime); |
909 if (group.style.useDecoratorsForOverview && this._dataProvider.forceDeco ration(entryIndex)) { | 905 if (group.style.useDecoratorsForOverview && this._dataProvider.forceDeco ration(entryIndex)) { |
910 var unclippedBarX = this._timeToPosition(entryStartTime); | 906 var unclippedBarX = this._timeToPosition(entryStartTime); |
911 var barWidth = endBarX - barX; | 907 var barWidth = endBarX - barX; |
912 context.beginPath(); | 908 context.beginPath(); |
913 context.fillStyle = color; | 909 context.fillStyle = color; |
914 context.fillRect(barX, y, barWidth, barHeight); | 910 context.fillRect(barX, y, barWidth, barHeight - 1); |
915 this._dataProvider.decorateEntry( | 911 this._dataProvider.decorateEntry( |
916 entryIndex, context, '', barX, y, barWidth, this._barHeight, uncli ppedBarX, this._timeToPixel); | 912 entryIndex, context, '', barX, y, barWidth, barHeight, unclippedBa rX, this._timeToPixel); |
917 continue; | 913 continue; |
918 } | 914 } |
919 range.append(new Common.Segment(barX, endBarX, color)); | 915 range.append(new Common.Segment(barX, endBarX, color)); |
920 } | 916 } |
921 } | 917 } |
922 | 918 |
923 var segments = range.segments().slice().sort((a, b) => a.data.localeCompare( b.data)); | 919 var segments = range.segments().slice().sort((a, b) => a.data.localeCompare( b.data)); |
924 var lastColor; | 920 var lastColor; |
925 context.beginPath(); | 921 context.beginPath(); |
926 for (var i = 0; i < segments.length; ++i) { | 922 for (var i = 0; i < segments.length; ++i) { |
927 var segment = segments[i]; | 923 var segment = segments[i]; |
928 if (lastColor !== segments[i].data) { | 924 if (lastColor !== segments[i].data) { |
929 context.fill(); | 925 context.fill(); |
930 context.beginPath(); | 926 context.beginPath(); |
931 lastColor = segments[i].data; | 927 lastColor = segments[i].data; |
932 context.fillStyle = lastColor; | 928 context.fillStyle = lastColor; |
933 } | 929 } |
934 context.rect(segment.begin, y, segment.end - segment.begin, barHeight); | 930 context.rect(segment.begin, y, segment.end - segment.begin, barHeight - 1) ; |
935 } | 931 } |
936 context.fill(); | 932 context.fill(); |
937 | 933 |
938 /** | 934 /** |
939 * @param {!Common.Segment} a | 935 * @param {!Common.Segment} a |
940 * @param {!Common.Segment} b | 936 * @param {!Common.Segment} b |
941 * @return {?Common.Segment} | 937 * @return {?Common.Segment} |
942 */ | 938 */ |
943 function mergeCallback(a, b) { | 939 function mergeCallback(a, b) { |
944 return a.data === b.data && a.end + 0.4 > b.end ? a : null; | 940 return a.data === b.data && a.end + 0.4 > b.end ? a : null; |
(...skipping 17 matching lines...) Expand all Loading... | |
962 context.strokeStyle = '#7f5050'; | 958 context.strokeStyle = '#7f5050'; |
963 var td = this._timelineData(); | 959 var td = this._timelineData(); |
964 var endIndex = td.flowStartTimes.lowerBound(this._timeWindowRight); | 960 var endIndex = td.flowStartTimes.lowerBound(this._timeWindowRight); |
965 | 961 |
966 context.lineWidth = 0.5; | 962 context.lineWidth = 0.5; |
967 for (var i = 0; i < endIndex; ++i) { | 963 for (var i = 0; i < endIndex; ++i) { |
968 if (!td.flowEndTimes[i] || td.flowEndTimes[i] < this._timeWindowLeft) | 964 if (!td.flowEndTimes[i] || td.flowEndTimes[i] < this._timeWindowLeft) |
969 continue; | 965 continue; |
970 var startX = this._timeToPosition(td.flowStartTimes[i]); | 966 var startX = this._timeToPosition(td.flowStartTimes[i]); |
971 var endX = this._timeToPosition(td.flowEndTimes[i]); | 967 var endX = this._timeToPosition(td.flowEndTimes[i]); |
972 var startY = this._levelToHeight(td.flowStartLevels[i]) + this._barHeight / 2; | 968 var startLevel = td.flowStartLevels[i]; |
973 var endY = this._levelToHeight(td.flowEndLevels[i]) + this._barHeight / 2; | 969 var endLevel = td.flowEndLevels[i]; |
970 var startY = this._levelToOffset(startLevel) + this._levelHeight(startLeve l) / 2; | |
971 var endY = this._levelToOffset(endLevel) + this._levelHeight(endLevel) / 2 ; | |
974 | 972 |
975 | 973 |
976 var segment = Math.min((endX - startX) / 4, 40); | 974 var segment = Math.min((endX - startX) / 4, 40); |
977 var distanceTime = td.flowEndTimes[i] - td.flowStartTimes[i]; | 975 var distanceTime = td.flowEndTimes[i] - td.flowStartTimes[i]; |
978 var distanceY = (endY - startY) / 10; | 976 var distanceY = (endY - startY) / 10; |
979 var spread = 30; | 977 var spread = 30; |
980 var lineY = distanceTime < 1 ? startY : spread + Math.max(0, startY + dist anceY * (i % spread)); | 978 var lineY = distanceTime < 1 ? startY : spread + Math.max(0, startY + dist anceY * (i % spread)); |
981 | 979 |
982 var p = []; | 980 var p = []; |
983 p.push({x: startX, y: startY}); | 981 p.push({x: startX, y: startY}); |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1084 groups[i].expanded = expanded; | 1082 groups[i].expanded = expanded; |
1085 } | 1083 } |
1086 this._updateLevelPositions(); | 1084 this._updateLevelPositions(); |
1087 this._updateHeight(); | 1085 this._updateHeight(); |
1088 } | 1086 } |
1089 | 1087 |
1090 _updateLevelPositions() { | 1088 _updateLevelPositions() { |
1091 var levelCount = this._dataProvider.maxStackDepth(); | 1089 var levelCount = this._dataProvider.maxStackDepth(); |
1092 var groups = this._rawTimelineData.groups || []; | 1090 var groups = this._rawTimelineData.groups || []; |
1093 this._visibleLevelOffsets = new Uint32Array(levelCount + 1); | 1091 this._visibleLevelOffsets = new Uint32Array(levelCount + 1); |
1092 this._visibleLevelHeights = new Uint32Array(levelCount); | |
1094 this._visibleLevels = new Uint16Array(levelCount); | 1093 this._visibleLevels = new Uint16Array(levelCount); |
1095 this._groupOffsets = new Uint32Array(groups.length + 1); | 1094 this._groupOffsets = new Uint32Array(groups.length + 1); |
1096 | 1095 |
1097 var groupIndex = -1; | 1096 var groupIndex = -1; |
1098 var currentOffset = this._rulerEnabled ? PerfUI.FlameChart.HeaderHeight : 2; | 1097 var currentOffset = this._rulerEnabled ? PerfUI.FlameChart.HeaderHeight : 2; |
1099 var visible = true; | 1098 var visible = true; |
1100 /** @type !Array<{nestingLevel: number, visible: boolean}> */ | 1099 /** @type !Array<{nestingLevel: number, visible: boolean}> */ |
1101 var groupStack = [{nestingLevel: -1, visible: true}]; | 1100 var groupStack = [{nestingLevel: -1, visible: true}]; |
1102 var lastGroupLevel = Math.max(levelCount, groups.length ? groups.peekLast(). startLevel + 1 : 0); | 1101 var lastGroupLevel = Math.max(levelCount, groups.length ? groups.peekLast(). startLevel + 1 : 0); |
1103 for (var level = 0; level < lastGroupLevel; ++level) { | 1102 for (var level = 0; level < lastGroupLevel; ++level) { |
(...skipping 12 matching lines...) Expand all Loading... | |
1116 groupStack.push({nestingLevel: style.nestingLevel, visible: visible}); | 1115 groupStack.push({nestingLevel: style.nestingLevel, visible: visible}); |
1117 if (parentGroupIsVisible) | 1116 if (parentGroupIsVisible) |
1118 currentOffset += nextLevel ? 0 : style.padding; | 1117 currentOffset += nextLevel ? 0 : style.padding; |
1119 this._groupOffsets[groupIndex] = currentOffset; | 1118 this._groupOffsets[groupIndex] = currentOffset; |
1120 if (parentGroupIsVisible && !style.shareHeaderLine) | 1119 if (parentGroupIsVisible && !style.shareHeaderLine) |
1121 currentOffset += style.height; | 1120 currentOffset += style.height; |
1122 } | 1121 } |
1123 var isFirstOnLevel = groupIndex >= 0 && level === groups[groupIndex].start Level; | 1122 var isFirstOnLevel = groupIndex >= 0 && level === groups[groupIndex].start Level; |
1124 var thisLevelIsVisible = visible || isFirstOnLevel && groups[groupIndex].s tyle.useFirstLineForOverview; | 1123 var thisLevelIsVisible = visible || isFirstOnLevel && groups[groupIndex].s tyle.useFirstLineForOverview; |
1125 if (level < levelCount) { | 1124 if (level < levelCount) { |
1125 var height; | |
1126 if (groupIndex >= 0) { | |
1127 var style = groups[groupIndex].style; | |
1128 height = isFirstOnLevel ? style.height : style.itemsHeight || this._ba rHeight; | |
caseq
2017/05/01 22:19:30
nit: add parenthesis around last clause of ternary
alph
2017/05/02 01:20:20
Done.
| |
1129 } else { | |
1130 height = this._barHeight; | |
1131 } | |
1126 this._visibleLevels[level] = thisLevelIsVisible; | 1132 this._visibleLevels[level] = thisLevelIsVisible; |
1127 this._visibleLevelOffsets[level] = currentOffset; | 1133 this._visibleLevelOffsets[level] = currentOffset; |
1134 this._visibleLevelHeights[level] = height; | |
caseq
2017/05/01 22:19:30
this looks more like just this._levelHeight
alph
2017/05/02 01:20:20
Acknowledged.
| |
1128 } | 1135 } |
1129 if (thisLevelIsVisible || (parentGroupIsVisible && style.shareHeaderLine & & isFirstOnLevel)) | 1136 if (thisLevelIsVisible || (parentGroupIsVisible && style.shareHeaderLine & & isFirstOnLevel)) |
1130 currentOffset += this._barHeight; | 1137 currentOffset += this._visibleLevelHeights[level]; |
1131 } | 1138 } |
1132 if (groupIndex >= 0) | 1139 if (groupIndex >= 0) |
1133 this._groupOffsets[groupIndex + 1] = currentOffset; | 1140 this._groupOffsets[groupIndex + 1] = currentOffset; |
1134 this._visibleLevelOffsets[level] = currentOffset; | 1141 this._visibleLevelOffsets[level] = currentOffset; |
1135 } | 1142 } |
1136 | 1143 |
1137 /** | 1144 /** |
1138 * @param {number} index | 1145 * @param {number} index |
1139 */ | 1146 */ |
1140 _isGroupCollapsible(index) { | 1147 _isGroupCollapsible(index) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1177 var startTime = timelineData.entryStartTimes[entryIndex]; | 1184 var startTime = timelineData.entryStartTimes[entryIndex]; |
1178 var endTime = startTime + (timelineData.entryTotalTimes[entryIndex] || 0); | 1185 var endTime = startTime + (timelineData.entryTotalTimes[entryIndex] || 0); |
1179 var barX = this._timeToPositionClipped(startTime); | 1186 var barX = this._timeToPositionClipped(startTime); |
1180 var barRight = this._timeToPositionClipped(endTime); | 1187 var barRight = this._timeToPositionClipped(endTime); |
1181 if (barRight === 0 || barX === this._offsetWidth) | 1188 if (barRight === 0 || barX === this._offsetWidth) |
1182 return; | 1189 return; |
1183 var barWidth = barRight - barX; | 1190 var barWidth = barRight - barX; |
1184 var barCenter = barX + barWidth / 2; | 1191 var barCenter = barX + barWidth / 2; |
1185 barWidth = Math.max(barWidth, elementMinWidthPx); | 1192 barWidth = Math.max(barWidth, elementMinWidthPx); |
1186 barX = barCenter - barWidth / 2; | 1193 barX = barCenter - barWidth / 2; |
1187 var barY = this._levelToHeight(timelineData.entryLevels[entryIndex]) - this. getScrollOffset(); | 1194 var entryLevel = timelineData.entryLevels[entryIndex]; |
1195 var barY = this._levelToOffset(entryLevel) - this.getScrollOffset(); | |
1196 var barHeight = this._levelHeight(entryLevel); | |
1188 var style = element.style; | 1197 var style = element.style; |
1189 style.left = barX + 'px'; | 1198 style.left = barX + 'px'; |
1190 style.top = barY + 'px'; | 1199 style.top = barY + 'px'; |
1191 style.width = barWidth + 'px'; | 1200 style.width = barWidth + 'px'; |
1192 style.height = this._barHeight - 1 + 'px'; | 1201 style.height = barHeight - 1 + 'px'; |
1193 this.viewportElement.appendChild(element); | 1202 this.viewportElement.appendChild(element); |
1194 } | 1203 } |
1195 | 1204 |
1196 /** | 1205 /** |
1197 * @param {number} time | 1206 * @param {number} time |
1198 * @return {number} | 1207 * @return {number} |
1199 */ | 1208 */ |
1200 _timeToPositionClipped(time) { | 1209 _timeToPositionClipped(time) { |
1201 return Number.constrain(this._timeToPosition(time), 0, this._offsetWidth); | 1210 return Number.constrain(this._timeToPosition(time), 0, this._offsetWidth); |
1202 } | 1211 } |
1203 | 1212 |
1204 /** | 1213 /** |
1205 * @param {number} time | 1214 * @param {number} time |
1206 * @return {number} | 1215 * @return {number} |
1207 */ | 1216 */ |
1208 _timeToPosition(time) { | 1217 _timeToPosition(time) { |
1209 return Math.floor((time - this._minimumBoundary) * this._timeToPixel) - this ._pixelWindowLeft + this._paddingLeft; | 1218 return Math.floor((time - this._minimumBoundary) * this._timeToPixel) - this ._pixelWindowLeft + this._paddingLeft; |
1210 } | 1219 } |
1211 | 1220 |
1212 /** | 1221 /** |
1213 * @param {number} level | 1222 * @param {number} level |
1214 * @return {number} | 1223 * @return {number} |
1215 */ | 1224 */ |
1216 _levelToHeight(level) { | 1225 _levelToOffset(level) { |
1217 return this._visibleLevelOffsets[level]; | 1226 return this._visibleLevelOffsets[level]; |
1218 } | 1227 } |
1219 | 1228 |
1229 /** | |
1230 * @param {number} level | |
1231 * @return {number} | |
1232 */ | |
1233 _levelHeight(level) { | |
1234 return this._visibleLevelHeights[level]; | |
caseq
2017/05/01 22:19:30
nit: I wonder if we should just inline it.
alph
2017/05/02 01:20:20
I've done it the same way as _levelToOffset
| |
1235 } | |
1236 | |
1220 _updateBoundaries() { | 1237 _updateBoundaries() { |
1221 this._totalTime = this._dataProvider.totalTime(); | 1238 this._totalTime = this._dataProvider.totalTime(); |
1222 this._minimumBoundary = this._dataProvider.minimumBoundary(); | 1239 this._minimumBoundary = this._dataProvider.minimumBoundary(); |
1223 | 1240 |
1224 var windowWidth = 1; | 1241 var windowWidth = 1; |
1225 if (this._timeWindowRight !== Infinity) { | 1242 if (this._timeWindowRight !== Infinity) { |
1226 this._windowLeft = (this._timeWindowLeft - this._minimumBoundary) / this._ totalTime; | 1243 this._windowLeft = (this._timeWindowLeft - this._minimumBoundary) / this._ totalTime; |
1227 this._windowRight = (this._timeWindowRight - this._minimumBoundary) / this ._totalTime; | 1244 this._windowRight = (this._timeWindowRight - this._minimumBoundary) / this ._totalTime; |
1228 windowWidth = this._windowRight - this._windowLeft; | 1245 windowWidth = this._windowRight - this._windowLeft; |
1229 } else if (this._timeWindowLeft === Infinity) { | 1246 } else if (this._timeWindowLeft === Infinity) { |
1230 this._windowLeft = Infinity; | 1247 this._windowLeft = Infinity; |
1231 this._windowRight = Infinity; | 1248 this._windowRight = Infinity; |
1232 } else { | 1249 } else { |
1233 this._windowLeft = 0; | 1250 this._windowLeft = 0; |
1234 this._windowRight = 1; | 1251 this._windowRight = 1; |
1235 } | 1252 } |
1236 | 1253 |
1237 var totalPixels = Math.floor((this._offsetWidth - this._paddingLeft) / windo wWidth); | 1254 var totalPixels = Math.floor((this._offsetWidth - this._paddingLeft) / windo wWidth); |
1238 this._pixelWindowLeft = Math.floor(totalPixels * this._windowLeft); | 1255 this._pixelWindowLeft = Math.floor(totalPixels * this._windowLeft); |
1239 | 1256 |
1240 this._timeToPixel = totalPixels / this._totalTime; | 1257 this._timeToPixel = totalPixels / this._totalTime; |
1241 this._pixelToTime = this._totalTime / totalPixels; | 1258 this._pixelToTime = this._totalTime / totalPixels; |
1242 } | 1259 } |
1243 | 1260 |
1244 _updateHeight() { | 1261 _updateHeight() { |
1245 var height = this._levelToHeight(this._dataProvider.maxStackDepth()); | 1262 var height = this._levelToOffset(this._dataProvider.maxStackDepth()); |
1246 this.setContentHeight(height); | 1263 this.setContentHeight(height); |
1247 } | 1264 } |
1248 | 1265 |
1249 /** | 1266 /** |
1250 * @override | 1267 * @override |
1251 */ | 1268 */ |
1252 onResize() { | 1269 onResize() { |
1253 super.onResize(); | 1270 super.onResize(); |
1254 this.scheduleUpdate(); | 1271 this.scheduleUpdate(); |
1255 } | 1272 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1292 PerfUI.FlameChart.HeaderHeight = 15; | 1309 PerfUI.FlameChart.HeaderHeight = 15; |
1293 | 1310 |
1294 PerfUI.FlameChart.MinimalTimeWindowMs = 0.5; | 1311 PerfUI.FlameChart.MinimalTimeWindowMs = 0.5; |
1295 | 1312 |
1296 /** | 1313 /** |
1297 * @interface | 1314 * @interface |
1298 */ | 1315 */ |
1299 PerfUI.FlameChartDataProvider = function() {}; | 1316 PerfUI.FlameChartDataProvider = function() {}; |
1300 | 1317 |
1301 /** | 1318 /** |
1302 * @typedef {!{name: string, startLevel: number, expanded: (boolean|undefined), style: !PerfUI.FlameChart.GroupStyle}} | 1319 * @typedef {!{ |
1320 * name: string, | |
1321 * startLevel: number, | |
1322 * expanded: (boolean|undefined), | |
1323 * style: !PerfUI.FlameChart.GroupStyle | |
1324 * }} | |
1303 */ | 1325 */ |
1304 PerfUI.FlameChart.Group; | 1326 PerfUI.FlameChart.Group; |
1305 | 1327 |
1306 /** | 1328 /** |
1307 * @typedef {!{ | 1329 * @typedef {!{ |
1308 * height: number, | 1330 * height: number, |
1309 * padding: number, | 1331 * padding: number, |
1310 * collapsible: boolean, | 1332 * collapsible: boolean, |
1311 * font: string, | 1333 * font: string, |
1312 * color: string, | 1334 * color: string, |
1313 * backgroundColor: string, | 1335 * backgroundColor: string, |
1314 * nestingLevel: number, | 1336 * nestingLevel: number, |
1337 * itemsHeight: (number|undefined), | |
1315 * shareHeaderLine: (boolean|undefined), | 1338 * shareHeaderLine: (boolean|undefined), |
1316 * useFirstLineForOverview: (boolean|undefined), | 1339 * useFirstLineForOverview: (boolean|undefined), |
1317 * useDecoratorsForOverview: (boolean|undefined) | 1340 * useDecoratorsForOverview: (boolean|undefined) |
1318 * }} | 1341 * }} |
1319 */ | 1342 */ |
1320 PerfUI.FlameChart.GroupStyle; | 1343 PerfUI.FlameChart.GroupStyle; |
1321 | 1344 |
1322 /** | 1345 /** |
1323 * @unrestricted | 1346 * @unrestricted |
1324 */ | 1347 */ |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1600 } | 1623 } |
1601 | 1624 |
1602 /** | 1625 /** |
1603 * @override | 1626 * @override |
1604 * @return {number} | 1627 * @return {number} |
1605 */ | 1628 */ |
1606 boundarySpan() { | 1629 boundarySpan() { |
1607 return this._maximumBoundaries - this._minimumBoundaries; | 1630 return this._maximumBoundaries - this._minimumBoundaries; |
1608 } | 1631 } |
1609 }; | 1632 }; |
OLD | NEW |