<html>

<head>

<script>

var modified;
var oldElement;
var oldContent;
var failureCount = 0;

function setModifiedFlag()
{
    modified = true;
}

function print(message)
{
    var div = document.createElement("div");
    div.appendChild(document.createTextNode(message));
    document.getElementById("results").appendChild(div);
}

function summarizeResult()
{
    if (!modified)
        return "not modified";
    var parent = document.getElementById("parent");
    if (parent.firstChild !== oldElement)
        return "replaced";
    if (oldElement.firstChild !== oldContent)
        return "modified";
    return "modified, with same first child";
}

function runTest(markup, propertyName, newValue, expectedResult)
{
    var parent = document.getElementById("parent");
    parent.innerHTML = "<div>" + markup + "</div>";
    modified = false;
    oldElement = parent.firstChild;
    oldContent = parent.firstChild.firstChild;
    parent.firstChild[propertyName] = newValue;
    var resultValue;
    if (propertyName == "outerHTML")
        resultValue = parent.innerHTML;
    else
        resultValue = parent.firstChild[propertyName];
    var result = resultValue == newValue ? summarizeResult() : "modified incorrectly";
    if (propertyName == "outerHTML")
        markup = "<div>" + markup + "</div>";
    testName = 'starting with "' + markup + '", setting ' + propertyName + ' to "' + newValue + '"';
    if (result == expectedResult)
        print("PASS: " + testName);
    else {
        print("FAIL: " + testName + " -- " + result + ", but expected " + expectedResult);
        ++failureCount;
    }
    if (result == "modified incorrectly")
        print("value was " + resultValue);
}

function test()
{
    if (window.layoutTestController)
        layoutTestController.dumpAsText();

    var parent = document.getElementById("parent");
    parent.addEventListener("DOMSubtreeModified", setModifiedFlag, true);

    runTest('', 'innerHTML', '', 'not modified');
    runTest('', 'innerHTML', 'text', 'modified');
    runTest('', 'innerHTML', '<a></a>', 'modified');
    runTest('', 'innerHTML', '<a></a><b></b>', 'modified');

    runTest('text', 'innerHTML', '', 'modified');
    runTest('text', 'innerHTML', 'different text', 'modified, with same first child');
    runTest('text', 'innerHTML', 'text', 'not modified');
    runTest('text', 'innerHTML', '<a></a>', 'modified');
    runTest('text', 'innerHTML', '<a></a><b></b>', 'modified');

    runTest('<a></a>', 'innerHTML', '', 'modified');
    runTest('<a></a>', 'innerHTML', 'text', 'modified');
    runTest('<a></a>', 'innerHTML', '<a></a>', 'modified');
    runTest('<a></a>', 'innerHTML', '<a href=""></a>', 'modified');
    runTest('<a></a>', 'innerHTML', '<a>text</a>', 'modified');
    runTest('<a></a>', 'innerHTML', '<a></a><b></b>', 'modified');

    runTest('<a>text</a>', 'innerHTML', '<a>text</a>', 'modified');
    runTest('<a>text</a>', 'innerHTML', '<a>different text</a>', 'modified');

    runTest('<a href="b"></a>', 'innerHTML', '<a name="c" href="b"></a>', 'modified');
    runTest('<a href="b" name="c"></a>', 'innerHTML', '<a href="b" name="c"></a>', 'modified');
    runTest('<a href="b" name="c"></a>', 'innerHTML', '<a name="c" href="b"></a>', 'modified');

    runTest('', 'innerText', '', 'not modified');
    runTest('', 'innerText', 'text', 'modified');
    runTest('', 'innerText', '<a></a>', 'modified');
    runTest('', 'innerText', '<a></a><b></b>', 'modified');

    runTest('text', 'innerText', '', 'modified');
    runTest('text', 'innerText', 'different text', 'modified, with same first child');
    runTest('text', 'innerText', 'text', 'not modified');

    runTest('<a></a>', 'innerText', '', 'modified');
    runTest('<a></a>', 'innerText', 'text', 'modified');

    runTest('', 'outerHTML', '', 'replaced');
    runTest('', 'outerHTML', 'text', 'replaced');
    runTest('', 'outerHTML', '<a></a>', 'replaced');
    runTest('', 'outerHTML', '<a></a><b></b>', 'replaced');
    runTest('', 'outerHTML', '<div></div>', 'replaced');
    runTest('', 'outerHTML', '<div>text</div>', 'replaced');
    runTest('', 'outerHTML', '<div><a></a></div>', 'replaced');
    runTest('', 'outerHTML', '<div><a></a><b></b></div>', 'replaced');

    runTest('text', 'outerHTML', '', 'replaced');
    runTest('text', 'outerHTML', 'text', 'replaced');
    runTest('text', 'outerHTML', '<a></a>', 'replaced');
    runTest('text', 'outerHTML', '<a></a><b></b>', 'replaced');
    runTest('text', 'outerHTML', '<div></div>', 'replaced');
    runTest('text', 'outerHTML', '<div>text</div>', 'replaced');
    runTest('text', 'outerHTML', '<div>different text</div>', 'replaced');
    runTest('text', 'outerHTML', '<div><a></a></div>', 'replaced');
    runTest('text', 'outerHTML', '<div><a></a><b></b></div>', 'replaced');

    runTest('<a></a>', 'outerHTML', '', 'replaced');
    runTest('<a></a>', 'outerHTML', 'text', 'replaced');
    runTest('<a></a>', 'outerHTML', '<a></a>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<a href=""></a>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<a>text</a>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<a></a><b></b>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<div></div>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<div>text</div>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<div>different text</div>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<div><a></a></div>', 'replaced');
    runTest('<a></a>', 'outerHTML', '<div><a></a><b></b></div>', 'replaced');

    runTest('<a>text</a>', 'outerHTML', '<div><a>text</a></div>', 'replaced');
    runTest('<a>text</a>', 'outerHTML', '<div><a>different text</a></div>', 'replaced');

    runTest('<a href="b"></a>', 'outerHTML', '<div><a name="c" href="b"></a></div>', 'replaced');
    runTest('<a href="b" name="c"></a>', 'outerHTML', '<div><a href="b" name="c"></a></div>', 'replaced');
    runTest('<a href="b" name="c"></a>', 'outerHTML', '<div><a name="c" href="b"></a></div>', 'replaced');

    parent.outerHTML = "";

    if (failureCount == 0)
        print("ALL TESTS PASSED");
    else
        print(failureCount + " TESTS FAILED");
}

</script>

</head>

<body onload="test()">

<p>
    This tests calls to setInnerHTML, setInnerText, and setOuterHTML to see what kind of DOM modifications they cause.
    The calls are optimized to not do any work in cases where the DOM would not change at all.
</p>

<p id="results"></p>

<div id="parent"></div>

</body>

</html>
