pointerevent_setpointercapture_to_same_element_twice.html (3404B)
1 <!DOCTYPE HTML> 2 <title>Repeated setPointerCapture calls on the capturing element</title> 3 <meta name="variant" content="?mouse"> 4 <meta name="variant" content="?pen"> 5 <meta name="variant" content="?touch"> 6 <link rel="help" href="https://github.com/w3c/pointerevents/issues/534"> 7 <meta name="viewport" content="width=device-width"> 8 <script src="/resources/testharness.js"></script> 9 <script src="/resources/testharnessreport.js"></script> 10 <script src="/resources/testdriver.js"></script> 11 <script src="/resources/testdriver-actions.js"></script> 12 <script src="/resources/testdriver-vendor.js"></script> 13 <script src="pointerevent_support.js"></script> 14 15 <style> 16 div { 17 width: 50px; 18 height: 50px; 19 touch-action: none; 20 user-select: none; 21 } 22 </style> 23 24 <div id="target"></div> 25 <div id="other"></div> 26 <div id="done"></div> 27 28 <script> 29 'use strict'; 30 const pointer_type = location.search.substring(1); 31 32 const target = document.getElementById("target"); 33 const other = document.getElementById("other"); 34 const done = document.getElementById("done"); 35 36 let event_log = []; 37 function logEvent(e) { 38 if (e.type === "pointermove" && e.buttons == 0) { 39 // Move events w/o button pressed are irrelevant, and could be noisy too. 40 return; 41 } 42 event_log.push(e.type + "@" + e.target.id); 43 } 44 45 const logged_events = [ 46 "pointerdown", "pointermove", "pointerup", "gotpointercapture", "lostpointercapture" 47 ]; 48 logged_events.forEach(ename => { 49 [target, other].forEach(div => div.addEventListener(ename, logEvent)); 50 }); 51 52 target.addEventListener("pointerdown", e => { 53 other.setPointerCapture(e.pointerId); 54 }); 55 56 const expected_events = [ 57 "pointerdown@target", "gotpointercapture@other", 58 "pointermove@other", "pointerup@other", 59 "lostpointercapture@other" 60 ]; 61 62 promise_test(async () => { 63 event_log = []; 64 65 target.addEventListener("pointermove", e => { 66 target.setPointerCapture(e.pointerId); 67 }); 68 69 let done_click_promise = getEvent("click", done); 70 71 let actions = new test_driver.Actions() 72 .addPointer("TestPointer", pointer_type) 73 .pointerMove(0, 0, {origin: target}) 74 .pointerDown() 75 .pointerMove(10, 10, {origin: target}) 76 .pointerUp() 77 .pointerMove(0, 0, {origin: done}) 78 .pointerDown() 79 .pointerUp(); 80 81 await actions.send(); 82 await done_click_promise; 83 84 assert_array_equals(event_log, expected_events, "events received"); 85 }, "A repeated setPointerCapture call does not redispatch capture events"); 86 87 promise_test(async () => { 88 event_log = []; 89 90 target.addEventListener("pointermove", e => { 91 try { 92 // Pick a non-existent random pointerId to force this call to fail. 93 other.setPointerCapture(e.pointerId + 4321); 94 } catch (error) {} 95 }); 96 97 let done_click_promise = getEvent("click", done); 98 99 let actions = new test_driver.Actions() 100 .addPointer("TestPointer", pointer_type) 101 .pointerMove(0, 0, {origin: target}) 102 .pointerDown() 103 .pointerMove(10, 10, {origin: target}) 104 .pointerUp() 105 .pointerMove(0, 0, {origin: done}) 106 .pointerDown() 107 .pointerUp(); 108 109 await actions.send(); 110 await done_click_promise; 111 112 assert_array_equals(event_log, expected_events, "events received"); 113 }, "A failed setPointerCapture call does not affect existing capture"); 114 </script>