<!DOCTYPE HTML>
<html>
<head>
<script src="../resources/accessibility-helper.js"></script>
<script src="../resources/js-test-pre.js"></script>
</head>
<body>

<canvas id="canvas" tabindex="-1"></canvas>

<p id="description"></p>
<div id="console"></div>

<script>
    description("This test makes sure that AccessibilityNodeObjects are properly detached when the node they point to is deleted.");

    if (window.testRunner && window.accessibilityController) {
        window.jsTestIsAsync = true;
        testRunner.dumpAsText();

        // Create an ordinary button on the page, focus it and get its accessibility role.
        var button = document.createElement('button');
        document.body.appendChild(button);
        button.focus();

        axButton = accessibilityController.focusedElement;
        buttonRole = axButton.role;
        debug("Button role: " + buttonRole);

        // Now remove the button from the tree and get the role of the detached accessibility object.
        document.body.removeChild(button);
        detachedRole = axButton.role;
        debug("Button role after being detached: " + detachedRole);
        shouldBeTrue("buttonRole != detachedRole");

        // This time create a button that's a child of a canvas element. It will be focusable but not rendered.
        // In particular, this will create an AccessibilityNodeObject rather than an AccessibilityRenderObject.
        var canvas = document.getElementById('canvas');
        button = document.createElement('button');
        canvas.appendChild(button);

        // Note: Focusing the button and using that to get its accessibility object creates an extra
        // reference to the button and it won't get deleted when we want it to. So instead we focus the
        // canvas and get its first child.
        canvas.focus();

        var axCanvas = null;
        setTimeout(async function() {
            await waitFor(() => {
                axCanvas = accessibilityController.focusedElement;
                return axCanvas.childrenCount > 0;
            });
            axButton = axCanvas.childAtIndex(0);
            canvasButtonRole = axButton.role;
            debug("Canvas button role: " + canvasButtonRole);
            shouldBe("canvasButtonRole", "buttonRole");

            // Now delete the last reference to the button.
            canvas.removeChild(button);
            // Explicitly run garbage collection now. Since there are no more references to the button,
            // it will be destroyed.
            gc();

            // Ensure that the accessibility object is detached by checking its role.
            detachedCanvasButtonRole = axButton.role;
            debug("Canvas button role after being detached: " + detachedCanvasButtonRole);
            shouldBe("detachedCanvasButtonRole", "detachedRole");

            finishJSTest();
        }, 0);
    }

</script>

<script src="../resources/js-test-post.js"></script>
</body>
</html>
