<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
</head>
<body>
<p id="description"></p>
<div id="console"></div>
<script>
description("Test to make sure we do not remove extra styling hidden on html styling elements (b, i, s, etc.) when removing those elements.")

var testContainer = document.createElement("div");
testContainer.contentEditable = true;
document.body.appendChild(testContainer);

function testSingleToggle(toggleCommand, initialContents, expectedContents)
{
    testContainer.innerHTML = initialContents;
    window.getSelection().selectAllChildren(testContainer);
    document.execCommand(toggleCommand, false, null);
    if (testContainer.innerHTML === expectedContents) {
        testPassed("one " + toggleCommand + " command converted " + initialContents + " to " + expectedContents);
    } else {
        testFailed("one " + toggleCommand + " command converted " + initialContents + " to " + testContainer.innerHTML + ", expected " + expectedContents);
    }
}

function testDoubleToggle(toggleCommand, initialContents, expectedContents)
{
    testContainer.innerHTML = initialContents;
    window.getSelection().selectAllChildren(testContainer);
    document.execCommand(toggleCommand, false, null);
    document.execCommand(toggleCommand, false, null);
    if (testContainer.innerHTML === expectedContents) {
        testPassed("two " + toggleCommand + " commands converted " + initialContents + " to " + expectedContents);
    } else {
        testFailed("two " + toggleCommand + " commands converted " + initialContents + " to " + testContainer.innerHTML + ", expected " + expectedContents);
    }
}

function testCommandAndUndo(command, contents)
{
    testContainer.innerHTML = contents;
    window.getSelection().selectAllChildren(testContainer);
    document.execCommand(command, false, null);
    document.execCommand("undo", false, null);
    if (testContainer.innerHTML === contents) {
        testPassed(command + " followed by undo, correctly return to " + contents);
    } else {
        testFailed(command + " followed by undo converted " + contents + " to " + testContainer.innerHTML);
    }
}

function testCommandAndUndoWithIntermediateFunction(command, initialContents, expectedContents, intermediateFunction)
{
    testContainer.innerHTML = initialContents;
    window.getSelection().selectAllChildren(testContainer);
    document.execCommand(command, false, null);
    intermediateFunction();
    document.execCommand("undo", false, null);
    if (testContainer.innerHTML === expectedContents) {
        testPassed(command + " followed by undo converted " + initialContents + " to " + expectedContents);
    } else {
        testFailed(command + " followed by undo converted " + initialContents + " to " + testContainer.innerHTML + ", expected " + expectedContents);
    }
}

// It would be nice to expect a <tag>test</tag> result for these, but that's unrealistic.
// The first pass removes the implied styling converting the rest to <span style="...">
// the second pass cannot be expected to convert an "existing" <span style="text-decoration: underline"> into <u>
testSingleToggle("bold", "<b style=\"text-decoration: underline\">test</b>", "<span style=\"text-decoration: underline\">test</span>");
testSingleToggle("italic", "<i style=\"font-weight: bold\">test</i>", "<span style=\"font-weight: bold\">test</span>");

// Make sure we correctly remove double-styled tags
testSingleToggle("bold", "<b style=\"font-weight: bold\">test</b>", "test");

// Make sure we don't remove extra stuff
testSingleToggle("bold", "<b foo=\"bar\">test</b>", "<span foo=\"bar\">test</span>");
testSingleToggle("bold", "<b style='invalid'>test</b>", "test"); // It's OK to remove invalid styles

// FIXME: We have to call undo here to prevent WebKit from trying to
// undo all of our previous commands at once.  We have no way to
// "clear the undo stack" in WebKit.
document.execCommand("undo", false, null);
// That filled testContainer with lots of junk, but it will be cleared
// when testCommandAndUndo is called.

testCommandAndUndo("bold", "<b style=\"text-decoration: underline\">test</b>");
testCommandAndUndo("italic", "<i style=\"font-weight: bold\">test</i>");

testCommandAndUndoWithIntermediateFunction(
    "bold",
    "<b style=\"text-decoration: underline\">test</b>",
    "<b style=\"text-decoration: underline\" foo=\"bar\">test</b>",
    function() {
        // Change the <span> before undoing it
        try {
            testContainer.firstChild.setAttribute("foo", "bar");
        } catch(e) {
            testFailed("Exception caught: " + e);
        }
});

testCommandAndUndoWithIntermediateFunction(
    "bold",
    "<b style=\"text-decoration: underline\">test</b>",
    "",
    function() {
        // remove the span, undo should fail
        testContainer.removeChild(testContainer.firstChild);
});

testCommandAndUndoWithIntermediateFunction(
    "bold",
    "<b style=\"text-decoration: underline\">test</b>",
    "<span>foobar</span>",
    function() {
        // replace the span with a new span, undo should fail
        testContainer.removeChild(testContainer.firstChild);
        testContainer.innerHTML = "<span>foobar</span>";
});

testCommandAndUndoWithIntermediateFunction(
    "bold",
    "<b style=\"text-decoration: underline\">test</b>",
    "<b style=\"text-decoration: underline\">foobar</b>",
    function() {
        // replace the span contents, undo should succeed
        testContainer.firstChild.innerHTML = "foobar";
});

document.body.removeChild(testContainer);

var successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
