Index: components/test/data/dom_distiller/pinch_tester.js |
diff --git a/components/test/data/dom_distiller/pinch_tester.js b/components/test/data/dom_distiller/pinch_tester.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e2c1df505166790970b0a1003c4bfa1bbb11d8ed |
--- /dev/null |
+++ b/components/test/data/dom_distiller/pinch_tester.js |
@@ -0,0 +1,388 @@ |
+// 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. |
+ |
+var pinchtest = (function() { |
+ 'use strict'; |
+ |
+ function assertTrue(condition, message) { |
+ if (!condition) { |
+ message = message || "Assertion failed"; |
+ console.trace(); |
+ throw new Error(message); |
+ } |
+ } |
+ |
+ function assertClose(a, b, message) { |
+ if (Math.abs(a-b) > 1e-5) { |
+ message = message || "Assertion failed"; |
+ console.log('"', a, '" and "', b, '" are not close.'); |
+ console.trace(); |
+ throw new Error(message); |
+ } |
+ } |
+ |
+ function isEquivalent(a, b) { |
+ // Create arrays of property names |
+ var aProps = Object.getOwnPropertyNames(a); |
+ var bProps = Object.getOwnPropertyNames(b); |
+ |
+ // If number of properties is different, |
+ // objects are not equivalent |
+ if (aProps.length != bProps.length) { |
+ return false; |
+ } |
+ |
+ for (var i = 0; i < aProps.length; i++) { |
+ var propName = aProps[i]; |
+ |
+ // If values of same property are not equal, |
+ // objects are not equivalent |
+ if (a[propName] !== b[propName]) { |
+ return false; |
+ } |
+ } |
+ |
+ // If we made it this far, objects |
+ // are considered equivalent |
+ return true; |
+ } |
+ |
+ function assertEqual(a, b, message) { |
+ if (!isEquivalent(a, b)) { |
+ message = message || "Assertion failed"; |
+ console.log('"', a, '" and "', b, '" are not equal'); |
+ console.trace(); |
+ throw new Error(message); |
+ } |
+ } |
+ |
+ var touch = (function() { |
+ 'use strict'; |
+ var points = {}; |
+ function lowestID() { |
+ var ans = -1; |
+ for(var key in points) { |
+ ans = Math.max(ans, key); |
+ } |
+ return ans + 1; |
+ } |
+ function changeTouchPoint (key, x, y, offsetX, offsetY) { |
+ var e = { |
+ clientX: x, |
+ clientY: y, |
+ pageX: x, |
+ pageY: y |
+ }; |
+ if (typeof(offsetX) === 'number') { |
+ e.clientX += offsetX; |
+ } |
+ if (typeof(offsetY) === 'number') { |
+ e.clientY += offsetY; |
+ } |
+ points[key] = e; |
+ } |
+ return { |
+ addTouchPoint: function(x, y, offsetX, offsetY) { |
+ changeTouchPoint(lowestID(), x, y, offsetX, offsetY); |
+ }, |
+ updateTouchPoint: changeTouchPoint, |
+ releaseTouchPoint: function(key) { |
+ delete points[key]; |
+ }, |
+ events: function() { |
+ var arr = []; |
+ for(var key in points) { |
+ arr.push(points[key]); |
+ } |
+ return { |
+ touches: arr, |
+ preventDefault: function(){} |
+ }; |
+ } |
+ } |
+ }); |
+ |
+ function testZoomOut() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ // Make sure start event doesn't change state |
+ var oldState = pincher.status(); |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.addTouchPoint(300, 300); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ // Make sure extra move event doesn't change state |
+ pincher.handleTouchMove(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ t.updateTouchPoint(0, 150, 150); |
+ t.updateTouchPoint(1, 250, 250); |
+ pincher.handleTouchMove(t.events()); |
+ assertTrue(pincher.status().clampedScale < 0.9); |
+ |
+ // Make sure end event doesn't change state |
+ oldState = pincher.status(); |
+ t.releaseTouchPoint(1); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ } |
+ |
+ function testZoomIn() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ var oldState = pincher.status(); |
+ t.addTouchPoint(150, 150); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.addTouchPoint(250, 250); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ t.updateTouchPoint(0, 100, 100); |
+ t.updateTouchPoint(1, 300, 300); |
+ pincher.handleTouchMove(t.events()); |
+ assertTrue(pincher.status().clampedScale > 1.1); |
+ |
+ oldState = pincher.status(); |
+ t.releaseTouchPoint(1); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ } |
+ |
+ function testZoomOutAndPan() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(300, 300); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 150, 150); |
+ t.updateTouchPoint(1, 250, 250); |
+ pincher.handleTouchMove(t.events()); |
+ t.updateTouchPoint(0, 150, 150, 10, -5); |
+ t.updateTouchPoint(1, 250, 250, 10, -5); |
+ pincher.handleTouchMove(t.events()); |
+ t.releaseTouchPoint(1); |
+ pincher.handleTouchEnd(t.events()); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ |
+ assertClose(pincher.status().shiftX, 10); |
+ assertClose(pincher.status().shiftY, -5); |
+ assertTrue(pincher.status().clampedScale < 0.9); |
+ } |
+ |
+ function testReversible() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(300, 300); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 0, 0); |
+ t.updateTouchPoint(1, 400, 400); |
+ pincher.handleTouchMove(t.events()); |
+ t.releaseTouchPoint(1); |
+ pincher.handleTouchEnd(t.events()); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ t.addTouchPoint(0, 0); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(400, 400); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 100, 100); |
+ t.updateTouchPoint(1, 300, 300); |
+ pincher.handleTouchMove(t.events()); |
+ t.releaseTouchPoint(1); |
+ pincher.handleTouchEnd(t.events()); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ assertClose(pincher.status().clampedScale, 1); |
+ } |
+ |
+ function testMultitouchZoomOut() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ var oldState = pincher.status(); |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.addTouchPoint(300, 300); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.addTouchPoint(100, 300); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.addTouchPoint(300, 100); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ // Multi-touch zoom out. |
+ t.updateTouchPoint(0, 150, 150); |
+ t.updateTouchPoint(1, 250, 250); |
+ t.updateTouchPoint(2, 150, 250); |
+ t.updateTouchPoint(3, 250, 150); |
+ pincher.handleTouchMove(t.events()); |
+ |
+ oldState = pincher.status(); |
+ t.releaseTouchPoint(3); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.releaseTouchPoint(2); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.releaseTouchPoint(1); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ assertTrue(pincher.status().clampedScale < 0.9); |
+ } |
+ |
+ function testZoomOutThenMulti() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ var oldState = pincher.status(); |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.addTouchPoint(300, 300); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ // Zoom out. |
+ t.updateTouchPoint(0, 150, 150); |
+ t.updateTouchPoint(1, 250, 250); |
+ pincher.handleTouchMove(t.events()); |
+ assertTrue(pincher.status().clampedScale < 0.9); |
+ |
+ // Make sure adding and removing more point doesn't change state |
+ oldState = pincher.status(); |
+ t.addTouchPoint(600, 600); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ t.releaseTouchPoint(2); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ // More than two fingers. |
+ t.addTouchPoint(150, 250); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(250, 150); |
+ pincher.handleTouchStart(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ t.updateTouchPoint(0, 100, 100); |
+ t.updateTouchPoint(1, 300, 300); |
+ t.updateTouchPoint(2, 100, 300); |
+ t.updateTouchPoint(3, 300, 100); |
+ pincher.handleTouchMove(t.events()); |
+ assertClose(pincher.status().scale, 1); |
+ |
+ oldState = pincher.status(); |
+ t.releaseTouchPoint(3); |
+ t.releaseTouchPoint(2); |
+ t.releaseTouchPoint(1); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchEnd(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ } |
+ |
+ function testCancel() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(300, 300); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 150, 150); |
+ t.updateTouchPoint(1, 250, 250); |
+ pincher.handleTouchMove(t.events()); |
+ assertTrue(pincher.status().clampedScale < 0.9); |
+ |
+ var oldState = pincher.status(); |
+ t.releaseTouchPoint(1); |
+ t.releaseTouchPoint(0); |
+ pincher.handleTouchCancel(t.events()); |
+ assertEqual(oldState, pincher.status()); |
+ |
+ t.addTouchPoint(150, 150); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(250, 250); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 100, 100); |
+ t.updateTouchPoint(1, 300, 300); |
+ pincher.handleTouchMove(t.events()); |
+ assertClose(pincher.status().clampedScale, 1); |
+ } |
+ |
+ function testSingularity() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(100, 100); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 150, 150); |
+ t.updateTouchPoint(1, 50, 50); |
+ pincher.handleTouchMove(t.events()); |
+ assertTrue(pincher.status().clampedScale > 1.1); |
+ assertTrue(pincher.status().clampedScale < 100); |
+ assertTrue(pincher.status().scale < 100); |
+ |
+ pincher.handleTouchCancel(); |
+ } |
+ |
+ function testMinSpan() { |
+ pincher.reset(); |
+ var t = new touch(); |
+ |
+ t.addTouchPoint(50, 50); |
+ pincher.handleTouchStart(t.events()); |
+ t.addTouchPoint(150, 150); |
+ pincher.handleTouchStart(t.events()); |
+ t.updateTouchPoint(0, 100, 100); |
+ t.updateTouchPoint(1, 100, 100); |
+ pincher.handleTouchMove(t.events()); |
+ assertTrue(pincher.status().clampedScale < 0.9); |
+ assertTrue(pincher.status().clampedScale > 0); |
+ assertTrue(pincher.status().scale > 0); |
+ |
+ pincher.handleTouchCancel(); |
+ } |
+ |
+ return { |
+ run: function(){ |
+ testZoomOut(); |
+ testZoomIn(); |
+ testZoomOutAndPan(); |
+ testReversible(); |
+ testMultitouchZoomOut(); |
+ testZoomOutThenMulti(); |
+ testCancel(); |
+ testSingularity(); |
+ testMinSpan(); |
+ pincher.reset(); |
+ |
+ return {success: true}; |
+ } |
+ }; |
+}()); |