mirror of
https://github.com/servo/servo.git
synced 2025-09-30 16:49:16 +01:00
Selection interface working for synthetic operations
This commit is contained in:
parent
e697e6cca7
commit
5ef3358951
30 changed files with 812 additions and 8468 deletions
|
@ -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"
|
||||
|
|
|
@ -212,6 +212,7 @@ test_interfaces([
|
|||
"Request",
|
||||
"Response",
|
||||
"Screen",
|
||||
"Selection",
|
||||
"ShadowRoot",
|
||||
"StereoPannerNode",
|
||||
"Storage",
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue