<script src="../../../resources/js-test-pre.js"></script>
<script src="../resources/media-controls-loader.js" type="text/javascript"></script>
<body>
<video src="../../content/test.mp4" style="width: 320px; height: 240px;" autoplay controls></video>
<div id="host"></div>
<script type="text/javascript">

window.jsTestIsAsync = true;

description("Testing <code>AirPlaySupport</code> stops listening to webkitplaybacktargetavailabilitychanged events when the controls are not visible to the user.");

const container = document.querySelector("div#host");
const media = document.querySelector("video");
const mediaController = createControls(container, media, null);
const controls = mediaController.controls;

controls.autoHideController.autoHideDelay = 100;

media.addEventListener("canplay", startTest);

function startTest()
{
    debug("Starting test.");
    shouldBeTrue("controls.visible");
    shouldBeFalse("controls.faded");

    debug("");
    debug("Now we wait for the controls to fade after a period of inactivity.");
    shouldBecomeEqual("controls.faded", "true", makeAirPlayAvailable);
}

function makeAirPlayAvailable()
{
    debug("");
    debug("Before turning AirPlay routes on, we check the AirPlay control state.");
    shouldBeFalse("controls.airplayButton.enabled");

    debug("");
    debug("Making AirPlay routes available.");
    media.addEventListener("webkitplaybacktargetavailabilitychanged", playbackTargetAvailabilityChangedOnce, true);
    window.internals.setMockMediaPlaybackTargetPickerEnabled(true);
}

function playbackTargetAvailabilityChangedOnce(event)
{
    media.removeEventListener('webkitplaybacktargetavailabilitychanged', playbackTargetAvailabilityChangedOnce, true);
    media.addEventListener('webkitplaybacktargetavailabilitychanged', playbackTargetAvailabilityChangedAgain, true);

    window.internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable');
}

function playbackTargetAvailabilityChangedAgain(event)
{
    // setMockMediaPlaybackTargetPickerState happens asynchronously in WK2 and a
    // "webkitplaybacktargetavailabilitychanged" is always sent when an event listener
    // is added, so we may get a "not available" event first.
    if (event.availability == 'not-available')
        return;

    media.removeEventListener('webkitplaybacktargetavailabilitychanged', playbackTargetAvailabilityChangedAgain, true);

    shouldBeFalse("controls.airplayButton.enabled");

    debug("");
    debug("We pause the media so that controls can show again.");
    media.addEventListener("pause", mediaDidPause);
    media.pause();
}

function mediaDidPause()
{
    debug("");
    debug("Media paused, the AirPlay button should be enabled now that controls are visible.");
    shouldBeFalse("controls.faded");
    shouldBecomeEqual("controls.airplayButton.enabled", "true", finishTest);
}

function finishTest()
{
    debug("");
    container.remove();
    media.remove();
    finishJSTest();
}

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