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

Unified Diff: chrome/browser/resources/pdf/viewport_scroller.js

Issue 814573004: Fix for Multipage selection by dragging mouse in OOP case in PDF. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressing nit. Created 5 years, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/resources/pdf/pdf.js ('k') | pdf/out_of_process_instance.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
+ }
+ }
+ }
+};
« no previous file with comments | « chrome/browser/resources/pdf/pdf.js ('k') | pdf/out_of_process_instance.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698