<!DOCTYPE html><!-- webkit-test-runner [ TabsToLinks=true SpatialNavigationEnabled=true ] -->
<html>
  <!--
    This test ensures the correctness the following Spatial Navigation
    (SNav) algorithm features.

    1) There is no unit overflow in the Spatial Navigation algorithm while
       calculating the best node candidate to move focus to. To test that this
       page positions some elements 33554309 pixels (subpixel overflow limitation)
       far from each other (distance
       that can considered large enough for most of the Web Pages on the
       Internet).

    2) Make sure that a best focusable candidate only gets focused
       if it is visible in the current Viewport. Scroll-in-direction
       is performed otherwise.

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

    * Navigation steps:
    1) Loads this page, focus goes to "start" automatically.
    2) Attempt to move focus down to "end. As it is too far and out of
       viewport, focus change will not happen and page will be scrolled
       a step down.
    3) By sending an "End" keypress, page gets scrolled down to a place
       where the "end" node gets visible in the viewport.
    4) Step _1_ is ran again, and "end" gets focused. -->
  <head>
    <script src="../../resources/js-test-pre.js"></script>
    <script src="resources/spatial-navigation-utils.js"></script>
    <script type="application/javascript">

    var resultMap1 = [
      ["Down", "start"],
      ["DONE", "DONE"]
    ];

    var resultMap2 = [
      ["Down", "end"],
      ["DONE", "DONE"]
    ];

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

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

      setTimeout(step1 , 0);
    }

    function step1()
    {
      // Actions in 'resultMap1' should keep the focus in the currently
      // focused element ('start') once the best candidate ('end') is not
      // visible in current viewport.
      initTest(resultMap1, step1Completed);
    }

    function step2()
    {
      shouldBeTrue(String(document.scrollingElement.scrollTop != 0));

      // Then it scrolls down to the end of the page ...
      if (window.eventSender)
        eventSender.keyDown("end");

      // And 'resultMap2' re-tries to move focus down.
      initTest(resultMap2, step2Completed);
    }

    function step1Completed()
    {
      setTimeout(step2 , 0);
    }

    function step2Completed()
    {
      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">
    <a id="start" href="a">Start</a>
    <div style='margin-top:33554309px'>
        <a id="end" href="a">End</a>
    </div>
    <div id="console"></div>
  </body>
</html>
