tizen beta release
[profile/ivi/webkit-efl.git] / LayoutTests / fast / events / resources / message-port-multi.js
1 if (window.layoutTestController) {
2     layoutTestController.dumpAsText();
3     layoutTestController.waitUntilDone();
4 }
5
6 description("This test checks the various use cases around sending multiple ports through MessagePort.postMessage");
7
8 var channel = new MessageChannel();
9 var channel2 = new MessageChannel();
10 var channel3 = new MessageChannel();
11 var channel4 = new MessageChannel();
12
13 channel.port1.postMessage("noport");
14 channel.port1.postMessage("zero ports", []);
15 channel.port1.postMessage("two ports", [channel2.port1, channel2.port2]);
16
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]);
24
25 shouldThrow('channel.port1.postMessage("notAnArray", channel3.port1)')
26 shouldThrow('channel.port1.postMessage("notASequence", [{length: 3}])');
27
28 // Should not crash (we should figure out that the array contains undefined
29 // entries).
30 var largePortArray = [];
31 largePortArray[1234567890] = channel4.port1;
32 shouldThrow('channel.port1.postMessage("largeSequence", largePortArray)');
33
34 channel.port1.postMessage("done");
35
36 function testTransfers() {
37     var channel0 = new MessageChannel();
38
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();
46     try {
47         channel0.port1.webkitPostMessage({id:"host-object", hostObject:c3, port:c4.port1}, [c4.port1]);
48         testFailed("Sending host object should throw");
49     } catch(e) {
50         testPassed("Sending host object has thrown " + e);
51     }
52     c4.port1.postMessage("Should succeed");
53     channel0.port1.webkitPostMessage({id:"done"});
54
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");
59             else 
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");
65             else
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");
71             else
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();
77         } else {
78             testFailed("Unexpected message " + event.data);
79         }
80     }
81 }
82
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");
87         else
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");
92         else
93             testFailed("event.ports is null or non-zero length when empty array sent");
94     } else if (event.data == "two ports") {
95         if (!event.ports) {
96             testFailed("event.ports should be non-null when ports sent");
97             return;
98         }
99         if (event.ports.length == 2)
100             testPassed("event.ports contains two ports when two ports sent");
101         else
102             testFailed("event.ports contained " + event.ports.length + " when two ports sent");
103
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");
107         else
108             testFailed("event.ports contained " + event.ports.length + " when two ports re-sent after error");
109     } else if (event.data == "done") {
110         testTransfers();
111     } else
112         testFailed("Received unexpected message: " + event.data);
113 }
114