<svg 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">
  <!--======================================================================-->
  <!--=  Copyright 2008 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="CM" author="Microsoft" status="reviewed" version="$Revision: 1.3 $" testname="$RCSfile: struct-dom-17-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://dev.w3.org/SVG/profiles/1.1F2/publish/struct.html#InterfaceSVGSVGElement">
      <p>
        Tests that the 'getElementById' method for the 'SVGSVGElement' interface is scoped.
      </p>
      <p>
        Two subtrees of 'svg' elements are used, each with 'rect' elements as children. A reference to the first 'svg' element is obtained via the
        'document' element's 'getElementById' method. This reference is used to verify the presence of 'getElementId'. Next, 'getElementById' on
        the 'SVGSVGElement' reference is used to locate its child element. Then, 'getElementById' attempts to get an element in a neighboring subtree.
        Finally, an element at the sibling level is attempted to be accessed via 'getElementById'.
      </p>
    </d:testDescription>
    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
    </d:operatorScript>
    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
      <p>
        The test is passed if there is no red visible on the page.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-dom-17-f.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">
    <svg id="svgTree1">
        <rect id="subElem1" />
    </svg>
    <svg id="svgTree2">
        <rect id="subElem2" />
    </svg>
    <rect id="siblingElem1" />
    <g transform="translate(320,350)" font-size="50">
      <text id="failText" fill="red">FAIL</text>
      <text id="passText" fill="green" display="none">PASS</text>
    </g>
    <script type="text/javascript"><![CDATA[
        try
        {
            var passedCount = 0;
            var svgTree1 = document.getElementById("svgTree1");

            // Test support for "getElementById" on svgTree1
            var subElem1 = svgTree1.getElementById("subElem1");
            if (null != subElem1)
            {
                passedCount++;
            }

            if ("subElem1" == subElem1.id)
            {
                passedCount++;
            }

            // Test that "getElementById" on svgTree1 can't access children in other subtrees
            if (null == svgTree1.getElementById("subElem2"))
            {
                passedCount++;    
            }

            // Test that "getElementById" on svgTree1 can't access elements that are not its children
            if (null == svgTree1.getElementById("siblingElem1"))
            {
                passedCount++;    
            }

            if (4 == passedCount)
            {
                document.getElementById("failText").setAttribute("display", "none");
                document.getElementById("passText").setAttribute("display", "inline");
            }
        }
        catch(ex)
        {
            // alert('ERROR: ' + ex.message);
        }]]>
    </script>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.3 $</text>
  </g>
  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
  <!-- 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>
