chromium/third_party/blink/web_tests/svg/hittest/svg-shapes-non-scale-stroke.html

<html xmlns='http://www.w3.org/1999/xhtml'>
  <head>
    <style type="text/css">
      #svgRoot {
        margin: 0px;
        padding: 0px;
        position: absolute; 
        top: 0px; 
        left: 0px;
      }
      .nonscaletest {
        stroke-width: 20px;
        fill: #ccc;
        fill-opacity: 0.4;
      }
      #ellipse1, #ellipse2 {
          stroke: #f31900;
      }
      #line1, #line2 {
          stroke: #3364c2;
      }
      #rect1, #rect2 {
          stroke: #f7d72b;
      }
      #curve1, #curve2 {
          stroke: #44c400;
      }
    </style>
    <script type="text/javascript">
      function enter(event) {
        event.target.setAttribute("stroke-opacity", "0.4");
      };
      function exit(event) {
        event.target.setAttribute("stroke-opacity", "0.7");
      };
    </script>
  </head>
  <body>
    <p>Tests for WK82628 - Make sure hit testing works properly on ellipses, rects, lines and curves with non-scaling stroke.</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="500px" height="300px" viewBox="0 0 500 300" xmlns="http://www.w3.org/2000/svg">
      <!-- The following are all small and scaled up -->
      <g transform="translate(30, 0) scale(5, 5)">
        <ellipse id="ellipse1" class="nonscaletest" cx="10" cy="10" rx="10" ry="5" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        <rect id="rect1" class="nonscaletest" x="30" y="10" width="10" height="7" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7"  stroke-dasharray="15,25" stroke-linecap="round"/>
        <path id="line1" class="nonscaletest" d="M20 20 l 10 10z" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        <g transform="translate(-6, 12)">
          <path id="curve1" class="nonscaletest" d="M5,20 C10,10 25,10 25,20 S40,30 40,20" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        </g>
      </g>
      <!-- The following are all large and scaled down -->
      <g transform="translate(275, 0) scale(0.2, 0.2)">
        <ellipse id="ellipse2" class="nonscaletest" cx="250" cy="250" rx="250" ry="125" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" class="nonscaletest" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        <rect id="rect2" class="nonscaletest" x="750" y="250" width="250" height="175" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        <path id="line2" class="nonscaletest" d="M500 500 l 250 250z" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        <g transform="translate(-150, 300)">
          <path id="curve2" class="nonscaletest" d="M125,500 C250,250 625,250 600,500 S1000,750 1000,500" vector-effect="non-scaling-stroke" pointer-events="visibleStroke" onmouseover="enter(evt)" onmouseout="exit(evt)" stroke-opacity="0.7" stroke-dasharray="15,25" stroke-linecap="round"/>
        </g>
      </g>
    </svg>
    <script type="text/javascript">
      // document.body.onmousedown = function(evt) { console.log("mouse down at " + evt.x + "," + evt.y); }
      if (window.testRunner)
        testRunner.dumpAsText();

      var resultString = "";
      var ellipse1 = document.getElementById("ellipse1");
      var ellipse2 = document.getElementById("ellipse2"); // 250px to the right of ellipse1
      var pointsOnEllipse1Stroke = [
         {x: 29, y: 37},
         {x: 34, y: 48},
         {x: 94, y: 70},
         {x: 100, y: 78}
      ];
      var pointsNotOnEllipse1Stroke = [
         {x: 33, y: 18},
         {x: 81, y: 49},
         {x: 129, y: 78}
      ];

      var rect1 = document.getElementById("rect1");
      var rect2 = document.getElementById("rect2"); // 250px to the right of rect1
      var pointsOnRect1Stroke = [
         {x: 172, y: 45},
         {x: 183, y: 63},
         {x: 220, y: 82},
         {x: 233, y: 90}
      ];
      var pointsNotOnRect1Stroke = [
         {x: 205, y: 68}
      ];

      var line1 = document.getElementById("line1");
      var line2 = document.getElementById("line2"); // 250px to the right of line1
      var pointsOnLine1Stroke = [
         {x: 127, y: 97},
         {x: 174, y: 146}
      ];
      var pointsNotOnLine1Stroke = [
         {x: 138, y: 131},
         {x: 177, y: 126}
      ];

      var curve1 = document.getElementById("curve1");
      var curve2 = document.getElementById("curve2"); // 250px to the right of curve1
      var pointsOnCurve1Stroke = [
         {x: 24, y: 159},
         {x: 107, y: 126},
         {x: 169, y: 193},
         {x: 195, y: 159}
      ];
      var pointsNotOnCurve1Stroke = [
         {x: 5, y: 164},
         {x: 81, y: 140},
         {x: 161, y: 177}
      ];

      pointsOnEllipse1Stroke.forEach( function(point) {
        var pass = (ellipse1 == document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " ellipse1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
        var pass = (ellipse2 == document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " ellipse2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
      });
      pointsNotOnEllipse1Stroke.forEach( function(point) {
        var pass = (ellipse1 != document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " ellipse1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
        var pass = (ellipse2 != document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " ellipse2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
      });

      pointsOnRect1Stroke.forEach( function(point) {
        var pass = (rect1 == document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " rect1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
        var pass = (rect2 == document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " rect2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
      });
      pointsNotOnRect1Stroke.forEach( function(point) {
        var pass = (rect1 != document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " rect1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
        var pass = (rect2 != document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " rect2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
      });

      pointsOnLine1Stroke.forEach( function(point) {
        var pass = (line1 == document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " line1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
        var pass = (line2 == document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " line2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
      });
      pointsNotOnLine1Stroke.forEach( function(point) {
        var pass = (line1 != document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " line1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
        var pass = (line2 != document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " line2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
      });

      pointsOnCurve1Stroke.forEach( function(point) {
        var pass = (curve1 == document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " curve1 stroke contains point at (" + point.x + ", " + point.y + ")\n";
        var pass = (curve2 == document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " curve2 stroke contains point at (" + (point.x+250) + ", " + point.y + ")\n";
      });
      pointsNotOnCurve1Stroke.forEach( function(point) {
        var pass = (curve1 != document.elementFromPoint(point.x, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " curve1 stroke does not contain point at (" + point.x + ", " + point.y + ")\n";
        var pass = (curve2 != document.elementFromPoint(point.x + 250, point.y));
        resultString += ((pass) ? "PASS" : "FAIL") + " curve2 stroke does not contain point at (" + (point.x+250) + ", " + point.y + ")\n";
      });

      document.getElementById("console").innerHTML = resultString;
    </script>
  </body>
</html>