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