| <!DOCTYPE html> |
| <meta charset=utf-8> |
| <title>text field selection: setRangeText</title> |
| <link rel="author" title="Denis Ah-Kang" href="mailto:denis@w3.org"> |
| <link rel=help href="https://html.spec.whatwg.org/multipage/#textFieldSelection"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <style> |
| #display_none {display:none;} |
| </style> |
| <div id="log"></div> |
| <input type=text id=text value="foobar"> |
| <input type=search id=search value="foobar"> |
| <input type=tel id=tel value="foobar"> |
| <input type=url id=url value="foobar"> |
| <input type=password id=password value="foobar"> |
| <input id=display_none value="foobar"> |
| <textarea id=textarea>foobar</textarea> |
| <script> |
| var input = document.createElement("input"); |
| input.id = "input_not_in_doc"; |
| input.value = "foobar"; |
| |
| var elements = [ |
| document.getElementById("text"), |
| document.getElementById("search"), |
| document.getElementById("tel"), |
| document.getElementById("url"), |
| document.getElementById("password"), |
| document.getElementById("display_none"), |
| document.getElementById("textarea"), |
| input, |
| ] |
| |
| elements.forEach(function(element) { |
| test(function() { |
| element.value = "foobar"; |
| element.selectionStart = 0; |
| element.selectionEnd = 3; |
| assert_equals(element.selectionStart, 0); |
| assert_equals(element.selectionEnd, 3); |
| element.setRangeText("foobar2"); |
| assert_equals(element.value, "foobar2bar"); |
| assert_equals(element.selectionStart, 0); |
| assert_equals(element.selectionEnd, 7); |
| element.setRangeText("foobar3", 7, 10); |
| assert_equals(element.value, "foobar2foobar3"); |
| }, element.id + " setRangeText with only one argument replaces the value between selectionStart and selectionEnd, otherwise replaces the value between 2nd and 3rd arguments"); |
| |
| test(function(){ |
| element.value = "foobar"; |
| element.selectionStart = 0; |
| element.selectionEnd = 0; |
| |
| element.setRangeText("foobar2", 0, 3); // no 4th arg, default "preserve" |
| assert_equals(element.value, "foobar2bar"); |
| assert_equals(element.selectionStart, 0); |
| assert_equals(element.selectionEnd, 0); |
| }, element.id + " selectionMode missing"); |
| |
| test(function(){ |
| element.value = "foobar" |
| element.setRangeText("foo", 3, 6, "select"); |
| assert_equals(element.value, "foofoo"); |
| assert_equals(element.selectionStart, 3); |
| assert_equals(element.selectionEnd, 6); |
| }, element.id + " selectionMode 'select'"); |
| |
| test(function(){ |
| element.value = "foobar" |
| element.setRangeText("foo", 3, 6, "start"); |
| assert_equals(element.value, "foofoo"); |
| assert_equals(element.selectionStart, 3); |
| assert_equals(element.selectionEnd, 3); |
| }, element.id + " selectionMode 'start'"); |
| |
| test(function(){ |
| element.value = "foobar" |
| element.setRangeText("foobar", 3, 6, "end"); |
| assert_equals(element.value, "foofoobar"); |
| assert_equals(element.selectionStart, 9); |
| assert_equals(element.selectionEnd, 9); |
| }, element.id + " selectionMode 'end'"); |
| |
| test(function(){ |
| element.value = "foobar" |
| element.selectionStart = 0; |
| element.selectionEnd = 5; |
| assert_equals(element.selectionStart, 0); |
| element.setRangeText("", 3, 6, "preserve"); |
| assert_equals(element.value, "foo"); |
| assert_equals(element.selectionStart, 0); |
| assert_equals(element.selectionEnd, 3); |
| }, element.id + " selectionMode 'preserve'"); |
| |
| test(function(){ |
| assert_throws("INDEX_SIZE_ERR", function() { |
| element.setRangeText("barfoo", 2, 1); |
| }); |
| }, element.id + " setRangeText with 3rd argument greater than 2nd argument throws an IndexSizeError exception"); |
| |
| test(function(){ |
| assert_throws(new TypeError(), function() { |
| element.setRangeText(); |
| }); |
| }, element.id + " setRangeText without argument throws a type error"); |
| |
| async_test(function() { |
| var q = false; |
| element.onselect = this.step_func_done(function(e) { |
| assert_true(q, "event should be queued"); |
| assert_true(e.isTrusted, "event is trusted"); |
| assert_false(e.bubbles, "event bubbles"); |
| assert_false(e.cancelable, "event is not cancelable"); |
| }); |
| element.setRangeText("foobar2", 0, 6); |
| q = true; |
| }, element.id + " setRangeText fires a select event"); |
| }) |
| </script> |