chromium/third_party/blink/web_tests/fast/dom/Range/range-processing-instructions.html

<div>Test that Range manipulations work with ProcessingInstruction nodes.</div>
<script>
  if (window.testRunner)
    testRunner.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>