From cffd54e9c6d0c78499172e0d749529d747c3ef0f Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Mon, 12 Jan 2026 11:43:08 +0100 Subject: [PATCH] Hide the text in the text layer associated with MathML elements (bug 2009627) The bug was supposed to be fixed by #20471 but here there are some annotations in the pdf. When those annotations are added to the DOM, the struct tree has to be rendered but without the text layer (because of asynchronicity). So this patch is making sure that the modifications in the text layer are done once the layer is rendered. --- test/integration/accessibility_spec.mjs | 46 +++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/bug2009627.pdf | Bin 0 -> 40781 bytes web/pdf_page_view.js | 2 +- web/struct_tree_layer_builder.js | 73 ++++++++++++++++-------- 5 files changed, 98 insertions(+), 24 deletions(-) create mode 100755 test/pdfs/bug2009627.pdf diff --git a/test/integration/accessibility_spec.mjs b/test/integration/accessibility_spec.mjs index 41f84adb100da..2c04b5f00c0b3 100644 --- a/test/integration/accessibility_spec.mjs +++ b/test/integration/accessibility_spec.mjs @@ -498,4 +498,50 @@ describe("accessibility", () => { ); }); }); + + describe("Text elements must be aria-hidden when there's MathML and annotations", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait("bug2009627.pdf", ".textLayer"); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("must check that the text in text layer is aria-hidden", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const isSanitizerSupported = await page.evaluate(() => { + try { + // eslint-disable-next-line no-undef + return typeof Sanitizer !== "undefined"; + } catch { + return false; + } + }); + const ariaHidden = await page.evaluate(() => + Array.from( + document.querySelectorAll(".structTree :has(> math)") + ).map(el => + document + .getElementById(el.getAttribute("aria-owns")) + .getAttribute("aria-hidden") + ) + ); + if (isSanitizerSupported) { + expect(ariaHidden) + .withContext(`In ${browserName}`) + .toEqual(["true", "true", "true"]); + } else { + // eslint-disable-next-line no-console + console.log( + `Pending in Chrome: Sanitizer API (in ${browserName}) is not supported` + ); + } + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 7b1a154a0ef1c..7c5d8ab4bd448 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -867,3 +867,4 @@ !bitmap-trailing-7fff-stripped.pdf !bitmap.pdf !bomb_giant.pdf +!bug2009627.pdf diff --git a/test/pdfs/bug2009627.pdf b/test/pdfs/bug2009627.pdf new file mode 100755 index 0000000000000000000000000000000000000000..0b8189108f9b01648d09178b3eadf9c5a8c33e22 GIT binary patch literal 40781 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 GO#VNj9xd|# literal 0 HcmV?d00001 diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index fc75a9fd036ff..15968a8f28b51 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -493,7 +493,7 @@ class PDFPageView extends BasePDFPageView { const treeDom = await this.structTreeLayer?.render(); if (treeDom) { this.l10n.pause(); - this.structTreeLayer?.addElementsToTextLayer(); + this.structTreeLayer?.updateTextLayer(); if (this.canvas && treeDom.parentNode !== this.canvas) { // Pause translation when inserting the structTree in the DOM. this.canvas.append(treeDom); diff --git a/web/struct_tree_layer_builder.js b/web/struct_tree_layer_builder.js index a2d1524a79f8c..8f561eac5d319 100644 --- a/web/struct_tree_layer_builder.js +++ b/web/struct_tree_layer_builder.js @@ -184,6 +184,10 @@ class StructTreeLayerBuilder { #elementsToAddToTextLayer = null; + #elementsToHideInTextLayer = null; + + #elementsToStealFromTextLayer = null; + /** * @param {StructTreeLayerBuilderOptions} options */ @@ -304,15 +308,49 @@ class StructTreeLayerBuilder { return true; } - addElementsToTextLayer() { - if (!this.#elementsToAddToTextLayer) { - return; + updateTextLayer() { + if (this.#elementsToAddToTextLayer) { + for (const [id, img] of this.#elementsToAddToTextLayer) { + document.getElementById(id)?.append(img); + } + this.#elementsToAddToTextLayer.clear(); + this.#elementsToAddToTextLayer = null; } - for (const [id, img] of this.#elementsToAddToTextLayer) { - document.getElementById(id)?.append(img); + if (this.#elementsToHideInTextLayer) { + for (const id of this.#elementsToHideInTextLayer) { + const elem = document.getElementById(id); + if (elem) { + elem.ariaHidden = true; + } + } + this.#elementsToHideInTextLayer.length = 0; + this.#elementsToHideInTextLayer = null; + } + if (this.#elementsToStealFromTextLayer) { + for ( + let i = 0, ii = this.#elementsToStealFromTextLayer.length; + i < ii; + i += 2 + ) { + const element = this.#elementsToStealFromTextLayer[i]; + const ids = this.#elementsToStealFromTextLayer[i + 1]; + let textContent = ""; + for (const id of ids) { + const elem = document.getElementById(id); + if (elem) { + textContent += elem.textContent.trim() || ""; + // Aria-hide the element in order to avoid duplicate reading of the + // math content by screen readers. + elem.ariaHidden = "true"; + } + } + if (textContent) { + element.textContent = textContent; + } + } + this.#elementsToStealFromTextLayer.length = 0; + this.#elementsToStealFromTextLayer = null; } - this.#elementsToAddToTextLayer.clear(); - this.#elementsToAddToTextLayer = null; } #walk(node) { @@ -325,21 +363,13 @@ class StructTreeLayerBuilder { const { role } = node; if (MathMLElements.has(role)) { element = document.createElementNS(MathMLNamespace, role); - let text = ""; + const ids = []; + (this.#elementsToStealFromTextLayer ||= []).push(element, ids); for (const { type, id } of node.children || []) { - if (type !== "content" || !id) { - continue; + if (type === "content" && id) { + ids.push(id); } - const elem = document.getElementById(id); - if (!elem) { - continue; - } - text += elem.textContent.trim() || ""; - // Aria-hide the element in order to avoid duplicate reading of the - // math content by screen readers. - elem.ariaHidden = "true"; } - element.textContent = text; } else { element = document.createElement("span"); } @@ -365,10 +395,7 @@ class StructTreeLayerBuilder { if (!id) { continue; } - const elem = document.getElementById(id); - if (elem) { - elem.ariaHidden = true; - } + (this.#elementsToHideInTextLayer ||= []).push(id); } // For now, we don't want to keep the alt text if there's valid // MathML (see https://github.com/w3c/mathml-aam/issues/37).