<!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>
