<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("ArrowRight", ["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("ArrowLeft", ["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("ArrowRight", ["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("ArrowRight");
    
    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("ArrowLeft", ["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>
