<!DOCTYPE html><!-- webkit-test-runner [ TabsToLinks=true SpatialNavigationEnabled=true ] -->
<html>
  <!--
    This test ensures the basic iframe traversal correctness of Spatial Navigation
    algorithm: focusable elements in a <iframe> should be accessible.

    * 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 = [
      ["Down", "1"],
      ["Down", "2"],
      ["Down", "3"],
      ["Down", "7"],
      ["Down", "6"],
      ["Down", "end"],
      ["Up", "4"],
      ["Right", "5"],
      ["Right", "6"],
      ["Up", "3"],
      ["Right", "7"],
      ["Up", "3"],
      ["Up", "2"],
      ["Up", "1"],
      ["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 id="some-content" xmlns="http://www.w3.org/1999/xhtml">
    <div><a id="start" href="a">a</a></div>

    <iframe src="data:text/html,
      <body>
        <a id='1' href='a'>b</a><br>
        <a id='2' href='a'>c</a><br>
        <a id='3' href='a'>d</a><br>
        <div style='margin-left:80px'>
          <a id='7' href='a'>e</a>
        </div>
      </body>
    "></iframe><br>

    <iframe src="data:text/html,
      <body>
        <a id='4' href='a'>g</a>
        <a id='5' href='a'>h</a>
        <a id='6' href='a'>i</a>
      </body>
    "></iframe><br>

    <a id="end" href="a">a</a>
    <div id="console"></div>
  </body>
</html>
