<!DOCTYPE HTML>
<html>
    <head>
        <title id="desc">HTML5 Selection: Collapse the selection with collapseToEnd()</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.collapseToEnd();
                    
                    range.collapse(false);
                    
                    checkSelectionAttributes(range.startContainer, range.startOffset, range.endContainer, range.endOffset, 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 with collapseToEnd()</p>
        <p>Test passes if the word "PASS" appears below.</p>
        <div>Test result: </div>
        <div id="testresult">FAIL</div>
    </body>
</html>
