<html>
<head>
  <title>Hit Test: Table with empty cells</title>
  <style>
    table.testtable {background-color: green; border: 0px; border-collapse: collapse;}
    table.testtable td { font-size: 20px; border: none; background-color: red; border-spacing:0px; width:30px; height:30px;}
    body { margin: 0px 0px 0px 0px; }
  </style>
  <script language="JavaScript" type="text/javascript">
    var cellHeight = 30;
    var cellWidth = 30;
    var logMsg = "";
    var lastSuccess = 0;
    var failed = false;

   if (window.testRunner) {
        testRunner.dumpAsText();
        window.testRunner.waitUntilDone();
    }

    function isEmpty(row, col) {
      return row == 0 && col > 0;
    }

    function cellHit(cell) {
      var cellId = 3 * cell.parentNode.rowIndex  + cell.cellIndex;
      // If we see an even number of moves then the cell's bit is 1 else 0
      lastSuccess = cellId;
    }

    function doTest() {
      var ypos = cellHeight / 2;
      for (var row = 0; row < 2; row++) {
        var xpos = cellWidth / 2;
        for (var col = 0; col < 3; col++) {
          var oldLastSuccess = lastSuccess;
          var elem = document.elementFromPoint(xpos, ypos);
          if (elem && elem.onmousemove) elem.onmousemove();
          var cellId = 3 * row + col;
          logMsg += "Hit cell at row: " + row + ", column: " + col + ": ";     
          var success = lastSuccess == cellId;
          var empty = isEmpty(row, col);
          if (!success && !empty) failed = true;
          logMsg += (success ? "SUCCESS" : ((empty &&  lastSuccess == oldLastSuccess)? "EMPTY" : "FAIL")) + "<br />";
          xpos += cellWidth;
        }
        ypos += cellHeight;
      }
      document.body.innerHTML = (failed ? "FAIL!!!<br/>" : "SUCCESS!!!<br/>") +logMsg;
      if (window.testRunner) {
          window.testRunner.notifyDone();
      }
    }
  </script>
</head>
  <body onload="doTest()">

    <table class="testtable">
      <tr>
        <td align="right" onmousemove="cellHit(this)">
        </td>
      </tr>
      <tr>
        <td onmousemove="cellHit(this)">
        </td>
        <td onmousemove="cellHit(this)">
        </td>
        <td onmousemove="cellHit(this)">
        </td>
      </tr>
    </table>
  </body>
</html>
