gecko-dev/dom/events/test/file_coalesce_touchmove.html

170 строки
6.3 KiB
HTML

<!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>