diff --git a/apps/web/src/components/files/AttachmentFilePreview.browser.test.tsx b/apps/web/src/components/files/AttachmentFilePreview.browser.test.tsx index 98b34fbc00f89..5356066d0524b 100644 --- a/apps/web/src/components/files/AttachmentFilePreview.browser.test.tsx +++ b/apps/web/src/components/files/AttachmentFilePreview.browser.test.tsx @@ -2522,6 +2522,7 @@ it("keeps workspace PDF scroll and zoom after reloads", async () => { const { preview, urls } = fixture; await using screen = await render(preview(urls.original, "one")); await expect.element(screen.getByText("1 / 3 pages", { exact: true })).toBeVisible(); + using workers = vi.spyOn(window, "Worker"); await screen.getByRole("button", { name: "Next page", exact: true }).click(); await vi.waitFor(() => expect(screen.container.textContent).toContain("2 / 3 pages")); await screen.getByRole("button", { name: "Next page", exact: true }).click(); @@ -2576,6 +2577,7 @@ it("keeps workspace PDF scroll and zoom after reloads", async () => { expect(region().scrollTop).toBe(0); expect(region().scrollLeft).toBe(0); }); + expect(workers).not.toHaveBeenCalled(); }); it("clamps workspace PDF scroll when pages shrink or disappear", async () => { diff --git a/apps/web/src/components/files/pdfDocument.ts b/apps/web/src/components/files/pdfDocument.ts index 2cc5493718b4c..32e8aefbe9028 100644 --- a/apps/web/src/components/files/pdfDocument.ts +++ b/apps/web/src/components/files/pdfDocument.ts @@ -1,4 +1,4 @@ -import { getDocument, GlobalWorkerOptions } from "pdfjs-dist"; +import { getDocument, GlobalWorkerOptions, PDFWorker } from "pdfjs-dist"; import workerUrl from "pdfjs-dist/build/pdf.worker.min.mjs?url"; import fallbackUrl from "pdfjs-dist/wasm/openjpeg_nowasm_fallback.js?url"; @@ -31,8 +31,13 @@ export class BinaryDataFactory { } } +// Without a shared worker, pdf.js starts a worker and recompiles its 1.3 MB script for every document. +let worker: PDFWorker | undefined; + export function openPdf(bytes: ArrayBuffer) { + worker ??= new PDFWorker(); return getDocument({ + worker, data: new Uint8Array(bytes), useSystemFonts: true, useWorkerFetch: false,