<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.testRunner)
        testRunner.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>
