Commit fee63e16 authored by mcnee's avatar mcnee Committed by Commit bot

PDF pinch-zoom: preventDefault on 2 finger touchmoves, not touchstarts.

Currently, to prevent native pinch-zoom from interfering with how we
handle pinch-zoom in the PDF viewer, we preventDefault the 2 finger
touchstart that corresponds to the gesture pinch start. However, this
also prevents 2 finger tap gestures.

We now preventDefault the 2 finger touchmoves so that native pinch-zoom
is still prevented, while 2 finger tap gestures are not affected.

BUG=716123
CQ_INCLUDE_TRYBOTS=master.tryserver.chromium.linux:closure_compilation

Review-Url: https://codereview.chromium.org/2847893005
Cr-Commit-Position: refs/heads/master@{#468986}
parent 692751dc
...@@ -17,9 +17,9 @@ class GestureDetector { ...@@ -17,9 +17,9 @@ class GestureDetector {
this.element_ = element; this.element_ = element;
this.element_.addEventListener( this.element_.addEventListener(
'touchstart', this.onTouchStart_.bind(this), { passive: false }); 'touchstart', this.onTouchStart_.bind(this), { passive: true });
this.element_.addEventListener( this.element_.addEventListener(
'touchmove', this.onTouch_.bind(this), { passive: true }); 'touchmove', this.onTouch_.bind(this), { passive: false });
this.element_.addEventListener( this.element_.addEventListener(
'touchend', this.onTouch_.bind(this), { passive: true }); 'touchend', this.onTouch_.bind(this), { passive: true });
this.element_.addEventListener( this.element_.addEventListener(
...@@ -64,10 +64,7 @@ class GestureDetector { ...@@ -64,10 +64,7 @@ class GestureDetector {
* @param {!TouchEvent} event Touch event on the element. * @param {!TouchEvent} event Touch event on the element.
*/ */
onTouchStart_(event) { 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) { if (event.touches.length == 2) {
event.preventDefault();
this.pinchStartEvent_ = event; this.pinchStartEvent_ = event;
this.lastEvent_ = event; this.lastEvent_ = event;
this.notify_({ this.notify_({
...@@ -103,6 +100,10 @@ class GestureDetector { ...@@ -103,6 +100,10 @@ class GestureDetector {
return; return;
} }
// We must preventDefault two finger touchmoves. By doing so native
// pinch-zoom does not interfere with our way of handling the event.
event.preventDefault();
let scaleRatio = GestureDetector.pinchScaleRatio_(event, this.lastEvent_); let scaleRatio = GestureDetector.pinchScaleRatio_(event, this.lastEvent_);
let startScaleRatio = GestureDetector.pinchScaleRatio_( let startScaleRatio = GestureDetector.pinchScaleRatio_(
event, this.pinchStartEvent_); event, this.pinchStartEvent_);
......
...@@ -182,24 +182,34 @@ chrome.test.runTests(function() { ...@@ -182,24 +182,34 @@ chrome.test.runTests(function() {
let gestureDetector = new GestureDetector(stubElement); let gestureDetector = new GestureDetector(stubElement);
let pinchListener = new PinchListener(gestureDetector); let pinchListener = new PinchListener(gestureDetector);
// Ensure that the touchstart listener is not passive, otherwise the // Ensure that the touchmove listener is not passive, otherwise the
// call to preventDefault will be ignored. Since listeners could default // call to preventDefault will be ignored. Since listeners could default
// to being passive, we must set the value explicitly // to being passive, we must set the value explicitly
// (see crbug.com/675730). // (see crbug.com/675730).
for (let l of stubElement.listeners.get('touchstart')) { for (let l of stubElement.listeners.get('touchmove')) {
let options = stubElement.listenerOptions.get(l); let options = stubElement.listenerOptions.get(l);
chrome.test.assertTrue(!!options && chrome.test.assertTrue(!!options &&
typeof(options.passive) == 'boolean'); typeof(options.passive) == 'boolean');
chrome.test.assertFalse(options.passive); chrome.test.assertFalse(options.passive);
} }
// We should not preventDefault the touchstart for 2 fingers, since this
// could just be a 2 finger tap.
let pinchStartEvent = new MockTouchEvent('touchstart', [ let pinchStartEvent = new MockTouchEvent('touchstart', [
{clientX: 0, clientY: 0}, {clientX: 0, clientY: 0},
{clientX: 0, clientY: 2} {clientX: 0, clientY: 2}
]); ]);
stubElement.sendEvent(pinchStartEvent); stubElement.sendEvent(pinchStartEvent);
chrome.test.assertEq('pinchstart', pinchListener.lastEvent.type); chrome.test.assertEq('pinchstart', pinchListener.lastEvent.type);
chrome.test.assertTrue(pinchStartEvent.defaultPrevented); chrome.test.assertFalse(pinchStartEvent.defaultPrevented);
let pinchUpdateEvent = new MockTouchEvent('touchmove', [
{clientX: 0, clientY: 0},
{clientX: 0, clientY: 4}
]);
stubElement.sendEvent(pinchUpdateEvent);
chrome.test.assertEq('pinchupdate', pinchListener.lastEvent.type);
chrome.test.assertTrue(pinchUpdateEvent.defaultPrevented);
chrome.test.succeed(); chrome.test.succeed();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment