From f3163001139969ca5652ecb6a14f1389c9a34356 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 28 Jul 2022 17:59:03 +0200 Subject: [PATCH] [Annotations] Add some aria-owns in the text layer to link to annotations (bug 1780375) This patch doesn't structurally change the text layer: it just adds some aria-owns attributes to some spans. The aria-owns attribute expect to have an element id, hence it's why it adds back an id on the element rendering an annotation, but this id is built in using crypto.randomUUID to avoid any potential issues with the hash in the url. The elements in the annotation layer are moved into the DOM in order to have them in the same "order" as they visually are. The overall goal is to help screen readers to present to the user the annotations as they visually are and as they come in the text flow. It is clearly not perfect, but it should improve readability for some people with visual disabilities. --- src/display/annotation_layer.js | 45 +++- src/display/display_utils.js | 3 + src/display/editor/annotation_editor_layer.js | 208 ++------------- src/display/editor/editor.js | 8 - src/display/editor/freetext.js | 5 - src/display/editor/ink.js | 2 +- src/display/editor/tools.js | 10 - test/integration-boot.js | 1 + test/integration/accessibility_spec.js | 40 +++ test/integration/freetext_editor_spec.js | 44 ++-- test/integration/test_utils.js | 10 +- test/pdfs/.gitignore | 1 + test/pdfs/tracemonkey_a11y.pdf | Bin 0 -> 110108 bytes web/annotation_editor_layer_builder.js | 5 + web/annotation_layer_builder.css | 1 - web/annotation_layer_builder.js | 6 + web/base_viewer.js | 11 + web/debugger.css | 4 + web/default_factory.js | 11 + web/interfaces.js | 8 + web/pdf_page_view.js | 5 + web/text_accessibility.js | 246 ++++++++++++++++++ web/text_layer_builder.js | 8 + 23 files changed, 436 insertions(+), 246 deletions(-) create mode 100644 test/pdfs/tracemonkey_a11y.pdf create mode 100644 web/text_accessibility.js diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index c5ba9a662..db9969fed 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -29,6 +29,7 @@ import { warn, } from "../shared/util.js"; import { + AnnotationPrefix, DOMSVGFactory, getFilenameFromUrl, PDFDateString, @@ -1901,7 +1902,8 @@ class PopupElement { } if (this.hideElement.hidden) { this.hideElement.hidden = false; - this.container.style.zIndex += 1; + this.container.style.zIndex = + parseInt(this.container.style.zIndex) + 1000; } } @@ -1918,7 +1920,8 @@ class PopupElement { } if (!this.hideElement.hidden && !this.pinned) { this.hideElement.hidden = true; - this.container.style.zIndex -= 1; + this.container.style.zIndex = + parseInt(this.container.style.zIndex) - 1000; } } } @@ -2465,6 +2468,19 @@ class FileAttachmentAnnotationElement extends AnnotationElement { */ class AnnotationLayer { + static #appendElement(element, id, div, accessibilityManager) { + const contentElement = element.firstChild || element; + contentElement.id = `${AnnotationPrefix}${id}`; + + div.append(element); + accessibilityManager?.moveElementInDOM( + div, + element, + contentElement, + /* isRemovable = */ false + ); + } + /** * Render a new annotation layer with all annotation elements. * @@ -2473,9 +2489,10 @@ class AnnotationLayer { * @memberof AnnotationLayer */ static render(parameters) { - const { annotations, div, viewport } = parameters; + const { annotations, div, viewport, accessibilityManager } = parameters; this.#setDimensions(div, viewport); + let zIndex = 0; for (const data of annotations) { if (data.annotationType !== AnnotationType.POPUP) { @@ -2508,15 +2525,33 @@ class AnnotationLayer { } if (Array.isArray(rendered)) { for (const renderedElement of rendered) { - div.append(renderedElement); + renderedElement.style.zIndex = zIndex++; + AnnotationLayer.#appendElement( + renderedElement, + data.id, + div, + accessibilityManager + ); } } else { + // The accessibility manager will move the annotation in the DOM in + // order to match the visual ordering. + // But if an annotation is above an other one, then we must draw it + // after the other one whatever the order is in the DOM, hence the + // use of the z-index. + rendered.style.zIndex = zIndex++; + if (element instanceof PopupAnnotationElement) { // Popup annotation elements should not be on top of other // annotation elements to prevent interfering with mouse events. div.prepend(rendered); } else { - div.append(rendered); + AnnotationLayer.#appendElement( + rendered, + data.id, + div, + accessibilityManager + ); } } } diff --git a/src/display/display_utils.js b/src/display/display_utils.js index dff0a83c6..255d1d12e 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -23,6 +23,8 @@ import { BaseException, stringToBytes, Util, warn } from "../shared/util.js"; const SVG_NS = "http://www.w3.org/2000/svg"; +const AnnotationPrefix = "pdfjs_internal_id_"; + class PixelsPerInch { static CSS = 96.0; @@ -652,6 +654,7 @@ function getCurrentTransformInverse(ctx) { } export { + AnnotationPrefix, binarySearchFirstItem, deprecated, DOMCanvasFactory, diff --git a/src/display/editor/annotation_editor_layer.js b/src/display/editor/annotation_editor_layer.js index 4f3107956..a2f6f6437 100644 --- a/src/display/editor/annotation_editor_layer.js +++ b/src/display/editor/annotation_editor_layer.js @@ -18,11 +18,12 @@ /** @typedef {import("./tools.js").AnnotationEditorUIManager} AnnotationEditorUIManager */ // eslint-disable-next-line max-len /** @typedef {import("../annotation_storage.js").AnnotationStorage} AnnotationStorage */ +// eslint-disable-next-line max-len +/** @typedef {import("../../web/text_accessibility.js").TextAccessibilityManager} TextAccessibilityManager */ /** @typedef {import("../../web/interfaces").IL10n} IL10n */ -import { AnnotationEditorType, shadow } from "../../shared/util.js"; import { bindEvents, KeyboardManager } from "./tools.js"; -import { binarySearchFirstItem } from "../display_utils.js"; +import { AnnotationEditorType } from "../../shared/util.js"; import { FreeTextEditor } from "./freetext.js"; import { InkEditor } from "./ink.js"; @@ -33,6 +34,7 @@ import { InkEditor } from "./ink.js"; * @property {AnnotationEditorUIManager} uiManager * @property {boolean} enabled * @property {AnnotationStorage} annotationStorage + * @property {TextAccessibilityManager} [accessibilityManager] * @property {number} pageIndex * @property {IL10n} l10n */ @@ -41,6 +43,8 @@ import { InkEditor } from "./ink.js"; * Manage all the different editors on a page. */ class AnnotationEditorLayer { + #accessibilityManager; + #allowClick = false; #boundPointerup = this.pointerup.bind(this); @@ -53,14 +57,8 @@ class AnnotationEditorLayer { #isCleaningUp = false; - #textLayerMap = new WeakMap(); - - #textNodes = new Map(); - #uiManager; - #waitingEditors = new Set(); - static _initialized = false; /** @@ -78,43 +76,11 @@ class AnnotationEditorLayer { this.annotationStorage = options.annotationStorage; this.pageIndex = options.pageIndex; this.div = options.div; + this.#accessibilityManager = options.accessibilityManager; this.#uiManager.addLayer(this); } - get textLayerElements() { - // When zooming the text layer is removed from the DOM and sometimes - // it's rebuilt hence the nodes are no longer valid. - - const textLayer = this.div.parentNode - .getElementsByClassName("textLayer") - .item(0); - - if (!textLayer) { - return shadow(this, "textLayerElements", null); - } - - let textChildren = this.#textLayerMap.get(textLayer); - if (textChildren) { - return textChildren; - } - - textChildren = textLayer.querySelectorAll(`span[role="presentation"]`); - if (textChildren.length === 0) { - return shadow(this, "textLayerElements", null); - } - - textChildren = Array.from(textChildren); - textChildren.sort(AnnotationEditorLayer.#compareElementPositions); - this.#textLayerMap.set(textLayer, textChildren); - - return textChildren; - } - - get #hasTextLayer() { - return !!this.div.parentNode.querySelector(".textLayer .endOfContent"); - } - /** * Update the toolbar if it's required to reflect the tool currently used. * @param {number} mode @@ -228,7 +194,7 @@ class AnnotationEditorLayer { detach(editor) { this.#editors.delete(editor.id); - this.removePointerInTextLayer(editor); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); } /** @@ -281,147 +247,6 @@ class AnnotationEditorLayer { } } - /** - * Compare the positions of two elements, it must correspond to - * the visual ordering. - * - * @param {HTMLElement} e1 - * @param {HTMLElement} e2 - * @returns {number} - */ - static #compareElementPositions(e1, e2) { - const rect1 = e1.getBoundingClientRect(); - const rect2 = e2.getBoundingClientRect(); - - if (rect1.y + rect1.height <= rect2.y) { - return -1; - } - - if (rect2.y + rect2.height <= rect1.y) { - return +1; - } - - const centerX1 = rect1.x + rect1.width / 2; - const centerX2 = rect2.x + rect2.width / 2; - - return centerX1 - centerX2; - } - - /** - * Function called when the text layer has finished rendering. - */ - onTextLayerRendered() { - this.#textNodes.clear(); - for (const editor of this.#waitingEditors) { - if (editor.isAttachedToDOM) { - this.addPointerInTextLayer(editor); - } - } - this.#waitingEditors.clear(); - } - - /** - * Remove an aria-owns id from a node in the text layer. - * @param {AnnotationEditor} editor - */ - removePointerInTextLayer(editor) { - if (!this.#hasTextLayer) { - this.#waitingEditors.delete(editor); - return; - } - - const { id } = editor; - const node = this.#textNodes.get(id); - if (!node) { - return; - } - - this.#textNodes.delete(id); - let owns = node.getAttribute("aria-owns"); - if (owns?.includes(id)) { - owns = owns - .split(" ") - .filter(x => x !== id) - .join(" "); - if (owns) { - node.setAttribute("aria-owns", owns); - } else { - node.removeAttribute("aria-owns"); - node.setAttribute("role", "presentation"); - } - } - } - - /** - * Find the text node which is the nearest and add an aria-owns attribute - * in order to correctly position this editor in the text flow. - * @param {AnnotationEditor} editor - */ - addPointerInTextLayer(editor) { - if (!this.#hasTextLayer) { - // The text layer needs to be there, so we postpone the association. - this.#waitingEditors.add(editor); - return; - } - - this.removePointerInTextLayer(editor); - - const children = this.textLayerElements; - if (!children) { - return; - } - const { contentDiv } = editor; - const id = editor.getIdForTextLayer(); - - const index = binarySearchFirstItem( - children, - node => - AnnotationEditorLayer.#compareElementPositions(contentDiv, node) < 0 - ); - const node = children[Math.max(0, index - 1)]; - const owns = node.getAttribute("aria-owns"); - if (!owns?.includes(id)) { - node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); - } - node.removeAttribute("role"); - - this.#textNodes.set(id, node); - } - - /** - * Move a div in the DOM in order to respect the visual order. - * @param {HTMLDivElement} div - */ - moveDivInDOM(editor) { - this.addPointerInTextLayer(editor); - - const { div, contentDiv } = editor; - if (!this.div.hasChildNodes()) { - this.div.append(div); - return; - } - - const children = Array.from(this.div.childNodes).filter( - node => node !== div - ); - - if (children.length === 0) { - return; - } - - const index = binarySearchFirstItem( - children, - node => - AnnotationEditorLayer.#compareElementPositions(contentDiv, node) < 0 - ); - - if (index === 0) { - children[0].before(div); - } else { - children[index - 1].after(div); - } - } - /** * Add a new editor in the current view. * @param {AnnotationEditor} editor @@ -437,11 +262,20 @@ class AnnotationEditorLayer { editor.isAttachedToDOM = true; } - this.moveDivInDOM(editor); + this.moveEditorInDOM(editor); editor.onceAdded(); this.addToAnnotationStorage(editor); } + moveEditorInDOM(editor) { + this.#accessibilityManager?.moveElementInDOM( + this.div, + editor.div, + editor.contentDiv, + /* isRemovable = */ true + ); + } + /** * Add an editor in the annotation storage. * @param {AnnotationEditor} editor @@ -658,7 +492,7 @@ class AnnotationEditorLayer { const endY = event.clientY - rect.y; editor.translate(endX - editor.startX, endY - editor.startY); - this.moveDivInDOM(editor); + this.moveEditorInDOM(editor); editor.div.focus(); } @@ -679,15 +513,13 @@ class AnnotationEditorLayer { } for (const editor of this.#editors.values()) { - this.removePointerInTextLayer(editor); + this.#accessibilityManager?.removePointerInTextLayer(editor.contentDiv); editor.isAttachedToDOM = false; editor.div.remove(); editor.parent = null; } - this.#textNodes.clear(); this.div = null; this.#editors.clear(); - this.#waitingEditors.clear(); this.#uiManager.removeLayer(this); } diff --git a/src/display/editor/editor.js b/src/display/editor/editor.js index e3bbe5a66..368aa2da9 100644 --- a/src/display/editor/editor.js +++ b/src/display/editor/editor.js @@ -489,14 +489,6 @@ class AnnotationEditor { */ enableEditing() {} - /** - * Get the id to use in aria-owns when a link is done in the text layer. - * @returns {string} - */ - getIdForTextLayer() { - return this.id; - } - /** * Get some properties to update in the UI. * @returns {Object} diff --git a/src/display/editor/freetext.js b/src/display/editor/freetext.js index cce09e3ed..060a6380f 100644 --- a/src/display/editor/freetext.js +++ b/src/display/editor/freetext.js @@ -385,11 +385,6 @@ class FreeTextEditor extends AnnotationEditor { this.editorDiv.setAttribute("aria-multiline", true); } - /** @inheritdoc */ - getIdForTextLayer() { - return this.editorDiv.id; - } - /** @inheritdoc */ render() { if (this.div) { diff --git a/src/display/editor/ink.js b/src/display/editor/ink.js index 10bffab45..09a54cfb8 100644 --- a/src/display/editor/ink.js +++ b/src/display/editor/ink.js @@ -488,7 +488,7 @@ class InkEditor extends AnnotationEditor { // When commiting, the position of this editor is changed, hence we must // move it to the right position in the DOM. - this.parent.moveDivInDOM(this); + this.parent.moveEditorInDOM(this); // After the div has been moved in the DOM, the focus may have been stolen // by document.body, hence we just keep it here. this.div.focus(); diff --git a/src/display/editor/tools.js b/src/display/editor/tools.js index 21955b292..bc75a0a71 100644 --- a/src/display/editor/tools.js +++ b/src/display/editor/tools.js @@ -428,8 +428,6 @@ class AnnotationEditorUIManager { #boundOnPageChanging = this.onPageChanging.bind(this); - #boundOnTextLayerRendered = this.onTextLayerRendered.bind(this); - #previousStates = { isEditing: false, isEmpty: true, @@ -474,14 +472,12 @@ class AnnotationEditorUIManager { this.#eventBus = eventBus; this.#eventBus._on("editingaction", this.#boundOnEditingAction); this.#eventBus._on("pagechanging", this.#boundOnPageChanging); - this.#eventBus._on("textlayerrendered", this.#boundOnTextLayerRendered); } destroy() { this.#removeKeyboardManager(); this.#eventBus._off("editingaction", this.#boundOnEditingAction); this.#eventBus._off("pagechanging", this.#boundOnPageChanging); - this.#eventBus._off("textlayerrendered", this.#boundOnTextLayerRendered); for (const layer of this.#allLayers.values()) { layer.destroy(); } @@ -497,12 +493,6 @@ class AnnotationEditorUIManager { this.#currentPageIndex = pageNumber - 1; } - onTextLayerRendered({ pageNumber }) { - const pageIndex = pageNumber - 1; - const layer = this.#allLayers.get(pageIndex); - layer?.onTextLayerRendered(); - } - focusMainContainer() { this.#container.focus(); } diff --git a/test/integration-boot.js b/test/integration-boot.js index 921511d98..1c6f37f21 100644 --- a/test/integration-boot.js +++ b/test/integration-boot.js @@ -32,6 +32,7 @@ async function runTests(results) { "find_spec.js", "freetext_editor_spec.js", "ink_editor_spec.js", + "a11y_spec.js", ], }); diff --git a/test/integration/accessibility_spec.js b/test/integration/accessibility_spec.js index 5db2f98df..8ca890aae 100644 --- a/test/integration/accessibility_spec.js +++ b/test/integration/accessibility_spec.js @@ -66,4 +66,44 @@ describe("accessibility", () => { ); }); }); + + describe("Annotation", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait( + "tracemonkey_a11y.pdf", + ".textLayer .endOfContent" + ); + }); + + afterAll(async () => { + await closePages(pages); + }); + + function getSpans(page) { + return page.evaluate(() => { + const elements = document.querySelectorAll( + `.textLayer span[aria-owns]:not([role="presentation"])` + ); + const results = []; + for (const element of elements) { + results.push(element.innerText); + } + return results; + }); + } + + it("must check that some spans are linked to some annotations thanks to aria-owns", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const spanContents = await getSpans(page); + + expect(spanContents) + .withContext(`In ${browserName}`) + .toEqual(["Languages", "@intel.com", "Abstract", "Introduction"]); + }) + ); + }); + }); }); diff --git a/test/integration/freetext_editor_spec.js b/test/integration/freetext_editor_spec.js index e66ee7258..db3688b73 100644 --- a/test/integration/freetext_editor_spec.js +++ b/test/integration/freetext_editor_spec.js @@ -15,7 +15,7 @@ const { closePages, - editorPrefix, + getEditorSelector, getSelectedEditors, loadAndWait, } = require("./test_utils.js"); @@ -51,9 +51,9 @@ describe("Editor", () => { const data = "Hello PDF.js World !!"; await page.mouse.click(rect.x + 100, rect.y + 100); - await page.type(`${editorPrefix}0 .internal`, data); + await page.type(`${getEditorSelector(0)} .internal`, data); - const editorRect = await page.$eval(`${editorPrefix}0`, el => { + const editorRect = await page.$eval(getEditorSelector(0), el => { const { x, y, width, height } = el.getBoundingClientRect(); return { x, @@ -73,7 +73,7 @@ describe("Editor", () => { .withContext(`In ${browserName}`) .toEqual(1); - const content = await page.$eval(`${editorPrefix}0`, el => + const content = await page.$eval(getEditorSelector(0), el => el.innerText.trimEnd() ); expect(content).withContext(`In ${browserName}`).toEqual(data); @@ -84,7 +84,7 @@ describe("Editor", () => { it("must copy/paste", async () => { await Promise.all( pages.map(async ([browserName, page]) => { - const editorRect = await page.$eval(`${editorPrefix}0`, el => { + const editorRect = await page.$eval(getEditorSelector(0), el => { const { x, y, width, height } = el.getBoundingClientRect(); return { x, y, width, height }; }); @@ -107,11 +107,11 @@ describe("Editor", () => { .withContext(`In ${browserName}`) .toEqual(2); - const content = await page.$eval(`${editorPrefix}0`, el => + const content = await page.$eval(getEditorSelector(0), el => el.innerText.trimEnd() ); - let pastedContent = await page.$eval(`${editorPrefix}1`, el => + let pastedContent = await page.$eval(getEditorSelector(1), el => el.innerText.trimEnd() ); @@ -131,7 +131,7 @@ describe("Editor", () => { .withContext(`In ${browserName}`) .toEqual(3); - pastedContent = await page.$eval(`${editorPrefix}2`, el => + pastedContent = await page.$eval(getEditorSelector(2), el => el.innerText.trimEnd() ); expect(pastedContent) @@ -155,7 +155,7 @@ describe("Editor", () => { for (const n of [0, 1, 2]) { const hasEditor = await page.evaluate(sel => { return !!document.querySelector(sel); - }, `${editorPrefix}${n}`); + }, getEditorSelector(n)); expect(hasEditor).withContext(`In ${browserName}`).toEqual(false); } @@ -177,9 +177,9 @@ describe("Editor", () => { const data = "Hello PDF.js World !!"; await page.mouse.click(rect.x + 100, rect.y + 100); - await page.type(`${editorPrefix}3 .internal`, data); + await page.type(`${getEditorSelector(3)} .internal`, data); - const editorRect = await page.$eval(`${editorPrefix}3`, el => { + const editorRect = await page.$eval(getEditorSelector(3), el => { const { x, y, width, height } = el.getBoundingClientRect(); return { x, y, width, height }; }); @@ -205,7 +205,7 @@ describe("Editor", () => { let hasEditor = await page.evaluate(sel => { return !!document.querySelector(sel); - }, `${editorPrefix}4`); + }, getEditorSelector(4)); expect(hasEditor).withContext(`In ${browserName}`).toEqual(true); @@ -215,7 +215,7 @@ describe("Editor", () => { hasEditor = await page.evaluate(sel => { return !!document.querySelector(sel); - }, `${editorPrefix}4`); + }, getEditorSelector(4)); expect(hasEditor).withContext(`In ${browserName}`).toEqual(false); @@ -227,7 +227,7 @@ describe("Editor", () => { let length = await page.evaluate(sel => { return document.querySelectorAll(sel).length; - }, `${editorPrefix}5, ${editorPrefix}6`); + }, `${getEditorSelector(5)}, ${getEditorSelector(6)}`); expect(length).withContext(`In ${browserName}`).toEqual(2); for (let i = 0; i < 2; i++) { @@ -238,7 +238,7 @@ describe("Editor", () => { length = await page.evaluate(sel => { return document.querySelectorAll(sel).length; - }, `${editorPrefix}5, ${editorPrefix}6`); + }, `${getEditorSelector(5)}, ${getEditorSelector(6)}`); expect(length).withContext(`In ${browserName}`).toEqual(0); }) ); @@ -273,7 +273,7 @@ describe("Editor", () => { stacksRect.x + stacksRect.width + 1, stacksRect.y + stacksRect.height / 2 ); - await page.type(`${editorPrefix}7 .internal`, data); + await page.type(`${getEditorSelector(7)} .internal`, data); // Commit. await page.keyboard.press("Escape"); @@ -283,9 +283,9 @@ describe("Editor", () => { return span?.getAttribute("aria-owns") || null; }); - expect(ariaOwns) + expect(ariaOwns.endsWith("_7-editor")) .withContext(`In ${browserName}`) - .toEqual(`${editorPrefix}7-editor`.slice(1)); + .toEqual(true); }) ); }); @@ -308,9 +308,9 @@ describe("Editor", () => { const data = "Hello PDF.js World !!"; await page.mouse.click(rect.x + 100, rect.y + 100); - await page.type(`${editorPrefix}8 .internal`, data); + await page.type(`${getEditorSelector(8)} .internal`, data); - const editorRect = await page.$eval(`${editorPrefix}8`, el => { + const editorRect = await page.$eval(getEditorSelector(8), el => { const { x, y, width, height } = el.getBoundingClientRect(); return { x, y, width, height }; }); @@ -385,9 +385,9 @@ describe("Editor", () => { rect.x + (i + 1) * 100, rect.y + (i + 1) * 100 ); - await page.type(`${editorPrefix}${i} .internal`, data); + await page.type(`${getEditorSelector(i)} .internal`, data); - const editorRect = await page.$eval(`${editorPrefix}${i}`, el => { + const editorRect = await page.$eval(getEditorSelector(i), el => { const { x, y, width, height } = el.getBoundingClientRect(); return { x, diff --git a/test/integration/test_utils.js b/test/integration/test_utils.js index cba64a815..fa6443d8a 100644 --- a/test/integration/test_utils.js +++ b/test/integration/test_utils.js @@ -73,19 +73,17 @@ function getComputedStyleSelector(id) { return `getComputedStyle(${getQuerySelector(id)})`; } exports.getComputedStyleSelector = getComputedStyleSelector; - -const editorPrefix = "#pdfjs_internal_editor_"; -exports.editorPrefix = editorPrefix; +exports.getEditorSelector = n => `#pdfjs_internal_editor_${n}`; function getSelectedEditors(page) { - return page.evaluate(prefix => { + return page.evaluate(() => { const elements = document.querySelectorAll(".selectedEditor"); const results = []; for (const { id } of elements) { - results.push(parseInt(id.slice(prefix.length))); + results.push(parseInt(id.split("_").at(-1))); } results.sort(); return results; - }, editorPrefix.slice(1)); + }); } exports.getSelectedEditors = getSelectedEditors; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 1b81cc0b2..6df734f40 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -534,3 +534,4 @@ !bug1675139.pdf !issue15092.pdf !bug1782186.pdf +!tracemonkey_a11y.pdf diff --git a/test/pdfs/tracemonkey_a11y.pdf b/test/pdfs/tracemonkey_a11y.pdf new file mode 100644 index 0000000000000000000000000000000000000000..abbd6d36ec614e4b2d505e1450b3eb07d15976a4 GIT binary patch literal 110108 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

>&S+)so_vWuN+$^&`v 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 [annotationCanvasMap] + * @property {TextAccessibilityManager} accessibilityManager */ class AnnotationLayerBuilder { @@ -60,6 +63,7 @@ class AnnotationLayerBuilder { fieldObjectsPromise = null, mouseState = null, annotationCanvasMap = null, + accessibilityManager = null, }) { this.pageDiv = pageDiv; this.pdfPage = pdfPage; @@ -74,6 +78,7 @@ class AnnotationLayerBuilder { this._fieldObjectsPromise = fieldObjectsPromise; this._mouseState = mouseState; this._annotationCanvasMap = annotationCanvasMap; + this._accessibilityManager = accessibilityManager; this.div = null; this._cancelled = false; @@ -112,6 +117,7 @@ class AnnotationLayerBuilder { fieldObjects, mouseState: this._mouseState, annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, }; if (this.div) { diff --git a/web/base_viewer.js b/web/base_viewer.js index 7fdb5c728..e1541235f 100644 --- a/web/base_viewer.js +++ b/web/base_viewer.js @@ -30,6 +30,8 @@ // eslint-disable-next-line max-len /** @typedef {import("./interfaces").IPDFTextLayerFactory} IPDFTextLayerFactory */ /** @typedef {import("./interfaces").IPDFXfaLayerFactory} IPDFXfaLayerFactory */ +// eslint-disable-next-line max-len +/** @typedef {import("./text_accessibility.js").TextAccessibilityManager} TextAccessibilityManager */ import { AnnotationEditorType, @@ -1637,6 +1639,7 @@ class BaseViewer { * @property {boolean} [enhanceTextSelection] * @property {EventBus} eventBus * @property {TextHighlighter} highlighter + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -1650,6 +1653,7 @@ class BaseViewer { enhanceTextSelection = false, eventBus, highlighter, + accessibilityManager = null, }) { return new TextLayerBuilder({ textLayerDiv, @@ -1660,6 +1664,7 @@ class BaseViewer { ? false : enhanceTextSelection, highlighter, + accessibilityManager, }); } @@ -1698,6 +1703,7 @@ class BaseViewer { * [fieldObjectsPromise] * @property {Map} [annotationCanvasMap] - Map some * annotation ids with canvases used to render them. + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -1716,6 +1722,7 @@ class BaseViewer { mouseState = this._scriptingManager?.mouseState, fieldObjectsPromise = this.pdfDocument?.getFieldObjects(), annotationCanvasMap = null, + accessibilityManager = null, }) { return new AnnotationLayerBuilder({ pageDiv, @@ -1731,6 +1738,7 @@ class BaseViewer { mouseState, fieldObjectsPromise, annotationCanvasMap, + accessibilityManager, }); } @@ -1741,6 +1749,7 @@ class BaseViewer { * @property {PDFPageProxy} pdfPage * @property {IL10n} l10n * @property {AnnotationStorage} [annotationStorage] - Storage for annotation + * @property {TextAccessibilityManager} [accessibilityManager] * data in forms. */ @@ -1752,6 +1761,7 @@ class BaseViewer { uiManager = this.#annotationEditorUIManager, pageDiv, pdfPage, + accessibilityManager = null, l10n, annotationStorage = this.pdfDocument?.annotationStorage, }) { @@ -1760,6 +1770,7 @@ class BaseViewer { pageDiv, pdfPage, annotationStorage, + accessibilityManager, l10n, }); } diff --git a/web/debugger.css b/web/debugger.css index 426342807..4de0814ab 100644 --- a/web/debugger.css +++ b/web/debugger.css @@ -92,6 +92,10 @@ box-sizing: border-box; } +#viewer.textLayer-visible .textLayer span[aria-owns] { + background-color: rgba(255, 0, 0, 0.3); +} + #viewer.textLayer-hover .textLayer span:hover { background-color: rgba(255, 255, 255, 1); color: rgba(0, 0, 0, 1); diff --git a/web/default_factory.js b/web/default_factory.js index 1908154a9..b4b09ef52 100644 --- a/web/default_factory.js +++ b/web/default_factory.js @@ -30,6 +30,8 @@ /** @typedef {import("./interfaces").IPDFTextLayerFactory} IPDFTextLayerFactory */ /** @typedef {import("./interfaces").IPDFXfaLayerFactory} IPDFXfaLayerFactory */ /** @typedef {import("./text_highlighter").TextHighlighter} TextHighlighter */ +// eslint-disable-next-line max-len +/** @typedef {import("./text_accessibility.js").TextAccessibilityManager} TextAccessibilityManager */ import { AnnotationEditorLayerBuilder } from "./annotation_editor_layer_builder.js"; import { AnnotationLayerBuilder } from "./annotation_layer_builder.js"; @@ -60,6 +62,7 @@ class DefaultAnnotationLayerFactory { * [fieldObjectsPromise] * @property {Map} [annotationCanvasMap] - Map some * annotation ids with canvases used to render them. + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -78,6 +81,7 @@ class DefaultAnnotationLayerFactory { mouseState = null, fieldObjectsPromise = null, annotationCanvasMap = null, + accessibilityManager = null, }) { return new AnnotationLayerBuilder({ pageDiv, @@ -92,6 +96,7 @@ class DefaultAnnotationLayerFactory { fieldObjectsPromise, mouseState, annotationCanvasMap, + accessibilityManager, }); } } @@ -107,6 +112,7 @@ class DefaultAnnotationEditorLayerFactory { * @property {PDFPageProxy} pdfPage * @property {IL10n} l10n * @property {AnnotationStorage} [annotationStorage] - Storage for annotation + * @property {TextAccessibilityManager} [accessibilityManager] * data in forms. */ @@ -118,6 +124,7 @@ class DefaultAnnotationEditorLayerFactory { uiManager = null, pageDiv, pdfPage, + accessibilityManager = null, l10n, annotationStorage = null, }) { @@ -125,6 +132,7 @@ class DefaultAnnotationEditorLayerFactory { uiManager, pageDiv, pdfPage, + accessibilityManager, l10n, annotationStorage, }); @@ -163,6 +171,7 @@ class DefaultTextLayerFactory { * @property {boolean} [enhanceTextSelection] * @property {EventBus} eventBus * @property {TextHighlighter} highlighter + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -176,6 +185,7 @@ class DefaultTextLayerFactory { enhanceTextSelection = false, eventBus, highlighter, + accessibilityManager = null, }) { return new TextLayerBuilder({ textLayerDiv, @@ -184,6 +194,7 @@ class DefaultTextLayerFactory { enhanceTextSelection, eventBus, highlighter, + accessibilityManager, }); } } diff --git a/web/interfaces.js b/web/interfaces.js index c9536c84a..71d9232cc 100644 --- a/web/interfaces.js +++ b/web/interfaces.js @@ -29,6 +29,8 @@ /** @typedef {import("./text_layer_builder").TextLayerBuilder} TextLayerBuilder */ /** @typedef {import("./ui_utils").RenderingStates} RenderingStates */ /** @typedef {import("./xfa_layer_builder").XfaLayerBuilder} XfaLayerBuilder */ +// eslint-disable-next-line max-len +/** @typedef {import("./text_accessibility.js").TextAccessibilityManager} TextAccessibilityManager */ /** * @interface @@ -162,6 +164,7 @@ class IPDFTextLayerFactory { * @property {boolean} [enhanceTextSelection] * @property {EventBus} eventBus * @property {TextHighlighter} highlighter + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -175,6 +178,7 @@ class IPDFTextLayerFactory { enhanceTextSelection = false, eventBus, highlighter, + accessibilityManager, }) {} } @@ -199,6 +203,7 @@ class IPDFAnnotationLayerFactory { * [fieldObjectsPromise] * @property {Map} [annotationCanvasMap] - Map some * annotation ids with canvases used to render them. + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -217,6 +222,7 @@ class IPDFAnnotationLayerFactory { mouseState = null, fieldObjectsPromise = null, annotationCanvasMap = null, + accessibilityManager = null, }) {} } @@ -231,6 +237,7 @@ class IPDFAnnotationEditorLayerFactory { * @property {PDFPageProxy} pdfPage * @property {IL10n} l10n * @property {AnnotationStorage} [annotationStorage] - Storage for annotation + * @property {TextAccessibilityManager} [accessibilityManager] * data in forms. */ @@ -244,6 +251,7 @@ class IPDFAnnotationEditorLayerFactory { pdfPage, l10n, annotationStorage = null, + accessibilityManager, }) {} } diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 842ce4a0c..8ed540718 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -51,6 +51,7 @@ import { } from "./ui_utils.js"; import { compatibilityParams } from "./app_options.js"; import { NullL10n } from "./l10n_utils.js"; +import { TextAccessibilityManager } from "./text_accessibility.js"; /** * @typedef {Object} PDFPageViewOptions @@ -697,6 +698,7 @@ class PDFPageView { let textLayer = null; if (this.textLayerMode !== TextLayerMode.DISABLE && this.textLayerFactory) { + this._accessibilityManager ||= new TextAccessibilityManager(); const textLayerDiv = document.createElement("div"); textLayerDiv.className = "textLayer"; textLayerDiv.style.width = canvasWrapper.style.width; @@ -716,6 +718,7 @@ class PDFPageView { this.textLayerMode === TextLayerMode.ENABLE_ENHANCE, eventBus: this.eventBus, highlighter: this.textHighlighter, + accessibilityManager: this._accessibilityManager, }); } this.textLayer = textLayer; @@ -733,6 +736,7 @@ class PDFPageView { renderForms: this.#annotationMode === AnnotationMode.ENABLE_FORMS, l10n: this.l10n, annotationCanvasMap: this._annotationCanvasMap, + accessibilityManager: this._accessibilityManager, }); } @@ -824,6 +828,7 @@ class PDFPageView { pageDiv: div, pdfPage, l10n: this.l10n, + accessibilityManager: this._accessibilityManager, } ); this._renderAnnotationEditorLayer(); diff --git a/web/text_accessibility.js b/web/text_accessibility.js new file mode 100644 index 000000000..f4f52c93c --- /dev/null +++ b/web/text_accessibility.js @@ -0,0 +1,246 @@ +/* Copyright 2022 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { binarySearchFirstItem } from "pdfjs-lib"; + +/** + * This class aims to provide some methods: + * - to reorder elements in the DOM with respect to the visual order; + * - to create a link, using aria-owns, between spans in the textLayer and + * annotations in the annotationLayer. The goal is to help to know + * where the annotations are in the text flow. + */ +class TextAccessibilityManager { + #enabled = false; + + #textChildren = null; + + #textNodes = new Map(); + + #waitingElements = new Map(); + + setTextMapping(textDivs) { + this.#textChildren = textDivs; + } + + /** + * Compare the positions of two elements, it must correspond to + * the visual ordering. + * + * @param {HTMLElement} e1 + * @param {HTMLElement} e2 + * @returns {number} + */ + static #compareElementPositions(e1, e2) { + const rect1 = e1.getBoundingClientRect(); + const rect2 = e2.getBoundingClientRect(); + + if (rect1.width === 0 && rect1.height === 0) { + return +1; + } + + if (rect2.width === 0 && rect2.height === 0) { + return -1; + } + + const top1 = rect1.y; + const bot1 = rect1.y + rect1.height; + const mid1 = rect1.y + rect1.height / 2; + + const top2 = rect2.y; + const bot2 = rect2.y + rect2.height; + const mid2 = rect2.y + rect2.height / 2; + + if (mid1 <= top2 && mid2 >= bot1) { + return -1; + } + + if (mid2 <= top1 && mid1 >= bot2) { + return +1; + } + + const centerX1 = rect1.x + rect1.width / 2; + const centerX2 = rect2.x + rect2.width / 2; + + return centerX1 - centerX2; + } + + /** + * Function called when the text layer has finished rendering. + */ + enable() { + if (this.#enabled) { + throw new Error("TextAccessibilityManager is already enabled."); + } + if (!this.#textChildren) { + throw new Error("Text divs and strings have not been set."); + } + + this.#enabled = true; + this.#textChildren = this.#textChildren.slice(); + this.#textChildren.sort(TextAccessibilityManager.#compareElementPositions); + + if (this.#textNodes.size > 0) { + // Some links have been made before this manager has been disabled, hence + // we restore them. + const textChildren = this.#textChildren; + for (const [id, nodeIndex] of this.#textNodes) { + this.#addIdToAriaOwns(id, textChildren[nodeIndex]); + } + } + + for (const [element, isRemovable] of this.#waitingElements) { + this.addPointerInTextLayer(element, isRemovable); + } + this.#waitingElements.clear(); + } + + disable() { + if (!this.#enabled) { + return; + } + + // Don't clear this.#textNodes which is used to rebuild the aria-owns + // in case it's re-enabled at some point. + + this.#waitingElements.clear(); + this.#textChildren = null; + this.#enabled = false; + } + + /** + * Remove an aria-owns id from a node in the text layer. + * @param {HTMLElement} element + */ + removePointerInTextLayer(element) { + if (!this.#enabled) { + this.#waitingElements.delete(element); + return; + } + + const children = this.#textChildren; + if (!children || children.length === 0) { + return; + } + + const { id } = element; + const nodeIndex = this.#textNodes.get(id); + if (nodeIndex === undefined) { + return; + } + + const node = children[nodeIndex]; + + this.#textNodes.delete(id); + let owns = node.getAttribute("aria-owns"); + if (owns?.includes(id)) { + owns = owns + .split(" ") + .filter(x => x !== id) + .join(" "); + if (owns) { + node.setAttribute("aria-owns", owns); + } else { + node.removeAttribute("aria-owns"); + node.setAttribute("role", "presentation"); + } + } + } + + #addIdToAriaOwns(id, node) { + const owns = node.getAttribute("aria-owns"); + if (!owns?.includes(id)) { + node.setAttribute("aria-owns", owns ? `${owns} ${id}` : id); + } + node.removeAttribute("role"); + } + + /** + * Find the text node which is the nearest and add an aria-owns attribute + * in order to correctly position this editor in the text flow. + * @param {HTMLElement} element + * @param {boolean} isRemovable + */ + addPointerInTextLayer(element, isRemovable) { + const { id } = element; + if (!id) { + return; + } + + if (!this.#enabled) { + // The text layer needs to be there, so we postpone the association. + this.#waitingElements.set(element, isRemovable); + return; + } + + if (isRemovable) { + this.removePointerInTextLayer(element); + } + + const children = this.#textChildren; + if (!children || children.length === 0) { + return; + } + + const index = binarySearchFirstItem( + children, + node => + TextAccessibilityManager.#compareElementPositions(element, node) < 0 + ); + + const nodeIndex = Math.max(0, index - 1); + this.#addIdToAriaOwns(id, children[nodeIndex]); + this.#textNodes.set(id, nodeIndex); + } + + /** + * Move a div in the DOM in order to respect the visual order. + * @param {HTMLDivElement} element + */ + moveElementInDOM(container, element, contentElement, isRemovable) { + this.addPointerInTextLayer(contentElement, isRemovable); + + if (!container.hasChildNodes()) { + container.append(element); + return; + } + + const children = Array.from(container.childNodes).filter( + node => node !== element + ); + + if (children.length === 0) { + return; + } + + const elementToCompare = contentElement || element; + const index = binarySearchFirstItem( + children, + node => + TextAccessibilityManager.#compareElementPositions( + elementToCompare, + node + ) < 0 + ); + + if (index === 0) { + children[0].before(element); + } else { + children[index - 1].after(element); + } + } +} + +export { TextAccessibilityManager }; diff --git a/web/text_layer_builder.js b/web/text_layer_builder.js index 69982b7a9..592dcd55c 100644 --- a/web/text_layer_builder.js +++ b/web/text_layer_builder.js @@ -17,6 +17,8 @@ /** @typedef {import("../src/display/display_utils").PageViewport} PageViewport */ /** @typedef {import("./event_utils").EventBus} EventBus */ /** @typedef {import("./text_highlighter").TextHighlighter} TextHighlighter */ +// eslint-disable-next-line max-len +/** @typedef {import("./text_accessibility.js").TextAccessibilityManager} TextAccessibilityManager */ import { renderTextLayer } from "pdfjs-lib"; @@ -32,6 +34,7 @@ const EXPAND_DIVS_TIMEOUT = 300; // ms * highlighting text from the find controller. * @property {boolean} enhanceTextSelection - Option to turn on improved * text selection. + * @property {TextAccessibilityManager} [accessibilityManager] */ /** @@ -47,6 +50,7 @@ class TextLayerBuilder { viewport, highlighter = null, enhanceTextSelection = false, + accessibilityManager = null, }) { this.textLayerDiv = textLayerDiv; this.eventBus = eventBus; @@ -60,6 +64,7 @@ class TextLayerBuilder { this.textLayerRenderTask = null; this.highlighter = highlighter; this.enhanceTextSelection = enhanceTextSelection; + this.accessibilityManager = accessibilityManager; this._bindMouse(); } @@ -97,6 +102,7 @@ class TextLayerBuilder { this.textDivs.length = 0; this.highlighter?.setTextMapping(this.textDivs, this.textContentItemsStr); + this.accessibilityManager?.setTextMapping(this.textDivs); const textLayerFrag = document.createDocumentFragment(); this.textLayerRenderTask = renderTextLayer({ @@ -114,6 +120,7 @@ class TextLayerBuilder { this.textLayerDiv.append(textLayerFrag); this._finishRendering(); this.highlighter?.enable(); + this.accessibilityManager?.enable(); }, function (reason) { // Cancelled or failed to render text layer; skipping errors. @@ -130,6 +137,7 @@ class TextLayerBuilder { this.textLayerRenderTask = null; } this.highlighter?.disable(); + this.accessibilityManager?.disable(); } setTextContentStream(readableStream) {