<!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 flattened <iframe> should be accessible.

    * Pre-conditions:
    1) DRT support for Spatial Navigation enable/disable.
    2) DRT support for Frame flattening 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", "end"],
      ["Up", "2"],
      ["Up", "1"],
      ["Up", "start"],
      ["DONE", "DONE"]
    ];

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

    function runTest()
    {
      if (window.internals)
        internals.settings.setFrameFlattening("FullyEnabled")

      // 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 width="80" height="80" scrolling="auto" src="data:text/html,
      <body>
        <a id='1' href='a'>b</a>
        <div style='margin-top:120px'>
          <a id='2' href='a'>d</a>
        </div>
      </body>
    "></iframe><br>

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