<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>