<body>
<p>Test cross-frame MessagePort communication.</p>
<p>Should be a series of SUCCESS messages, followed with DONE.</p>
<pre id=log></pre>
<script>
function log(message)
{
    document.getElementById("log").innerHTML += message + "<br>";
}

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

var mainPort;

var allTests;
var currentTest = 0;

function nextTest() 
{
    var fun = "postMessage";
    var testFunNo = Math.floor(currentTest / 2);
    if (testFunNo < allTests.length)
    {
        var test = allTests[testFunNo];
        currentTest++;
        test(fun);
    }
    else
    {
        done();
    }
}

function test(postMessageFun)
{
    var channel = new MessageChannel;

    window.frames[0][postMessageFun]("msg", [channel.port2], "*");
    mainPort = channel.port1;
    mainPort[postMessageFun]("ping");
    mainPort.onmessage = function(evt) {
        if (evt.data == "pong" && evt.origin == "")
            log("Simple exchange: SUCCESS");
        else
            log("Simple exchange: FAIL. Got message '" + evt.data + "' from '" + evt.origin + "'.");
        nextTest();
    };
}

function test2(postMessageFun)
{
    var channel = new MessageChannel;
    mainPort[postMessageFun]("newPort", [channel.port2]);
    channel.port1.onmessage = function(evt) {
        if (evt.data == "yo" && evt.origin == "")
            log("Posted port: SUCCESS");
        else
            log("Posted port: FAIL. Got message '" + evt.data + "' from '" + evt.origin + "'.");
        nextTest();
    };
}

function test3(postMessageFun)
{
    var channel = new MessageChannel;
    channel.port1[postMessageFun]("1");
    var started = false;
    channel.port2.addEventListener("message", function(evt) {
        if (started) {
            log("Event Listener: SUCCESS");
            nextTest();
        } else
            log("Event Listener: FAIL. Event listener called before start()");
   });
   setTimeout(function() {
      channel.port2.start();
      started = true;
   }, 100);

}

function test4(postMessageFun)
{
    var channel = new MessageChannel;
    channel.port1[postMessageFun]("1");
    channel.port1.close();
    channel.port1[postMessageFun]("2");
    channel.port2.onmessage = function(evt) {
        if (evt.data == "1") {
            log("Closed port: SUCCESS");
            nextTest();
        } else
            log("Closed port: FAIL. Got message: " + evt.data + " after close");
   }
}

function test5(postMessageFun)
{
    // Create a channel and put some messages in it which will go undelivered and should not leak
    var channel = new MessageChannel;
    channel.port1[postMessageFun]("abcde");
    nextTest();
}

function test6(postMessageFun)
{
    var channel = new MessageChannel;
    channel.port1[postMessageFun]("howdy");
    channel.port2.onmessage = function(event) {
        log("MessageEvent.cancelable defaults to " + event.cancelable + ": " + (event.cancelable ? "FAIL" : "PASS"));
        nextTest();
    }
}

function done() {
    // Wait a short period of time to ensure no messages come in from previous tests.
    setTimeout(function() {
        log("DONE");
        if (window.testRunner)
            testRunner.notifyDone();
    }, 100);
}

allTests = [ test, test2, test3, test4, test5, test6 ]

</script>
<iframe src="resources/message-port-iframe.html" onload="nextTest()"></iframe>
</body>
