<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg" onload="fillTestContent()">
  <style type="text/css">
    rect {
      stroke-width: 6px;
    }
  </style>
  <script type="text/javascript">
  <![CDATA[
    var visibleValues = [ 'visible', 'hidden' ];
    var fillValues = ['none', 'orange' ];
    var strokeValues = ['none', 'blue' ];
  
    var pointerEventsValues = ['auto', 'visiblePainted', 'visibleFill', 'visibleStroke', 'visible', 'painted', 'fill', 'stroke', 'all', 'bounding-box', 'none'];
  
    var leftEdge = 100;
    var topEdge = 30;
    
    var rectSpacing = 57;
  
    var svgNS = "http://www.w3.org/2000/svg";
    
    function clickHit(event, identifierString) {
      // This is my cheap hack to see if we hit the stroke.
      if ((event.clientX - parseInt(event.target.getAttribute('x'))) == 0) {
        var strokeText = document.getElementById('stroke-text' + identifierString);
        strokeText.textContent = 'HIT';
      }
      var fillText = document.getElementById('fill-text' + identifierString);
      fillText.textContent = 'HIT';
    }
  
    function fillTestContent() {    
      var xOffset = leftEdge;
      var yOffset = topEdge;
    
      var testContent = document.getElementById("test-content");
    
      for (var pi = 0; pi < pointerEventsValues.length; pi++) {
        var eventLabel = document.createElementNS(svgNS, 'text');
        eventLabel.setAttribute('x', 0);
        eventLabel.setAttribute('y', yOffset + 30);
        eventLabel.textContent = pointerEventsValues[pi];
        testContent.appendChild(eventLabel);
      
        for (var vi = 0; vi < visibleValues.length; vi++) {
          for (var fi = 0; fi < fillValues.length; fi++) {
            for (var si = 0; si < strokeValues.length; si++) {
            
              var identString = "_" + pi + "_" + vi + "_" + fi + "_" + si;
            
              var rect = document.createElementNS(svgNS, 'rect');
              rect.setAttribute('x', xOffset);
              rect.setAttribute('y', yOffset);
              rect.setAttribute('width', 50);
              rect.setAttribute('height', 50);
              rect.setAttribute('visibility', visibleValues[vi]);
              rect.setAttribute('fill', fillValues[fi]);
              rect.setAttribute('stroke', strokeValues[si]);
              rect.setAttribute('pointer-events', pointerEventsValues[pi]);
              rect.setAttribute('onclick', 'clickHit(evt, "' + identString + '")');
              
              testContent.appendChild(rect);
            
              var fillText = document.createElementNS(svgNS, 'text');
              fillText.setAttribute('x', xOffset + 5);
              fillText.setAttribute('y', yOffset + 20);
              fillText.textContent = "miss";
              fillText.setAttribute('id', 'fill-text' + identString);
              fillText.setAttribute('pointer-events', 'none');
              testContent.appendChild(fillText);
            
              var stokeText = document.createElementNS(svgNS, 'text');
              stokeText.setAttribute('x', xOffset + 5);
              stokeText.setAttribute('y', yOffset + 40);
              stokeText.textContent = "miss";
              stokeText.setAttribute('id', 'stroke-text' + identString);
              stokeText.setAttribute('pointer-events', 'none');
              testContent.appendChild(stokeText);
              
              if (window.eventSender) {
                // Stroke click
                eventSender.mouseMoveTo(xOffset, yOffset);
                eventSender.mouseDown();
                eventSender.mouseUp();
                
                // Fill click
                eventSender.mouseMoveTo(xOffset + 25, yOffset + 25);
                eventSender.mouseDown();
                eventSender.mouseUp();
              }
              xOffset += rectSpacing;
            }
          }
        }
        xOffset = leftEdge;
        yOffset += rectSpacing;
      }
      getSelection().removeAllRanges();
    }
  ]]>
  </script>

  <text x="610" y="18">Example:</text>
  
  <text x="605" y="40">Hit Fill:</text>
  <text x="605" y="60">Hit Stroke:</text>
  
  <text x="110" y="20">Visibility: visible</text>
  <text x="340" y="20">Visibility: hidden</text>
  
  <g id="test-content">
    <rect x="680" y="20" width="50" height="50" fill="orange" />
    <text x="685" y="40">HIT</text>
    <text x="685" y="60">miss</text>
  </g>
</svg>
