|
1 <?xml version="1.0"?> |
|
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> |
|
3 <?xml-stylesheet href="chrome://mochikit/content/tests/SimpleTest/test.css" |
|
4 type="text/css"?> |
|
5 <window title="MessageManager CPOW tests" |
|
6 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" |
|
7 onload="start()"> |
|
8 |
|
9 <!-- test results are displayed in the html:body --> |
|
10 <label value="CPOWs"/> |
|
11 |
|
12 <script type="application/javascript"><![CDATA[ |
|
13 var test_state = "remote"; |
|
14 var test_node = null; |
|
15 var reentered = false; |
|
16 |
|
17 function ok(condition, message) { |
|
18 return opener.wrappedJSObject.ok(condition, message); |
|
19 } |
|
20 |
|
21 // Make sure that an error in this file actually causes the test to fail. |
|
22 window.onerror = function (msg, url, line) { |
|
23 ok(false, "Error while executing: \n" + msg + "\n" + url + ":" + line); |
|
24 }; |
|
25 |
|
26 function testCpowMessage(message) { |
|
27 ok(message.json.check == "ok", "correct json"); |
|
28 |
|
29 let data = message.objects.data; |
|
30 let document = message.objects.document; |
|
31 ok(data.i === 5, "integer property"); |
|
32 ok(data.b === true, "boolean property"); |
|
33 ok(data.s === "hello", "string property"); |
|
34 ok(data.x.i === 10, "nested property"); |
|
35 ok(data.f() === 99, "function call"); |
|
36 ok(document.title === "Hello, Kitty", "document node"); |
|
37 |
|
38 data.i = 6; |
|
39 data.b = false; |
|
40 data.s = "bye"; |
|
41 data.x = null; |
|
42 ok(data.i === 6, "integer property"); |
|
43 ok(data.b === false, "boolean property"); |
|
44 ok(data.s === "bye", "string property"); |
|
45 ok(data.x === null, "nested property"); |
|
46 |
|
47 let throwing = message.objects.throwing; |
|
48 // Based on the table on: |
|
49 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy |
|
50 let tests = [ |
|
51 () => Object.getOwnPropertyDescriptor(throwing, 'test'), |
|
52 () => Object.getOwnPropertyNames(throwing), |
|
53 () => Object.defineProperty(throwing, 'test', {value: 1}), |
|
54 () => delete throwing.test, |
|
55 () => "test" in throwing, |
|
56 () => Object.prototype.hasOwnProperty.call(throwing, 'test'), |
|
57 () => throwing.test, |
|
58 () => { throwing.test = 1 }, |
|
59 // () => { for (let prop in throwing) {} }, Bug 783829 |
|
60 () => { for (let prop of throwing) {} }, |
|
61 () => Object.keys(throwing), |
|
62 () => Function.prototype.call.call(throwing), |
|
63 () => new throwing, |
|
64 () => Object.preventExtensions(throwing), |
|
65 () => Object.freeze(throwing), |
|
66 () => Object.seal(throwing), |
|
67 ] |
|
68 |
|
69 for (let test of tests) { |
|
70 let threw = false; |
|
71 try { |
|
72 test() |
|
73 } catch (e) { |
|
74 threw = true; |
|
75 } |
|
76 ok(threw, "proxy operation threw exception"); |
|
77 } |
|
78 |
|
79 let array = message.objects.array; |
|
80 let i = 1; |
|
81 for (let elt of array) { |
|
82 ok(elt === i, "correct element found"); |
|
83 i++; |
|
84 } |
|
85 ok(i === 4, "array has correct length"); |
|
86 |
|
87 let j = message.objects.for_json; |
|
88 let str = JSON.stringify(j); |
|
89 let j2 = JSON.parse(str); |
|
90 ok(j2.n === 3, "JSON integer property"); |
|
91 ok(j2.a[0] === 1, "JSON array index"); |
|
92 ok(j2.a[1] === 2, "JSON array index"); |
|
93 ok(j2.a[2] === 3, "JSON array index"); |
|
94 ok(j2.s === "hello", "JSON string property"); |
|
95 ok(j2.o.x === 10, "JSON object property"); |
|
96 } |
|
97 |
|
98 function recvAsyncMessage(message) { |
|
99 testCpowMessage(message); |
|
100 } |
|
101 |
|
102 function recvSyncMessage(message) { |
|
103 testCpowMessage(message); |
|
104 } |
|
105 |
|
106 function recvRpcMessage(message) { |
|
107 ok(message.json.check == "ok", "correct json"); |
|
108 |
|
109 let data = message.objects.data; |
|
110 |
|
111 // Sanity check. |
|
112 ok(data.i === 5, "integer property"); |
|
113 |
|
114 // Check that we re-enter. |
|
115 reentered = false; |
|
116 let result = data.reenter(); |
|
117 ok(reentered, "re-entered rpc"); |
|
118 ok(result == "ok", "got correct result"); |
|
119 } |
|
120 |
|
121 function recvReenterMessage(message) { |
|
122 ok(message.objects.data.valid === true, "cpows work"); |
|
123 reentered = true; |
|
124 } |
|
125 |
|
126 function recvNestedSyncMessage(message) { |
|
127 message.objects.data.reenter(); |
|
128 } |
|
129 |
|
130 function recvReenterSyncMessage(message) { |
|
131 ok(false, "should not have received re-entered sync message"); |
|
132 } |
|
133 |
|
134 function recvFailMessage(message) { |
|
135 ok(false, message.json.message); |
|
136 } |
|
137 |
|
138 function recvDoneMessage(message) { |
|
139 if (test_state == "remote") { |
|
140 test_node.parentNode.removeChild(test_node); |
|
141 run_tests("inprocess"); |
|
142 return; |
|
143 } |
|
144 |
|
145 finish(); |
|
146 } |
|
147 |
|
148 function run_tests(type) { |
|
149 var node = document.getElementById('cpowbrowser_' + type); |
|
150 |
|
151 test_state = type; |
|
152 test_node = node; |
|
153 |
|
154 var mm = node.messageManager; |
|
155 mm.addMessageListener("cpows:async", recvAsyncMessage); |
|
156 mm.addMessageListener("cpows:sync", recvSyncMessage); |
|
157 mm.addMessageListener("cpows:rpc", recvRpcMessage); |
|
158 mm.addMessageListener("cpows:reenter", recvReenterMessage); |
|
159 mm.addMessageListener("cpows:reenter", recvReenterMessage); |
|
160 mm.addMessageListener("cpows:nested_sync", recvNestedSyncMessage); |
|
161 mm.addMessageListener("cpows:reenter_sync", recvReenterSyncMessage); |
|
162 mm.addMessageListener("cpows:done", recvDoneMessage); |
|
163 mm.addMessageListener("cpows:fail", recvFailMessage); |
|
164 mm.loadFrameScript("chrome://mochitests/content/chrome/content/base/test/chrome/cpows_child.js", true); |
|
165 } |
|
166 |
|
167 function start() { |
|
168 run_tests('remote'); |
|
169 } |
|
170 |
|
171 function finish() { |
|
172 opener.setTimeout("done()", 0); |
|
173 window.close(); |
|
174 } |
|
175 ]]></script> |
|
176 |
|
177 <browser type="content" src="about:blank" id="cpowbrowser_remote" remote="true"/> |
|
178 <browser type="content" src="about:blank" id="cpowbrowser_inprocess"/> |
|
179 </window> |