From b18620ac0f196c6fa5a9e54a53fa6b915e19e843 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Wed, 28 Jul 2021 11:50:44 +0200 Subject: [PATCH] Remove the closure used with the `PDFDocumentLoadingTask` class This patch utilizes the same approach as used in lots of other parts of the code-base, which thus *slightly* reduces the size of this code. By removing some of the (current) indirection, we can also simplify the JSDocs a little bit. Looking at the `gulp jsdoc` output, this actually seem to *improve* the documentation for this class. --- src/display/api.js | 168 +++++++++++++++++------------------------- test/unit/api_spec.js | 20 +++++ 2 files changed, 89 insertions(+), 99 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 44ada821b..da85614f0 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -524,111 +524,81 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { * The loading task controls the operations required to load a PDF document * (such as network requests) and provides a way to listen for completion, * after which individual pages can be rendered. - * - * @typedef {Object} PDFDocumentLoadingTask - * @property {string} docId - Unique identifier for the document loading task. - * @property {boolean} destroyed - Whether the loading task is destroyed or not. - * @property {function} [onPassword] - Callback to request a password if a wrong - * or no password was provided. The callback receives two parameters: a - * function that should be called with the new password, and a reason (see - * {@link PasswordResponses}). - * @property {function} [onProgress] - Callback to be able to monitor the - * loading progress of the PDF file (necessary to implement e.g. a loading - * bar). The callback receives an {@link OnProgressParameters} argument. - * @property {function} [onUnsupportedFeature] - Callback for when an - * unsupported feature is used in the PDF document. The callback receives an - * {@link UNSUPPORTED_FEATURES} argument. - * @property {Promise} promise - Promise for document loading - * task completion. - * @property {function} destroy - Abort all network requests and destroy - * the worker. Returns a promise that is resolved when destruction is - * completed. */ +class PDFDocumentLoadingTask { + static get idCounters() { + return shadow(this, "idCounters", { doc: 0 }); + } -/** - * @type {any} - * @ignore - */ -const PDFDocumentLoadingTask = (function PDFDocumentLoadingTaskClosure() { - let nextDocumentId = 0; + constructor() { + this._capability = createPromiseCapability(); + this._transport = null; + this._worker = null; + + /** + * Unique identifier for the document loading task. + * @type {string} + */ + this.docId = `d${PDFDocumentLoadingTask.idCounters.doc++}`; + + /** + * Whether the loading task is destroyed or not. + * @type {boolean} + */ + this.destroyed = false; + + /** + * Callback to request a password if a wrong or no password was provided. + * The callback receives two parameters: a function that should be called + * with the new password, and a reason (see {@link PasswordResponses}). + * @type {function} + */ + this.onPassword = null; + + /** + * Callback to be able to monitor the loading progress of the PDF file + * (necessary to implement e.g. a loading bar). + * The callback receives an {@link OnProgressParameters} argument. + * @type {function} + */ + this.onProgress = null; + + /** + * Callback for when an unsupported feature is used in the PDF document. + * The callback receives an {@link UNSUPPORTED_FEATURES} argument. + * @type {function} + */ + this.onUnsupportedFeature = null; + } /** - * The loading task controls the operations required to load a PDF document - * (such as network requests) and provides a way to listen for completion, - * after which individual pages can be rendered. + * Promise for document loading task completion. + * @type {Promise} */ - // eslint-disable-next-line no-shadow - class PDFDocumentLoadingTask { - constructor() { - this._capability = createPromiseCapability(); - this._transport = null; - this._worker = null; - - /** - * Unique identifier for the document loading task. - * @type {string} - */ - this.docId = "d" + nextDocumentId++; - - /** - * Whether the loading task is destroyed or not. - * @type {boolean} - */ - this.destroyed = false; - - /** - * Callback to request a password if a wrong or no password was provided. - * The callback receives two parameters: a function that should be called - * with the new password, and a reason (see {@link PasswordResponses}). - * @type {function} - */ - this.onPassword = null; - - /** - * Callback to be able to monitor the loading progress of the PDF file - * (necessary to implement e.g. a loading bar). - * The callback receives an {@link OnProgressParameters} argument. - * @type {function} - */ - this.onProgress = null; - - /** - * Callback for when an unsupported feature is used in the PDF document. - * The callback receives an {@link UNSUPPORTED_FEATURES} argument. - * @type {function} - */ - this.onUnsupportedFeature = null; - } - - /** - * Promise for document loading task completion. - * @type {Promise} - */ - get promise() { - return this._capability.promise; - } - - /** - * @returns {Promise} A promise that is resolved when destruction is - * completed. - */ - destroy() { - this.destroyed = true; - - const transportDestroyed = !this._transport - ? Promise.resolve() - : this._transport.destroy(); - return transportDestroyed.then(() => { - this._transport = null; - if (this._worker) { - this._worker.destroy(); - this._worker = null; - } - }); - } + get promise() { + return this._capability.promise; } - return PDFDocumentLoadingTask; -})(); + + /** + * Abort all network requests and destroy the worker. + * @returns {Promise} A promise that is resolved when destruction is + * completed. + */ + destroy() { + this.destroyed = true; + + const transportDestroyed = !this._transport + ? Promise.resolve() + : this._transport.destroy(); + return transportDestroyed.then(() => { + this._transport = null; + if (this._worker) { + this._worker.destroy(); + this._worker = null; + } + }); + } +} /** * Abstract class to support range requests file loading. diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index 7f4c9d389..55c6844e9 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -385,6 +385,26 @@ describe("api", function () { await loadingTask.destroy(); }); + + it("checks that `docId`s are unique and increasing", async function () { + const loadingTask1 = getDocument(basicApiGetDocumentParams); + await loadingTask1.promise; + const docId1 = loadingTask1.docId; + + const loadingTask2 = getDocument(basicApiGetDocumentParams); + await loadingTask2.promise; + const docId2 = loadingTask2.docId; + + expect(docId1).not.toEqual(docId2); + + const docIdRegExp = /^d(\d)+$/, + docNum1 = docIdRegExp.exec(docId1)?.[1], + docNum2 = docIdRegExp.exec(docId2)?.[1]; + + expect(+docNum1).toBeLessThan(+docNum2); + + await Promise.all([loadingTask1.destroy(), loadingTask2.destroy()]); + }); }); describe("PDFWorker", function () {