blob: 5cf9403f4180bce233deb77a76bd6e0c2241aaae [file] [log] [blame]
levin@chromium.org0ea1cd82009-06-30 17:32:41 +00001<body>
2<p>Test that pages and workers can send MessagePorts to one another.
3Should print "DONE" when done.</p>
4<div id=result></div>
5<script>
6function log(message)
7{
8 document.getElementById("result").innerHTML += message + "<br>";
9}
10
rniwa@webkit.org224c8b52012-08-04 01:13:22 +000011if (window.testRunner) {
12 testRunner.dumpAsText();
13 testRunner.waitUntilDone();
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000014}
15
16var worker = new Worker("resources/worker-messageport.js");
17var channel = new MessageChannel();
18
19// Send messages with and without ports to the worker to make sure it gets them.
20worker.postMessage("noport");
21worker.onmessage = function(evt) {
22 log(evt.data);
atwilson@chromium.org271695b2009-09-03 18:36:10 +000023 worker.postMessage("port", [channel.port1]);
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000024 worker.onmessage = function(evt) {
25 log(evt.data);
26 }
27};
28
29// Send a message on the new port to make sure it gets to the worker.
30channel.port2.postMessage("ping");
31
32// Wait for the response.
33channel.port2.onmessage = function(evt) {
34 if (evt.data == "pong") {
35 log("PASS: Received response from Worker via MessagePort");
36 worker.onmessage = awaitPortFromWorker;
37 worker.postMessage("getport");
38 } else {
39 log("FAIL: Received unknown event: " + evt.data);
40 }
41}
42channel.port2.start();
43
44// Invoked once the first batch of tests are done, to test sending from the worker.
45function awaitPortFromWorker(evt)
46{
47 if (evt.data == "port") {
atwilson@chromium.org271695b2009-09-03 18:36:10 +000048 if (!evt.ports) {
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000049 log("FAIL: Did not get port from worker");
atwilson@chromium.org271695b2009-09-03 18:36:10 +000050 } else if (evt.ports.length != 1) {
51 log("FAIL: Got the wrong number of ports from worker: " + evt.ports.length);
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000052 } else {
53 log("PASS: Got port from worker");
cdumez@apple.comefa8d8e2016-06-08 22:14:55 +000054 try {
55 // Missing parameter, should throw.
56 evt.ports[0].postMessage();
57 log("FAIL: Calling MessagePort.postMessage() without parameter did not throw.");
58 } catch (e) {
59 log("PASS: Calling MessagePort.postMessage() without parameter threw exception: " + e);
60 }
atwilson@chromium.org271695b2009-09-03 18:36:10 +000061 evt.ports[0].postMessage("ping");
62 evt.ports[0].onmessage = function(evt) {
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000063 if (evt.data == "pong") {
64 log("PASS: Received final response from worker");
65 } else {
66 log("FAIL: Got unexpected response: " + evt.data);
67 }
68 startSpamTest();
69 }
atwilson@chromium.org271695b2009-09-03 18:36:10 +000070 evt.ports[0].start();
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000071 }
72 } else {
73 log(evt.data);
74 }
75}
76
77function startSpamTest()
78{
79 var channel = new MessageChannel();
80 worker.onmessage = function () { gotSpam(channel.port1); }
atwilson@chromium.org271695b2009-09-03 18:36:10 +000081 worker.postMessage("spam", [channel.port2]);
levin@chromium.org0ea1cd82009-06-30 17:32:41 +000082}
83
84function gotSpam(port)
85{
86 var spamCount = 0;
87 port.onmessage = function(evt) {
88 if (evt.data != spamCount)
89 log("FAIL: Got out of order message: " + spamCount);
90 spamCount++;
91 if (spamCount == 1000) {
92 log("PASS: Got 1000 messages");
93 done();
94 }
95 }
96}
97
98function done()
99{
100 log("DONE");
rniwa@webkit.org224c8b52012-08-04 01:13:22 +0000101 if (window.testRunner)
102 testRunner.notifyDone();
levin@chromium.org0ea1cd82009-06-30 17:32:41 +0000103}
104
105</script>
106</body>
107</html>