blob: a976da1936aaa4e3ec3c956eb1d366f553f45704 [file] [log] [blame]
function log(message)
{
if (self.importScripts) {
postMessage(message);
} else {
document.getElementById('console').appendChild(document.createTextNode(message + "\n"));
}
}
var uuidRegex = new RegExp('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}');
function replaceUUID(s)
{
return s.replace(uuidRegex, 'UUID');
}
function sendXMLHttpRequestSync(method, url)
{
var xhr = new XMLHttpRequest();
xhr.open(method, url, false);
try {
xhr.send();
log("Status: " + xhr.status);
log("Response: " + xhr.responseText);
} catch (error) {
log("Received exception, code: " + error.code + ", name: " + error.name + ", message: " + replaceUUID(error.message));
}
}
function sendXMLHttpRequestAsync(method, url)
{
return new Promise(function (resolve) {
var xhr = new XMLHttpRequest();
xhr.onload = function()
{
log("Status: " + xhr.status);
log("Response: " + xhr.responseText);
};
xhr.onerror = function()
{
log("Error event is dispatched");
};
xhr.onloadend = function()
{
resolve();
};
xhr.open(method, url, true);
try {
xhr.send();
} catch (error) {
log("Received exception, code: " + error.code + ", name: " + error.name + ", message: " + replaceUUID(error.message));
}
});
}
function sendXMLHttpRequestAsyncWithBlobSlice(method, url)
{
return new Promise(function (resolve) {
var xhr = new XMLHttpRequest();
xhr.responseType = 'blob';
var blob_read = false;
var onloadend_called = false;
xhr.onload = function()
{
log("Status: " + xhr.status);
var blob = xhr.response.slice(0, 1);
var reader = new FileReader();
reader.addEventListener("loadend", function()
{
log("First byte of response: " + reader.result);
blob_read = true;
if (onloadend_called)
resolve();
});
reader.readAsText(blob);
};
xhr.onerror = function()
{
log("Error event is dispatched");
};
xhr.onloadend = function()
{
onloadend_called = true;
if (blob_read)
resolve();
};
xhr.open(method, url, true);
try {
xhr.send();
} catch (error) {
log("Received exception, code: " + error.code + ", name: " + error.name + ", message: " + replaceUUID(error.message));
}
});
}
function runXHRs(file)
{
var fileURL = URL.createObjectURL(file);
log("Test that sync XMLHttpRequest GET succeeds.");
sendXMLHttpRequestSync("GET", fileURL);
log("Test that sync XMLHttpRequest POST fails.");
sendXMLHttpRequestSync("POST", fileURL);
log("Test that sync XMLHttpRequest GET fails after the blob URL is revoked.");
URL.revokeObjectURL(fileURL);
sendXMLHttpRequestSync("GET", fileURL);
fileURL = URL.createObjectURL(file);
log("Test that async XMLHttpRequest GET succeeds.");
sendXMLHttpRequestAsync("GET", fileURL).then(function()
{
log("Test that async XMLHttpRequest POST fails.");
return sendXMLHttpRequestAsync("POST", fileURL);
}).then(function()
{
log("Test the slicing the blob response doesn't crash the browser.")
return sendXMLHttpRequestAsyncWithBlobSlice("GET", fileURL);
}).then(function()
{
log("Test that async XMLHttpRequest GET fails after the blob URL is revoked.");
URL.revokeObjectURL(fileURL);
return sendXMLHttpRequestAsync("GET", fileURL);
}).then(function()
{
log("DONE");
if (!self.importScripts && testRunner.notifyDone)
testRunner.notifyDone();
});
}
if (self.importScripts) {
onmessage = function(event)
{
runXHRs(event.data);
};
}