summaryrefslogtreecommitdiffstats
path: root/dom/events/test/file_coalesce_touchmove.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/events/test/file_coalesce_touchmove.html')
-rw-r--r--dom/events/test/file_coalesce_touchmove.html169
1 files changed, 169 insertions, 0 deletions
diff --git a/dom/events/test/file_coalesce_touchmove.html b/dom/events/test/file_coalesce_touchmove.html
new file mode 100644
index 0000000000..00172ec596
--- /dev/null
+++ b/dom/events/test/file_coalesce_touchmove.html
@@ -0,0 +1,169 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <meta charset="utf-8">
+ <title>touchmove coalescing</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" href="/tests/SimpleTest/test.css"/>
+ <script>
+ window.oncontextmenu = function(e) {
+ e.preventDefault();
+ }
+
+ window.addEventListener("touchstart", function(e) { e.preventDefault(); },
+ { passive: false} );
+
+ var touchmoveCount = 0;
+ function touchmove() {
+ // Make touchmove handling slow
+ var start = performance.now();
+ while (performance.now() < (start + 10));
+ ++touchmoveCount;
+ }
+
+ async function fireLotsOfSingleTouchMoves() {
+ var ret = new Promise(function(resolve) {
+ SpecialPowers.loadChromeScript(function() {
+ var element = this.actorParent.rootFrameLoader.ownerElement;
+ var rect = element.getBoundingClientRect();
+ var win = element.ownerDocument.defaultView;
+ var utils = win.windowUtils;
+ var x = rect.x + (rect.width / 2);
+ var y = Math.floor(rect.y + (rect.height / 4));
+ var endY = Math.floor(rect.y + ((rect.height / 4) * 2));
+ utils.sendTouchEvent("touchstart", [0], [x], [y], [1], [1], [0], [1],
+ 0, false);
+ while (y != endY) {
+ utils.sendTouchEvent("touchmove", [0], [x], [y], [1], [1], [0], [1],
+ 0, false);
+ ++y;
+ }
+ utils.sendTouchEvent("touchend", [0], [x], [y], [1], [1], [0], [1],
+ 0, false);
+
+ });
+
+ touchmoveCount = 0;
+ window.addEventListener("touchmove", touchmove, true);
+ window.addEventListener("touchend", function(e) {
+ window.removeEventListener("touchmove", touchmove, true);
+ resolve(touchmoveCount);
+ }, {once: true});
+ });
+
+ return ret
+ }
+
+ async function fireTwoSingleTouches() {
+ var ret = new Promise(function(resolve) {
+ SpecialPowers.loadChromeScript(function() {
+ var element = this.actorParent.rootFrameLoader.ownerElement;
+ var rect = element.getBoundingClientRect();
+ var win = element.ownerDocument.defaultView;
+ var utils = win.windowUtils;
+ var x = rect.x + (rect.width / 2);
+ var startY = Math.floor(rect.y + (rect.height / 4));
+ var endY = Math.floor(rect.y + ((rect.height / 4) * 2));
+ utils.sendTouchEvent("touchstart", [0], [x], [startY], [1], [1], [0],
+ [1], 0, false);
+ utils.sendTouchEvent("touchmove", [0], [x], [startY], [1], [1], [0],
+ [1], 0, false);
+ utils.sendTouchEvent("touchmove", [0], [x], [startY + 1], [1], [1], [0],
+ [1], 0, false);
+ utils.sendTouchEvent("touchend", [0], [x], [endY], [1], [1], [0],
+ [1], 0, false);
+ });
+
+ touchmoveCount = 0;
+ window.addEventListener("touchmove", touchmove, true);
+ window.addEventListener("touchend", function(e) {
+ window.removeEventListener("touchmove", touchmove, true);
+ resolve(touchmoveCount);
+ }, {once: true});
+ });
+
+ return ret
+ }
+
+ async function fireLotsOfMultiTouchMoves() {
+ var ret = new Promise(function(resolve) {
+ SpecialPowers.loadChromeScript(function() {
+ var element = this.actorParent.rootFrameLoader.ownerElement;
+ var rect = element.getBoundingClientRect();
+ var win = element.ownerDocument.defaultView;
+ var utils = win.windowUtils;
+ var x = rect.x + (rect.width / 2);
+ var startY = Math.floor(rect.y + (rect.height / 4));
+ var endY = Math.floor(rect.y + ((rect.height / 4) * 2));
+ utils.sendTouchEvent("touchstart", [0, 1], [x, x + 1],
+ [startY, startY + 1], [1, 1], [1, 1], [0, 0],
+ [1, 1], 0, false);
+ while (startY != endY) {
+ utils.sendTouchEvent("touchmove", [0, 1], [x, x + 1],
+ [startY, startY + 1], [1, 1], [1, 1], [0, 0],
+ [1, 1], 0, false);
+ ++startY;
+ }
+ utils.sendTouchEvent("touchend", [0, 1], [x, x + 1], [endY, endY + 1],
+ [1, 1], [1, 1], [0, 0], [1, 1], 0, false);
+
+ });
+
+ touchmoveCount = 0;
+ window.addEventListener("touchmove", touchmove, true);
+ window.addEventListener("touchend", function(e) {
+ window.removeEventListener("touchmove", touchmove, true);
+ resolve(touchmoveCount);
+ }, {once: true});
+ });
+
+ return ret
+ }
+
+ function disableCoalescing() {
+ return SpecialPowers.pushPrefEnv({"set": [["dom.events.compress.touchmove",
+ false]]});
+ }
+
+ function enableCoalescing() {
+ return SpecialPowers.pushPrefEnv({"set": [["dom.events.compress.touchmove",
+ true]]});
+ }
+
+ async function runTests() {
+ await disableCoalescing();
+ var touchMovesWithoutCoalescing = await fireLotsOfSingleTouchMoves();
+ await enableCoalescing();
+ var touchMovesWithCoalescing = await fireLotsOfSingleTouchMoves();
+ opener.ok(touchMovesWithoutCoalescing > touchMovesWithCoalescing,
+ "Coalescing should reduce the number of touchmove events");
+
+ await disableCoalescing();
+ var twoTouchMovesWithoutCoalescing = await fireTwoSingleTouches();
+ await enableCoalescing();
+ var twoTouchMovesWithCoalescing = await fireTwoSingleTouches();
+ opener.is(twoTouchMovesWithoutCoalescing, 2,
+ "Should have got two touchmoves");
+ opener.is(twoTouchMovesWithoutCoalescing, twoTouchMovesWithCoalescing,
+ "Shouldn't have coalesced the initial touchmove.");
+
+ await disableCoalescing();
+ var multiTouchMovesWithoutCoalescing = await fireLotsOfMultiTouchMoves();
+ await enableCoalescing();
+ var multiTouchMovesWithCoalescing = await fireLotsOfMultiTouchMoves();
+ opener.ok(multiTouchMovesWithoutCoalescing > multiTouchMovesWithCoalescing,
+ "Coalescing should reduce the number of multitouch touchmove events");
+
+ opener.setTimeout("SimpleTest.finish()");
+ window.close();
+ }
+
+ function init() {
+ SpecialPowers.pushPrefEnv({"set": [["dom.w3c_touch_events.enabled", true]]},
+ runTests);
+ }
+ </script>
+</head>
+<body onload="SimpleTest.waitForFocus(init);">
+</body>
+</html>