<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js" type="text/javascript"></script>
<style>
    body {
        font: 20px Ahem;
    }
</style>
</head>
<body>
<p> Bug <a href="http://webkit.org/b/86390">86390</a>: Expose FrameSelection::absoluteCaretBounds via window.internals</p>
<p>This test demonstrates the usage of window.internals.absoluteCaretBounds()</p>
<div id="testDiv" CONTENTEDITABLE>abcd</div>
<div id="console"></div>
</body>
<script>
    var caretRects = [];
    function verifyCaretRect(left, top, width, height)
    {
        if (window.internals) {
            var index = caretRects.length;
            caretRects.push(internals.absoluteCaretBounds());
            shouldBe("caretRects[" + index + "].left", left.toString());
            shouldBe("caretRects[" + index + "].top", top.toString());
            shouldBe("caretRects[" + index + "].width", width.toString());
            shouldBe("caretRects[" + index + "].height", height.toString());
        }
    }

    var textNode = document.getElementById("testDiv").firstChild;
    getSelection().collapse(textNode, 0);  // before a
    verifyCaretRect(8, 160, 1, 20);
    getSelection().collapse(textNode, 1);  // after a
    verifyCaretRect(28, 160, 1, 20);
    getSelection().collapse(textNode, 2);  // after b
    verifyCaretRect(48, 160, 1, 20);
    getSelection().collapse(textNode, 3);  // after c
    verifyCaretRect(68, 160, 1, 20);
    getSelection().collapse(textNode, 4);  // after d
    verifyCaretRect(88, 160, 1, 20);
</script>
<script src="../../resources/js-test-post.js" type="text/javascript"></script>
</html>
