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>