<html>
<html>
<head>
<script src="../resources/js-test-pre.js"></script>
</head>
<body id="body">
 
    <div role="group" tabindex="0" id="parent">
    <div role="button" id="button1" tabindex="0">Button 1</div>
    <div role="button" id="button2" tabindex="0">Button 2</div>
    <div role="button" id="button3" tabindex="0">Button 3</div>

    </div>


    <p id="description"></p>
    <div id="console"></div>
     
    <script>
        if (window.accessibilityController) {
            jsTestIsAsync = true;
            description("This test makes sure that when aria-hidden changes, the AX hierarchy is updated.");

            // Get the parent element.
            document.getElementById("parent").focus();
            var parent = accessibilityController.focusedElement;
            
            // Get all three children.
            document.getElementById("button1").focus();
            var button1 = accessibilityController.focusedElement;
            document.getElementById("button2").focus();
            var button2 = accessibilityController.focusedElement;
            document.getElementById("button3").focus();
            var button3 = accessibilityController.focusedElement;
      
            // Verify that the 3 children are present.
            shouldBeTrue("parent.childAtIndex(0).isEqual(button1)");
            shouldBeTrue("parent.childAtIndex(1).isEqual(button2)");
            shouldBeTrue("parent.childAtIndex(2).isEqual(button3)");

            // Make the 2nd button hidden. Only 1 and 3 should be present.
            document.getElementById("button2").setAttribute("aria-hidden", "true");
            setTimeout(function() {
                shouldBeTrue("parent.childAtIndex(0).isEqual(button1)");
                shouldBeTrue("parent.childAtIndex(1).isEqual(button3)");
           
                // Make the 1st button hidden. Only 3 should be present.
                document.getElementById("button1").setAttribute("aria-hidden", "true");
                setTimeout(function() {
                    shouldBeTrue("parent.childAtIndex(0).isEqual(button3)");

                    // Make the 2nd button not hidden. 2 and 3 should be present.
                    document.getElementById("button2").setAttribute("aria-hidden", "false");
                    setTimeout(function() {
                        shouldBeTrue("parent.childAtIndex(0).isEqual(button2)");
                        shouldBeTrue("parent.childAtIndex(1).isEqual(button3)");
                        finishJSTest();
                    }, 0);
                }, 0);
            }, 0);
        }
    </script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
