<html>
<head>
<style>
.failed {
    color: red;
    font-weight: bold;
}

.passed {
    color: green;
    font-weight: bold;
}
</style>
<script>
if (window.testRunner)
    window.testRunner.dumpAsText();
var count = 0;

function shouldThrowException(node)
{
    document.body.appendChild(document.createElement("br"));
    var header = document.createElement("div");
    header.textContent = ++count + ". Verifying XMLSerializer.serializeToString() should THROW exception with node value = " + node;
    document.body.appendChild(header);

    var xs = new XMLSerializer();
    try {
        var str = xs.serializeToString(node);

        var result = document.createElement("div");
        result.className = "failed"
        result.textContent = "FAIL";
        document.body.appendChild(result);
    } catch (exception) {
        var err = "Exception thrown = [" + exception.name + ": " + exception.message + "]";
        var content = document.createElement("div");
        content.textContent = err;
        document.body.appendChild(content);

        var result = document.createElement("div");
        result.className = "passed"
        result.textContent = "PASS";
        document.body.appendChild(result);
    }
}

function shouldNOTThrowException(node)
{
    document.body.appendChild(document.createElement("br"));
    var header = document.createElement("div");
    header.textContent = ++count + ". Verifying XMLSerializer.serializeToString() should NOT-THROW exception with node value = " + node;
    document.body.appendChild(header);

    var xs = new XMLSerializer();
    try {
        var str = xs.serializeToString(node);

        var result = document.createElement("div");
        result.className = "passed"
        result.textContent = "PASS";
        document.body.appendChild(result);
    } catch (exception) {
        var err = "Exception thrown = [" + exception.name + ": " + exception.message + "]";
        var content = document.createElement("div");
        content.textContent = err;
        document.body.appendChild(content);

        var result = document.createElement("div");
        result.className = "failed"
        result.textContent = "FAIL";
        document.body.appendChild(result);
    }
}

function runTest()
{
    shouldThrowException(null);
    shouldThrowException(undefined);
    shouldThrowException("<html><title>Hello World</title></html>");
    shouldThrowException(document.children);

    shouldNOTThrowException(document);
    shouldNOTThrowException(document.documentElement);
    shouldNOTThrowException(document.firstChild);
    shouldNOTThrowException(document.createElement("div"));
    shouldNOTThrowException(document.getElementById("heading"));
    shouldNOTThrowException(document.createElement("custom"));

    var domParser = new DOMParser();

    var htmlDoc = domParser.parseFromString("<html/>", "text/html");
    shouldNOTThrowException(htmlDoc);
    shouldNOTThrowException(htmlDoc.firstChild);

    var xmlDoc = domParser.parseFromString("<root/>", "text/xml");
    shouldNOTThrowException(xmlDoc);
    shouldNOTThrowException(xmlDoc.lastChild);
}
</script>
</head>
<body onload="runTest();">
This tests XMLSerializer.serializeToString() throwing exception when node value is invalid and passing otherwise.
<h1 id="heading"/>
</body>
</html>