<!doctype html>
<html>
<head>
    <title>MediaRecorder Pause and Resume</title>
    <link rel="help" href="https://w3c.github.io/mediacapture-record/MediaRecorder.html#mediarecorder">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
</head>
<body>
<canvas id="canvas" width="200" height="200">
</canvas>
<script>
    function createVideoStream() {
        const canvas = document.getElementById("canvas");
        const ctx = canvas.getContext('2d');
        ctx.fillStyle = 'green';
        ctx.fillRect(0, 0, canvas.width, canvas.height);
        return canvas.captureStream();
    }

    function recordEvents(target, events) {
        let arr = [];
        for (let ev of events) {
            target.addEventListener(ev, _ => arr.push(ev));
        }
        return arr;
    }

    promise_test(async () => {
        let video = createVideoStream();
        let recorder = new MediaRecorder(video);
        let events = recordEvents(recorder,
            ["start", "stop", "dataavailable", "pause", "resume", "error"]);

        recorder.start();
        assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully");
        await new Promise(r => recorder.onstart = r);

        recorder.pause();
        assert_equals(recorder.state, "paused", "MediaRecorder should be paused immediately following pause()");

        // A second call to pause should be idempotent
        recorder.pause();
        assert_equals(recorder.state, "paused", "MediaRecorder should be paused immediately following pause()");

        let event = await new Promise(r => recorder.onpause = r);
        assert_equals(event.type, "pause", "the event type should be pause");
        assert_true(event.isTrusted, "isTrusted should be true when the event is created by C++");

        recorder.resume();
        assert_equals(recorder.state, "recording", "MediaRecorder state should be recording immediately following resume() call");

        // A second call to resume should be idempotent
        recorder.resume();
        assert_equals(recorder.state, "recording", "MediaRecorder state should be recording immediately following resume() call");

        event = await new Promise(r => recorder.onresume = r);
        assert_equals(event.type, "resume", "the event type should be resume");
        assert_true(event.isTrusted, "isTrusted should be true when the event is created by C++");

        recorder.stop();
        await new Promise(r => recorder.onstop = r);

        assert_array_equals(events, ["start", "pause", "resume", "dataavailable", "stop"],
            "Should have gotten expected events");
    }, "MediaRecorder handles pause() and resume() calls appropriately in state and events");

    promise_test(async () => {
        let video = createVideoStream();
        let recorder = new MediaRecorder(video);
        let events = recordEvents(recorder,
            ["start", "stop", "dataavailable", "pause", "resume", "error"]);

        recorder.start();
        assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully");
        await new Promise(r => recorder.onstart = r);

        recorder.pause();
        assert_equals(recorder.state, "paused", "MediaRecorder should be paused immediately following pause()");
        let event = await new Promise(r => recorder.onpause = r);
        assert_equals(event.type, "pause", "the event type should be pause");
        assert_true(event.isTrusted, "isTrusted should be true when the event is created by C++");

        recorder.stop();
        assert_equals(recorder.state, "inactive", "MediaRecorder should be inactive after being stopped");
        await new Promise(r => recorder.onstop = r);

        recorder.start();
        assert_equals(recorder.state, "recording", "MediaRecorder has been started successfully");
        await new Promise(r => recorder.onstart = r);

        assert_array_equals(events, ["start", "pause", "dataavailable", "stop", "start"],
            "Should have gotten expected events");
    }, "MediaRecorder handles stop() in paused state appropriately");
</script>
</body>
</html>
