<html>
<body>
<p>Test that EventSource cross-origin requests with credentials fail until the correct CORS headers are sent. Should print a series of PASS messages followed by DONE.</p>
<div id="result"></div>
<script>
function log(msg) {
    document.getElementById("result").innerHTML += msg + "<br>";
}

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

function end() {
    if (window.testRunner)
        testRunner.notifyDone();
}

var count = 1;
var base_url = location.href.substr(0, location.href.lastIndexOf('/')).replace("127.0.0.1", "localhost");

function create_es() {
    try {
        var es = new EventSource(base_url + "/resources/es-cors-credentials.php?count=" + count, {"withCredentials": true});
    }
    catch (ex) {
        log("FAIL: EventSource constructor threw exception: " + ex);
        end();
        return;
    }

    if (!es.withCredentials) {
        log("FAIL: withCredentials is false");
        es.close();
        end();
    }

    es.onerror = function () {
        if (es.readyState == es.CLOSED) {
            if (count != 4 && count != 5) {
                log("PASS: got error event and readyState is CLOSED");
                count++;
                setTimeout(create_es);
            }
            else {
                log("FAIL: got unexpected error event");
                end();
            }
        }
        else if (count != 5)  {
            log("FAIL: got error event but readyState is not CLOSED");
            es.close();
            end();
        }
    };

    es.onmessage = function (evt) {
        if (evt.origin != location.origin && !evt.origin.indexOf("http://localhost")) {
            if (count == 4 && evt.data == "DATA1" && evt.lastEventId == "77") {
                log("PASS: got cross-origin message event with data \"DATA1\" and lastEventId \"77\"");
                count++;
                return;
            }
            if (count == 5 && evt.data == "DATA2") {
                log("PASS: got cross-origin message event with data \"DATA2\"");
                log("DONE");
            }
            else
                log("FAIL: got unexpected cross-origin message event");
        }
        else
            log("FAIL: got message event from same or unexpected origin");

        es.close();
        end();
    };
}
create_es();
</script>
</body>
</html>
