<!DOCTYPE html>
<html>
  <head>
    <script src="../resources/js-test.js"></script>
  </head>
  <body>

    <textarea id="textarea" rows="3" cols="40">
Line 1
Line 2
Line 3
    </textarea>

    <textarea id="textarea-empty" rows="5" cols="40"></textarea>

    <script>
        description("This tests that text selection is reported correctly for textarea elements.");

        if (window.accessibilityController) {

            let textarea = document.getElementById('textarea');
            textarea.focus();
            window.textareaAccessible =
                accessibilityController.accessibleElementById('textarea');
            window.emptyTextareaAccessible =
                accessibilityController.accessibleElementById('textarea-empty');

            // Select the entire contents.
            textarea.select();
            shouldBe("textareaAccessible", "textareaAccessible.selectionAnchorObject");
            shouldBeZero("textareaAccessible.selectionAnchorOffset");
            shouldBe("textareaAccessible", "textareaAccessible.selectionFocusObject");
            shouldBeEqualToNumber("textareaAccessible.selectionFocusOffset",
                textarea.textLength);
            
            // Select entire lines.
            for (let lineNumber = 0; lineNumber < 3; ++lineNumber) {
                for (let directionIndex = 0; directionIndex < 2;
                    ++directionIndex) {
                    let selectionAnchorOffset = lineNumber * 7;
                    let selectionFocusOffset = (lineNumber + 1) * 7;
                    let direction = 'forward';
                    if (directionIndex)
                        direction = 'backward';

                    textarea.setSelectionRange(selectionAnchorOffset, selectionFocusOffset,
                                               direction);
                    shouldBe("textareaAccessible", "textareaAccessible.selectionAnchorObject");
                    shouldBeEqualToNumber("textareaAccessible.selectionAnchorOffset",
                        selectionAnchorOffset);
                    shouldBe("textareaAccessible", "textareaAccessible.selectionFocusObject");
                    shouldBeEqualToNumber("textareaAccessible.selectionFocusOffset",
                        selectionFocusOffset);
                }
            }

            let emptyTextarea = document.getElementById('textarea-empty');
            emptyTextarea.focus();            
            // Each textarea remembers its own independent selection but
            // textareas that are not focused don't expose their selection
            // visually.
            shouldBe("emptyTextareaAccessible", "textareaAccessible.selectionAnchorObject");
            shouldBeEqualToNumber("textareaAccessible.selectionAnchorOffset", 0);
            shouldBe("emptyTextareaAccessible", "textareaAccessible.selectionFocusObject");
            shouldBeEqualToNumber("textareaAccessible.selectionFocusOffset", 0);

            textarea.focus();
            shouldBe("textareaAccessible", "textareaAccessible.selectionAnchorObject");
            shouldBeEqualToNumber("textareaAccessible.selectionAnchorOffset", 14);
            shouldBe("textareaAccessible", "textareaAccessible.selectionFocusObject");
            shouldBeEqualToNumber("textareaAccessible.selectionFocusOffset", 21);

            emptyTextarea.focus();
            shouldBe("emptyTextareaAccessible", "emptyTextareaAccessible.selectionAnchorObject");
            shouldBeZero("emptyTextareaAccessible.selectionAnchorOffset");
            shouldBe("emptyTextareaAccessible", "emptyTextareaAccessible.selectionFocusObject");
            shouldBeZero("emptyTextareaAccessible.selectionFocusOffset");
            
            // Setting an invalid selection should not be visible.
            emptyTextarea.setSelectionRange(1, 1);
            shouldBeZero("emptyTextareaAccessible.selectionAnchorOffset");
            shouldBeZero("emptyTextareaAccessible.selectionFocusOffset");

        }
    </script>

  </body>
</html>
