<script>
if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.dumpChildFramesAsText();
    testRunner.waitUntilDone();
}
var o = Object;
function finish()
{
    if (Object.getOwnPropertyDescriptor(this, "Object").value === o)
        document.getElementById("console").innerHTML += "PASS: cross-site assignment of Object constructor not allowed<br/>";
    else
        document.getElementById("console").innerHTML += "FAIL: cross-site assignment of Object constructor was allowed!<br/>";

    if (Object.getOwnPropertyDescriptor(this, "newProperty") === undefined)
        document.getElementById("console").innerHTML += "PASS: cross-site assignment of new property not allowed<br/>";
    else
        document.getElementById("console").innerHTML += "FAIL: cross-site assignment of new property was allowed!<br/>";

    if (location.hash.length == 0)
        document.getElementById("console").innerHTML += "PASS: cross-site assignment of location.hash not allowed<br/>";
    else
        document.getElementById("console").innerHTML += "FAIL: cross-site assignment of location.hash was allowed!<br/>";

    if (location.search.length == 0)
        document.getElementById("console").innerHTML += "PASS: cross-site assignment of location.search not allowed<br/>";
    else
        document.getElementById("console").innerHTML += "FAIL: cross-site assignment of location.search was allowed!<br/>";

    if (!("newProperty" in location))
        document.getElementById("console").innerHTML += "PASS: cross-site assignment of location.newProperty not allowed<br/>";
    else
        document.getElementById("console").innerHTML += "FAIL: cross-site assignment of location.newProperty was allowed!<br/>";

    if (location.reload != "hax0red")
        document.getElementById("console").innerHTML += "PASS: cross-site assignment of location.reload not allowed<br/>";
    else
        document.getElementById("console").innerHTML += "FAIL: cross-site assignment of location.reload was allowed!<br/>";

    if (window.testRunner)
        testRunner.notifyDone();
}
</script>

<body onload="finish()">
    <iframe width=70% height=300 src="http://localhost:8000/security/resources/xss-DENIED-defineProperty-attacker.html"></iframe>
<div id="console"></div>
</body>
</html>
