From c5084d9e8a33f533c4a3fac86fcbe34187e3c00b Mon Sep 17 00:00:00 2001 From: Mack Duan Date: Fri, 19 Apr 2013 13:53:22 -0700 Subject: [PATCH 1/2] Update loading bar during onprogress of range requests --- .../firefox/components/PdfStreamConverter.js | 6 ++++ src/api.js | 8 +++++- src/chunked_stream.js | 13 ++++++++- web/viewer.js | 28 +++++++++++++++---- 4 files changed, 48 insertions(+), 7 deletions(-) diff --git a/extensions/firefox/components/PdfStreamConverter.js b/extensions/firefox/components/PdfStreamConverter.js index 71c4d897b..679c0c15b 100644 --- a/extensions/firefox/components/PdfStreamConverter.js +++ b/extensions/firefox/components/PdfStreamConverter.js @@ -479,6 +479,12 @@ var RangedChromeActions = (function RangedChromeActionsClosure() { begin: args.begin, chunk: args.chunk }, '*'); + }, + onProgress: function RangedChromeActions_onProgress(evt) { + domWindow.postMessage({ + pdfjsLoadAction: 'rangeProgress', + loaded: evt.loaded, + }, '*'); } }); }; diff --git a/src/api.js b/src/api.js index e1ec31470..fee48671a 100644 --- a/src/api.js +++ b/src/api.js @@ -561,13 +561,19 @@ var WorkerTransport = (function WorkerTransportClosure() { var pdfDataRangeTransport = this.pdfDataRangeTransport; if (pdfDataRangeTransport) { - pdfDataRangeTransport.addListener(function(begin, chunk) { + pdfDataRangeTransport.addRangeListener(function(begin, chunk) { messageHandler.send('OnDataRange', { begin: begin, chunk: chunk }); }); + pdfDataRangeTransport.addProgressListener(function(loaded) { + messageHandler.send('OnDataProgress', { + loaded: loaded + }); + }); + messageHandler.on('RequestDataRange', function transportDataRange(data) { pdfDataRangeTransport.requestDataRange(data.begin, data.end); diff --git a/src/chunked_stream.js b/src/chunked_stream.js index fe8388aa1..671190bfd 100644 --- a/src/chunked_stream.js +++ b/src/chunked_stream.js @@ -194,6 +194,7 @@ var ChunkedStream = (function ChunkedStreamClosure() { var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { function ChunkedStreamManager(length, chunkSize, url, args) { + var self = this; this.stream = new ChunkedStream(length, chunkSize); this.length = length; this.chunkSize = chunkSize; @@ -203,6 +204,7 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { if (args.chunkedViewerLoading) { msgHandler.on('OnDataRange', this.onReceiveData.bind(this)); + msgHandler.on('OnDataProgress', this.onProgress.bind(this)); this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) { msgHandler.send('RequestDataRange', { begin: begin, end: end }); }; @@ -219,10 +221,10 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { getXhr: getXhr, httpHeaders: args.httpHeaders }); - var self = this; this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) { this.networkManager.requestRange(begin, end, { onDone: this.onReceiveData.bind(this), + onProgress: this.onProgress.bind(this) }); }; } @@ -347,6 +349,15 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() { return groupedChunks; }, + onProgress: function ChunkedStreamManager_onProgress(args) { + var bytesLoaded = this.stream.numChunksLoaded * this.chunkSize + + args.loaded; + this.msgHandler.send('DocProgress', { + loaded: bytesLoaded, + total: this.length + }); + }, + onReceiveData: function ChunkedStreamManager_onReceiveData(args) { var chunk = args.chunk; var begin = args.begin; diff --git a/web/viewer.js b/web/viewer.js index 034f299f3..ab743cd22 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -941,15 +941,30 @@ var PDFView = { } var pdfDataRangeTransport = { - listeners: [], + rangeListeners: [], + progressListeners: [], - addListener: function PdfDataRangeTransport_addListener(listener) { - this.listeners.push(listener); + addRangeListener: function PdfDataRangeTransport_addRangeListener( + listener) { + this.rangeListeners.push(listener); + }, + + addProgressListener: function PdfDataRangeTransport_addProgressListener( + listener) { + this.progressListeners.push(listener); }, onDataRange: function PdfDataRangeTransport_onDataRange(begin, chunk) { - for (var i = 0, n = this.listeners.length; i < n; ++i) { - this.listeners[i](begin, chunk); + var listeners = this.rangeListeners; + for (var i = 0, n = listeners.length; i < n; ++i) { + listeners[i](begin, chunk); + } + }, + + onDataProgress: function PdfDataRangeTransport_onDataProgress(loaded) { + var listeners = this.progressListeners; + for (var i = 0, n = listeners.length; i < n; ++i) { + listeners[i](loaded); } }, @@ -973,6 +988,9 @@ var PDFView = { case 'range': pdfDataRangeTransport.onDataRange(args.begin, args.chunk); break; + case 'rangeProgress': + pdfDataRangeTransport.onDataProgress(args.loaded); + break; case 'progress': PDFView.progress(args.loaded / args.total); break; From 91f9948df425cfd5d63266b51901568a549a2145 Mon Sep 17 00:00:00 2001 From: Mack Duan Date: Tue, 23 Apr 2013 10:00:31 -0700 Subject: [PATCH 2/2] Only update progress bar if it increases --- web/viewer.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/web/viewer.js b/web/viewer.js index ab743cd22..51857a672 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -110,6 +110,7 @@ var ProgressBar = (function ProgressBarClosure() { // Initialize heights this.div.style.height = this.height + this.units; + this.percent = 0; } ProgressBar.prototype = { @@ -1333,7 +1334,13 @@ var PDFView = { progress: function pdfViewProgress(level) { var percent = Math.round(level * 100); - PDFView.loadingBar.percent = percent; + // When we transition from full request to range requests, it's possible + // that we discard some of the loaded data. This can cause the loading + // bar to move backwards. So prevent this by only updating the bar if it + // increases. + if (percent > PDFView.loadingBar.percent) { + PDFView.loadingBar.percent = percent; + } }, load: function pdfViewLoad(pdfDocument, scale) {