blob: fd740f23854b7c45996710ca80d159e27abc6a81 [file] [log] [blame]
<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<div id="main" role="main">
<div id="contenteditable-textbox" role="textbox" contenteditable="true">
<div id="contenteditable-line1">Line 1</div>
<textarea id="contenteditable-line2" rows="1" cols="40">Line 2</textarea>
</div>
<div id="contenteditable-div" contenteditable>
<p id="paragraph1">Line 1<br>Line 2</p>
<p id="paragraph2">Line 3</p>
</div>
</div>
<script>
test(function()
{
var selection = window.getSelection();
var selectionRange = document.createRange();
var mainAccessible = accessibilityController.accessibleElementById("main");
var rootAccessible = accessibilityController.rootElement;
var textbox = document.getElementById("contenteditable-textbox");
var textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox");
var line1Accessible = accessibilityController.accessibleElementById("contenteditable-line1");
var line1TextAccessible = line1Accessible.childAtIndex(0);
// Select the entire contents of the outer ARIA textbox.
// These include another ARIA textbox and a textarea node
// taking up three lines.
textbox.focus();
selectionRange.selectNodeContents(textbox);
selection.removeAllRanges();
selection.addRange(selectionRange);
assert_equals(textboxAccessible.selectionStart, 0);
// 7 for the "Line 1" text div + 1 for the textarea node.
// (The textarea node should be treated as a single unit.)
assert_equals(textboxAccessible.selectionEnd, 8);
// Selection offsets should be the same when retrieved from the parent object.
assert_equals(mainAccessible.selectionStart, 0);
assert_equals(mainAccessible.selectionEnd, 8);
assert_equals(rootAccessible.selectionAnchorObject, line1TextAccessible);
assert_equals(rootAccessible.selectionAnchorOffset, 0);
assert_equals(rootAccessible.selectionFocusObject, textboxAccessible);
assert_equals(rootAccessible.selectionFocusOffset, 8);
}, "Test selectNodeContents on an ARIA textbox.");
</script>
<script>
test(function()
{
var selection = window.getSelection();
var selectionRange = document.createRange();
var mainAccessible = accessibilityController.accessibleElementById("main");
var rootAccessible = accessibilityController.rootElement;
var contenteditable = document.getElementById("contenteditable-div");
var line1 = document.getElementById("paragraph1").firstChild;
var line3 = document.getElementById("paragraph2").firstChild;
var contenteditableAccessible = accessibilityController.accessibleElementById("contenteditable-div");
// Select the entire contents of the second content editable.
contenteditable.focus();
selectionRange.selectNodeContents(contenteditable);
selection.removeAllRanges();
selection.addRange(selectionRange);
assert_equals(contenteditableAccessible.selectionStart, 0);
assert_equals(contenteditableAccessible.selectionEnd, 21);
// 7 for line1 + 1 for the textarea + 1 for the blank line.
assert_equals(mainAccessible.selectionStart, 9);
assert_equals(mainAccessible.selectionEnd, 30);
assert_equals(rootAccessible.selectionAnchorObject.name,
line1.textContent);
assert_equals(rootAccessible.selectionAnchorOffset, 0);
assert_equals(rootAccessible.selectionFocusObject.name,
line3.textContent);
assert_equals(rootAccessible.selectionFocusOffset, 6);
}, "Test selectNodeContents on a contenteditable.");
</script>
<script>
test(function()
{
var selection = window.getSelection();
var selectionRange = document.createRange();
var mainAccessible = accessibilityController.accessibleElementById("main");
var rootAccessible = accessibilityController.rootElement;
var textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox");
var line1 = document.getElementById("contenteditable-line1");
var line1Accessible = accessibilityController.accessibleElementById("contenteditable-line1");
var line1TextAccessible = line1Accessible.childAtIndex(0);
// Select only the first line of the ARIA textbox.
selectionRange.setStart(line1.firstChild, 0);
selectionRange.setEnd(line1.firstChild, 6);
selection.removeAllRanges();
selection.addRange(selectionRange);
assert_equals(textboxAccessible.selectionStart, 0);
assert_equals(textboxAccessible.selectionEnd, 6);
assert_equals(mainAccessible.selectionStart, 0);
assert_equals(mainAccessible.selectionEnd, 6);
assert_equals(rootAccessible.selectionAnchorObject, line1TextAccessible);
assert_equals(rootAccessible.selectionAnchorOffset, 0);
assert_equals(rootAccessible.selectionFocusObject, line1TextAccessible);
assert_equals(rootAccessible.selectionFocusOffset, 6);
}, "The effects of the setStart and setEnd methods should be reflected in the accessibility API.");
</script>
<script>
test(function()
{
var textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox");
var rootAccessible = accessibilityController.rootElement;
var line2 = document.getElementById("contenteditable-line2");
var line2Accessible = accessibilityController.accessibleElementById("contenteditable-line2");
line2.focus();
// The selection should have been removed from the line1 div
// due to the focus being moved.
assert_equals(textboxAccessible.selectionStart, 0);
assert_equals(textboxAccessible.selectionEnd, 0);
assert_equals(rootAccessible.selectionAnchorObject, line2Accessible);
assert_equals(rootAccessible.selectionAnchorOffset, 0);
assert_equals(rootAccessible.selectionFocusObject, line2Accessible);
assert_equals(rootAccessible.selectionFocusOffset, 0);
}, "Verify that changing the focus removes the selection.");
</script>
<script>
test(function()
{
var textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox");
var mainAccessible = accessibilityController.accessibleElementById("main");
var rootAccessible = accessibilityController.rootElement;
var line2Accessible = accessibilityController.accessibleElementById("contenteditable-line2");
var line2 = document.getElementById("contenteditable-line2");
// Select only the second line of the ARIA textbox, that is,
// the one found in the textarea.
line2.setSelectionRange(0, line2.textLength);
assert_equals(line2Accessible.selectionStart, 0);
assert_equals(line2Accessible.selectionEnd, line2.textLength);
// Unlike for other elements, offsets in text fields should be
// reported from the beginning of the field and not from the top of the
// container on which the API was called.
assert_equals(textboxAccessible.selectionStart, 0);
assert_equals(textboxAccessible.selectionEnd, line2.textLength);
assert_equals(mainAccessible.selectionStart, 0);
assert_equals(mainAccessible.selectionEnd, line2.textLength);
assert_equals(rootAccessible.selectionAnchorObject, line2Accessible);
assert_equals(rootAccessible.selectionAnchorOffset, 0);
assert_equals(rootAccessible.selectionFocusObject, line2Accessible);
assert_equals(rootAccessible.selectionFocusOffset, line2.textLength);
}, "The effects of the textarea.setSelectionRange method should be reflected in the accessibility API.");
</script>
<script>
test(function()
{
var textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox");
var mainAccessible = accessibilityController.accessibleElementById("main");
var rootAccessible = accessibilityController.rootElement;
var line2Accessible = accessibilityController.accessibleElementById("contenteditable-line2");
// Selection can also be set via the accessibility API.
line2Accessible.setSelectedTextRange(2, 3);
assert_equals(line2Accessible.selectionStart, 2);
assert_equals(line2Accessible.selectionEnd, 5);
assert_equals(textboxAccessible.selectionStart, 2);
assert_equals(textboxAccessible.selectionEnd, 5);
assert_equals(mainAccessible.selectionStart, 2);
assert_equals(mainAccessible.selectionEnd, 5);
assert_equals(rootAccessible.selectionAnchorObject, line2Accessible);
assert_equals(rootAccessible.selectionAnchorOffset, 2);
assert_equals(rootAccessible.selectionFocusObject, line2Accessible);
assert_equals(rootAccessible.selectionFocusOffset, 5);
}, "Test the setSelectedTextRange accessibility API function.");
</script>
<script>
test(function()
{
var selection = window.getSelection();
var selectionRange = document.createRange();
var mainAccessible = accessibilityController.accessibleElementById("main");
var rootAccessible = accessibilityController.rootElement;
var contenteditable = document.getElementById("contenteditable-div");
var line1 = document.getElementById("paragraph1").firstChild;
var line2 = document.getElementById("paragraph1").lastChild;
var line3 = document.getElementById("paragraph2").firstChild;
var contenteditableLines = [ line1, line2, line3 ];
var contenteditableAccessible = accessibilityController.accessibleElementById("contenteditable-div");
// Select entire lines in the second content editable.
for (var testCase = 0; testCase < 2; ++testCase) {
for (var i = 0; i < contenteditableLines.length; ++i) {
var start = i * 7;
var end = i * 7 + 6;
if (i == 2) {
// Paragraphs have a blank line between them.
++start;
++end;
}
selectionRange.selectNode(contenteditableLines[i]);
selection.removeAllRanges();
selection.addRange(selectionRange);
assert_equals(contenteditableAccessible.selectionStart, start);
assert_equals(contenteditableAccessible.selectionEnd, end);
assert_equals(mainAccessible.selectionStart, start + 9);
assert_equals(mainAccessible.selectionEnd, end + 9);
assert_equals(rootAccessible.selectionAnchorObject.name,
contenteditableLines[i].textContent);
assert_equals(rootAccessible.selectionAnchorOffset, 0);
assert_equals(rootAccessible.selectionFocusObject.name,
contenteditableLines[i].textContent);
assert_equals(rootAccessible.selectionFocusOffset, 6);
}
// For a sanity check, try the same test with contenteditable="false".
contenteditable.contenteditable = false;
}
}, "The effects of the selectNode method should be reflected in the accessibility API.");
</script>
<script>
if (window.testRunner)
document.getElementById("main").style.display = "none";;
</script>