test_pointerrawupdate_event_count_touch.html (6485B)
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 for number of pointerrawupdate events of touch</title> 7 <script src="/tests/SimpleTest/EventUtils.js"></script> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <script src="/tests/gfx/layers/apz/test/mochitest/apz_test_native_event_utils.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 </head> 12 <body> 13 <div id="target0" style="margin: 50px; width: 50px; height: 50px; background: green"></div> 14 <script> 15 "use strict"; 16 17 SimpleTest.waitForExplicitFinish(); 18 SimpleTest.requestCompleteLog(); 19 20 if (!window.opener) { 21 // the utils function in apz can't not be used in remote iframe, so run the 22 // test in a new tab. 23 info("run tests in a new tab"); 24 window.open("test_pointerrawupdate_event_count_touch.html"); 25 } else { 26 async function runTests() { 27 const target0 = window.document.getElementById("target0"); 28 const utils = SpecialPowers.getDOMWindowUtils(window); 29 utils.advanceTimeAndRefresh(0); 30 const allEvents = []; 31 const pointerRawUpdateEvents = []; 32 const coalescedPointerMoveEvents = []; 33 34 function stringifyPointerEvent(event) { 35 return `{ screenX: ${event.screenX}, screenY: ${ 36 event.screenY 37 }, clientX: ${event.clientX}, clientY:${event.clientY}, buttons:${ 38 event.buttons 39 }, pointerId: ${event.pointerId}, pointerType:"${event.pointerType}" }`; 40 } 41 42 SimpleTest.executeSoon(async () => { 43 function putEventToAllEvents(event) { 44 allEvents.push(event); 45 } 46 const allEventsToLog = [ 47 "pointerdown", 48 "pointerup", 49 "pointermove", 50 "pointerrawupdate", 51 "pointerover", 52 "pointerenter", 53 "pointerout", 54 "pointerleave", 55 "pointercancel", 56 ]; 57 for (const type of allEventsToLog) { 58 target0.addEventListener(type, putEventToAllEvents, {capture: true}); 59 } 60 function onPointerRawUpdate(event) { 61 // Windows may notify unexpected mouse move when multiple pointers are 62 // used even without the user actually moves the mouse. Let's ignore 63 // the events since they are not what we're checking in this test. 64 if (event.pointerType != "touch") { 65 return; 66 } 67 pointerRawUpdateEvents.push(event); 68 // Currently, we need to compute the coordinates of the coalesced events 69 // while the host event is being dispatched. See bug 1960530. 70 event.getCoalescedEvents(); 71 } 72 target0.addEventListener("pointerrawupdate", onPointerRawUpdate); 73 const waitForPointerMove = new Promise(resolve => { 74 function onPointerMove(event) { 75 // Windows may notify unexpected mouse move when multiple pointers are 76 // used even without the user actually moves the mouse. Let's ignore 77 // the events since they are not what we're checking in this test. 78 if (event.pointerType != "touch") { 79 return; 80 } 81 for (const coalescedEvent of event.getCoalescedEvents()) { 82 coalescedPointerMoveEvents.push(coalescedEvent); 83 } 84 if (pointerRawUpdateEvents.length > 1) { 85 target0.removeEventListener("pointermove", onPointerMove); 86 target0.removeEventListener("pointerrawupdate", onPointerRawUpdate); 87 for (const type of allEventsToLog) { 88 target0.removeEventListener(type, putEventToAllEvents, {capture: true}); 89 } 90 resolve(); 91 } 92 } 93 target0.addEventListener("pointermove", onPointerMove); 94 }); 95 96 target0.addEventListener("pointerup", async event => { 97 utils.restoreNormalRefresh(); 98 await waitForPointerMove; 99 for (const event of allEvents) { 100 info(`${event.type}: ${stringifyPointerEvent(event)}`); 101 } 102 opener.ok(!!pointerRawUpdateEvents.length, "At least one pointerrawupdate event should be fired"); 103 { 104 let i = 0; 105 for (const pointerRawUpdateEvent of pointerRawUpdateEvents) { 106 const coalescedEvents = pointerRawUpdateEvent.getCoalescedEvents(); 107 opener.is( 108 coalescedEvents.length, 109 1, 110 `pointerrawupdate(${i}): should have only one coalesced event` 111 ); 112 opener.is( 113 `${coalescedEvents[0].type}: ${stringifyPointerEvent(coalescedEvents[0])}`, 114 `${pointerRawUpdateEvent.type}: ${stringifyPointerEvent(pointerRawUpdateEvent)}`, 115 `pointerrawupdate(${i++}): the coalesced event should have same values as the host event` 116 ); 117 } 118 } 119 for (let i = 0; i < Math.min(pointerRawUpdateEvents.length, coalescedPointerMoveEvents.length); i++) { 120 opener.is( 121 stringifyPointerEvent(pointerRawUpdateEvents[i]), 122 stringifyPointerEvent(coalescedPointerMoveEvents[i]), 123 `pointerrawupdate(${i}): should have same values as coalesced pointermove events` 124 ); 125 } 126 if (pointerRawUpdateEvents.length < coalescedPointerMoveEvents.length) { 127 for (let i = pointerRawUpdateEvents.length; i < coalescedPointerMoveEvents.length; i++) { 128 opener.is( 129 "{}", 130 stringifyPointerEvent(coalescedPointerMoveEvents[i]), 131 `coalescedPointerMoveEvents(${i++}): should not be there` 132 ); 133 } 134 } else if (pointerRawUpdateEvents.length > coalescedPointerMoveEvents.length) { 135 for (let i = coalescedPointerMoveEvents.length; i < pointerRawUpdateEvents.length; i++) { 136 opener.is( 137 stringifyPointerEvent(pointerRawUpdateEvents[i]), 138 "{}", 139 `pointerrawupdate(${i++}): should not be there` 140 ); 141 } 142 } 143 opener.SimpleTest.finish(); 144 window.close(); 145 }, { once: true }); 146 147 let positions = []; 148 for (let i = 10; i <= 40; i+=5) { 149 positions.push([{ x: i, y: i }]); 150 } 151 152 await synthesizeNativeTouchSequences(target0, positions); 153 }); 154 } 155 156 SimpleTest.waitForFocus(() => { 157 SpecialPowers.pushPrefEnv({"set": [ 158 ["dom.event.pointer.rawupdate.enabled", true], 159 ["dom.events.coalesce.touchmove", true], 160 ["dom.events.compress.touchmove", false], 161 ]}, runTests); 162 }); 163 } 164 165 </script> 166 </body> 167 </html>