<!DOCTYPE html><!-- webkit-test-runner [ TabsToLinks=true SpatialNavigationEnabled=true ] -->
<html>
  <!--
    This test ensures the correctness of the "Fully aligned" precedence
    logic implemented by Spatial Navigation algorithm in an vertical direction:
    targets whose middle falls between the top and bottom of the current focused
    element are preferably to move focus to, even if it is not the shortest distance.

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

    * Navigation steps:
    1) Loads this page, focus goes to "start" automatically.
    2) Focus moves preferably to elements right up or above the
       current focused element, even when there are some other closer
       but not vertically aligned elements in the same direction.
  -->
  <head>
    <script src="../../resources/js-test-pre.js"></script>
    <script src="resources/spatial-navigation-utils.js"></script>
    <script type="application/javascript">

    var resultMap = [
      ["Down", "4"],
      ["Down", "6"],
      ["Down", "8"],
      ["Down", "end"],
      ["Up", "7"],
      ["Up", "2"],
      ["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 style="margin-left: 40px; text-align: left;">
      <div style="margin-left: 40px;">
        <a id="start" href="a">test<br></a>
      </div>
      <a id="2" href="a">test</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a id="3" href="a">test</a><br>
      <div style="margin-left: 40px;">
        <a id="4" href="a">test<br></a>
      </div>
      <div style="margin-left: 80px;">
        <a id="5" href="a">test<br></a>
      </div>
      <div style="margin-left: 40px;">
        <a id="6" href="a">test<br></a>
      </div>
      <a id="7" href="a">test<br></a>
      <br><br><br><br>
      <div style="margin-left: 40px;">
        <a id="8" href="a">test<br></a>
      </div>
      <a id="end" href="a">test<br></a>
    </div>
    <div id="console"></div>
  </body>
</html>

