<html>
    <head>
        <script src='media-file.js'></script>
        <script src='video-test.js'></script>
        <script>
            var video;
            var callbackId;

            var nextStep;

            function start()
            {
                findMediaElement();

                if (window.internals) {
                    internals.setMockMediaPlaybackTargetPickerEnabled(true);
                    internals.settings.setAllowsAirPlayForMediaPlayback(true);
                }

                consoleWrite('<br>** prompt() when disableRemotePlayback is set should fail');
                run('video.disableRemotePlayback = true');
                video.remote.prompt().then(failTest).catch(handleDisabledError);
            }

            function handleDisabledError(error)
            {
                consoleWrite(`EXPECTED ERROR: ${ error }`);
                run('video.disableRemotePlayback = false');
                consoleWrite('<br>** prompt() outside of a user action should fail');
                video.remote.prompt().then(failTest).catch(handleUserGestureError);
            }

            function handleUserGestureError(error)
            {
                consoleWrite(`EXPECTED ERROR: ${ error }`);
                consoleWrite('<br>** prompt() when no targets are available should fail');
                runWithKeyDown(() => { video.remote.prompt().then(failTest).catch(handleNoTargetError); });
            }

            function handleNoTargetError(error)
            {
                consoleWrite(`EXPECTED ERROR: ${ error }`);
                consoleWrite('<br>** Simulate a device becoming available')

                video.remote.watchAvailability(availabilityChanged).catch(failTest);
                if (window.internals)
                    internals.setMockMediaPlaybackTargetPickerState('', 'DeviceAvailable');
            }

            function availabilityChanged(available)
            {
                if (!available)
                    return;

                if (video.src)
                    return;

                run('video.src = findMediaFile("video", "content/test")');
                waitForEvent('canplaythrough', canplaythrough);
            }

            function canplaythrough()
            {
                consoleWrite('<br>** Simulate a device becoming selected');
                runWithKeyDown(() => { video.remote.prompt().catch(failTest); });
                if (window.internals)
                    internals.setMockMediaPlaybackTargetPickerState('Sleepy TV', 'DeviceAvailable');
                waitForEventOn(video.remote, 'connecting');
                waitForEventOn(video.remote, 'connect', endTest);
            }

        </script>
    </head>

    <body onload='start()'>
        <video controls></video>
        <p>Test the operation of prompt().</p>
    </body>
</html>
