Index: chrome/test/data/pdf/gesture_detector_test.js |
diff --git a/chrome/test/data/pdf/gesture_detector_test.js b/chrome/test/data/pdf/gesture_detector_test.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b73b85aed5bb7ad83fa04638b055c5b8bdc69e58 |
--- /dev/null |
+++ b/chrome/test/data/pdf/gesture_detector_test.js |
@@ -0,0 +1,192 @@ |
+// Copyright 2016 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. |
+ |
+chrome.test.runTests(function() { |
+ 'use strict'; |
+ |
+ class StubElement { |
+ constructor() { |
+ this.listeners_ = new Map([ |
+ ['touchstart', []], |
+ ['touchmove', []], |
+ ['touchend', []], |
+ ['touchcancel', []] |
+ ]); |
+ } |
+ |
+ addEventListener(type, listener) { |
+ if (this.listeners_.has(type)) |
+ this.listeners_.get(type).push(listener); |
+ } |
+ |
+ sendEvent(event) { |
+ for (let l of this.listeners_.get(event.type)) |
+ l(event); |
+ } |
+ } |
+ |
+ class MockTouchEvent { |
+ constructor(type, touches) { |
+ this.type = type; |
+ this.touches = touches; |
+ this.defaultPrevented = false; |
+ } |
+ |
+ preventDefault() { |
+ this.defaultPrevented = true; |
+ } |
+ } |
+ |
+ class PinchListener { |
+ constructor(gestureDetector) { |
+ this.lastEvent = null; |
+ gestureDetector.addEventListener('pinchstart', this.onPinch_.bind(this)); |
+ gestureDetector.addEventListener('pinchupdate', this.onPinch_.bind(this)); |
+ gestureDetector.addEventListener('pinchend', this.onPinch_.bind(this)); |
+ } |
+ |
+ onPinch_(pinchEvent) { |
+ this.lastEvent = pinchEvent; |
+ } |
+ } |
+ |
+ return [ |
+ function testPinchZoomIn() { |
+ let stubElement = new StubElement(); |
+ let gestureDetector = new GestureDetector(stubElement); |
+ let pinchListener = new PinchListener(gestureDetector); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchstart', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 2} |
+ ])); |
+ chrome.test.assertEq({ |
+ type: 'pinchstart', |
+ center: {x: 0, y: 1} |
+ }, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchmove', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 4} |
+ ])); |
+ chrome.test.assertEq({ |
+ type: 'pinchupdate', |
+ scaleRatio: 2, |
+ direction: 'in', |
+ startScaleRatio: 2, |
+ center: {x: 0, y: 2} |
+ }, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchmove', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 8} |
+ ])); |
+ chrome.test.assertEq({ |
+ type: 'pinchupdate', |
+ scaleRatio: 2, |
+ direction: 'in', |
+ startScaleRatio: 4, |
+ center: {x: 0, y: 4} |
+ }, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchend', [])); |
+ chrome.test.assertEq({ |
+ type: 'pinchend', |
+ startScaleRatio: 4, |
+ center: {x: 0, y: 4} |
+ }, pinchListener.lastEvent); |
+ |
+ chrome.test.succeed(); |
+ }, |
+ |
+ function testPinchZoomInAndBackOut() { |
+ let stubElement = new StubElement(); |
+ let gestureDetector = new GestureDetector(stubElement); |
+ let pinchListener = new PinchListener(gestureDetector); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchstart', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 2} |
+ ])); |
+ chrome.test.assertEq({ |
+ type: 'pinchstart', |
+ center: {x: 0, y: 1} |
+ }, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchmove', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 4} |
+ ])); |
+ chrome.test.assertEq({ |
+ type: 'pinchupdate', |
+ scaleRatio: 2, |
+ direction: 'in', |
+ startScaleRatio: 2, |
+ center: {x: 0, y: 2} |
+ }, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchmove', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 2} |
+ ])); |
+ // This should be part of the same gesture as an update. |
+ // A change in direction should not end the gesture and start a new one. |
+ chrome.test.assertEq({ |
+ type: 'pinchupdate', |
+ scaleRatio: 0.5, |
+ direction: 'out', |
+ startScaleRatio: 1, |
+ center: {x: 0, y: 1} |
+ }, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchend', [])); |
+ chrome.test.assertEq({ |
+ type: 'pinchend', |
+ startScaleRatio: 1, |
+ center: {x: 0, y: 1} |
+ }, pinchListener.lastEvent); |
+ |
+ chrome.test.succeed(); |
+ }, |
+ |
+ function testIgnoreTouchScrolling() { |
+ let stubElement = new StubElement(); |
+ let gestureDetector = new GestureDetector(stubElement); |
+ let pinchListener = new PinchListener(gestureDetector); |
+ |
+ let touchScrollStartEvent = new MockTouchEvent('touchstart', [ |
+ {clientX: 0, clientY: 0}, |
+ ]); |
+ stubElement.sendEvent(touchScrollStartEvent); |
+ chrome.test.assertEq(null, pinchListener.lastEvent); |
+ chrome.test.assertFalse(touchScrollStartEvent.defaultPrevented); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchmove', [ |
+ {clientX: 0, clientY: 1}, |
+ ])); |
+ chrome.test.assertEq(null, pinchListener.lastEvent); |
+ |
+ stubElement.sendEvent(new MockTouchEvent('touchend', [])); |
+ chrome.test.assertEq(null, pinchListener.lastEvent); |
+ |
+ chrome.test.succeed(); |
+ }, |
+ |
+ function testPreventNativePinchZoom() { |
+ let stubElement = new StubElement(); |
+ let gestureDetector = new GestureDetector(stubElement); |
+ let pinchListener = new PinchListener(gestureDetector); |
+ |
+ let pinchStartEvent = new MockTouchEvent('touchstart', [ |
+ {clientX: 0, clientY: 0}, |
+ {clientX: 0, clientY: 2} |
+ ]); |
+ stubElement.sendEvent(pinchStartEvent); |
+ chrome.test.assertEq('pinchstart', pinchListener.lastEvent.type); |
+ chrome.test.assertTrue(pinchStartEvent.defaultPrevented); |
+ |
+ chrome.test.succeed(); |
+ } |
+ ]; |
+}()); |