<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="SVGFreeSansASCII,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 = 5;
        r.height = 5;
		
				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>
