From 6403a436f0f2f44c1adb291b129f8df842d73bdd Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 21 Mar 2024 12:51:08 +0100 Subject: [PATCH] Avoid wrong scrolling when calling zoomReset The goal of this patch is to fix the test: https://searchfox.org/mozilla-central/source/toolkit/components/pdfjs/test/browser_pdfjs_zoom.js It's a regression due to #17790. --- test/integration/viewer_spec.mjs | 32 ++++++++++++++++++++++++++++++++ web/pdf_page_view.js | 5 +++++ 2 files changed, 37 insertions(+) diff --git a/test/integration/viewer_spec.mjs b/test/integration/viewer_spec.mjs index 962d74f10fcaa9..6ef5f2b65573e2 100644 --- a/test/integration/viewer_spec.mjs +++ b/test/integration/viewer_spec.mjs @@ -55,4 +55,36 @@ describe("PDF viewer", () => { ); }); }); + + describe("Zoom commands", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("tracemonkey.pdf", ".textLayer .endOfContent"); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that zoom commands don't scroll the document", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + for (let i = 0; i < 10; i++) { + await page.evaluate(() => window.PDFViewerApplication.zoomIn()); + await page.evaluate(() => window.PDFViewerApplication.zoomReset()); + await page.waitForSelector( + `.page[data-page-number="1"] .textLayer .endOfContent` + ); + const scrollTop = await page.evaluate( + () => document.getElementById("viewerContainer").scrollTop + ); + expect(scrollTop < 100) + .withContext(`In ${browserName}`) + .toBe(true); + } + }) + ); + }); + }); }); diff --git a/web/pdf_page_view.js b/web/pdf_page_view.js index 540a221a0d87f5..928981f53b5eb2 100644 --- a/web/pdf_page_view.js +++ b/web/pdf_page_view.js @@ -235,7 +235,12 @@ class PDFPageView { #addLayer(div, name) { const pos = LAYERS_ORDER.get(name); + const oldDiv = this.#layers[pos]; this.#layers[pos] = div; + if (oldDiv) { + oldDiv.replaceWith(div); + return; + } for (let i = pos - 1; i >= 0; i--) { const layer = this.#layers[i]; if (layer) {