<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" onload="runTest()">
  <!--======================================================================-->
  <!--=  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="[reviewer]" author="ED" status="created"
    version="$Revision: 1.2 $" testname="$RCSfile: struct-dom-20-f.svg,v $">
    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/struct.html#InterfaceSVGElementInstance">
      <p>
        Test SVGElementInstance and EventTarget.dispatchEvent. 
      </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 there are two green circles visible, and no red.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-dom-20-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">

    <defs>
      <g id="defsg1" onclick="verifyDefs3(evt)">
        <circle id="defscircle3" cx="80" cy="180" r="25" fill="red"/>
        <use id="defsuse1" xlink:href="#defscircle4" transform="translate(-600, 0)" onclick="verifyDefs4(evt)"/>
      </g>
      <circle id="defscircle4" cx="1000" cy="180" r="25" fill="red"/>
      
      <script><![CDATA[        
        function verifyDefs3(e)
        {
          var instance = document.getElementById("use3").instanceRoot;
          var dc3instance = instance.firstChild.nextSibling;
          if (e.target != e.currentTarget &&         // Assertion: the target and currentTarget are different since the event bubbled
              e.target === dc3instance &&            // Assertion: the event was dispatched to the correct EventTarget
              e.currentTarget === instance)          // Assertion: the event bubbled up to the SVGElementInstance corresponding to the element with id="defsg1"
          {
            dc3instance.correspondingElement.setAttribute("fill", "lime");
          }
        }
        
        function verifyDefs4(e)
        {
          var useElement = document.getElementById("use3");
          var nestedUseInstance = useElement.instanceRoot.childNodes.item(3);
          var instanceNestedCircle = nestedUseInstance.childNodes.item(0);
          if (e.target != e.currentTarget &&                               // Assertion: the target and currentTarget are different since the event bubbled
              e.target === instanceNestedCircle &&                         // Assertion: the event was dispatched to the correct EventTarget
              e.currentTarget === nestedUseInstance &&                     // Assertion: the event bubbled up to the SVGElementInstance corresponding to the element with id="defsuse1"
              instanceNestedCircle.parentNode === nestedUseInstance &&     // Assertion: the parentNode is the SVGElementInstance of the 'use' that referenced the circle
              instanceNestedCircle.correspondingUseElement === useElement) // Assertion: When 'use' elements are nested then the correspondingUseElement is the outermost 'use'
          {
            document.getElementById("defscircle4").setAttribute("fill", "lime");
          }
        }
        
        function verify(e)
        {
          var c = document.getElementById("circle");
          if (e.target === e.currentTarget &&   // Assertion: the target and currentTarget are the same
              e.target === c)                   // Assertion: the target is the 'circle' element since we dispatched the event directly to it
          {
            c.setAttribute("fill", "lime");
          }
        }
        
        function dispatchMouseClick(target)
        {
           var mouseevent = document.createEvent("MouseEvents");
           mouseevent.initMouseEvent("click", 
                                      true,                 // canbubble
                                      true,                 // cancellable
                                      document.defaultView, // the AbstractView
                                      1,                    // mouseclick count
                                      0,                    // screen x coordinate
                                      0,                    // screen y coordinate 
                                      0,                    // client x coordinate
                                      0,                    // client y coordinate
                                      false,                // ctrlKey
                                      false,                // altKey
                                      false,                // shiftKey
                                      false,                // metaKey
                                      0,                    // mousebutton
                                      null);                // related target
           target.dispatchEvent(mouseevent);
        }
        
        function runTest()
        {
          // test bubbling click
          try {
            var instanceCircle = document.getElementById("use3").instanceRoot.firstChild.nextSibling;
            dispatchMouseClick(instanceCircle);
          } catch(e) {}
          
          // test nested use with bubbling click
          try {
            var nestedUseInstance = document.getElementById("use3").instanceRoot.childNodes.item(3);
            var instanceNestedCircle = nestedUseInstance.childNodes.item(0);
            dispatchMouseClick(instanceNestedCircle);
          } catch(e) {}
        }
      ]]></script>
    </defs>
    
    <use id="use3" xlink:href="#defsg1"/>
  </g>
  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
    <text id="revision" x="10" y="340" stroke="none"
      fill="black">$Revision: 1.2 $</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>
