<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>

<div id="main" role="main">

    <div id="editable1" contenteditable="true">Hello1</div>

    <div id="editable2" contenteditable="true">  Hello2  </div>

    <h2 id="heading">  Hello2  </h2>

</div>

<script>
    test(function()
    {
        var axEditable1 = accessibilityController.accessibleElementById("editable1");
        var axTextNode1 = axEditable1.childAtIndex(0);
        assert_equals(axTextNode1.name, "Hello1");
        axTextNode1.setSelectedTextRange(0, 6);

        var selection = window.getSelection();
        var range = selection.getRangeAt(0);
        assert_equals(range.toString(), "Hello1");

        var editable1 = document.getElementById("editable1");
        var textNode1 = editable1.firstChild;
        assert_equals(range.startContainer, textNode1);
        assert_equals(range.startOffset, 0);
        assert_equals(range.endContainer, textNode1);
        assert_equals(range.endOffset, 6);
    }, "Using accessible APIs to set selection works when there's no extra whitespace.");

    test(function()
    {
        var axEditable2 = accessibilityController.accessibleElementById("editable2");
        var axTextNode2 = axEditable2.childAtIndex(0);
        assert_equals(axTextNode2.name, "Hello2");
        axTextNode2.setSelectedTextRange(0, 6);

        var selection = window.getSelection();
        var range = selection.getRangeAt(0);
        assert_equals(range.toString(), "Hello2");

        var editable2 = document.getElementById("editable2");
        var textNode2 = editable2.firstChild;
        assert_equals(range.startContainer, textNode2);
        assert_equals(range.startOffset, 2);
        assert_equals(range.endContainer, textNode2);
        assert_equals(range.endOffset, 8);
    }, "Using accessible APIs to set selection works even with non-visible whitespace.");
</script>

<script>
    test(function()
    {
        var axHeading = accessibilityController.accessibleElementById("heading");
        axHeading.setSelectedTextRange(0, 1);  // Should select the whole element.

        var selection = window.getSelection();
        var range = selection.getRangeAt(0);
        assert_equals(range.toString(), "Hello2");

        var heading = document.getElementById("heading");
        var textNode = heading.firstChild;
        assert_equals(range.startContainer, textNode);
        assert_equals(range.startOffset, 2);
        assert_equals(range.endContainer, textNode);
        assert_equals(range.endOffset, 8);
    }, "Use accessible APIs to set selection on element rather than static text node.");
</script>

<script>
    if (window.testRunner)
        document.getElementById("main").style.display = "none";;
</script>
