clicking-interactive-content.html (3446B)
1 <!DOCTYPE html> 2 <meta charset="utf-8"> 3 <title>Label event handling when a descendant interactive content is clicked</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <body> 7 <label id=label></label> 8 <template id=interactive-content> 9 <a href="about:blank" onclick="event.preventDefault()"></a> 10 <audio controls></audio> 11 <button></button> 12 <details></details> 13 <embed> 14 <iframe></iframe> 15 <img usemap=""> 16 <input> 17 <label>label</label> 18 <select></select> 19 <textarea></textarea> 20 <video controls></video> 21 </template> 22 23 <script> 24 "use strict"; 25 26 const interactiveContent = document.getElementById("interactive-content"); 27 const interactiveElements = Array.from(interactiveContent.content.children); 28 const label = document.getElementById("label"); 29 30 for (const srcInteractiveElement of interactiveElements) { 31 test(t => { 32 t.add_cleanup(() => { 33 label.innerHTML = ""; 34 }); 35 36 const interactiveElement = srcInteractiveElement.cloneNode(); 37 label.appendChild(interactiveElement); 38 39 let clicked = 0; 40 interactiveElement.addEventListener("click", () => { 41 clicked++; 42 }); 43 interactiveElement.click(); 44 assert_equals(clicked, 1, "clicking interactive content"); 45 46 clicked = 0; 47 const span = document.createElement("span"); 48 interactiveElement.appendChild(span); 49 span.click(); 50 assert_equals(clicked, 1, "clicking descendant of interactive content"); 51 }, `interactive content ${srcInteractiveElement.outerHTML} as first child of <label>`); 52 53 test(t => { 54 t.add_cleanup(() => { 55 label.innerHTML = ""; 56 }); 57 58 const interactiveElement = srcInteractiveElement.cloneNode(); 59 const div = document.createElement("div"); 60 div.appendChild(interactiveElement); 61 label.appendChild(div); 62 63 let clicked = 0; 64 interactiveElement.addEventListener("click", () => { 65 clicked++; 66 }); 67 interactiveElement.click(); 68 assert_equals(clicked, 1, "clicking nested interactive content"); 69 70 clicked = 0; 71 const span = document.createElement("span"); 72 interactiveElement.appendChild(span); 73 span.click(); 74 assert_equals(clicked, 1, "clicking descendant of nested interactive content"); 75 }, `interactive content ${srcInteractiveElement.outerHTML} deeply nested under <label>`); 76 77 test(t => { 78 t.add_cleanup(() => { 79 label.innerHTML = ""; 80 }); 81 82 const button = document.createElement("button"); 83 label.appendChild(button); 84 85 const interactiveElement = srcInteractiveElement.cloneNode(); 86 label.appendChild(interactiveElement); 87 88 let buttonClicked = 0; 89 button.addEventListener("click", () => { 90 buttonClicked++; 91 }); 92 93 let clicked = 0; 94 interactiveElement.addEventListener("click", () => { 95 clicked++; 96 }); 97 interactiveElement.click(); 98 assert_equals(clicked, 1, "clicking nested interactive content"); 99 assert_equals(buttonClicked, 0, "clicking nested interactive content should not click button"); 100 101 clicked = 0; 102 const span = document.createElement("span"); 103 interactiveElement.appendChild(span); 104 span.click(); 105 assert_equals(clicked, 1, "clicking descendant of nested interactive content"); 106 assert_equals(buttonClicked, 0, "clicking descendant of nested interactive content should not click button"); 107 }, `interactive content ${srcInteractiveElement.outerHTML} as second child under <label>`); 108 } 109 110 </script> 111 </body>