diff --git a/src/display/api.js b/src/display/api.js index af6831942..deaf7d4af 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -1763,12 +1763,9 @@ class WorkerTransport { fullReader.headersReady.then(() => { // If stream or range are disabled, it's our only way to report // loading progress. - if (!fullReader.isStreamingSupported || - !fullReader.isRangeSupported) { - if (this._lastProgress) { - if (loadingTask.onProgress) { - loadingTask.onProgress(this._lastProgress); - } + if (!fullReader.isStreamingSupported || !fullReader.isRangeSupported) { + if (this._lastProgress && loadingTask.onProgress) { + loadingTask.onProgress(this._lastProgress); } fullReader.onProgress = (evt) => { if (loadingTask.onProgress) { @@ -1866,6 +1863,14 @@ class WorkerTransport { }, this); messageHandler.on('DataLoaded', function(data) { + // For consistency: Ensure that progress is always reported when the + // entire PDF file has been loaded, regardless of how it was fetched. + if (loadingTask.onProgress) { + loadingTask.onProgress({ + loaded: data.length, + total: data.length, + }); + } this.downloadInfoCapability.resolve(data); }, this); diff --git a/test/unit/api_spec.js b/test/unit/api_spec.js index ebdc3d6d5..42a287263 100644 --- a/test/unit/api_spec.js +++ b/test/unit/api_spec.js @@ -142,9 +142,20 @@ describe('api', function() { // Sanity check to make sure that we fetched the entire PDF file. expect(typedArrayPdf.length).toEqual(basicApiFileLength); - var loadingTask = getDocument(typedArrayPdf); - loadingTask.promise.then(function(data) { - expect(data instanceof PDFDocumentProxy).toEqual(true); + const loadingTask = getDocument(typedArrayPdf); + + const progressReportedCapability = createPromiseCapability(); + loadingTask.onProgress = function(data) { + progressReportedCapability.resolve(data); + }; + + Promise.all([ + loadingTask.promise, + progressReportedCapability.promise, + ]).then(function(data) { + expect(data[0] instanceof PDFDocumentProxy).toEqual(true); + expect(data[1].loaded / data[1].total).toEqual(1); + loadingTask.destroy().then(done); }).catch(done.fail); });