<?xml version="1.0"?>
<!-- 
   - The contents of this file are subject to the Mozilla Public
   - License Version 1.1 (the "License"); you may not use this file
   - except in compliance with the License. You may obtain a copy of
   - the License at http://www.mozilla.org/MPL/
   - 
   - Software distributed under the License is distributed on an "AS
   - IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
   - implied. See the License for the specific language governing
   - rights and limitations under the License.
   - 
   - The Original Code is Mozilla Test Cases.
   - 
   - The Initial Developer of the Original Code is Netscape Communications
   - Corp.  Portions created by Netscape Communications Corp. are 
   - Copyright (C) 2001 Netscape Communications Corp.  All
   - Rights Reserved.
   - 
   - Contributor(s): 
  -->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>GET test</title>
<style type="text/css">
.box {
  display: box;
  border: 1px solid black;
  margin-bottom: 0.5em;
}
.boxheader {
  font-weight: bold;
  color: maroon;
}
pre {
  margin-left: 2em;
}
</style>
<script type="text/javascript">
var p = new XMLHttpRequest();

if (window.testRunner) {
  testRunner.dumpAsText();
  testRunner.waitUntilDone();
}

function myfunc(e)
{
  document.getElementById("id1").firstChild.nodeValue = p.responseText;
  if (p.responseXML) {
    var s = new XMLSerializer();
    var d = p.responseXML;
    var str = s.serializeToString(d);
    document.getElementById("id2").firstChild.nodeValue = str;
  }
  document.getElementById("id3").firstChild.nodeValue = p.getAllResponseHeaders();
  document.getElementById("id4").firstChild.nodeValue = p.status;
  document.getElementById("id5").firstChild.nodeValue = p.statusText;
  document.getElementById("id6").firstChild.nodeValue = p.readyState;
  var propNames = new Array;
  for (prop in e) {
    if (prop != "timeStamp") {
        propNames.push(prop);
    }
  }
  propNames.sort();
  var eventProperties = "";
  for (i in propNames) {
        var prop = propNames[i];
        eventProperties += prop + " : '" + e[prop] + "'\n";
  }
  
  document.getElementById("id7").firstChild.nodeValue = 
    "Event object: " + e + "\n" +
    "Event properties:\n" + eventProperties;

  if (window.testRunner)
    testRunner.notifyDone();
}

p.onload = myfunc;
p.open("GET", "resources/xmlhttprequest-get-data.xml");

function mysend()
{
  p.send(null);
}
</script>
</head>
<body onload="mysend();">
<h1>GET test</h1>

<div class="box"><span class="boxheader">responseText</span>
<pre id="id1">@@No result@@</pre>
</div>
<div class="box"><span class="boxheader">responseXML serialized</span>
<pre id="id2">@@No result@@</pre>
</div>
<div class="box"><span class="boxheader">getAllResponseHeaders()</span>
<pre id="id3">@@No result@@</pre>
</div>
<div class="box"><span class="boxheader">status</span>
<pre id="id4">@@No result@@</pre>
</div>
<div class="box"><span class="boxheader">statusText</span>
<pre id="id5">@@No result@@</pre>
</div>
<div class="box"><span class="boxheader">readyState</span>
<pre id="id6">@@No result@@</pre>
</div>
<div class="box"><span class="boxheader">Event information</span>
<pre id="id7">@@No result@@</pre>
</div>

</body>
</html>
