blob: 1d8a3310a0dbbaf0c713fa14ac22aef855035e6a [file] [log] [blame] [edit]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test.js"></script>
<script src="../../resources/accessibility-helper.js"></script>
<script src="../../resources/ui-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>
let output = "This test ensures PDFs loaded in embed tags are exposed in the accessibility tree.\n\n";
if (window.accessibilityController) {
window.jsTestIsAsync = true;
var hitTestResult, pdfAxObject, pdfEmbedElement, pdfPageObject, searchResultElement;
internals?.registerPDFTest(async () => {
await UIHelper.waitForPDFFadeIn();
await waitFor(() => {
embedContainer = accessibilityController.accessibleElementById("embedContainer");
return embedContainer && embedContainer.childrenCount >= 1;
});
await waitFor(() => {
pdfEmbedElement = accessibilityController.accessibleElementById("pdfEmbed");
return pdfEmbedElement && pdfEmbedElement.childrenCount >= 1;
});
await waitFor(() => {
pdfAxObject = pdfEmbedElement.childAtIndex(0);
return pdfAxObject && pdfAxObject.childrenCount >= 1;
});
await waitFor(() => {
pdfPageObject = findFirstPageDescendant(pdfAxObject);
return pdfPageObject && pdfPageObject.childrenCount >= 1;
});
output += expect("pdfEmbedElement.domIdentifier", "'pdfEmbed'");
output += expect("pdfEmbedElement.role", "'AXRole: AXGroup'");
// Verify the group that contains the PDF AX object isn't considered empty via an AXEmptyGroup subrole.
output += expect("pdfEmbedElement.subrole", "'AXSubrole: AXApplicationGroup'");
output += expect("pdfEmbedElement.childrenCount", "1");
output += expect("pdfAxObject.stringAttributeValue('AXSubrole')", "'AXPDFPluginSubrole'");
output += expect("pdfAxObject.childrenCount", "1");
// Ensure the PDF accessibility object considers the embed element to be its parent.
output += expect("pdfAxObject.parentElement().domIdentifier", "'pdfEmbed'");
output += expect("pdfPageObject.role", "'AXRole: AXPage'");
await waitFor(() => {
pdfTextNode = traverseChildrenToFirstStaticText(pdfPageObject);
return pdfTextNode;
});
output += expect("pdfTextNode.stringAttributeValue('AXRole')", "'AXStaticText'");
// Get the first word in the string, since the hierarchy can differ for different OS versions.
output += expect("pdfTextNode.stringValue.split(' ')[1]", "'Welcome'");
let domPdfEmbedElement = document.getElementById("pdfEmbed");
hitTestResult = accessibilityController.elementAtPoint(
domPdfEmbedElement.offsetLeft + (domPdfEmbedElement.offsetWidth / 2),
domPdfEmbedElement.offsetTop + (domPdfEmbedElement.offsetHeight / 2),
);
let hitTestRole = hitTestResult.stringAttributeValue("AXRole");
if (hitTestRole == "AXGroup" || hitTestRole == "AXStaticText") {
// Depending on the PDFKit version, we may get a group or static text at the point we hit test.
// It doesn't matter much either way -- as long as it's something inside the PDF, we know hit testing works.
output += "PASS: Hit test role was an expected value\n";
} else
output += `FAIL: Hit test role was an unexpected value (${hitTestRole})\n`;
await waitFor(() => {
pdfTextNode = traverseChildrenToFirstStaticText(hitTestResult);
return pdfTextNode;
})
output += expect("pdfTextNode.stringAttributeValue('AXRole')", "'AXStaticText'");
output += expect("pdfTextNode.stringValue.split(' ')[1]", "'Welcome'");
// Ensure a search from the embed element returns the PDF accessibility object.
await waitFor(() => {
searchResultElement = pdfEmbedElement.uiElementForSearchPredicate(null, true, "AXAnyTypeSearchKey", "", false);
return searchResultElement;
});
output += expect("searchResultElement.stringAttributeValue('AXSubrole')", "'AXPDFPluginSubrole'");
debug(output);
finishJSTest();
}, plugin);
}
</script>
</body>
</html>