<html>
<head>
<title>Test XMLHttpRequest zero-length response handling (async)</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<body>
<p>Test for <a href="https://bugs.webkit.org/show_bug.cgi?id=5924">bug 5924</a>
- zero-length responses to XMLHTTPRequest mishandled.</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 get(url, async)
    {
        if (window.XMLHttpRequest) {
            req = new XMLHttpRequest();
        } else {
            try {
                req = new ActiveXObject("Msxml2.XMLHTTP");
            } catch (ex) {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            }
        }
        
        log("after creation: " + stateName(req.readyState));
        
        dumpResponse();

        if (async)
            req.onreadystatechange = processStateChange;
        
        log("after setting onreadystatechange: " + stateName(req.readyState));

        req.open('GET', url, async);
        log("after open(): " + stateName(req.readyState));
        dumpResponse();
        
        try {
            req.overrideMimeType('text/xml');
            log("after overrideMimeType(): " + stateName(req.readyState));
        } catch (ex) {
            log("overrideMimeType(): " + ex);
        }

        req.send(null);
        log("after send(): " + stateName(req.readyState));

        if (!async && req.status != 200)
            throw ("HTTP request failed, status: " + req.status);
        
        return req;
    }
    
    function stateName(val) {
      if (req.readyState == 0)
          return "Uninitialized";
      else if (req.readyState == 1)
          return "Open";
      else if (req.readyState == 2)
          return "Sent";
      else if (req.readyState == 3)
          return "Receiving";
      else if (req.readyState == 4)
          return "Loaded";
      else
        return "???";
    }
    
    function prettyPrintText(text) {
        if (text == null)
            return text;
        return '"' + text + '"';
    }
    
    function dumpResponse() {

       try { log ("  Status: " + req.status); } catch (ex) { log("  Exception getting status: " + ex.message); }
       try { log ("  StatusText: " + prettyPrintText(req.statusText)); } catch (ex) { log("  Exception getting StatusText: " + ex.message); }
       try { log ("  ResponseText: " + prettyPrintText(req.responseText)); } catch (ex) { log("  Exception getting ResponseText: " + ex.message); }
       try { log ("  ResponseXML: " + req.responseXML); } catch (ex) { log("  Exception getting ResponseXML: " + ex.message); }
       try { log ("  ResponseXML serialized: " + (req.responseXML ? prettyPrintText(window.XMLSerializer ? (new XMLSerializer()).serializeToString(req.responseXML) : req.responseXML.xml) : "n/a")); } catch (ex) { log("  Exception serializing ResponseXML: " + ex.message); }
    }

    function processStateChange() {
       log("onreadystatechange: " + stateName(req.readyState));
       dumpResponse();
       if (req.readyState == 4) {
           if (window.testRunner)
               testRunner.notifyDone();
       }
    }
    
    // start async steps
    get('resources/zero-length.xml', true);
    
</script>
</body>
</html>
