<!DOCTYPE HTML>
<html>
    <head>
        <title id="desc">HTML5 Selection: Collapse the selection using collapse()</title>
        <script type="text/javascript">
            var testPassed = true;
            
            function checkSelectionAttributes(anchorNode, anchorOffset, focusNode, focusOffset, collapsed, rangeCount)
            {
                var selection = window.getSelection();
                if (anchorNode != selection.anchorNode)
                {
                    testPassed = false;
                }
                if (anchorOffset != selection.anchorOffset)
                {
                    testPassed = false;
                }
                if (focusNode != selection.focusNode)
                {
                    testPassed = false;
                }
                if (focusOffset != selection.focusOffset)
                {
                    testPassed = false;
                }
                if (collapsed != selection.isCollapsed)
                {
                    testPassed = false;
                }
                if (rangeCount != selection.rangeCount)
                {
                    testPassed = false;
                }
            }
            
            function RunTest()
            {
                try
                {
                    var selection = window.getSelection();
                    var p1 = document.getElementById("p1");
                    
                    var range = document.createRange();
                    range.selectNode(p1);
                    selection.addRange(range);
                    selection.collapse(p1, 0);
                    
                    checkSelectionAttributes(p1, 0, p1, 0, true, 1);
                    if ("" != selection.toString())
                    {
                        testPassed = false;
                    }
                    
                    if (testPassed)
                    {
                        document.getElementById("testresult").firstChild.data = "PASS";
                    }
                }
                catch (ex)
                {
                    document.getElementById("testresult").firstChild.data = "FAIL";
                }
            }
        </script>
    </head>
    <body onload="RunTest();">
        <p id="p1">Collapse the selection using collapse()</p>
        <p>Test passes if the word "PASS" appears below.</p>
        <div>Test result: </div>
        <div id="testresult">FAIL</div>
    </body>
</html>
