<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/recording-utilities.js"></script>
<script src="resources/recording-2d.js"></script>
<script>
function test() {
    let suite = InspectorTest.createAsyncSuite("Canvas.recording2D");

    suite.addTestCase({
        name: "Canvas.recording2D.ExistingSaves",
        description: "Check that existing save calls are sent to the frontend.",
        test(resolve, reject) {
            let canvas = getCanvas(WI.Canvas.ContextType.Canvas2D);
            if (!canvas) {
                reject("Missing 2D canvas.");
                return;
            }

            async function logStates(recording) {
                async function compare(index, expected) {
                    let state = await WI.RecordingState.swizzleInitialState(recording, recording.initialState.states[index]);
                    InspectorTest.expectEqual(state.get("fillStyle"), expected, `State ${index} should match expected fillStyle value.`)
                }

                await compare(0, "#000000");
                await compare(1, "#ff0000");
                await compare(2, "#00ff00");
                await compare(3, "#0000ff");
            }

            canvas.awaitEvent(WI.Canvas.Event.RecordingStopped)
            .then((event) => {
                let {recording} = event.data;

                InspectorTest.expectEqual(recording.initialState.states.length, 4, "There should be 4 existing states.");

                logStates(recording)
                .then(resolve, reject);
            });

            canvas.awaitEvent(WI.Canvas.Event.RecordingStarted)
            .then((event) => {
                InspectorTest.evaluateInPage(`performSavePostActions()`).catch(reject);
            });

            InspectorTest.evaluateInPage(`performSavePreActions()`)
            .then(() => {
                const frameCount = 1;
                CanvasAgent.startRecording(canvas.identifier, frameCount).catch(reject);
            }, reject);
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="load()">
    <p>Test that CanvasManager is able to record actions made to 2D canvas contexts.</p>
</body>
</html>
