Selection interface working for synthetic operations

This commit is contained in:
Patrick Shaughnessy 2020-01-31 21:56:36 -05:00
parent e697e6cca7
commit 5ef3358951
30 changed files with 812 additions and 8468 deletions

View file

@ -12328,6 +12328,24 @@
{}
]
],
"mozilla/selectionchange/selectionchange_noop.html": [
[
"mozilla/selectionchange/selectionchange_noop.html",
{}
]
],
"mozilla/selectionchange/selectionchange_range.html": [
[
"mozilla/selectionchange/selectionchange_range.html",
{}
]
],
"mozilla/selectionchange/selectionchange_selection.html": [
[
"mozilla/selectionchange/selectionchange_selection.html",
{}
]
],
"mozilla/sequence-hole.html": [
[
"mozilla/sequence-hole.html",
@ -19072,7 +19090,7 @@
"testharness"
],
"mozilla/interfaces.html": [
"fc82a7e82e936811024cbefadaa9cc396511942b",
"bb6adbde0b3452e6ea8f1db44941a08dbe236774",
"testharness"
],
"mozilla/interfaces.js": [
@ -19435,6 +19453,18 @@
"3b49f149b651d77b174647916d9c11c818d2993b",
"testharness"
],
"mozilla/selectionchange/selectionchange_noop.html": [
"9154a9196a6fd76f48c8a91acf45ba1e26a83442",
"testharness"
],
"mozilla/selectionchange/selectionchange_range.html": [
"6a8b06682eea12b03fb3fbe4c5ccb93db7512324",
"testharness"
],
"mozilla/selectionchange/selectionchange_selection.html": [
"a8f4150bfcefafa7b351d329fd6bc788943fd1a0",
"testharness"
],
"mozilla/sequence-hole.html": [
"0021769859417ffeb4d656f7130370b628bfac7d",
"testharness"

View file

@ -212,6 +212,7 @@ test_interfaces([
"Request",
"Response",
"Screen",
"Selection",
"ShadowRoot",
"StereoPannerNode",
"Storage",

View file

@ -0,0 +1,25 @@
<html>
<head>
<title>Test that selectionchange doesn't fire for bad reasons</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<span id="abcd">abcd</span><span id="efgh">efgh</span><span id="ijkl">ijkl</span>
<script>
var t = async_test("things that don't queue selectionchange");
document.onselectionchange = () => {
assert_unreached("A document should not see selectionchange events when the selection isn't changing");
}
var r = new Range();
r.setStart(document.getElementById("abcd"), 1);
r.setEnd(document.getElementById("ijkl"), 1);
var s = document.getSelection();
assert_throws_dom("IndexSizeError", () => { s.getRangeAt(0) });
assert_throws_dom("NotFoundError", () => { s.removeRange(r) });
// selectionchange event is asynchronous, so give tasks a chance to fire.
setTimeout(() => { t.done(); }, 1);
</script>
</body>
</html>

View file

@ -0,0 +1,50 @@
<html>
<head>
<title>Test that selectionchange fires when Range methods cause changes</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<span id="abcd">abcd</span><span id="efgh">efgh</span><span id="ijkl">ijkl</span>
<script>
var t = async_test("Range methods on a Selection's range fire selectionchange");
var r = new Range();
var abcd = document.getElementById("abcd");
var efgh = document.getElementById("efgh");
var ijkl = document.getElementById("ijkl");
r.setStart(abcd, 0);
r.setEnd(ijkl, 1);
var s = document.getSelection();
s.addRange(r);
// A task is now queued that will fire a selectionchange event,
// so the following listener will be called soon, even though it wasn't
// listening at the time we added the range.
var step = 0;
document.onselectionchange = () => {
t.step(() => {
switch(step++) {
case 0: r.setStart(ijkl, 1); break;
case 1: r.setStartAfter(efgh); break;
case 2: r.setStartBefore(abcd); break;
case 3: r.setEnd(abcd, 1); break;
case 4: r.setEndAfter(efgh); break;
case 5: r.setEndBefore(efgh); break;
case 6: r.collapse(); break;
case 7: r.selectNode(efgh); break;
case 8: r.selectNodeContents(abcd); break;
case 9: r.insertNode(efgh);
case 10: r.surroundContents(ijkl); break;
case 11: queueFinish(); break;
case 12: assert_unreached("Too many selectionchange events");
}
},"Step number "+step);
}
function queueFinish() {
// Finish slightly later than the last selectionchange task,
// so if there are any extra ones queued we have time to
// hit the assert_unreached.
setTimeout(() => { t.done(); }, 1);
}
</script>
</body>
</html>

View file

@ -0,0 +1,51 @@
<html>
<head>
<title>Test that selectionchange fires when Selection methods cause changes</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<span id="abcd">abcd</span><span id="efgh">efgh</span><span id="ijkl">ijkl</span>
<script>
var t = async_test("Selection methods fire selectionchange");
var r = new Range();
var abcd = document.getElementById("abcd");
var efgh = document.getElementById("efgh");
var ijkl = document.getElementById("ijkl");
r.setStart(abcd, 0);
r.setEnd(ijkl, 1);
var s = document.getSelection();
s.addRange(r);
// A task is now queued that will fire a selectionchange event,
// so the following listener will be called soon, even though it wasn't
// listening at the time we added the range.
var step = 0;
document.onselectionchange = () => {
t.step(() => {
switch(step++) {
// order chosen so that s.type always changes between consecutive steps
case 0: assert_equals(s.type, "Range"); s.removeRange(r); break;
case 1: assert_equals(s.type, "None"); s.collapse(efgh, 0); break;
case 2: assert_equals(s.type, "Caret"); s.removeAllRanges(); break;
case 3: assert_equals(s.type, "None"); s.setPosition(efgh, 1); break;
case 4: assert_equals(s.type, "Caret"); s.extend(ijkl, 1); break;
case 5: assert_equals(s.type, "Range"); s.collapseToStart(); break;
case 6: assert_equals(s.type, "Caret"); s.setBaseAndExtent(abcd, 0, efgh, 0); break;
case 7: assert_equals(s.type, "Range"); s.collapseToEnd(); break;
case 8: assert_equals(s.type, "Caret"); s.empty(); break;
case 9: assert_equals(s.type, "None"); s.selectAllChildren(efgh); break;
case 10: assert_equals(s.type, "Range"); s.deleteFromDocument(); break;
case 11: assert_equals(s.type, "Caret"); queueFinish(); break;
case 12: assert_unreached("Too many selectionchange events");
}
},"Step number "+step);
}
function queueFinish() {
// Finish slightly later than the last selectionchange task,
// so if there are any extra ones queued we have time to
// hit the assert_unreached.
setTimeout(() => { t.done(); }, 1);
}
</script>
</body>
</html>