<!-- webkit-test-runner [ enableModernMediaControls=false ] -->
<body onload="initialChecksBeforePlay()">
<p>
    This tests:<br>
    1. Initially, toolbar is visible, "Show Controls" button is not.<br>
    2. After the video controls fade out, they can be shown when VoiceOver or a keyboard user clicks the invisible "Show Controls" button.<br>
    3. When the video is paused, the controls become visible and the "Show Controls" button is hidden.<br>
</p>

<video id="video" controls onplaying="testPlaying()"  onpause="testPausing()" src="content/long-test.mp4"></video><br>

<p id="result">
    FAIL: Test did not run.<br>
</p>
<script>
    if (window.testRunner) {
        testRunner.waitUntilDone();
        testRunner.dumpAsText();
    }

    var result = document.getElementById("result");
    result.innerHTML = "";
    // Initially, the showControls Button should be hidden.
    var root = internals.shadowRoot(document.getElementById("video"));
    var button = root.firstChild.querySelector('button');
    var controls = root.firstChild.querySelector('[role="toolbar"]');
    var video = document.getElementById('video');

    function isElementHidden(elem) {
        return (elem.hidden && getComputedStyle(elem).display === 'none')
    }
    function initialChecksBeforePlay() {
        // Before we start, check to make sure toolbar is in place and showControlsbutton is hidden.
        result.innerHTML += (!isElementHidden(controls))? 'PASS<br>': 'FAIL: Controls are not available at the beginning.<br>';
        result.innerHTML += (isElementHidden(button))? 'PASS<br>': 'FAIL: "Show Controls" button is not hidden initially.<br>';

        video.play();
    }

    function testPlaying() {
        // Make sure we are getting the updated root and button.
        root = internals.shadowRoot(document.getElementById("video"));

        // We give it a 100ms buffer for the video to set all the properties before sending mouse events.
        setTimeout(function () {
            // Mouse over the video then mouse out to hide controls more quickly.
            eventSender.mouseMoveTo(150,150);
            eventSender.mouseMoveTo(0,0);
        }, 100);

        // 300ms after the mouse events, all UI changes should complete and we can start making assertions.
        setTimeout(function() {
            // Make sure we are getting the latest copy of the element.
            controls = root.firstChild.querySelector('[role="toolbar"]');
            result.innerHTML += !controls? 'PASS<br>': 'FAIL: Toolbar still around after mouseout.<br>';

            // Make sure we are getting the latest copy of the element.
            button = root.firstChild.querySelector('button');
            result.innerHTML += !isElementHidden(button)? 'PASS<br>': 'FAIL: Button should be visible.<br>';

            if(button && !isElementHidden(button)) {
                button.focus();
                eventSender.keyDown(' ');
            } else 
                result.innerHTML += 'FAIL: "Show Controls" button is hidden or unavailable.<br>';

            // Make sure we are getting the latest copy of the element.
            controls = root.firstChild.querySelector('[role="toolbar"]');
            result.innerHTML += controls? 'PASS<br>': 'FAIL: Toolbar should exist<br>';

            eventSender.mouseMoveTo(150,150);
            eventSender.mouseMoveTo(0,0);

            setTimeout(function () {
                controls = root.firstChild.querySelector('[role="toolbar"]');
                result.innerHTML += !controls? 'PASS<br>': 'FAIL: Toolbar should not exist<br>';
                // We are done testing playing state, moving on to testing the paused state.
                video.pause();
            }, 300);
        }, 400);
    }

    function testPausing() {
        // We are giving 100ms + 300s buffer for the video to set its properties and make UI changes.
        setTimeout(function () {
            controls = root.firstChild.querySelector('[role="toolbar"]');
            result.innerHTML += controls? 'PASS<br>': 'FAIL: Toolbar should exist<br>';

            button = root.firstChild.querySelector('button');
            result.innerHTML += isElementHidden(button)? 'PASS<br>': 'FAIL: Button should not be visible.<br>';

            testRunner.notifyDone();
        }, 400);
    }
</script>
</body>
