From 37d5f2d2cac4d94e72c9f66c5bfafa20efc628ab Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Sat, 25 Nov 2023 18:40:43 +0100 Subject: [PATCH] Remove useless message handlers These handlers are used to initiate the communication between the content thread and the worker and they aren't used once the document is loaded, hence we can remove them. --- src/core/worker.js | 7 +++++-- src/display/api.js | 15 +++++++++++++-- web/app.js | 1 + 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/core/worker.js b/src/core/worker.js index fe699b978..1c44a0d8e 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -87,8 +87,11 @@ class WorkerMessageHandler { setVerbosityLevel(data.verbosity); }); - handler.on("GetDocRequest", function (data) { - return WorkerMessageHandler.createDocumentHandler(data, port); + handler.on("GetDocRequest", function ({ source, singleUse }) { + if (singleUse) { + handler.destroy(); + } + return WorkerMessageHandler.createDocumentHandler(source, port); }); } diff --git a/src/display/api.js b/src/display/api.js index ada62580a..0501dc02e 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -216,6 +216,8 @@ const DefaultStandardFontDataFactory = * when creating canvases. The default value is {new DOMCanvasFactory()}. * @property {Object} [filterFactory] - A factory instance that will be used * to create SVG filters when rendering some images on the main canvas. + * @property {boolean} [singleUse] - When true the worker will be able to load + * only one PDF document, using the `getDocument` method. */ /** @@ -346,12 +348,13 @@ function getDocument(src) { baseUrl: standardFontDataUrl, }); } - if (!worker) { const workerParams = { verbosity, port: GlobalWorkerOptions.workerPort, + singleUse: src.singleUse === true, }; + // Worker was not provided -- creating and owning our own. If message port // is specified in global worker options, using it. worker = workerParams.port @@ -456,6 +459,12 @@ function getDocument(src) { throw new Error("Loading aborted"); } + if (worker._singleUse) { + // We don't the messageHandler anymore. + worker._messageHandler.destroy(); + worker._messageHandler = null; + } + const messageHandler = new MessageHandler( docId, workerId, @@ -493,7 +502,7 @@ async function _fetchDocument(worker, source) { } const workerId = await worker.messageHandler.sendWithPromise( "GetDocRequest", - source, + { source, singleUse: worker._singleUse }, source.data ? [source.data.buffer] : null ); @@ -2029,6 +2038,7 @@ class PDFWorker { name = null, port = null, verbosity = getVerbosityLevel(), + singleUse = false, } = {}) { this.name = name; this.destroyed = false; @@ -2038,6 +2048,7 @@ class PDFWorker { this._port = null; this._webWorker = null; this._messageHandler = null; + this._singleUse = singleUse; if ( (typeof PDFJSDev === "undefined" || !PDFJSDev.test("MOZCENTRAL")) && diff --git a/web/app.js b/web/app.js index 552566d6c..c6e9febf9 100644 --- a/web/app.js +++ b/web/app.js @@ -1000,6 +1000,7 @@ const PDFViewerApplication = { const loadingTask = getDocument({ ...apiParams, ...args, + singleUse: true, }); this.pdfLoadingTask = loadingTask;