Skip to content

Commit a081c2d

Browse files
committed
Merge pull request mozilla#3124 from mduan/issue3118-1
Update loading bar during onprogress of range requests
2 parents ea63330 + 91f9948 commit a081c2d

File tree

4 files changed

+56
-8
lines changed

4 files changed

+56
-8
lines changed

extensions/firefox/components/PdfStreamConverter.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,12 @@ var RangedChromeActions = (function RangedChromeActionsClosure() {
479479
begin: args.begin,
480480
chunk: args.chunk
481481
}, '*');
482+
},
483+
onProgress: function RangedChromeActions_onProgress(evt) {
484+
domWindow.postMessage({
485+
pdfjsLoadAction: 'rangeProgress',
486+
loaded: evt.loaded,
487+
}, '*');
482488
}
483489
});
484490
};

src/api.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -561,13 +561,19 @@ var WorkerTransport = (function WorkerTransportClosure() {
561561

562562
var pdfDataRangeTransport = this.pdfDataRangeTransport;
563563
if (pdfDataRangeTransport) {
564-
pdfDataRangeTransport.addListener(function(begin, chunk) {
564+
pdfDataRangeTransport.addRangeListener(function(begin, chunk) {
565565
messageHandler.send('OnDataRange', {
566566
begin: begin,
567567
chunk: chunk
568568
});
569569
});
570570

571+
pdfDataRangeTransport.addProgressListener(function(loaded) {
572+
messageHandler.send('OnDataProgress', {
573+
loaded: loaded
574+
});
575+
});
576+
571577
messageHandler.on('RequestDataRange',
572578
function transportDataRange(data) {
573579
pdfDataRangeTransport.requestDataRange(data.begin, data.end);

src/chunked_stream.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ var ChunkedStream = (function ChunkedStreamClosure() {
194194
var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
195195

196196
function ChunkedStreamManager(length, chunkSize, url, args) {
197+
var self = this;
197198
this.stream = new ChunkedStream(length, chunkSize);
198199
this.length = length;
199200
this.chunkSize = chunkSize;
@@ -203,6 +204,7 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
203204

204205
if (args.chunkedViewerLoading) {
205206
msgHandler.on('OnDataRange', this.onReceiveData.bind(this));
207+
msgHandler.on('OnDataProgress', this.onProgress.bind(this));
206208
this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
207209
msgHandler.send('RequestDataRange', { begin: begin, end: end });
208210
};
@@ -219,10 +221,10 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
219221
getXhr: getXhr,
220222
httpHeaders: args.httpHeaders
221223
});
222-
var self = this;
223224
this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
224225
this.networkManager.requestRange(begin, end, {
225226
onDone: this.onReceiveData.bind(this),
227+
onProgress: this.onProgress.bind(this)
226228
});
227229
};
228230
}
@@ -347,6 +349,15 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
347349
return groupedChunks;
348350
},
349351

352+
onProgress: function ChunkedStreamManager_onProgress(args) {
353+
var bytesLoaded = this.stream.numChunksLoaded * this.chunkSize +
354+
args.loaded;
355+
this.msgHandler.send('DocProgress', {
356+
loaded: bytesLoaded,
357+
total: this.length
358+
});
359+
},
360+
350361
onReceiveData: function ChunkedStreamManager_onReceiveData(args) {
351362
var chunk = args.chunk;
352363
var begin = args.begin;

web/viewer.js

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ var ProgressBar = (function ProgressBarClosure() {
110110

111111
// Initialize heights
112112
this.div.style.height = this.height + this.units;
113+
this.percent = 0;
113114
}
114115

115116
ProgressBar.prototype = {
@@ -942,15 +943,30 @@ var PDFView = {
942943
}
943944

944945
var pdfDataRangeTransport = {
945-
listeners: [],
946+
rangeListeners: [],
947+
progressListeners: [],
946948

947-
addListener: function PdfDataRangeTransport_addListener(listener) {
948-
this.listeners.push(listener);
949+
addRangeListener: function PdfDataRangeTransport_addRangeListener(
950+
listener) {
951+
this.rangeListeners.push(listener);
952+
},
953+
954+
addProgressListener: function PdfDataRangeTransport_addProgressListener(
955+
listener) {
956+
this.progressListeners.push(listener);
949957
},
950958

951959
onDataRange: function PdfDataRangeTransport_onDataRange(begin, chunk) {
952-
for (var i = 0, n = this.listeners.length; i < n; ++i) {
953-
this.listeners[i](begin, chunk);
960+
var listeners = this.rangeListeners;
961+
for (var i = 0, n = listeners.length; i < n; ++i) {
962+
listeners[i](begin, chunk);
963+
}
964+
},
965+
966+
onDataProgress: function PdfDataRangeTransport_onDataProgress(loaded) {
967+
var listeners = this.progressListeners;
968+
for (var i = 0, n = listeners.length; i < n; ++i) {
969+
listeners[i](loaded);
954970
}
955971
},
956972

@@ -974,6 +990,9 @@ var PDFView = {
974990
case 'range':
975991
pdfDataRangeTransport.onDataRange(args.begin, args.chunk);
976992
break;
993+
case 'rangeProgress':
994+
pdfDataRangeTransport.onDataProgress(args.loaded);
995+
break;
977996
case 'progress':
978997
PDFView.progress(args.loaded / args.total);
979998
break;
@@ -1324,7 +1343,13 @@ var PDFView = {
13241343

13251344
progress: function pdfViewProgress(level) {
13261345
var percent = Math.round(level * 100);
1327-
PDFView.loadingBar.percent = percent;
1346+
// When we transition from full request to range requests, it's possible
1347+
// that we discard some of the loaded data. This can cause the loading
1348+
// bar to move backwards. So prevent this by only updating the bar if it
1349+
// increases.
1350+
if (percent > PDFView.loadingBar.percent) {
1351+
PDFView.loadingBar.percent = percent;
1352+
}
13281353
},
13291354

13301355
load: function pdfViewLoad(pdfDocument, scale) {

0 commit comments

Comments
 (0)