<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="ED" author="CM" status="accepted"
    version="$Revision: 1.5 $" testname="$RCSfile: struct-dom-11-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGSVGElement">
      <p>
        This tests that the getIntersectionList() and getEnclosureList()
        methods return NodeLists that are not live.
      </p>
      <p>
        After loading the test, two rectangles will be presented.  The
        upper rectangle indicates the result of testing whether
        getIntersectionList() returns a non-live NodeList, while the
        lower rectangle indicates so for getEnclosureList().
      </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 test is passed if both rectangles are green.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-dom-11-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="sans-serif" font-size="18">

    <text x='10' y='40' font-size='13'>Test getIntersectionList and getEnclosureList return value liveness</text>

    <rect id='r1' x='10' y='70' width='50' height='50' fill='black'/>
    <text x='70' y='100'>getIntersectionList</text>

    <rect id='r2' x='10' y='130' width='50' height='50' fill='black'/>
    <text x='70' y='160'>getEnclosureList</text>

    <g id="g1" visibility="hidden" pointer-events="painted">
      <circle id='c1' cx='305' cy='100' r='5'/>
      <circle id='c2' cx='305' cy='150' r='5'/>
    </g>

    <script><![CDATA[

            function userspace2viewport(elm, r)
            {
                var ctm = elm.getCTM();

                var corners = [];
                for(var i = 0; i < 4; i++)
                    corners.push(svg.createSVGPoint());
                
                corners[0].x = r.x;
                corners[0].y = r.y;
                corners[1].x = r.x + r.width;
                corners[1].y = r.y;
                corners[2].x = r.x + r.width;
                corners[2].y = r.y + r.height;
                corners[3].x = r.x;
                corners[3].y = r.y + r.height;

                for(var i = 0; i < 4; i++)
                    corners[i] = corners[i].matrixTransform(ctm);
                
                var min = svg.createSVGPoint();
                var max = svg.createSVGPoint();
                min.x = corners[0].x;
                min.y = corners[0].y;
                max.x = corners[0].x;
                max.y = corners[0].y;
                
                for(var i = 1; i < 4; i++)
                {
                    var x = corners[i].x;
                    var y = corners[i].y;
                    
                    if(x < min.x)
                        min.x = x;
                    else if(x > max.x)
                        max.x = x;
                    
                    if(y < min.y)
                        min.y = y;
                    else if(y > max.y)
                        max.y = y;
                }
                
                var res = svg.createSVGRect();
                res.x = min.x;
                res.y = min.y;
                res.width = max.x - min.x;
                res.height = max.y - min.y;
                return res;
            }
        
      var svg = document.documentElement,
          c = document.getElementById('c'),
          r1 = document.getElementById('r1'),
          r2 = document.getElementById('r2'),
          c1 = document.getElementById('c1'),
          c2 = document.getElementById('c2'),
                    g1 = document.getElementById('g1'),
          r = svg.createSVGRect(),
          nl;

      try {
        r.x = 300;
        r.y = 95;
        r.width = 10;
        r.height = 10;
        
                r = userspace2viewport(g1, r);
        
        nl = svg.getIntersectionList(r, null);
        if (nl && nl.length == 1) {
          c1.parentNode.removeChild(c1);
          r1.setAttribute('fill', nl.length == 1 ? 'lime' : 'red');
        }
      } catch (e) {
      }

      try {
        r.x = 290;
        r.y = 135;
        r.width = 20;
        r.height = 20;

                r = userspace2viewport(g1, r);
                
        nl = svg.getEnclosureList(r, null);
        if (nl && nl.length == 1) {
          c2.parentNode.removeChild(c2);
          r2.setAttribute('fill', nl.length == 1 ? 'lime' : 'red');
        }
      } catch (e) {
      }
    ]]></script>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.5 $</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>
