test_set_range_text.html (9487B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=850364 5 --> 6 <head> 7 <title>Tests for Bug 850364 && Bug 918940</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=850364">Mozilla Bug 850364</a> 14 <p id="display"></p> 15 <div id="content"> 16 17 <!-- "SetRangeText() supported types"--> 18 <input type="text" id="input_text"></input> 19 <input type="search" id="input_search"></input> 20 <input type="url" id="input_url"></input> 21 <input type="tel" id="input_tel"></input> 22 <input type="password" id="input_password"></input> 23 <textarea id="input_textarea"></textarea> 24 25 <!-- "SetRangeText() non-supported types" --> 26 <input type="button" id="input_button"></input> 27 <input type="submit" id="input_submit"></input> 28 <input type="image" id="input_image"></input> 29 <input type="reset" id="input_reset"></input> 30 <input type="radio" id="input_radio"></input> 31 <input type="checkbox" id="input_checkbox"></input> 32 <input type="range" id="input_range"></input> 33 <input type="file" id="input_file"></input> 34 <input type="email" id="input_email"></input> 35 36 </div> 37 <pre id="test"> 38 <script class="testbody" type="text/javascript"> 39 40 /** Tests for Bug 850364 && Bug 918940*/ 41 42 var SupportedTypes = ["text", "search", "url", "tel", "password", "textarea"]; 43 var NonSupportedTypes = ["button", "submit", "image", "reset", "radio", 44 "checkbox", "range", "file", "email"]; 45 46 SimpleTest.waitForExplicitFinish(); 47 48 function TestInputs() { 49 50 var opThrows, elem, i, msg; 51 52 //Non-supported types should throw 53 for (i = 0; i < NonSupportedTypes.length; ++i) { 54 opThrows = false; 55 msg = "input_" + NonSupportedTypes[i]; 56 elem = document.getElementById(msg); 57 elem.focus(); 58 try { 59 elem.setRangeText("abc"); 60 } catch (ex) { 61 opThrows = true; 62 } 63 ok(opThrows, msg + " should throw InvalidStateError"); 64 } 65 66 var numOfSelectCalls = 0, expectedNumOfSelectCalls = 0; 67 //Supported types should not throw 68 for (i = 0; i < SupportedTypes.length; ++i) { 69 opThrows = false; 70 msg = "input_" + SupportedTypes[i]; 71 elem = document.getElementById(msg); 72 elem.focus(); 73 try { 74 elem.setRangeText("abc"); 75 } catch (ex) { 76 opThrows = true; 77 } 78 is(opThrows, false, msg + " should not throw InvalidStateError"); 79 80 elem.addEventListener("select", function (aEvent) { 81 ok(true, "select event should be fired for " + aEvent.target.id); 82 if (++numOfSelectCalls == expectedNumOfSelectCalls) { 83 SimpleTest.finish(); 84 } else if (numOfSelectCalls > expectedNumOfSelectCalls) { 85 ok(false, "Too many select events were fired"); 86 } 87 }); 88 89 elem.addEventListener("input", function (aEvent) { 90 ok(false, "input event should NOT be fired for " + + aEvent.target.id); 91 }); 92 93 var test = " setRange(replacement), shrink"; 94 elem.value = "0123456789ABCDEF"; 95 elem.setSelectionRange(1, 6); 96 elem.setRangeText("xyz"); 97 is(elem.value, "0xyz6789ABCDEF", msg + test); 98 is(elem.selectionStart, 1, msg + test); 99 is(elem.selectionEnd, 4, msg + test); 100 elem.setRangeText("mnk"); 101 is(elem.value, "0mnk6789ABCDEF", msg + test); 102 expectedNumOfSelectCalls += 2; 103 104 test = " setRange(replacement), expand"; 105 elem.value = "0123456789ABCDEF"; 106 elem.setSelectionRange(1, 2); 107 elem.setRangeText("xyz"); 108 is(elem.value, "0xyz23456789ABCDEF", msg + test); 109 is(elem.selectionStart, 1, msg + test); 110 is(elem.selectionEnd, 4, msg + test); 111 elem.setRangeText("mnk"); 112 is(elem.value, "0mnk23456789ABCDEF", msg + test); 113 expectedNumOfSelectCalls += 2; 114 115 test = " setRange(replacement) pure insertion at start"; 116 elem.value = "0123456789ABCDEF"; 117 elem.setSelectionRange(0, 0); 118 elem.setRangeText("xyz"); 119 is(elem.value, "xyz0123456789ABCDEF", msg + test); 120 is(elem.selectionStart, 0, msg + test); 121 is(elem.selectionEnd, 0, msg + test); 122 elem.setRangeText("mnk"); 123 is(elem.value, "mnkxyz0123456789ABCDEF", msg + test); 124 expectedNumOfSelectCalls += 1; 125 126 test = " setRange(replacement) pure insertion in the middle"; 127 elem.value = "0123456789ABCDEF"; 128 elem.setSelectionRange(4, 4); 129 elem.setRangeText("xyz"); 130 is(elem.value, "0123xyz456789ABCDEF", msg + test); 131 is(elem.selectionStart, 4, msg + test); 132 is(elem.selectionEnd, 4, msg + test); 133 elem.setRangeText("mnk"); 134 is(elem.value, "0123mnkxyz456789ABCDEF", msg + test); 135 expectedNumOfSelectCalls += 1; 136 137 test = " setRange(replacement) pure insertion at the end"; 138 elem.value = "0123456789ABCDEF"; 139 elem.setSelectionRange(16, 16); 140 elem.setRangeText("xyz"); 141 is(elem.value, "0123456789ABCDEFxyz", msg + test); 142 is(elem.selectionStart, 16, msg + test); 143 is(elem.selectionEnd, 16, msg + test); 144 elem.setRangeText("mnk"); 145 is(elem.value, "0123456789ABCDEFmnkxyz", msg + test); 146 147 //test SetRange(replacement, start, end, mode) with start > end 148 try { 149 elem.setRangeText("abc", 20, 4); 150 } catch (ex) { 151 opThrows = (ex.name == "IndexSizeError" && ex.code == DOMException.INDEX_SIZE_ERR); 152 } 153 is(opThrows, true, msg + " should throw IndexSizeError"); 154 155 //test SelectionMode 'select' 156 elem.value = "0123456789ABCDEF"; 157 elem.setRangeText("xyz", 4, 9, "select"); 158 is(elem.value, "0123xyz9ABCDEF", msg + ".value == \"0123xyz9ABCDEF\""); 159 is(elem.selectionStart, 4, msg + ".selectionStart == 4, with \"select\""); 160 is(elem.selectionEnd, 7, msg + ".selectionEnd == 7, with \"select\""); 161 expectedNumOfSelectCalls += 1; 162 163 elem.setRangeText("pqm", 6, 25, "select"); 164 is(elem.value, "0123xypqm", msg + ".value == \"0123xypqm\""); 165 is(elem.selectionStart, 6, msg + ".selectionStart == 6, with \"select\""); 166 is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"select\""); 167 expectedNumOfSelectCalls += 1; 168 169 //test SelectionMode 'start' 170 elem.value = "0123456789ABCDEF"; 171 elem.setRangeText("xyz", 4, 9, "start"); 172 is(elem.value, "0123xyz9ABCDEF", msg + ".value == \"0123xyz9ABCDEF\""); 173 is(elem.selectionStart, 4, msg + ".selectionStart == 4, with \"start\""); 174 is(elem.selectionEnd, 4, msg + ".selectionEnd == 4, with \"start\""); 175 expectedNumOfSelectCalls += 1; 176 177 elem.setRangeText("pqm", 6, 25, "start"); 178 is(elem.value, "0123xypqm", msg + ".value == \"0123xypqm\""); 179 is(elem.selectionStart, 6, msg + ".selectionStart == 6, with \"start\""); 180 is(elem.selectionEnd, 6, msg + ".selectionEnd == 6, with \"start\""); 181 expectedNumOfSelectCalls += 1; 182 183 //test SelectionMode 'end' 184 elem.value = "0123456789ABCDEF"; 185 elem.setRangeText("xyz", 4, 9, "end"); 186 is(elem.value, "0123xyz9ABCDEF", msg + ".value == \"0123xyz9ABCDEF\""); 187 is(elem.selectionStart, 7, msg + ".selectionStart == 7, with \"end\""); 188 is(elem.selectionEnd, 7, msg + ".selectionEnd == 7, with \"end\""); 189 expectedNumOfSelectCalls += 1; 190 191 elem.setRangeText("pqm", 6, 25, "end"); 192 is(elem.value, "0123xypqm", msg + ".value == \"0123xypqm\""); 193 is(elem.selectionStart, 9, msg + ".selectionStart == 9, with \"end\""); 194 is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"end\""); 195 expectedNumOfSelectCalls += 1; 196 197 //test SelectionMode 'preserve' (default) 198 199 //subcase: selection{Start|End} > end 200 elem.value = "0123456789"; 201 elem.setSelectionRange(6, 9); 202 elem.setRangeText("Z", 1, 2, "preserve"); 203 is(elem.value, "0Z23456789", msg + ".value == \"0Z23456789\""); 204 is(elem.selectionStart, 6, msg + ".selectionStart == 6, with \"preserve\""); 205 is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"preserve\""); 206 expectedNumOfSelectCalls += 1; 207 208 //subcase: selection{Start|End} < end 209 elem.value = "0123456789"; 210 elem.setSelectionRange(4, 5); 211 elem.setRangeText("QRST", 2, 9, "preserve"); 212 is(elem.value, "01QRST9", msg + ".value == \"01QRST9\""); 213 is(elem.selectionStart, 2, msg + ".selectionStart == 2, with \"preserve\""); 214 is(elem.selectionEnd, 6, msg + ".selectionEnd == 6, with \"preserve\""); 215 expectedNumOfSelectCalls += 2; 216 217 //subcase: selectionStart > end, selectionEnd < end 218 elem.value = "0123456789"; 219 elem.setSelectionRange(8, 4); 220 elem.setRangeText("QRST", 1, 5); 221 is(elem.value, "0QRST56789", msg + ".value == \"0QRST56789\""); 222 is(elem.selectionStart, 1, msg + ".selectionStart == 1, with \"default\""); 223 is(elem.selectionEnd, 5, msg + ".selectionEnd == 5, with \"default\""); 224 expectedNumOfSelectCalls += 2; 225 226 //subcase: selectionStart < end, selectionEnd > end 227 elem.value = "0123456789"; 228 elem.setSelectionRange(4, 9); 229 elem.setRangeText("QRST", 2, 6); 230 is(elem.value, "01QRST6789", msg + ".value == \"01QRST6789\""); 231 is(elem.selectionStart, 2, msg + ".selectionStart == 2, with \"default\""); 232 is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"default\""); 233 expectedNumOfSelectCalls += 2; 234 } 235 } 236 237 addLoadEvent(TestInputs); 238 239 </script> 240 </pre> 241 </body> 242 </html>