| 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); |
| }; |
| } |