<html>
<head>
<script>
    var secretness = 0;

    function test() {
        if (window.testRunner) {
            testRunner.dumpAsText();
            testRunner.waitUntilDone();
        }

        var localScriptLocation = "file:///tmp/LayoutTests/http/tests/security/resources/localScript.js";
        if (window.testRunner)
            localScriptLocation = testRunner.pathToLocalResource(localScriptLocation);

        var localScriptElement = document.createElement("script");
        localScriptElement.setAttribute("src", localScriptLocation);
        localScriptElement.addEventListener("load", function() {
            var tag = document.getElementById("result");
            if (secretness == 13)
                tag.innerHTML = "Test Passed. Local script loaded and run.";
            else
                tag.innerHTML = "Test Failed. Local script loaded, but not successfully run.";

            if (window.testRunner)
                testRunner.notifyDone();
        });
        localScriptElement.addEventListener("error", function() {
            var tag = document.getElementById("result");
            tag.innerHTML = "Test Failed: Local script not loaded.";

            if (window.testRunner)
                testRunner.notifyDone();
        });

        document.body.appendChild(localScriptElement)
    }
</script>
</head>
<body onload="test()">
    <div id="div0">
        This test is to see if a local file can run a local script.
        <br/>
        Currently this test cannot be run manually on Windows because we do not have
        a function like pathToLocalResource() outside of DRT.
        <br/>
    </div>
    </br>
    <div id="result">
        Test not run correctly.
    </div>
</body>
</html>
