<!-- webkit-test-runner [ ModernMediaControlsEnabled=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>
