clicking-noninteractive-unlabelable-content.html (3951B)
1 <!DOCTYPE html> 2 <meta charset=utf-8> 3 <title>Label event handling when a descendant noninteractive and unlabelable 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=noninteractive-unlabelable-content> 9 <div></div> 10 <svg></svg> 11 12 <!-- These are "almost interactive": they could become interactive with the 13 addition/removal of a non-tabindex attribute. --> 14 <a></a> 15 <audio></audio> 16 <img> 17 <input type=hidden> 18 <video></video> 19 20 <!-- These are considered interactive content for the purpose of <label> in a 21 previous version of the HTML Standard, but no longer. --> 22 <a tabindex=""></a> 23 <audio tabindex=""></audio> 24 <div tabindex=""></div> 25 <img tabindex=""> 26 <input type=hidden tabindex=""> 27 <object></object> 28 <object tabindex=""></object> 29 <object usemap=""></object> 30 <video tabindex=""></video> 31 </template> 32 33 <script> 34 "use strict"; 35 36 const template = document.getElementById("noninteractive-unlabelable-content"); 37 { 38 const details = document.createElementNS("http://www.w3.org/2000/svg", "details"); 39 template.content.appendChild(details); 40 } 41 42 const elements = Array.from(template.content.children); 43 const label = document.getElementById("label"); 44 45 for (const srcElement of elements) { 46 test(t => { 47 t.add_cleanup(() => { 48 label.innerHTML = ""; 49 }); 50 51 const element = srcElement.cloneNode(); 52 label.appendChild(element); 53 54 let clicked = 0; 55 element.addEventListener("click", () => { 56 clicked++; 57 }); 58 element.dispatchEvent(new MouseEvent("click", { bubbles: true })); 59 assert_equals(clicked, 1, "clicking interactive content"); 60 61 clicked = 0; 62 const span = document.createElement("span"); 63 element.appendChild(span); 64 span.click(); 65 assert_equals(clicked, 1, "clicking descendant of interactive content"); 66 }, `noninteractive unlabelable content ${srcElement.outerHTML} as first child of <label>`); 67 68 test(t => { 69 t.add_cleanup(() => { 70 label.innerHTML = ""; 71 }); 72 73 const element = srcElement.cloneNode(); 74 const div = document.createElement("div"); 75 div.appendChild(element); 76 label.appendChild(div); 77 78 let clicked = 0; 79 element.addEventListener("click", () => { 80 clicked++; 81 }); 82 element.dispatchEvent(new MouseEvent("click", { bubbles: true })); 83 assert_equals(clicked, 1, "clicking nested interactive content"); 84 85 clicked = 0; 86 const span = document.createElement("span"); 87 element.appendChild(span); 88 span.click(); 89 assert_equals(clicked, 1, "clicking descendant of nested interactive content"); 90 }, `noninteractive unlabelable content ${srcElement.outerHTML} deeply nested under <label>`); 91 92 test(t => { 93 t.add_cleanup(() => { 94 label.innerHTML = ""; 95 }); 96 97 const button = document.createElement("button"); 98 label.appendChild(button); 99 100 const element = srcElement.cloneNode(); 101 label.appendChild(element); 102 103 let buttonClicked = 0; 104 button.addEventListener("click", () => { 105 buttonClicked++; 106 }); 107 108 let clicked = 0; 109 element.addEventListener("click", () => { 110 clicked++; 111 }); 112 element.dispatchEvent(new MouseEvent("click", { bubbles: true })); 113 assert_equals(clicked, 1, "clicking noninteractive unlabelable content"); 114 assert_equals(buttonClicked, 1, "clicking noninteractive unlabelable content should click button"); 115 116 buttonClicked = 0; 117 clicked = 0; 118 const span = document.createElement("span"); 119 element.appendChild(span); 120 span.click(); 121 assert_equals(clicked, 1, "clicking descendant of nested noninteractive unlabelable content"); 122 assert_equals( 123 buttonClicked, 1, 124 "clicking descendant of nested noninteractive unlabelable content should click button" 125 ); 126 }, `noninteractive unlabelable content ${srcElement.outerHTML} as second child under <label>`); 127 } 128 129 </script> 130 </body>