test_bug557087-3.html (6505B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=557087 5 --> 6 <head> 7 <title>Test for Bug 557087</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <script src="/tests/SimpleTest/EventUtils.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 </head> 12 <body> 13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=557087">Mozilla Bug 557087</a> 14 <p id="display"></p> 15 <div id="content"> 16 </div> 17 <pre id="test"> 18 <script type="application/javascript"> 19 20 /** Test for Bug 557087 */ 21 22 function checkValueMissing(aElement, aExpected) 23 { 24 var msg = aExpected ? aElement.tagName + " should suffer from value missing" 25 : aElement.tagName + " should not suffer from value missing" 26 is(aElement.validity.valueMissing, aExpected, msg); 27 } 28 29 function checkCandidateForConstraintValidation(aElement, aExpected) 30 { 31 var msg = aExpected ? aElement.tagName + " should be candidate for constraint validation" 32 : aElement.tagName + " should not be candidate for constraint validation" 33 is(aElement.willValidate, aExpected, msg); 34 } 35 36 function checkDisabledPseudoClass(aElement, aDisabled) 37 { 38 var disabledElements = document.querySelectorAll(":disabled"); 39 var found = false; 40 41 for (var e of disabledElements) { 42 if (aElement == e) { 43 found = true; 44 break; 45 } 46 } 47 48 var msg = aDisabled ? aElement.tagName + " should have :disabled applying" 49 : aElement.tagName + " should not have :disabled applying"; 50 ok(aDisabled ? found : !found, msg); 51 } 52 53 function checkEnabledPseudoClass(aElement, aEnabled) 54 { 55 var enabledElements = document.querySelectorAll(":enabled"); 56 var found = false; 57 58 for (var e of enabledElements) { 59 if (aElement == e) { 60 found = true; 61 break; 62 } 63 } 64 65 var msg = aEnabled ? aElement.tagName + " should have :enabled applying" 66 : aElement.tagName + " should not have :enabled applying"; 67 ok(aEnabled ? found : !found, msg); 68 } 69 70 function checkFocus(aElement, aExpected) 71 { 72 aElement.setAttribute('tabindex', 1); 73 74 // We use the focus manager so we can test <label>. 75 var fm = SpecialPowers.Cc["@mozilla.org/focus-manager;1"] 76 .getService(SpecialPowers.Ci.nsIFocusManager); 77 fm.setFocus(aElement, 0); 78 79 if (aExpected) { 80 is(document.activeElement, aElement, "element should be focused"); 81 } else { 82 isnot(document.activeElement, aElement, "element should not be focused"); 83 } 84 85 aElement.blur(); 86 aElement.removeAttribute('tabindex'); 87 } 88 89 var elements = [ "input", "button", "select", "textarea", "fieldset", "option", 90 "optgroup", "label", "output", "object" ]; 91 92 var testData = { 93 /* tag name | affected by disabled | test focus | test pseudo-classes | test willValidate */ 94 "INPUT": [ true, true, true, true, true ], 95 "BUTTON": [ true, true, true, false, false ], 96 "SELECT": [ true, true, true, true, false ], 97 "TEXTAREA": [ true, true, true, true, true ], 98 "FIELDSET": [ true, true, true, false, false ], 99 "OPTION": [ false, true, true, false, false ], 100 "OPTGROUP": [ false, true, true, false, false ], 101 "OBJECT": [ false, true, false, false, false ], 102 "LABEL": [ false, true, false, false, false ], 103 "OUTPUT": [ false, true, false, false, false ], 104 }; 105 106 /** 107 * For not candidate elements without disabled attribute and not submittable, 108 * we only have to check that focus and click works even inside a disabled 109 * fieldset. 110 */ 111 function checkElement(aElement, aDisabled) 112 { 113 var data = testData[aElement.tagName]; 114 var expected = data[0] ? !aDisabled : true; 115 116 if (data[1]) { 117 checkFocus(aElement, expected); 118 } 119 120 if (data[2]) { 121 checkEnabledPseudoClass(aElement, data[0] ? !aDisabled : true); 122 checkDisabledPseudoClass(aElement, data[0] ? aDisabled : false); 123 } 124 125 if (data[3]) { 126 checkCandidateForConstraintValidation(aElement, expected); 127 } 128 129 if (data[4]) { 130 checkValueMissing(aElement, expected); 131 } 132 } 133 134 var fieldset1 = document.createElement("fieldset"); 135 var fieldset2 = document.createElement("fieldset"); 136 var legendA = document.createElement("legend"); 137 var legendB = document.createElement("legend"); 138 var content = document.getElementById('content'); 139 content.appendChild(fieldset1); 140 fieldset1.appendChild(fieldset2); 141 fieldset2.disabled = true; 142 143 for (var data of elements) { 144 var element = document.createElement(data); 145 146 if (data[4]) { 147 element.required = true; 148 } 149 150 fieldset1.disabled = false; 151 fieldset2.appendChild(element); 152 153 checkElement(element, fieldset2.disabled); 154 155 // Make sure changes are correctly managed. 156 fieldset2.disabled = false; 157 checkElement(element, fieldset2.disabled); 158 fieldset2.disabled = true; 159 checkElement(element, fieldset2.disabled); 160 161 // Make sure if a fieldset which is not the first fieldset is disabled, the 162 // elements inside the second fielset are disabled. 163 fieldset2.disabled = false; 164 fieldset1.disabled = true; 165 checkElement(element, fieldset1.disabled); 166 167 // Make sure the state change of the inner fieldset will not confuse. 168 fieldset2.disabled = true; 169 fieldset2.disabled = false; 170 checkElement(element, fieldset1.disabled); 171 172 173 /* legend tests */ 174 175 // elements in the first legend of a disabled fieldset should not be disabled. 176 fieldset2.disabled = true; 177 fieldset1.disabled = false; 178 legendA.appendChild(element); 179 fieldset2.appendChild(legendA); 180 checkElement(element, false); 181 182 // elements in the second legend should be disabled 183 fieldset2.insertBefore(legendB, legendA); 184 checkElement(element, fieldset2.disabled); 185 fieldset2.removeChild(legendB); 186 187 // Elements in the first legend of a fieldset disabled by another fieldset 188 // should be disabled. 189 fieldset1.disabled = true; 190 checkElement(element, fieldset1.disabled); 191 192 // Elements inside a fieldset inside the first legend of a disabled fieldset 193 // should not be diasbled. 194 fieldset2.disabled = false; 195 fieldset1.appendChild(legendA); 196 legendA.appendChild(fieldset2); 197 fieldset2.appendChild(element); 198 checkElement(element, false); 199 200 // Elements inside the first legend of a disabled fieldset inside the first 201 // legend of a disabled fieldset should not be disabled. 202 fieldset2.disabled = false; 203 fieldset2.appendChild(legendB); 204 legendB.appendChild(element); 205 checkElement(element, false); 206 fieldset2.removeChild(legendB); 207 fieldset1.appendChild(fieldset2); 208 209 element.remove(); 210 } 211 212 </script> 213 </pre> 214 </body> 215 </html>