<html>
    <head>
<script>
if (window.layoutTestController)
     layoutTestController.dumpEditingCallbacks();
</script>

        <script>
            function runTest() {
                if (window.layoutTestController)
                    layoutTestController.dumpAsText();
                else {
                    log('This test must be run by DumpRenderTree!') 
                    return;
                }

                var onMacPlatform = false;
                if (navigator.userAgent.search(/\bMac OS X\b/) != -1)
                    onMacPlatform = true;
                
                var area = document.getElementById('area');
                area.focus();
                
                var sel = window.getSelection();
                // Position the caret at the beginning of the string.
                eventSender.keyDown("leftArrow");

                // Now move to the end
                if (onMacPlatform)
                    eventSender.keyDown("rightArrow", ["metaKey"]);
                else
                    eventSender.keyDown("end");

                if (sel.baseOffset != 9 || sel.extentOffset != 9)
                    return;
                
                // Now move back to the beginning
                if (onMacPlatform)
                    eventSender.keyDown("leftArrow", ["metaKey"]);
                else
                    eventSender.keyDown("home");

                if (sel.baseOffset != 0 || sel.extentOffset != 0)
                    return;

                // Now move to the end, selecting
                if (onMacPlatform)
                    eventSender.keyDown("rightArrow", ["metaKey", "shiftKey"]);
                else
                    eventSender.keyDown("end",["shiftKey"]);

                if (sel.baseOffset != 0 || sel.extentOffset != 9)
                    return;

                // Deselect but position the caret at the end
                eventSender.keyDown("rightArrow");
                
                if (sel.baseOffset != 9 || sel.extentOffset != 9)
                    return;
                
                // Now move to the beginning, selecting
                if (onMacPlatform)
                    eventSender.keyDown("leftArrow", ["metaKey", "shiftKey"]);
                else
                    eventSender.keyDown("home",["shiftKey"]);
                
                if (sel.baseOffset != 9 || sel.extentOffset != 0)
                    return;
                
                document.getElementById('result').innerHTML = 'SUCCESS'
            }
        </script>
    </head>
    <body onload="runTest();">
        <textarea id="area">Some text</textarea>
        <div>This tests that moving the caret and selecting using Command+Left/Right arrows work correctly. If this text is successful, the text "SUCCESS" will be shown below.</div>
        <div id="result">FAILURE</div>
    </body>
</html>
