blob: 2332d869c466c34c0ee1b56feab35528bf53aaac [file] [log] [blame]
window.jsTestIsAsync = true;
if (location.protocol != "http:" || location.host != "127.0.0.1:8000") {
testFailed("This test must be run from http://127.0.0.1:8000");
finishJSTest();
}
if (!window.internals) {
testFailed("This test requires window.internals");
finishJSTest();
}
function getServerDate()
{
var req = new XMLHttpRequest();
var t0 = new Date().getTime();
req.open('GET', "/cache/resources/current-time.cgi", false /* blocking */);
req.send();
var serverToClientTime = (new Date().getTime() - t0) / 2;
if (req.status != 200) {
console.log("unexpected status code " + req.status + ", expected 200.");
return new Date();
}
return new Date((parseInt(req.responseText) * 1000) + serverToClientTime);
}
var serverClientTimeDelta = getServerDate().getTime() - new Date().getTime();
var uniqueIdCounter = 0;
function makeHeaderValue(value)
{
if (value == 'now(0)')
return (new Date(new Date().getTime() + serverClientTimeDelta)).toUTCString();
if (value == 'now(100)')
return (new Date(new Date().getTime() + serverClientTimeDelta + 100 * 1000)).toUTCString();
if (value == 'unique()')
return "" + uniqueIdCounter++;
return value;
}
function generateTestURL(test, includeBody, expiresInFutureIn304)
{
includeBody = typeof includeBody !== 'undefined' ? includeBody : true;
expiresInFutureIn304 = typeof expiresInFutureIn304 !== 'undefined' ? expiresInFutureIn304 : false;
var uniqueTestId = Math.floor((Math.random() * 1000000000000));
var testURL = "resources/generate-response.cgi?include-body=" + (includeBody ? "1" : "0");
if (expiresInFutureIn304)
testURL += "&expires-in-future-in-304=1";
testURL += "&uniqueId=" + uniqueTestId++;
if (!test.responseHeaders || !test.responseHeaders["Content-Type"])
testURL += "&Content-Type=text/plain";
for (var header in test.responseHeaders)
testURL += '&' + header + '=' + makeHeaderValue(test.responseHeaders[header]);
return testURL;
}
function loadResource(test, onload)
{
if (!test.url)
test.url = generateTestURL(test, test.includeBody, test.expiresInFutureIn304);
test.xhr = new XMLHttpRequest();
test.xhr.onload = onload;
test.xhr.open("get", test.url, true);
for (var header in test.requestHeaders)
test.xhr.setRequestHeader(header, makeHeaderValue(test.requestHeaders[header]));
test.xhr.send();
}
function loadResources(tests, completetion)
{
// Otherwise we just get responses from the memory cache.
internals.clearMemoryCache();
var pendingCount = tests.length;
for (var i = 0; i < tests.length; ++i) {
loadResource(tests[i], function (ev) {
--pendingCount;
if (!pendingCount)
completetion();
});
}
}
function printResults(tests)
{
for (var i = 0; i < tests.length; ++i) {
var test = tests[i];
debug("response headers: " + JSON.stringify(test.responseHeaders));
if (test.expiresInFutureIn304)
debug("response's 'Expires' header is overriden by future date in 304 response");
if (test.requestHeaders)
debug("request headers: " + JSON.stringify(test.requestHeaders));
responseSource = internals.xhrResponseSource(test.xhr);
debug("response source: " + responseSource);
debug("");
}
}
function runTests(tests, completionHandler)
{
loadResources(tests, function () {
// Wait a bit so things settle down in the disk cache.
setTimeout(function () {
loadResources(tests, function () {
printResults(tests);
if (completionHandler)
completionHandler();
else
finishJSTest();
});
}, 100);
});
}
function mergeFields(field, componentField)
{
for (var name in componentField) {
if (field[name])
field[name] += ", " + componentField[name];
else
field[name] = componentField[name];
}
}
function generateTests(testMatrix, includeBody)
{
includeBody = typeof includeBody !== 'undefined' ? includeBody : true;
var tests = [];
var testCount = 1;
for (var i = 0; i < testMatrix.length; ++i)
testCount *= testMatrix[i].length;
for (var testNumber = 0; testNumber < testCount; ++testNumber) {
var test = {}
var index = testNumber;
for (var i = 0; i < testMatrix.length; ++i) {
var components = testMatrix[i];
var component = components[index % components.length];
index = Math.floor(index / components.length);
for (var field in component) {
if (!test[field])
test[field] = {}
mergeFields(test[field], component[field]);
}
}
test.includeBody = includeBody;
tests.push(test);
}
return tests;
}