<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>DOM Traversal: NodeIterator: Filters</title>
  <script type="text/javascript"> <![CDATA[
    function doTest() {
      if (window.testRunner) testRunner.dumpAsText();
      var iterator = document.createNodeIterator(document, NodeFilter.SHOW_ALL, testFilter, false);
      // skips text nodes and body element
      var expected = new Array(9, // document
                               1, // html
                               1, // head
                               1, // title
                               1, 4, // script and CDATA block
                               // body (skipped)
                               1, // pre
                               // </body>
                               8, // <!-- -->
                               // PI skipped
                               4); // CDATA
      var found = new Array();

      // walk document
      var node;
      while (node = iterator.nextNode())
        found.push(node.nodeType);

      // check results
      var errors = 0;
      var s = '';
      var length = (found.length > expected.length) ? found.length : expected.length;
      s += 'EXPECTED  FOUND\n';
      for (var i = 0; i < length; i += 1) {
        s += '  ' + (expected[i] ? expected[i] : '-') +
      '         ' + (found[i] ? found[i] : '-');
        if (found[i] != expected[i]) {
          s += '      MISMATCH';
          errors += 1;
        }
        s += '\n';
      }
      var p = document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', 'pre')[0];
      if (errors)
        p.firstChild.data = 'FAIL: ' + errors + ' errors found:\n\n' + s;
      else
        p.firstChild.data = 'PASS';
    }

    function testFilter(n) {
      if (n.nodeType == 3) {
        return NodeFilter.FILTER_SKIP;
      } else if (n.nodeName == 'body') {
        return NodeFilter.FILTER_REJECT; // same as _SKIP
      }
      return 1; // FILTER_ACCEPT
    }

  ]]></script>
 </head>
 <body onload="doTest()">
  <pre id="result">FAIL: Script failed to run.</pre>
 </body>
 <!-- some more nodes to test this: -->
 <?body test?>
 <![CDATA[ ]]>
</html>