pointerevent_mouse-pointer-preventdefault.html (4141B)
1 <!DOCTYPE HTML> 2 <title>Effect of pointer event prevent-default on compat mouse event</title> 3 <script src="/resources/testharness.js"></script> 4 <script src="/resources/testharnessreport.js"></script> 5 <script src="/resources/testdriver.js"></script> 6 <script src="/resources/testdriver-vendor.js"></script> 7 <script src="/resources/testdriver-actions.js"></script> 8 <script src="../pointerevent_support.js"></script> 9 <style> 10 div { 11 margin: 20px; 12 padding: 20px; 13 background-color: green; 14 user-select: none; // Prevents text selection on drag. 15 } 16 17 </style> 18 <div id="preventer" draggable="false"> 19 <div id="logger" draggable="false"></div> 20 <!-- The following div makes the center of "preventer" outside "logger", which 21 simplifies TestDriver action coordinates below. --> 22 <div></div> 23 </div> 24 <div id="done"></div> 25 26 <script> 27 'use strict'; 28 29 const logger = document.getElementById("logger"); 30 const preventer = document.getElementById("preventer"); 31 const done = document.getElementById("done"); 32 33 const preventing_handler = e => e.preventDefault(); 34 35 let received_events = []; 36 37 const logged_pointer_events = ["pointerdown", "pointermove", "pointerup", 38 "pointerenter", "pointerleave", "pointerover", "pointerout"]; 39 const logged_mouse_events = ["mousedown", "mousemove", "mouseup", 40 "mouseenter", "mouseleave", "mouseover", "mouseout"]; 41 42 const expected_pointer_events = [ 43 "pointerover", "pointerenter", "pointermove", "pointerdown", 44 "pointerout", "pointerleave", "pointerover", "pointerenter", 45 "pointermove", "pointerup", "pointerout", "pointerleave" 46 ]; 47 48 const expected_mouse_events_when_unaffected_by_pointer_events = [ 49 "mouseover", "mouseenter", "mousemove", "mousedown", 50 "mouseout", "mouseleave", "mouseover", "mouseenter", 51 "mousemove", "mouseup", "mouseout", "mouseleave" 52 ]; 53 54 const expected_mouse_events_for_canceled_pointerdown = [ 55 "mouseover", "mouseenter", "mousemove", 56 "mouseout", "mouseleave", "mouseover", "mouseenter", 57 "mouseout", "mouseleave" 58 ]; 59 60 logged_pointer_events.forEach(ename => 61 logger.addEventListener(ename, e => received_events.push(e.type))); 62 63 logged_mouse_events.forEach(ename => 64 logger.addEventListener(ename, e => received_events.push(e.type))); 65 66 for (let i = 0; i < logged_pointer_events.length; i++) { 67 let event_to_cancel = logged_pointer_events[i]; 68 69 promise_test(async (test) => { 70 received_events = []; 71 72 preventer.addEventListener(event_to_cancel, preventing_handler); 73 test.add_cleanup(() => 74 preventer.removeEventListener(event_to_cancel, preventing_handler)); 75 76 let click_on_done = getEvent("click", done, test); 77 78 let actions = new test_driver.Actions() 79 // Start outside all event listeners 80 .pointerMove(0, 0) 81 .pointerDown() 82 .pointerUp() 83 // Drag from inside to outside of "logger" then drag back to inside, 84 // staying within "preventer" all the time 85 .pointerMove(0, 0, { origin: logger }) 86 .pointerDown() 87 .pointerMove(0, 0, { origin: preventer }) 88 .pointerUp() 89 .pointerDown() 90 .pointerMove(0, 0, { origin: logger }) 91 .pointerUp() 92 // Click "done" 93 .pointerMove(0, 0, { origin: done }) 94 .pointerDown() 95 .pointerUp() 96 .send(); 97 98 await actions; 99 await click_on_done; 100 101 assert_array_equals(received_events.filter(isPointerEvent), 102 expected_pointer_events, "expected pointer events"); 103 104 if (event_to_cancel == "pointerdown") { 105 assert_array_equals(received_events.filter(isMouseEvent), 106 expected_mouse_events_for_canceled_pointerdown, 107 "expected mouse events"); 108 } else { 109 assert_array_equals(received_events.filter(isMouseEvent), 110 expected_mouse_events_when_unaffected_by_pointer_events, 111 "expected mouse events"); 112 assert_true(arePointerEventsBeforeCompatMouseEvents(received_events), 113 "compat mouse events follow corresponding pointer events"); 114 } 115 }, `Effect of canceling ${event_to_cancel} on compat mouse events`); 116 } 117 </script>