tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>