Index: chrome/browser/resources/pdf/pdf.js |
diff --git a/chrome/browser/resources/pdf/pdf.js b/chrome/browser/resources/pdf/pdf.js |
index 9123627f884ba66f0a30883269619f4c3e9d8b41..755025d9bda7b04f0c83add2c640575376dcf66f 100644 |
--- a/chrome/browser/resources/pdf/pdf.js |
+++ b/chrome/browser/resources/pdf/pdf.js |
@@ -58,6 +58,19 @@ function onNavigateInNewTab(url) { |
PDFViewer.MIN_TOOLBAR_OFFSET = 15; |
/** |
+ * The timer interval for drag scroll when we have selection and mouse is |
Sam McNally
2015/02/06 03:43:06
The period of time to wait between updating the vi
Deepak
2015/02/06 08:33:42
Done.
|
+ * dragged out of the viewport. The callback function will get called after |
+ * this interval till timer get cleared. |
+ */ |
+PDFViewer.DRAG_TIMER_INTERVAL = 100; |
+ |
+/** |
+ * The maximum scroll velocity when we have selection and drag mouse out of |
Sam McNally
2015/02/06 03:43:07
The maximum drag scroll velocity.
Deepak
2015/02/06 08:33:43
Done.
|
+ * viewport. |
+ */ |
+PDFViewer.MAX_SCROLL_VELOCITY = 100; |
+ |
+/** |
* Creates a new PDFViewer. There should only be one of these objects per |
* document. |
* @constructor |
@@ -193,6 +206,9 @@ function PDFViewer(streamDetails) { |
this.navigator_ = new Navigator(this.streamDetails_.originalUrl, |
this.viewport_, this.paramsParser_, onNavigateInCurrentTab, |
onNavigateInNewTab); |
+ this.mousemoveCallback_ = null; |
+ this.timerId_ = null; |
+ this.scrollVelocity_ = null; |
} |
PDFViewer.prototype = { |
@@ -519,7 +535,106 @@ PDFViewer.prototype = { |
if (this.isMaterial_) |
this.bookmarksPane.bookmarks = message.data.bookmarks; |
break; |
+ case 'setIsSelecting': |
+ if (message.data.isSelecting && !this.mousemoveCallback_) { |
+ this.mousemoveCallback_ = this.selectionDragListener_.bind(this); |
Sam McNally
2015/02/06 03:43:07
I meant only do this once and then reuse the same
Deepak
2015/02/06 08:33:43
Done.
|
+ this.plugin_.addEventListener('mousemove', |
Sam McNally
2015/02/06 03:43:07
Break after the (.
Deepak
2015/02/06 08:33:43
ok, I will run clang format for this.
|
+ this.mousemoveCallback_, false); |
+ } else { |
+ this.clearTimerInterval_(); |
+ if (this.mousemoveCallback_) { |
+ this.plugin_.removeEventListener('mousemove', |
Sam McNally
2015/02/06 03:43:07
Ditto.
Deepak
2015/02/06 08:33:43
Done.
|
+ this.mousemoveCallback_, false); |
+ this.mousemoveCallback_ = null; |
Sam McNally
2015/02/06 03:43:07
Delete.
Deepak
2015/02/06 08:33:43
Done.
|
+ } |
+ } |
+ break; |
+ } |
+ }, |
+ |
+ /** |
+ * @private |
+ * Start the timer to call dragScrollPage_ function at regular interval till |
Sam McNally
2015/02/06 03:43:07
until the timer is stopped.
Deepak
2015/02/06 08:33:43
Done.
|
+ * timer get cleared. |
+ */ |
+ setTimerInterval_: function() { |
Sam McNally
2015/02/06 03:43:07
startDragScrollTimer_
Deepak
2015/02/06 08:33:43
Done.
|
+ this.timerId_ = |
+ window.setInterval(this.dragScrollPage_.bind(this), |
+ PDFViewer.DRAG_TIMER_INTERVAL); |
+ }, |
+ |
+ /** |
+ * @private |
+ * Clear the timer if it is active and reset timerId_. |
Sam McNally
2015/02/06 03:43:06
Stops the drag scroll timer if it is active.
Deepak
2015/02/06 08:33:43
Done.
|
+ */ |
+ clearTimerInterval_: function() { |
Sam McNally
2015/02/06 03:43:07
stopDragScrollTimer_
Deepak
2015/02/06 08:33:43
Done.
|
+ if (this.timerId_ !== null) { |
+ window.clearInterval(this.timerId_); |
+ this.timerId_ = null; |
+ } |
+ }, |
+ |
+ /** |
+ * @private |
+ * Handles scrolling in the page when we drag mouse out of the viewport and |
Sam McNally
2015/02/06 03:43:07
Scrolls the viewport by the current scroll velocit
Deepak
2015/02/06 08:33:43
Done.
|
+ * does not get mousemove event. |
+ */ |
+ dragScrollPage_: function() { |
+ var position = this.viewport_.position; |
+ position.y += this.scrollVelocity_.y; |
+ position.x += this.scrollVelocity_.x; |
+ this.viewport_.position = position; |
+ }, |
+ |
+ /** |
+ * @private |
+ * Calculate velocity of scroll in the x and y direction when we drag mouse |
Sam McNally
2015/02/06 03:43:07
Calculate the velocity to scroll while dragging us
Deepak
2015/02/06 08:33:43
Done.
|
+ * out of the viewport and does not move mouse. The scroll velocity depends |
+ * upon mouse pointer distance from the viewport. |
+ * @return {Object} Object with x and y direction scroll velocity. |
+ */ |
+ calculateVelocity_: function(event) { |
+ var x = Math.min(Math.max(-event.offsetX, event.offsetX - |
Sam McNally
2015/02/06 03:43:07
Please clang-format this.
Deepak
2015/02/06 08:33:43
Done.
|
+ this.plugin_.offsetWidth, 0), PDFViewer.MAX_SCROLL_VELOCITY) * |
+ Math.sign(event.offsetX); |
+ var y = Math.min(Math.max(-event.offsetY, event.offsetY - |
+ this.plugin_.offsetHeight, 0), PDFViewer.MAX_SCROLL_VELOCITY) * |
+ Math.sign(event.offsetY); |
+ return {x: x, y: y}; |
+ }, |
+ |
+ /** |
+ * @private |
+ * Handles mousemove events. Scrolls page when mouse move happen reacting to |
Sam McNally
2015/02/06 03:43:07
This doesn't do any scrolling itself. It just upda
Deepak
2015/02/06 08:33:43
Done.
|
+ * the direction of scroll. When mouse move event does not come then we are |
+ * scrolling based on timer. |
+ * @param {Object} event The mousemove event. |
+ */ |
+ selectionDragListener_: function(event) { |
+ var position = this.viewport_.position; |
Sam McNally
2015/02/06 03:43:06
These bounds checks aren't necessary. Remove them.
Deepak
2015/02/06 08:33:42
Done.
|
+ var viewportRect = { |
+ x1: position.x / this.viewport_.zoom, |
+ y1: position.y / this.viewport_.zoom, |
+ x2: (position.x + this.viewport_.size.width) / this.viewport_.zoom, |
+ y2: (position.y + this.viewport_.size.height) / this.viewport_.zoom |
+ }; |
+ var point = { |
+ x: event.pageX / this.viewport_.zoom, |
+ y: event.pageY / this.viewport_.zoom |
+ }; |
+ |
+ if ((point.x >= viewportRect.x1 && point.x <= viewportRect.x2) && |
+ (point.y >= viewportRect.y1 && point.y <= viewportRect.y2)) { |
+ this.clearTimerInterval_(); |
+ return; |
+ } |
+ this.scrollVelocity_ = this.calculateVelocity_(event); |
+ if ((this.scrollVelocity_.x != 0 || this.scrollVelocity_.y != 0) && |
+ !this.timerId_) { |
+ this.setTimerInterval_(); |
Sam McNally
2015/02/06 03:43:07
Please make setTimerInterval_ idempotent and simpl
Deepak
2015/02/06 08:33:43
Done.
|
} |
+ if (!this.scrollVelocity_.x && !this.scrollVelocity_.y) |
+ this.clearTimerInterval_(); |
}, |
raymes
2015/02/06 03:11:07
Can we move all this stuff into a new class in a s
Deepak
2015/02/06 08:33:43
ya, sure , I will definitely move this code in sep
|
/** |