<html>
<head>
<script>
function log(message)
{
    var item = document.createElement("li");
    item.appendChild(document.createTextNode(message));
    document.getElementById("console").appendChild(item);
}
function setInitialStyleForE()
{
    var e = document.getElementById('e');

    e.style.top = "0px";
    e.style.bottom = "";
    e.style.display = "none";
    e.style.bottom = "1px";
}
function test()
{
    if (window.layoutTestController)
        layoutTestController.dumpAsText();

    var e = document.getElementById('e');

    setInitialStyleForE();
    try {
        e.style.display = "block";
        log("Successfully set display to \"block\"; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to \"block\"; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.display = "foobar";
        log("Successfully set display to \"foobar\"; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to \"foobar\"; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.display = "";
        log("Successfully set display to \"\"; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to \"\"; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.display = null;
        log("Successfully set display to null; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to null; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.setProperty("display", "block", "");
        log("Successfully set display to \"block\" with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to \"block\" with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.setProperty("display", "foobar", "");
        log("Successfully set display to \"foobar\" with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to \"foobar\" with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.setProperty("display", "", "");
        log("Successfully set display to \"\" with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to \"\" with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    }

    setInitialStyleForE();
    try {
        e.style.setProperty("display", null, "");
        log("Successfully set display to null with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    } catch (exception) {
        log("Got exception trying to set display to null with setProperty; cssText is now: \"" + e.style.cssText + "\".");
    }
}
</script>
</head>
<body onload="test();">
<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=7296">bug 7296</a>.</p>
<p>This test checks to see whether you get exceptions when setting a property with a "bad value".
Setting using JavaScript property syntax and with setProperty() should behave the same.</p>
<P>It is OK if the order of properties changes from the expected results - IE 6 and Firefox 2 don't agree on it anyway.</p>
<hr>
<p id="e">This is the test element.</p>
<hr>
<ol id="console"></ol>
</body>
</html>
