<!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>