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

Side by Side Diff: Source/devtools/front_end/FlameChart.js

Issue 183763036: TimelineFlameChart: selectRecord implementation (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebaselined Created 6 years, 9 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 | Annotate | Revision Log
OLDNEW
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 13 matching lines...) Expand all
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 /** 31 /**
32 * @interface 32 * @interface
33 */ 33 */
34 WebInspector.TimeRangeController = function() { } 34 WebInspector.FlameChartDelegate = function() { }
35 35
36 WebInspector.TimeRangeController.prototype = { 36 WebInspector.FlameChartDelegate.prototype = {
37 /** 37 /**
38 * @param {number} startTime 38 * @param {number} startTime
39 * @param {number} endTime 39 * @param {number} endTime
40 */ 40 */
41 requestWindowTimes: function(startTime, endTime) { } 41 requestWindowTimes: function(startTime, endTime) { },
42 } 42 }
43 43
44 /** 44 /**
45 * @constructor 45 * @constructor
46 * @extends {WebInspector.View} 46 * @extends {WebInspector.View}
47 * @param {!WebInspector.FlameChartDataProvider} dataProvider 47 * @param {!WebInspector.FlameChartDataProvider} dataProvider
48 */ 48 */
49 WebInspector.FlameChart = function(dataProvider) 49 WebInspector.FlameChart = function(dataProvider)
50 { 50 {
51 WebInspector.View.call(this); 51 WebInspector.View.call(this);
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 prepareHighlightedEntryInfo: function(entryIndex) { }, 153 prepareHighlightedEntryInfo: function(entryIndex) { },
154 154
155 /** 155 /**
156 * @param {number} entryIndex 156 * @param {number} entryIndex
157 * @return {boolean} 157 * @return {boolean}
158 */ 158 */
159 canJumpToEntry: function(entryIndex) { }, 159 canJumpToEntry: function(entryIndex) { },
160 160
161 /** 161 /**
162 * @param {number} entryIndex 162 * @param {number} entryIndex
163 * @return {?Object}
164 */
165 entryData: function(entryIndex) { },
166
167 /**
168 * @param {number} entryIndex
169 * @return {?string} 163 * @return {?string}
170 */ 164 */
171 entryTitle: function(entryIndex) { }, 165 entryTitle: function(entryIndex) { },
172 166
173 /** 167 /**
174 * @param {number} entryIndex 168 * @param {number} entryIndex
175 * @return {?string} 169 * @return {?string}
176 */ 170 */
177 entryFont: function(entryIndex) { }, 171 entryFont: function(entryIndex) { },
178 172
(...skipping 10 matching lines...) Expand all
189 textColor: function(entryIndex) { }, 183 textColor: function(entryIndex) { },
190 184
191 /** 185 /**
192 * @return {number} 186 * @return {number}
193 */ 187 */
194 textBaseline: function() { }, 188 textBaseline: function() { },
195 189
196 /** 190 /**
197 * @return {number} 191 * @return {number}
198 */ 192 */
199 textPadding: function() { } 193 textPadding: function() { },
194
195 /**
196 * @return {!{startTimeOffset: number, endTimeOffset: number}}
197 */
198 highlightTimeRange: function(entryIndex) { }
200 } 199 }
201 200
202 /** 201 /**
203 * @constructor 202 * @constructor
204 * @implements {WebInspector.TimelineGrid.Calculator} 203 * @implements {WebInspector.TimelineGrid.Calculator}
205 */ 204 */
206 WebInspector.FlameChart.Calculator = function() 205 WebInspector.FlameChart.Calculator = function()
207 { 206 {
208 this._paddingLeft = 0; 207 this._paddingLeft = 0;
209 } 208 }
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
416 _createColor: function(index, sat) 415 _createColor: function(index, sat)
417 { 416 {
418 var hue = (index * 7 + 12 * (index % 2)) % 360; 417 var hue = (index * 7 + 12 * (index % 2)) % 360;
419 return "hsla(" + hue + ", " + sat + "%, 66%, 0.7)"; 418 return "hsla(" + hue + ", " + sat + "%, 66%, 0.7)";
420 } 419 }
421 } 420 }
422 421
423 /** 422 /**
424 * @constructor 423 * @constructor
425 * @extends {WebInspector.View} 424 * @extends {WebInspector.View}
426 * @implements {WebInspector.TimeRangeController} 425 * @implements {WebInspector.FlameChartDelegate}
427 * @param {!WebInspector.FlameChartDataProvider} dataProvider 426 * @param {!WebInspector.FlameChartDataProvider} dataProvider
428 */ 427 */
429 WebInspector.FlameChart.OverviewPane = function(dataProvider) 428 WebInspector.FlameChart.OverviewPane = function(dataProvider)
430 { 429 {
431 WebInspector.View.call(this); 430 WebInspector.View.call(this);
432 this.element.classList.add("flame-chart-overview-pane"); 431 this.element.classList.add("flame-chart-overview-pane");
433 this._overviewContainer = this.element.createChild("div", "overview-containe r"); 432 this._overviewContainer = this.element.createChild("div", "overview-containe r");
434 this._overviewGrid = new WebInspector.OverviewGrid("flame-chart"); 433 this._overviewGrid = new WebInspector.OverviewGrid("flame-chart");
435 this._overviewGrid.element.classList.add("fill"); 434 this._overviewGrid.element.classList.add("fill");
436 this._overviewCanvas = this._overviewContainer.createChild("canvas", "flame- chart-overview-canvas"); 435 this._overviewCanvas = this._overviewContainer.createChild("canvas", "flame- chart-overview-canvas");
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 context.lineTo(canvasWidth + 1, canvasHeight - 1); 567 context.lineTo(canvasWidth + 1, canvasHeight - 1);
569 context.fill(); 568 context.fill();
570 context.stroke(); 569 context.stroke();
571 context.closePath(); 570 context.closePath();
572 } 571 }
573 572
574 /** 573 /**
575 * @constructor 574 * @constructor
576 * @extends {WebInspector.View} 575 * @extends {WebInspector.View}
577 * @param {!WebInspector.FlameChartDataProvider} dataProvider 576 * @param {!WebInspector.FlameChartDataProvider} dataProvider
578 * @param {!WebInspector.TimeRangeController} timeRangeController 577 * @param {!WebInspector.FlameChartDelegate} flameChartDelegate
579 * @param {boolean} isTopDown 578 * @param {boolean} isTopDown
580 * @param {boolean} timeBasedWindow 579 * @param {boolean} timeBasedWindow
581 */ 580 */
582 WebInspector.FlameChart.MainPane = function(dataProvider, timeRangeController, i sTopDown, timeBasedWindow) 581 WebInspector.FlameChart.MainPane = function(dataProvider, flameChartDelegate, is TopDown, timeBasedWindow)
583 { 582 {
584 WebInspector.View.call(this); 583 WebInspector.View.call(this);
585 this.element.classList.add("flame-chart-main-pane"); 584 this.element.classList.add("flame-chart-main-pane");
586 this._timeRangeController = timeRangeController; 585 this._flameChartDelegate = flameChartDelegate;
587 this._isTopDown = isTopDown; 586 this._isTopDown = isTopDown;
588 this._timeBasedWindow = timeBasedWindow; 587 this._timeBasedWindow = timeBasedWindow;
589 588
590 this._timelineGrid = new WebInspector.TimelineGrid(); 589 this._timelineGrid = new WebInspector.TimelineGrid();
591 this.element.appendChild(this._timelineGrid.element); 590 this.element.appendChild(this._timelineGrid.element);
592 this._calculator = new WebInspector.FlameChart.Calculator(); 591 this._calculator = new WebInspector.FlameChart.Calculator();
593 592
594 this._canvas = this.element.createChild("canvas"); 593 this._canvas = this.element.createChild("canvas");
595 this._canvas.addEventListener("mousemove", this._onMouseMove.bind(this)); 594 this._canvas.addEventListener("mousemove", this._onMouseMove.bind(this));
596 this._canvas.addEventListener("mousewheel", this._onMouseWheel.bind(this), f alse); 595 this._canvas.addEventListener("mousewheel", this._onMouseWheel.bind(this), f alse);
597 this._canvas.addEventListener("click", this._onClick.bind(this), false); 596 this._canvas.addEventListener("click", this._onClick.bind(this), false);
598 WebInspector.installDragHandle(this._canvas, this._startCanvasDragging.bind( this), this._canvasDragging.bind(this), this._endCanvasDragging.bind(this), "mov e", null); 597 WebInspector.installDragHandle(this._canvas, this._startCanvasDragging.bind( this), this._canvasDragging.bind(this), this._endCanvasDragging.bind(this), "mov e", null);
599 598
600 this._entryInfo = this.element.createChild("div", "profile-entry-info"); 599 this._entryInfo = this.element.createChild("div", "profile-entry-info");
601 this._highlightElement = this.element.createChild("div", "flame-chart-highli ght-element"); 600 this._highlightElement = this.element.createChild("div", "flame-chart-highli ght-element");
601 this._selectedElement = this.element.createChild("div", "flame-chart-selecte d-element");
602 602
603 this._dataProvider = dataProvider; 603 this._dataProvider = dataProvider;
604 604
605 this._windowLeft = 0.0; 605 this._windowLeft = 0.0;
606 this._windowRight = 1.0; 606 this._windowRight = 1.0;
607 this._windowWidth = 1.0; 607 this._windowWidth = 1.0;
608 this._timeWindowLeft = 0; 608 this._timeWindowLeft = 0;
609 this._timeWindowRight = Infinity; 609 this._timeWindowRight = Infinity;
610 this._barHeight = dataProvider.barHeight(); 610 this._barHeight = dataProvider.barHeight();
611 this._barHeightDelta = this._isTopDown ? -this._barHeight : this._barHeight; 611 this._barHeightDelta = this._isTopDown ? -this._barHeight : this._barHeight;
612 this._minWidth = 1; 612 this._minWidth = 1;
613 this._paddingLeft = 15; 613 this._paddingLeft = 15;
614 this._highlightedEntryIndex = -1; 614 this._highlightedEntryIndex = -1;
615 this._selectedEntryIndex = -1;
615 } 616 }
616 617
617 WebInspector.FlameChart.MainPane.prototype = { 618 WebInspector.FlameChart.MainPane.prototype = {
618 /** 619 /**
619 * @return {?WebInspector.FlameChart.TimelineData} 620 * @return {?WebInspector.FlameChart.TimelineData}
620 */ 621 */
621 _timelineData: function() 622 _timelineData: function()
622 { 623 {
623 return this._dataProvider.timelineData(); 624 return this._dataProvider.timelineData();
624 }, 625 },
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
675 var windowShift = pixelShift / this._totalPixels; 676 var windowShift = pixelShift / this._totalPixels;
676 var windowTime = this._windowWidth * this._totalTime; 677 var windowTime = this._windowWidth * this._totalTime;
677 var timeShift = windowTime * pixelShift / this._pixelWindowWidth; 678 var timeShift = windowTime * pixelShift / this._pixelWindowWidth;
678 timeShift = Number.constrain( 679 timeShift = Number.constrain(
679 timeShift, 680 timeShift,
680 this._zeroTime - this._dragStartWindowLeft, 681 this._zeroTime - this._dragStartWindowLeft,
681 this._zeroTime + this._totalTime - this._dragStartWindowRight 682 this._zeroTime + this._totalTime - this._dragStartWindowRight
682 ); 683 );
683 var windowLeft = this._dragStartWindowLeft + timeShift; 684 var windowLeft = this._dragStartWindowLeft + timeShift;
684 var windowRight = this._dragStartWindowRight + timeShift; 685 var windowRight = this._dragStartWindowRight + timeShift;
685 this._timeRangeController.requestWindowTimes(windowLeft, windowRight); 686 this._flameChartDelegate.requestWindowTimes(windowLeft, windowRight);
686 this._wasDragged = true; 687 this._wasDragged = true;
687 }, 688 },
688 689
689 _endCanvasDragging: function() 690 _endCanvasDragging: function()
690 { 691 {
691 this._isDragging = false; 692 this._isDragging = false;
692 }, 693 },
693 694
694 /** 695 /**
695 * @param {?MouseEvent} event 696 * @param {?MouseEvent} event
696 */ 697 */
697 _onMouseMove: function(event) 698 _onMouseMove: function(event)
698 { 699 {
699 if (this._isDragging) 700 if (this._isDragging)
700 return; 701 return;
701
702 var entryIndex = this._coordinatesToEntryIndex(event.offsetX, event.offs etY); 702 var entryIndex = this._coordinatesToEntryIndex(event.offsetX, event.offs etY);
703 703
704 if (this._highlightedEntryIndex === entryIndex) 704 if (this._highlightedEntryIndex === entryIndex)
705 return; 705 return;
706 706
707 if (entryIndex === -1 || !this._dataProvider.canJumpToEntry(entryIndex)) 707 if (entryIndex === -1 || !this._dataProvider.canJumpToEntry(entryIndex))
708 this._canvas.style.cursor = "default"; 708 this._canvas.style.cursor = "default";
709 else 709 else
710 this._canvas.style.cursor = "pointer"; 710 this._canvas.style.cursor = "pointer";
711 711
712 this._highlightedEntryIndex = entryIndex; 712 this._highlightedEntryIndex = entryIndex;
713 713
714 this._updateHighlightElement(); 714 this._updateElementPosition(this._highlightElement, this._highlightedEnt ryIndex);
715 this._entryInfo.removeChildren(); 715 this._entryInfo.removeChildren();
716 716
717 if (this._highlightedEntryIndex === -1) 717 if (this._highlightedEntryIndex === -1)
718 return; 718 return;
719 719
720 if (!this._isDragging) { 720 if (!this._isDragging) {
721 var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(this. _highlightedEntryIndex); 721 var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(this. _highlightedEntryIndex);
722 if (entryInfo) 722 if (entryInfo)
723 this._entryInfo.appendChild(this._buildEntryInfo(entryInfo)); 723 this._entryInfo.appendChild(this._buildEntryInfo(entryInfo));
724 } 724 }
725 }, 725 },
726 726
727 _onClick: function() 727 _onClick: function()
728 { 728 {
729 // onClick comes after dragStart and dragEnd events. 729 // onClick comes after dragStart and dragEnd events.
730 // So if there was drag (mouse move) in the middle of that events 730 // So if there was drag (mouse move) in the middle of that events
731 // we skip the click. Otherwise we jump to the sources. 731 // we skip the click. Otherwise we jump to the sources.
732 if (this._wasDragged) 732 if (this._wasDragged)
733 return; 733 return;
734 if (this._highlightedEntryIndex === -1) 734 if (this._highlightedEntryIndex === -1)
735 return; 735 return;
736 var data = this._dataProvider.entryData(this._highlightedEntryIndex); 736 this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySelect ed, this._highlightedEntryIndex);
737 if (data)
738 this.dispatchEventToListeners(WebInspector.FlameChart.Events.EntrySe lected, data);
739 }, 737 },
740 738
741 /** 739 /**
742 * @param {?MouseEvent} e 740 * @param {?MouseEvent} e
743 */ 741 */
744 _onMouseWheel: function(e) 742 _onMouseWheel: function(e)
745 { 743 {
746 var windowLeft = this._timeWindowLeft ? this._timeWindowLeft : this._dat aProvider.zeroTime(); 744 var windowLeft = this._timeWindowLeft ? this._timeWindowLeft : this._dat aProvider.zeroTime();
747 var windowRight = this._timeWindowRight !== Infinity ? this._timeWindowR ight : this._dataProvider.zeroTime() + this._dataProvider.totalTime(); 745 var windowRight = this._timeWindowRight !== Infinity ? this._timeWindowR ight : this._dataProvider.zeroTime() + this._dataProvider.totalTime();
748 746
749 if (e.wheelDeltaY) { 747 if (e.wheelDeltaY) {
750 const mouseWheelZoomSpeed = 1 / 120; 748 const mouseWheelZoomSpeed = 1 / 120;
751 var zoom = Math.pow(1.2, -e.wheelDeltaY * mouseWheelZoomSpeed) - 1; 749 var zoom = Math.pow(1.2, -e.wheelDeltaY * mouseWheelZoomSpeed) - 1;
752 var cursorTime = this._cursorTime(e.offsetX); 750 var cursorTime = this._cursorTime(e.offsetX);
753 windowLeft += (windowLeft - cursorTime) * zoom; 751 windowLeft += (windowLeft - cursorTime) * zoom;
754 windowRight += (windowRight - cursorTime) * zoom; 752 windowRight += (windowRight - cursorTime) * zoom;
755 } else { 753 } else {
756 var shift = e.wheelDeltaX * this._pixelToTime; 754 var shift = e.wheelDeltaX * this._pixelToTime;
757 shift = Number.constrain(shift, this._zeroTime - windowLeft, this._t otalTime + this._zeroTime - windowRight); 755 shift = Number.constrain(shift, this._zeroTime - windowLeft, this._t otalTime + this._zeroTime - windowRight);
758 windowLeft += shift; 756 windowLeft += shift;
759 windowRight += shift; 757 windowRight += shift;
760 } 758 }
761 windowLeft = Number.constrain(windowLeft, this._zeroTime, this._totalTim e + this._zeroTime); 759 windowLeft = Number.constrain(windowLeft, this._zeroTime, this._totalTim e + this._zeroTime);
762 windowRight = Number.constrain(windowRight, this._zeroTime, this._totalT ime + this._zeroTime); 760 windowRight = Number.constrain(windowRight, this._zeroTime, this._totalT ime + this._zeroTime);
763 this._timeRangeController.requestWindowTimes(windowLeft, windowRight); 761 this._flameChartDelegate.requestWindowTimes(windowLeft, windowRight);
764 }, 762 },
765 763
766 /** 764 /**
767 * @param {number} x 765 * @param {number} x
768 * @return {number} 766 * @return {number}
769 */ 767 */
770 _cursorTime: function(x) 768 _cursorTime: function(x)
771 { 769 {
772 return (x + this._pixelWindowLeft - this._paddingLeft) * this._pixelToTi me + this._zeroTime; 770 return (x + this._pixelWindowLeft - this._paddingLeft) * this._pixelToTi me + this._zeroTime;
773 }, 771 },
774 772
775 /** 773 /**
776 * @param {!number} x 774 * @param {!number} x
777 * @param {!number} y 775 * @param {!number} y
778 */ 776 */
779 _coordinatesToEntryIndex: function(x, y) 777 _coordinatesToEntryIndex: function(x, y)
780 { 778 {
781 var timelineData = this._timelineData(); 779 var timelineData = this._timelineData();
782 if (!timelineData) 780 if (!timelineData)
783 return -1; 781 return -1;
784 var cursorTime = this._cursorTime(x); 782 var cursorTimeOffset = this._cursorTime(x) - this._zeroTime;
785 var cursorLevel = this._isTopDown ? Math.floor(y / this._barHeight - 1) : Math.floor((this._canvas.height / window.devicePixelRatio - y) / this._barHeig ht); 783 var cursorLevel = this._isTopDown ? Math.floor((y - WebInspector.FlameCh art.DividersBarHeight) / this._barHeight) : Math.floor((this._canvas.height / wi ndow.devicePixelRatio - y) / this._barHeight);
786 var entryOffsets = timelineData.entryOffsets; 784 var entryOffsets = timelineData.entryOffsets;
787 var entryTotalTimes = timelineData.entryTotalTimes; 785 var entryTotalTimes = timelineData.entryTotalTimes;
788 var entryLevels = timelineData.entryLevels; 786 var entryLevels = timelineData.entryLevels;
789 var length = entryOffsets.length; 787 var length = entryOffsets.length;
790 for (var i = 0; i < length; ++i) { 788 for (var i = 0; i < length; ++i) {
791 if (cursorTime < entryOffsets[i]) 789 if (cursorTimeOffset < entryOffsets[i])
792 return -1; 790 return -1;
793 if (cursorTime < (entryOffsets[i] + entryTotalTimes[i]) 791 if (cursorTimeOffset < (entryOffsets[i] + entryTotalTimes[i])
794 && cursorLevel === entryLevels[i]) 792 && cursorLevel === entryLevels[i])
795 return i; 793 return i;
796 } 794 }
797 return -1; 795 return -1;
798 }, 796 },
799 797
800 /** 798 /**
801 * @param {!number} height 799 * @param {!number} height
802 * @param {!number} width 800 * @param {!number} width
803 */ 801 */
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
912 barRight = this._offsetToPosition(entryOffset + entryTotalTimes[ entryIndex]); 910 barRight = this._offsetToPosition(entryOffset + entryTotalTimes[ entryIndex]);
913 barWidth = Math.max(barRight - barX, minWidth); 911 barWidth = Math.max(barRight - barX, minWidth);
914 barLevel = entryLevels[entryIndex]; 912 barLevel = entryLevels[entryIndex];
915 barY = this._levelToHeight(barLevel); 913 barY = this._levelToHeight(barLevel);
916 context.rect(barX, barY, barWidth, this._barHeight); 914 context.rect(barX, barY, barWidth, this._barHeight);
917 if (barWidth > minTextWidth) 915 if (barWidth > minTextWidth)
918 titleIndexes[lastTitleIndex++] = entryIndex; 916 titleIndexes[lastTitleIndex++] = entryIndex;
919 } 917 }
920 context.fill(); 918 context.fill();
921 } 919 }
920
922 context.textBaseline = "alphabetic"; 921 context.textBaseline = "alphabetic";
923 context.fillStyle = "#333"; 922 context.fillStyle = "#333";
924 this._dotsWidth = context.measureText("\u2026").width; 923 this._dotsWidth = context.measureText("\u2026").width;
925 924
926 for (i = 0; i < lastTitleIndex; ++i) { 925 for (i = 0; i < lastTitleIndex; ++i) {
927 entryIndex = titleIndexes[i]; 926 entryIndex = titleIndexes[i];
928 text = this._dataProvider.entryTitle(entryIndex); 927 text = this._dataProvider.entryTitle(entryIndex);
929 if (!text || !text.length) 928 if (!text || !text.length)
930 continue; 929 continue;
931 font = this._dataProvider.entryFont(entryIndex); 930 font = this._dataProvider.entryFont(entryIndex);
(...skipping 10 matching lines...) Expand all
942 context.font = font; 941 context.font = font;
943 lastUsedFont = font; 942 lastUsedFont = font;
944 } 943 }
945 textColor = this._dataProvider.textColor(entryIndex); 944 textColor = this._dataProvider.textColor(entryIndex);
946 if (textColor !== lastTextColor) { 945 if (textColor !== lastTextColor) {
947 context.fillStyle = textColor; 946 context.fillStyle = textColor;
948 lastTextColor = textColor; 947 lastTextColor = textColor;
949 } 948 }
950 context.fillText(title, xText + textPadding, textBaseHeight - entryL evels[entryIndex] * this._barHeightDelta); 949 context.fillText(title, xText + textPadding, textBaseHeight - entryL evels[entryIndex] * this._barHeightDelta);
951 } 950 }
952 this._updateHighlightElement(); 951 this._updateElementPosition(this._highlightElement, this._highlightedEnt ryIndex);
952 this._updateElementPosition(this._selectedElement, this._selectedEntryIn dex);
953 }, 953 },
954 954
955 _updateHighlightElement: function() 955 setSelectedEntry: function(entryIndex)
956 { 956 {
957 if (this._highlightElement.parentElement) 957 this._selectedEntryIndex = entryIndex;
958 this._highlightElement.remove(); 958 this._updateElementPosition(this._selectedElement, this._selectedEntryIn dex);
959 var entryIndex = this._highlightedEntryIndex; 959 },
960
961 _updateElementPosition: function(element, entryIndex)
962 {
963 if (element.parentElement)
964 element.remove();
960 if (entryIndex === -1) 965 if (entryIndex === -1)
961 return; 966 return;
962 var timelineData = this._timelineData(); 967 var timelineData = this._timelineData();
963 var entryOffset = timelineData.entryOffsets[entryIndex]; 968 var timeRange = this._dataProvider.highlightTimeRange(entryIndex);
964 var barX = this._offsetToPosition(entryOffset); 969 var barX = this._offsetToPosition(timeRange.startTimeOffset);
965 var barRight = this._offsetToPosition(entryOffset + timelineData.entryTo talTimes[entryIndex]); 970 var barRight = this._offsetToPosition(timeRange.endTimeOffset);
966 var barWidth = Math.max(barRight - barX, this._minWidth); 971 var barWidth = Math.max(barRight - barX, this._minWidth);
967 972 var barY = this._levelToHeight(timelineData.entryLevels[entryIndex]);
968 var style = this._highlightElement.style; 973 var style = element.style;
969 style.left = barX + "px"; 974 style.left = barX + "px";
975 style.top = barY + "px";
970 style.width = barWidth + "px"; 976 style.width = barWidth + "px";
971 style.top = this._levelToHeight(timelineData.entryLevels[entryIndex]) + "px";
972 style.height = this._barHeight + "px"; 977 style.height = this._barHeight + "px";
973 this.element.appendChild(this._highlightElement); 978 this.element.appendChild(element);
974 }, 979 },
975 980
976 _offsetToPosition: function(offset) 981 _offsetToPosition: function(offset)
977 { 982 {
978 return Math.floor(offset * this._timeToPixel) - this._pixelWindowLeft + this._paddingLeft; 983 return Math.floor(offset * this._timeToPixel) - this._pixelWindowLeft + this._paddingLeft;
979 }, 984 },
980 985
981 _levelToHeight: function(level) 986 _levelToHeight: function(level)
982 { 987 {
983 return this._baseHeight - level * this._barHeightDelta; 988 return this._baseHeight - level * this._barHeightDelta;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1088 this._timelineGrid.showDividers(); 1093 this._timelineGrid.showDividers();
1089 else 1094 else
1090 this._timelineGrid.hideDividers(); 1095 this._timelineGrid.hideDividers();
1091 this.draw(this.element.clientWidth, this.element.clientHeight); 1096 this.draw(this.element.clientWidth, this.element.clientHeight);
1092 this._calculator._updateBoundaries(this); 1097 this._calculator._updateBoundaries(this);
1093 this._timelineGrid.element.style.width = this.element.clientWidth; 1098 this._timelineGrid.element.style.width = this.element.clientWidth;
1094 var offsets = this._dataProvider.dividerOffsets(this._calculator.minimum Boundary(), this._calculator.maximumBoundary()); 1099 var offsets = this._dataProvider.dividerOffsets(this._calculator.minimum Boundary(), this._calculator.maximumBoundary());
1095 this._timelineGrid.updateDividers(this._calculator, offsets, true); 1100 this._timelineGrid.updateDividers(this._calculator, offsets, true);
1096 }, 1101 },
1097 1102
1103 reset: function()
1104 {
1105 this._highlightedEntryIndex = -1;
1106 this._selectedEntryIndex = -1;
1107 this.update();
1108 },
1109
1098 __proto__: WebInspector.View.prototype 1110 __proto__: WebInspector.View.prototype
1099 } 1111 }
OLDNEW
« no previous file with comments | « Source/devtools/front_end/CPUProfileView.js ('k') | Source/devtools/front_end/TimelineFlameChart.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698