<!doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Testing muting video</title>
        <script src="../resources/testharness.js"></script>
        <script src="../resources/testharnessreport.js"></script>
    </head>
    <body>
        <div>Video should be running, go to black and running.</div>
        <div>Following, should be a snapshot of the video, a black frame and a snapshot of the video.</div>
        <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>
var hasH265 = false;
test(() => {
    if (window.internals)
        window.internals.setWebRTCH265Support(false);

    let codecs = RTCRtpSender.getCapabilities("video").codecs;
    hasH265 = codecs.some((codec) => { return codec.mimeType == "video/H265"; });
    assert_false(hasH265);

    if (window.internals)
        window.internals.setWebRTCH265Support(true);

    codecs = RTCRtpSender.getCapabilities("video").codecs;
    hasH265 = codecs.some((codec) => { return codec.mimeType == "video/H265"; });
    assert_true(hasH265);
}, "H265 in getCapabilities");

if (hasH265) {
    promise_test(async (test) => {
        const pc = new RTCPeerConnection();
        pc.addTransceiver("video");
        const description = await pc.createOffer();
        pc.close();
        assert_true(description.sdp.indexOf("H265") !== -1, "H265 codec is in the SDP");
    }, "Verify H265 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, "H265");
                    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>
