layout/generic/test/test_selection_expanding.html

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

michael@0 1 <!DOCTYPE>
michael@0 2 <html>
michael@0 3 <head>
michael@0 4 <title>selection expanding test</title>
michael@0 5 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
michael@0 6 <script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
michael@0 7 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
michael@0 8
michael@0 9 <style type="text/css">
michael@0 10 .testingDiv {
michael@0 11 font-size: 16px;
michael@0 12 width: 300px;
michael@0 13 height: 140px;
michael@0 14 background-color: white;
michael@0 15 }
michael@0 16 #fixedDiv1, #fixedDiv2 {
michael@0 17 position: fixed;
michael@0 18 right: 0;
michael@0 19 overflow: scroll;
michael@0 20 width: 200px;
michael@0 21 }
michael@0 22 #fixedDiv1 {
michael@0 23 top: 0;
michael@0 24 }
michael@0 25 #fixedDiv2 {
michael@0 26 top: 150px;
michael@0 27 }
michael@0 28 iframe, input, textarea {
michael@0 29 font-size: 16px;
michael@0 30 height: 16px;
michael@0 31 width: 80px;
michael@0 32 margin: 0;
michael@0 33 padding: 0;
michael@0 34 }
michael@0 35 #xbl {
michael@0 36 -moz-binding: url(selection_expanding_xbl.xml#binding);
michael@0 37 }
michael@0 38 </style>
michael@0 39
michael@0 40 </head>
michael@0 41 <body>
michael@0 42 <div id="div1" class="testingDiv">
michael@0 43 aaaaaaa
michael@0 44 <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>
michael@0 45 aaaaaaa aaaaaaa<br>aaaaaaa aaaaaaa aaaaaaa aaaaaaa<br>aaaaaaa
michael@0 46 </div>
michael@0 47 <div id="div2" class="testingDiv">
michael@0 48 bbbbbbb
michael@0 49 <input id="input" type="text" value="iiiiiiiii iiiiiiiii iiiiiiiii">
michael@0 50 bbbbbbb bbbbbbb<br>bbbbbbb bbbbbbb bbbbbbb<br>bbbbbbb
michael@0 51 </div>
michael@0 52 <div id="div3" class="testingDiv">
michael@0 53 ccccccc
michael@0 54 <textarea id="textarea">tttttt tttttt tttttt</textarea>
michael@0 55 ccccccc ccccccc<br>ccccccc ccccccc ccccccc ccccccc<br>ccccccc
michael@0 56 <div id="fixedDiv1" class="testingDiv">
michael@0 57 dddddd dddddd dddddd
michael@0 58 </div>
michael@0 59 </div>
michael@0 60 <div id="xbl">
michael@0 61 <p id="xbl_child">yyyyyyy yyyyyyy yyyyyyy</p>
michael@0 62 </div>
michael@0 63 <div id="fixedDiv2" class="testingDiv">
michael@0 64 eeeeee eeeeee eeeeee
michael@0 65 </div>
michael@0 66 <pre id="test">
michael@0 67 <script class="testbody" type="text/javascript">
michael@0 68
michael@0 69 var div1 = document.getElementById("div1");
michael@0 70 var div2 = document.getElementById("div2");
michael@0 71 var div3 = document.getElementById("div3");
michael@0 72 var xbl = document.getElementById("xbl");
michael@0 73 var xbl_child = document.getElementById("xbl_child");
michael@0 74 var fixedDiv1 = document.getElementById("fixedDiv1");
michael@0 75 var fixedDiv2 = document.getElementById("fixedDiv2");
michael@0 76 var iframe = document.getElementById("iframe");
michael@0 77 var input = document.getElementById("input");
michael@0 78 var textarea = SpecialPowers.wrap(document.getElementById("textarea"));
michael@0 79
michael@0 80 function test()
michael@0 81 {
michael@0 82 function getSelectionForEditor(aEditorElement)
michael@0 83 {
michael@0 84 const nsIDOMNSEditableElement = SpecialPowers.Ci.nsIDOMNSEditableElement;
michael@0 85 return SpecialPowers.wrap(aEditorElement).editor.selection;
michael@0 86 }
michael@0 87
michael@0 88 function clear()
michael@0 89 {
michael@0 90 synthesizeMouse(div1, 10, 5, { type: "mouseup" });
michael@0 91 var sel = window.getSelection();
michael@0 92 if (sel.rangeCount > 0)
michael@0 93 sel.collapseToEnd();
michael@0 94 sel = iframe.contentWindow.getSelection();
michael@0 95 if (sel.rangeCount > 0)
michael@0 96 sel.collapseToEnd();
michael@0 97 sel = getSelectionForEditor(input);
michael@0 98 if (sel.rangeCount > 0)
michael@0 99 sel.collapseToEnd();
michael@0 100 sel = getSelectionForEditor(textarea);
michael@0 101 if (sel.rangeCount > 0)
michael@0 102 sel.collapseToEnd();
michael@0 103
michael@0 104 div1.scrollTop = 0;
michael@0 105 div1.scrollLeft = 0;
michael@0 106 div2.scrollTop = 0;
michael@0 107 div2.scrollLeft = 0;
michael@0 108 div3.scrollTop = 0;
michael@0 109 div3.scrollLeft = 0;
michael@0 110 }
michael@0 111
michael@0 112 const kFalse = 0;
michael@0 113 const kTrue = 1;
michael@0 114 const kToDo = 2;
michael@0 115
michael@0 116 function check(aDiv1ShouldBeSelected,
michael@0 117 aDiv2ShouldBeSelected,
michael@0 118 aDiv3ShouldBeSelected,
michael@0 119 aFixedDiv1ShouldBeSelected,
michael@0 120 aXBLChildShouldBeSelected,
michael@0 121 aFixedDiv2ShouldBeSelected,
michael@0 122 aIFrameShouldBeSelected,
michael@0 123 aInputShouldBeSelected,
michael@0 124 aTextareaShouldBeSelected,
michael@0 125 aTestingDescription)
michael@0 126 {
michael@0 127 function checkCharacter(aSelectedText,
michael@0 128 aShouldBeIncludedCharacter,
michael@0 129 aSouldBeSelected,
michael@0 130 aElementName)
michael@0 131 {
michael@0 132 var boolvalue = aSouldBeSelected & kTrue;
michael@0 133 var f = aSouldBeSelected & kToDo ? todo : ok;
michael@0 134 var str = aSelectedText.replace('\n', '\\n');
michael@0 135 if (boolvalue) {
michael@0 136 f(aSelectedText.indexOf(aShouldBeIncludedCharacter) >= 0,
michael@0 137 "The contents of " + aElementName +
michael@0 138 " aren't selected (" + aTestingDescription +
michael@0 139 "): Selected String: \"" + str + "\"");
michael@0 140 } else {
michael@0 141 f(aSelectedText.indexOf(aShouldBeIncludedCharacter) < 0,
michael@0 142 "The contents of " + aElementName +
michael@0 143 " are selected (" + aTestingDescription +
michael@0 144 "): Selected String: \"" + str + "\"");
michael@0 145 }
michael@0 146 }
michael@0 147
michael@0 148 var sel = window.getSelection().toString();
michael@0 149 checkCharacter(sel, "a", aDiv1ShouldBeSelected, "div1");
michael@0 150 checkCharacter(sel, "b", aDiv2ShouldBeSelected, "div2");
michael@0 151 checkCharacter(sel, "c", aDiv3ShouldBeSelected, "div3");
michael@0 152 checkCharacter(sel, "y", aXBLChildShouldBeSelected, "xbl_child");
michael@0 153 checkCharacter(sel, "d", aFixedDiv1ShouldBeSelected, "fixedDiv1");
michael@0 154 checkCharacter(sel, "e", aFixedDiv2ShouldBeSelected, "fixedDiv2");
michael@0 155
michael@0 156 // iframe/input/xbl-bound contents must not be included on the parent
michael@0 157 // selection.
michael@0 158 checkCharacter(sel, "f", false, "iframe (checking on parent)");
michael@0 159 checkCharacter(sel, "i", false, "input (checking on parent)");
michael@0 160 checkCharacter(sel, "x", false, "XBL bound contents (checking on parent)");
michael@0 161
michael@0 162 var selInIFrame = iframe.contentWindow.getSelection().toString();
michael@0 163 checkCharacter(selInIFrame, "f", aIFrameShouldBeSelected, "iframe");
michael@0 164
michael@0 165 var selInput = getSelectionForEditor(input).toString();
michael@0 166 checkCharacter(selInput, "i", aInputShouldBeSelected, "input");
michael@0 167 var selTextarea = getSelectionForEditor(textarea).toString();
michael@0 168 checkCharacter(selTextarea, "t", aTextareaShouldBeSelected, "textarea");
michael@0 169 }
michael@0 170
michael@0 171 // ***********************************************************
michael@0 172 // Set all divs to overflow: auto;
michael@0 173 const kOverflows = ["visible", "hidden", "scroll", "auto"];
michael@0 174 for (var i = 0; i < kOverflows.length; i++) {
michael@0 175 div1.style.overflow = kOverflows[i];
michael@0 176 div2.style.overflow = kOverflows[i];
michael@0 177 div3.style.overflow = kOverflows[i];
michael@0 178
michael@0 179 // ***********************************************************
michael@0 180 // selection starting at div1
michael@0 181 synthesizeMouse(div1, 30, 5, { type: "mousedown" });
michael@0 182
michael@0 183 // XXX if we move the mouse cursor to another document, the
michael@0 184 // nsFrameSelection::HandleDrag method is called on the another document's.
michael@0 185
michael@0 186 // to iframe
michael@0 187 synthesizeMouse(iframe, 30, 5, { type: "mousemove" });
michael@0 188 check(kTrue | kToDo, kFalse, kFalse,
michael@0 189 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 190 "div1-iframe, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 191
michael@0 192 // XXX if the overflow is visible, synthesizeMouse with the input element
michael@0 193 // or textarea element doesn't work fine.
michael@0 194 var isVisibleTesting = kOverflows[i] == "visible";
michael@0 195 var todoFlag = isVisibleTesting ? kToDo : 0;
michael@0 196 // to input
michael@0 197 synthesizeMouse(input, 30, 5, { type: "mousemove" });
michael@0 198 check(kTrue | todoFlag, kTrue | todoFlag, kFalse,
michael@0 199 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 200 "div1-input, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 201
michael@0 202 // to textarea
michael@0 203 synthesizeMouse(textarea, 30, 5, { type: "mousemove" });
michael@0 204 check(kTrue | todoFlag, kTrue | todoFlag, kTrue | todoFlag,
michael@0 205 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 206 "div1-textarea, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 207
michael@0 208 // to div2
michael@0 209 synthesizeMouse(div2, 30, 5, { type: "mousemove" });
michael@0 210 check(kTrue, kTrue, kFalse,
michael@0 211 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 212 "div1-div2, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 213
michael@0 214 // to div3
michael@0 215 synthesizeMouse(div3, 30, 5, { type: "mousemove" });
michael@0 216 check(kTrue, kTrue, kTrue,
michael@0 217 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 218 "div1-div3, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 219
michael@0 220 // to fixedDiv1 (child of div3)
michael@0 221 synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
michael@0 222 check(kTrue, kTrue, kTrue,
michael@0 223 kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 224 "div1-fixedDiv1, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 225
michael@0 226 // to xbl_child
michael@0 227 synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
michael@0 228 check(kTrue, kTrue, kTrue,
michael@0 229 kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
michael@0 230 "div1-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 231
michael@0 232 // to fixedDiv2 (sibling of div*)
michael@0 233 synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
michael@0 234 check(kTrue, kTrue, kTrue,
michael@0 235 kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
michael@0 236 "div1-fixedDiv2, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 237
michael@0 238 clear();
michael@0 239
michael@0 240 // ***********************************************************
michael@0 241 // selection starting at fixedDiv1
michael@0 242 synthesizeMouse(fixedDiv1, 30, 5, { type: "mousedown" });
michael@0 243
michael@0 244 // to xbl_child
michael@0 245 synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
michael@0 246 check(kFalse, kFalse, kFalse,
michael@0 247 kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
michael@0 248 "fixedDiv1-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 249
michael@0 250 // to fixedDiv2
michael@0 251 synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
michael@0 252 check(kFalse, kFalse, kFalse,
michael@0 253 kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
michael@0 254 "fixedDiv1-fixedDiv2, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 255
michael@0 256 clear();
michael@0 257
michael@0 258 // ***********************************************************
michael@0 259 // selection starting at fixedDiv2
michael@0 260 synthesizeMouse(fixedDiv2, 30, 5, { type: "mousedown" });
michael@0 261
michael@0 262 // to xbl_child
michael@0 263 synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
michael@0 264 check(kFalse, kFalse, kFalse,
michael@0 265 kFalse, kTrue, kTrue, kFalse, kFalse, kFalse,
michael@0 266 "fixedDiv2-xbl_child, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 267
michael@0 268 // to fixedDiv1
michael@0 269 synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
michael@0 270 check(kFalse, kFalse, kFalse,
michael@0 271 kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
michael@0 272 "fixedDiv2-fixedDiv1, all boxes are overflow: " + kOverflows[i] + ";");
michael@0 273
michael@0 274 clear();
michael@0 275
michael@0 276 // ***********************************************************
michael@0 277 div2.style.overflow = "visible";
michael@0 278
michael@0 279 // ***********************************************************
michael@0 280 // selection starting at div2
michael@0 281 synthesizeMouse(div2, 30, 5, { type: "mousedown" });
michael@0 282
michael@0 283 // to div3
michael@0 284 synthesizeMouse(div3, 30, 5, { type: "mousemove" });
michael@0 285 check(kFalse, kTrue, kTrue,
michael@0 286 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 287 "div2-div3, div3 is overflow: " + kOverflows[i] +
michael@0 288 ";, but div2 is overflow: visible;");
michael@0 289
michael@0 290 // to fixedDiv1 (child of div3)
michael@0 291 synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
michael@0 292 check(kFalse, kTrue, kTrue,
michael@0 293 kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 294 "div2-fixedDiv1, div3 is overflow: " + kOverflows[i] +
michael@0 295 ";, but div2 is overflow: visible;");
michael@0 296
michael@0 297 // to xbl_child
michael@0 298 synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
michael@0 299 check(kFalse, kTrue, kTrue,
michael@0 300 kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
michael@0 301 "div2-xbl_child, div3 is overflow: " + kOverflows[i] +
michael@0 302 ";, but div2 is overflow: visible;");
michael@0 303
michael@0 304 // to fixedDiv2 (sibling of div*)
michael@0 305 synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
michael@0 306 check(kFalse, kTrue, kTrue,
michael@0 307 kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
michael@0 308 "div2-fixedDiv2, div3 is overflow: " + kOverflows[i] +
michael@0 309 ";, but div2 is overflow: visible;");
michael@0 310
michael@0 311 clear();
michael@0 312
michael@0 313 // ***********************************************************
michael@0 314 // selection starting at div3
michael@0 315 synthesizeMouse(div3, 30, 5, { type: "mousedown" });
michael@0 316
michael@0 317 // to div2
michael@0 318 synthesizeMouse(div2, 30, 5, { type: "mousemove" });
michael@0 319 check(kFalse, kTrue, kTrue,
michael@0 320 kFalse, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 321 "div3-div2, div3 is overflow: " + kOverflows[i] +
michael@0 322 ";, but div2 is overflow: visible;");
michael@0 323
michael@0 324 // to fixedDiv1 (child of div3)
michael@0 325 synthesizeMouse(fixedDiv1, 30, 5, { type: "mousemove" });
michael@0 326 check(kFalse, kFalse, kTrue,
michael@0 327 kTrue, kFalse, kFalse, kFalse, kFalse, kFalse,
michael@0 328 "div3-fixedDiv1, div3 is overflow: " + kOverflows[i] +
michael@0 329 ";, but div2 is overflow: visible;");
michael@0 330
michael@0 331 // to xbl_child
michael@0 332 synthesizeMouse(xbl_child, 30, 5, { type: "mousemove" });
michael@0 333 check(kFalse, kFalse, kTrue,
michael@0 334 kTrue, kTrue, kFalse, kFalse, kFalse, kFalse,
michael@0 335 "div3-xbl_child, div3 is overflow: " + kOverflows[i] +
michael@0 336 ";, but div2 is overflow: visible;");
michael@0 337
michael@0 338 // to fixedDiv2 (sibling of div*)
michael@0 339 synthesizeMouse(fixedDiv2, 30, 5, { type: "mousemove" });
michael@0 340 check(kFalse, kFalse, kTrue,
michael@0 341 kTrue, kTrue, kTrue, kFalse, kFalse, kFalse,
michael@0 342 "div3-fixedDiv2, div3 is overflow: " + kOverflows[i] +
michael@0 343 ";, but div2 is overflow: visible;");
michael@0 344
michael@0 345 clear();
michael@0 346 }
michael@0 347
michael@0 348 // ***********************************************************
michael@0 349 // selection starting at iframe
michael@0 350 synthesizeMouse(iframe, 30, 5, { type: "mousedown" });
michael@0 351
michael@0 352 // inside iframe
michael@0 353 synthesizeMouse(iframe, 50, 5, { type: "mousemove" });
michael@0 354 check(kFalse, kFalse, kFalse,
michael@0 355 kFalse, kFalse, kFalse, kTrue, kFalse, kFalse,
michael@0 356 "iframe-iframe");
michael@0 357
michael@0 358 // to div2
michael@0 359 synthesizeMouse(div2, 30, 5, { type: "mousemove" });
michael@0 360 check(kFalse, kFalse, kFalse,
michael@0 361 kFalse, kFalse, kFalse, kTrue, kFalse, kFalse,
michael@0 362 "iframe-div2");
michael@0 363
michael@0 364 clear();
michael@0 365
michael@0 366 // ***********************************************************
michael@0 367 // selection starting at input
michael@0 368 synthesizeMouse(input, 20, 5, { type: "mousedown" });
michael@0 369
michael@0 370 // inside input
michael@0 371 synthesizeMouse(input, 40, 5, { type: "mousemove" });
michael@0 372 check(kFalse, kFalse, kFalse,
michael@0 373 kFalse, kFalse, kFalse, kFalse, kTrue, kFalse,
michael@0 374 "input-input");
michael@0 375
michael@0 376 // to div3
michael@0 377 synthesizeMouse(div3, 30, 5, { type: "mousemove" });
michael@0 378 check(kFalse, kFalse, kFalse,
michael@0 379 kFalse, kFalse, kFalse, kFalse, kTrue, kFalse,
michael@0 380 "input-div3");
michael@0 381
michael@0 382 clear();
michael@0 383
michael@0 384 // ***********************************************************
michael@0 385 // selection starting at textarea
michael@0 386 synthesizeMouse(textarea, 30, 5, { type: "mousedown" });
michael@0 387
michael@0 388 // inside textarea
michael@0 389 synthesizeMouse(textarea, 50, 5, { type: "mousemove" });
michael@0 390 check(kFalse, kFalse, kFalse,
michael@0 391 kFalse, kFalse, kFalse, kFalse, kFalse, kTrue,
michael@0 392 "textarea-textarea");
michael@0 393
michael@0 394 // to div2
michael@0 395 synthesizeMouse(div2, 30, 5, { type: "mousemove" });
michael@0 396 check(kFalse, kFalse, kFalse,
michael@0 397 kFalse, kFalse, kFalse, kFalse, kFalse, kTrue,
michael@0 398 "textarea-div2");
michael@0 399
michael@0 400 clear();
michael@0 401
michael@0 402 SimpleTest.finish();
michael@0 403 }
michael@0 404 window.onload = function() { setTimeout(test, 0); };
michael@0 405 SimpleTest.waitForExplicitFinish();
michael@0 406 </script>
michael@0 407 </pre>
michael@0 408 </body>
michael@0 409 </html>

mercurial