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

<div id="embedContainer">
    <embed id="pdfEmbed" width="75%" height="75%" name="plugin" src="../resources/simple-webkit-pages.pdf" type="application/pdf">
</div>

<script>
    description("This test ensures PDFs loaded in embed tags are exposed in the accessibility tree.")

    async function traverseChildrenWithPath(startObject, traversalPath) {
        let currentObject = startObject;
        for (let index of traversalPath) {
            await waitFor(() => {
                return currentObject.childAtIndex(index);
            });
            currentObject = currentObject.childAtIndex(index);
        }
        return currentObject;
    }

    if (window.accessibilityController) {
        window.jsTestIsAsync = true;

        var hitTestResult, pdfAxObject, pdfEmbedElement, pdfLayerController, searchResultElement;
        setTimeout(async function() {
            // First, ensure the <embed> and the PDF inside the <embed> are completely initialized.
            // It would be nice if we could listen for an <embed> load event to be fired, but WebKit erroneously
            // doesn't fire those for <embed>s: https://bugs.webkit.org/show_bug.cgi?id=230054
            await waitFor(() => {
                embedContainer = accessibilityController.accessibleElementById("embedContainer");
                return embedContainer && embedContainer.childrenCount >= 1;
            });
            await waitFor(() => {
                pdfEmbedElement = accessibilityController.accessibleElementById("pdfEmbed");
                return pdfEmbedElement && pdfEmbedElement.children.length >= 1;
            });
            await waitFor(() => {
                pdfAxObject = pdfEmbedElement.childAtIndex(0);
                return pdfAxObject && pdfAxObject.children.length >= 1;
            });
            await waitFor(() => {
                pdfLayerController = pdfAxObject.childAtIndex(0);
                return pdfLayerController && pdfLayerController.children.length >= 1;
            });

            shouldBe("pdfEmbedElement.domIdentifier", "'pdfEmbed'");
            shouldBe("pdfEmbedElement.role", "'AXRole: AXGroup'");
            shouldBe("pdfEmbedElement.childrenCount", "1");

            shouldBe("pdfAxObject.stringAttributeValue('AXSubrole')", "'AXPDFPluginSubrole'");
            shouldBe("pdfAxObject.childrenCount", "1");
            // Ensure the PDF accessibility object considers the embed element to be its parent.
            shouldBe("pdfAxObject.parentElement().domIdentifier", "'pdfEmbed'");

            shouldBe("pdfLayerController.stringAttributeValue('AXRole')", "'AXGroup'");
            shouldBe("pdfLayerController.stringAttributeValue('AXDescription')", "'document'");

            traversalPathToTextNode = [0, 0, 0, 0, 1, 0, 0];
            pdfTextNode = await traverseChildrenWithPath(pdfLayerController, traversalPathToTextNode);
            shouldBe("pdfTextNode.stringAttributeValue('AXRole')", "'AXStaticText'");
            shouldBe("pdfTextNode.stringAttributeValue('AXValue')", "'Welcome to the website for the WebKit Open Source Project!'");

            // Ensure we can hit test onto the PDF.
            await waitFor(() => {
                domPdfEmbedElement = document.getElementById("pdfEmbed");
                if (!domPdfEmbedElement)
                    return false;

                hitTestResult = accessibilityController.elementAtPoint(
                    domPdfEmbedElement.offsetLeft + (domPdfEmbedElement.offsetWidth / 2),
                    domPdfEmbedElement.offsetTop + (domPdfEmbedElement.offsetHeight / 2),
                );
                return hitTestResult;
            });
            shouldBe("hitTestResult.stringAttributeValue('AXRole')", "'AXGroup'");
            shouldBe("hitTestResult.stringAttributeValue('AXDescription')", "'document'");
            pdfTextNode = await traverseChildrenWithPath(hitTestResult, traversalPathToTextNode);
            shouldBe("pdfTextNode.stringAttributeValue('AXRole')", "'AXStaticText'");
            shouldBe("pdfTextNode.stringAttributeValue('AXValue')", "'Welcome to the website for the WebKit Open Source Project!'");

            // Ensure a search from the embed element returns the PDF accessibility object.
            await waitFor(() => {
                searchResultElement = pdfEmbedElement.uiElementForSearchPredicate(null, true, "AXAnyTypeSearchKey", "", false);
                return searchResultElement;
            });
            shouldBe("searchResultElement.stringAttributeValue('AXSubrole')", "'AXPDFPluginSubrole'");

            finishJSTest();
        }, 0)
    }
</script>
</body>
</html>

