<!DOCTYPE html>
<html>
<head>
    <script src="resources/WindowProperties.js"></script>
    <script>
        if (window.layoutTestController)
            layoutTestController.dumpAsText();

        function log(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)
                log("PASS: " + a + " should be " + b + " and is.", "green");
            else
                log("FAIL: " + a + " should be " + b + " but instead is " + evalA, "red");
        }

        function testFunction(functionName)
        {
            var iframe = document.createElement('iframe');
            iframe.src = "about:blank";
            iframe.name = functionName;
            document.body.appendChild(iframe);

            shouldBe("typeof window." + functionName, "object");

            document.body.removeChild(iframe);
        }

        function runTests()
        {
            for (var func in windowFunctions) {
                testFunction(windowFunctions[func])
            }

            window.myFunction = function() { return "myFunction"; }
            testFunction("myFunction");
            window.__proto__.myPrototypeFunction = function() { return "myPrototypeFunction"; }
            testFunction("myPrototypeFunction");
        }
    </script>
</head>
<body onload="runTests();">
    <p>This tests that a frame with a the same name as function on the window object, has precedence in the lookup.</p>
    <pre id="console"></pre>
</body>
</html>
