blob: 534f3fb8ca43f22d3cad52bdebe6b2ed65ed8b39 [file] [log] [blame]
<!DOCTYPE HTML>
<html>
<body>
<script src="/js-test-resources/js-test.js"></script>
<script>
description("Test that a cross-origin redirect does not result in a non-simple request being sent to the target.");
window.jsTestIsAsync = true;
function setImmediate(f)
{
var channel = new MessageChannel();
channel.port1.onmessage = function() { channel.port1.close(); f(); };
channel.port2.postMessage("abusingmessagechannelsforfunandprofit");
channel.port2.close();
}
function resetTripmine()
{
var req = new XMLHttpRequest;
req.open("GET", "/resources/reset-temp-file.php?filename=tripmine-status", false);
req.send();
}
function fetchTripmineStatus()
{
var req = new XMLHttpRequest;
req.open("GET", "/resources/tripmine.php?command=status", false);
req.send();
return req.responseText;
}
function checkResult()
{
window.tripmineStatus = fetchTripmineStatus();
shouldBeEmptyString("tripmineStatus");
}
function testAsync(method, code)
{
debug("Asynchronous XMLHttpRequest " + code + " " + method + " redirect:");
var req = new XMLHttpRequest;
setImmediate(function() {
resetTripmine();
req.open(method, "/resources/redirect.php?code=" + code + "&url=http://localhost:8000/resources/tripmine.php", true);
req.setRequestHeader("X-WebKit-Test", "*");
req.setRequestHeader("Content-Type", "application/xml");
req.send("data");
});
return new Promise(function(resolve, reject)
{
req.onloadend = function() {
setImmediate(function() {
checkResult();
resolve();
});
};
});
}
function testSync(method, code)
{
debug("Synchronous XMLHttpRequest " + code + " " + method + " redirect:");
resetTripmine();
var req = new XMLHttpRequest;
req.open(method, "/resources/redirect.php?code=" + code + "&url=http://localhost:8000/resources/tripmine.php", false);
req.setRequestHeader("X-WebKit-Test", "*");
req.setRequestHeader("Content-Type", "application/xml");
window.testSyncReq = req;
shouldThrow("testSyncReq.send('data')");
checkResult();
}
var ASYNC_TEST_CASES = [
["POST", 307],
["GET", 307],
["POST", 303],
["GET", 303],
["POST", 302],
["GET", 302],
["DELETE", 307],
["POST", 301],
["GET", 301],
["DELETE", 301],
];
var SYNC_TEST_CASES = [
["POST", 307],
["GET", 307],
["POST", 303],
["GET", 303],
["POST", 302],
["GET", 302],
["DELETE", 307],
["POST", 301],
["GET", 301],
["DELETE", 301],
];
function finish()
{
resetTripmine();
finishJSTest();
}
var prevPromise = Promise.resolve();
for (var i = 0; i < ASYNC_TEST_CASES.length; ++i) {
var method = ASYNC_TEST_CASES[i][0];
var code = ASYNC_TEST_CASES[i][1];
prevPromise = prevPromise.then(testAsync.bind(null, method, code));
}
prevPromise.then(function()
{
setImmediate(function() {
try {
for (var i = 0; i < SYNC_TEST_CASES.length; ++i) {
var method = SYNC_TEST_CASES[i][0];
var code = SYNC_TEST_CASES[i][1];
testSync(method, code);
}
} catch (e) {
testFailed(e.toString());
}
finish();
});
});
</script>