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

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

Issue 1493673004: DevTools: Update flamechart highlight on pan/zoom/scroll. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 429 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 * @return {number} 440 * @return {number}
441 */ 441 */
442 boundarySpan: function() 442 boundarySpan: function()
443 { 443 {
444 return this._maximumBoundaries - this._minimumBoundaries; 444 return this._maximumBoundaries - this._minimumBoundaries;
445 } 445 }
446 } 446 }
447 447
448 WebInspector.FlameChart.prototype = { 448 WebInspector.FlameChart.prototype = {
449 /** 449 /**
450 * @override
451 */
452 willHide: function()
453 {
454 this.hideHighlight();
455 },
456
457 /**
450 * @param {number} entryIndex 458 * @param {number} entryIndex
451 */ 459 */
452 highlightEntry: function(entryIndex) 460 highlightEntry: function(entryIndex)
453 { 461 {
454 this._entryInfo.removeChildren(); 462 if (this._highlightedEntryIndex === entryIndex)
455 this._innerHighlightEntry(entryIndex); 463 return;
464 this._highlightedEntryIndex = entryIndex;
465 this._updateElementPosition(this._highlightElement, this._highlightedEnt ryIndex);
456 }, 466 },
457 467
458 hideHighlight: function() 468 hideHighlight: function()
459 { 469 {
460 this._entryInfo.removeChildren(); 470 this._entryInfo.removeChildren();
461 this._canvas.style.cursor = "default"; 471 this._canvas.style.cursor = "default";
462 this._highlightedEntryIndex = -1; 472 this._highlightedEntryIndex = -1;
463 this._updateElementPosition(this._highlightElement, this._highlightedEnt ryIndex); 473 this._updateElementPosition(this._highlightElement, this._highlightedEnt ryIndex);
464 }, 474 },
465 475
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
532 { 542 {
533 if (this._muteAnimation || this._timeWindowLeft === 0 || this._timeWindo wRight === Infinity || (startTime === 0 && endTime === Infinity) || (startTime = == Infinity && endTime === Infinity)) { 543 if (this._muteAnimation || this._timeWindowLeft === 0 || this._timeWindo wRight === Infinity || (startTime === 0 && endTime === Infinity) || (startTime = == Infinity && endTime === Infinity)) {
534 // Initial setup. 544 // Initial setup.
535 this._timeWindowLeft = startTime; 545 this._timeWindowLeft = startTime;
536 this._timeWindowRight = endTime; 546 this._timeWindowRight = endTime;
537 this.scheduleUpdate(); 547 this.scheduleUpdate();
538 return; 548 return;
539 } 549 }
540 550
541 this._cancelAnimation(); 551 this._cancelAnimation();
552 this._updateHighlight();
542 this._cancelWindowTimesAnimation = WebInspector.animateFunction(this.ele ment.window(), this._animateWindowTimes.bind(this), 553 this._cancelWindowTimesAnimation = WebInspector.animateFunction(this.ele ment.window(), this._animateWindowTimes.bind(this),
543 [{from: this._timeWindowLeft, to: startTime}, {from: this._timeWindo wRight, to: endTime}], 5, 554 [{from: this._timeWindowLeft, to: startTime}, {from: this._timeWindo wRight, to: endTime}], 5,
544 this._animationCompleted.bind(this)); 555 this._animationCompleted.bind(this));
545 this._pendingAnimationTimeLeft = startTime; 556 this._pendingAnimationTimeLeft = startTime;
546 this._pendingAnimationTimeRight = endTime; 557 this._pendingAnimationTimeRight = endTime;
547 }, 558 },
548 559
549 /** 560 /**
550 * @param {number} startTime 561 * @param {number} startTime
551 * @param {number} endTime 562 * @param {number} endTime
552 */ 563 */
553 _animateWindowTimes: function(startTime, endTime) 564 _animateWindowTimes: function(startTime, endTime)
554 { 565 {
555 this._timeWindowLeft = startTime; 566 this._timeWindowLeft = startTime;
556 this._timeWindowRight = endTime; 567 this._timeWindowRight = endTime;
568 this._updateHighlight();
557 this.update(); 569 this.update();
558 }, 570 },
559 571
560 _animationCompleted: function() 572 _animationCompleted: function()
561 { 573 {
562 delete this._cancelWindowTimesAnimation; 574 delete this._cancelWindowTimesAnimation;
575 this._updateHighlight();
563 }, 576 },
564 577
565 /** 578 /**
566 * @param {!MouseEvent} event 579 * @param {!MouseEvent} event
567 */ 580 */
568 _initMaxDragOffset: function(event) 581 _initMaxDragOffset: function(event)
569 { 582 {
570 this._maxDragOffsetSquared = 0; 583 this._maxDragOffsetSquared = 0;
571 this._dragStartX = event.pageX; 584 this._dragStartX = event.pageX;
572 this._dragStartY = event.pageY; 585 this._dragStartY = event.pageY;
(...skipping 29 matching lines...) Expand all
602 if (!this._timelineData() || this._timeWindowRight === Infinity) 615 if (!this._timelineData() || this._timeWindowRight === Infinity)
603 return false; 616 return false;
604 this._isDragging = true; 617 this._isDragging = true;
605 this._initMaxDragOffset(event); 618 this._initMaxDragOffset(event);
606 this._dragStartPointX = event.pageX; 619 this._dragStartPointX = event.pageX;
607 this._dragStartPointY = event.pageY; 620 this._dragStartPointY = event.pageY;
608 this._dragStartScrollTop = this._vScrollElement.scrollTop; 621 this._dragStartScrollTop = this._vScrollElement.scrollTop;
609 this._dragStartWindowLeft = this._timeWindowLeft; 622 this._dragStartWindowLeft = this._timeWindowLeft;
610 this._dragStartWindowRight = this._timeWindowRight; 623 this._dragStartWindowRight = this._timeWindowRight;
611 this._canvas.style.cursor = ""; 624 this._canvas.style.cursor = "";
625 this.hideHighlight();
612 return true; 626 return true;
613 }, 627 },
614 628
615 /** 629 /**
616 * @param {!MouseEvent} event 630 * @param {!MouseEvent} event
617 */ 631 */
618 _canvasDragging: function(event) 632 _canvasDragging: function(event)
619 { 633 {
620 var pixelShift = this._dragStartPointX - event.pageX; 634 var pixelShift = this._dragStartPointX - event.pageX;
621 this._dragStartPointX = event.pageX; 635 this._dragStartPointX = event.pageX;
622 this._muteAnimation = true; 636 this._muteAnimation = true;
623 this._handlePanGesture(pixelShift * this._pixelToTime); 637 this._handlePanGesture(pixelShift * this._pixelToTime);
624 this._muteAnimation = false; 638 this._muteAnimation = false;
625 639
626 var pixelScroll = this._dragStartPointY - event.pageY; 640 var pixelScroll = this._dragStartPointY - event.pageY;
627 this._vScrollElement.scrollTop = this._dragStartScrollTop + pixelScroll; 641 this._vScrollElement.scrollTop = this._dragStartScrollTop + pixelScroll;
628 this._updateMaxDragOffset(event); 642 this._updateMaxDragOffset(event);
629 }, 643 },
630 644
631 _endCanvasDragging: function() 645 _endCanvasDragging: function()
632 { 646 {
633 this._isDragging = false; 647 this._isDragging = false;
648 this._updateHighlight();
634 }, 649 },
635 650
636 /** 651 /**
637 * @param {!MouseEvent} event 652 * @param {!MouseEvent} event
638 * @return {boolean} 653 * @return {boolean}
639 */ 654 */
640 _startRangeSelection: function(event) 655 _startRangeSelection: function(event)
641 { 656 {
642 if (!event.shiftKey) 657 if (!event.shiftKey)
643 return false; 658 return false;
644 this._isDragging = true; 659 this._isDragging = true;
645 this._initMaxDragOffset(event); 660 this._initMaxDragOffset(event);
646 this._selectionOffsetShiftX = event.offsetX - event.pageX; 661 this._selectionOffsetShiftX = event.offsetX - event.pageX;
647 this._selectionOffsetShiftY = event.offsetY - event.pageY; 662 this._selectionOffsetShiftY = event.offsetY - event.pageY;
648 this._selectionStartX = event.offsetX; 663 this._selectionStartX = event.offsetX;
649 var style = this._selectionOverlay.style; 664 var style = this._selectionOverlay.style;
650 style.left = this._selectionStartX + "px"; 665 style.left = this._selectionStartX + "px";
651 style.width = "1px"; 666 style.width = "1px";
652 this._selectedTimeSpanLabel.textContent = ""; 667 this._selectedTimeSpanLabel.textContent = "";
653 this._selectionOverlay.classList.remove("hidden"); 668 this._selectionOverlay.classList.remove("hidden");
669 this.hideHighlight();
654 return true; 670 return true;
655 }, 671 },
656 672
657 _endRangeSelection: function() 673 _endRangeSelection: function()
658 { 674 {
659 this._isDragging = false; 675 this._isDragging = false;
660 this._flameChartDelegate.endRangeSelection(); 676 this._flameChartDelegate.endRangeSelection();
677 this._updateHighlight();
661 }, 678 },
662 679
663 _hideRangeSelection: function() 680 _hideRangeSelection: function()
664 { 681 {
665 this._selectionOverlay.classList.add("hidden"); 682 this._selectionOverlay.classList.add("hidden");
666 }, 683 },
667 684
668 /** 685 /**
669 * @param {!MouseEvent} event 686 * @param {!MouseEvent} event
670 */ 687 */
(...skipping 21 matching lines...) Expand all
692 this._selectedTimeSpanLabel.textContent = Number.preciseMillisToString(t imeSpan, 2); 709 this._selectedTimeSpanLabel.textContent = Number.preciseMillisToString(t imeSpan, 2);
693 }, 710 },
694 711
695 /** 712 /**
696 * @param {!Event} event 713 * @param {!Event} event
697 */ 714 */
698 _onMouseMove: function(event) 715 _onMouseMove: function(event)
699 { 716 {
700 this._lastMouseOffsetX = event.offsetX; 717 this._lastMouseOffsetX = event.offsetX;
701 this._lastMouseOffsetY = event.offsetY; 718 this._lastMouseOffsetY = event.offsetY;
702
703 if (!this._enabled()) 719 if (!this._enabled())
704 return; 720 return;
705
706 if (this._isDragging) 721 if (this._isDragging)
707 return; 722 return;
723 this._updateHighlight();
724 },
708 725
709 var inDividersBar = event.offsetY < WebInspector.FlameChart.DividersBarH eight; 726 _updateHighlight: function()
710 this._highlightedMarkerIndex = inDividersBar ? this._markerIndexAtPositi on(event.offsetX) : -1; 727 {
728 var inDividersBar = this._lastMouseOffsetY < WebInspector.FlameChart.Div idersBarHeight;
729 this._highlightedMarkerIndex = inDividersBar ? this._markerIndexAtPositi on(this._lastMouseOffsetX) : -1;
711 this._updateMarkerHighlight(); 730 this._updateMarkerHighlight();
712 731
713 var entryIndex = this._coordinatesToEntryIndex(this._lastMouseOffsetX, t his._lastMouseOffsetY); 732 var entryIndex = this._coordinatesToEntryIndex(this._lastMouseOffsetX, t his._lastMouseOffsetY);
714 if (entryIndex === -1) { 733 if (entryIndex === -1) {
715 this.hideHighlight(); 734 this.hideHighlight();
716 return; 735 return;
717 } 736 }
718 this._updateEntryInfo(entryIndex); 737 this._updatePopover(entryIndex);
719
720 this._canvas.style.cursor = this._dataProvider.canJumpToEntry(entryIndex ) ? "pointer" : "default"; 738 this._canvas.style.cursor = this._dataProvider.canJumpToEntry(entryIndex ) ? "pointer" : "default";
721 this._innerHighlightEntry(entryIndex); 739 this.highlightEntry(entryIndex);
722 }, 740 },
723 741
724 _onMouseOut: function() 742 _onMouseOut: function()
725 { 743 {
744 this._lastMouseOffsetX = -1;
745 this._lastMouseOffsetY = -1;
726 this.hideHighlight(); 746 this.hideHighlight();
727 }, 747 },
728 748
729 /** 749 /**
730 * @param {number} entryIndex 750 * @param {number} entryIndex
731 */ 751 */
732 _updateEntryInfo: function(entryIndex) 752 _updatePopover: function(entryIndex)
733 { 753 {
734 if (entryIndex !== this._highlightedEntryIndex) { 754 if (entryIndex !== this._highlightedEntryIndex) {
735 this._entryInfo.removeChildren(); 755 this._entryInfo.removeChildren();
736 var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(entry Index); 756 var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(entry Index);
737 if (entryInfo) 757 if (entryInfo)
738 this._entryInfo.appendChild(this._buildEntryInfo(entryInfo)); 758 this._entryInfo.appendChild(this._buildEntryInfo(entryInfo));
739 } 759 }
740 var mouseX = this._lastMouseOffsetX; 760 var mouseX = this._lastMouseOffsetX;
741 var mouseY = this._lastMouseOffsetY; 761 var mouseY = this._lastMouseOffsetY;
742 var parentWidth = this._entryInfo.parentElement.clientWidth; 762 var parentWidth = this._entryInfo.parentElement.clientWidth;
743 var parentHeight = this._entryInfo.parentElement.clientHeight; 763 var parentHeight = this._entryInfo.parentElement.clientHeight;
744 var infoWidth = this._entryInfo.clientWidth; 764 var infoWidth = this._entryInfo.clientWidth;
745 var infoHeight = this._entryInfo.clientHeight; 765 var infoHeight = this._entryInfo.clientHeight;
746 var /** @const */ offsetX = 10; 766 var /** @const */ offsetX = 10;
747 var /** @const */ offsetY = 6; 767 var /** @const */ offsetY = 6;
748 var x; 768 var x;
749 var y; 769 var y;
750 for (var quadrant = 0; quadrant < 4; ++quadrant) { 770 for (var quadrant = 0; quadrant < 4; ++quadrant) {
751 var dx = quadrant & 2 ? -offsetX - infoWidth : offsetX; 771 var dx = quadrant & 2 ? -offsetX - infoWidth : offsetX;
752 var dy = quadrant & 1 ? -offsetY - infoHeight : offsetY; 772 var dy = quadrant & 1 ? -offsetY - infoHeight : offsetY;
753 x = Number.constrain(mouseX + dx, 0, parentWidth - infoWidth); 773 x = Number.constrain(mouseX + dx, 0, parentWidth - infoWidth);
754 y = Number.constrain(mouseY + dy, 0, parentHeight - infoHeight); 774 y = Number.constrain(mouseY + dy, 0, parentHeight - infoHeight);
755 if (x >= mouseX || mouseX >= x + infoWidth || y >= mouseY || mouseY >= y + infoHeight) 775 if (x >= mouseX || mouseX >= x + infoWidth || y >= mouseY || mouseY >= y + infoHeight)
756 break; 776 break;
757 } 777 }
758 this._entryInfo.style.left = x + "px"; 778 this._entryInfo.style.left = x + "px";
759 this._entryInfo.style.top = y + "px"; 779 this._entryInfo.style.top = y + "px";
760 }, 780 },
761 781
762 /**
763 * @param {number} entryIndex
764 */
765 _innerHighlightEntry: function(entryIndex)
766 {
767 if (this._highlightedEntryIndex === entryIndex)
768 return;
769 this._highlightedEntryIndex = entryIndex;
770 this._updateElementPosition(this._highlightElement, this._highlightedEnt ryIndex);
771 },
772
773 _onClick: function() 782 _onClick: function()
774 { 783 {
775 this.focus(); 784 this.focus();
776 // onClick comes after dragStart and dragEnd events. 785 // onClick comes after dragStart and dragEnd events.
777 // So if there was drag (mouse move) in the middle of that events 786 // So if there was drag (mouse move) in the middle of that events
778 // we skip the click. Otherwise we jump to the sources. 787 // we skip the click. Otherwise we jump to the sources.
779 const clickThreshold = 5; 788 const clickThreshold = 5;
780 if (this._maxDragOffset() > clickThreshold) 789 if (this._maxDragOffset() > clickThreshold)
781 return; 790 return;
782 this._hideRangeSelection(); 791 this._hideRangeSelection();
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
968 return (x + this._pixelWindowLeft - this._paddingLeft) * this._pixelToTi me + this._minimumBoundary; 977 return (x + this._pixelWindowLeft - this._paddingLeft) * this._pixelToTi me + this._minimumBoundary;
969 }, 978 },
970 979
971 /** 980 /**
972 * @param {number} x 981 * @param {number} x
973 * @param {number} y 982 * @param {number} y
974 * @return {number} 983 * @return {number}
975 */ 984 */
976 _coordinatesToEntryIndex: function(x, y) 985 _coordinatesToEntryIndex: function(x, y)
977 { 986 {
987 if (x < 0 || y < 0)
988 return -1;
978 y += this._scrollTop; 989 y += this._scrollTop;
979 var timelineData = this._timelineData(); 990 var timelineData = this._timelineData();
980 if (!timelineData) 991 if (!timelineData)
981 return -1; 992 return -1;
982 var cursorTime = this._cursorTime(x); 993 var cursorTime = this._cursorTime(x);
983 var cursorLevel; 994 var cursorLevel;
984 var offsetFromLevel; 995 var offsetFromLevel;
985 if (this._isTopDown) { 996 if (this._isTopDown) {
986 cursorLevel = Math.floor((y - WebInspector.FlameChart.DividersBarHei ght) / this._barHeight); 997 cursorLevel = Math.floor((y - WebInspector.FlameChart.DividersBarHei ght) / this._barHeight);
987 offsetFromLevel = y - WebInspector.FlameChart.DividersBarHeight - cu rsorLevel * this._barHeight; 998 offsetFromLevel = y - WebInspector.FlameChart.DividersBarHeight - cu rsorLevel * this._barHeight;
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after
1565 1576
1566 update: function() 1577 update: function()
1567 { 1578 {
1568 this._updateTimerId = 0; 1579 this._updateTimerId = 0;
1569 if (!this._timelineData()) 1580 if (!this._timelineData())
1570 return; 1581 return;
1571 this._resetCanvas(); 1582 this._resetCanvas();
1572 this._updateBoundaries(); 1583 this._updateBoundaries();
1573 this._calculator._updateBoundaries(this); 1584 this._calculator._updateBoundaries(this);
1574 this._draw(this._offsetWidth, this._offsetHeight); 1585 this._draw(this._offsetWidth, this._offsetHeight);
1586 if (!this._isDragging)
1587 this._updateHighlight();
1575 }, 1588 },
1576 1589
1577 reset: function() 1590 reset: function()
1578 { 1591 {
1579 this._vScrollElement.scrollTop = 0; 1592 this._vScrollElement.scrollTop = 0;
1580 this._highlightedMarkerIndex = -1; 1593 this._highlightedMarkerIndex = -1;
1581 this._highlightedEntryIndex = -1; 1594 this._highlightedEntryIndex = -1;
1582 this._selectedEntryIndex = -1; 1595 this._selectedEntryIndex = -1;
1583 this._textWidth = {}; 1596 this._textWidth = {};
1584 this.update(); 1597 this.update();
1585 }, 1598 },
1586 1599
1587 _enabled: function() 1600 _enabled: function()
1588 { 1601 {
1589 return this._rawTimelineDataLength !== 0; 1602 return this._rawTimelineDataLength !== 0;
1590 }, 1603 },
1591 1604
1592 __proto__: WebInspector.HBox.prototype 1605 __proto__: WebInspector.HBox.prototype
1593 } 1606 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698