<!DOCTYPE html><!-- webkit-test-runner [ ModernMediaControlsEnabled=false ] -->
<html>
<head>
    <script src="../resources/js-test-pre.js"></script>
    <script src="media-file.js"></script>
    <script src="video-test.js"></script>
    <script src="media-controls.js"></script>
</head>
<body>
    <p> Bug <a href="https://bugs.webkit.org/show_bug.cgi?id=127065">127065</a>: AX: Shadow DOM video player controls menus need aria-owns on the trigger buttons</p>
    <p id="console"></p>
    <video id="video" controls width="500">
        <source src="../media/content/counting.mp4" type="video/mp4">
        <track src="track/captions-webvtt/captions.vtt" label="English captions" kind="captions" srclang="en-us" default>
    </video>

    <script>
        var captionsButtonHTMLElement;
        var captionsButtonARIAOwnsValue;
        var captionsTrackMenuHTMLElement;
        var closedCaptionsTrackMenuIdValue;
        var video;

        if(!window.testRunner || !window.internals) {
           failTest();
        }

        testRunner.dumpAsText();

        start();

        function start() 
        {

            video = document.getElementById('video');
            
            captionsButtonHTMLElement = mediaControlsElement(internals.shadowRoot(video).firstChild, '-webkit-media-controls-toggle-closed-captions-button');

            checkForCCButtonARIAOwns();

            captionsButtonHTMLElement.click();

            ensureMenuExist();

            checkForCCTrackMenuId();

            confirmAriaOwnsRelationship();
            
            testRunner.notifyDone();
        }

        function log(message)
        {
            document.getElementById("console").appendChild(document.createTextNode(message + '\n\n'));
        }

        function checkForCCButtonARIAOwns() 
        {
            captionsButtonARIAOwnsValue = captionsButtonHTMLElement.getAttribute('aria-owns');
            log('Does the `aria-owns` on the CC button exist?');
            shouldNotBe('captionsButtonARIAOwnsValue', 'null');
            log('\n');
        }

        function ensureMenuExist()
        {
            captionsTrackMenuHTMLElement = mediaControlsElement(internals.shadowRoot(video).firstChild, '-webkit-media-controls-closed-captions-container');
            log('Did the Audio Track menu show up after the CC button is clicked?');
            shouldNotBe('captionsTrackMenuHTMLElement','null');
            log('\n');
        }

        function checkForCCTrackMenuId() 
        {
            closedCaptionsTrackMenuIdValue = captionsTrackMenuHTMLElement.getAttribute('id');
            log('Does the `id` of the menu exist?');
            shouldNotBe('closedCaptionsTrackMenuIdValue', 'null');
            log('\n');
        }

        function confirmAriaOwnsRelationship()
        {
            log('Is the `aria-own` on the CC button equal to the `id` on the menu?');
            shouldBe('captionsButtonARIAOwnsValue', 'closedCaptionsTrackMenuIdValue');
        }

    </script>

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