test_getCoalescedEvents.html (5473B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=1303957 5 --> 6 <head> 7 <meta charset="utf-8"> 8 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 9 <title>Test for Bug 1303957</title> 10 <script src="/tests/SimpleTest/EventUtils.js"></script> 11 <script src="/tests/SimpleTest/SimpleTest.js"></script> 12 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 13 </head> 14 <body> 15 <!-- DO NOT PUT any text before the test target to avoid fractional coordinates! --> 16 <div id="target0" style="width: 50px; height: 50px; background: green"></div> 17 <script type="text/javascript"> 18 /** Test for Bug 1303957 */ 19 SimpleTest.waitForExplicitFinish(); 20 21 SimpleTest.waitForFocus(async () => { 22 await SpecialPowers.pushPrefEnv({"set": [ 23 ["dom.events.coalesce.mousemove", true], 24 ["test.events.async.enabled", true], 25 ]}); 26 27 const target0 = window.document.getElementById("target0"); 28 const utils = SpecialPowers.getDOMWindowUtils(window); 29 utils.advanceTimeAndRefresh(0); 30 31 await new Promise(resolve => SimpleTest.executeSoon(resolve)); 32 33 const waitForPointerMove = new Promise(resolve => { 34 target0.addEventListener("pointermove", (ev) => { 35 let length = ev.getCoalescedEvents().length; 36 ok(length >= 1, "Coalesced events should >= 1, got " + length); 37 38 let rect = target0.getBoundingClientRect(); 39 let prevOffsetX = undefined; 40 let prevOffsetY = undefined; 41 42 function isExpectedOffset(aNewOffset, aPrevOffset) { 43 if (aPrevOffset === undefined) { 44 const roundedOffset = 5 * Math.max(Math.round(aNewOffset / 5), 1); 45 return aNewOffset >= roundedOffset - 1 && aNewOffset <= roundedOffset + 1; 46 } 47 let candidateOffset = aPrevOffset + 5; 48 const toleranceError = navigator.userAgent.includes("Android") ? 0.31 : 0.1; 49 while (candidateOffset < 25) { 50 if ( 51 aNewOffset >= candidateOffset - toleranceError && 52 aNewOffset <= candidateOffset + toleranceError 53 ) { 54 return true; 55 } 56 candidateOffset += 5; 57 } 58 return false; 59 } 60 61 for (let i = 0; i < length; ++i) { 62 let coalescedEvent = ev.getCoalescedEvents()[i]; 63 isnot(coalescedEvent.timeStamp, 0, "getCoalescedEvents()[" + i + "].timeStamp"); 64 is(coalescedEvent.type, "pointermove", "getCoalescedEvents()[" + i + "].type"); 65 is(coalescedEvent.pointerId, ev.pointerId, "getCoalescedEvents()[" + i + "].pointerId"); 66 is(coalescedEvent.pointerType, ev.pointerType, "getCoalescedEvents()[" + i + "].pointerType"); 67 is(coalescedEvent.isPrimary, ev.isPrimary, "getCoalescedEvents()[" + i + "].isPrimary"); 68 is(coalescedEvent.target, ev.target, "getCoalescedEvents()[" + i + "].target"); 69 is(coalescedEvent.currentTarget, null, "getCoalescedEvents()[" + i + "].currentTarget"); 70 is(coalescedEvent.eventPhase, Event.NONE, "getCoalescedEvents()[" + i + "].eventPhase"); 71 is(coalescedEvent.cancelable, false, "getCoalescedEvents()[" + i + "].cancelable"); 72 is(coalescedEvent.bubbles, false, "getCoalescedEvents()[" + i + "].bubbles"); 73 is(coalescedEvent.buttons, 0, `getCoalescedEvents()[${i}].buttons should be 0`); 74 is(coalescedEvent.pressure, 0, `getCoalescedEvents()[${i}].pressure should be 0 when buttons is 0`); 75 76 ok( 77 isExpectedOffset(coalescedEvent.offsetX, prevOffsetX), 78 `getCoalescedEvents()[${i}].offsetX (${ 79 coalescedEvent.offsetX 80 }) should be 5 * n + previous offsetX (${prevOffsetX})` 81 ); 82 ok( 83 isExpectedOffset(coalescedEvent.offsetY, prevOffsetY), 84 `getCoalescedEvents()[${i}].offsetY (${ 85 coalescedEvent.offsetY 86 }) should be 5 * n + previous offsetY (${prevOffsetY})` 87 ); 88 89 prevOffsetX = coalescedEvent.offsetX; 90 prevOffsetY = coalescedEvent.offsetY; 91 92 let x = rect.left + prevOffsetX; 93 let y = rect.top + prevOffsetY; 94 // coordinates may change slightly due to rounding 95 ok((coalescedEvent.clientX <= x+2) && (coalescedEvent.clientX >= x-2), "getCoalescedEvents()[" + i + "].clientX"); 96 ok((coalescedEvent.clientY <= y+2) && (coalescedEvent.clientY >= y-2), "getCoalescedEvents()[" + i + "].clientY"); 97 } 98 resolve(); 99 }, { once: true }); 100 }); 101 102 info(`mozInnerScreen={${SpecialPowers.wrap(window).mozInnerScreenX}, ${SpecialPowers.wrap(window).mozInnerScreenY}}`); 103 info(`devicePixelRatio=${window.devicePixelRatio}`); 104 try { 105 info(`top.mozInnerScreen={${SpecialPowers.wrap(window.top).mozInnerScreenX}, ${SpecialPowers.wrap(window.top).mozInnerScreenY}}`); 106 info(`top.getResolution()=${SpecialPowers.wrap(window.top).windowUtils.getResolution()}`); 107 } catch (e) {} 108 info(`target0.getBoundingClientRect()={${target0.getBoundingClientRect().x}, ${target0.getBoundingClientRect().y}}`); 109 110 info("Synthesizing mouse moves...."); 111 synthesizeMouse(target0, 5, 5, {type: "mousemove"}); 112 synthesizeMouse(target0, 10, 10, {type: "mousemove"}); 113 synthesizeMouse(target0, 15, 15, {type: "mousemove"}); 114 synthesizeMouse(target0, 20, 20, {type: "mousemove"}); 115 utils.restoreNormalRefresh(); 116 await waitForPointerMove; 117 118 target0.addEventListener("pointerup", (ev) => { 119 SimpleTest.finish(); 120 }, { once: true }); 121 122 info("Synthesizing a click...."); 123 synthesizeMouse(target0, 20, 20, {}); 124 }); 125 126 </script> 127 </body> 128 </html>