diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /dom/events/test/file_coalesce_touchmove_ipc.html | |
parent | Initial commit. (diff) | |
download | firefox-43a97878ce14b72f0981164f87f2e35e14151312.tar.xz firefox-43a97878ce14b72f0981164f87f2e35e14151312.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dom/events/test/file_coalesce_touchmove_ipc.html')
-rw-r--r-- | dom/events/test/file_coalesce_touchmove_ipc.html | 193 |
1 files changed, 193 insertions, 0 deletions
diff --git a/dom/events/test/file_coalesce_touchmove_ipc.html b/dom/events/test/file_coalesce_touchmove_ipc.html new file mode 100644 index 0000000000..73e5a1157d --- /dev/null +++ b/dom/events/test/file_coalesce_touchmove_ipc.html @@ -0,0 +1,193 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1"> + <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 touchmoveEvents = []; + function touchmove(e) { + // Make touchmove handling slow + var start = performance.now(); + while (performance.now() < (start + 10)); + touchmoveEvents.push(e); + } + + async function fireLotsOfSingleTouchMoves() { + var ret = new Promise(function(resolve) { + SpecialPowers.loadChromeScript(function() { + /* eslint-env mozilla/chrome-script */ + 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], [0], [0], 0, false); + while (y != endY) { + utils.sendTouchEvent("touchmove", [0], [x], [y], [1], [1], [0], [1], + [0], [0], [0], 0, false); + ++y; + } + utils.sendTouchEvent("touchend", [0], [x], [y], [1], [1], [0], [1], + [0], [0], [0], 0, false); + + }); + + touchmoveEvents = []; + window.addEventListener("touchmove", touchmove, true); + window.addEventListener("touchend", function(e) { + window.removeEventListener("touchmove", touchmove, true); + resolve(touchmoveEvents); + }, {once: true}); + }); + + return ret + } + + async function fireTwoSingleTouches() { + var ret = new Promise(function(resolve) { + SpecialPowers.loadChromeScript(function() { + /* eslint-env mozilla/chrome-script */ + 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], [0], [0], 0, false); + utils.sendTouchEvent("touchmove", [0], [x], [startY], [1], [1], [0], + [1], [0], [0], [0], 0, false); + utils.sendTouchEvent("touchmove", [0], [x], [startY + 1], [1], [1], [0], + [1], [0], [0], [0], 0, false); + utils.sendTouchEvent("touchend", [0], [x], [endY], [1], [1], [0], + [1], [0], [0], [0], 0, false); + }); + + touchmoveEvents = []; + window.addEventListener("touchmove", touchmove, true); + window.addEventListener("touchend", function(e) { + window.removeEventListener("touchmove", touchmove, true); + resolve(touchmoveEvents); + }, {once: true}); + }); + + return ret + } + + async function fireLotsOfMultiTouchMoves() { + var ret = new Promise(function(resolve) { + SpecialPowers.loadChromeScript(function() { + /* eslint-env mozilla/chrome-script */ + 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, 0], [0, 0], [0, 0], 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, 0], [0, 0], [0, 0], 0, false); + ++startY; + } + utils.sendTouchEvent("touchend", [0, 1], [x, x + 1], [endY, endY + 1], + [1, 1], [1, 1], [0, 0], [1, 1], [0, 0], [0, 0], + [0, 0], 0, false); + + }); + + touchmoveEvents = []; + window.addEventListener("touchmove", touchmove, true); + window.addEventListener("touchend", function(e) { + window.removeEventListener("touchmove", touchmove, true); + resolve(touchmoveEvents); + }, {once: true}); + }); + + return ret + } + + function disableIPCCompression() { + return SpecialPowers.pushPrefEnv({"set": [["dom.events.compress.touchmove", + false], + ["dom.events.coalesce.touchmove", + false]]}); + } + + function enableIPCCompression() { + return SpecialPowers.pushPrefEnv({"set": [["dom.events.compress.touchmove", + true], + ["dom.events.coalesce.touchmove", + false]]}); + } + + async function runTests() { + document.body.clientTop; // Flush layout + + await disableIPCCompression(); + var touchMovesWithoutCoalescing = await fireLotsOfSingleTouchMoves(); + await enableIPCCompression(); + var touchMovesWithCoalescing = await fireLotsOfSingleTouchMoves(); + opener.ok(touchMovesWithoutCoalescing.length > touchMovesWithCoalescing.length, + "Coalescing should reduce the number of touchmove events"); + opener.isDeeply(touchMovesWithoutCoalescing.shift().touches, + touchMovesWithCoalescing.shift().touches, + "Shouldn't have coalesced the initial touchmove"); + opener.isDeeply(touchMovesWithoutCoalescing.pop().touches, + touchMovesWithCoalescing.pop().touches, + "The last touchmove event should be up-to-date"); + + await disableIPCCompression(); + var twoTouchMovesWithoutCoalescing = await fireTwoSingleTouches(); + await enableIPCCompression(); + var twoTouchMovesWithCoalescing = await fireTwoSingleTouches(); + opener.is(twoTouchMovesWithoutCoalescing.length, 2, + "Should have got two touchmoves"); + opener.is(twoTouchMovesWithoutCoalescing.length, + twoTouchMovesWithCoalescing.length, + "Shouldn't have coalesced the touchmove."); + + await disableIPCCompression(); + var multiTouchMovesWithoutCoalescing = await fireLotsOfMultiTouchMoves(); + await enableIPCCompression(); + var multiTouchMovesWithCoalescing = await fireLotsOfMultiTouchMoves(); + opener.ok(multiTouchMovesWithoutCoalescing.length > multiTouchMovesWithCoalescing.length, + "Coalescing should reduce the number of multitouch touchmove events"); + opener.isDeeply(multiTouchMovesWithoutCoalescing.shift().touches, + multiTouchMovesWithCoalescing.shift().touches, + "Shouldn't have coalesced the initial multitouch touchmove event"); + opener.isDeeply(multiTouchMovesWithoutCoalescing.pop().touches, + multiTouchMovesWithCoalescing.pop().touches, + "The last multitouch touchmove event should be up-to-date"); + + opener.finish(); + window.close(); + } + + function init() { + SpecialPowers.pushPrefEnv({"set": [["dom.w3c_touch_events.enabled", true]]}, + runTests); + } + </script> +</head> +<body style="height: 100vh;" onload="SimpleTest.waitForFocus(init);"> +</body> +</html> |