gecko-dev/dom/tests/mochitest/whatwg/test_postMessage_origin.xhtml

546 lines
14 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=417075
-->
<head>
<title>postMessage from about:blank, data URLs</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="browserFu.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=417075">Mozilla Bug 417075</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<iframe src="http://mochi.test:8888/tests/dom/tests/mochitest/whatwg/postMessage_origin_helper.xhtml"
id="sameDomain"></iframe>
<iframe src="http://example.com/tests/dom/tests/mochitest/whatwg/postMessage_origin_helper.xhtml"
id="otherDomain"></iframe>
<iframe src="http://example.org:8000/tests/dom/tests/mochitest/whatwg/postMessage_origin_helper.xhtml"
id="otherDomainPort"></iframe>
<iframe src="ftp://mochi.test:27534/tests/dom/tests/mochitest/whatwg/postMessage_origin_helper.xhtml"
id="localNoExist"></iframe>
<iframe src="http://sub1.παράδειγμα.δοκιμή/tests/dom/tests/mochitest/whatwg/postMessage_origin_helper.xhtml"
id="idnKidWhitelist"></iframe>
<iframe src="http://sub1.exämple.test/tests/dom/tests/mochitest/whatwg/postMessage_origin_helper.xhtml"
id="idnKidNoWhitelist"></iframe>
<pre id="test">
<script class="testbody" type="application/javascript"><![CDATA[
/** Test for Bug 417075 **/
SimpleTest.waitForExplicitFinish();
function errorCheck(i, called, error, actual)
{
ok(!called, "receiver should not have been called for test #" + i);
is(actual, error, "wrong error thrown in test #" + i);
}
var tests =
[
// 0
{
args: ["NOT-RECEIVED", ""],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "null"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "a"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "http :"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "http: //"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
hasThrowsNoExceptionBug: true
},
// 5
{
args: ["NOT-RECEIVED", "http ://"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["TODO", " http://localhost:8888"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
returnOrigin: "http://mochi.test:8888",
hasThrowsNoExceptionBug: true
},
{
args: ["NOT-RECEIVED", "hä"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "http://lo\0k.com"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "http: //localhost:8888"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
hasThrowsNoExceptionBug: true
},
// 10
{
args: ["NOT-RECEIVED", "http://localhost :8888"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
{
args: ["NOT-RECEIVED", "http:// localhost:8888"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
hasThrowsNoExceptionBug: true
},
{
args: ["TODO", "http://\nlocalhost:8888"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
returnOrigin: "http://mochi.test:8888",
hasThrowsNoExceptionBug: true
},
{
args: ["TODO", "http://localhost:8888\0"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
returnOrigin: "http://mochi.test:8888",
hasThrowsNoExceptionBug: true
},
{
args: ["TODO", "http://localhost:8888\n"],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR,
returnOrigin: "http://mochi.test:8888",
hasThrowsNoExceptionBug: true
},
// 15
{
args: ["PASS", "*"],
source: "sameDomain",
returnOrigin: "http://mochi.test:8888"
},
{
args: ["PASS", "http://mochi.test:8888"],
source: "sameDomain",
returnOrigin: "http://mochi.test:8888"
},
{
args: ["PASS", "http://example.com"],
source: "otherDomain",
returnOrigin: "http://example.com"
},
{
args: ["PASS", "http://example.com/"],
source: "otherDomain",
returnOrigin: "http://example.com"
},
{
args: ["PASS", "http://example.com:80"],
source: "otherDomain",
returnOrigin: "http://example.com"
},
// 20
{
args: ["PASS", "http://example.com:80/"],
source: "otherDomain",
returnOrigin: "http://example.com"
},
{
args: ["PASS", "http://example.com:80/foobar"],
source: "otherDomain",
returnOrigin: "http://example.com"
},
{
args: ["PASS", "http://example.com/foobar"],
source: "otherDomain",
returnOrigin: "http://example.com"
},
{
args: ["PASS", "http://example.com:8000"],
source: "otherDomain",
expectNoCallback: true
},
{
args: ["PASS", "http://example.com:8000/"],
source: "otherDomain",
expectNoCallback: true
},
// 25
{
args: ["PASS", "http://example.org:8000"],
source: "otherDomainPort",
returnOrigin: "http://example.org:8000"
},
{
args: ["PASS", "http://example.org:8000/"],
source: "otherDomainPort",
returnOrigin: "http://example.org:8000"
},
{
args: ["PASS", "http://example.org:8000/tests/dom/test/mochitest/whatwg/postMessage_origin_helper.xhtml"],
source: "otherDomainPort",
returnOrigin: "http://example.org:8000"
},
{
args: ["PASS", "http://example.org:8000/tests/dom/test/mochitest/whatwg/this_file_does_not_exist.xhtml"],
source: "otherDomainPort",
returnOrigin: "http://example.org:8000"
},
{
args: ["PASS", "http://example.org"],
source: "otherDomainPort",
expectNoCallback: true
},
// 30
{
args: ["PASS", "http://example.org:80"],
source: "otherDomainPort",
expectNoCallback: true
},
{
args: ["PASS", "http://example.org/"],
source: "otherDomainPort",
expectNoCallback: true
},
{
args: ["PASS", "http://example.org"],
source: "otherDomain",
expectNoCallback: true
},
{
args: ["PASS", "ftp://mochi.test:8888"],
source: "sameDomain",
expectNoCallback: true
},
{
args: ["PASS", "http://mochi.test:8888"],
source: "sameDomain",
returnOrigin: "http://mochi.test:8888"
},
// 35
{
args: ["PASS", "http://mochi.test:27534"],
source: "sameDomain",
expectNoCallback: true
},
{
args: ["PASS", "http://sub1.παράδειγμα.δοκιμή"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.παράδειγμα.δοκιμή:80"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.παράδειγμα.δοκιμή:80/"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.παράδειγμα.δοκιμή:80/foobar"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
// 40
{
args: ["PASS", "http://sub1.παράδειγμα.δοκιμή/foobar"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.xn--hxajbheg2az3al.xn--jxalpdlp"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.xn--hxajbheg2az3al.xn--jxalpdlp:80"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.xn--hxajbheg2az3al.xn--jxalpdlp:80/"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
{
args: ["PASS", "http://sub1.xn--hxajbheg2az3al.xn--jxalpdlp:80/foo"],
source: "idnKidWhitelist",
returnOrigin: "http://sub1.παράδειγμα.δοκιμή"
},
// 45
{
args: ["PASS", "http://sub1.exämple.test"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.exämple.test:80"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.exämple.test:80/"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.exämple.test/"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.exämple.test/foobar"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
// 50
{
args: ["PASS", "http://sub1.xn--exmple-cua.test"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.xn--exmple-cua.test:80"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.xn--exmple-cua.test:80/"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.xn--exmple-cua.test/"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
{
args: ["PASS", "http://sub1.xn--exmple-cua.test/foobar"],
source: "idnKidNoWhitelist",
returnOrigin: "http://sub1.exämple.test",
hasWrongReturnOriginBug: true
},
// 55
{
args: ["NOT-RECEIVED", undefined],
source: "sameDomain",
name: "SyntaxError",
code: DOMException.SYNTAX_ERR
},
];
function allTests(callback)
{
var test, target, called;
function eventCheck(evt)
{
ok(test === tests[i],
"i and test are out of sync! async is hard, let's go shopping");
var originCheck = test.hasWrongReturnOriginBug ? todo_is : is;
originCheck(evt.origin, test.returnOrigin, "wrong origin for #" + i);
if (test.args[0] == "TODO")
todo_is(evt.data, "PASS", "wrong data");
else
is(evt.data, "PASS", "wrong data");
is(evt.lastEventId, "",
"postMessage creates events with empty lastEventId");
ok(evt.source === target, "wrong source");
called = true;
}
function nextTest()
{
i++;
if (i === end)
{
removeListener(listener);
setTimeout(callback, 0);
return;
}
test = tests[i];
target = $(test.source).contentWindow;
try
{
called = false;
target.postMessage.apply(target, test.args);
}
catch (e)
{
// Since an exception was thrown, we know at this point that we're not
// waiting on anything else in the queue of script to run, and we can just
// call nextTest directly.
errorCheck(i, called, e.name, test.name);
errorCheck(i, called, e.code, test.code);
nextTest();
return;
}
// We've set up the event generated by postMessage to be dispatched, and
// it's sitting in a queue somewhere. However, it hasn't arrived yet, and
// the target document hasn't received the event -- so we need to continue
// our tests later.
setTimeout(function()
{
// The event was dispatched, and the target frame's code processed it and
// responded -- so now *that* response is sitting in the queue of script to
// execute. Process pending script one more time so we know we've gotten
// the response.
setTimeout(function()
{
// Finally, we've posted our message and received our response, and
// there's nothing further coming down the pipe.
if (test.hasThrowsNoExceptionBug)
todo(false, "should throw on test #" + i);
else
ok(test.expectNoCallback ^ called, "should have been called #" + i);
nextTest();
}, 0);
}, 0);
}
var listener = registerMessageListener(eventCheck);
var i = -1, end = tests.length;
nextTest();
}
function registerMessageListener(func, callback)
{
function receive(evt)
{
func(evt);
if (callback)
callback();
}
window.addEventListener("message", receive, false);
return receive;
}
function removeListener(listener)
{
window.removeEventListener("message", listener, false);
}
function oddballTests(callback)
{
var called = false;
function eventChecks(evt)
{
is(evt.origin, "http://mochi.test:8888", "wrong sender");
is(evt.data, "PASS", "wrong data");
is(evt.lastEventId, "",
"postMessage creates events with empty lastEventId");
ok(evt.source === window, "wrong source");
called = true;
}
var listener = registerMessageListener(eventChecks, function()
{
is(called, true, "should have been called");
removeListener(listener);
called = false;
listener = registerMessageListener(eventChecks, function()
{
is(called, true, "should have been called");
removeListener(listener);
callback();
});
window.postMessage("PASS", "http://mochi.test:8888");
});
window.postMessage("PASS", "http://mochi.test:8888");
}
function run()
{
oddballTests(function()
{
allTests(function()
{
SimpleTest.finish();
});
});
}
window.addEventListener("load", run, false);
]]></script>
</pre>
</body>
</html>