<html>
<head>
  <script src="../resources/js-test.js"></script>
  <script>
    var tableAXObject;
    var indentLevel = 0;

    function indent(count) {
      var spaces = "                                                      ";
      return spaces.substr(0, count);
    }

    function dumpObject(axObject) {
      debug(indent(indentLevel) + "role: " + axObject.role);
      if (axObject.subrole && axObject.subrole != 'AXSubrole: ') debug(indent(indentLevel) + "subrole: " + axObject.subrole);
    }

    function dumpChildren(axObject) {
      var count = axObject.childrenCount
      if (!count)
        return;

      indentLevel += 4;
      for (var ndx = 0; ndx < count; ndx++) {
        var childAXObject = axObject.childAtIndex(ndx);
        dumpObject(childAXObject);
        if (childAXObject.childrenCount) {
          // don't bother dumping static text children
          if (childAXObject.role != "AXRole: AXStaticText")
            dumpChildren(childAXObject);
        }
      }
      indentLevel -= 4;
    }
    function dumpTableAX()
    {
      if (!window.accessibilityController)
        return;
      var table = accessibilityController.accessibleElementById("table1");

      dumpObject(table);
      dumpChildren(table);
    }
  </script>
</head>
<body onload="dumpTableAX()">

<table id="table1">
  <thead>
  <tr>
    <th>No</th>
    <th>Country</th>
    <th>Capital</th>
  </tr>
  </thead>
  <tbody>
  <tr>
    <th>1.</th>
    <td>Poland</td>
    <td>Warsaw</td>
  </tr>
  <tr>
    <th>2.</th>
    <td>Russia</td>
    <td>Moscow</td>
  </tr>
   <tr>
    <th>3.</th>
    <td>Ukraine</td>
    <td>Kiev</td>
  </tr>
  </tbody>
  <tfoot>
  <tr>
    <th>All</th>
    <td>3 countries</td>
    <td>3 capitals</td>
  </tr>
  </tfoot>
</table>

<br>
<br>
<br>

<p>This shows the hierarchy of table roles.</p>

<div id=console></div>

</body>
</html>
