<!DOCTYPE html><!-- webkit-test-runner [ enableModernMediaControls=false ] -->
<html>
<head>
    <title>AirPlay target should persist across src change</title>
    <script src="media-file.js"></script>
    <script src="video-test.js"></script>
    <script>

    var phase = 'video-1';

    function start() 
    {
        findMediaElement();

        consoleWrite('** set video.src');
        run(`video.src = findMediaFile('video', 'content/test')`);
        video.addEventListener('webkitcurrentplaybacktargetiswirelesschanged', currentTargetChanged, true);
        waitForEventOnce('canplaythrough', canplaythrough);
        waitForEventOnce('ended', ended);
        consoleWrite('');
    }

    function canplaythrough()
    {
        consoleWrite('<br>** simulate choosing a device from the menu');
        runWithKeyDown(function() {
            run(`video.webkitShowPlaybackTargetPicker()`);
            setTimeout(function() {
                if (window.internals)
                    internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable');
            }, 100);
        });
        video.currentTime = video.duration - 1;
    }

    function currentTargetChanged(ev)
    {
        if (!video.webkitCurrentPlaybackTargetIsWireless)
            return;

        consoleWrite(`EVENT(${ev.type})`);
        switch (phase) {
        case 'video-1':
            phase = 'video-2';
            consoleWrite('<br>** start playing');
            run(`video.play()`);
            consoleWrite('');
            break;
        case 'video-2':
            endTest();
            break;
        }
    }

    function ended()
    {
        consoleWrite('<br>** reset video source');
        run(`video.src = findMediaFile('video', 'content/test')`);
        run(`video.play()`);
        consoleWrite('');
    }

    </script>
</head>
<body onload="start()">
    <video controls></video>
</body>
</html>
