<html>
<head>
<script src="../resources/accessibility-helper.js"></script>
<script src="../resources/js-test.js"></script>
</head>
<body>

<p>Before</p>

<div id="iframeContainer">
    <iframe id="iframe" src="data:text/html,<body>Foo text</body>"></iframe>
</div>

<p>After</p>
<script>
var output = "This tests that if an iframe that has already been accessed loads new content, that said new content is reflected in the accessibility tree.\n\n";

window.jsTestIsAsync = true;

var scrollArea, webArea;
async function runTest()
{
    if (!window.accessibilityController)
        return;

    // Access the iframe's accessibility objects before the reload to ensure
    // they are cached. The original bug was that the cache wasn't updated.
    scrollArea = accessibilityController.accessibleElementById("iframeContainer").childAtIndex(0);
    webArea = scrollArea.childAtIndex(0);
    output += expect("platformStaticTextValue(webArea.childAtIndex(0)).includes('Foo text')", "true");

    window.iframeElement = document.getElementById("iframe");
    iframeElement.addEventListener("load", async function() {
        await waitFor(() => {
            window.axContainer = accessibilityController.accessibleElementById("iframeContainer");
            window.newScrollArea = axContainer ? axContainer.childAtIndex(0) : null;
            window.newWebArea = newScrollArea ? newScrollArea.childAtIndex(0) : null;
            if (!window.newWebArea)
                return false;

            return !newScrollArea.isEqual(scrollArea) && !newWebArea.isEqual(webArea);
        })

        output += await expectAsync("newWebArea.childrenCount > 0", "true");
        output += await expectAsync("newWebArea.childAtIndex(0).role.toLowerCase().includes('button')", "true");

        debug(output);
        finishJSTest();
    }, 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", async function() {
    setTimeout(runTest, 10);
}, false);
</script>
</body>
</html>
