Index: chrome/browser/resources/pdf/gesture_detector.js |
diff --git a/chrome/browser/resources/pdf/gesture_detector.js b/chrome/browser/resources/pdf/gesture_detector.js |
index fde4650d92bbbc6db1d8ed7aa7259c90a9e144c3..ba6ce23a26d98b51962ac4530992c2ae61622088 100644 |
--- a/chrome/browser/resources/pdf/gesture_detector.js |
+++ b/chrome/browser/resources/pdf/gesture_detector.js |
@@ -19,13 +19,13 @@ class GestureDetector { |
this.element_.addEventListener( |
'touchstart', this.onTouchStart_.bind(this), { passive: false }); |
Kevin McNee
2017/05/02 23:18:18
Since we're no longer calling preventDefault in th
dsinclair
2017/05/03 14:18:40
Yea, I'm going to use your Cl for this bit, I'd do
|
this.element_.addEventListener( |
- 'touchmove', this.onTouch_.bind(this), { passive: true }); |
+ 'touchmove', this.onTouch_.bind(this), { passive: false }); |
this.element_.addEventListener( |
'touchend', this.onTouch_.bind(this), { passive: true }); |
this.element_.addEventListener( |
'touchcancel', this.onTouch_.bind(this), { passive: true }); |
- this.pinchStartEvent_ = null; |
+ this.touchStartEvent_ = null; |
this.lastEvent_ = null; |
this.listeners_ = new Map([ |
@@ -47,6 +47,14 @@ class GestureDetector { |
} |
/** |
+ * Returns true if the previous touch start was a two finger touch. |
+ * @return {!bool} True if touch start was two finger. |
Kevin McNee
2017/05/02 23:18:18
The ! is redundant since booleans are non-nullable
dsinclair
2017/05/03 14:18:40
Done.
|
+ */ |
+ isTwoFingerTouch() { |
+ return this.touchStartEvent_ && this.touchStartEvent_.touches.length == 2; |
Kevin McNee
2017/05/02 23:18:19
I notice that |touchStartEvent_| is never cleared
dsinclair
2017/05/03 14:18:40
Done.
|
+ } |
+ |
+ /** |
* Call the relevant listeners with the given |pinchEvent|. |
* @private |
* @param {!Object} pinchEvent The event to notify the listeners of. |
@@ -64,11 +72,9 @@ class GestureDetector { |
* @param {!TouchEvent} event Touch event on the element. |
*/ |
onTouchStart_(event) { |
- // We must preventDefault if there is a two finger touch. By doing so |
- // native pinch-zoom does not interfere with our way of handling the event. |
- if (event.touches.length == 2) { |
- event.preventDefault(); |
- this.pinchStartEvent_ = event; |
+ this.touchStartEvent_ = event; |
+ |
+ if (this.isTwoFingerTouch()) { |
this.lastEvent_ = event; |
this.notify_({ |
type: 'pinchstart', |
@@ -83,21 +89,27 @@ class GestureDetector { |
* @param {!TouchEvent} event Touch event on the element. |
*/ |
onTouch_(event) { |
- if (!this.pinchStartEvent_) |
+ // Missing a lastEvent_ means we either haven't got a touchstart or we've |
+ // finished handling the pinch already. |
+ if (!this.lastEvent_ || !this.isTwoFingerTouch()) |
return; |
+ // Prevent default the touchmove to block the native pinch-zoom. |
+ if (event.type == "touchmove") |
+ event.preventDefault(); |
dsinclair
2017/05/02 19:44:05
This is very similar to https://codereview.chromiu
|
+ |
// Check if the pinch ends with the current event. |
if (event.touches.length < 2 || |
this.lastEvent_.touches.length !== event.touches.length) { |
let startScaleRatio = GestureDetector.pinchScaleRatio_( |
- this.lastEvent_, this.pinchStartEvent_); |
+ this.lastEvent_, this.touchStartEvent_); |
let center = GestureDetector.center_(this.lastEvent_); |
let endEvent = { |
type: 'pinchend', |
startScaleRatio: startScaleRatio, |
center: center |
}; |
- this.pinchStartEvent_ = null; |
+ |
this.lastEvent_ = null; |
this.notify_(endEvent); |
return; |
@@ -105,7 +117,7 @@ class GestureDetector { |
let scaleRatio = GestureDetector.pinchScaleRatio_(event, this.lastEvent_); |
let startScaleRatio = GestureDetector.pinchScaleRatio_( |
- event, this.pinchStartEvent_); |
+ event, this.touchStartEvent_); |
let center = GestureDetector.center_(event); |
this.notify_({ |
type: 'pinchupdate', |