diff options
Diffstat (limited to 'dom/events/test/test_coalesce_mousewheel.html')
-rw-r--r-- | dom/events/test/test_coalesce_mousewheel.html | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/dom/events/test/test_coalesce_mousewheel.html b/dom/events/test/test_coalesce_mousewheel.html new file mode 100644 index 0000000000..6142cc3201 --- /dev/null +++ b/dom/events/test/test_coalesce_mousewheel.html @@ -0,0 +1,241 @@ +<!DOCTYPE HTML> +<html> +<head> + <meta charset="utf-8"> + <title>mousewheel coalescing</title> + <script src="/tests/SimpleTest/SimpleTest.js"></script> + <script src="/tests/SimpleTest/EventUtils.js"></script> + <script src="apz_test_utils.js"></script> + <script src="apz_test_native_event_utils.js"></script> + <link rel="stylesheet" href="/tests/SimpleTest/test.css"/> + <script> + let wheelEvents = []; + function mousewheel(aWheelEvent) { + // Make mousewheel handling slow + var start = performance.now(); + while (performance.now() < (start + 10)); + wheelEvents.push(aWheelEvent); + } + + function resolveIfProcessed(resolve, minamount) { + if (wheelEvents.length >= minamount) { + SimpleTest.requestFlakyTimeout("Make sure we got all events."); + setTimeout(function() { resolve(); }, 20); + } else { + setTimeout(function() { resolveIfProcessed(resolve, minamount); }); + } + } + + const kLineDeltaFactor = + SpecialPowers.getBoolPref("mousewheel.system_scroll_override.enabled", false) + ? SpecialPowers.getIntPref("mousewheel.system_scroll_override.vertical.factor", 200) / 100 + : 1; + + function checkWheelEvents(aExpectedDeltaMode, aExpectedSumOfDeltaY, aDescription) { + const lineDeltaFactor = + aExpectedDeltaMode === WheelEvent.DOM_DELTA_LINE ? kLineDeltaFactor : 1; + let succeeded = true; + let deltaY = 0; + for (const wheelEvent of wheelEvents) { + succeeded &= wheelEvent.deltaMode === aExpectedDeltaMode; + is(wheelEvent.deltaMode, aExpectedDeltaMode, + `When ${aDescription}, the deltaMode of all wheel events should be ${aExpectedDeltaMode}`); + deltaY += wheelEvent.deltaY; + } + succeeded &= deltaY == aExpectedSumOfDeltaY * lineDeltaFactor; + is(deltaY, aExpectedSumOfDeltaY * lineDeltaFactor, + `When ${aDescription}, sum of the deltaY of all wheel events should be ${aExpectedSumOfDeltaY * lineDeltaFactor}`); + return succeeded; + } + + async function testOneSingleWheelEvent() { + await new Promise(function(resolve) { + wheelEvents = []; + var element = document.getElementById("wheelEventReceiver"); + element.addEventListener("wheel", mousewheel, true); + + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + + setTimeout(function() { resolveIfProcessed(resolve, 1); }); + }); + is(wheelEvents.length, 1, + "Synthesizing a wheel event via the parent process should cause 1 wheel event"); + is(wheelEvents[0]?.deltaMode, WheelEvent.DOM_DELTA_LINE, + "When Synthesizing a wheel event via the parent process, the deltaMode of a wheel event should be WheelEvent.DOM_DELTA_LINE"); + is(wheelEvents[0]?.deltaY, 3 * kLineDeltaFactor, + `When Synthesizing a wheel event via the parent process, the deltaY of a wheel event should be ${3 * kLineDeltaFactor}`); + } + + const kMaxRetry = 10; + + async function testTwoSingleWheelEvents() { + function tryIt() { + return new Promise(function(resolve) { + info("Synthesizing 2 wheel events via the parent process..."); + wheelEvents = []; + var element = document.getElementById("wheelEventReceiver"); + element.addEventListener("wheel", mousewheel, true); + + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + + setTimeout(function() { resolveIfProcessed(resolve, 1); }); + }); + } + for (let i = 0; i < kMaxRetry; i++) { + await tryIt(); + if (wheelEvents.length == 2) { + // Even if failed to coalescing, the sum of deltaY values should be same + // as sum of the synthesized ones. + if (!checkWheelEvents(WheelEvent.DOM_DELTA_LINE, 6, + "synthesizing 2 wheel events via the parent process")) { + return false; + } + continue; // retry + } + is(wheelEvents.length, 1, + "Synthesizing 2 wheel events via the parent process should cause only 1 wheel event"); + checkWheelEvents(WheelEvent.DOM_DELTA_LINE, 6, + "synthesizing 2 wheel events via the parent process"); + return; + } + } + + async function testManySingleWheelEvents() { + function tryIt() { + return new Promise(function(resolve) { + info("Synthesizing 5 wheel events via the parent process..."); + wheelEvents = []; + var element = document.getElementById("wheelEventReceiver"); + element.addEventListener("wheel", mousewheel, true); + + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + + setTimeout(function() { resolveIfProcessed(resolve, 1); }); + }); + } + for (let i = 0; i < kMaxRetry; i++) { + await tryIt(); + if (wheelEvents.length > 1 && wheelEvents.length <= 5) { + // Even if failed to coalescing, the sum of deltaY values should be same + // as sum of the synthesized ones. + if (!checkWheelEvents(WheelEvent.DOM_DELTA_LINE, 15, + "synthesizing 5 wheel events via the parent process")) { + return false; + } + continue; // retry + } + is(wheelEvents.length, 1, + "Synthesizing 5 wheel events via the parent process should cause only 1 wheel event"); + checkWheelEvents(WheelEvent.DOM_DELTA_LINE, 15, + "synthesizing 5 wheel events via the parent process"); + return; + } + } + + async function testMixedWheelEvents() { + function tryIt() { + return new Promise(function(resolve) { + info("Synthesizing 2 line wheel events, 1 page wheel event and 1 line wheel event..."); + wheelEvents = []; + var element = document.getElementById("wheelEventReceiver"); + element.addEventListener("wheel", mousewheel, true); + + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_PAGE }); + synthesizeWheel(element, 10, 10, { deltaY: 3.0, deltaMode: WheelEvent.DOM_DELTA_LINE }); + + setTimeout(function() { resolveIfProcessed(resolve, 3); }); + }); + } + function checkGroupsOfWheelEvents() { + let succeeded = true; + let deltaY = [0, 0, 0]; + let index = 0; + const description = "synthesizing 2 line wheel events, 1 page wheel event and 1 line wheel event"; + for (const wheelEvent of wheelEvents) { + switch (index) { + case 0: + if (wheelEvent.deltaMode === WheelEvent.DOM_DELTA_LINE) { + is(wheelEvent.deltaMode, WheelEvent.DOM_DELTA_LINE, + `When ${description}, the deltaMode of the first group should be WheelEvent.DOM_DELTA_LINE`); + break; + } + index++; + // fallthrough + case 1: + if (wheelEvent.deltaMode === WheelEvent.DOM_DELTA_PAGE) { + is(wheelEvent.deltaMode, WheelEvent.DOM_DELTA_PAGE, + `When ${description}, the deltaMode of the seconde group should be WheelEvent.DOM_DELTA_PAGE`); + break; + } + index++; + // fallthrough + case 2: + succeeded &= wheelEvent.deltaMode === WheelEvent.DOM_DELTA_LINE; + is(wheelEvent.deltaMode, WheelEvent.DOM_DELTA_LINE, + `When ${description}, the deltaMode of the last group should be WheelEvent.DOM_DELTA_LINE`); + break; + } + deltaY[index] += wheelEvent.deltaY; + } + succeeded &= deltaY == [6 * kLineDeltaFactor, 3, 3 * kLineDeltaFactor]; + isDeeply(deltaY, [6 * kLineDeltaFactor, 3, 3 * kLineDeltaFactor], + `When ${description}, sum of the deltaY of the each wheel event group should be same as sum of the synthesized ones`); + return succeeded; + } + for (let i = 0; i < kMaxRetry; i++) { + await tryIt(); + if (wheelEvents.length != 3 && wheelEvents.length > 1 && wheelEvents.length <= 5) { + // Even if failed to coalescing, the sum of deltaY values should be same + // as sum of the synthesized ones and the wheel events shouldn't be + // reordered. + if (!checkGroupsOfWheelEvents()) { + return false; + } + continue; // retry + } + is(wheelEvents.length, 3, + "Synthesizing 2 line wheel events, 1 page wheel event and 1 line wheel event via the parent process should cause only 3 wheel events"); + checkGroupsOfWheelEvents(); + return; + } + } + + async function runTests() { + var enabled = SpecialPowers.getDOMWindowUtils(window).asyncPanZoomEnabled; + + // Avoid synthesized mousemove events to be fired at the system cursor. + await promiseNativeMouseEvent({ + type: "mousemove", + screenX: 0, + screenY: 0, + }); + + await SpecialPowers.pushPrefEnv({set: [ + ["test.events.async.enabled", true], + ["dom.event.wheel-coalesced.testing", true], + ]}); + await promiseElementReadyForUserInput(document.documentElement); + await SpecialPowers.pushPrefEnv({clear: [["test.events.async.enabled"]]}); + + await testOneSingleWheelEvent(); + await testTwoSingleWheelEvents(); + await testManySingleWheelEvents(); + await testMixedWheelEvents(); + + setTimeout("SimpleTest.finish()"); + window.close(); + } + + </script> +</head> +<body onload="SimpleTest.waitForFocus(runTests);"> + <div id="wheelEventReceiver" style="width:100px;height:100px;"></div> +</body> +</html> |