<div>Test that Range manipulations work with ProcessingInstruction nodes.</div>
<script>
  if (window.layoutTestController)
    layoutTestController.dumpAsText();

  function dumpRange(range) {
      if (range.startContainer == range.endContainer)
          return range.startContainer.nodeName + " " + range.startOffset + " - " + range.endOffset;
      else
          return range.startContainer.nodeName + " " + range.startOffset + " - " + range.endContainer.nodeName + " " + range.endOffset;
  }

  var docString = "<foo><" + "?pi SUCC_FAILURE_ESS?><" + "?pi SUCC_FAILURE_ESS?></foo>";

  try {
    var doc = (new DOMParser).parseFromString(docString, "application/xml");
    var foo = doc.getElementsByTagName("foo")[0];

    var range = doc.createRange();
    range.setStart(foo.firstChild, 4);
    range.setEnd(foo.firstChild, 13);
    range.deleteContents();

    document.write("Test 1: " + foo.firstChild.data);
  } catch (ex) {
    document.write("Test 1: " + ex);
  }
  
  document.write("<br>");
  
  try {
    var doc = (new DOMParser).parseFromString(docString, "application/xml");
    var foo = doc.getElementsByTagName("foo")[0];

    var range = doc.createRange();
    range.setStart(foo.firstChild, 4);
    range.setEnd(foo.firstChild.nextSibling, 13);
    range.deleteContents();

    document.write("Test 2: " + foo.firstChild.data + foo.firstChild.nextSibling.data);
  } catch (ex) {
    document.write("Test 2: " + ex);
  }

  document.write("<br>");

  try {
    var doc = (new DOMParser).parseFromString(docString, "application/xml");
    var foo = doc.getElementsByTagName("foo")[0];

    var range = doc.createRange();
    range.setStart(foo, 0);
    range.setEnd(foo.firstChild, 2);
    var data1 = range.cloneContents().firstChild.data;

    range.setStart(foo.firstChild, 2);
    range.setEnd(foo.firstChild, 4);
    var data2 = range.cloneContents().firstChild.data;

    range.setStart(foo.firstChild.nextSibling, 13);
    range.setEnd(foo, 2);
    var data3 = range.cloneContents().firstChild.data;

    document.write("Test 3: " + data1 + data2 + data3);
  } catch (ex) {
    document.write("Test 3: " + ex);
  }
</script>
