diff options
Diffstat (limited to 'dom/events/test/file_coalesce_touchmove.html')
-rw-r--r-- | dom/events/test/file_coalesce_touchmove.html | 169 |
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> |