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

            function start()
            {
                findMediaElement();

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

                consoleWrite('** create initial callback');
                run('video.disableRemotePlayback = true');
                video.remote.watchAvailability(callback).then(failTest).catch(handleInitialError);
            }

            function callback(available) { };

            function handleInitialError(exception)
            {
                consoleWrite(`EXPECTED ERROR: ${ exception }`);
                consoleWrite('** try again without disableRemotePlayback');
                run('video.disableRemotePlayback = false');
                video.remote.watchAvailability(callback).then(succeeded).catch(failTest);
            }

            function succeeded(id)
            {
                consoleWrite('SUCCEEDED');
                consoleWrite('** set disableRemotePlayback and try to cancel callback');
                run('video.disableRemotePlayback = true');
                video.remote.cancelWatchAvailability(id).then(failTest).catch(handleError);
            }

            function handleError(exception)
            {
                consoleWrite(`EXPECTED ERROR: ${ exception }`);
                endTest();
            }
        </script>
    </head>

    <body onload='start()'>
        <video controls></video>
        <p>Test that trying to watchAvailability on a video with the "disableremoteplayback" attribute set will generate an error.</p>
    </body>
</html>
