From 4430b6b703d4567c2d9bc584327c7ed0f5e8e086 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 30 May 2024 18:53:07 +0200 Subject: [PATCH] Disconnect the resize observer and remove scroll listener when unbinding window events --- web/app.js | 7 +++++++ web/pdf_thumbnail_viewer.js | 9 ++++++++- web/pdf_viewer.js | 16 +++++++++++++++- web/ui_utils.js | 7 +++++-- 4 files changed, 35 insertions(+), 4 deletions(-) diff --git a/web/app.js b/web/app.js index 636a721d242b4..3552b671e9a90 100644 --- a/web/app.js +++ b/web/app.js @@ -159,6 +159,7 @@ const PDFViewerApplication = { _downloadUrl: "", _eventBusAbortController: null, _windowAbortController: null, + _globalAbortController: new AbortController(), documentInfo: null, metadata: null, _contentDispositionFilename: null, @@ -463,6 +464,7 @@ const PDFViewerApplication = { enablePermissions: AppOptions.get("enablePermissions"), pageColors, mlManager: this.mlManager, + abortSignal: this._globalAbortController.signal, }); this.pdfViewer = pdfViewer; @@ -477,6 +479,7 @@ const PDFViewerApplication = { renderingQueue: pdfRenderingQueue, linkService: pdfLinkService, pageColors, + abortSignal: this._globalAbortController.signal, }); pdfRenderingQueue.setThumbnailViewer(this.pdfThumbnailViewer); } @@ -2092,6 +2095,10 @@ const PDFViewerApplication = { unbindWindowEvents() { this._windowAbortController?.abort(); this._windowAbortController = null; + if (AppOptions.get("isInAutomation")) { + this._globalAbortController?.abort(); + this._globalAbortController = null; + } }, _accumulateTicks(ticks, prop) { diff --git a/web/pdf_thumbnail_viewer.js b/web/pdf_thumbnail_viewer.js index d4ebfd7771c60..f15c85b5fc621 100644 --- a/web/pdf_thumbnail_viewer.js +++ b/web/pdf_thumbnail_viewer.js @@ -42,6 +42,8 @@ const THUMBNAIL_SELECTED_CLASS = "selected"; * @property {Object} [pageColors] - Overwrites background and foreground colors * with user defined ones in order to improve readability in high contrast * mode. + * @property {AbortSignal} [abortSignal] - The AbortSignal for the window + * events. */ /** @@ -57,6 +59,7 @@ class PDFThumbnailViewer { linkService, renderingQueue, pageColors, + abortSignal, }) { this.container = container; this.eventBus = eventBus; @@ -64,7 +67,11 @@ class PDFThumbnailViewer { this.renderingQueue = renderingQueue; this.pageColors = pageColors || null; - this.scroll = watchScroll(this.container, this.#scrollUpdated.bind(this)); + this.scroll = watchScroll( + this.container, + this.#scrollUpdated.bind(this), + abortSignal + ); this.#resetView(); } diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index d52d1e25a876d..50c42e7a6fcc6 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -309,7 +309,21 @@ class PDFViewer { this.renderingQueue = options.renderingQueue; } - this.scroll = watchScroll(this.container, this._scrollUpdate.bind(this)); + const { abortSignal } = options; + abortSignal?.addEventListener( + "abort", + () => { + this.#resizeObserver.disconnect(); + this.#resizeObserver = null; + }, + { once: true } + ); + + this.scroll = watchScroll( + this.container, + this._scrollUpdate.bind(this), + abortSignal + ); this.presentationModeState = PresentationModeState.UNKNOWN; this._resetView(); diff --git a/web/ui_utils.js b/web/ui_utils.js index a6c0bc7f15fab..19f2bd25744b8 100644 --- a/web/ui_utils.js +++ b/web/ui_utils.js @@ -155,7 +155,7 @@ function scrollIntoView(element, spot, scrollMatches = false) { * Helper function to start monitoring the scroll event and converting them into * PDF.js friendly one: with scroll debounce and scroll direction. */ -function watchScroll(viewAreaElement, callback) { +function watchScroll(viewAreaElement, callback, abortSignal = undefined) { const debounceScroll = function (evt) { if (rAF) { return; @@ -189,7 +189,10 @@ function watchScroll(viewAreaElement, callback) { }; let rAF = null; - viewAreaElement.addEventListener("scroll", debounceScroll, true); + viewAreaElement.addEventListener("scroll", debounceScroll, { + useCapture: true, + signal: abortSignal, + }); return state; }