<svg version="1.1" baseProfile="tiny" 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.8 $" testname="$RCSfile: struct-dom-04-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-04-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.svg.all";
      featureStrings[length++] = "org.w3c.dom.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.8 $</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>
