<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="ED" author="Vincent Hardy" status="accepted"
    version="$Revision: 1.8 $" testname="$RCSfile: struct-dom-03-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-03-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++] = "uievents";
      featureStrings[length++] = "mouseevents";
      featureStrings[length++] = "mutationevents";
      featureStrings[length++] = "traversal";
      featureStrings[length++] = "org.w3c.svg";
      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 addTextElement for x coord, and test if i < 9
      //
      addTextElement(featureStrings[i], supports, doc, doc.getElementById("test-body-content"), (50 + 50*i));
      }
      }

      function addTextElement(label, value, doc, svg, y){
      var newText = doc.createElementNS(svg_ns, 'text');
      newText.setAttribute('font-size', '30');
      newText.setAttribute('x', '10');
      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', '370');
      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>
