<html>
<head>
<title>Test XmlHttpRequest response encoding handling</title>
</head>
<body>
<p>Test for <a href="http://bugs.webkit.org/show_bug.cgi?id=14288">bug 14288</a>:
XMLHttpRequest doesn't use a correct content type for file:// URLs.</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);
        
        return req;
    }

    function processStateChange(){
        if (req.readyState == 4) {
            log("Async: HTML, charset determined by a META: " + req.responseText.replace(/\s/g, "").replace(/.*<body>(.*)<\/body>.*/, "$1"));
            if (window.testRunner)
                testRunner.notifyDone();
        }
    }

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

    get('resources/1251.html', true);
    
</script>
</body>
</html>
