<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>VP9 in WebRTC</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <video id="video" autoplay playsInline width="320" height="240"></video>
        <canvas id="canvas1" width="320" height="240"></canvas>
        <canvas id="canvas2" width="320" height="240"></canvas>
        <canvas id="canvas3" width="320" height="240"></canvas>
        <script src ="routines.js"></script>
        <script>
let hasVP9 = false;
test(() => {
    if (window.internals)
        window.internals.setWebRTCVP9Support(false, false);

    let codecs = RTCRtpSender.getCapabilities("video").codecs;
    vp9Codecs = codecs.filter(codec => codec.mimeType === "video/VP9");
    assert_equals(vp9Codecs.length, 0, "no vp9 codec");

    if (window.internals)
        window.internals.setWebRTCVP9Support(true, false);

    codecs = RTCRtpSender.getCapabilities("video").codecs;
    vp9Codecs = codecs.filter(codec => codec.mimeType === "video/VP9");
    assert_equals(vp9Codecs.length, 1, "One vp9 codec");
    assert_equals(vp9Codecs[0].sdpFmtpLine, "profile-id=0", "profile 0");

    if (window.internals)
        window.internals.setWebRTCVP9Support(true, true);

    codecs = RTCRtpSender.getCapabilities("video").codecs;
    vp9Codecs = codecs.filter(codec => codec.mimeType === "video/VP9");
    assert_equals(vp9Codecs[0].sdpFmtpLine, "profile-id=0", "first codec");
    assert_equals(vp9Codecs[1].sdpFmtpLine, "profile-id=2", "second codec");

    hasVP9 = true;
}, "VP9 in sender getCapabilities");

test(() => {
    if (window.internals)
        window.internals.setWebRTCVP9Support(false, false);

    let codecs = RTCRtpReceiver.getCapabilities("video").codecs;
    vp9Codecs = codecs.filter(codec => codec.mimeType === "video/VP9");
    assert_equals(vp9Codecs.length, 0, "no vp9 codec");

    if (window.internals)
        window.internals.setWebRTCVP9Support(true, false);

    codecs = RTCRtpReceiver.getCapabilities("video").codecs;
    vp9Codecs = codecs.filter(codec => codec.mimeType === "video/VP9");
    assert_equals(vp9Codecs.length, 1, "One vp9 codec");
    assert_equals(vp9Codecs[0].sdpFmtpLine, "profile-id=0", "profile 0");

    if (window.internals)
        window.internals.setWebRTCVP9Support(true, true);

    codecs = RTCRtpReceiver.getCapabilities("video").codecs;
    vp9Codecs = codecs.filter(codec => codec.mimeType === "video/VP9");
    assert_equals(vp9Codecs[0].sdpFmtpLine, "profile-id=0", "first codec");
    assert_equals(vp9Codecs[1].sdpFmtpLine, "profile-id=2", "second codec");
}, "VP9 in receiver getCapabilities");

if (hasVP9) {
    promise_test(async (test) => {
        const pc = new RTCPeerConnection();
        pc.addTransceiver("video");
        const description = await pc.createOffer();
        pc.close();
        assert_true(description.sdp.indexOf("VP9") !== -1, "VP9 codec is in the SDP");
    }, "Verify VP9 activation")

    var track;
    var remoteTrack;
    var receivingConnection;
    promise_test((test) => {
        return navigator.mediaDevices.getUserMedia({video: {width: 320, height: 240, facingMode: "environment"}}).then((localStream) => {
            return new Promise((resolve, reject) => {
                track = localStream.getVideoTracks()[0];

                createConnections((firstConnection) => {
                    firstConnection.addTrack(track, localStream);
                }, (secondConnection) => {
                    receivingConnection = secondConnection;
                    secondConnection.ontrack = (trackEvent) => {
                        remoteTrack = trackEvent.track;
                        resolve(trackEvent.streams[0]);
                    };
                }, { observeOffer : (offer) => {
                    offer.sdp = setCodec(offer.sdp, "VP9");
                    return offer;
                }
                });
                setTimeout(() => reject("Test timed out"), 5000);
            });
        }).then((remoteStream) => {
            video.srcObject = remoteStream;
            return video.play();
        });
    }, "Setting video exchange");

    promise_test(() => {
        if (receivingConnection.connectionState === "connected")
            return Promise.resolve();
        return new Promise((resolve, reject) => {
            receivingConnection.onconnectionstatechange = () => {
                if (receivingConnection.connectionState === "connected")
                    resolve();
            };
            setTimeout(() => reject("Test timed out"), 5000);
        });
    }, "Ensuring connection state is connected");

    promise_test((test) => {
        return checkVideoBlack(false, canvas1, video);
    }, "Track is enabled, video should not be black");

    promise_test((test) => {
        track.enabled = false;
        return checkVideoBlack(true, canvas2, video);
    }, "Track is disabled, video should be black");

    promise_test((test) => {
        track.enabled = true;
        return checkVideoBlack(false, canvas2, video);
    }, "Track is enabled, video should not be black 2");
}
        </script>
    </body>
</html>
