| <html> |
| <head></head> |
| <body> |
| <div id="description"></div> |
| <div id="console"></div> |
| <input type="file" id="fileInput"></input> |
| <script> |
| if (window.testRunner) { |
| testRunner.dumpAsText(); |
| testRunner.waitUntilDone(); |
| } |
| |
| var console = document.getElementById("console"); |
| |
| var messages = []; |
| |
| function equal(actual, expected) |
| { |
| if (typeof actual !== typeof expected) |
| return false; |
| if (actual === expected) |
| return true; |
| if ((actual instanceof Date) || (expected instanceof Date)) { |
| if ((actual instanceof Date) && (expected instanceof Date)) |
| return (expected instanceof Date) && actual.getTime() == expected.getTime(); |
| return false; |
| } |
| if (Array.isArray(actual) || Array.isArray(expected)) { |
| if (!Array.isArray(actual) || !Array.isArray(expected)) |
| return false; |
| if (actual.length != expected.length) |
| return false; |
| for (var i = 0; i < actual.length; i++) { |
| if ((i in actual) ^ (i in expected)) |
| return false; |
| if (!equal(actual[i], expected[i])) |
| return false; |
| } |
| return true; |
| } |
| if (actual.constructor !== expected.constructor) |
| return false; |
| var keys = Object.keys(actual); |
| if (!equal(keys, Object.keys(expected))) |
| return false; |
| for (var i = 0; i < keys.length; i++) { |
| if (!equal(actual[keys[i]], expected[keys[i]])) |
| return false; |
| } |
| return true; |
| } |
| |
| function safeToString(o) { |
| if (o instanceof Date) |
| return o.toISOString(); |
| if (typeof o !== "object" || !o) |
| return o; |
| try { |
| return o.toString(); |
| } catch (e) { |
| return Object.prototype.toString.call(o) + "(default toString threw "+e+")"; |
| } |
| } |
| |
| function shouldBe(actual, expected) |
| { |
| var actualValue = eval(actual); |
| var expectedValue = eval(expected); |
| if (equal(actualValue, expectedValue)) |
| console.innerHTML += "PASS: " + actual + " is " + safeToString(expectedValue) + " of type " + typeof actualValue + "<br>"; |
| else |
| console.innerHTML += "FAIL: " + actual + " is " + actualValue + " should be " + expectedValue + " of type " + typeof expectedValue + "<br>"; |
| } |
| |
| function onmessage(evt) { |
| evt.foo = "bar"; // add a property. |
| eventData = evt.data; |
| shouldBe("eventData", messages[0]); |
| evt.func = function(){}; // add a function property. |
| eventData = evt.data; |
| shouldBe("eventData", messages[0]); |
| evt.func = ""; // despecialise a function property. |
| eventData = evt.data; |
| shouldBe("eventData", messages[0]); |
| for (var i = 0; i < 1000; i++) // To dictionary transition |
| evt[i] = i; |
| eventData = evt.data; |
| shouldBe("eventData", messages[0]); |
| delete evt.foo; // To uncachable dictionary |
| eventData = evt.data; |
| shouldBe("eventData", messages[0]); |
| messages.shift(); |
| if (safeToString(evt.data) == 'done' && window.testRunner) |
| testRunner.notifyDone(); |
| } |
| |
| window.addEventListener('message', onmessage, false); |
| |
| function tryPostMessage(message, shouldThrow, expected) { |
| try { |
| var value = eval(message); |
| postMessage(value, "*"); |
| if (shouldThrow) |
| console.innerHTML += "FAIL: 'postMessage("+message+")' should throw but didn't<br>"; |
| messages.push(expected || message); |
| } catch(e) { |
| if (shouldThrow) |
| console.innerHTML += "PASS: 'postMessage("+message+")' threw " + e + "<br>"; |
| else |
| console.innerHTML += "FAIL: 'postMessage("+message+")' should not throw but threw " + e + "<br>"; |
| } |
| } |
| |
| document.getElementById("description").innerHTML = "Tests that we clone object hierarchies"; |
| |
| tryPostMessage('null'); |
| tryPostMessage('undefined'); |
| tryPostMessage('1'); |
| tryPostMessage('true'); |
| tryPostMessage('"1"'); |
| tryPostMessage('({})'); |
| tryPostMessage('({a:1})'); |
| tryPostMessage('[]'); |
| tryPostMessage('[1,2,3]'); |
| tryPostMessage('[,,1]'); |
| tryPostMessage('(function(){})', true); |
| tryPostMessage('new Date(1234567890000)'); |
| tryPostMessage('"done"'); |
| </script> |
| </body> |
| </html> |