From 31b0a496fd2b45f1b155d5bb74131089ca3af892 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 8 Oct 2024 15:33:36 +0200 Subject: [PATCH] Remove the temporary "visibilitychange" listener, in `PDFViewer`, with `AbortSignal.any()` This is similar to a lot of other code, where we've been replacing explicit `removeEventListener`-calls. Given the somewhat limited availability of `AbortSignal.any()`, see [MDN](https://developer.mozilla.org/en-US/docs/Web/API/AbortSignal/any_static#browser_compatibility), this event listener will no longer be immediately removed in older browsers (however that should be fine). --- web/pdf_viewer.js | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index b7deb5aed3367..9db9c6adcfdc6 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -673,22 +673,29 @@ class PDFViewer { // Handle the window/tab becoming inactive *after* rendering has started; // fixes (another part of) bug 1746213. - const hiddenCapability = Promise.withResolvers(); - function onVisibilityChange() { - if (document.visibilityState === "hidden") { - hiddenCapability.resolve(); + const hiddenCapability = Promise.withResolvers(), + ac = new AbortController(); + document.addEventListener( + "visibilitychange", + () => { + if (document.visibilityState === "hidden") { + hiddenCapability.resolve(); + } + }, + { + signal: + (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) || + typeof AbortSignal.any === "function" + ? AbortSignal.any([signal, ac.signal]) + : signal, } - } - document.addEventListener("visibilitychange", onVisibilityChange, { - signal, - }); + ); await Promise.race([ this._onePageRenderedCapability.promise, hiddenCapability.promise, ]); - // Ensure that the "visibilitychange" listener is removed immediately. - document.removeEventListener("visibilitychange", onVisibilityChange); + ac.abort(); // Remove the "visibilitychange" listener immediately. } async getAllText() {