<script>
if (window.testRunner) {
     testRunner.dumpEditingCallbacks();
     testRunner.dumpAsText();
}

var sel = window.getSelection();

function logResult(str) {
    if (str != 'SUCCESS')
        str += ' baseOffset: ' + sel.baseOffset + ' extentOffset: ' + sel.extentOffset;
    document.getElementById('result').innerHTML = str;
}

function runTest() {
    if (!window.testRunner) {
        log('This test must be run by DumpRenderTree!') 
        return;
    }

    var onMacPlatform =  navigator.userAgent.search(/\bMac OS X\b/) != -1;
    
    var area = document.getElementById('area');
    area.focus();

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

    if (sel.baseOffset != 9 || sel.extentOffset != 9) {
        logResult("Selection should be at the end.");
        return;
    }
    
    // Now move back to the beginning
    if (onMacPlatform)
        eventSender.keyDown("leftArrow", ["metaKey"]);
    else
        eventSender.keyDown("home");

    if (sel.baseOffset != 0 || sel.extentOffset != 0) {
        logResult("Selection should be at the beginning.");
        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) {
        logResult("Selection should contain the whole line and have forward directionality.");
        return;
    }

    // Deselect but position the caret at the end
    eventSender.keyDown("rightArrow");
    
    if (sel.baseOffset != 9 || sel.extentOffset != 9) {
        logResult("Selection should be at the end.");
        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) {
        logResult("Selection should contain the whole line and have backward directionality.");
        return;
    }
    
    logResult('SUCCESS');
}
</script>
<body onload="runTest();">
    <div contenteditable id="area">Some text</div>
    <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>
