<html>
<head>
<script src="../resources/js-test-pre.js"></script>

  <script>
    if (window.testRunner)
        testRunner.waitUntilDone();

    function runTest()
    {
        description("This tests that if an iframe loads new content after its accessibility object has already been accessed, the iframe accessibility object's descendants are the new scroll area and web area, not the old deleted ones.");

        if (window.accessibilityController) {
            window.iframe = accessibilityController.accessibleElementById('iframe');
            window.scrollarea = iframe.childAtIndex(0);
            window.subwebarea = scrollarea.childAtIndex(0);
        }

        window.iframeElement = document.getElementById("iframe");
        iframeElement.addEventListener("load", function() {
            if (window.accessibilityController) {
                window.newIframe = accessibilityController.accessibleElementById('iframe');
                window.newScrollarea = newIframe.childAtIndex(0);
                window.newSubwebarea = newScrollarea.childAtIndex(0);

                shouldBeTrue("iframe.isEqual(newIframe)");
                shouldBeFalse("scrollarea.isEqual(newScrollarea)");
                shouldBeFalse("subwebarea.isEqual(newSubwebarea)");
                shouldBeTrue("newSubwebarea.childrenCount > 0");
            }

            debug('<br /><span class="pass">TEST COMPLETE</span>');
            if (window.testRunner)
                testRunner.notifyDone();
        }, false);

        // Load content into the iframe. This will trigger the event
        // handler above, which will check that the accessibility tree
        // was updated with new content.
        window.iframeElement.src = "data:text/html,<body><button>Click me</button></body>";

    }

    window.addEventListener('load', function() {
        setTimeout(runTest, 10);
    }, false);

  </script>
</head>
<body>

<p>Before</p>

<iframe id="iframe" role="group"></iframe>

<p>After</p>

<p>End of test</p>

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

</body>
</html>
