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

async function createClient() {
    let adapter = await navigator.gpu.requestAdapter();
    let device = await adapter.requestDevice();

    let context = document.createElement("canvas").getContext("gpu");
    context.configureSwapChain({device, format: "bgra8unorm"});
}

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

    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.WebGPU.Create",
        description: "Check that creating a WebGPU device client node is tracked correctly.",
        test(resolve, reject) {
            WI.Canvas.awaitEvent(WI.Canvas.Event.ClientNodesChanged)
            .then((event) => {
                InspectorTest.assert(event.target.contextType === WI.Canvas.ContextType.WebGPU);
                event.target.requestClientNodes((clientNodes) => {
                    InspectorTest.expectEqual(clientNodes.length, 1, "There should be one client node.");
                    logClientNodes(clientNodes);
                    resolve();
                });
            });

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

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Test that CanvasAgent tracks changes in the client nodes of a WebGPU device.</p>
</body>
</html>
