tizen beta release
[framework/web/webkit-efl.git] / LayoutTests / fast / dom / Window / script-tests / postmessage-test.js
1 if (window.layoutTestController) {
2     layoutTestController.dumpAsText();
3     layoutTestController.waitUntilDone();
4 }
5
6 var console = document.getElementById("console");
7
8 var messages = [];
9 var evalThunks = [];
10
11 function equal(actual, expected)
12 {
13     if (actual === expected)
14         return true;
15     if (typeof actual !== typeof expected)
16         return false;
17     if ((actual instanceof Date) || (expected instanceof Date)) {
18         if ((actual instanceof Date) && (expected instanceof Date))
19             return (expected instanceof Date) && actual.getTime() == expected.getTime();
20         return false;
21     }
22     if ((actual instanceof Number) || (expected instanceof Number)) {
23         return (actual instanceof Number) && (expected instanceof Number) &&
24             (expected.valueOf() == actual.valueOf());
25     }
26     if ((actual instanceof Boolean) || (expected instanceof Boolean)) {
27         return (actual instanceof Boolean) && (expected instanceof Boolean) &&
28             (expected.valueOf() == actual.valueOf());
29     }
30     if ((actual instanceof String) || (expected instanceof String)) {
31         return (actual instanceof String) && (expected instanceof String) &&
32             (expected.valueOf() == actual.valueOf());
33     }
34     if (Array.isArray(actual) || Array.isArray(expected)) {
35         if (!Array.isArray(actual) || !Array.isArray(expected))
36             return false;
37         if (actual.length != expected.length)
38             return false;
39         for (var i = 0; i < actual.length; i++) {
40             if ((i in actual) ^ (i in expected))
41                 return false;
42             if (!equal(actual[i], expected[i]))
43                 return false;
44         }
45         return true;
46     }
47     if (actual.constructor !== expected.constructor)
48         return false;
49     try {
50         var keys = Object.keys(actual);
51     } catch(e) {
52         return false;
53     }
54     try {
55     if (!equal(keys, Object.keys(expected)))
56         return false;
57     } catch(e) {
58         return false;
59     }
60     for (var i = 0; i < keys.length; i++) {
61         if (!equal(actual[keys[i]], expected[keys[i]]))
62             return false;
63     }
64     return true;
65 }
66
67 function safeToString(o) {
68     if (o instanceof Date)
69         return o.toISOString();
70     if (typeof o !== "object" || !o)
71         return o;
72     try {
73         return o.toString();
74     } catch (e) {
75         return Object.prototype.toString.call(o) + "(default toString threw "+e+")";
76     }
77 }
78
79 function shouldBe(actual, expected)
80 {
81     var actualValue = eval(actual);
82     var expectedValue = eval(expected);
83     if (equal(actualValue, expectedValue))
84         console.innerHTML += "PASS: " + actual + " is " + safeToString(expectedValue) + " of type " + typeof actualValue + "<br>";
85     else
86         console.innerHTML += "FAIL: " + actual + " is " + actualValue + " should be " + expectedValue + " of type " + typeof expectedValue + "<br>";
87 }
88
89 function shouldBeIdentical(actual, expected)
90 {
91     var actualValue = eval(actual);
92     var expectedValue = eval(expected);
93     if (actualValue === expectedValue)
94         console.innerHTML += "PASS: " + actual + " is === to " + expected + "<br>";
95     else
96         console.innerHTML += "FAIL: " + actual + " is not === to " + expected + "<br>";
97 }
98
99 function doPass(msg) {
100     console.innerHTML += "PASS: " + msg + "<br>";
101 }
102
103 function doFail(msg) {
104     console.innerHTML += "FAIL: " + msg + "<br>";
105 }
106
107 window.doPassFail = function(result, msg) {
108     console.innerHTML += (result ? "PASS: " : "FAIL: ") + msg + "<br>";
109 }
110
111 function onmessage(evt) {
112     eventData = evt.data;
113     if (evt.data !== evt.data)
114         console.innerHTML += "MessageEvent.data does not produce the same value on multiple queries. " + evt.data + ", " + evt.data + "<br>";
115     var message = messages.shift();
116     switch (message) {
117     case "cyclicObject":
118         shouldBeIdentical("eventData", "eventData.self");
119         break;
120     case "cyclicArray":
121         shouldBeIdentical("eventData", "eventData[0]");
122         break;
123     case "objectGraph":
124         shouldBeIdentical("eventData.graph1", "eventData.graph2");
125         break;
126     case "arrayGraph":
127         shouldBeIdentical("eventData[0]", "eventData[1]");
128         break;
129     case "evalThunk":
130         var thunk = evalThunks.shift();
131         try {
132             thunk(eventData);
133         } catch(e) {
134             doFail("threw exception: " + e);
135             throw e;
136         }
137         break;
138     default:
139         shouldBe("eventData", message);
140     }
141
142     if (safeToString(evt.data) == 'done' && window.layoutTestController)
143         layoutTestController.notifyDone();
144 }
145
146 window.addEventListener('message', onmessage, false);
147
148 function ConstructorWithPrototype(s) {
149     this.field = s;
150 }
151
152 ConstructorWithPrototype.prototype = {
153     protoProperty: 2010
154 };
155
156 window.tryPostMessage = function(message, shouldThrow, expected, expectedExceptionOrEvalThunk) {
157     if (expected == "evalThunk") {
158       var evalThunk = expectedExceptionOrEvalThunk;
159     } else {
160       var expectedException = expectedExceptionOrEvalThunk;
161     }
162     try {
163         var value = eval(message);
164         postMessage(value, "*");
165         if (shouldThrow)
166             console.innerHTML += "FAIL: 'postMessage("+message+")' should throw but didn't<br>";
167         messages.push(expected || message);
168         if (expected == "evalThunk") {
169             evalThunks.push(evalThunk);
170         }
171     } catch(e) {
172         if (shouldThrow) {
173             if (expectedException === undefined || expectedException == e.code || expectedException == e) {
174                 console.innerHTML += "PASS: 'postMessage("+message+")' threw " + e + "<br>";
175             } else {
176                 console.innerHTML += "FAIL: 'postMessage("+message+")' threw " + e + ", was expecting " + expectedException + "<br>";
177             }
178         } else
179             console.innerHTML += "FAIL: 'postMessage("+message+")' should not throw but threw " + e + "<br>";
180     }
181 }