From d8e0fca6094770513ebd92adb20409df582e306c Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 17 May 2024 08:40:01 +0200 Subject: [PATCH] Don't invoke `cleanupTextLayer` when there are pending textLayers *Please note:* This doesn't really affect the viewer, but may affect the library API if multiple PDF documents are opened in parallel. Since we clean-up "global" textLayer-data when destroying a PDF document, this means that other active PDFs could potentially break by invoking `cleanupTextLayer` unconditionally. Note that textLayer rendering is an asynchronous task, and we thus need to ensure those are all finished before running clean-up. --- src/display/text_layer.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/display/text_layer.js b/src/display/text_layer.js index d69279467..3bcb2fb7a 100644 --- a/src/display/text_layer.js +++ b/src/display/text_layer.js @@ -63,6 +63,7 @@ const DEFAULT_FONT_SIZE = 30; const DEFAULT_FONT_ASCENT = 0.8; const ascentCache = new Map(); let _canvasContext = null; +const pendingTextLayers = new Set(); function getCtx(lang = null) { if (!_canvasContext) { @@ -85,6 +86,9 @@ function getCtx(lang = null) { } function cleanupTextLayer() { + if (pendingTextLayers.size > 0) { + return; + } _canvasContext?.canvas.remove(); _canvasContext = null; } @@ -245,9 +249,11 @@ class TextLayerRenderTask { setLayerDimensions(container, viewport); + pendingTextLayers.add(this); // Always clean-up the temporary canvas once rendering is no longer pending. this._capability.promise .finally(() => { + pendingTextLayers.delete(this); this._layoutTextParams = null; this._styleCache = null; })