<html>
<script src=../editing.js></script>
<script>

function editingTest() {
    // Select "beta" and "gamma".
    moveSelectionForwardByLineCommand();
    for (i = 0; i < 2; i++)
        extendSelectionForwardByLineCommand();
    copyCommand();

    // Paste with the cursor right before "delta".
    moveSelectionForwardByLineCommand();
    pasteCommand();

    // Verify that the cursor is in the right place (still before delta).
    var selection = window.getSelection();
    if (selection.baseNode.parentNode != document.getElementById("delta") ||
        selection.baseOffset != 0 || !selection.isCollapsed)
        throw "Wrong selection position on before paste.";

    // Paste with the cursor at the end of "delta".
    moveSelectionForwardByWordCommand();
    pasteCommand();

    // Verify that the cursor is in the right place (new list item after delta).
    var selection = window.getSelection();
    if (!selection.isCollapsed || selection.baseNode.value != "")
        throw "Wrong selection position on after paste.";
}

</script>
<body>
<div contentEditable="true">
<p>Copy/pasting list items in a list.  This test should be run with DRT for pasteboard access.</p>
<p id="results">FAIL</p>
<ul id="test">
    <li>alpha</li>
    <li>beta</li>
    <li>gamma</li>
    <li id="delta">delta</li>
</ul>
</div>

<script>
if (window.testRunner)
    testRunner.dumpAsText();

var elem = document.getElementById("test");
var selection = window.getSelection();
selection.setPosition(elem, 0);
editingTest();

// Rerun the test but have the source list be indented.
document.getElementById("test").innerHTML = "<li>alpha</li><ul><li>beta</li><li>gamma</li></ul><li id='delta'>delta</li>";
selection.setPosition(elem, 0);
editingTest();

document.getElementById("results").innerText = "PASS: " + document.getElementById("test").innerHTML;
</script>

</body>
</html>
