<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>
