1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-26 01:58:06 +02:00

Makes PDF data reading Streams API friendly.

This commit is contained in:
Yury Delendik 2016-02-09 14:55:11 -06:00
parent 8cdb69634f
commit 0d591719d9
8 changed files with 1153 additions and 178 deletions

View file

@ -28,6 +28,8 @@
}(this, function (exports, sharedUtil) {
var MissingDataException = sharedUtil.MissingDataException;
var arrayByteLength = sharedUtil.arrayByteLength;
var arraysToBytes = sharedUtil.arraysToBytes;
var assert = sharedUtil.assert;
var createPromiseCapability = sharedUtil.createPromiseCapability;
var isInt = sharedUtil.isInt;
@ -279,37 +281,16 @@ var ChunkedStream = (function ChunkedStreamClosure() {
var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
function ChunkedStreamManager(length, chunkSize, url, args) {
function ChunkedStreamManager(pdfNetworkStream, args) {
var chunkSize = args.rangeChunkSize;
var length = args.length;
this.stream = new ChunkedStream(length, chunkSize, this);
this.length = length;
this.chunkSize = chunkSize;
this.url = url;
this.pdfNetworkStream = pdfNetworkStream;
this.url = args.url;
this.disableAutoFetch = args.disableAutoFetch;
var msgHandler = this.msgHandler = args.msgHandler;
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 });
};
} else {
var getXhr = function getXhr() {
return new XMLHttpRequest();
};
this.networkManager = new NetworkManager(this.url, {
getXhr: getXhr,
httpHeaders: args.httpHeaders,
withCredentials: args.withCredentials
});
this.sendRequest = function ChunkedStreamManager_sendRequest(begin, end) {
this.networkManager.requestRange(begin, end, {
onDone: this.onReceiveData.bind(this),
onProgress: this.onProgress.bind(this)
});
};
}
this.msgHandler = args.msgHandler;
this.currRequestId = 0;
@ -317,12 +298,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
this.requestsByChunk = Object.create(null);
this.promisesByRequest = Object.create(null);
this.progressiveDataLength = 0;
this.aborted = false;
this._loadedStreamCapability = createPromiseCapability();
if (args.initialData) {
this.onReceiveData({chunk: args.initialData});
}
}
ChunkedStreamManager.prototype = {
@ -330,6 +308,44 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
return this._loadedStreamCapability.promise;
},
sendRequest: function ChunkedStreamManager_sendRequest(begin, end) {
var rangeReader = this.pdfNetworkStream.getRangeReader(begin, end);
if (!rangeReader.isStreamingSupported) {
rangeReader.onProgress = this.onProgress.bind(this);
}
var chunks = [], loaded = 0;
var manager = this;
var promise = new Promise(function (resolve, reject) {
var readChunk = function (chunk) {
try {
if (!chunk.done) {
var data = chunk.value;
chunks.push(data);
loaded += arrayByteLength(data);
if (rangeReader.isStreamingSupported) {
manager.onProgress({loaded: loaded});
}
rangeReader.read().then(readChunk, reject);
return;
}
var chunkData = arraysToBytes(chunks);
chunks = null;
resolve(chunkData);
} catch (e) {
reject(e);
}
};
rangeReader.read().then(readChunk, reject);
});
promise.then(function (data) {
if (this.aborted) {
return; // ignoring any data after abort
}
this.onReceiveData({chunk: data, begin: begin});
}.bind(this));
// TODO check errors
},
// Get all the chunks that are not yet loaded and groups them into
// contiguous ranges to load in as few requests as possible
requestAllChunks: function ChunkedStreamManager_requestAllChunks() {
@ -549,8 +565,9 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
},
abort: function ChunkedStreamManager_abort() {
if (this.networkManager) {
this.networkManager.abortAllRequests();
this.aborted = true;
if (this.pdfNetworkStream) {
this.pdfNetworkStream.cancelAllRequests('abort');
}
for(var requestId in this.promisesByRequest) {
var capability = this.promisesByRequest[requestId];