122 lines
3.8 KiB
HTML
122 lines
3.8 KiB
HTML
<html>
|
|
<head></head>
|
|
<body>
|
|
<div id="description"></div>
|
|
<input type="file" id="fileInput">
|
|
<div id="console"></div>
|
|
<script>
|
|
if (window.testRunner) {
|
|
testRunner.dumpAsText();
|
|
testRunner.waitUntilDone();
|
|
}
|
|
|
|
var console = document.getElementById("console");
|
|
|
|
var tests = [];
|
|
|
|
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;
|
|
if ("object" != typeof actual)
|
|
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>";
|
|
}
|
|
var i = 0;
|
|
window.onmessage = function(evt) {
|
|
if (safeToString(frames[0].tests[i].eventData) == 'done') {
|
|
if (window.testRunner)
|
|
testRunner.notifyDone();
|
|
return;
|
|
}
|
|
|
|
shouldBe("(frames[0].tests["+i+"]).eventData instanceof (frames[0])."+tests[i].constructor, "true");
|
|
shouldBe("(frames[0].tests["+i+"]).event.data instanceof (frames[0])."+tests[i].constructor, "true");
|
|
i++;
|
|
}
|
|
|
|
function tryPostMessage(message, constructor) {
|
|
try {
|
|
var value = eval(message);
|
|
frames[0].postMessage(value, "*");
|
|
tests.push({constructor: constructor});
|
|
} catch(e) {
|
|
console.innerHTML += "FAIL: 'postMessage("+message+")' should not throw but threw " + e + "<br>";
|
|
}
|
|
}
|
|
|
|
document.getElementById("description").innerHTML = "Tests that we clone object hierarchies";
|
|
|
|
function startTest() {
|
|
tryPostMessage('({})', "Object");
|
|
tryPostMessage('[]', "Array");
|
|
tryPostMessage('new Date', "Date");
|
|
var fileInput = document.getElementById("fileInput");
|
|
var fileRect = fileInput.getClientRects()[0];
|
|
var targetX = fileRect.left + fileRect.width / 2;
|
|
var targetY = fileRect.top + fileRect.height / 2;
|
|
if (window.eventSender) {
|
|
eventSender.beginDragWithFiles(['get-file-upload.html']);
|
|
eventSender.mouseMoveTo(targetX, targetY);
|
|
eventSender.mouseUp();
|
|
tryPostMessage('fileInput.files[0]', "File");
|
|
tryPostMessage('fileInput.files', "FileList");
|
|
}
|
|
tryPostMessage('"done"');
|
|
}
|
|
</script>
|
|
<iframe src="resources/window-postmessage-clone-frames-frame.html" onload="startTest()"></iframe>
|
|
</body>
|
|
</html>
|