Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(344)

Side by Side Diff: LayoutTests/fast/events/message-port-clone.html

Issue 19765010: postMessage() should throw a DataCloneError on invalid transferables (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 <html>
2 <head>
3 <script src="../js/resources/js-test-pre.js"></script>
4 </head>
1 <body> 5 <body>
2 <p>Tests various use cases when cloning MessagePorts.</p>
3 <p>Should be a series of SUCCESS messages, followed with DONE.</p>
4 <pre id=log></pre>
5 <script> 6 <script>
6 7 description("Tests various use cases when cloning MessagePorts.");
7 function gc() 8 window.jsTestIsAsync = true;
8 {
9 if (window.GCController)
10 return GCController.collect();
11
12 for (var i = 0; i < 10000; i++) { // force garbage collection (FF requires a bout 9K allocations before a collect).
13 var s = new String("abc");
14 }
15 }
16
17 function log(message)
18 {
19 document.getElementById("log").innerHTML += message + "<br>";
20 }
21
22 if (window.testRunner) {
23 testRunner.dumpAsText();
24 testRunner.waitUntilDone();
25 }
26 9
27 var channel = new MessageChannel; 10 var channel = new MessageChannel;
28 channel.port1.onmessage = channel.port2.onmessage = function(evt) { 11 channel.port1.onmessage = channel.port2.onmessage = function(evt) {
29 fail("FAIL: Should not have received message: " + evt.data); 12 testFailed("Should not have received message: " + evt.data);
30 }
31 try {
32 channel.port1.postMessage("msg", [channel.port1]);
33 log("FAIL: Posting port to itself should throw an exception.");
34 } catch (ex) {
35 log("SUCCESS: Posting port to itself: " + ex);
36 } 13 }
37 14
38 try { 15 // Posting port to itself should throw an exception.
39 channel.port1.postMessage("msg", [channel.port2]); 16 shouldThrow("channel.port1.postMessage('msg', [channel.port1])", "'DataCloneErro r: An object could not be cloned.'");
40 log("FAIL: Posting port to entangled pair should throw an exception."); 17
41 } catch (ex) { 18 // Posting port to entangled pair should throw an exception.
42 log("SUCCESS: Posting entangled port: " + ex); 19 shouldThrow("channel.port1.postMessage('msg', [channel.port2])", "'DataCloneErro r: An object could not be cloned.'");
43 }
44 20
45 channel = new MessageChannel; 21 channel = new MessageChannel;
46 var channel2 = new MessageChannel; 22 var channel2 = new MessageChannel;
47 channel.port1.postMessage("msg", [channel2.port1]); 23 channel.port1.postMessage("msg", [channel2.port1]);
48 24
49 // Should not be able to post a cloned port. 25 // Should not be able to post a cloned port.
50 try { 26 shouldThrow("channel.port1.postMessage('msg', [channel2.port1])", "'DataCloneErr or: An object could not be cloned.'");
51 channel.port1.postMessage("msg", [channel2.port1]);
52 log("FAIL: Posting cloned port should throw an exception.");
53 } catch (ex) {
54 log("SUCCESS: Posting cloned port.");
55 }
56 27
57 // Test posting messages to a port in cloned state. 28 // Test posting messages to a port in cloned state.
58 29
59 var channel = new MessageChannel; 30 var channel = new MessageChannel;
60 var channel2 = new MessageChannel; 31 var channel2 = new MessageChannel;
61 32
62 // Post messages before and after clone to make sure ordering is preserved and a ll messages are received. 33 // Post messages before and after clone to make sure ordering is preserved and a ll messages are received.
63 channel2.port2.postMessage("1"); 34 channel2.port2.postMessage("1");
64 channel.port1.postMessage("msg", [channel2.port1]); 35 channel.port1.postMessage("msg", [channel2.port1]);
65 channel2.port2.postMessage("2"); 36 channel2.port2.postMessage("2");
66 channel2.port2.postMessage("3"); 37 channel2.port2.postMessage("3");
38 var testEvent;
39 var messageIndex = 1;
67 channel.port2.onmessage = function(evt) { 40 channel.port2.onmessage = function(evt) {
68 var messageIndex = 1; 41 testEvent = evt;
69 if (evt.ports.length != 1) 42 shouldBe("testEvent.ports.length", "1");
70 log("FAIL: Got message without wrong number of ports: " + evt.ports.leng th);
71 evt.ports[0].onmessage = function(evt) { 43 evt.ports[0].onmessage = function(evt) {
72 if (evt.data != messageIndex) 44 testEvent = evt;
73 log("FAIL: Got message " + evt.data + ", expected " + messageIndex); 45 shouldBe("parseInt(testEvent.data)", "" + messageIndex);
74 messageIndex++; 46 messageIndex++;
75 if (messageIndex == 4) { 47 if (messageIndex == 4) {
76 log("SUCCESS: Posted messages to cloned port."); 48 testPassed("Posted messages to cloned port.");
77 testDoublyClonedPort(); 49 testDoublyClonedPort();
78 } 50 }
79 } 51 }
80 } 52 }
81 53
82 function testDoublyClonedPort() 54 function testDoublyClonedPort()
83 { 55 {
84 var channel = new MessageChannel; 56 var channel = new MessageChannel;
85 var channel2 = new MessageChannel; 57 var channel2 = new MessageChannel;
86 channel.port1.postMessage("msg", [channel2.port1]); 58 channel.port1.postMessage("msg", [channel2.port1]);
87 channel.port2.postMessage("msg", [channel2.port2]); 59 channel.port2.postMessage("msg", [channel2.port2]);
88 gc(); 60 gc();
89 channel.port1.onmessage = function(evt) { 61 channel.port1.onmessage = function(evt) {
90 evt.ports[0].postMessage("testme"); 62 evt.ports[0].postMessage("testme");
91 } 63 }
92 channel.port2.onmessage = function(evt) { 64 channel.port2.onmessage = function(evt) {
93 evt.ports[0].onmessage = function (evt) { 65 evt.ports[0].onmessage = function (evt) {
94 if (evt.data == "testme") 66 testEvent = evt;
95 log("SUCCESS: Cloned both endpoints of a channel."); 67 shouldBe("testEvent.data", "'testme'");
96 else
97 log("FAIL: Invalid message arrived: " + evt.data);
98 testPostClosePort(); 68 testPostClosePort();
99 } 69 }
100 } 70 }
101 71
102 } 72 }
103 73
104 // *Should* be able to post a closed port. 74 // *Should* be able to post a closed port.
105 function testPostClosePort() 75 function testPostClosePort()
106 { 76 {
107 var channel = new MessageChannel; 77 var channel = new MessageChannel;
108 var channel2 = new MessageChannel; 78 var channel2 = new MessageChannel;
109 channel2.port2.close(); 79 channel2.port2.close();
110 channel.port1.postMessage("closed", [channel2.port2]); 80 channel.port1.postMessage("closed", [channel2.port2]);
111 channel.port2.onmessage = function(evt) { 81 channel.port2.onmessage = function(evt) {
112 if (!evt.ports || evt.ports.length != 1) 82 testEvent = evt;
113 log("FAIL: Closed port not sent."); 83 shouldNotBe("testEvent.ports", "null");
114 else if (evt.data != "closed") 84 shouldBe("testEvent.ports.length", "1");
115 log("FAIL: Unexpected message: " + evt.data); 85 shouldBe("testEvent.data", "'closed'");
116 else 86
117 log("SUCCESS: Got closed port with event message " + evt.data); 87 finishJSTest();
118 done();
119 } 88 }
120 } 89 }
121
122 function done()
123 {
124 log("DONE");
125
126 if (window.testRunner)
127 testRunner.notifyDone();
128 }
129 </script> 90 </script>
91 <script src="../js/resources/js-test-post.js"></script>
130 </body> 92 </body>
93 </html>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698