Index: third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js |
index 948a5742e7bdf7c44337166771bd0a3f70a660c7..20f5b5338859f1b5b31c66e45a08929e6c7dc1ae 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js |
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/FlameChart.js |
@@ -681,6 +681,7 @@ WebInspector.FlameChart.prototype = { |
_onMouseMove: function(event) |
{ |
this._lastMouseOffsetX = event.offsetX; |
+ this._lastMouseOffsetY = event.offsetY; |
if (!this._enabled()) |
return; |
@@ -691,43 +692,60 @@ WebInspector.FlameChart.prototype = { |
var inDividersBar = event.offsetY < WebInspector.FlameChart.DividersBarHeight; |
this._highlightedMarkerIndex = inDividersBar ? this._markerIndexAtPosition(event.offsetX) : -1; |
this._updateMarkerHighlight(); |
- this._entryInfo.style.left = event.offsetX + "px"; |
- this._entryInfo.style.top = event.offsetY + "px"; |
- |
- this._highlightEntry(this._coordinatesToEntryIndex(event.offsetX, event.offsetY)); |
+ this._showHighlight(); |
}, |
_onMouseOut: function() |
{ |
- this._highlightEntry(-1); |
+ this._hideHighlight(); |
}, |
- /** |
- * @param {number} entryIndex |
- */ |
- _highlightEntry: function(entryIndex) |
+ _showHighlight: function() |
{ |
+ var entryIndex = this._coordinatesToEntryIndex(this._lastMouseOffsetX, this._lastMouseOffsetY); |
+ if (entryIndex === -1) { |
+ this._hideHighlight(); |
+ return; |
+ } |
+ if (entryIndex !== this._highlightedEntryIndex) { |
+ this._entryInfo.removeChildren(); |
+ var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(entryIndex); |
+ if (entryInfo) |
+ this._entryInfo.appendChild(this._buildEntryInfo(entryInfo)); |
+ } |
+ var mouseX = this._lastMouseOffsetX; |
+ var mouseY = this._lastMouseOffsetY; |
+ var parentWidth = this._entryInfo.parentElement.clientWidth; |
+ var parentHeight = this._entryInfo.parentElement.clientHeight; |
+ var infoWidth = this._entryInfo.clientWidth; |
+ var infoHeight = this._entryInfo.clientHeight; |
+ var /** @const */ offsetX = 10; |
+ var /** @const */ offsetY = 6; |
+ var x; |
+ var y; |
+ for (var quadrant = 0; quadrant < 4; ++quadrant) { |
+ var dx = quadrant & 2 ? -offsetX - infoWidth : offsetX; |
+ var dy = quadrant & 1 ? -offsetY - infoHeight : offsetY; |
+ x = Number.constrain(mouseX + dx, 0, parentWidth - infoWidth); |
+ y = Number.constrain(mouseY + dy, 0, parentHeight - infoHeight); |
+ if (x >= mouseX || mouseX >= x + infoWidth || y >= mouseY || mouseY >= y + infoHeight) |
+ break; |
+ } |
+ this._entryInfo.style.left = x + "px"; |
+ this._entryInfo.style.top = y + "px"; |
if (this._highlightedEntryIndex === entryIndex) |
return; |
- |
- if (entryIndex === -1 || !this._dataProvider.canJumpToEntry(entryIndex)) |
- this._canvas.style.cursor = "default"; |
- else |
- this._canvas.style.cursor = "pointer"; |
- |
this._highlightedEntryIndex = entryIndex; |
- |
+ this._canvas.style.cursor = this._dataProvider.canJumpToEntry(entryIndex) ? "pointer" : "default"; |
this._updateElementPosition(this._highlightElement, this._highlightedEntryIndex); |
- this._entryInfo.removeChildren(); |
- |
- if (this._highlightedEntryIndex === -1) |
- return; |
+ }, |
- if (!this._isDragging) { |
- var entryInfo = this._dataProvider.prepareHighlightedEntryInfo(this._highlightedEntryIndex); |
- if (entryInfo) |
- this._entryInfo.appendChild(this._buildEntryInfo(entryInfo)); |
- } |
+ _hideHighlight: function() |
+ { |
+ this._entryInfo.removeChildren(); |
+ this._canvas.style.cursor = "default"; |
+ this._highlightedEntryIndex = -1; |
+ this._updateElementPosition(this._highlightElement, this._highlightedEntryIndex); |
}, |
_onClick: function() |