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