<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div><input id="dummy"></div>
<div id="tests"><input value="hello"><textarea>hello</textarea></div>
<div id="console"></div>
<div>
<script type="text/javascript">
description('Tests for selectionDirection');

var dummy = document.getElementById('dummy');

function assertDirection(expectedDirection, element, description) {
    var action = 'selectionDirection was "' + element.selectionDirection
        + '" after ' + description;

    if (element.selectionDirection == expectedDirection)
        testPassed(action);
    else
        testFailed(action + ', but expected "' + expectedDirection + '"');
}

function testCache(expectedDirection, element) {
    dummy.focus();
    assertDirection(expectedDirection, element, 'focusing on another element');

    element.style.display = 'none';
    assertDirection(expectedDirection, element, 'hiding the element');
    element.style.display = null;
}

function runTest(element, platform) {
    debug(element.localName + ' on ' + platform);
    element.focus();

    var noneOnMacAndForwardOnOthers = (platform == 'Mac') ? 'none' : 'forward';

    element.setSelectionRange(1, 2);
    assertDirection(noneOnMacAndForwardOnOthers, element, 'focusing and setting selection by setSelectionRange(1, 2)');
    testCache(noneOnMacAndForwardOnOthers, element);

    element.focus();
    element.setSelectionRange(1, 2, 'forward');
    assertDirection('forward', element, 'focusing and setting selection by setSelectionRange(1, 2, "forward")');
    testCache('forward', element);

    element.setSelectionRange(1, 2, 'backward');
    assertDirection('backward', element, 'setting selection by setSelectionRange(1, 2, "backward") without focus');
    testCache('backward', element);

    element.selectionDirection = 'none';
    assertDirection(noneOnMacAndForwardOnOthers, element, 'setting selection by selectionDirection = "none" without focus');
    testCache(noneOnMacAndForwardOnOthers, element);

    element.selectionDirection = 'forward';
    assertDirection('forward', element, 'focusing and setting selection by selectionDirection = "forward" without focus');
    testCache('forward', element);

    element.focus();
    element.selectionDirection = 'backward';
    assertDirection('backward', element, 'focusing and setting selection by selectionDirection = "backward"');
    testCache('backward', element);

    element.focus();
    element.setSelectionRange(1, 1);
    window.getSelection().modify('extend', 'forward', 'character');
    assertDirection('forward', element, 'extending selection forward by character');
    testCache('forward', element);

    element.focus();
    element.setSelectionRange(1, 1);
    window.getSelection().modify('extend', 'backward', 'character');
    assertDirection('backward', element, 'extending selection backward by character');
    testCache('backward', element);

}

function runTestFor(platform) {
    if (window.internals)
        internals.settings.setEditingBehavior(platform.toLowerCase());
    var tests = document.getElementById('tests');
    for (var i = 0; i < tests.childNodes.length; i++) {
        runTest(tests.childNodes[i], platform);
        debug('');
    }
}

if (window.internals) {
    runTestFor('Mac');
    runTestFor('Win');
    runTestFor('Unix');
} else
    runTestFor(navigator.platform.indexOf('Mac') >= 0 ? 'Mac' : 'Win');

tests.style.display = 'none';
dummy.parentNode.style.display = 'none';

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
