<html>
  <head>

    <script src="../../resources/js-test-pre.js"></script>
    <script src="resources/spatial-navigation-utils.js"></script>
    <script type="application/javascript">

    var resultMap = [
      ["Down", "3"],
      ["Up", "start"],
      ["DONE", "DONE"]
    ];

    if (window.testRunner) {
      testRunner.dumpAsText();
      testRunner.setSpatialNavigationEnabled(true);
      testRunner.overridePreference("WebKitTabToLinksPreferenceKey", 1);
      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">
  <map name="map" title="map" id="firstmap">
    <area shape="rect" coords="20,20,70,70" href="#" id="1">
    <area shape="rect" coords="20,130,70,180" href="#" id="2">
  </map>

    <a id="start" href="a"><img src="resources/green.png" width=50px height=50px></a>
    <div>
      <img src="resources/green.png" width=200px height=200px usemap="#othermap"><a id="6" href="a"><img src="resources/green.png" width=50px height=50px></a>
    </div>
    <a id="3" href="a"><img src="resources/green.png" width=50px height=50px></a>
    <div id="console"></div>
    <div>This test tests that areas of an imagemap without an image using it, are not focusable, thus can not be reached with spatial navigation.</div>
  </body>
</html>

