<!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'");
            // Verify the group that contains the PDF AX object isn't considered empty via an AXEmptyGroup subrole.
            shouldBe("pdfEmbedElement.subrole", "'AXSubrole: '");
            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>

