Index: third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js |
index 3512e6cb6eeef394cad0b755cb337d0fce174a9d..8f0b020e501795de7a67901eea9806e3d4beb489 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js |
+++ b/third_party/WebKit/Source/devtools/front_end/ui_lazy/ChartViewport.js |
@@ -1,466 +1,439 @@ |
// Copyright 2016 The Chromium Authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
- |
/** |
- * @constructor |
- * @extends {WebInspector.VBox} |
+ * @unrestricted |
*/ |
-WebInspector.ChartViewport = function() |
-{ |
- WebInspector.VBox.call(this, true); |
+WebInspector.ChartViewport = class extends WebInspector.VBox { |
+ constructor() { |
+ super(true); |
- this.contentElement.addEventListener("mousewheel", this._onMouseWheel.bind(this), false); |
- this.contentElement.addEventListener("keydown", this._handleZoomPanKeys.bind(this), false); |
+ this.contentElement.addEventListener('mousewheel', this._onMouseWheel.bind(this), false); |
+ this.contentElement.addEventListener('keydown', this._handleZoomPanKeys.bind(this), false); |
- this.viewportElement = this.contentElement.createChild("div", "fill"); |
- WebInspector.installInertialDragHandle(this.viewportElement, this._startDragging.bind(this), this._dragging.bind(this), this._endDragging.bind(this), "-webkit-grabbing", null); |
- WebInspector.installDragHandle(this.viewportElement, this._startRangeSelection.bind(this), this._rangeSelectionDragging.bind(this), this._endRangeSelection.bind(this), "text", null); |
+ this.viewportElement = this.contentElement.createChild('div', 'fill'); |
+ WebInspector.installInertialDragHandle( |
+ this.viewportElement, this._startDragging.bind(this), this._dragging.bind(this), this._endDragging.bind(this), |
+ '-webkit-grabbing', null); |
+ WebInspector.installDragHandle( |
+ this.viewportElement, this._startRangeSelection.bind(this), this._rangeSelectionDragging.bind(this), |
+ this._endRangeSelection.bind(this), 'text', null); |
- this._vScrollElement = this.contentElement.createChild("div", "flame-chart-v-scroll"); |
- this._vScrollContent = this._vScrollElement.createChild("div"); |
- this._vScrollElement.addEventListener("scroll", this._onScroll.bind(this), false); |
+ this._vScrollElement = this.contentElement.createChild('div', 'flame-chart-v-scroll'); |
+ this._vScrollContent = this._vScrollElement.createChild('div'); |
+ this._vScrollElement.addEventListener('scroll', this._onScroll.bind(this), false); |
- this._selectionOverlay = this.contentElement.createChild("div", "flame-chart-selection-overlay hidden"); |
- this._selectedTimeSpanLabel = this._selectionOverlay.createChild("div", "time-span"); |
+ this._selectionOverlay = this.contentElement.createChild('div', 'flame-chart-selection-overlay hidden'); |
+ this._selectedTimeSpanLabel = this._selectionOverlay.createChild('div', 'time-span'); |
this.reset(); |
-}; |
- |
-WebInspector.ChartViewport.prototype = { |
- /** |
- * @return {boolean} |
- */ |
- isDragging: function() |
- { |
- return this._isDragging; |
- }, |
- |
- /** |
- * @override |
- * @return {!Array<!Element>} |
- */ |
- elementsToRestoreScrollPositionsFor: function() |
- { |
- return [this._vScrollElement]; |
- }, |
- |
- /** |
- * @private |
- */ |
- _updateScrollBar: function() |
- { |
- var showScroll = this._totalHeight > this._offsetHeight; |
- if (this._vScrollElement.classList.contains("hidden") !== showScroll) |
- return; |
- this._vScrollElement.classList.toggle("hidden", !showScroll); |
- this._updateContentElementSize(); |
- }, |
- |
- /** |
- * @override |
- */ |
- onResize: function() |
- { |
- this._updateScrollBar(); |
- this._updateContentElementSize(); |
- this.scheduleUpdate(); |
- }, |
- |
- reset: function() |
- { |
- this._vScrollElement.scrollTop = 0; |
- this._scrollTop = 0; |
- this._rangeSelectionStart = 0; |
- this._rangeSelectionEnd = 0; |
- this._isDragging = false; |
- this._dragStartPointX = 0; |
- this._dragStartPointY = 0; |
- this._dragStartScrollTop = 0; |
- this._timeWindowLeft = 0; |
- this._timeWindowRight = 0; |
- this._offsetWidth = 0; |
- this._offsetHeight = 0; |
- this._totalHeight = 0; |
- this._pendingAnimationTimeLeft = 0; |
- this._pendingAnimationTimeRight = 0; |
- }, |
- |
- /** |
- * @private |
- */ |
- _updateContentElementSize: function() |
- { |
- var offsetWidth = this._vScrollElement.offsetLeft; |
- if (!offsetWidth) |
- offsetWidth = this.contentElement.offsetWidth; |
- this._offsetWidth = offsetWidth; |
- this._offsetHeight = this.contentElement.offsetHeight; |
- }, |
- |
- setContentHeight: function(totalHeight) |
- { |
- this._totalHeight = totalHeight; |
- this._vScrollContent.style.height = totalHeight + "px"; |
- this._updateScrollBar(); |
- if (this._scrollTop + this._offsetHeight <= totalHeight) |
- return; |
- this._scrollTop = Math.max(0, totalHeight - this._offsetHeight); |
- this._vScrollElement.scrollTop = this._scrollTop; |
- }, |
- |
- /** |
- * @param {number} offset |
- * @param {number=} height |
- */ |
- setScrollOffset: function(offset, height) |
- { |
- height = height || 0; |
- if (this._vScrollElement.scrollTop > offset) |
- this._vScrollElement.scrollTop = offset; |
- else if (this._vScrollElement.scrollTop < offset - this._offsetHeight + height) |
- this._vScrollElement.scrollTop = offset - this._offsetHeight + height; |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- scrollOffset: function() |
- { |
- return this._vScrollElement.scrollTop; |
- }, |
- |
- /** |
- * @param {!Event} e |
- * @private |
- */ |
- _onMouseWheel: function(e) |
- { |
- if (!this._enabled()) |
- return; |
- // Pan vertically when shift down only. |
- var panVertically = e.shiftKey && (e.wheelDeltaY || Math.abs(e.wheelDeltaX) === 120); |
- var panHorizontally = Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY) && !e.shiftKey; |
- if (panVertically) { |
- this._vScrollElement.scrollTop -= (e.wheelDeltaY || e.wheelDeltaX) / 120 * this._offsetHeight / 8; |
- } else if (panHorizontally) { |
- var shift = -e.wheelDeltaX * this._pixelToTime; |
- this._muteAnimation = true; |
- this._handlePanGesture(shift); |
- this._muteAnimation = false; |
- } else { // Zoom. |
- const mouseWheelZoomSpeed = 1 / 120; |
- this._handleZoomGesture(Math.pow(1.2, -(e.wheelDeltaY || e.wheelDeltaX) * mouseWheelZoomSpeed) - 1); |
- } |
- |
- // Block swipe gesture. |
- e.consume(true); |
- }, |
- |
- /** |
- * @param {number} x |
- * @param {number} y |
- * @param {!MouseEvent} event |
- * @private |
- * @return {boolean} |
- */ |
- _startDragging: function(x, y, event) |
- { |
- if (event.shiftKey) |
- return false; |
- if (this._windowRight === Infinity) |
- return false; |
- this._isDragging = true; |
- this._initMaxDragOffset(event); |
- this._dragStartPointX = x; |
- this._dragStartPointY = y; |
- this._dragStartScrollTop = this._vScrollElement.scrollTop; |
- this.viewportElement.style.cursor = ""; |
- this.hideHighlight(); |
- return true; |
- }, |
- |
- /** |
- * @param {number} x |
- * @param {number} y |
- * @private |
- */ |
- _dragging: function(x, y) |
- { |
- var pixelShift = this._dragStartPointX - x; |
- this._dragStartPointX = x; |
- this._muteAnimation = true; |
- this._handlePanGesture(pixelShift * this._pixelToTime); |
- this._muteAnimation = false; |
- |
- var pixelScroll = this._dragStartPointY - y; |
- this._vScrollElement.scrollTop = this._dragStartScrollTop + pixelScroll; |
- this._updateMaxDragOffset(x, y); |
- }, |
- |
- /** |
- * @private |
- */ |
- _endDragging: function() |
- { |
- this._isDragging = false; |
- this._updateHighlight(); |
- }, |
- |
- /** |
- * @param {!MouseEvent} event |
- * @private |
- */ |
- _initMaxDragOffset: function(event) |
- { |
- this._maxDragOffsetSquared = 0; |
- this._dragStartX = event.pageX; |
- this._dragStartY = event.pageY; |
- }, |
- |
- /** |
- * @param {number} x |
- * @param {number} y |
- * @private |
- */ |
- _updateMaxDragOffset: function(x, y) |
- { |
- var dx = x - this._dragStartX; |
- var dy = y - this._dragStartY; |
- var dragOffsetSquared = dx * dx + dy * dy; |
- this._maxDragOffsetSquared = Math.max(this._maxDragOffsetSquared, dragOffsetSquared); |
- }, |
- |
- /** |
- * @return {number} |
- */ |
- maxDragOffset: function() |
- { |
- return Math.sqrt(this._maxDragOffsetSquared); |
- }, |
- |
- /** |
- * @param {!MouseEvent} event |
- * @private |
- * @return {boolean} |
- */ |
- _startRangeSelection: function(event) |
- { |
- if (!event.shiftKey) |
- return false; |
- this._isDragging = true; |
- this._initMaxDragOffset(event); |
- this._selectionOffsetShiftX = event.offsetX - event.pageX; |
- this._selectionOffsetShiftY = event.offsetY - event.pageY; |
- this._selectionStartX = event.offsetX; |
- var style = this._selectionOverlay.style; |
- style.left = this._selectionStartX + "px"; |
- style.width = "1px"; |
- this._selectedTimeSpanLabel.textContent = ""; |
- this._selectionOverlay.classList.remove("hidden"); |
- this.hideHighlight(); |
- return true; |
- }, |
- |
- /** |
- * @private |
- */ |
- _endRangeSelection: function() |
- { |
- this._isDragging = false; |
- this._updateHighlight(); |
- }, |
- |
- hideRangeSelection: function() |
- { |
- this._selectionOverlay.classList.add("hidden"); |
- }, |
- |
- /** |
- * @param {!MouseEvent} event |
- * @private |
- */ |
- _rangeSelectionDragging: function(event) |
- { |
- this._updateMaxDragOffset(event.pageX, event.pageY); |
- var x = Number.constrain(event.pageX + this._selectionOffsetShiftX, 0, this._offsetWidth); |
- var start = this._cursorTime(this._selectionStartX); |
- var end = this._cursorTime(x); |
- this._rangeSelectionStart = Math.min(start, end); |
- this._rangeSelectionEnd = Math.max(start, end); |
- this._updateRangeSelectionOverlay(); |
- this._flameChartDelegate.updateRangeSelection(this._rangeSelectionStart, this._rangeSelectionEnd); |
- }, |
- |
- /** |
- * @private |
- */ |
- _updateRangeSelectionOverlay: function() |
- { |
- var /** @const */ margin = 100; |
- var left = Number.constrain(this._timeToPosition(this._rangeSelectionStart), -margin, this._offsetWidth + margin); |
- var right = Number.constrain(this._timeToPosition(this._rangeSelectionEnd), -margin, this._offsetWidth + margin); |
- var style = this._selectionOverlay.style; |
- style.left = left + "px"; |
- style.width = (right - left) + "px"; |
- var timeSpan = this._rangeSelectionEnd - this._rangeSelectionStart; |
- this._selectedTimeSpanLabel.textContent = Number.preciseMillisToString(timeSpan, 2); |
- }, |
- |
- /** |
- * @private |
- */ |
- _onScroll: function() |
- { |
- this._scrollTop = this._vScrollElement.scrollTop; |
- this.scheduleUpdate(); |
- }, |
- |
- /** |
- * @param {!Event} e |
- * @private |
- */ |
- _handleZoomPanKeys: function(e) |
- { |
- if (!WebInspector.KeyboardShortcut.hasNoModifiers(e)) |
- return; |
- var zoomMultiplier = e.shiftKey ? 0.8 : 0.3; |
- var panMultiplier = e.shiftKey ? 320 : 80; |
- if (e.code === "KeyA") { |
- this._handlePanGesture(-panMultiplier * this._pixelToTime); |
- e.consume(true); |
- } else if (e.code === "KeyD") { |
- this._handlePanGesture(panMultiplier * this._pixelToTime); |
- e.consume(true); |
- } else if (e.code === "KeyW") { |
- this._handleZoomGesture(-zoomMultiplier); |
- e.consume(true); |
- } else if (e.code === "KeyS") { |
- this._handleZoomGesture(zoomMultiplier); |
- e.consume(true); |
- } |
- }, |
- |
- /** |
- * @param {number} zoom |
- * @private |
- */ |
- _handleZoomGesture: function(zoom) |
- { |
- this._cancelAnimation(); |
- var bounds = this._windowForGesture(); |
- var cursorTime = this._cursorTime(this._lastMouseOffsetX); |
- bounds.left += (bounds.left - cursorTime) * zoom; |
- bounds.right += (bounds.right - cursorTime) * zoom; |
- this._requestWindowTimes(bounds); |
- }, |
- |
- /** |
- * @param {number} shift |
- * @private |
- */ |
- _handlePanGesture: function(shift) |
- { |
- this._cancelAnimation(); |
- var bounds = this._windowForGesture(); |
- shift = Number.constrain(shift, this._minimumBoundary - bounds.left, this._totalTime + this._minimumBoundary - bounds.right); |
- bounds.left += shift; |
- bounds.right += shift; |
- this._requestWindowTimes(bounds); |
- }, |
- |
- /** |
- * @private |
- * @return {{left: number, right: number}} |
- */ |
- _windowForGesture: function() |
- { |
- var windowLeft = this._timeWindowLeft ? this._timeWindowLeft : this._dataProvider.minimumBoundary(); |
- var windowRight = this._timeWindowRight !== Infinity ? this._timeWindowRight : this._dataProvider.minimumBoundary() + this._dataProvider.totalTime(); |
- return {left: windowLeft, right: windowRight}; |
- }, |
- |
- /** |
- * @param {{left: number, right: number}} bounds |
- * @private |
- */ |
- _requestWindowTimes: function(bounds) |
- { |
- bounds.left = Number.constrain(bounds.left, this._minimumBoundary, this._totalTime + this._minimumBoundary); |
- bounds.right = Number.constrain(bounds.right, this._minimumBoundary, this._totalTime + this._minimumBoundary); |
- if (bounds.right - bounds.left < WebInspector.FlameChart.MinimalTimeWindowMs) |
- return; |
- this._flameChartDelegate.requestWindowTimes(bounds.left, bounds.right); |
- }, |
- |
- /** |
- * @param {number} startTime |
- * @param {number} endTime |
- * @private |
- */ |
- _animateWindowTimes: function(startTime, endTime) |
- { |
- this._timeWindowLeft = startTime; |
- this._timeWindowRight = endTime; |
- this._updateHighlight(); |
- this.update(); |
- }, |
- |
- /** |
- * @private |
- */ |
- _animationCompleted: function() |
- { |
- delete this._cancelWindowTimesAnimation; |
- this._updateHighlight(); |
- }, |
- |
- /** |
- * @private |
- */ |
- _cancelAnimation: function() |
- { |
- if (!this._cancelWindowTimesAnimation) |
- return; |
- this._timeWindowLeft = this._pendingAnimationTimeLeft; |
- this._timeWindowRight = this._pendingAnimationTimeRight; |
- this._cancelWindowTimesAnimation(); |
- delete this._cancelWindowTimesAnimation; |
- }, |
- |
- scheduleUpdate: function() |
- { |
- if (this._updateTimerId || this._cancelWindowTimesAnimation) |
- return; |
- this._updateTimerId = this.element.window().requestAnimationFrame(() => { |
- this._updateTimerId = 0; |
- this.update(); |
- }); |
- }, |
- |
- update: function() {}, |
- |
- /** |
- * @param {number} startTime |
- * @param {number} endTime |
- */ |
- setWindowTimes: function(startTime, endTime) |
- { |
- this.hideRangeSelection(); |
- if (this._muteAnimation || this._timeWindowLeft === 0 || this._timeWindowRight === Infinity || (startTime === 0 && endTime === Infinity) || (startTime === Infinity && endTime === Infinity)) { |
- // Initial setup. |
- this._timeWindowLeft = startTime; |
- this._timeWindowRight = endTime; |
- this.scheduleUpdate(); |
- return; |
- } |
- this._cancelAnimation(); |
- this._cancelWindowTimesAnimation = WebInspector.animateFunction(this.element.window(), this._animateWindowTimes.bind(this), |
- [{from: this._timeWindowLeft, to: startTime}, {from: this._timeWindowRight, to: endTime}], 5, |
- this._animationCompleted.bind(this)); |
- this._pendingAnimationTimeLeft = startTime; |
- this._pendingAnimationTimeRight = endTime; |
- }, |
- |
- __proto__: WebInspector.VBox.prototype |
+ } |
+ |
+ /** |
+ * @return {boolean} |
+ */ |
+ isDragging() { |
+ return this._isDragging; |
+ } |
+ |
+ /** |
+ * @override |
+ * @return {!Array<!Element>} |
+ */ |
+ elementsToRestoreScrollPositionsFor() { |
+ return [this._vScrollElement]; |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _updateScrollBar() { |
+ var showScroll = this._totalHeight > this._offsetHeight; |
+ if (this._vScrollElement.classList.contains('hidden') !== showScroll) |
+ return; |
+ this._vScrollElement.classList.toggle('hidden', !showScroll); |
+ this._updateContentElementSize(); |
+ } |
+ |
+ /** |
+ * @override |
+ */ |
+ onResize() { |
+ this._updateScrollBar(); |
+ this._updateContentElementSize(); |
+ this.scheduleUpdate(); |
+ } |
+ |
+ reset() { |
+ this._vScrollElement.scrollTop = 0; |
+ this._scrollTop = 0; |
+ this._rangeSelectionStart = 0; |
+ this._rangeSelectionEnd = 0; |
+ this._isDragging = false; |
+ this._dragStartPointX = 0; |
+ this._dragStartPointY = 0; |
+ this._dragStartScrollTop = 0; |
+ this._timeWindowLeft = 0; |
+ this._timeWindowRight = 0; |
+ this._offsetWidth = 0; |
+ this._offsetHeight = 0; |
+ this._totalHeight = 0; |
+ this._pendingAnimationTimeLeft = 0; |
+ this._pendingAnimationTimeRight = 0; |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _updateContentElementSize() { |
+ var offsetWidth = this._vScrollElement.offsetLeft; |
+ if (!offsetWidth) |
+ offsetWidth = this.contentElement.offsetWidth; |
+ this._offsetWidth = offsetWidth; |
+ this._offsetHeight = this.contentElement.offsetHeight; |
+ } |
+ |
+ setContentHeight(totalHeight) { |
+ this._totalHeight = totalHeight; |
+ this._vScrollContent.style.height = totalHeight + 'px'; |
+ this._updateScrollBar(); |
+ if (this._scrollTop + this._offsetHeight <= totalHeight) |
+ return; |
+ this._scrollTop = Math.max(0, totalHeight - this._offsetHeight); |
+ this._vScrollElement.scrollTop = this._scrollTop; |
+ } |
+ |
+ /** |
+ * @param {number} offset |
+ * @param {number=} height |
+ */ |
+ setScrollOffset(offset, height) { |
+ height = height || 0; |
+ if (this._vScrollElement.scrollTop > offset) |
+ this._vScrollElement.scrollTop = offset; |
+ else if (this._vScrollElement.scrollTop < offset - this._offsetHeight + height) |
+ this._vScrollElement.scrollTop = offset - this._offsetHeight + height; |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ scrollOffset() { |
+ return this._vScrollElement.scrollTop; |
+ } |
+ |
+ /** |
+ * @param {!Event} e |
+ * @private |
+ */ |
+ _onMouseWheel(e) { |
+ if (!this._enabled()) |
+ return; |
+ // Pan vertically when shift down only. |
+ var panVertically = e.shiftKey && (e.wheelDeltaY || Math.abs(e.wheelDeltaX) === 120); |
+ var panHorizontally = Math.abs(e.wheelDeltaX) > Math.abs(e.wheelDeltaY) && !e.shiftKey; |
+ if (panVertically) { |
+ this._vScrollElement.scrollTop -= (e.wheelDeltaY || e.wheelDeltaX) / 120 * this._offsetHeight / 8; |
+ } else if (panHorizontally) { |
+ var shift = -e.wheelDeltaX * this._pixelToTime; |
+ this._muteAnimation = true; |
+ this._handlePanGesture(shift); |
+ this._muteAnimation = false; |
+ } else { // Zoom. |
+ const mouseWheelZoomSpeed = 1 / 120; |
+ this._handleZoomGesture(Math.pow(1.2, -(e.wheelDeltaY || e.wheelDeltaX) * mouseWheelZoomSpeed) - 1); |
+ } |
+ |
+ // Block swipe gesture. |
+ e.consume(true); |
+ } |
+ |
+ /** |
+ * @param {number} x |
+ * @param {number} y |
+ * @param {!MouseEvent} event |
+ * @private |
+ * @return {boolean} |
+ */ |
+ _startDragging(x, y, event) { |
+ if (event.shiftKey) |
+ return false; |
+ if (this._windowRight === Infinity) |
+ return false; |
+ this._isDragging = true; |
+ this._initMaxDragOffset(event); |
+ this._dragStartPointX = x; |
+ this._dragStartPointY = y; |
+ this._dragStartScrollTop = this._vScrollElement.scrollTop; |
+ this.viewportElement.style.cursor = ''; |
+ this.hideHighlight(); |
+ return true; |
+ } |
+ |
+ /** |
+ * @param {number} x |
+ * @param {number} y |
+ * @private |
+ */ |
+ _dragging(x, y) { |
+ var pixelShift = this._dragStartPointX - x; |
+ this._dragStartPointX = x; |
+ this._muteAnimation = true; |
+ this._handlePanGesture(pixelShift * this._pixelToTime); |
+ this._muteAnimation = false; |
+ |
+ var pixelScroll = this._dragStartPointY - y; |
+ this._vScrollElement.scrollTop = this._dragStartScrollTop + pixelScroll; |
+ this._updateMaxDragOffset(x, y); |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _endDragging() { |
+ this._isDragging = false; |
+ this._updateHighlight(); |
+ } |
+ |
+ /** |
+ * @param {!MouseEvent} event |
+ * @private |
+ */ |
+ _initMaxDragOffset(event) { |
+ this._maxDragOffsetSquared = 0; |
+ this._dragStartX = event.pageX; |
+ this._dragStartY = event.pageY; |
+ } |
+ |
+ /** |
+ * @param {number} x |
+ * @param {number} y |
+ * @private |
+ */ |
+ _updateMaxDragOffset(x, y) { |
+ var dx = x - this._dragStartX; |
+ var dy = y - this._dragStartY; |
+ var dragOffsetSquared = dx * dx + dy * dy; |
+ this._maxDragOffsetSquared = Math.max(this._maxDragOffsetSquared, dragOffsetSquared); |
+ } |
+ |
+ /** |
+ * @return {number} |
+ */ |
+ maxDragOffset() { |
+ return Math.sqrt(this._maxDragOffsetSquared); |
+ } |
+ |
+ /** |
+ * @param {!MouseEvent} event |
+ * @private |
+ * @return {boolean} |
+ */ |
+ _startRangeSelection(event) { |
+ if (!event.shiftKey) |
+ return false; |
+ this._isDragging = true; |
+ this._initMaxDragOffset(event); |
+ this._selectionOffsetShiftX = event.offsetX - event.pageX; |
+ this._selectionOffsetShiftY = event.offsetY - event.pageY; |
+ this._selectionStartX = event.offsetX; |
+ var style = this._selectionOverlay.style; |
+ style.left = this._selectionStartX + 'px'; |
+ style.width = '1px'; |
+ this._selectedTimeSpanLabel.textContent = ''; |
+ this._selectionOverlay.classList.remove('hidden'); |
+ this.hideHighlight(); |
+ return true; |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _endRangeSelection() { |
+ this._isDragging = false; |
+ this._updateHighlight(); |
+ } |
+ |
+ hideRangeSelection() { |
+ this._selectionOverlay.classList.add('hidden'); |
+ } |
+ |
+ /** |
+ * @param {!MouseEvent} event |
+ * @private |
+ */ |
+ _rangeSelectionDragging(event) { |
+ this._updateMaxDragOffset(event.pageX, event.pageY); |
+ var x = Number.constrain(event.pageX + this._selectionOffsetShiftX, 0, this._offsetWidth); |
+ var start = this._cursorTime(this._selectionStartX); |
+ var end = this._cursorTime(x); |
+ this._rangeSelectionStart = Math.min(start, end); |
+ this._rangeSelectionEnd = Math.max(start, end); |
+ this._updateRangeSelectionOverlay(); |
+ this._flameChartDelegate.updateRangeSelection(this._rangeSelectionStart, this._rangeSelectionEnd); |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _updateRangeSelectionOverlay() { |
+ var /** @const */ margin = 100; |
+ var left = Number.constrain(this._timeToPosition(this._rangeSelectionStart), -margin, this._offsetWidth + margin); |
+ var right = Number.constrain(this._timeToPosition(this._rangeSelectionEnd), -margin, this._offsetWidth + margin); |
+ var style = this._selectionOverlay.style; |
+ style.left = left + 'px'; |
+ style.width = (right - left) + 'px'; |
+ var timeSpan = this._rangeSelectionEnd - this._rangeSelectionStart; |
+ this._selectedTimeSpanLabel.textContent = Number.preciseMillisToString(timeSpan, 2); |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _onScroll() { |
+ this._scrollTop = this._vScrollElement.scrollTop; |
+ this.scheduleUpdate(); |
+ } |
+ |
+ /** |
+ * @param {!Event} e |
+ * @private |
+ */ |
+ _handleZoomPanKeys(e) { |
+ if (!WebInspector.KeyboardShortcut.hasNoModifiers(e)) |
+ return; |
+ var zoomMultiplier = e.shiftKey ? 0.8 : 0.3; |
+ var panMultiplier = e.shiftKey ? 320 : 80; |
+ if (e.code === 'KeyA') { |
+ this._handlePanGesture(-panMultiplier * this._pixelToTime); |
+ e.consume(true); |
+ } else if (e.code === 'KeyD') { |
+ this._handlePanGesture(panMultiplier * this._pixelToTime); |
+ e.consume(true); |
+ } else if (e.code === 'KeyW') { |
+ this._handleZoomGesture(-zoomMultiplier); |
+ e.consume(true); |
+ } else if (e.code === 'KeyS') { |
+ this._handleZoomGesture(zoomMultiplier); |
+ e.consume(true); |
+ } |
+ } |
+ |
+ /** |
+ * @param {number} zoom |
+ * @private |
+ */ |
+ _handleZoomGesture(zoom) { |
+ this._cancelAnimation(); |
+ var bounds = this._windowForGesture(); |
+ var cursorTime = this._cursorTime(this._lastMouseOffsetX); |
+ bounds.left += (bounds.left - cursorTime) * zoom; |
+ bounds.right += (bounds.right - cursorTime) * zoom; |
+ this._requestWindowTimes(bounds); |
+ } |
+ |
+ /** |
+ * @param {number} shift |
+ * @private |
+ */ |
+ _handlePanGesture(shift) { |
+ this._cancelAnimation(); |
+ var bounds = this._windowForGesture(); |
+ shift = Number.constrain( |
+ shift, this._minimumBoundary - bounds.left, this._totalTime + this._minimumBoundary - bounds.right); |
+ bounds.left += shift; |
+ bounds.right += shift; |
+ this._requestWindowTimes(bounds); |
+ } |
+ |
+ /** |
+ * @private |
+ * @return {{left: number, right: number}} |
+ */ |
+ _windowForGesture() { |
+ var windowLeft = this._timeWindowLeft ? this._timeWindowLeft : this._dataProvider.minimumBoundary(); |
+ var windowRight = this._timeWindowRight !== Infinity ? |
+ this._timeWindowRight : |
+ this._dataProvider.minimumBoundary() + this._dataProvider.totalTime(); |
+ return {left: windowLeft, right: windowRight}; |
+ } |
+ |
+ /** |
+ * @param {{left: number, right: number}} bounds |
+ * @private |
+ */ |
+ _requestWindowTimes(bounds) { |
+ bounds.left = Number.constrain(bounds.left, this._minimumBoundary, this._totalTime + this._minimumBoundary); |
+ bounds.right = Number.constrain(bounds.right, this._minimumBoundary, this._totalTime + this._minimumBoundary); |
+ if (bounds.right - bounds.left < WebInspector.FlameChart.MinimalTimeWindowMs) |
+ return; |
+ this._flameChartDelegate.requestWindowTimes(bounds.left, bounds.right); |
+ } |
+ |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ * @private |
+ */ |
+ _animateWindowTimes(startTime, endTime) { |
+ this._timeWindowLeft = startTime; |
+ this._timeWindowRight = endTime; |
+ this._updateHighlight(); |
+ this.update(); |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _animationCompleted() { |
+ delete this._cancelWindowTimesAnimation; |
+ this._updateHighlight(); |
+ } |
+ |
+ /** |
+ * @private |
+ */ |
+ _cancelAnimation() { |
+ if (!this._cancelWindowTimesAnimation) |
+ return; |
+ this._timeWindowLeft = this._pendingAnimationTimeLeft; |
+ this._timeWindowRight = this._pendingAnimationTimeRight; |
+ this._cancelWindowTimesAnimation(); |
+ delete this._cancelWindowTimesAnimation; |
+ } |
+ |
+ scheduleUpdate() { |
+ if (this._updateTimerId || this._cancelWindowTimesAnimation) |
+ return; |
+ this._updateTimerId = this.element.window().requestAnimationFrame(() => { |
+ this._updateTimerId = 0; |
+ this.update(); |
+ }); |
+ } |
+ |
+ update() { |
+ } |
+ |
+ /** |
+ * @param {number} startTime |
+ * @param {number} endTime |
+ */ |
+ setWindowTimes(startTime, endTime) { |
+ this.hideRangeSelection(); |
+ if (this._muteAnimation || this._timeWindowLeft === 0 || this._timeWindowRight === Infinity || |
+ (startTime === 0 && endTime === Infinity) || (startTime === Infinity && endTime === Infinity)) { |
+ // Initial setup. |
+ this._timeWindowLeft = startTime; |
+ this._timeWindowRight = endTime; |
+ this.scheduleUpdate(); |
+ return; |
+ } |
+ this._cancelAnimation(); |
+ this._cancelWindowTimesAnimation = WebInspector.animateFunction( |
+ this.element.window(), this._animateWindowTimes.bind(this), |
+ [{from: this._timeWindowLeft, to: startTime}, {from: this._timeWindowRight, to: endTime}], 5, |
+ this._animationCompleted.bind(this)); |
+ this._pendingAnimationTimeLeft = startTime; |
+ this._pendingAnimationTimeRight = endTime; |
+ } |
}; |