<!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 clients = [];

function createClient() {
    clients.push(document.body.appendChild(document.createElement("div")));
}

function destroyClients() {
    for (let client of clients)
        client.remove();

    clients = [];

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

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

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

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

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

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

    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>
