Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
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()">
9 <!-- test results are displayed in the html:body -->
10 <label value="CPOWs"/>
12 <script type="application/javascript"><![CDATA[
13 var test_state = "remote";
14 var test_node = null;
15 var reentered = false;
17 function ok(condition, message) {
18 return opener.wrappedJSObject.ok(condition, message);
19 }
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 };
26 function testCpowMessage(message) {
27 ok(message.json.check == "ok", "correct json");
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");
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");
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 ]
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 }
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");
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 }
98 function recvAsyncMessage(message) {
99 testCpowMessage(message);
100 }
102 function recvSyncMessage(message) {
103 testCpowMessage(message);
104 }
106 function recvRpcMessage(message) {
107 ok(message.json.check == "ok", "correct json");
109 let data = message.objects.data;
111 // Sanity check.
112 ok(data.i === 5, "integer property");
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 }
121 function recvReenterMessage(message) {
122 ok(message.objects.data.valid === true, "cpows work");
123 reentered = true;
124 }
126 function recvNestedSyncMessage(message) {
127 message.objects.data.reenter();
128 }
130 function recvReenterSyncMessage(message) {
131 ok(false, "should not have received re-entered sync message");
132 }
134 function recvFailMessage(message) {
135 ok(false, message.json.message);
136 }
138 function recvDoneMessage(message) {
139 if (test_state == "remote") {
140 test_node.parentNode.removeChild(test_node);
141 run_tests("inprocess");
142 return;
143 }
145 finish();
146 }
148 function run_tests(type) {
149 var node = document.getElementById('cpowbrowser_' + type);
151 test_state = type;
152 test_node = node;
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 }
167 function start() {
168 run_tests('remote');
169 }
171 function finish() {
172 opener.setTimeout("done()", 0);
173 window.close();
174 }
175 ]]></script>
177 <browser type="content" src="about:blank" id="cpowbrowser_remote" remote="true"/>
178 <browser type="content" src="about:blank" id="cpowbrowser_inprocess"/>
179 </window>