blob: 89de6e3257aec46950e98a697c540b0fc3c14d73 [file] [log] [blame]
<html>
<head>
<title>Test XmlHttpRequest response encoding handling</title>
<meta http-equiv="content-type" content="text/html;charset=koi8-r">
<body>
<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=5744">bug 5744</a>
- correctly determine the encoding of XMLHttpRequest responses.</p>
<script>
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
var console_messages = document.createElement("ol");
document.body.appendChild(console_messages);
var asyncStep = 1;
function log(message)
{
var item = document.createElement("li");
item.appendChild(document.createTextNode(message));
console_messages.appendChild(item);
}
function get(url, async)
{
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (ex) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (async)
req.onreadystatechange = processStateChange;
req.open('GET', url, async);
req.send(null);
if (!async && req.status != 200)
throw ("HTTP request failed, status: " + req.status);
return req;
}
function getWithOverride(url, contentType, async)
{
if (window.XMLHttpRequest) {
req = new XMLHttpRequest();
} else {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch (ex) {
req = new ActiveXObject("Microsoft.XMLHTTP");
}
}
if (async)
req.onreadystatechange = processStateChange;
req.open('GET', url, async);
req.overrideMimeType(contentType);
req.send(null);
if (!async && req.status != 200)
throw ("HTTP request failed, status: " + req.status);
return req;
}
function processStateChange(){
if (req.readyState == 4){
if (req.status == 200){
if (asyncStep == 1) {
asyncStep = 2;
log("Async: Plain text, UTF-8 as default: " + req.responseText);
get('resources/reply2.txt', true);
} else if (asyncStep == 2) {
asyncStep = 3;
log("Async: Plain text, windows-1251 specified in HTTP headers: " + req.responseText);
getWithOverride('resources/reply3.txt', 'text/plain; charset=windows-1251', true);
} else if (asyncStep == 3) {
asyncStep = 4;
log("Async: Plain text, windows-1251 specified in overrideMimeType: " + req.responseText);
getWithOverride('resources/reply4.txt', 'text/plain; charset=windows-1251', true);
} else if (asyncStep == 4) {
asyncStep = 5;
log("Async: Plain text, koi8-r specified in HTTP headers, but overridden by windows-1251 in overrideMimeType: " + req.responseText);
get('resources/reply4.xml', true);
} else if (asyncStep == 5) {
asyncStep = 6;
log("Async: XML, UTF-8 as default: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
get('resources/reply.xml', true);
} else if (asyncStep == 6) {
asyncStep = 7;
log("Async: XML, windows-1251 specified in XML declaration: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
get('resources/reply2.xml', true);
} else if (asyncStep == 7) {
asyncStep = 8;
log("Async: XML, koi8-r specified in XML declaration, but overridden by windows-1251 in HTTP headers: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
getWithOverride('resources/reply3.xml', 'text/xml; charset=windows-1251', true);
} else if (asyncStep == 8) {
asyncStep = 9;
log("Async: XML, koi8-r specified in XML declaration, but overridden by windows-1251 in overrideMimeType: " +
(req.responseXML ? req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue : "<No responseXML>") + ". responseText: " + req.responseText);
get('resources/reply5.txt', true);
} else if (asyncStep == 9) {
asyncStep = 10;
log("Async: XML transferred as text/plain, UTF-8 as default (ignore XML text declaration): " + req.responseText);
get('resources/1251.html', true);
} else if (asyncStep == 10) {
asyncStep = 11;
log("Async: HTML, charset determined by a META: " + req.responseText.replace(/\s/g, "").replace(/.*<body>(.*)<\/body>.*/, "$1"));
get('resources/utf-8-no-charset.html', true);
} else if (asyncStep == 11) {
log("Async: HTML, UTF-8 as default: " + req.responseText.replace(/\s/g, "").replace(/.*<body>(.*)<\/body>.*/, "$1"));
if (window.testRunner)
testRunner.notifyDone();
}
} else {
log("Error loading URL: status " + req.status);
}
}
}
// sync code
// 1
try {
req = get('resources/reply.txt', false);
log("Plain text, UTF-8 as default: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 2
try {
req = get('resources/reply2.txt', false);
log("Plain text, windows-1251 specified in HTTP headers: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 3
try {
req = getWithOverride('resources/reply3.txt', 'text/plain; charset=windows-1251', false);
log("Plain text, windows-1251 specified in overrideMimeType: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 4
try {
req = getWithOverride('resources/reply4.txt', 'text/plain; charset=windows-1251', false);
log("Plain text, koi8-r specified in HTTP headers, but overridden by windows-1251 in overrideMimeType: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 5
try {
req = get('resources/reply4.xml', false);
log("XML, UTF-8 as default: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 6
try {
req = get('resources/reply.xml', false);
log("XML, windows-1251 specified in XML declaration: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 7
try {
req = get('resources/reply2.xml', false);
log("XML, koi8-r specified in XML declaration, but overridden by windows-1251 in HTTP headers: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 8
try {
req = getWithOverride('resources/reply3.xml', 'text/xml; charset=windows-1251', false);
log("XML, koi8-r specified in XML declaration, but overridden by windows-1251 in overrideMimeType: " + req.responseXML.getElementsByTagName('node')[0].childNodes[0].nodeValue + ". responseText: " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 9
try {
req = get('resources/reply5.txt', false);
log("XML transferred as text/plain, UTF-8 as default (ignore XML text declaration): " + req.responseText);
} catch (ex) {
log("Exception: " + ex.description);
}
// 10
try {
req = get('resources/1251.html', false);
log("HTML, charset determined by a META: " + req.responseText.replace(/\s/g, "").replace(/.*<body>(.*)<\/body>.*/, "$1"));
} catch (ex) {
log("Exception: " + ex.description);
}
// 11
try {
req = get('resources/utf-8-no-charset.html', false);
log("HTML, UTF-8 as default: " + req.responseText.replace(/\s/g, "").replace(/.*<body>(.*)<\/body>.*/, "$1"));
} catch (ex) {
log("Exception: " + ex.description);
}
// start async steps
get('resources/reply.txt', true);
// var console = document.createElement("p");
// console.appendChild(console_messages);
// document.body.appendChild(console);
</script>
</body>
</html>