<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function load() {
    window.context2d = document.getCSSCanvasContext("2d", "css-canvas", 10, 10);

    runTest();
}

let cssCanvasClients = [];

function createCSSCanvasClient() {
    cssCanvasClients.push(document.body.appendChild(document.createElement("div")));
}

function destroyCSSCanvasClients() {
    for (let cssCanvasClient of cssCanvasClients)
        cssCanvasClient.remove();

    cssCanvasClients = [];

    setTimeout(() => { GCController.collect(); }, 0);
}

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

    function logClientNodes(clientNodes) {
        for (let clientNode of clientNodes) {
            if (clientNode)
                InspectorTest.pass(`Client node "${clientNode.appropriateSelectorFor()}" is valid.`);
            else
                InspectorTest.fail("Invalid client node.");
        }
    }

    suite.addTestCase({
        name: "Canvas.CSSCanvasClients.InitialLoad",
        description: "Check that the CanvasManager has one CSS canvas initially.",
        test(resolve, reject) {
            let canvases = WI.canvasManager.canvases;
            InspectorTest.expectEqual(canvases.length, 1, "CanvasManager should have one canvas.");
            if (!canvases.length) {
                reject("Missing canvas.");
                return;
            }

            InspectorTest.expectEqual(canvases[0].cssCanvasName, "css-canvas", `Canvas should have CSS name "css-canvas".`);
            canvases[0].requestCSSCanvasClientNodes((clientNodes) => {
                InspectorTest.expectEqual(clientNodes.length, 0, "There should be no client nodes.");
                logClientNodes(clientNodes);
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "Canvas.CSSCanvasClients.Create",
        description: "Check that creating a CSS canvas client node is tracked correctly.",
        test(resolve, reject) {
            WI.Canvas.awaitEvent(WI.Canvas.Event.CSSCanvasClientNodesChanged)
            .then((event) => {
                InspectorTest.expectEqual(event.target.cssCanvasName, "css-canvas", `Canvas with created client should have CSS name "css-canvas".`);
                event.target.requestCSSCanvasClientNodes((clientNodes) => {
                    InspectorTest.expectEqual(clientNodes.length, 1, "There should be one client node.");
                    logClientNodes(clientNodes);
                    resolve();
                });
            });

            InspectorTest.evaluateInPage(`createCSSCanvasClient()`);
        }
    });

    suite.addTestCase({
        name: "Canvas.CSSCanvasClients.Destroy",
        description: "Check that destroying a CSS canvas client node is tracked correctly.",
        test(resolve, reject) {
            WI.Canvas.awaitEvent(WI.Canvas.Event.CSSCanvasClientNodesChanged)
            .then((event) => {
                InspectorTest.expectEqual(event.target.cssCanvasName, "css-canvas", `Canvas with destroyed client should have CSS name "css-canvas".`);
                event.target.requestCSSCanvasClientNodes((clientNodes) => {
                    InspectorTest.expectEqual(clientNodes.length, 0, "There should be no client nodes.");
                    logClientNodes(clientNodes);
                    resolve();
                });
            });

            InspectorTest.evaluateInPage(`destroyCSSCanvasClients()`);
        }
    });

    // ------

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

    suite.runTestCasesAndFinish();
}
</script>
<style>
    div {
        width: 10px;
        height: 10px;
        background-image: -webkit-canvas(css-canvas);
    }
</style>
</head>
<body onload="load()">
    <p>Test that CanvasAgent tracks changes in the client nodes of a CSS canvas.</p>
</body>
</html>
