<html xmlns='http://www.w3.org/1999/xhtml'>
  <head>
    <style>
      #svgRoot {
          margin: 0px;
          padding: 0px;
          position: absolute; 
          top: 0px; 
          left: 0px;
      }

      #path {
          fill: green;
          fill-opacity: 0.1;
          stroke: green;
          stroke-opacity: 0.2;
      }
    </style>
  </head>
  <body>
    <p>Tests for WK84117 - Make sure hit testing works properly on small paths.</p>
    <p>On success, you will see a series of "PASS" messages and no "FAIL" messages.</p>
    <pre id="console"></pre>

    <svg id="svgRoot" width="400px" height="400px" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
      <g transform="translate(100, 100) scale(100, 100)">
        <path id="path" d="M 0 0 L 0.4 0 L 0.4 0.4 L 0 0.4 z" stroke-width="0.2" />
      </g>
    </svg>
    
    <script><![CDATA[
    if (window.testRunner)
      testRunner.dumpAsText();

    var resultString = "";
    var pathElement = document.getElementById("path");

    var pointsInPath = [
       {x: 106, y: 106},
       {x: 124, y: 124},
       {x: 121, y: 137}
    ];

    var pointsNotInPath = [
        {x: 0, y: 0},
        {x: 145, y: 145}
    ];

    var pointsOnPathStroke = [
       {x: 122, y: 146}, // outer stroke
       {x: 124, y: 136} // inner stroke
    ];

    var pointsNotOnPathStroke = [
       {x: 160, y: 160}, // outside path
       {x: 0, y: 0}, // outside path
       {x: 120, y: 120} // inside path
    ];

    pathElement.style.setProperty("pointer-events", "visibleFill"); // only capture events on the fill
    pointsInPath.forEach( function(point) {
        var pass = (pathElement == document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " path contains point at (" + point.x + ", " + point.y + ")\n";
    });
    pointsNotInPath.forEach( function(point) {
        var pass = (pathElement != document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " path does not contain point at (" + point.x + ", " + point.y + ")\n";
    });

    pathElement.style.setProperty("pointer-events", "visibleStroke"); // only capture events on the stroke
    pointsOnPathStroke.forEach( function(point) {
        var pass = (pathElement == document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " path stroke contains point at (" + point.x + ", " + point.y + ")\n";
    });
    pointsNotOnPathStroke.forEach( function(point) {
        var pass = (pathElement != document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " path stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
    });
    document.getElementById("console").innerHTML = resultString;
    ]]></script>
 </body>
</html>
