<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Test for setting document.location.host to accepted values</title>
</head>
<body>
<pre id="pre"></pre>
<script>
    // This function will be redefined as the test cases get executed
    var testCaseOnload = function() {
        runOneTestThatShouldBeAccepted(0);
    };

    var iframeDocument;
    function iframeOnload() {
        iframeDocument = document.getElementById("targetFrame").contentDocument;
        testCaseOnload();
    }

    function log(s) {
        document.getElementById("pre").appendChild(document.createTextNode(s));
    }

    function runOneTestThatShouldBeAccepted(testIndex) {
        var testCasesThatShouldBeAccepted = [
            { hostString : 'localhost:8000', description : false }
            ,{ hostString : '127.0.0.1:8000', description : false }
        ];

        if (testIndex >= testCasesThatShouldBeAccepted.length) {
            if (window.testRunner)
                testRunner.notifyDone();
        } else {
            // Prepare for next test case by setting testCaseOnload to load the test case
            // and then load the simple HTML file that says "Before"
            testCaseOnload = function () {

                // Prepare test case execution by first setting testCaseOnload to check
                // the test outcome and then load set the iframe's document.location.host
                testCaseOnload = function(currentTestIndex) {
                    return function () {
                        var currentCase = testCasesThatShouldBeAccepted[currentTestIndex],
                                description = (currentCase.description ? currentCase.description : currentCase.hostString);
                        if (iframeDocument === null || iframeDocument.location.host == currentCase.hostString) {
                            log("PASS: " + description + " was accepted" + (iframeDocument === null ? " (at least the iframe contentDocument was null so it had changed origin)" : "") + ".\n");
                        } else {
                            log("FAIL: " + description + " was not accepted. The iframe contentDocument was not null and its location.host was not " + currentCase.hostString + ".\n");
                        }
                        runOneTestThatShouldBeAccepted(currentTestIndex + 1);
                    };
                }(testIndex);

                iframeDocument.location.host = testCasesThatShouldBeAccepted[testIndex].hostString;
            };

            document.getElementById("targetFrame").setAttribute("src", "http://127.0.0.1:8000/dom/resources/set-document-location-iframe.html");
        }
    }

    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
</script>
<iframe id="targetFrame" src="resources/set-document-location-iframe.html" onload="iframeOnload()"></iframe>
</body>
</html>