<!DOCTYPE html>
<html>
<head>
    <script src=../../../../media/video-test.js></script>
    <script type="text/javascript">
    var promise;
    var info;

    function MediaCapabilitiesInfoToString(info) {
        try {
            return `{ supported: ${ info.supported }, powerEfficient: ${ info.powerEfficient }, smooth: ${ info.smooth } }`;
        } catch(e) {
            return `{ ${set} }`;
        }
    }

    function isEqualMediaCapabilitiesInfo(infoA, infoB) {
        try {
            return infoA.supported === infoB.supported
                && infoA.powerEfficient === infoB.powerEfficient
                && infoA.smooth === infoB.smooth;
        } catch(e) {
            return false;
        }
    }

    function testExpectedMediaCapabilitiesInfo(testFuncString, expected)
    {
        let observed = eval(testFuncString);
        let success = isEqualMediaCapabilitiesInfo(observed, expected);
        reportExpected(success, testFuncString, '===', MediaCapabilitiesInfoToString(expected), MediaCapabilitiesInfoToString(observed));
    }

    async function doTest()
    {
        if (!window.internals) {
            failTest("Internals is required for this test.")
            return;
        }

        run('internals.setSystemHasBatteryForTesting(true)');
        run('internals.setSystemHasACForTesting(true)');
        run('internals.setHardwareVP9DecoderDisabledForTesting(true)');
        run('internals.setVP9ScreenSizeAndScaleForTesting(1024, 768, 1)');

        consoleWrite('');
        consoleWrite('Test that 4k @ 30fps is supported, smooth, but not powerEfficient');
        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.08\"', height: 1080, bitrate: 800000, width: 3180, framerate: 30 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: true, powerEfficient: false, smooth: true});

        consoleWrite('');
        consoleWrite('Test that 4k @ 60fps is supported, but not smooth or powerEfficient');

        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.08\"', height: 1080, bitrate: 800000, width: 3180, framerate: 60 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: true, powerEfficient: false, smooth: false});

        consoleWrite('');
        consoleWrite('Test unsupported codec configurations.');
        consoleWrite('Profiles 1 and 3 should be unsupported.');
        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.01.41.08\"', height: 1080, bitrate: 800000, width: 3180, framerate: 30 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: false, powerEfficient: false, smooth: false});

        consoleWrite('');
        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.03.41.08\"', height: 1080, bitrate: 800000, width: 3180, framerate: 30 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: false, powerEfficient: false, smooth: false});

        consoleWrite('');
        consoleWrite('Pixel depths above 10 are unsupported.');

        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.12\"', height: 1080, bitrate: 800000, width: 3180, framerate: 60 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: false, powerEfficient: false, smooth: false});

        consoleWrite('');
        consoleWrite('Chroma subsampling 422 or 444 are unsupported.');

        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.08.02.01.01.01.01\"', height: 1080, bitrate: 800000, width: 3180, framerate: 60 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: false, powerEfficient: false, smooth: false});

        consoleWrite('');
        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.08.03.01.01.01.01\"', height: 1080, bitrate: 800000, width: 3180, framerate: 60 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: false, powerEfficient: false, smooth: false});

        consoleWrite('');
        consoleWrite('Test that SW VP9 decoder is not supported on battery power when screen is not 4k resolution');
        run('internals.setSystemHasACForTesting(false)');
        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.08\"', height: 1080, bitrate: 800000, width: 3180, framerate: 30 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: false, powerEfficient: false, smooth: false});

        consoleWrite('');
        consoleWrite('Test that SW VP9 decoder is supported on battery power when screen is at least 4k resolution');
        run('internals.setVP9ScreenSizeAndScaleForTesting(3840, 2160, 1)');
        run("promise = navigator.mediaCapabilities.decodingInfo({ type: 'media-source', video: { contentType: 'video/mp4; codecs=\"vp09.00.41.08\"', height: 1080, bitrate: 800000, width: 3180, framerate: 30 }});");
        info = await shouldResolve(promise);
        testExpectedMediaCapabilitiesInfo('info', {supported: true, powerEfficient: false, smooth: true});

        endTest();
    }
    </script>
</head>
<body onload="doTest()" />
</html>
