diff --git a/src/core/worker.js b/src/core/worker.js index fe699b978814b..1c44a0d8e4199 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 ada62580a3943..0501dc02eb911 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 552566d6cc4bd..c6e9febf9ea01 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;