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

            let usage;
            let videoURL;

            window.addEventListener('load', async event => {

                if (!window.internals) {
                    failTest(`<br>This test requires internals!`);
                    return;
                }

                findMediaElement();

                run('internals.setMediaElementRestrictions(video, "RequireUserGestureForAudioRateChange,RequireUserGestureForVideoRateChange,RequireUserGestureToControlControlsManager")');

                videoURL = findMediaFile("video", "content/test");
                video.src = videoURL;

                await waitFor(video, 'canplaythrough');

                consoleWrite("<br>** Check state before playback.")
                usage = internals.mediaUsageState(video);
                testExpected(`usage.mediaURL.indexOf('${videoURL}')`, -1, '>');
                testExpected('usage.isPlaying', false);
                testExpected('usage.canShowControlsManager', false);
                testExpected('usage.canShowNowPlayingControls', false);
                testExpected('usage.isSuspended', false);
                testExpected('usage.isInActiveDocument', true);
                testExpected('usage.isFullscreen', false);
                testExpected('usage.isMuted', false);
                testExpected('usage.isMediaDocumentInMainFrame', false);
                testExpected('usage.isVideo', true);
                testExpected('usage.isAudio', false);
                testExpected('usage.hasVideo', true);
                testExpected('usage.hasAudio', true);
                testExpected('usage.hasRenderer', true);
                testExpected('usage.audioElementWithUserGesture', false);
                testExpected('usage.userHasPlayedAudioBefore', false);
                testExpected('usage.isElementRectMostlyInMainFrame', true);
                testExpected('usage.playbackPermitted', false);
                testExpected('usage.pageMediaPlaybackSuspended', false);
                testExpected('usage.isMediaDocumentAndNotOwnerElement', false);
                testExpected('usage.pageExplicitlyAllowsElementToAutoplayInline', false);
                testExpected('usage.requiresFullscreenForVideoPlaybackAndFullscreenNotPermitted', false);
                testExpected('usage.hasHadUserInteractionAndQuirksContainsShouldAutoplayForArbitraryUserGesture', false);
                testExpected('usage.isVideoAndRequiresUserGestureForVideoRateChange', true);
                testExpected('usage.isAudioAndRequiresUserGestureForAudioRateChange', false);
                testExpected('usage.isVideoAndRequiresUserGestureForVideoDueToLowPowerMode', false);
                testExpected('usage.noUserGestureRequired', false);
                testExpected('usage.requiresPlaybackAndIsNotPlaying', false);
                testExpected('usage.hasEverNotifiedAboutPlaying', false);
                testExpected('usage.outsideOfFullscreen', false);
                testExpected('usage.isLargeEnoughForMainContent', false);

                consoleWrite("<br>** Mute video.")
                run('video.muted = true');
                usage = internals.mediaUsageState(video);
                testExpected('usage.isMuted', true);

                consoleWrite("<br>** Unmute video.")
                run('video.muted = false');
                usage = internals.mediaUsageState(video);
                testExpected('usage.isMuted', false);

                consoleWrite("<br>** Try to play without user gesture, should reject and state should not change.")
                await shouldReject(video.play());

                usage = internals.mediaUsageState(video);
                testExpected('usage.isPlaying', false);
                testExpected('usage.canShowControlsManager', false);
                testExpected('usage.userHasPlayedAudioBefore', false);
                testExpected('usage.playbackPermitted', false);
                testExpected('usage.isVideoAndRequiresUserGestureForVideoRateChange', true);
                testExpected('usage.noUserGestureRequired', false);

                consoleWrite("<br>** Try to play without user gesture, should succeed and state should change.")
                runWithKeyDown(() => { 
                    video.play(); 
                });
                await waitFor(video, 'playing');

                usage = internals.mediaUsageState(video);
                testExpected('usage.isPlaying', true);
                testExpected('usage.canShowControlsManager', true);
                testExpected('usage.userHasPlayedAudioBefore', true);
                testExpected('usage.playbackPermitted', true);
                testExpected('usage.isVideoAndRequiresUserGestureForVideoRateChange', false);
                testExpected('usage.noUserGestureRequired', true);

                endTest();
            });

        </script>
    </head>
    <body>
        <video controls></video>
        <p>Test mediaUsageState.</p>
    </body>
</html>
