Index: chrome/browser/resources/pdf/viewport_scroller.js |
diff --git a/chrome/browser/resources/pdf/viewport_scroller.js b/chrome/browser/resources/pdf/viewport_scroller.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f46ef4db4126c7c1367eccde8d7029b404470507 |
--- /dev/null |
+++ b/chrome/browser/resources/pdf/viewport_scroller.js |
@@ -0,0 +1,135 @@ |
+// Copyright 2015 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. |
+ |
+'use strict'; |
+ |
+/** |
+ * @private |
+ * The period of time in milliseconds to wait between updating the viewport |
+ * position by the scroll velocity. |
+ */ |
+ViewportScroller.DRAG_TIMER_INTERVAL_MS_ = 100; |
+ |
+/** |
+ * @private |
+ * The maximum drag scroll distance per DRAG_TIMER_INTERVAL in pixels. |
+ */ |
+ViewportScroller.MAX_DRAG_SCROLL_DISTANCE_ = 100; |
+ |
+/** |
+ * Creates a new ViewportScroller. |
+ * A ViewportScroller scrolls the page in response to drag selection with the |
+ * mouse. |
+ * @param {Object} viewport The viewport info of the page. |
+ * @param {Object} plugin The PDF plugin element. |
+ * @param {Object} window The window containing the viewer. |
+ */ |
+function ViewportScroller(viewport, plugin, window) { |
+ this.viewport_ = viewport; |
+ this.plugin_ = plugin; |
+ this.window_ = window; |
+ this.mousemoveCallback_ = null; |
+ this.timerId_ = null; |
+ this.scrollVelocity_ = null; |
+ this.lastFrameTime_ = 0; |
+} |
+ |
+ViewportScroller.prototype = { |
+ /** |
+ * @private |
+ * Start scrolling the page by |scrollVelocity_| every |
+ * |DRAG_TIMER_INTERVAL_MS_|. |
+ */ |
+ startDragScrollTimer_: function() { |
+ if (this.timerId_ === null) { |
+ this.timerId_ = |
+ this.window_.setInterval(this.dragScrollPage_.bind(this), |
+ ViewportScroller.DRAG_TIMER_INTERVAL_MS_); |
+ this.lastFrameTime_ = Date.now(); |
+ } |
+ }, |
+ |
+ /** |
+ * @private |
+ * Stops the drag scroll timer if it is active. |
+ */ |
+ stopDragScrollTimer_: function() { |
+ if (this.timerId_ !== null) { |
+ this.window_.clearInterval(this.timerId_); |
+ this.timerId_ = null; |
+ this.lastFrameTime_ = 0; |
+ } |
+ }, |
+ |
+ /** |
+ * @private |
+ * Scrolls the viewport by the current scroll velocity. |
+ */ |
+ dragScrollPage_: function() { |
+ var position = this.viewport_.position; |
+ var currentFrameTime = Date.now(); |
+ var timeAdjustment = (currentFrameTime - this.lastFrameTime_) / |
+ ViewportScroller.DRAG_TIMER_INTERVAL_MS_; |
+ position.y += (this.scrollVelocity_.y * timeAdjustment); |
+ position.x += (this.scrollVelocity_.x * timeAdjustment); |
+ this.viewport_.position = position; |
+ this.lastFrameTime_ = currentFrameTime; |
+ }, |
+ |
+ /** |
+ * @private |
+ * Calculate the velocity to scroll while dragging using the distance of the |
+ * cursor outside the viewport. |
+ * @param {Object} event The mousemove event. |
+ * @return {Object} Object with x and y direction scroll velocity. |
+ */ |
+ calculateVelocity_: function(event) { |
+ var x = Math.min(Math.max(-event.offsetX, |
+ event.offsetX - this.plugin_.offsetWidth, 0), |
+ ViewportScroller.MAX_DRAG_SCROLL_DISTANCE_) * |
+ Math.sign(event.offsetX); |
+ var y = Math.min(Math.max(-event.offsetY, |
+ event.offsetY - this.plugin_.offsetHeight, 0), |
+ ViewportScroller.MAX_DRAG_SCROLL_DISTANCE_) * |
+ Math.sign(event.offsetY); |
+ return { |
+ x: x, |
+ y: y |
+ }; |
+ }, |
+ |
+ /** |
+ * @private |
+ * Handles mousemove events. It updates the scroll velocity and starts and |
+ * stops timer based on scroll velocity. |
+ * @param {Object} event The mousemove event. |
+ */ |
+ onMousemove_: function(event) { |
+ this.scrollVelocity_ = this.calculateVelocity_(event); |
+ if (!this.scrollVelocity_.x && !this.scrollVelocity_.y) |
+ this.stopDragScrollTimer_(); |
+ else if (!this.timerId_) |
+ this.startDragScrollTimer_(); |
+ }, |
+ |
+ /** |
+ * Sets whether to scroll the viewport when the mouse is outside the |
+ * viewport. |
+ * @param {boolean} isSelecting Represents selection status. |
+ */ |
+ setEnableScrolling: function(isSelecting) { |
+ if (isSelecting) { |
+ if (!this.mousemoveCallback_) |
+ this.mousemoveCallback_ = this.onMousemove_.bind(this); |
+ this.plugin_.addEventListener('mousemove', this.mousemoveCallback_, |
+ false); |
+ } else { |
+ this.stopDragScrollTimer_(); |
+ if (this.mousemoveCallback_) { |
+ this.plugin_.removeEventListener('mousemove', this.mousemoveCallback_, |
+ false); |
+ } |
+ } |
+ } |
+}; |