layout/generic/test/test_selection_expanding.html

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/layout/generic/test/test_selection_expanding.html	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,409 @@
     1.4 +<!DOCTYPE>
     1.5 +<html>
     1.6 +<head>
     1.7 +<title>selection expanding test</title>
     1.8 +<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
     1.9 +<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
    1.10 +<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
    1.11 +
    1.12 +<style type="text/css">
    1.13 +  .testingDiv {
    1.14 +    font-size: 16px;
    1.15 +    width: 300px;
    1.16 +    height: 140px;
    1.17 +    background-color: white;
    1.18 +  }
    1.19 +  #fixedDiv1, #fixedDiv2 {
    1.20 +    position: fixed;
    1.21 +    right: 0;
    1.22 +    overflow: scroll;
    1.23 +    width: 200px;
    1.24 +  }
    1.25 +  #fixedDiv1 {
    1.26 +    top: 0;
    1.27 +  }
    1.28 +  #fixedDiv2 {
    1.29 +    top: 150px;
    1.30 +  }
    1.31 +  iframe, input, textarea {
    1.32 +    font-size: 16px;
    1.33 +    height: 16px;
    1.34 +    width: 80px;
    1.35 +    margin: 0;
    1.36 +    padding: 0;
    1.37 +  }
    1.38 +  #xbl {
    1.39 +    -moz-binding: url(selection_expanding_xbl.xml#binding);
    1.40 +  }
    1.41 +</style>
    1.42 +
    1.43 +</head>
    1.44 +<body>
    1.45 +<div id="div1" class="testingDiv">
    1.46 +  aaaaaaa
    1.47 +  <iframe id="iframe" src="data:text/html,<style type='text/css'>*{margin: 0; padding: 0; font-size: 16px;}</style><div>ffffff ffffff ffffff ffffff</div>"></iframe>
    1.48 +  aaaaaaa aaaaaaa<br>aaaaaaa aaaaaaa aaaaaaa aaaaaaa<br>aaaaaaa
    1.49 +</div>
    1.50 +<div id="div2" class="testingDiv">
    1.51 +  bbbbbbb
    1.52 +  <input id="input" type="text" value="iiiiiiiii iiiiiiiii iiiiiiiii">
    1.53 +  bbbbbbb bbbbbbb<br>bbbbbbb bbbbbbb bbbbbbb<br>bbbbbbb
    1.54 +</div>
    1.55 +<div id="div3" class="testingDiv">
    1.56 +  ccccccc
    1.57 +  <textarea id="textarea">tttttt tttttt tttttt</textarea>
    1.58 +  ccccccc ccccccc<br>ccccccc ccccccc ccccccc ccccccc<br>ccccccc
    1.59 +  <div id="fixedDiv1" class="testingDiv">
    1.60 +    dddddd dddddd dddddd
    1.61 +  </div>
    1.62 +</div>
    1.63 +<div id="xbl">
    1.64 +  <p id="xbl_child">yyyyyyy yyyyyyy yyyyyyy</p>
    1.65 +</div>
    1.66 +<div id="fixedDiv2" class="testingDiv">
    1.67 +  eeeeee eeeeee eeeeee
    1.68 +</div>
    1.69 +<pre id="test">
    1.70 +<script class="testbody" type="text/javascript">
    1.71 +
    1.72 +var div1 = document.getElementById("div1");
    1.73 +var div2 = document.getElementById("div2");
    1.74 +var div3 = document.getElementById("div3");
    1.75 +var xbl = document.getElementById("xbl");
    1.76 +var xbl_child = document.getElementById("xbl_child");
    1.77 +var fixedDiv1 = document.getElementById("fixedDiv1");
    1.78 +var fixedDiv2 = document.getElementById("fixedDiv2");
    1.79 +var iframe = document.getElementById("iframe");
    1.80 +var input = document.getElementById("input");
    1.81 +var textarea = SpecialPowers.wrap(document.getElementById("textarea"));
    1.82 +
    1.83 +function test()
    1.84 +{
    1.85 +  function getSelectionForEditor(aEditorElement)
    1.86 +  {
    1.87 +    const nsIDOMNSEditableElement = SpecialPowers.Ci.nsIDOMNSEditableElement;
    1.88 +    return SpecialPowers.wrap(aEditorElement).editor.selection;
    1.89 +  }
    1.90 +
    1.91 +  function clear()
    1.92 +  {
    1.93 +    synthesizeMouse(div1, 10, 5, { type: "mouseup" });
    1.94 +    var sel = window.getSelection();
    1.95 +    if (sel.rangeCount > 0)
    1.96 +      sel.collapseToEnd();
    1.97 +    sel = iframe.contentWindow.getSelection();
    1.98 +    if (sel.rangeCount > 0)
    1.99 +      sel.collapseToEnd();
   1.100 +    sel = getSelectionForEditor(input);
   1.101 +    if (sel.rangeCount > 0)
   1.102 +      sel.collapseToEnd();
   1.103 +    sel = getSelectionForEditor(textarea);
   1.104 +    if (sel.rangeCount > 0)
   1.105 +      sel.collapseToEnd();
   1.106 +
   1.107 +    div1.scrollTop = 0;
   1.108 +    div1.scrollLeft = 0;
   1.109 +    div2.scrollTop = 0;
   1.110 +    div2.scrollLeft = 0;
   1.111 +    div3.scrollTop = 0;
   1.112 +    div3.scrollLeft = 0;
   1.113 +  }
   1.114 +
   1.115 +  const kFalse = 0;
   1.116 +  const kTrue  = 1;
   1.117 +  const kToDo  = 2;
   1.118 +
   1.119 +  function check(aDiv1ShouldBeSelected,
   1.120 +                 aDiv2ShouldBeSelected,
   1.121 +                 aDiv3ShouldBeSelected,
   1.122 +                 aFixedDiv1ShouldBeSelected,
   1.123 +                 aXBLChildShouldBeSelected,
   1.124 +                 aFixedDiv2ShouldBeSelected,
   1.125 +                 aIFrameShouldBeSelected,
   1.126 +                 aInputShouldBeSelected,
   1.127 +                 aTextareaShouldBeSelected,
   1.128 +                 aTestingDescription)
   1.129 +  {
   1.130 +    function checkCharacter(aSelectedText,
   1.131 +                            aShouldBeIncludedCharacter,
   1.132 +                            aSouldBeSelected,
   1.133 +                            aElementName)
   1.134 +    {
   1.135 +      var boolvalue = aSouldBeSelected & kTrue;
   1.136 +      var f = aSouldBeSelected & kToDo ? todo : ok;
   1.137 +      var str = aSelectedText.replace('\n', '\\n');
   1.138 +      if (boolvalue) {
   1.139 +        f(aSelectedText.indexOf(aShouldBeIncludedCharacter) >= 0,
   1.140 +          "The contents of " + aElementName +
   1.141 +          " aren't selected (" + aTestingDescription +
   1.142 +          "): Selected String: \"" + str + "\"");
   1.143 +      } else {
   1.144 +        f(aSelectedText.indexOf(aShouldBeIncludedCharacter) < 0,
   1.145 +          "The contents of " + aElementName +
   1.146 +          " are selected (" + aTestingDescription +
   1.147 +          "): Selected String: \"" + str + "\"");
   1.148 +      }
   1.149 +    }
   1.150 +
   1.151 +    var sel = window.getSelection().toString();
   1.152 +    checkCharacter(sel, "a", aDiv1ShouldBeSelected, "div1");
   1.153 +    checkCharacter(sel, "b", aDiv2ShouldBeSelected, "div2");
   1.154 +    checkCharacter(sel, "c", aDiv3ShouldBeSelected, "div3");
   1.155 +    checkCharacter(sel, "y", aXBLChildShouldBeSelected, "xbl_child");
   1.156 +    checkCharacter(sel, "d", aFixedDiv1ShouldBeSelected, "fixedDiv1");
   1.157 +    checkCharacter(sel, "e", aFixedDiv2ShouldBeSelected, "fixedDiv2");
   1.158 +
   1.159 +    // iframe/input/xbl-bound contents must not be included on the parent
   1.160 +    // selection.
   1.161 +    checkCharacter(sel, "f", false, "iframe (checking on parent)");
   1.162 +    checkCharacter(sel, "i", false, "input (checking on parent)");
   1.163 +    checkCharacter(sel, "x", false, "XBL bound contents (checking on parent)");
   1.164 +
   1.165 +    var selInIFrame = iframe.contentWindow.getSelection().toString();
   1.166 +    checkCharacter(selInIFrame, "f", aIFrameShouldBeSelected, "iframe");
   1.167 +
   1.168 +    var selInput = getSelectionForEditor(input).toString();
   1.169 +    checkCharacter(selInput, "i", aInputShouldBeSelected, "input");
   1.170 +    var selTextarea = getSelectionForEditor(textarea).toString();
   1.171 +    checkCharacter(selTextarea, "t", aTextareaShouldBeSelected, "textarea");
   1.172 +  }
   1.173 +
   1.174 +  // ***********************************************************
   1.175 +  // Set all divs to overflow: auto;
   1.176 +  const kOverflows = ["visible", "hidden", "scroll", "auto"];
   1.177 +  for (var i = 0; i < kOverflows.length; i++) {
   1.178 +    div1.style.overflow = kOverflows[i];
   1.179 +    div2.style.overflow = kOverflows[i];
   1.180 +    div3.style.overflow = kOverflows[i];
   1.181 +
   1.182 +    // ***********************************************************
   1.183 +    // selection starting at div1
   1.184 +    synthesizeMouse(div1, 30, 5, { type: "mousedown" });
   1.185 +
   1.186 +    // XXX if we move the mouse cursor to another document, the
   1.187 +    // nsFrameSelection::HandleDrag method is called on the another document's.
   1.188 +
   1.189 +    // to iframe
   1.190 +    synthesizeMouse(iframe, 30, 5, { type: "mousemove" });
   1.191 +    check(kTrue | kToDo, kFalse, kFalse,
   1.192 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.193 +          "div1-iframe, all boxes are overflow: " + kOverflows[i] + ";");
   1.194 +
   1.195 +    // XXX if the overflow is visible, synthesizeMouse with the input element
   1.196 +    // or textarea element doesn't work fine.
   1.197 +    var isVisibleTesting = kOverflows[i] == "visible";
   1.198 +    var todoFlag = isVisibleTesting ? kToDo : 0;
   1.199 +    // to input
   1.200 +    synthesizeMouse(input, 30, 5, { type: "mousemove" });
   1.201 +    check(kTrue | todoFlag, kTrue | todoFlag, kFalse,
   1.202 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.203 +         "div1-input, all boxes are overflow: " + kOverflows[i] + ";");
   1.204 +
   1.205 +    // to textarea
   1.206 +    synthesizeMouse(textarea, 30, 5, { type: "mousemove" });
   1.207 +    check(kTrue | todoFlag, kTrue | todoFlag, kTrue | todoFlag,
   1.208 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.209 +          "div1-textarea, all boxes are overflow: " + kOverflows[i] + ";");
   1.210 +
   1.211 +    // to div2
   1.212 +    synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   1.213 +    check(kTrue, kTrue, kFalse,
   1.214 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.215 +          "div1-div2, all boxes are overflow: " + kOverflows[i] + ";");
   1.216 +
   1.217 +    // to div3
   1.218 +    synthesizeMouse(div3, 30, 5, { type: "mousemove" });
   1.219 +    check(kTrue, kTrue, kTrue,
   1.220 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.221 +          "div1-div3, all boxes are overflow: " + kOverflows[i] + ";");
   1.222 +
   1.223 +    // to fixedDiv1 (child of div3)
   1.224 +    synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   1.225 +    check(kTrue, kTrue, kTrue,
   1.226 +          kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.227 +          "div1-fixedDiv1, all boxes are overflow: " + kOverflows[i] + ";");
   1.228 +
   1.229 +    // to xbl_child
   1.230 +    synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   1.231 +    check(kTrue, kTrue, kTrue,
   1.232 +          kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   1.233 +          "div1-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
   1.234 +
   1.235 +    // to fixedDiv2 (sibling of div*)
   1.236 +    synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   1.237 +    check(kTrue, kTrue, kTrue,
   1.238 +          kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   1.239 +          "div1-fixedDiv2, all boxes are overflow: " + kOverflows[i] + ";");
   1.240 +
   1.241 +    clear();
   1.242 +
   1.243 +    // ***********************************************************
   1.244 +    // selection starting at fixedDiv1
   1.245 +    synthesizeMouse(fixedDiv1, 30, 5, { type: "mousedown" });
   1.246 +
   1.247 +    // to xbl_child
   1.248 +    synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   1.249 +    check(kFalse, kFalse, kFalse,
   1.250 +          kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   1.251 +          "fixedDiv1-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
   1.252 +
   1.253 +    // to fixedDiv2
   1.254 +    synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   1.255 +    check(kFalse, kFalse, kFalse,
   1.256 +          kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   1.257 +          "fixedDiv1-fixedDiv2, all boxes are overflow: " + kOverflows[i] + ";");
   1.258 +
   1.259 +    clear();
   1.260 +
   1.261 +    // ***********************************************************
   1.262 +    // selection starting at fixedDiv2
   1.263 +    synthesizeMouse(fixedDiv2, 30, 5, { type: "mousedown" });
   1.264 +
   1.265 +    // to xbl_child
   1.266 +    synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   1.267 +    check(kFalse, kFalse, kFalse,
   1.268 +          kFalse, kTrue, kTrue, kFalse, kFalse, kFalse,
   1.269 +          "fixedDiv2-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
   1.270 +
   1.271 +    // to fixedDiv1
   1.272 +    synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   1.273 +    check(kFalse, kFalse, kFalse,
   1.274 +          kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   1.275 +          "fixedDiv2-fixedDiv1, all boxes are overflow: " + kOverflows[i] + ";");
   1.276 +
   1.277 +    clear();
   1.278 +
   1.279 +    // ***********************************************************
   1.280 +    div2.style.overflow = "visible";
   1.281 +
   1.282 +    // ***********************************************************
   1.283 +    // selection starting at div2
   1.284 +    synthesizeMouse(div2, 30, 5, { type: "mousedown" });
   1.285 +
   1.286 +    // to div3
   1.287 +    synthesizeMouse(div3, 30, 5, { type: "mousemove" });
   1.288 +    check(kFalse, kTrue, kTrue,
   1.289 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.290 +          "div2-div3, div3 is overflow: " + kOverflows[i] +
   1.291 +          ";, but div2 is overflow: visible;");
   1.292 +
   1.293 +    // to fixedDiv1 (child of div3)
   1.294 +    synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   1.295 +    check(kFalse, kTrue, kTrue,
   1.296 +          kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.297 +          "div2-fixedDiv1, div3 is overflow: " + kOverflows[i] +
   1.298 +          ";, but div2 is overflow: visible;");
   1.299 +
   1.300 +    // to xbl_child
   1.301 +    synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   1.302 +    check(kFalse, kTrue, kTrue,
   1.303 +          kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   1.304 +          "div2-xbl_child, div3 is overflow: " + kOverflows[i] +
   1.305 +          ";, but div2 is overflow: visible;");
   1.306 +
   1.307 +    // to fixedDiv2 (sibling of div*)
   1.308 +    synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   1.309 +    check(kFalse, kTrue, kTrue,
   1.310 +          kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   1.311 +          "div2-fixedDiv2, div3 is overflow: " + kOverflows[i] +
   1.312 +          ";, but div2 is overflow: visible;");
   1.313 +
   1.314 +    clear();
   1.315 +
   1.316 +    // ***********************************************************
   1.317 +    // selection starting at div3
   1.318 +    synthesizeMouse(div3, 30, 5, { type: "mousedown" });
   1.319 +
   1.320 +    // to div2
   1.321 +    synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   1.322 +    check(kFalse, kTrue, kTrue,
   1.323 +          kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.324 +          "div3-div2, div3 is overflow: " + kOverflows[i] +
   1.325 +          ";, but div2 is overflow: visible;");
   1.326 +
   1.327 +    // to fixedDiv1 (child of div3)
   1.328 +    synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
   1.329 +    check(kFalse, kFalse, kTrue,
   1.330 +          kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
   1.331 +          "div3-fixedDiv1, div3 is overflow: " + kOverflows[i] +
   1.332 +          ";, but div2 is overflow: visible;");
   1.333 +
   1.334 +    // to xbl_child
   1.335 +    synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
   1.336 +    check(kFalse, kFalse, kTrue,
   1.337 +          kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
   1.338 +          "div3-xbl_child, div3 is overflow: " + kOverflows[i] +
   1.339 +          ";, but div2 is overflow: visible;");
   1.340 +
   1.341 +    // to fixedDiv2 (sibling of div*)
   1.342 +    synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
   1.343 +    check(kFalse, kFalse, kTrue,
   1.344 +          kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
   1.345 +          "div3-fixedDiv2, div3 is overflow: " + kOverflows[i] +
   1.346 +          ";, but div2 is overflow: visible;");
   1.347 +
   1.348 +    clear();
   1.349 +  }
   1.350 +
   1.351 +  // ***********************************************************
   1.352 +  // selection starting at iframe
   1.353 +  synthesizeMouse(iframe, 30, 5, { type: "mousedown" });
   1.354 +
   1.355 +  // inside iframe
   1.356 +  synthesizeMouse(iframe, 50, 5, { type: "mousemove" });
   1.357 +  check(kFalse, kFalse, kFalse,
   1.358 +        kFalse, kFalse, kFalse, kTrue, kFalse, kFalse,
   1.359 +        "iframe-iframe");
   1.360 +
   1.361 +  // to div2
   1.362 +  synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   1.363 +  check(kFalse, kFalse, kFalse,
   1.364 +        kFalse, kFalse, kFalse, kTrue, kFalse, kFalse,
   1.365 +        "iframe-div2");
   1.366 +
   1.367 +  clear();
   1.368 +
   1.369 +  // ***********************************************************
   1.370 +  // selection starting at input
   1.371 +  synthesizeMouse(input, 20, 5, { type: "mousedown" });
   1.372 +
   1.373 +  // inside input
   1.374 +  synthesizeMouse(input, 40, 5, { type: "mousemove" });
   1.375 +  check(kFalse, kFalse, kFalse,
   1.376 +        kFalse, kFalse, kFalse, kFalse, kTrue, kFalse,
   1.377 +        "input-input");
   1.378 +
   1.379 +  // to div3
   1.380 +  synthesizeMouse(div3, 30, 5, { type: "mousemove" });
   1.381 +  check(kFalse, kFalse, kFalse,
   1.382 +        kFalse, kFalse, kFalse, kFalse, kTrue, kFalse,
   1.383 +        "input-div3");
   1.384 +
   1.385 +  clear();
   1.386 +
   1.387 +  // ***********************************************************
   1.388 +  // selection starting at textarea
   1.389 +  synthesizeMouse(textarea, 30, 5, { type: "mousedown" });
   1.390 +
   1.391 +  // inside textarea
   1.392 +  synthesizeMouse(textarea, 50, 5, { type: "mousemove" });
   1.393 +  check(kFalse, kFalse, kFalse,
   1.394 +        kFalse, kFalse, kFalse, kFalse, kFalse, kTrue,
   1.395 +        "textarea-textarea");
   1.396 +
   1.397 +  // to div2
   1.398 +  synthesizeMouse(div2, 30, 5, { type: "mousemove" });
   1.399 +  check(kFalse, kFalse, kFalse,
   1.400 +        kFalse, kFalse, kFalse, kFalse, kFalse, kTrue,
   1.401 +        "textarea-div2");
   1.402 +
   1.403 +  clear();
   1.404 +
   1.405 +  SimpleTest.finish();
   1.406 +}
   1.407 +window.onload = function() { setTimeout(test, 0); };
   1.408 +SimpleTest.waitForExplicitFinish();
   1.409 +</script>
   1.410 +</pre>
   1.411 +</body>
   1.412 +</html>

mercurial