From 43bd7fa738f04ce4e32c8a441e1cfb75e6ed80ad Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Mon, 19 Jan 2026 17:26:35 +0100 Subject: [PATCH 1/4] Fix links and outline after reorganizing a pdf --- test/integration/reorganize_pages_spec.mjs | 71 +++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/page_with_number_and_link.pdf | Bin 0 -> 71816 bytes web/pdf_link_service.js | 27 +++++--- 4 files changed, 89 insertions(+), 10 deletions(-) create mode 100755 test/pdfs/page_with_number_and_link.pdf diff --git a/test/integration/reorganize_pages_spec.mjs b/test/integration/reorganize_pages_spec.mjs index 72787c4b452a8..d1721a6d03c42 100644 --- a/test/integration/reorganize_pages_spec.mjs +++ b/test/integration/reorganize_pages_spec.mjs @@ -19,9 +19,11 @@ import { closePages, createPromise, dragAndDrop, + getAnnotationSelector, getRect, getThumbnailSelector, loadAndWait, + scrollIntoView, waitForDOMMutation, } from "./test_utils.mjs"; @@ -415,4 +417,73 @@ describe("Reorganize Pages View", () => { ); }); }); + + describe("Links and outlines", () => { + let pages; + + beforeEach(async () => { + pages = await loadAndWait( + "page_with_number_and_link.pdf", + "#viewsManagerToggleButton", + "page-fit", + null, + { enableSplitMerge: true } + ); + }); + + afterEach(async () => { + await closePages(pages); + }); + + it("should check that link is updated after moving pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await movePages(page, [2], 10); + await scrollIntoView(page, getAnnotationSelector("107R")); + await page.click(getAnnotationSelector("107R")); + await page.waitForSelector( + ".page[data-page-number='10'] + .page[data-page-number='2']", + { + visible: true, + } + ); + + const currentPage = await page.$eval( + "#pageNumber", + el => el.valueAsNumber + ); + expect(currentPage).withContext(`In ${browserName}`).toBe(10); + }) + ); + }); + + it("should check that outlines are updated after moving pages", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + await waitForThumbnailVisible(page, 1); + await movePages(page, [2, 4], 10); + + await page.click("#viewsManagerSelectorButton"); + await page.click("#outlinesViewMenu"); + await page.waitForSelector("#outlinesView", { visible: true }); + + await page.click("#outlinesView .treeItem:nth-child(2)"); + await page.waitForSelector( + ".page[data-page-number='10'] + .page[data-page-number='2']", + { + visible: true, + } + ); + + const currentPage = await page.$eval( + "#pageNumber", + el => el.valueAsNumber + ); + // 9 because 2 and 4 were moved after page 10. + expect(currentPage).withContext(`In ${browserName}`).toBe(9); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 945baa76d33c4..0b8d7667d0b1d 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -869,3 +869,4 @@ !bomb_giant.pdf !bug2009627.pdf !page_with_number.pdf +!page_with_number_and_link.pdf diff --git a/test/pdfs/page_with_number_and_link.pdf b/test/pdfs/page_with_number_and_link.pdf new file mode 100755 index 0000000000000000000000000000000000000000..b229650aa9559cd582b10162405f34bb1717f09f GIT binary patch literal 71816 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 MG8WScxvI*)0BM)3egFUf literal 0 HcmV?d00001 diff --git a/web/pdf_link_service.js b/web/pdf_link_service.js index 885de2bc83130..b3b2329c829a4 100644 --- a/web/pdf_link_service.js +++ b/web/pdf_link_service.js @@ -16,8 +16,8 @@ /** @typedef {import("./event_utils").EventBus} EventBus */ /** @typedef {import("./interfaces").IPDFLinkService} IPDFLinkService */ +import { PagesMapper, parseQueryString } from "./ui_utils.js"; import { isValidExplicitDest } from "pdfjs-lib"; -import { parseQueryString } from "./ui_utils.js"; const DEFAULT_LINK_REL = "noopener noreferrer nofollow"; @@ -50,6 +50,8 @@ const LinkTarget = { class PDFLinkService { externalLinkEnabled = true; + #pagesMapper = PagesMapper.instance; + /** * @param {PDFLinkServiceOptions} options */ @@ -138,7 +140,7 @@ class PDFLinkService { if (!this.pdfDocument) { return; } - let namedDest, explicitDest, pageNumber; + let namedDest, explicitDest, pageId; if (typeof dest === "string") { namedDest = dest; explicitDest = await this.pdfDocument.getDestination(dest); @@ -156,13 +158,13 @@ class PDFLinkService { const [destRef] = explicitDest; if (destRef && typeof destRef === "object") { - pageNumber = this.pdfDocument.cachedPageNumber(destRef); + pageId = this.pdfDocument.cachedPageNumber(destRef); - if (!pageNumber) { + if (!pageId) { // Fetch the page reference if it's not yet available. This could // only occur during loading, before all pages have been resolved. try { - pageNumber = (await this.pdfDocument.getPageIndex(destRef)) + 1; + pageId = (await this.pdfDocument.getPageIndex(destRef)) + 1; } catch { console.error( `goToDestination: "${destRef}" is not a valid page reference, for dest="${dest}".` @@ -171,20 +173,25 @@ class PDFLinkService { } } } else if (Number.isInteger(destRef)) { - pageNumber = destRef + 1; + pageId = destRef + 1; } - if (!pageNumber || pageNumber < 1 || pageNumber > this.pagesCount) { + if (!pageId || pageId < 1 || pageId > this.pagesCount) { console.error( - `goToDestination: "${pageNumber}" is not a valid page number, for dest="${dest}".` + `goToDestination: "${pageId}" is not a valid page number, for dest="${dest}".` ); return; } + const pageNumber = this.#pagesMapper.getPageNumber(pageId); + if (pageNumber === null) { + return; + } + if (this.pdfHistory) { // Update the browser history before scrolling the new destination into // view, to be able to accurately capture the current document position. this.pdfHistory.pushCurrentPosition(); - this.pdfHistory.push({ namedDest, explicitDest, pageNumber }); + this.pdfHistory.push({ namedDest, explicitDest, pageNumber: pageId }); } this.pdfViewer.scrollPageIntoView({ @@ -197,7 +204,7 @@ class PDFLinkService { this.eventBus._on( "textlayerrendered", evt => { - if (evt.pageNumber === pageNumber) { + if (evt.pageNumber === pageId) { evt.source.textLayer.div.focus(); ac.abort(); } From a4f4d460cab9b86b2d1a4ab6e340bfff33d38ff0 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Tue, 20 Jan 2026 14:42:40 +0100 Subject: [PATCH 2/4] Hide the menu container in changing it's visibility This way, the dimensions of the menu container don't depend on its visibility. This patch fixes few keyboard issues I noticed when reading: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/menu_role#keyboard_interactions --- web/menu.css | 11 +++++++++++ web/menu.js | 39 +++++++++++++++++++++++++++------------ web/viewer.html | 9 +++++---- web/views_manager.css | 6 ++++-- 4 files changed, 47 insertions(+), 18 deletions(-) diff --git a/web/menu.css b/web/menu.css index 9fd4e34b27c64..5ed86cb1c2836 100644 --- a/web/menu.css +++ b/web/menu.css @@ -13,6 +13,16 @@ * limitations under the License. */ +button.hasPopupMenu { + &[aria-expanded="true"] + menu { + visibility: visible; + } + + &[aria-expanded="false"] + menu { + visibility: hidden; + } +} + .popupMenu { --menuitem-checkmark-icon: url(images/checkmark.svg); --menu-mark-icon-size: 0; @@ -75,6 +85,7 @@ top: 1px; margin: 0; padding: 5px; + box-sizing: border-box; background: var(--menu-bg); background-blend-mode: var(--menu-background-blend-mode); diff --git a/web/menu.js b/web/menu.js index 508c2c3031cd0..27218093da33b 100644 --- a/web/menu.js +++ b/web/menu.js @@ -56,7 +56,6 @@ class Menu { return; } const menu = this.#menu; - menu.classList.toggle("hidden", true); this.#triggeringButton.ariaExpanded = "false"; this.#openMenuAC.abort(); this.#openMenuAC = null; @@ -82,7 +81,6 @@ class Menu { } const menu = this.#menu; - menu.classList.toggle("hidden", false); this.#triggeringButton.ariaExpanded = "true"; this.#openMenuAC = new AbortController(); const signal = AbortSignal.any([ @@ -137,6 +135,13 @@ class Menu { .focus(); stopEvent(e); break; + default: + const char = e.key.toLocaleLowerCase(); + this.#goToNextItem(e.target, true, item => + item.textContent.trim().toLowerCase().startsWith(char) + ); + stopEvent(e); + break; } }, { signal, capture: true } @@ -148,32 +153,38 @@ class Menu { }); this.#triggeringButton.addEventListener( "keydown", - ev => { - if (!this.#openMenuAC) { - return; - } - switch (ev.key) { + e => { + switch (e.key) { + case " ": + case "Enter": case "ArrowDown": case "Home": + if (!this.#openMenuAC) { + this.#triggeringButton.click(); + } this.#menuItems .find( item => !item.disabled && !item.classList.contains("hidden") ) .focus(); - stopEvent(ev); + stopEvent(e); break; case "ArrowUp": case "End": + if (!this.#openMenuAC) { + this.#triggeringButton.click(); + } this.#menuItems .findLast( item => !item.disabled && !item.classList.contains("hidden") ) .focus(); - stopEvent(ev); + stopEvent(e); break; case "Escape": this.#closeMenu(); - stopEvent(ev); + stopEvent(e); + break; } }, { signal } @@ -185,7 +196,7 @@ class Menu { * @param {HTMLElement} element * @param {boolean} forward */ - #goToNextItem(element, forward) { + #goToNextItem(element, forward, check = () => true) { const index = this.#lastIndex === -1 ? this.#menuItems.indexOf(element) @@ -198,7 +209,11 @@ class Menu { i = (i + increment) % len ) { const menuItem = this.#menuItems[i]; - if (!menuItem.disabled && !menuItem.classList.contains("hidden")) { + if ( + !menuItem.disabled && + !menuItem.classList.contains("hidden") && + check(menuItem) + ) { menuItem.focus(); this.#lastIndex = i; break; diff --git a/web/viewer.html b/web/viewer.html index ac741b298cc76..34c5e535e803f 100644 --- a/web/viewer.html +++ b/web/viewer.html @@ -130,7 +130,7 @@
-