<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test.js"></script>
</head>
<body id="body">

<iframe width=500 height=500 id="frame1" title="frame1"></iframe>
<iframe width=500 height=500 id="frame2" title="frame2"></iframe>
<iframe width=500 height=500 id="frame3" title="frame3"></iframe>

<p id="description"></p>
<div id="console"></div>

<script>
    jsTestIsAsync = true;

    // We have to play some games to get these frames to load their sources in a timely fashion.
    document.getElementById("frame1").src = "data:text/html,<body id='body1'><button id=button1>button1</button><BR><BR><BR></body>";
    document.getElementById("frame2").src = "data:text/html,<body>text<BR><BR><BR></body>";
    document.getElementById("frame3").src = "data:text/html,<body><button id=button3>button3</button><BR><BR><BR></body>";

</script>
<script>
   var frame1aLoaded = false;
   var frame2aLoaded = false;
   var frame3aLoaded = false;
   
   for (var k = 1; k <= 3; k++) {

      // This block adds sub frames to each of the frames, with some content in them. 
      // When the last frame loads, it runs the test.

      document.getElementById("frame" + k).onload = function(e) { 
          var iframe = document.createElement("iframe"); 
          iframe.setAttribute("name", e.target.id + "a");

          iframe.onload = function() {
              if (iframe.name == "frame1a")
                  frame1aLoaded = true;
              else if (iframe.name == "frame2a")
                  frame2aLoaded = true;
              else if (iframe.name == "frame3a")
                  frame3aLoaded = true;
              
              // Call runTest() when all frames have been loaded.
              if (frame1aLoaded && frame2aLoaded && frame3aLoaded)
                  runTest();
          };

          if (e.target.id == "frame2") {
              iframe.setAttribute("src", "data:text/html,<body><button id=button2>button2</button></body>"); 
          } else {
              iframe.setAttribute("src", "data:text/html,<body>text</body>"); 
          }

          iframe.style.width = "200"; 
          iframe.style.height = "200"; 
          this.contentDocument.childNodes[0].childNodes[1].appendChild(iframe); 
       };
    }

</script>

<script>

    description("This tests whether searching works to find frames and to find elements within frames.");

function runTest() {
    if (window.accessibilityController) {

        document.getElementById("body").focus();
        var body = accessibilityController.focusedElement;

        // Search for the buttons. This tests searching through the frames.
        searchKey = "AXButtonSearchKey";
        resultElement = body.uiElementForSearchPredicate("", true, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXButton'");
        shouldBe("resultElement.title", "'AXTitle: button1'");

        resultElement = body.uiElementForSearchPredicate(resultElement, true, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXButton'");
        shouldBe("resultElement.title", "'AXTitle: button2'");

        resultElement = body.uiElementForSearchPredicate(resultElement, true, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXButton'");
        shouldBe("resultElement.title", "'AXTitle: button3'");

        // Now search backwards.
        resultElement = body.uiElementForSearchPredicate(resultElement, false, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXButton'");
        shouldBe("resultElement.title", "'AXTitle: button2'");

        // Search for the frames. First one is frame1
        searchKey = "AXFrameSearchKey";
        resultElement = body.uiElementForSearchPredicate("", true, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXWebArea'");
        shouldBe("resultElement.description", "'AXDescription: frame1'");

        // Next we should find the frame inside of frame1.
        resultElement = body.uiElementForSearchPredicate(resultElement, true, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXWebArea'");
        shouldBe("resultElement.description", "'AXDescription: frame1a'");

        // Then we should find the frame after frame1.
        resultElement = body.uiElementForSearchPredicate(resultElement, true, searchKey, "", false);
        shouldBe("resultElement.role", "'AXRole: AXWebArea'");
        shouldBe("resultElement.description", "'AXDescription: frame2'");
    }

    successfullyParsed = true;
    finishJSTest();
}

</script>
</body>
</html>
