test_bug557087-3.html 6.4 KB

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