<html>
<body>
<embed name="plg" type="application/x-webkit-test-netscape" test="url-redirect"></embed>
<div id="log">
    <div id="syncallowreason">Sync allow, reason shouldn't be NPRES_USER_BREAK...</div>
    <div id="syncallowurl">Sync allow, URL should be the final URL...</div>
    <div id="syncdenyreason">Sync deny, reason should be NPRES_USER_BREAK...</div>
    <div id="syncdenyurl">Sync deny, URL should be the previous URL...</div>
    <div id="asyncallowreason">Async allow, reason shouldn't be NPRES_USER_BREAK...</div>
    <div id="asyncallowurl">Async allow, URL should be the final URL...</div>
    <div id="asyncdenyreason">Async deny, reason should be NPRES_USER_BREAK...</div>
    <div id="asyncdenyurl">Async deny, URL should be the previous URL...</div>
    <div id="asyncmultiallowreason">Async multiple allow, reason shouldn't be NPRES_USER_BREAK...</div>
    <div id="asyncmultiallowurl">Async multiple allow, URL should be the final URL...</div>
    <div id="asyncmultidenyreason">Async multiple deny, reason should be NPRES_USER_BREAK...</div>
    <div id="asyncmultidenyurl">Async multiple deny, URL should be the previous URL...</div>
</div>
<script>
    function log(node, message)
    {
        text = document.getElementById(node);
        text.innerText += message;
    }
    function cleanup()
    {
        --testsRemaining;
        if (!testsRemaining) {
            clearInterval(timer);
            if (window.testRunner)
                testRunner.notifyDone();
        }
    }
    function notifyTrue(reason, url)
    {
        log("syncallowreason", reason != 2);
        log("syncallowurl", url == redirectURL);
        cleanup();
    }
    function notifyFalse(reason, url)
    {
        log("syncdenyreason", reason == 2);
        log("syncdenyurl", url == singleRedirect);
        cleanup();
    }
    function notifyTrueAsync(reason, url)
    {
        log("asyncallowreason", reason != 2);
        log("asyncallowurl", url == redirectURL);
        cleanup();
    }
    function notifyFalseAsync(reason, url)
    {
        log("asyncdenyreason", reason == 2);
        log("asyncdenyurl", url == singleRedirect);
        cleanup();
    }
    function notifyMultiTrueAsync(reason, url)
    {
        log("asyncmultiallowreason", reason != 2);
        log("asyncmultiallowurl", url == redirectURL);
        cleanup();
    }
    function notifyMultiFalseAsync(reason, url)
    {
        log("asyncmultidenyreason", reason == 2);
        log("asyncmultidenyurl", url == singleRedirect);
        cleanup();
    }

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

    var baseURL = "http://127.0.0.1:8000/resources/redirect.php";
    var redirectURL = "http://127.0.0.1:8000/dummy";
    var singleRedirect = baseURL + "?code=307&url=" + encodeURIComponent(redirectURL);
    var doubleRedirect = baseURL + "?code=307&url=" + encodeURIComponent(singleRedirect);
    var testsRemaining = 6;
    plg.get(singleRedirect, 1, "notifyTrue");
    plg.get(singleRedirect, 0, "notifyFalse");
    plg.getAsync(singleRedirect, 1, "notifyTrueAsync");
    plg.getAsync(singleRedirect, 0, "notifyFalseAsync");
    plg.getAsync(doubleRedirect, 2, "notifyMultiTrueAsync");
    plg.getAsync(doubleRedirect, 1, "notifyMultiFalseAsync");
    var timer = setInterval(function() { plg.serviceAsync() }, 10);
</script>
</body>
</html>
