From 18bafeb1c6b65a553fa5a8d96e0115acdb49c46f Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Wed, 4 Mar 2026 09:57:46 +0100 Subject: [PATCH] Add some aria-labels to the paste button in order to know where the buttons are (bug 2020758) --- l10n/en-US/viewer.ftl | 7 +++- test/integration/reorganize_pages_spec.mjs | 38 ++++++++++++++++++++++ web/pdf_thumbnail_view.js | 16 ++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) diff --git a/l10n/en-US/viewer.ftl b/l10n/en-US/viewer.ftl index 97a2d0469..9d26a18a6 100644 --- a/l10n/en-US/viewer.ftl +++ b/l10n/en-US/viewer.ftl @@ -767,4 +767,9 @@ pdfjs-views-manager-status-undo-button-label = Undo pdfjs-views-manager-status-close-button = .title = Close pdfjs-views-manager-status-close-button-label = Close -pdfjs-views-manager-paste-button-label = Paste + +# Variables: +# $page (Number) - the page number after which the paste button is. +pdfjs-views-manager-paste-button-after-label = Paste after page { $page } + +pdfjs-views-manager-paste-button-before-label = Paste before the first page diff --git a/test/integration/reorganize_pages_spec.mjs b/test/integration/reorganize_pages_spec.mjs index fad3139b9..0591fdce3 100644 --- a/test/integration/reorganize_pages_spec.mjs +++ b/test/integration/reorganize_pages_spec.mjs @@ -20,6 +20,7 @@ import { createPromise, createPromiseWithArgs, dragAndDrop, + FSI, getAnnotationSelector, getRect, getThumbnailSelector, @@ -27,6 +28,7 @@ import { kbCut, kbDelete, loadAndWait, + PDI, scrollIntoView, showViewsManager, waitAndClick, @@ -792,6 +794,42 @@ describe("Reorganize Pages View", () => { await closePages(pages); }); + it("should check that the paste button spans have the right l10n id depending on their position", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await page.waitForSelector("#viewsManagerStatusActionButton", { + visible: true, + }); + await waitAndClick( + page, + `.thumbnail:has(${getThumbnailSelector(1)}) input` + ); + + const handlePagesEdited = await waitForPagesEdited(page); + await waitAndClick(page, "#viewsManagerStatusActionButton"); + await waitAndClick(page, "#viewsManagerStatusActionCopy"); + await awaitPromise(handlePagesEdited); + + const prevSpanText = await page.$eval( + `button.thumbnailPasteButton:has(+ ${getThumbnailSelector(1)}) > span`, + el => el.textContent.trim() + ); + expect(prevSpanText) + .withContext(`In ${browserName}`) + .toBe("Paste before the first page"); + + const afterSpanText = await page.$eval( + `${getThumbnailSelector(1)} + button.thumbnailPasteButton > span`, + el => el.textContent.trim() + ); + expect(afterSpanText) + .withContext(`In ${browserName}`) + .toBe(`Paste after page ${FSI}1${PDI}`); + }) + ); + }); + it("should check that a page can be copied and pasted before the first thumbnail", async () => { await Promise.all( pages.map(async ([browserName, page]) => { diff --git a/web/pdf_thumbnail_view.js b/web/pdf_thumbnail_view.js index e393f35f9..6cf7bf83b 100644 --- a/web/pdf_thumbnail_view.js +++ b/web/pdf_thumbnail_view.js @@ -183,7 +183,16 @@ class PDFThumbnailView extends RenderableView { pasteButton.classList.add("thumbnailPasteButton", "viewsManagerButton"); pasteButton.tabIndex = 0; const span = document.createElement("span"); - span.setAttribute("data-l10n-id", "pdfjs-views-manager-paste-button-label"); + span.setAttribute( + "data-l10n-id", + "pdfjs-views-manager-paste-button-after-label" + ); + span.setAttribute( + "data-l10n-args", + JSON.stringify({ + page: this.pageLabel ?? this.id, + }) + ); pasteButton.append(span); pasteButton.addEventListener("click", () => { pasteCallback(this.id); @@ -191,6 +200,11 @@ class PDFThumbnailView extends RenderableView { if (this.id === 1) { const prevPasteButton = (this.prevPasteButton = pasteButton.cloneNode(true)); + const prevSpan = prevPasteButton.firstElementChild; + prevSpan.setAttribute( + "data-l10n-id", + "pdfjs-views-manager-paste-button-before-label" + ); prevPasteButton.addEventListener("click", () => { pasteCallback(0); });