blob: 5087e848594baab1b01233ece6fdcbf3f127b7a5 [file] [log] [blame]
/*
* Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
* for details. All rights reserved. Use of this source code is governed by a
* BSD-style license that can be found in the LICENSE file.
*/
/*
* Portions of this test are derived from code under the following license:
*
* Web-platform-tests are covered by the dual-licensing approach described in:
* http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright.html
*/
/**
* after web-platform-tests/html/semantics/forms/textfieldselection/textfieldselection-setRangeText.html
* @assertion http://www.w3.org/html/wg/drafts/html/master/#textFieldSelection
* @description text field selection: setRangeText
*/
import 'dart:html';
import "../../../../Utils/expectWeb.dart";
/*
<style>
#display_none {display:none;}
</style>
*/
const String htmlEL='''
<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>
''';
void main() {
document.body.appendHtml(htmlEL);
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((element) {
var q = false;
test(() {
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", start:7, end: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((){
element.value = "foobar";
element.selectionStart = 0;
element.selectionEnd = 0;
element.setRangeText("foobar2", start:0, end: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((){
element.value = "foobar";
element.setRangeText("foo", start:3, end:6, selectionMode:"select");
assert_equals(element.value, "foofoo");
assert_equals(element.selectionStart, 3);
assert_equals(element.selectionEnd, 6);
}, element.id + " selectionMode 'select'");
test((){
element.value = "foobar";
element.setRangeText("foo", start:3, end:6, selectionMode:"start");
assert_equals(element.value, "foofoo");
assert_equals(element.selectionStart, 3);
assert_equals(element.selectionEnd, 3);
}, element.id + " selectionMode 'start'");
test((){
element.value = "foobar";
element.setRangeText("foobar", start:3, end:6, selectionMode:"end");
assert_equals(element.value, "foofoobar");
assert_equals(element.selectionStart, 9);
assert_equals(element.selectionEnd, 9);
}, element.id + " selectionMode 'end'");
test((){
element.value = "foobar";
element.selectionStart = 0;
element.selectionEnd = 5;
assert_equals(element.selectionStart, 0);
element.setRangeText("", start:3, end:6, selectionMode:"preserve");
assert_equals(element.value, "foo");
assert_equals(element.selectionStart, 0);
assert_equals(element.selectionEnd, 3);
}, element.id + " selectionMode 'preserve'");
test((){
assert_throws("IndexSizeError", () {
element.setRangeText("barfoo", start:2, end:1);
});
}, element.id + " setRangeText with 3rd argument greater than 2nd argument throws an IndexSizeError exception");
test((){
assert_throws("NoSuchMethodError", () {
element.setRangeText();
});
}, element.id + " setRangeText without argument throws a type error");
// element.onselect = t.step_func_done((e) {
element.onSelect.forEach((e) {
test(() {
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.id + " setRangeText fires a select event");
});
element.setRangeText("foobar2", start:0, end:6);
q=true;
});
checkTestFailures();
}