<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function load() {
    window.context2d = document.createElement("canvas").getContext("2d");
    window.context2d.fillStyle = "rgba(255, 0, 0, 0.5)"; // Half-transparent red
    window.context2d.fillRect(0, 0, 300, 150);

    runTest();
}

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

    suite.addTestCase({
        name: "Canvas.requestContent2D.validCanvasId",
        description: "Get the base64 encoded data for the canvas on the page with the given type.",
        test(resolve, reject) {
            let canvas = WI.canvasManager.canvases.find((canvas) => canvas.contextType === WI.Canvas.ContextType.Canvas2D);
            if (!canvas) {
                reject(`Missing Canvas.`);
                return;
            }

            CanvasAgent.requestContent(canvas.identifier)
            .then(({content}) => InspectorTest.log(content))
            .then(resolve, reject);
        }
    });

    // ------

    suite.addTestCase({
        name: "Canvas.requestContent.invalidCanvasId",
        description: "Invalid canvas identifiers should cause an error.",
        test(resolve, reject) {
            const canvasId = "DOES_NOT_EXIST";
            CanvasAgent.requestContent(canvasId, (error) => {
                InspectorTest.expectThat(error, "Should produce an error.");
                InspectorTest.log("Error: " + error);
                resolve();
            });
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="load()">
    <p>Test that CanvasAgent.requestContent can retrieve a dataURL with the current content of the 2D canvas.</p>
</body>
</html>
