<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
  <script type="text/javascript">
  <![CDATA[
    if (window.layoutTestController)
      layoutTestController.dumpAsText();
    
    function log(string) {
      var newDiv = document.createElementNS("http://www.w3.org/1999/xhtml", "div");
      newDiv.textContent = string;
      document.getElementById('log').appendChild(newDiv);
    }
    
    var lastEvent = null;
    
    function testClick(x, y, expected) {
      eventSender.mouseMoveTo(x, y);
      eventSender.mouseDown();
      eventSender.mouseUp();
      if (expected && lastEvent && lastEvent.clientX == x && lastEvent.clientY == y) {
        log("SUCCESS: click received at: " + x + ", " + y);
      } else if (!expected && !lastEvent) {
        log("SUCCESS: click at " + x + ", " + y + " was correctly ignored");
      } else if (expected && lastEvent) {
        log("FAILURE: click received at: " + lastEvent.clientX + ", " + lastEvent.clientY + " but it was expected at: " + x + ", " + y);
      } else if (!expected && lastEvent) {
        log("FAILURE: UNEXPECTED click received at: " + lastEvent.clientX + ", " + lastEvent.clientY);
      } else if (expected && !lastEvent) {
        log("FAILURE: NO click received at: " + x + ", " + y);
      } else {
        log("LOGIC ERORR");
      }
      lastEvent = null;
    }
    
    function gotClick(evt) {
      lastEvent = evt;
    }
    
    function gotMouseEvent(evt, type) {
      if (!window.layoutTestController)
        document.getElementById('mouseover-text').textContent = type + " at " + evt.clientX + ", " + evt.clientY;
    }
  ]]>
  </script>  
  <foreignObject y="200" width="600" height="400">
  <html xmlns="http://www.w3.org/1999/xhtml">
    <body>
      <div id="log">
      </div>
    </body>
  </html>
  </foreignObject>
  
  <!-- Paths only seem to stroke from startX to endX - 1 pixels.  I was not aware of that before writing this test.  Firefox and Opera match our behavior -->
  <path d="M 30 100 L 301 100" stroke-width="100" stroke="yellow" onclick="gotClick(evt)" onmouseover="gotMouseEvent(evt, 'mouseover')" onmouseout="gotMouseEvent(evt, 'mouseout')" onmousemove="gotMouseEvent(evt, 'mousemove')" />
  <text id="mouseover-text" x="30" y="190"></text>
  
  <script type="text/javascript">
  <![CDATA[
    if (window.eventSender) {
      testClick(10, 10, false);
      testClick(30, 100, true);
      testClick(29, 100, false);
      testClick(30, 50, true);
      testClick(30, 49, false);
      testClick(30, 150, true);
      testClick(30, 151, false);
      testClick(300, 100, true);
      testClick(301, 100, false);
      testClick(300, 50, true);
      testClick(300, 49, false);
      testClick(300, 150, true);
      testClick(300, 151, false);
    } else {
      log("ERROR: window.eventSender not found!  This test must be run using DumpRenderTree.  Mousing over the yellow area will log however.");
    }
  ]]>
  </script>
</svg>
