<!DOCTYPE html>
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/js-test-selection-shared.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>

<div id="test"> 
    <div id="regular-div">
        line 1<br>
        line 2<br>
        line 3
    </div> 
    <div contenteditable="true" id="editable-div">
         line 1<br>
         line 2<br>
         line 3
    </div> 
    <textarea id="text-area" cols="60" rows="7">
line 1
line 2
line 3</textarea>
    <input type="text" id="text-input" value="line 2"/>
</div>

<script>
if (window.internals)
    internals.setContinuousSpellCheckingEnabled(false); // For performance.

description("This test ensures that programmatically set selections are directionless on mac, and that they are not on other platforms.");

function selectLine(node) {
    var selection = window.getSelection();
    selection.empty();

    if (node.localName == 'div') {
        var container = node.childNodes[2];
        var range = document.createRange();
        range.setStart(container, container.data.search('ine 2'));
        range.setEnd(container, range.startOffset + 'in'.length);
        selection.addRange(range);
    } else {
       node.selectionDirection = 'none';
       node.selectionStart = node.value.search('ine 2');
       node.selectionEnd = node.selectionStart + 'in'.length;
    }
}

function runTestsAndVerify(name, selectionModifier, expectedDirection, expectedText) {
    var currentTest = makeTest(name, selectionModifier, expectedDirection, expectedText);

    currentTest('no action');
    currentTest('delete');
    currentTest('forwardDelete');
    currentTest('cut');
    currentTest('bold');
    currentTest('insertText');
}

function makeTest(name, selectionModifier, expectedDirection, expectedText) {
    return function (action) {
        selectLine(name);
        var actionString = '';

        if (action != 'no action') {
            document.execCommand(action, false, 'word');
            document.execCommand('undo');
            actionString = ', after undoing ' + action;
        }

        var description = selectionModifier() + ' in ' + name.id + actionString;
        var selection = window.getSelection();
        var actualDirection = selection.baseOffset < selection.extentOffset ? 'forward' : (selection.baseOffset > selection.extentOffset ? 'backward' : 'none');

        if (selection.toString() != expectedText)
            testFailed(description + ', expected "' + expectedText + '" but got "' + selection.toString() + '"');
        else if (description.split(' ')[4] == 'div' && expectedDirection != actualDirection)
            testFailed(description + ', expected ' + expectedDirection + ' direction but got ' + actualDirection);
        else
            testPassed(description);
    }
}

function makeSelectionModifier(direction, granularity) {
    return function() {
        window.getSelection().modify('extend', direction, granularity);
        var testDescription = direction + ' by ' + granularity;
        return testDescription;
    }
}

function runTestsOn(platform, node) {
    var macOrNonMac = platform == 'mac' ? 'mac' : 'non-mac';
    var backwardOnMacAndForwardOtherwise = {'mac': 'backward', 'non-mac': 'forward'}[macOrNonMac];

    var extendSelectionLeftByCharacter = makeSelectionModifier('left', 'character');
    var extendSelectionRightByCharacter = makeSelectionModifier('right', 'character');
    var extendSelectionLeftByLine = makeSelectionModifier('left', 'line');
    var extendSelectionRightByLine = makeSelectionModifier('right', 'line');

    runTestsAndVerify(node, extendSelectionLeftByCharacter, backwardOnMacAndForwardOtherwise, {'mac': 'lin', 'non-mac': 'i'}[macOrNonMac]);
    runTestsAndVerify(node, extendSelectionRightByCharacter, 'forward', 'ine');

    if (node.localName == 'input')
        expectedResult = {'mac': 'lin', 'non-mac': 'l'};
    else if (node.localName == 'textarea')
        expectedResult = {'mac': 'ine 1\nlin', 'non-mac': 'e 1\nl'}
    else if (node.localName == 'div')
        expectedResult = {'mac': 'ine 1\nlin', 'non-mac': 'e 1\nl'}

    runTestsAndVerify(node, extendSelectionLeftByLine, backwardOnMacAndForwardOtherwise, expectedResult[macOrNonMac]);

    if (node.localName == 'input')
        expectedResult = 'ine 2';
    else if (node.localName == 'textarea')
        expectedResult = 'ine 2\nlin';
    else if (node.localName == 'div')
        expectedResult = 'ine 2\nlin';

    runTestsAndVerify(node, extendSelectionRightByLine, 'forward', expectedResult);
}

function runTestsFor(platform) {
    debug(platform + ':');
    internals.settings.setEditingBehavior(platform);
    var listOfTestNodes = document.getElementById('test').childNodes;

    for (var i = 0; i < listOfTestNodes.length; i++) {
        if (listOfTestNodes[i].nodeName != '#text')
            runTestsOn(platform, listOfTestNodes[i]);
    }
}

if (window.internals) {
    runTestsFor('mac');
    runTestsFor('win');
    runTestsFor('unix');

    document.getElementById('test').innerHTML = '';
}

</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
