<!DOCTYPE html><!-- webkit-test-runner [ TabsToLinks=true SpatialNavigationEnabled=true ] -->
<html>
  <!--
    This test ensures the cross iframe traversal correctness of Spatial Navigation
    algorithm: focusable elements in an <iframe> should be accessible even when
    the current focused element is in another <iframe> in the same page.

    * Pre-conditions:
    1) DRT support for SNav enable/disable.

    * Navigation steps:
    1) Loads this page, focus goes to "start" automatically.
    2) Focus moves along the elements in the two iframes in the
       Web page, eventually going to outer an southward link, but
       going back to the iframe on the top later on.
  -->
  <head>
    <script src="../../resources/js-test-pre.js"></script>
    <script src="resources/spatial-navigation-utils.js"></script>
    <script type="application/javascript">

    var resultMap = [
      ["Right", "1"],
      ["Right", "2"],
      ["Right", "3"],
      ["Left", "2"],
      ["Left", "1"],
      ["Left", "start"],
      ["DONE", "DONE"]
    ];

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

    function runTest()
    {
      // starting the test itself: get to a known place.
      document.getElementById("start").focus();

      initTest(resultMap, testCompleted);
    }

    function testCompleted()
    {
      if (window.testRunner)
        testRunner.notifyDone();
    }

    window.onload = runTest;
    </script>
    <script src="../resources/js-test-post.js"></script>
  </head>
  <body>
  <table style="text-align: top;"  border="0" cellpadding="3px" cellspacing="3px">
    <tr>
      <td valign="top" width="10%">
        <a id="start" href="http://google.com">Link</a><br>
      </td>
      <td valign="top">
        <iframe width="50%" height="100px" frameborder="1" src="data:text/html,
        <body>
          <a id='1' href='http://a'>b</a>
          <a id='2' href='http://a'>c</a>
          <a id='3' href='http://a'>d</a>
        </body>
        "></iframe><br>
      </td>
    </tr>
  </table>
  <div id="console"></div>
  </body>
</html>
