| <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> |