<html>
<body>
<p>Test that basic EventSource cross-origin requests fail until they are allowed by the Access-Control-Allow-Origin header. 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-basic.php?count=" + count);
    }
    catch (ex) {
        log("FAIL: EventSource constructor threw exception: " + ex);
        end();
        return;
    }

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

    es.onerror = function () {
        if (es.readyState == es.CLOSED) {
            if (count != 3 && count != 4) {
                log("PASS: got error event and readyState is CLOSED");
                count++;
                setTimeout(create_es);
            }
            else {
                log("FAIL: got unexpected error event");
                end();
            }
        }
        else if (count != 4)  {
            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 == 3 && evt.data == "DATA1" && evt.lastEventId == "77") {
                log("PASS: got cross-origin message event with data \"DATA1\" and lastEventId \"77\"");
                count++;
                return;
            }
            if (count == 4 && 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>
