<html>
<head>
<script>
function print(message, color) 
{
    var paragraph = document.createElement("div");
    paragraph.appendChild(document.createTextNode(message));
    paragraph.style.fontFamily = "monospace";
    if (color)
        paragraph.style.color = color;
    document.getElementById("console").appendChild(paragraph);
}

function shouldBe(a, b)
{
    var evalA;
    try {
        evalA = eval(a);
    } catch(e) {
        evalA = e;
    }
    
    if (evalA == b)
        print("PASS: " + a + " should be " + b + " and is.", "green");
    else
        print("FAIL: " + a + " should be " + b + " but instead is " + evalA + ".", "red");
}

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

    shouldBe("Object.prototype.isPrototypeOf(window.DOMException)", true);
    shouldBe("Object.prototype.isPrototypeOf(window.Option)", true);

    div = document.createElement('div');
    div.style.color = "black";
    cssValue = div.style.getPropertyCSSValue('color'); // actually a CSSPrimitiveValue
    shouldBe("Object.prototype.isPrototypeOf(cssValue)", true);
    
    rgbColor = div.style.getPropertyCSSValue('color').getRGBColorValue();
    shouldBe("Object.prototype.isPrototypeOf(rgbColor)", true);

    div.style.clip = "rect(0, 0, 0, 0)";
    rect = div.style.getPropertyCSSValue('clip').getRectValue();
    shouldBe("Object.prototype.isPrototypeOf(rect)", true);

    styleElement = document.createElement('style');
    styleElement.appendChild(document.createTextNode("* {}"));
    headElement = document.getElementsByTagName('head')[0];
    headElement.appendChild(styleElement);
    styleSheetList = document.styleSheets;
    shouldBe("Object.prototype.isPrototypeOf(styleSheetList)", true);

    styleSheet = styleSheetList[0];
    shouldBe("Object.prototype.isPrototypeOf(styleSheet)", true);

    cssRule = styleSheet.cssRules[0];
    shouldBe("Object.prototype.isPrototypeOf(cssRule)", true);

    nodeList = document.getElementsByTagName('html');
    shouldBe("Object.prototype.isPrototypeOf(nodeList)", true);

    var form = document.createElement('form');
    form.name = 'myForm';
    document.body.appendChild(form);
    document.body.appendChild(form.cloneNode(true));
    namedNodesCollection = document.forms.myForm;
    shouldBe("Object.prototype.isPrototypeOf(namedNodesCollection)", true);
}
</script>
</head>

<body onload="test();">
<p>This test checks some DOM object prototypes that WebKit has gotten wrong in the past.
   If the test passes, you'll see a series of 'PASS' messages below.</p>
<hr>

<div id='console'></div>

</body>
</html>
