зеркало из https://github.com/mozilla/gecko-dev.git
245 строки
9.3 KiB
HTML
245 строки
9.3 KiB
HTML
<!DOCTYPE HTML>
|
|
<html>
|
|
<!--
|
|
https://bugzilla.mozilla.org/show_bug.cgi?id=850364
|
|
-->
|
|
<head>
|
|
<title>Tests for Bug 850364 && Bug 918940</title>
|
|
<script src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
<script src="/tests/SimpleTest/EventUtils.js"></script>
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
|
</head>
|
|
<body>
|
|
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=850364">Mozilla Bug 850364</a>
|
|
<p id="display"></p>
|
|
<div id="content">
|
|
|
|
<!-- "SetRangeText() supported types"-->
|
|
<input type="text" id="input_text"></input>
|
|
<input type="search" id="input_search"></input>
|
|
<input type="url" id="input_url"></input>
|
|
<input type="tel" id="input_tel"></input>
|
|
<input type="password" id="input_password"></input>
|
|
<textarea id="input_textarea"></textarea>
|
|
|
|
<!-- "SetRangeText() non-supported types" -->
|
|
<input type="button" id="input_button"></input>
|
|
<input type="submit" id="input_submit"></input>
|
|
<input type="image" id="input_image"></input>
|
|
<input type="reset" id="input_reset"></input>
|
|
<input type="radio" id="input_radio"></input>
|
|
<input type="checkbox" id="input_checkbox"></input>
|
|
<input type="range" id="input_range"></input>
|
|
<input type="file" id="input_file"></input>
|
|
<input type="email" id="input_email"></input>
|
|
|
|
</div>
|
|
<pre id="test">
|
|
<script class="testbody" type="text/javascript">
|
|
|
|
/** Tests for Bug 850364 && Bug 918940**/
|
|
|
|
var SupportedTypes = ["text", "search", "url", "tel", "password", "textarea"];
|
|
var NonSupportedTypes = ["button", "submit", "image", "reset", "radio",
|
|
"checkbox", "range", "file", "email"];
|
|
|
|
SimpleTest.waitForExplicitFinish();
|
|
|
|
function TestInputs() {
|
|
|
|
var opThrows, elem, i, msg;
|
|
|
|
//Non-supported types should throw
|
|
for (i = 0; i < NonSupportedTypes.length; ++i) {
|
|
opThrows = false;
|
|
msg = "input_" + NonSupportedTypes[i];
|
|
elem = document.getElementById(msg);
|
|
elem.focus();
|
|
try {
|
|
elem.setRangeText("abc");
|
|
} catch (ex) {
|
|
opThrows = true;
|
|
}
|
|
ok(opThrows, msg + " should throw InvalidStateError");
|
|
}
|
|
|
|
var numOfSelectCalls = 0, expectedNumOfSelectCalls = 0;
|
|
//Supported types should not throw
|
|
for (i = 0; i < SupportedTypes.length; ++i) {
|
|
opThrows = false;
|
|
msg = "input_" + SupportedTypes[i];
|
|
elem = document.getElementById(msg);
|
|
elem.focus();
|
|
try {
|
|
elem.setRangeText("abc");
|
|
expectedNumOfSelectCalls += 1;
|
|
} catch (ex) {
|
|
opThrows = true;
|
|
}
|
|
is(opThrows, false, msg + " should not throw InvalidStateError");
|
|
|
|
elem.addEventListener("select", function (aEvent) {
|
|
ok(true, "select event should be fired for " + aEvent.target.id);
|
|
if (++numOfSelectCalls == expectedNumOfSelectCalls) {
|
|
SimpleTest.finish();
|
|
} else if (numOfSelectCalls > expectedNumOfSelectCalls) {
|
|
ok(false, "Too many select events were fired");
|
|
}
|
|
});
|
|
|
|
elem.addEventListener("input", function (aEvent) {
|
|
ok(false, "input event should NOT be fired for " + + aEvent.target.id);
|
|
});
|
|
|
|
var test = " setRange(replacement), shrink";
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setSelectionRange(1, 6);
|
|
elem.setRangeText("xyz");
|
|
is(elem.value, "0xyz6789ABCDEF", msg + test);
|
|
is(elem.selectionStart, 1, msg + test);
|
|
is(elem.selectionEnd, 4, msg + test);
|
|
elem.setRangeText("mnk");
|
|
is(elem.value, "0mnk6789ABCDEF", msg + test);
|
|
expectedNumOfSelectCalls += 3;
|
|
|
|
test = " setRange(replacement), expand";
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setSelectionRange(1, 2);
|
|
elem.setRangeText("xyz");
|
|
is(elem.value, "0xyz23456789ABCDEF", msg + test);
|
|
is(elem.selectionStart, 1, msg + test);
|
|
is(elem.selectionEnd, 4, msg + test);
|
|
elem.setRangeText("mnk");
|
|
is(elem.value, "0mnk23456789ABCDEF", msg + test);
|
|
expectedNumOfSelectCalls += 3;
|
|
|
|
test = " setRange(replacement) pure insertion at start";
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setSelectionRange(0, 0);
|
|
elem.setRangeText("xyz");
|
|
is(elem.value, "xyz0123456789ABCDEF", msg + test);
|
|
is(elem.selectionStart, 0, msg + test);
|
|
is(elem.selectionEnd, 0, msg + test);
|
|
elem.setRangeText("mnk");
|
|
is(elem.value, "mnkxyz0123456789ABCDEF", msg + test);
|
|
expectedNumOfSelectCalls += 3;
|
|
|
|
test = " setRange(replacement) pure insertion in the middle";
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setSelectionRange(4, 4);
|
|
elem.setRangeText("xyz");
|
|
is(elem.value, "0123xyz456789ABCDEF", msg + test);
|
|
is(elem.selectionStart, 4, msg + test);
|
|
is(elem.selectionEnd, 4, msg + test);
|
|
elem.setRangeText("mnk");
|
|
is(elem.value, "0123mnkxyz456789ABCDEF", msg + test);
|
|
expectedNumOfSelectCalls += 3;
|
|
|
|
test = " setRange(replacement) pure insertion at the end";
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setSelectionRange(16, 16);
|
|
elem.setRangeText("xyz");
|
|
is(elem.value, "0123456789ABCDEFxyz", msg + test);
|
|
is(elem.selectionStart, 16, msg + test);
|
|
is(elem.selectionEnd, 16, msg + test);
|
|
elem.setRangeText("mnk");
|
|
is(elem.value, "0123456789ABCDEFmnkxyz", msg + test);
|
|
expectedNumOfSelectCalls += 3;
|
|
|
|
//test SetRange(replacement, start, end, mode) with start > end
|
|
try {
|
|
elem.setRangeText("abc", 20, 4);
|
|
} catch (ex) {
|
|
opThrows = (ex.name == "IndexSizeError" && ex.code == DOMException.INDEX_SIZE_ERR);
|
|
}
|
|
is(opThrows, true, msg + " should throw IndexSizeError");
|
|
|
|
//test SelectionMode 'select'
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setRangeText("xyz", 4, 9, "select");
|
|
is(elem.value, "0123xyz9ABCDEF", msg + ".value == \"0123xyz9ABCDEF\"");
|
|
is(elem.selectionStart, 4, msg + ".selectionStart == 4, with \"select\"");
|
|
is(elem.selectionEnd, 7, msg + ".selectionEnd == 7, with \"select\"");
|
|
expectedNumOfSelectCalls += 1;
|
|
|
|
elem.setRangeText("pqm", 6, 25, "select");
|
|
is(elem.value, "0123xypqm", msg + ".value == \"0123xypqm\"");
|
|
is(elem.selectionStart, 6, msg + ".selectionStart == 6, with \"select\"");
|
|
is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"select\"");
|
|
expectedNumOfSelectCalls += 1;
|
|
|
|
//test SelectionMode 'start'
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setRangeText("xyz", 4, 9, "start");
|
|
is(elem.value, "0123xyz9ABCDEF", msg + ".value == \"0123xyz9ABCDEF\"");
|
|
is(elem.selectionStart, 4, msg + ".selectionStart == 4, with \"start\"");
|
|
is(elem.selectionEnd, 4, msg + ".selectionEnd == 4, with \"start\"");
|
|
expectedNumOfSelectCalls += 1;
|
|
|
|
elem.setRangeText("pqm", 6, 25, "start");
|
|
is(elem.value, "0123xypqm", msg + ".value == \"0123xypqm\"");
|
|
is(elem.selectionStart, 6, msg + ".selectionStart == 6, with \"start\"");
|
|
is(elem.selectionEnd, 6, msg + ".selectionEnd == 6, with \"start\"");
|
|
expectedNumOfSelectCalls += 1;
|
|
|
|
//test SelectionMode 'end'
|
|
elem.value = "0123456789ABCDEF";
|
|
elem.setRangeText("xyz", 4, 9, "end");
|
|
is(elem.value, "0123xyz9ABCDEF", msg + ".value == \"0123xyz9ABCDEF\"");
|
|
is(elem.selectionStart, 7, msg + ".selectionStart == 7, with \"end\"");
|
|
is(elem.selectionEnd, 7, msg + ".selectionEnd == 7, with \"end\"");
|
|
expectedNumOfSelectCalls += 1;
|
|
|
|
elem.setRangeText("pqm", 6, 25, "end");
|
|
is(elem.value, "0123xypqm", msg + ".value == \"0123xypqm\"");
|
|
is(elem.selectionStart, 9, msg + ".selectionStart == 9, with \"end\"");
|
|
is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"end\"");
|
|
expectedNumOfSelectCalls += 1;
|
|
|
|
//test SelectionMode 'preserve' (default)
|
|
|
|
//subcase: selection{Start|End} > end
|
|
elem.value = "0123456789";
|
|
elem.setSelectionRange(6, 9);
|
|
elem.setRangeText("Z", 1, 2, "preserve");
|
|
is(elem.value, "0Z23456789", msg + ".value == \"0Z23456789\"");
|
|
is(elem.selectionStart, 6, msg + ".selectionStart == 6, with \"preserve\"");
|
|
is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"preserve\"");
|
|
expectedNumOfSelectCalls += 2;
|
|
|
|
//subcase: selection{Start|End} < end
|
|
elem.value = "0123456789";
|
|
elem.setSelectionRange(4, 5);
|
|
elem.setRangeText("QRST", 2, 9, "preserve");
|
|
is(elem.value, "01QRST9", msg + ".value == \"01QRST9\"");
|
|
is(elem.selectionStart, 2, msg + ".selectionStart == 2, with \"preserve\"");
|
|
is(elem.selectionEnd, 6, msg + ".selectionEnd == 6, with \"preserve\"");
|
|
expectedNumOfSelectCalls += 2;
|
|
|
|
//subcase: selectionStart > end, selectionEnd < end
|
|
elem.value = "0123456789";
|
|
elem.setSelectionRange(8, 4);
|
|
elem.setRangeText("QRST", 1, 5);
|
|
is(elem.value, "0QRST56789", msg + ".value == \"0QRST56789\"");
|
|
is(elem.selectionStart, 1, msg + ".selectionStart == 1, with \"default\"");
|
|
is(elem.selectionEnd, 5, msg + ".selectionEnd == 5, with \"default\"");
|
|
expectedNumOfSelectCalls += 2;
|
|
|
|
//subcase: selectionStart < end, selectionEnd > end
|
|
elem.value = "0123456789";
|
|
elem.setSelectionRange(4, 9);
|
|
elem.setRangeText("QRST", 2, 6);
|
|
is(elem.value, "01QRST6789", msg + ".value == \"01QRST6789\"");
|
|
is(elem.selectionStart, 2, msg + ".selectionStart == 2, with \"default\"");
|
|
is(elem.selectionEnd, 9, msg + ".selectionEnd == 9, with \"default\"");
|
|
expectedNumOfSelectCalls += 2;
|
|
}
|
|
}
|
|
|
|
addLoadEvent(TestInputs);
|
|
|
|
</script>
|
|
</pre>
|
|
</body>
|
|
</html>
|