<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="../../resources/accessibility-helper.js"></script>
</head>
<body aria-label="outer body">
<p id="description"></p>
<iframe aria-label="outer iframe" id="iframe"></iframe>
<div id="console"></div>
<script>
window.jsTestIsAsync = true;

description("This test ensures that a children-changed notification is not emitted for children of not-yet-rendered nested iframes.");
function runTest() {

    if (window.accessibilityController) {
        var axWebArea = accessibilityController.rootElement.childAtIndex(0);

        // Generate the hierarchy before registering a listener so that we only see new notifications.
        touchAccessibilityTree(axWebArea);

        accessibilityController.addNotificationListener(function(element, notification, child) {
            if (notification == "AXChildrenAdded" && element.role == "AXRole: AXGroup")
                debug(notification + " on " + element.title + " (" + (child ? child.title : "null") + ")");
        });
    }

    // Write content in the outer iframe, including an inner iframe. The latter should not emit a notification.
    var iframe = document.getElementById("iframe");
    var doc = iframe.contentWindow.document;
    doc.open();
    doc.write("<html><body aria-label='inner body'><iframe aria-label='inner iframe' src='about:config'></body></html>");
    doc.close();

    // Re-generate the hierarchy to trigger the notifications.
    touchAccessibilityTree(axWebArea);

    window.setTimeout(function() {
        if (window.accessibilityController) {
            accessibilityController.removeNotificationListener();
        }

        finishJSTest();
    }, 0);
}
runTest();
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>
