<!DOCTYPE html>
<html>
<head>
    <title>audio-session-category-track-change</title>
    <script src="../../../media/video-test.js"></script>
    <script src="../../../media/media-file.js"></script>
    <script>
    async function go() {
        for (test of tests) {
            await test();
            consoleWrite('');
        }
        endTest();
    }

    function createVideo(parameters) {
        let target = document.querySelector('#target');
        target.innerHTML = '';

        let video = document.createElement('video');
        target.appendChild(video);

        if (!parameters)
            return video;

        if (parameters.autoplay)
            video.autoplay = parameters.autoplay;

        if (parameters.muted)
            video.muted = parameters.muted;

        if (parameters.size) {
            if (parameters.size === 'large') {
                video.width = 640;
                video.height = 480;
            } else if (parameters.size === 'small') {
                video.width = 320;
                video.height = 240;
            }
        }

        if (parameters.type) {
            if (parameters.type === 'audio+video')
                video.src = findMediaFile("video", "../../../media/content/test");
            else if (parameters.type === 'video')
                video.src = findMediaFile("video", "../../../media/content/long-test");
        }

        return video;
    }

    function enterFullscreen(target) {
        runWithKeyDown(`document.querySelector("${target}").webkitRequestFullscreen()`);
        return waitFor(document, 'webkitfullscreenchange');
    }

    function exitFullscreen() {
        runWithKeyDown('document.webkitExitFullscreen()');
        return waitFor(document, 'webkitfullscreenchange');
    }

    let tests = [
        function() {
            consoleWrite('Unloaded video elements should not be considered main content.');
            video = createVideo();
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', null)
        },

        async function() {
            consoleWrite('Large, autoplay videos with video and audio should be considered main content.')
            run('video = createVideo({autoplay: true, type: "audio+video", size: "large"})');
            await waitFor(video, 'playing');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', video)
        },

        async function() {
            consoleWrite('Small, autoplay videos with video and audio should be considered main content.')
            run('video = createVideo({autoplay: true, type: "audio+video", size: "small"})');
            await waitFor(video, 'playing');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', null)
        },

        async function() {
            consoleWrite('Muted autoplay videos should not be considered main content.')
            run('video = createVideo({autoplay: true, muted: true, type: "audio+video", size: "large"})');
            await waitFor(video, 'playing');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', null)
        },

        async function() {
            consoleWrite('Video-only autoplay videos should not be considered main content.')
            run('video = createVideo({autoplay: true, type: "video", size: "large"})');
            await waitFor(video, 'playing');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', null)
        },

        async function() {
            consoleWrite('Non-playing videos should not be considered main content.')
            run('video = createVideo({type: "audio+video", size: "large"})');
            await waitFor(video, 'canplaythrough');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', null)
        },

        async function() {
            consoleWrite('Large, autoplay videos outside fullscreen element should not be considered main content');
            run('video = createVideo({autoplay: true, muted: true, type: "audio+video", size: "large"})');
            await waitFor(video, 'playing');
            await enterFullscreen('#fullscreen');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', null);
            await exitFullscreen();
        },

        async function() {
            consoleWrite('Large, autoplay videos inside fullscreen element should be considered main content');
            run('video = createVideo({autoplay: true, type: "audio+video", size: "large"})');
            await waitFor(video, 'playing');
            await enterFullscreen('#target');
            testExpected('internals.bestMediaElementForShowingPlaybackControlsManager("ControlsManager")', video);
            await exitFullscreen();
        },
    ];

    </script>
</head>
<body onload="go()">
    <div id="target"></div>
    <div id="fullscreen"></div>
</body>
</html>
