CONSOLE MESSAGE: line 48: Wrong focus offset: 5 instead of 4
CONSOLE MESSAGE: line 44: Wrong node selected.
CONSOLE MESSAGE: line 46: Wrong anchor offset: 8 instead of 0
CONSOLE MESSAGE: line 48: Wrong focus offset: 5 instead of 4
CONSOLE MESSAGE: line 41: Wrong end node type: [object HTMLBRElement]
CONSOLE MESSAGE: line 44: Wrong node selected.
| <html>
|   <head>
|   <body>
|     <p>
|       "This test tries to indent lines within pre tags.  This test passes if it
does not crash."
|     "
"
|     <div>
|       contenteditable=""
|       "
"
|       <blockquote>
|         style="margin: 0 0 0 40px; border: none; padding: 0px;"
|         <pre>
|           id="pre-basic"
|           "line one"
|       <pre>
|         id="pre-basic"
|         "line two
"
|       <blockquote>
|         style="margin: 0 0 0 40px; border: none; padding: 0px;"
|         <pre>
|           "line three"
|         <pre>
|           "line four"
|       "

"
|       <ul>
|         <li>
|           <pre>
|             id="pre-list"
|             "list one
"
|             <blockquote>
|               style="margin: 0 0 0 40px; border: none; padding: 0px;"
|               "list two"
|               <br>
|               "list three"
|             "list four
"
|       "

"
|       <table>
|         "
"
|         <tbody>
|           <tr>
|             <td>
|               <pre>
|                 id="pre-table"
|                 "table one<#selection-anchor>
"
|               <blockquote>
|                 style="margin: 0 0 0 40px; border: none; padding: 0px;"
|                 <pre>
|                   "table two"
|                 <pre>
|                   "table three<#selection-focus>"
|             <td>
|               "right cell"
|       "

"
|       <div>
|         id="results"
|         "PASSED (did not crash)"
|       "
"
|     "

"
|     <a>
|       href="javascript:document.execCommand('indent')"
|       "indent"
|     "
"
|     <a>
|       href="javascript:document.execCommand('outdent')"
|       "outdent"
|     "
"
|     <script>
|       src="../../resources/dump-as-markup.js"
|     "
"
|     <script>
|       src="../editing.js"
|     "
"
|     <script>
|       "
function setSelection(node)
{
    var textNode = node.firstChild;
    if (textNode.nodeType != Node.TEXT_NODE)
        throw "Wrong node type: " + textNode;
    execSetSelectionCommand(textNode, 0, textNode);
}

function verifyTextSelection(startNode, startOffset, endNode, endOffset)
{
    if (startNode.nodeType != Node.TEXT_NODE)
        console.log("Wrong start node type: " + startNode);
    if (endNode.nodeType != Node.TEXT_NODE)
        console.log("Wrong end node type: " + endNode);
    var sel = window.getSelection();
    if (sel.anchorNode != startNode || sel.focusNode != endNode)
        console.log("Wrong node selected.");
    if (sel.anchorOffset != startOffset)
        console.log("Wrong anchor offset: " + sel.anchorOffset + " instead of " + startOffset);
    if (sel.focusOffset != endOffset)
        console.log("Wrong focus offset: " + sel.focusOffset + " instead of " + endOffset);
}

// Indent a single line in a pre and make sure the selection is correctly preserved.
var pre = document.getElementById("pre-basic");
setSelection(pre);
execMoveSelectionForwardByCharacterCommand();
execExtendSelectionForwardByWordCommand();
document.execCommand("indent");
verifyTextSelection(document.getElementsByTagName("pre")[0].firstChild, 1,
                    document.getElementsByTagName("pre")[0].firstChild, 4);

// Indent 2 lines.
setSelection(pre);
execMoveSelectionForwardByLineCommand();
execExtendSelectionForwardByLineCommand();
execExtendSelectionForwardByWordCommand();
document.execCommand("indent");
if (document.getElementsByTagName("pre").length > 3) {
    // FIXME: The selection for the anchorNode is wrong.  It should stay at
    // the beginning of "line three", but it moves to the end of "line 2".
    verifyTextSelection(document.getElementsByTagName("pre")[2].firstChild, 0,
                        document.getElementsByTagName("pre")[3].firstChild, 4);
} else {
    console.log("Wrong number of pre nodes.");
}

// Indent <pre> lines in a list.
pre = document.getElementById("pre-list");
setSelection(pre);
execMoveSelectionForwardByLineCommand();
execExtendSelectionForwardByLineCommand();
execExtendSelectionForwardByLineCommand();
document.execCommand("indent");
verifyTextSelection(document.getElementsByTagName("blockquote")[2].firstChild, 0,
                    document.getElementsByTagName("blockquote")[2].firstChild.nextSibling, 10);
// Indenting <pre> lines in a table.
pre = document.getElementById("pre-table");
setSelection(pre);
execMoveSelectionForwardByLineCommand();
execExtendSelectionForwardByLineCommand();
execExtendSelectionForwardByLineCommand();
// FIXME: This is wrong.  The pre tags get copied when they shouldn't be. 
// See https://bugs.webkit.org/show_bug.cgi?id=42009
document.execCommand("indent");
document.getElementById("results").innerText = "PASSED (did not crash)";
"
|     "
"
