<svg version="1.1" baseProfile="basic" onload="domTest(evt)" id="svg-root"
  width="100%" height="100%" viewBox="0 0 480 360"
  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <!--======================================================================-->
  <!--=  SVG 1.1 2nd Edition Test Case                                     =-->
  <!--======================================================================-->
  <!--=  Copyright 2009 World Wide Web Consortium, (Massachusetts          =-->
  <!--=  Institute of Technology, European Research Consortium for         =-->
  <!--=  Informatics and Mathematics (ERCIM), Keio University).            =-->
  <!--=  All Rights Reserved.                                              =-->
  <!--=  See http://www.w3.org/Consortium/Legal/.                          =-->
  <!--======================================================================-->
  <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
    template-version="1.4" reviewer="SVGWG" author="Vincent Hardy" status="accepted"
    version="$Revision: 1.7 $" testname="$RCSfile: struct-dom-05-b.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#DOMInterfaces">
        <p>
          Verify the basic capability to handle the hasFeature DOMImplementation method.
          The DOMImplementation instance is retrieved from the Document instance. Then,
          its hasFeature method is invoked on the various SVG feature strings.
        </p>
        <p>
          The test displays the set of SVG feature strings and, next to them, a text
          string that shows whether the feature is supported or not.
        </p>
        <p>
          Note that this test uses the 'onload' event on the root svg element.
        </p>
    </d:testDescription>
    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
      <p>
        Run the test. No interaction required.
      </p>
    </d:operatorScript>
    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
      <p>
        The rendered picture should match the reference image, except for the true and
        false values which may differ depending on the implementation.
      </p>
      <p>
        Note that the test passes whether or not the feature is supported (i.e., true or
        false are valid). The test fails if no value (true or false) appears next to the feature string
        value.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-dom-05-b.svg,v $</title>
  <defs>
    <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
      <font-face-src>
        <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
      </font-face-src>
    </font-face>
  </defs>
  <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
    <script type="text/ecmascript"><![CDATA[

      var featureStrings = new Array();
      var length = 0;
      /*
      featureStrings[length++] = "xml";
      featureStrings[length++] = "stylesheets";
      featureStrings[length++] = "views";
      featureStrings[length++] = "css2";
      featureStrings[length++] = "events";
      featureStrings[length++] = "uievents	";
      featureStrings[length++] = "mouseevents";
      featureStrings[length++] = "mutationevents";
      featureStrings[length++] = "traversal";
      featureStrings[length++] = "org.w3c.svg";
      featureStrings[length++] = "org.w3c.svg.lang";
      featureStrings[length++] = "org.w3c.svg.dynamic";
      featureStrings[length++] = "org.w3c.svg.static";
      featureStrings[length++] = "org.w3c.dom.svg";
      featureStrings[length++] = "org.w3c.svg";
      */
      featureStrings[length++] = "org.w3c.dom.svg.static";
      featureStrings[length++] = "org.w3c.dom.svg.animation";
      featureStrings[length++] = "org.w3c.dom.svg.dynamic";
      featureStrings[length++] = "org.w3c.dom.svg.all";
      featureStrings[length++] = "org.w3c.svg.all";
      var svg_ns = "http://www.w3.org/2000/svg"
      function domTest(evt) {
      // Get Document
      var target = evt.target;
      var doc = target.ownerDocument;

      // Get DOMImplementation
      var domImpl = doc.implementation;

      //
      // Iterate through the feature strings
      //
      for(var i=0; i<featureStrings.length; i++){
      var supports = domImpl.hasFeature(featureStrings[i], '2.0');
      //
      // if time, pretty up by putting xml to traveral in a left column and
      // org.w3c.svg to org.w3c.dom.svg.all in a right column; add an extra
      // parameter to addTextElemen t for x coord, and test if i < 9
      //
      addTextElement(featureStrings[i], supports, doc, doc.getElementById("test-body-content"), (45 + 40*i));
      }
      }

      function addTextElement(label, value, doc, svg, y){
      var newText = doc.createElementNS(svg_ns, 'text');
      newText.setAttribute('font-size', '30');
      newText.setAttribute('x', '5');
      newText.setAttribute('y', y);
      var textValue = label;
      var textContent = doc.createTextNode(textValue);
      newText.appendChild(textContent);
      svg.appendChild(newText);

      newText = doc.createElementNS(svg_ns, 'text');
      newText.setAttribute('font-size', '30');
      newText.setAttribute('x', '385');
      newText.setAttribute('y', y);
      textValue =  value;
      textContent = doc.createTextNode(textValue);
      newText.appendChild(textContent);
      svg.appendChild(newText);
      }

    ]]></script>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.7 $</text>
  </g>
  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000000"/>
  <!-- comment out this watermark once the test is approved -->
  <!--<g id="draft-watermark">
    <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
    <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
      text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
  </g>-->
</svg>
