<!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
    <head>
        <script src="../resources/js-test-pre.js"></script>
        <script>
            var vidAXObject;
            var indentLevel = 0;

            jsTestIsAsync = true;

            function indent(count)
            {
                var spaces = "                                                      ";
                return spaces.substr(0, count);
            }

            function dumpObject(axObject)
            {
            if (accessibilityController.platformName == "atk")
                debug(indent(indentLevel) + "title: " + axObject.title);
            else
                debug(indent(indentLevel) + "description: " + axObject.description);
                debug(indent(indentLevel) + "role: " + axObject.role); 
                if (axObject.subrole && axObject.subrole != 'AXSubrole: ') debug(indent(indentLevel) + "subrole: " + axObject.subrole);
                debug("<br>");
            }

            function dumpChildren(axObject)
            {
                var count = axObject.childrenCount
                if (!count)
                    return;

                indentLevel += 4;
                for (var ndx = 0; ndx < count; ndx++) {
                    var childAXObject = axObject.childAtIndex(ndx);
                    dumpObject(childAXObject);
                    if (childAXObject.childrenCount) {
                        // don't bother dumping static text children
                        if ( childAXObject.role != "AXRole: AXStaticText")
                           dumpChildren(childAXObject);
                    }
                }
                indentLevel -= 4;
            }

            function dumpVideoAX()
            {
                debug("<br>+++++++++++++++++++++++++++++++++++<br>");
                debug("State at '" + event.type + "' event:<br>");

                if (!window.accessibilityController)
                    return;

                var body = document.getElementsByTagName("body")[0];
                body.focus();

                var vidAXObject = accessibilityController.focusedElement.childAtIndex(0);
                
                dumpChildren(vidAXObject);

                if (event.type == 'canplaythrough')
                    finishJSTest();
            }
        </script>
    </head>

<body>

    <video id=vid src="../media/content/test.mp4" controls oncanplaythrough="dumpVideoAX()">
    </video>

    <div>Dump &lt;video&gt; element controller accessibility object tree at 'canplaythrough' event.</div>
    
    <div id=console></div>

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

