<!DOCTYPE html><!-- webkit-test-runner [ TabsToLinks=true SpatialNavigationEnabled=true ] -->
<html>
  <!--
    This test ensures the optimization done in searching logic to find best candidate focusable node with minimum iterations.

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

    * Navigation steps:
    1) Loads this page, focus goes to "2".
    2) lastSpatialNavigationCandidateCount() returns the number of nodes actually considered to determine best candidate focusable node,
       along the most recent navigation direction.
  -->
<head>
    <script src="../../resources/js-test-pre.js"></script>
    <script src="resources/spatial-navigation-utils.js"></script>
    <script type="application/javascript">

    var resultMap = [
        ["DONE", "DONE"]
    ];

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

    function runTest()
    {
        initTest(resultMap, additionalTest);
    }

    function additionalTest()
    {
        document.getElementById("2").focus();
        eventSender.keyDown("downArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "9");
        eventSender.keyDown("downArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "6");
        eventSender.keyDown("downArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "2");
        eventSender.keyDown("rightArrow");
        eventSender.keyDown("upArrow");
        eventSender.keyDown("leftArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "9");
        eventSender.keyDown("leftArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "6");
        eventSender.keyDown("leftArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "2");
        eventSender.keyDown("upArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "5");
        eventSender.keyDown("upArrow");
        shouldBe("internals.lastSpatialNavigationCandidateCount()", "2");
        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">
    <table style="text-align: left; margin-left: auto; margin-right: auto;" border="1" cellpadding="2" cellspacing="1">
    <tbody>
        <tr>
            <td style="vertical-align: top; text-align: center;"><a id="1" href="a">1</a></td>
            <td style="vertical-align: top; text-align: center;"><a id="2" href="a">2</a></td>
            <td style="vertical-align: top; text-align: center;"><a id="3" href="a">3</a></td>
        </tr>
        <tr>
            <td style="text-align: center;"><a id="4" href="a">4</a></td>
            <td><br><iframe width='100' height='100' src="data:text/html,
			<table style='text-align: center; margin-left: auto; margin-right: auto;'>
			<tbody>
			<tr>
            <td style='text-align: center;'><a id='5' href='a'>5</a></td>
			</tr>
			</tbody>
			</table>">
			</iframe>
			</td>
            <td style="text-align: center;"><a id="6" href="a">6</a></td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: center;"><a id="7" href="a">7</a></td>
            <td style="vertical-align: top; text-align: center;"><a id="8" href="a">8</a></td>
            <td style="vertical-align: top; text-align: center;"><a id="9" href="a">9</a></td>
        </tr>
    </tbody>
    </table>
    <div id="console"></div>
</body>
</html>

