1 if (window.layoutTestController) {
2 layoutTestController.dumpAsText();
3 layoutTestController.waitUntilDone();
6 description("This test checks the various use cases around sending multiple ports through MessagePort.postMessage");
8 var channel = new MessageChannel();
9 var channel2 = new MessageChannel();
10 var channel3 = new MessageChannel();
11 var channel4 = new MessageChannel();
13 channel.port1.postMessage("noport");
14 channel.port1.postMessage("zero ports", []);
15 channel.port1.postMessage("two ports", [channel2.port1, channel2.port2]);
17 // Now test various failure cases
18 shouldThrow('channel.port1.postMessage("same port", [channel.port1])');
19 shouldThrow('channel.port1.postMessage("entangled port", [channel.port2])');
20 shouldThrow('channel.port1.postMessage("null port", [channel3.port1, null, channel3.port2])');
21 shouldThrow('channel.port1.postMessage("notAPort", [channel3.port1, {}, channel3.port2])');
22 // Should be OK to send channel3.port1 (should not have been disentangled by the previous failed calls).
23 channel.port1.postMessage("entangled ports", [channel3.port1, channel3.port2]);
25 shouldThrow('channel.port1.postMessage("notAnArray", channel3.port1)')
26 shouldThrow('channel.port1.postMessage("notASequence", [{length: 3}])');
28 // Should not crash (we should figure out that the array contains undefined
30 var largePortArray = [];
31 largePortArray[1234567890] = channel4.port1;
32 shouldThrow('channel.port1.postMessage("largeSequence", largePortArray)');
34 channel.port1.postMessage("done");
36 function testTransfers() {
37 var channel0 = new MessageChannel();
39 var c1 = new MessageChannel();
40 channel0.port1.webkitPostMessage({id:"send-port", port:c1.port1}, [c1.port1]);
41 var c2 = new MessageChannel();
42 channel0.port1.webkitPostMessage({id:"send-port-twice", port0:c2.port1, port1:c2.port1}, [c2.port1]);
43 var c3 = new MessageChannel();
44 channel0.port1.webkitPostMessage({id:"send-two-ports", port0:c3.port1, port1:c3.port2}, [c3.port1, c3.port2]);
45 var c4 = new MessageChannel();
47 channel0.port1.webkitPostMessage({id:"host-object", hostObject:c3, port:c4.port1}, [c4.port1]);
48 testFailed("Sending host object should throw");
50 testPassed("Sending host object has thrown " + e);
52 c4.port1.postMessage("Should succeed");
53 channel0.port1.webkitPostMessage({id:"done"});
55 channel0.port2.onmessage = function(event) {
56 if (event.data.id == "send-port") {
57 if (event.ports && event.ports.length > 0 && event.ports[0] === event.data.port)
58 testPassed("send-port: transferred one port");
60 testFailed("send-port: port transfer failed");
61 } else if (event.data.id == "send-port-twice") {
62 if (event.ports && event.ports.length == 1 &&
63 event.ports[0] === event.data.port0 && event.ports[0] === event.data.port1)
64 testPassed("send-port-twice: transferred one port twice");
66 testFailed("send-port-twice: failed to transfer one port twice");
67 } else if (event.data.id == "send-two-ports") {
68 if (event.ports && event.ports.length == 2 &&
69 event.ports[0] === event.data.port0 && event.ports[1] === event.data.port1)
70 testPassed("send-two-ports: transferred two ports");
72 testFailed("send-two-ports: failed to transfer two ports");
73 } else if (event.data.id == "done") {
74 debug('<br><span class="pass">TEST COMPLETE</span>');
75 if (window.layoutTestController)
76 layoutTestController.notifyDone();
78 testFailed("Unexpected message " + event.data);
83 channel.port2.onmessage = function(event) {
84 if (event.data == "noport") {
85 if (event.ports && !event.ports.length)
86 testPassed("event.ports is non-null and zero length when no port sent");
88 testFailed("event.ports is null or non-zero length when no port sent");
89 } else if (event.data == "zero ports") {
90 if (event.ports && !event.ports.length)
91 testPassed("event.ports is non-null and zero length when empty array sent");
93 testFailed("event.ports is null or non-zero length when empty array sent");
94 } else if (event.data == "two ports") {
96 testFailed("event.ports should be non-null when ports sent");
99 if (event.ports.length == 2)
100 testPassed("event.ports contains two ports when two ports sent");
102 testFailed("event.ports contained " + event.ports.length + " when two ports sent");
104 } else if (event.data == "entangled ports") {
105 if (event.ports.length == 2)
106 testPassed("event.ports contains two ports when two ports re-sent after error");
108 testFailed("event.ports contained " + event.ports.length + " when two ports re-sent after error");
109 } else if (event.data == "done") {
112 testFailed("Received unexpected message: " + event.data);