<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="http://bugzilla.opendarwin.org/show_bug.cgi?id=5924">bug 5924</a>
- zero-length responses to XMLHTTPRequest mishandled.</p>
<script>

    if (window.layoutTestController)
        layoutTestController.dumpAsText();

    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();
    }
    
    // start async steps
    get('resources/zero-length.xml', true);
    
</script>
</body>
</html>
