<!-- 
   - 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>
<head>
<title>DOMParser/XMLSerializer test</title>
<style type="text/css">
.box {
  display: box;
  border: 1px solid black;
  margin-bottom: 0.5em;
}
pre {
  margin-left: 2em;
}
</style>
<script type="text/javascript">

if (window.testRunner)
    testRunner.dumpAsText();

function execute()
{
  var parser = new DOMParser();
  var str = 
    '<?xml version="1.0"?>\n<?xml-stylesheet href="display.css" type="text/css"?>\n<!DOCTYPE doc [\n<!ATTLIST d id ID #IMPLIED>\n]>\n<doc>\n  <foo xmlns="foobar">One</foo> <x:bar xmlns:x="barfoo">Two</x:bar>\n  <d id="id3">Three</d>\n</doc>\n';
  var doc = parser.parseFromString(str,"text/xml");
 
  document.getElementById("id1").firstChild.nodeValue = str;
  document.getElementById("id2").firstChild.nodeValue = doc;
  var ser = new XMLSerializer();
  document.getElementById("id3").firstChild.nodeValue = ser.serializeToString(doc);
}

</script>
</head>
<body onload="execute();">
<h1>DOMParser/XMLSerializer test</h1>

<div>The "text to parse" and "document object serialized" boxes should show the same text, and it should be an XML document, not "@@No result@@".
</div>

<div class="box"><h2>text to parse</h2>
<pre id="id1">@@No result@@</pre>
</div>
<br>
<div class="box"><h2>document object</h2>
<pre id="id2">@@No result@@</pre>
</div>
<br>
<div class="box"><h2>document object serialized</h2>
<pre id="id3">@@No result@@</pre>
</div>

</body>
</html>
