<html>
<head>
    <style>
        #test {
            width: 400px;
            font-family: "Ahem";
        }
    </style>
    <script>
        if (window.testRunner)
            testRunner.dumpAsText();

        var _log = "";
        function log(msg)
        {
            _log += msg + "\n";
        }

        function swapInLog()
        {
            var element = document.getElementById('test');
            var parent = element.parentNode;
            parent.removeChild(element);
            var console = document.createElement("pre");
            console.textContent = _log;
            parent.appendChild(console);
        }

        var element;

        function test(x, y, __expectedContainer, __expectedOffset)
        {
            var expectedContainer = eval(__expectedContainer);
            var expectedOffset = eval(__expectedOffset);

            var range = document.caretRangeFromPoint(x, y);

            if (range.startContainer == expectedContainer) {
                log("PASS: range.startContainer == " + __expectedContainer + ".");
            } else {
                log("FAIL: range.startContainer == " + range.startContainer + ".");
            }

            if (range.startOffset == expectedOffset) {
                log("PASS: range.startOffset == " + __expectedOffset + ".");
            } else {
                log("FAIL: range.startOffset == " + range.startOffset + ".");
            }
        }

        function shouldBeNull(x, y)
        {
            var range = document.caretRangeFromPoint(x, y);

            if (range === null) {
                log("PASS: range is null.");
            } else {
                log("FAIL: range is not null.");
            }
        }

        window.onload = function()
        {
            element = document.getElementById('test');
            text = element.firstChild;

            var rect = element.getBoundingClientRect();

            log("Testing upper left");
            test(rect.left, rect.top, "element.firstChild", "0");

            log("Testing upper right");
            test(rect.left + rect.width, rect.top, "element.firstChild", "23");

            log("Testing lower left");
            test(rect.left, rect.top + rect.height - 1, "element.firstChild", "72");
            
            log("Testing lower right");
            test(rect.left + rect.width, rect.top + rect.height - 1, "element.firstChild", "95");

            log("Testing somewhere in the middle");
            test((rect.left + rect.width) / 2, (rect.top + rect.height) / 2, "element.firstChild", "36");

            log("Testing negative values");
            shouldBeNull(-10, 10);
            shouldBeNull(10, -10);
            shouldBeNull(-10, -10);

            log("Testing values larger than the viewport");
            shouldBeNull(window.innerWidth + 100, 10);
            shouldBeNull(10, window.innerHeight + 100);
            shouldBeNull(window.innerWidth + 100, window.innerHeight + 100);

            swapInLog();
        }
    </script>
</head>
<body>
<div id="test">xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx xxxxx</div>
</body>
</html>
