<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta charset="utf-8">
<script src="../resources/js-test.js"></script>
</head>
<body>

<p id="paragraph" style="width: 30em;">
The  Hitchhiker's   Guide to the

Galaxy has a few things to say on the subject of resumés.
A resumé, it says, is about the most massively useful thing an interstellar hitch hiker can have.
</p>

<p id="description"></p>

<div id="console"></div>

<script>

    description("Tests that we can compute the bounds of a range of text from the accessibility tree.");

    if (window.accessibilityController) {
        var axParagraph = accessibilityController.accessibleElementById('paragraph');
        var axStaticText = axParagraph.childAtIndex(0);

        var text = axStaticText.name;
        shouldBe("text.length", "185");
        debug("Accessible text: \"" + text + "\"");

        // Append the text from all of the inline text boxes and make sure we get the same text.
        var appendedInlineText = '';
        for (var i = 0; i < axStaticText.childrenCount; i++) {
            var axInlineTextBox = axStaticText.childAtIndex(i);
            appendedInlineText += axInlineTextBox.name;
        }
        shouldBe("appendedInlineText", "text");

        // For several possible words in the text, get the bounds of the word in the accessibility
        // tree, and also in the DOM, and assert that they're the same, within one pixel.
        var paragraph = document.getElementById('paragraph');
        var domText = paragraph.innerHTML;
        function testWord(word) {
            debug('\nTesting bounds of word: ' + word);

            // Get the bounds from the accessibility tree.
            window.wordAxIndex = text.indexOf(word);
            eval('window.axBounds = ' + axStaticText.boundsForRange(wordAxIndex, wordAxIndex + word.length) + ';');

            // Get the bounds from the DOM.
            window.domIndex = domText.indexOf(word);
            var range = new Range();
            range.setStart(paragraph.firstChild, domIndex);
            range.setEnd(paragraph.firstChild, domIndex + word.length);
            window.rangeBounds = range.getBoundingClientRect();

            // Make sure they're the same, within one pixel.
            shouldBeCloseTo("axBounds.x", rangeBounds.left, 1);
            shouldBeCloseTo("axBounds.y", rangeBounds.top, 1);
            shouldBeCloseTo("axBounds.width", rangeBounds.width, 1);
            shouldBeCloseTo("axBounds.height", rangeBounds.height, 1);
        }
        testWord('The');
        testWord('Hitchhiker');
        testWord('Guide');
        testWord('interstellar');
    }
</script>

</body>
</html>
