<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("Test to make sure left and right arrows keys behave correctly in RTL content.")

var testContainer = document.createElement("div");
testContainer.contentEditable = true;
testContainer.style.padding = "2px";
testContainer.dir = "rtl";
testContainer.innerText = 'מקור השם עברית';
document.body.insertBefore(testContainer, document.body.firstChild);

var selection = window.getSelection();

function dragSelection()
{
    var text = testContainer.firstChild;
    selection.setBaseAndExtent(text, 0, text, 0);
    var middleY = testContainer.offsetTop + (testContainer.offsetHeight / 2);
    eventSender.dragMode = false;
    eventSender.mouseMoveTo(testContainer.offsetLeft, middleY);
    eventSender.leapForward(200);
    eventSender.mouseDown();
    eventSender.leapForward(200);
    for (var i = 0; i <= 10; i++) {
      eventSender.mouseMoveTo(testContainer.offsetLeft + (testContainer.offsetWidth * (i /10)) - 2, middleY);
      eventSender.leapForward(200);
    }
    eventSender.mouseUp();
    eventSender.leapForward(1000);
}

function setSelection()
{
    var text = testContainer.firstChild;

    selection.setBaseAndExtent(text, 5, text , 8);
}

function testSelectionChange(setupFunction, mod, dir, startDelta, endDelta, testName)
{
    setupFunction();
    var range = window.getSelection().getRangeAt(0);
    var initialStart = range.startOffset;
    var initialEnd = range.endOffset;
    
    selection.modify(mod, dir, "character");
    range = window.getSelection().getRangeAt(0);
    var start = range.startOffset;
    var end = range.endOffset;
    
    if (initialStart + startDelta != start)
        testFailed(testName + ": Selection start is " + start + " but should be " + (startDelta + initialStart));
    else if (initialEnd + endDelta != end)
        testFailed(testName + ": Selection end is " + end + " but should be " + (endDelta + initialEnd));
    else
        testPassed(testName);
}

function runTests()
{
    testSelectionChange(setSelection, "move", "right", 0, -3, "Move selection right");
    testSelectionChange(setSelection, "move", "left", 3, 0, "Move selection left");
    if (window.testRunner && window.internals) {
        testRunner.dumpAsText();
        internals.settings.setEditingBehavior("mac");
        testSelectionChange(dragSelection, "extend", "right", 0, 0, "Extend dragged selection right (Mac)");
        testSelectionChange(dragSelection, "extend", "left", 0, 0, "Extend dragged selection left (Mac)");
        internals.settings.setEditingBehavior("win");
        testSelectionChange(dragSelection, "extend", "right", 0, 0, "Extend dragged selection right (Win)");
        testSelectionChange(dragSelection, "extend", "left", 1, 0, "Extend dragged selection left (Win)");
        internals.settings.setEditingBehavior("unix");
        testSelectionChange(dragSelection, "extend", "right", 0, 0, "Extend dragged selection right (Unix)");
        testSelectionChange(dragSelection, "extend", "left", 1, 0, "Extend dragged selection left (Unix)");
    }
}

runTests();
document.body.removeChild(testContainer);
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
