2008-01-31 00:16:54 -08:00
|
|
|
<!DOCTYPE HTML>
|
|
|
|
<html>
|
|
|
|
<head>
|
2008-03-25 19:46:08 -07:00
|
|
|
<title>Test for XMLHttpRequest</title>
|
2008-01-31 00:16:54 -08:00
|
|
|
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
|
|
|
|
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
|
|
|
|
</head>
|
|
|
|
<body>
|
|
|
|
<p id="display"></p>
|
|
|
|
<div id="content" style="display: none">
|
|
|
|
|
|
|
|
</div>
|
|
|
|
<pre id="test">
|
|
|
|
<script class="testbody" type="text/javascript">
|
2011-05-10 16:18:55 -07:00
|
|
|
SimpleTest.waitForExplicitFinish();
|
2008-01-31 00:16:54 -08:00
|
|
|
|
2008-03-25 19:46:08 -07:00
|
|
|
var path = "/tests/content/base/test/";
|
2008-01-31 00:16:54 -08:00
|
|
|
|
2008-03-25 19:46:08 -07:00
|
|
|
var passFiles = [['file_XHR_pass1.xml', 'GET'],
|
|
|
|
['file_XHR_pass2.txt', 'GET'],
|
|
|
|
['file_XHR_pass3.txt', 'GET'],
|
2008-01-31 00:16:54 -08:00
|
|
|
];
|
|
|
|
|
2008-03-25 19:46:08 -07:00
|
|
|
var failFiles = [['//example.com' + path + 'file_XHR_pass1.xml', 'GET'],
|
|
|
|
['ftp://localhost' + path + 'file_XHR_pass1.xml', 'GET'],
|
|
|
|
['file_XHR_fail1.txt', 'GET'],
|
2008-01-31 00:16:54 -08:00
|
|
|
];
|
|
|
|
|
|
|
|
for (i = 0; i < passFiles.length; ++i) {
|
|
|
|
xhr = new XMLHttpRequest();
|
2011-05-18 22:11:51 -07:00
|
|
|
is(xhr.responseType, "", "wrong initial responseType");
|
2008-01-31 00:16:54 -08:00
|
|
|
xhr.open(passFiles[i][1], passFiles[i][0], false);
|
|
|
|
xhr.send(null);
|
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
if (xhr.responseXML) {
|
|
|
|
is((new XMLSerializer()).serializeToString(xhr.responseXML.documentElement),
|
|
|
|
"<res>hello</res>",
|
2011-05-10 16:18:55 -07:00
|
|
|
"wrong responseXML");
|
2011-05-18 22:11:51 -07:00
|
|
|
is(xhr.response, "<res>hello</res>\n", "wrong response");
|
2008-01-31 00:16:54 -08:00
|
|
|
}
|
|
|
|
else {
|
2011-05-10 16:18:55 -07:00
|
|
|
is(xhr.responseText, "hello pass\n", "wrong responseText");
|
2011-05-18 22:11:51 -07:00
|
|
|
is(xhr.response, "hello pass\n", "wrong response");
|
2008-01-31 00:16:54 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (i = 0; i < failFiles.length; ++i) {
|
|
|
|
xhr = new XMLHttpRequest();
|
2008-03-25 19:46:08 -07:00
|
|
|
didthrow = false;
|
2008-01-31 00:16:54 -08:00
|
|
|
try {
|
|
|
|
xhr.open(failFiles[i][1], failFiles[i][0], false);
|
|
|
|
xhr.send(null);
|
|
|
|
}
|
|
|
|
catch (e) {
|
2008-03-25 19:46:08 -07:00
|
|
|
didthrow = true;
|
|
|
|
}
|
|
|
|
if (!didthrow) {
|
|
|
|
is(xhr.status, 301, "wrong status");
|
|
|
|
is(xhr.responseText, "redirect file\n", "wrong response");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ok(1, "should have thrown or given incorrect result");
|
2008-01-31 00:16:54 -08:00
|
|
|
}
|
|
|
|
}
|
2010-08-14 10:52:19 -07:00
|
|
|
|
2011-05-10 16:18:55 -07:00
|
|
|
// test response (responseType='document')
|
|
|
|
function checkResponseTextAccessThrows(xhr) {
|
|
|
|
var didthrow = false;
|
|
|
|
try { xhr.responseText } catch (e) { didthrow = true; }
|
|
|
|
ok(didthrow, "should have thrown when accessing responseText");
|
|
|
|
}
|
|
|
|
function checkResponseXMLAccessThrows(xhr) {
|
|
|
|
var didthrow = false;
|
|
|
|
try { xhr.responseXML } catch (e) { didthrow = true; }
|
|
|
|
ok(didthrow, "should have thrown when accessing responseXML");
|
|
|
|
}
|
2011-09-23 18:57:36 -07:00
|
|
|
function checkResponseAccessThrows(xhr) {
|
|
|
|
var didthrow = false;
|
|
|
|
try { xhr.response } catch (e) { didthrow = true; }
|
|
|
|
ok(didthrow, "should have thrown when accessing response");
|
|
|
|
}
|
|
|
|
function checkSetResponseTypeThrows(xhr, type) {
|
2011-05-10 16:18:55 -07:00
|
|
|
var didthrow = false;
|
2011-09-23 18:57:36 -07:00
|
|
|
try { xhr.responseType = type; } catch (e) { didthrow = true; }
|
|
|
|
ok(didthrow, "should have thrown when setting responseType");
|
2011-05-10 16:18:55 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
xhr = new XMLHttpRequest();
|
2011-09-23 18:57:36 -07:00
|
|
|
checkSetResponseTypeThrows(xhr, "document");
|
2011-05-10 16:18:55 -07:00
|
|
|
xhr.open("GET", 'file_XHR_pass1.xml', false);
|
2011-09-23 18:57:36 -07:00
|
|
|
checkSetResponseTypeThrows(xhr, "moz-chunked-text");
|
|
|
|
checkSetResponseTypeThrows(xhr, "moz-chunked-arraybuffer");
|
2011-05-18 22:11:51 -07:00
|
|
|
xhr.responseType = 'document';
|
2011-05-10 16:18:55 -07:00
|
|
|
xhr.send(null);
|
2011-09-23 18:57:36 -07:00
|
|
|
checkSetResponseTypeThrows(xhr, "document");
|
2011-05-10 16:18:55 -07:00
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
checkResponseTextAccessThrows(xhr);
|
2011-05-18 22:11:51 -07:00
|
|
|
is((new XMLSerializer()).serializeToString(xhr.response.documentElement),
|
2011-05-10 16:18:55 -07:00
|
|
|
"<res>hello</res>",
|
|
|
|
"wrong response");
|
|
|
|
|
|
|
|
// test response (responseType='text')
|
|
|
|
xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("GET", 'file_XHR_pass2.txt', false);
|
2011-05-18 22:11:51 -07:00
|
|
|
xhr.responseType = 'text';
|
2011-05-10 16:18:55 -07:00
|
|
|
xhr.send(null);
|
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
checkResponseXMLAccessThrows(xhr);
|
2011-05-18 22:11:51 -07:00
|
|
|
is(xhr.response, "hello pass\n", "wrong response");
|
2011-05-10 16:18:55 -07:00
|
|
|
|
|
|
|
// test response (responseType='arraybuffer')
|
|
|
|
function arraybuffer_equals_to(ab, s) {
|
|
|
|
is(ab.byteLength, s.length, "wrong arraybuffer byteLength");
|
|
|
|
|
|
|
|
u8v = new Uint8Array(ab);
|
|
|
|
is(String.fromCharCode.apply(String, u8v), s, "wrong values");
|
|
|
|
}
|
2010-08-14 10:52:19 -07:00
|
|
|
|
|
|
|
// with a simple text file
|
|
|
|
xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("GET", 'file_XHR_pass2.txt', false);
|
2011-05-18 22:11:51 -07:00
|
|
|
xhr.responseType = 'arraybuffer';
|
2010-08-14 10:52:19 -07:00
|
|
|
xhr.send(null);
|
|
|
|
is(xhr.status, 200, "wrong status");
|
2011-05-10 16:18:55 -07:00
|
|
|
checkResponseTextAccessThrows(xhr);
|
|
|
|
checkResponseXMLAccessThrows(xhr);
|
2011-05-18 22:11:51 -07:00
|
|
|
ab = xhr.response;
|
2010-08-14 10:52:19 -07:00
|
|
|
ok(ab != null, "should have a non-null arraybuffer");
|
2011-05-10 16:18:55 -07:00
|
|
|
arraybuffer_equals_to(ab, "hello pass\n");
|
2010-08-14 10:52:19 -07:00
|
|
|
|
2011-08-24 09:33:31 -07:00
|
|
|
// test reusing the same XHR (Bug 680816)
|
|
|
|
xhr.open("GET", 'file_XHR_binary1.bin', false);
|
|
|
|
xhr.responseType = 'arraybuffer';
|
|
|
|
xhr.send(null);
|
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
ab2 = xhr.response;
|
|
|
|
ok(ab2 != null, "should have a non-null arraybuffer");
|
|
|
|
ok(ab2 != ab, "arraybuffer on XHR reuse should be distinct");
|
|
|
|
arraybuffer_equals_to(ab, "hello pass\n");
|
|
|
|
arraybuffer_equals_to(ab2, "\xaa\xee\0\x03\xff\xff\xff\xff\xbb\xbb\xbb\xbb");
|
|
|
|
|
2010-08-14 10:52:19 -07:00
|
|
|
// with a binary file
|
|
|
|
xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("GET", 'file_XHR_binary1.bin', false);
|
2011-05-18 22:11:51 -07:00
|
|
|
xhr.responseType = 'arraybuffer';
|
2010-08-14 10:52:19 -07:00
|
|
|
xhr.send(null)
|
|
|
|
is(xhr.status, 200, "wrong status");
|
2011-05-10 16:18:55 -07:00
|
|
|
checkResponseTextAccessThrows(xhr);
|
|
|
|
checkResponseXMLAccessThrows(xhr);
|
2011-05-18 22:11:51 -07:00
|
|
|
ab = xhr.response;
|
2010-08-14 10:52:19 -07:00
|
|
|
ok(ab != null, "should have a non-null arraybuffer");
|
2011-05-10 16:18:55 -07:00
|
|
|
arraybuffer_equals_to(ab, "\xaa\xee\0\x03\xff\xff\xff\xff\xbb\xbb\xbb\xbb");
|
2011-09-23 18:57:36 -07:00
|
|
|
is(xhr.response, xhr.response, "returns the same ArrayBuffer");
|
2011-05-10 16:18:55 -07:00
|
|
|
|
2011-09-23 18:57:36 -07:00
|
|
|
// test response (responseType='moz-json')
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("POST", 'responseIdentical.sjs', false);
|
|
|
|
xhr.responseType = 'moz-json';
|
|
|
|
jsonObjStr = JSON.stringify({title: "aBook", author: "john"});
|
|
|
|
xhr.send(jsonObjStr);
|
2011-05-23 18:09:28 -07:00
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
checkResponseTextAccessThrows(xhr);
|
|
|
|
checkResponseXMLAccessThrows(xhr);
|
2011-09-23 18:57:36 -07:00
|
|
|
is(JSON.stringify(xhr.response), jsonObjStr, "correct result");
|
|
|
|
is(xhr.response, xhr.response, "returning the same object on each access");
|
|
|
|
|
|
|
|
// with invalid json
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("POST", 'responseIdentical.sjs', false);
|
|
|
|
xhr.responseType = 'moz-json';
|
|
|
|
xhr.send("{");
|
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
checkResponseTextAccessThrows(xhr);
|
|
|
|
checkResponseXMLAccessThrows(xhr);
|
|
|
|
checkResponseAccessThrows(xhr);
|
|
|
|
checkResponseAccessThrows(xhr); // Check twice to ensure that we still throw
|
2011-05-23 18:09:28 -07:00
|
|
|
|
2011-05-10 16:18:55 -07:00
|
|
|
// test response (responseType='blob')
|
|
|
|
var onloadCount = 0;
|
|
|
|
function checkOnloadCount() {
|
2011-09-27 01:40:36 -07:00
|
|
|
if (++onloadCount >= 3) SimpleTest.finish();
|
2011-05-10 16:18:55 -07:00
|
|
|
};
|
|
|
|
|
|
|
|
// with a simple text file
|
|
|
|
xhr = new XMLHttpRequest();
|
|
|
|
xhr.open("GET", 'file_XHR_pass2.txt', false);
|
2011-05-18 22:11:51 -07:00
|
|
|
xhr.responseType = 'blob';
|
2011-05-10 16:18:55 -07:00
|
|
|
xhr.send(null);
|
|
|
|
is(xhr.status, 200, "wrong status");
|
|
|
|
checkResponseTextAccessThrows(xhr);
|
|
|
|
checkResponseXMLAccessThrows(xhr);
|
2011-05-18 22:11:51 -07:00
|
|
|
b = xhr.response;
|
2011-05-10 16:18:55 -07:00
|
|
|
ok(b, "should have a non-null blob");
|
2011-06-30 14:42:15 -07:00
|
|
|
ok(b instanceof Blob, "should be a Blob");
|
|
|
|
ok(!(b instanceof File), "should not be a File");
|
2011-05-10 16:18:55 -07:00
|
|
|
is(b.size, "hello pass\n".length, "wrong blob size");
|
|
|
|
|
2011-05-11 11:06:47 -07:00
|
|
|
var fr = new FileReader();
|
2011-05-10 16:18:55 -07:00
|
|
|
fr.onload = function() {
|
|
|
|
ok(fr.result, "hello pass\n", "wrong values");
|
|
|
|
checkOnloadCount();
|
|
|
|
};
|
|
|
|
fr.readAsBinaryString(b);
|
2010-08-14 10:52:19 -07:00
|
|
|
|
2011-05-10 16:18:55 -07:00
|
|
|
// with a binary file
|
2011-09-27 01:40:36 -07:00
|
|
|
(function(){
|
|
|
|
var xhr = new XMLHttpRequest();
|
2011-05-10 16:18:55 -07:00
|
|
|
xhr.onreadystatechange = function() {
|
|
|
|
switch (xhr.readyState) {
|
|
|
|
case 2:
|
|
|
|
is(xhr.status, 200, "wrong status");
|
2011-05-18 22:11:51 -07:00
|
|
|
xhr.responseType = 'blob';
|
2011-05-10 16:18:55 -07:00
|
|
|
break;
|
|
|
|
case 4:
|
2011-05-18 22:11:51 -07:00
|
|
|
b = xhr.response;
|
2011-05-10 16:18:55 -07:00
|
|
|
ok(b != null, "should have a non-null blob");
|
|
|
|
is(b.size, 12, "wrong blob size");
|
|
|
|
|
2011-05-11 11:06:47 -07:00
|
|
|
var fr = new FileReader();
|
2011-05-10 16:18:55 -07:00
|
|
|
fr.onload = function() {
|
|
|
|
is(fr.result, "\xaa\xee\0\x03\xff\xff\xff\xff\xbb\xbb\xbb\xbb", "wrong values");
|
|
|
|
checkOnloadCount();
|
|
|
|
};
|
|
|
|
xhr = null; // kill the XHR object
|
|
|
|
SpecialPowers.gc();
|
|
|
|
fr.readAsBinaryString(b);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
xhr.open("GET", 'file_XHR_binary1.bin', true);
|
|
|
|
xhr.send(null);
|
2011-09-27 01:40:36 -07:00
|
|
|
})();
|
|
|
|
|
|
|
|
(function(){
|
|
|
|
// with a larger binary file
|
|
|
|
var xhr = new XMLHttpRequest();
|
|
|
|
xhr.onreadystatechange = function() {
|
|
|
|
if (xhr.readyState == 4) {
|
|
|
|
b = xhr.response;
|
|
|
|
ok(b != null, "should have a non-null blob");
|
|
|
|
is(b.size, 65536, "wrong blob size");
|
|
|
|
|
|
|
|
var fr = new FileReader();
|
|
|
|
fr.onload = function() {
|
|
|
|
var u8 = new Uint8Array(fr.result);
|
|
|
|
for (var i = 0; i < 65536; i++) {
|
|
|
|
if (u8[i] !== (i & 255)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
is(i, 65536, "wrong value at offset " + i);
|
|
|
|
checkOnloadCount();
|
|
|
|
};
|
|
|
|
xhr = null; // kill the XHR object
|
|
|
|
SpecialPowers.gc();
|
|
|
|
fr.readAsArrayBuffer(b);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
xhr.open("GET", 'file_XHR_binary2.bin', true);
|
|
|
|
xhr.responseType = 'blob';
|
|
|
|
xhr.send(null);
|
|
|
|
})();
|
2010-08-14 10:52:19 -07:00
|
|
|
|
2010-11-11 13:39:14 -08:00
|
|
|
var client = new XMLHttpRequest();
|
|
|
|
client.onreadystatechange = function() {
|
|
|
|
if(client.readyState == 4) {
|
|
|
|
try {
|
|
|
|
is(client.responseXML, null, "responseXML should be null.");
|
|
|
|
is(client.responseText, "", "responseText should be empty string.");
|
2011-05-18 22:11:51 -07:00
|
|
|
is(client.response, "", "response should be empty string.");
|
2010-11-11 13:39:14 -08:00
|
|
|
is(client.status, 0, "status should be 0.");
|
|
|
|
is(client.statusText, "", "statusText should be empty string.");
|
|
|
|
is(client.getAllResponseHeaders(), "",
|
|
|
|
"getAllResponseHeaders() should return empty string.");
|
|
|
|
} catch(ex) {
|
|
|
|
ok(false, "Shouldn't throw! [" + ex + "]");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
client.open("GET", "file_XHR_pass1.xml", true);
|
|
|
|
client.send();
|
|
|
|
client.abort();
|
|
|
|
|
2008-01-31 00:16:54 -08:00
|
|
|
</script>
|
|
|
|
</pre>
|
|
|
|
</body>
|
|
|
|
</html>
|