<?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[
    
    if (window.layoutTestController)
        layoutTestController.waitUntilDone();
  
    var visibleValues = [ 'visible', 'hidden' ];
    var fillValues = ['none', 'orange' ];
    var strokeValues = ['none', 'blue' ];
  
    var pointerEventsValues = ['visiblePainted', 'visibleFill', 'visibleStroke', 'visible', 'painted', 'fill', 'stroke', 'all', 'none'];
  
    var leftEdge = 100;
    var topEdge = 100;
    
    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;
      }
      
      if (window.layoutTestController)
        layoutTestController.notifyDone();
    }
  ]]>
  </script>
  
  <text x="110" y="90">Visibility: visible</text>
  <text x="340" y="90">Visibility: hidden</text>
  
  <text x="10" y="18">Example:</text>
  
  <text x="5" y="40">Hit Fill:</text>
  <text x="5" y="60">Hit Stroke:</text>
  <g id="test-content">
    <rect x="80" y="20" width="50" height="50" fill="orange" />
    <text x="85" y="40">HIT</text>
    <text x="85" y="60">miss</text>
  </g>
</svg>
