From 53d866660a71ed4894a81dc33a5b3525c3a3f491 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Tue, 21 May 2024 13:39:47 +0200 Subject: [PATCH] Add test for drawing delay with CSS-only zoom This commit adds a test for 0603d1ac1843bc4098d74382beda6cc511350ccd. Before the fix the `pagerendered` events would be fired just 2-3 milliseconds after the call to `increaseScale`/`decreaseScale`. --- test/integration/viewer_spec.mjs | 90 +++++++++++++++++++++++++++++++- web/app.js | 6 +++ 2 files changed, 95 insertions(+), 1 deletion(-) diff --git a/test/integration/viewer_spec.mjs b/test/integration/viewer_spec.mjs index 6ef5f2b65..d2f2f847f 100644 --- a/test/integration/viewer_spec.mjs +++ b/test/integration/viewer_spec.mjs @@ -13,7 +13,12 @@ * limitations under the License. */ -import { closePages, loadAndWait } from "./test_utils.mjs"; +import { + awaitPromise, + closePages, + createPromise, + loadAndWait, +} from "./test_utils.mjs"; describe("PDF viewer", () => { describe("Zoom with the mouse wheel", () => { @@ -87,4 +92,87 @@ describe("PDF viewer", () => { ); }); }); + + describe("CSS-only zoom", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait( + "tracemonkey.pdf", + ".textLayer .endOfContent", + null, + null, + { + maxCanvasPixels: 0, + } + ); + }); + + afterAll(async () => { + await closePages(pages); + }); + + function createPromiseForFirstPageRendered(page) { + return createPromise(page, (resolve, reject) => { + const controller = new AbortController(); + window.PDFViewerApplication.eventBus.on( + "pagerendered", + ({ pageNumber, timestamp }) => { + if (pageNumber === 1) { + resolve(timestamp); + controller.abort(); + } + }, + { signal: controller.signal } + ); + setTimeout(reject, 1000, new Error("Timeout")); + }); + } + + it("respects drawing delay when zooming out", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const promise = await createPromiseForFirstPageRendered(page); + + const start = await page.evaluate(() => { + const startTime = performance.now(); + window.PDFViewerApplication.pdfViewer.decreaseScale({ + drawingDelay: 100, + scaleFactor: 0.9, + }); + return startTime; + }); + + const end = await awaitPromise(promise); + + expect(end - start) + .withContext(`In ${browserName}`) + .toBeGreaterThanOrEqual(100); + }) + ); + }); + + it("respects drawing delay when zooming in", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const promise = await createPromiseForFirstPageRendered(page); + + const start = await page.evaluate(() => { + const startTime = performance.now(); + window.PDFViewerApplication.pdfViewer.increaseScale({ + drawingDelay: 100, + scaleFactor: 1.1, + }); + return startTime; + }); + + const end = await awaitPromise(promise); + + expect(end - start) + .withContext(`In ${browserName}`) + .toBeGreaterThanOrEqual(100); + }) + ); + }); + }); }); diff --git a/web/app.js b/web/app.js index 9d454e0c6..e91829797 100644 --- a/web/app.js +++ b/web/app.js @@ -359,6 +359,12 @@ const PDFViewerApplication = { params.get("highlighteditorcolors") ); } + if (params.has("maxcanvaspixels")) { + AppOptions.set( + "maxCanvasPixels", + Number(params.get("maxcanvaspixels")) + ); + } if (params.has("supportscaretbrowsingmode")) { AppOptions.set( "supportsCaretBrowsingMode",