<html>
<head>
<script src=../../editing.js language="javascript" type="text/javascript"></script>
<script src="../../../resources/js-test-pre.js"></script>
<script>

function editingTest() {
    edit = document.getElementById('edit');
    edit.focus();
    typeCharacterCommand('i');
    typeCharacterCommand('t');
    typeCharacterCommand('\'');
    typeCharacterCommand('s');
    typeCharacterCommand(' ');
    typeCharacterCommand('a');
    typeCharacterCommand(' ');
    typeCharacterCommand('m');
    typeCharacterCommand('e');
    typeCharacterCommand('s');
    typeCharacterCommand('a');
    typeCharacterCommand('g');
    typeCharacterCommand('e');
    typeCharacterCommand(' ');
    var s = window.getSelection();
    s.setBaseAndExtent(edit.firstChild, 6, edit.firstChild, 6);
    execForwardDeleteCommand();

    if (window.testRunner) {
        testRunner.dumpAsText(true);
        textNode = edit.firstChild;
        shouldBe("markerRange = internals.markerRangeForNode(textNode, 'replacement', 0); markerRange.startContainer", "textNode");
        shouldBe("markerRange.toString()", "'message'");
        shouldBe("markerRange.endContainer", "textNode");
        shouldBe("markerRange.startOffset", "textNode.textContent.indexOf(markerRange.toString())");
        shouldBe("markerRange.endOffset", "markerRange.startOffset + markerRange.toString().length");
        shouldBeNull("internals.markerRangeForNode(textNode, 'replacement', 1)");

        shouldBe("markerRange = internals.markerRangeForNode(textNode, 'spelling', 0); markerRange.startContainer", "textNode");
        shouldBe("markerRange.toString()", "'amessage'");
        shouldBe("markerRange.endContainer", "textNode");
        shouldBe("markerRange.startOffset", "textNode.textContent.indexOf(markerRange.toString())");
        shouldBe("markerRange.endOffset", "markerRange.startOffset + markerRange.toString().length");
        shouldBeNull("internals.markerRangeForNode(textNode, 'spelling', 1)");

        shouldBe("markerRange = internals.markerRangeForNode(textNode, 'autocorrected', 0); markerRange.startContainer", "textNode");
        shouldBe("markerRange.toString()", "'message'");
        shouldBe("markerRange.endContainer", "textNode");
        shouldBe("markerRange.startOffset", "textNode.textContent.indexOf(markerRange.toString())");
        shouldBe("markerRange.endOffset", "markerRange.startOffset + markerRange.toString().length");
        shouldBeNull("internals.markerRangeForNode(textNode, 'autocorrected', 1)");
    }
}

</script>
<title>Testing forward deleting into autocorrected word</title> 
</head> 
<body>
<p>You should see phrase "it's amessage", in which the word 
'message' doesn't have blue underline.</p>
<p  style="color:green">Note, this test can fail due to user specific spell checking data. 
If the user has previously dismissed 'message' as the correct spelling of 'mesage' several times, 
the spell checker will not provide 'message' as a suggestion anymore. To fix this,
remove all files in ~/Library/Spelling.</p>
<div contenteditable="true" id="edit"/>
<script language="javascript" type="text/javascript">
runEditingTest();
</script>
<script src="../../../resources/js-test-post.js"></script>
</body>
</html>
