<!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('Windows');
    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>
