| <html> | |
| <body> | |
| <p>Test Range support in XMLHttpRequest</p> | |
| <script> | |
| if (window.testRunner) { | |
| testRunner.dumpAsText(); | |
| testRunner.waitUntilDone(); | |
| } | |
| var console_messages = document.createElement("ul"); | |
| document.body.appendChild(console_messages); | |
| function log(message) | |
| { | |
| var item = document.createElement("li"); | |
| item.appendChild(document.createTextNode(message)); | |
| console_messages.appendChild(item); | |
| } | |
| function getRange(url, start, end, useUniqueUrls, fullResponse, done_callback) { | |
| log("getRange(" + url + ", " + start + ", " + end + ", " + useUniqueUrls + ")"); | |
| var req = new XMLHttpRequest; | |
| if (useUniqueUrls) | |
| url = url + "?q=" + start + "-" + end; | |
| req.open("GET", url, true); | |
| req.setRequestHeader("Range", "bytes=" + start + "-" + (end - 1)); | |
| req.responseType = 'arraybuffer'; | |
| req.onreadystatechange = function() { | |
| if (req.readyState == 4) { | |
| if (req.status != 206) | |
| log("Expected a 206 response, got " + req.status); | |
| var expected = fullResponse.subarray(start, end); | |
| var actual = new Uint8Array(req.response); | |
| log("Length : expected " + expected.length + " got " + actual.length); | |
| if (expected.length == actual.length) { | |
| // Verify that all the data is what we expect. | |
| for (var i = 0; i < expected.length; ++i) { | |
| if (actual[i] != expected[i]) { | |
| log("actual[" + i + "] != expected[" + i + "] (" + actual[i] + " != " + expected[i] + ")"); | |
| } | |
| } | |
| } | |
| done_callback(); | |
| } | |
| }; | |
| req.send(null); | |
| } | |
| function runRangeTest(useUniqueUrls, done_callback) { | |
| // First fetch full resource. | |
| var url = "resources/reply.xml"; | |
| var req = new XMLHttpRequest; | |
| req.open("GET", url, true); | |
| req.responseType = 'arraybuffer'; | |
| req.onreadystatechange = function() { | |
| if (req.readyState == 4) { | |
| var fullResponse = new Uint8Array(req.response); | |
| var startOffset = fullResponse.length / 2; | |
| var endOffset = startOffset + 2; | |
| // Next fetch a subrange in the middle of the resource. | |
| getRange(url, startOffset, endOffset, useUniqueUrls, fullResponse, function() { | |
| // Fetch a different range near the middle of the resource. | |
| getRange(url, startOffset + 1, endOffset + 2, useUniqueUrls, fullResponse, function() { | |
| done_callback(); | |
| }); | |
| }); | |
| } | |
| }; | |
| req.send(null); | |
| } | |
| // First test range requests using the exact same URL. | |
| runRangeTest(false, function() { | |
| // Next test w/ a query parameter appended so that each XHR | |
| // has a unique URL. | |
| runRangeTest(true, function() { | |
| if (window.testRunner) | |
| testRunner.notifyDone(); | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |