<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
if (window.internals)
    window.internals.settings.setWebGLErrorsToConsoleEnabled(false);

let requestAnimationFrameId = NaN;

function cancelActions() {
    cancelAnimationFrame(requestAnimationFrameId);
    requestAnimationFrameId = NaN;
}

function performActions(frames) {
    let index = 0;
    function executeFrameFunction() {
        frames[index++]();

        if (index < frames.length)
            requestAnimationFrameId = requestAnimationFrame(executeFrameFunction);
        else {
            setTimeout(() => {
                TestPage.dispatchEventToFrontend("LastFrame");
            }, 0);
        }
    };
    executeFrameFunction();
}

function performActions2D() {
    let context = document.createElement("canvas").getContext("2d");
    performActions([
        () => {
            context.fill();
        },
        () => {
            context.stroke();
        },
    ]);
}

function performActionsWebGL() {
    let context = document.createElement("canvas").getContext("webgl");
    performActions([
        () => {
            context.drawArrays(1, 2, 3);
        },
        () => {
            context.drawElements(1, 2, 3, 4);
        },
    ]);
}

function test() {
    let suite = InspectorTest.createAsyncSuite("Canvas.setRecordingAutoCaptureFrameCount");

    function addTest({name, description, frameCount, expression, handleRecordingStarted, handleRecordingStopped, handleLastFrame}) {
        suite.addTestCase({
            name,
            description,
            test(resolve, reject) {
                let canvas = null;

                function handleRecordingStartedWrapper(event)
                {
                    InspectorTest.assert(event.target === canvas, "Should be recording the canvas.");

                    handleRecordingStarted(canvas);
                }

                function handleRecordingStoppedWrapper(event)
                {
                    InspectorTest.assert(event.target === canvas, "Should be recording the canvas.");

                    handleRecordingStopped(canvas, event.data.recording);
                }

                WI.canvasManager.singleFireEventListener(WI.CanvasManager.Event.CanvasAdded, (event) => {
                    canvas = event.data.canvas;
                    InspectorTest.assert(!canvas.recordingActive)

                    canvas.addEventListener(WI.Canvas.Event.RecordingStarted, handleRecordingStartedWrapper);
                    canvas.addEventListener(WI.Canvas.Event.RecordingStopped, handleRecordingStoppedWrapper);
                });

                InspectorTest.awaitEvent("LastFrame")
                .then((event) => {
                    canvas.removeEventListener(WI.Canvas.Event.RecordingStarted, handleRecordingStartedWrapper);
                    canvas.removeEventListener(WI.Canvas.Event.RecordingStopped, handleRecordingStoppedWrapper);

                    handleLastFrame(canvas);
                })
                .then(resolve, reject);

                CanvasAgent.setRecordingAutoCaptureFrameCount(frameCount)
                .then(() => {
                    InspectorTest.evaluateInPage(expression).catch(reject);
                })
                .catch(reject);
            },
        });
    }

    addTest({
        name: "Canvas.setRecordingAutoCaptureFrameCount.2D.None",
        description: "Check that newly created 2D contexts are not recorded when setRecordingAutoCaptureFrameCount is 0.",
        frameCount: 0,
        expression: `performActions2D()`,
        handleRecordingStarted(canvas) {
            InspectorTest.fail("Canvas should not be recording.");
        },
        handleRecordingStopped(canvas, recording) {
            InspectorTest.fail("Canvas should not be recording.");
        },
        handleLastFrame(canvas) {
            InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
        },
    });

    addTest({
        name: "Canvas.setRecordingAutoCaptureFrameCount.2D.Single",
        description: "Check that newly created 2D contexts only record one frame when setRecordingAutoCaptureFrameCount is 1.",
        frameCount: 1,
        expression: `performActions2D()`,
        handleRecordingStarted(canvas) {
            InspectorTest.pass("Recording started.");
        },
        handleRecordingStopped(canvas, recording) {
            InspectorTest.pass("Recording stopped.");
            InspectorTest.expectEqual(recording.frames.length, 1, "Recording should have one frame.");
            InspectorTest.expectEqual(recording.frames[0].actions.length, 1, "Recording should have one action.");
        },
        handleLastFrame(canvas) {
            InspectorTest.expectEqual(canvas.recordingCollection.size, 1, "Canvas should have one finished recording.");
        },
    });

    addTest({
        name: "Canvas.setRecordingAutoCaptureFrameCount.2D.Multiple",
        description: "Check that newly created 2D contexts don't finish recording when setRecordingAutoCaptureFrameCount is 10.",
        frameCount: 10,
        expression: `performActions2D()`,
        handleRecordingStarted(canvas) {
            InspectorTest.pass("Recording started.");
        },
        handleRecordingStopped(canvas, recording) {
            InspectorTest.fail("Canvas should not be done recording.");
        },
        handleLastFrame(canvas) {
            InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
            InspectorTest.expectThat(canvas.recordingActive, "Canvas should be actively recording.");
            InspectorTest.expectEqual(canvas.recordingFrameCount, 2, "Recording should have 2 frames.");

            canvas.stopRecording();
        },
    });

    addTest({
        name: "Canvas.setRecordingAutoCaptureFrameCount.WebGL.None",
        description: "Check that newly created WebGL contexts are not recorded when setRecordingAutoCaptureFrameCount is 0.",
        frameCount: 0,
        expression: `performActionsWebGL()`,
        handleRecordingStarted(canvas) {
            InspectorTest.fail("Canvas should not be recording.");
        },
        handleRecordingStopped(canvas, recording) {
            InspectorTest.fail("Canvas should not be recording.");
        },
        handleLastFrame(canvas) {
            InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
        },
    });

    addTest({
        name: "Canvas.setRecordingAutoCaptureFrameCount.WebGL.Single",
        description: "Check that newly created WebGL contexts only record one frame when setRecordingAutoCaptureFrameCount is 1.",
        frameCount: 1,
        expression: `performActionsWebGL()`,
        handleRecordingStarted(canvas) {
            InspectorTest.pass("Recording started.");
        },
        handleRecordingStopped(canvas, recording) {
            InspectorTest.pass("Recording stopped.");
            InspectorTest.expectEqual(recording.frames.length, 1, "Recording should have one frame.");
            InspectorTest.expectEqual(recording.frames[0].actions.length, 1, "Recording should have one action.");
        },
        handleLastFrame(canvas) {
            InspectorTest.expectEqual(canvas.recordingCollection.size, 1, "Canvas should have one finished recording.");
        },
    });

    addTest({
        name: "Canvas.setRecordingAutoCaptureFrameCount.WebGL.Multiple",
        description: "Check that newly created WebGL contexts don't finish recording when setRecordingAutoCaptureFrameCount is 10.",
        frameCount: 10,
        expression: `performActionsWebGL()`,
        handleRecordingStarted(canvas) {
            InspectorTest.pass("Recording started.");
        },
        handleRecordingStopped(canvas, recording) {
            InspectorTest.fail("Canvas should not be done recording.");
        },
        handleLastFrame(canvas) {
            InspectorTest.expectEqual(canvas.recordingCollection.size, 0, "Canvas should have no finished recordings.");
            InspectorTest.expectThat(canvas.recordingActive, "Canvas should be actively recording.");
            InspectorTest.expectEqual(canvas.recordingFrameCount, 2, "Recording should have 2 frames.");

            canvas.stopRecording();
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Test that contexts created after calling Canvas.setRecordingAutoCaptureFrameCount are properly recorded.</p>
</body>
</html>
