<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="SVGWG" author="ED" status="accepted"
    version="$Revision: 1.3 $" testname="$RCSfile: struct-dom-15-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 three green circles visible, and no red.
      </p>
    </d:passCriteria>
  </d:SVGTestCase>
  <title id="test-title">$RCSfile: struct-dom-15-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>
      <circle id="defscircle1" cx="240" cy="180" r="25" onclick="verifyDefs1(evt)" fill="red"/>
      <circle id="defscircle2" cx="240" cy="180" r="25" onclick="verifyDefs2(evt)" fill="red"/>

      <script><![CDATA[
        function verifyDefs1(e)
        {
          var dc = document.getElementById("defscircle1");
          if (e.target === e.currentTarget &&   // Assertion: the target and currentTarget are the same
              e.target === dc)                  // Assertion: the target is the 'circle' element since we dispatched the event directly to it, not to an SVGElementInstance
          {
            dc.setAttribute("fill", "lime");
          }
        }

        // checks that event.target and event.currentTarget point to an SVGElementInstance (the instanceRoot)
        function verifyDefs2(e)
        {
          var instance = document.getElementById("use2").instanceRoot;
          if (e.target === e.currentTarget &&   // Assertion: the target and currentTarget are the same
              e.target === instance)            // Assertion: the target is SVGElementInstance corresponding to the 'circle' element with id="defscircle2", since we dispatched the event to that instance
          {
            instance.correspondingElement.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 simple circle inside <defs>
          try {
            var defsCircle = document.getElementById("defscircle1");
            dispatchMouseClick(defsCircle);
          } catch(e) {}

          // test SVGElementInstance
          try {
            var elementInstance2 = document.getElementById("use2").instanceRoot;
            dispatchMouseClick(elementInstance2);
          } catch(e) {}

          // test simple circle outside of <defs>
          try {
            var circle = document.getElementById("circle");
            dispatchMouseClick(circle);
          } catch(e) {}
        }
      ]]></script>
    </defs>

    <circle id="circle" cx="240" cy="180" r="25" onclick="verify(evt)" fill="red"/>

    <use id="use1" xlink:href="#defscircle1" transform="translate(80,0)"/>
    <use id="use2" xlink:href="#defscircle2" transform="translate(-80,0)"/>
    <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.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>
