mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-29 15:47:57 +02:00
Implement streaming using moz-chunk-arraybuffer
This commit is contained in:
parent
477efd52bc
commit
c3f191a27c
10 changed files with 274 additions and 77 deletions
|
@ -178,6 +178,7 @@ function makeContentReadable(obj, window) {
|
|||
function PdfDataListener(length) {
|
||||
this.length = length; // less than 0, if length is unknown
|
||||
this.data = new Uint8Array(length >= 0 ? length : 0x10000);
|
||||
this.position = 0;
|
||||
this.loaded = 0;
|
||||
}
|
||||
|
||||
|
@ -200,6 +201,11 @@ PdfDataListener.prototype = {
|
|||
this.loaded = willBeLoaded;
|
||||
this.onprogress(this.loaded, this.length >= 0 ? this.length : void(0));
|
||||
},
|
||||
readData: function PdfDataListener_readData() {
|
||||
var data = this.data.subarray(this.position, this.loaded);
|
||||
this.position = this.loaded;
|
||||
return data;
|
||||
},
|
||||
getData: function PdfDataListener_getData() {
|
||||
var data = this.data;
|
||||
if (this.loaded != data.length)
|
||||
|
@ -523,11 +529,13 @@ var RangedChromeActions = (function RangedChromeActionsClosure() {
|
|||
*/
|
||||
function RangedChromeActions(
|
||||
domWindow, contentDispositionFilename, originalRequest,
|
||||
dataListener) {
|
||||
rangeEnabled, streamingEnabled, dataListener) {
|
||||
|
||||
ChromeActions.call(this, domWindow, contentDispositionFilename);
|
||||
this.dataListener = dataListener;
|
||||
this.originalRequest = originalRequest;
|
||||
this.rangeEnabled = rangeEnabled;
|
||||
this.streamingEnabled = streamingEnabled;
|
||||
|
||||
this.pdfUrl = originalRequest.URI.spec;
|
||||
this.contentLength = originalRequest.contentLength;
|
||||
|
@ -585,20 +593,46 @@ var RangedChromeActions = (function RangedChromeActionsClosure() {
|
|||
proto.constructor = RangedChromeActions;
|
||||
|
||||
proto.initPassiveLoading = function RangedChromeActions_initPassiveLoading() {
|
||||
this.originalRequest.cancel(Cr.NS_BINDING_ABORTED);
|
||||
this.originalRequest = null;
|
||||
var self = this;
|
||||
var data;
|
||||
if (!this.streamingEnabled) {
|
||||
this.originalRequest.cancel(Cr.NS_BINDING_ABORTED);
|
||||
this.originalRequest = null;
|
||||
data = this.dataListener.getData();
|
||||
this.dataListener = null;
|
||||
} else {
|
||||
data = this.dataListener.readData();
|
||||
|
||||
this.dataListener.onprogress = function (loaded, total) {
|
||||
self.domWindow.postMessage({
|
||||
pdfjsLoadAction: 'progressiveRead',
|
||||
loaded: loaded,
|
||||
total: total,
|
||||
chunk: self.dataListener.readData()
|
||||
}, '*');
|
||||
};
|
||||
this.dataListener.oncomplete = function () {
|
||||
delete self.dataListener;
|
||||
};
|
||||
}
|
||||
|
||||
this.domWindow.postMessage({
|
||||
pdfjsLoadAction: 'supportsRangedLoading',
|
||||
rangeEnabled: this.rangeEnabled,
|
||||
streamingEnabled: this.streamingEnabled,
|
||||
pdfUrl: this.pdfUrl,
|
||||
length: this.contentLength,
|
||||
data: this.dataListener.getData()
|
||||
data: data
|
||||
}, '*');
|
||||
this.dataListener = null;
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
proto.requestDataRange = function RangedChromeActions_requestDataRange(args) {
|
||||
if (!this.rangeEnabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
var begin = args.begin;
|
||||
var end = args.end;
|
||||
var domWindow = this.domWindow;
|
||||
|
@ -840,7 +874,8 @@ PdfStreamConverter.prototype = {
|
|||
} catch (e) {}
|
||||
|
||||
var rangeRequest = false;
|
||||
if (isHttpRequest) {
|
||||
var hash = aRequest.URI.ref;
|
||||
if (isHttpRequest && !getBoolPref(PREF_PREFIX + '.disableRange', false)) {
|
||||
var contentEncoding = 'identity';
|
||||
try {
|
||||
contentEncoding = aRequest.getResponseHeader('Content-Encoding');
|
||||
|
@ -851,12 +886,13 @@ PdfStreamConverter.prototype = {
|
|||
acceptRanges = aRequest.getResponseHeader('Accept-Ranges');
|
||||
} catch (e) {}
|
||||
|
||||
var hash = aRequest.URI.ref;
|
||||
rangeRequest = contentEncoding === 'identity' &&
|
||||
acceptRanges === 'bytes' &&
|
||||
aRequest.contentLength >= 0 &&
|
||||
hash.indexOf('disableRange=true') < 0;
|
||||
hash.toLowerCase().indexOf('disablerange=true') < 0;
|
||||
}
|
||||
var streamRequest = !getBoolPref(PREF_PREFIX + '.disableStream', false) &&
|
||||
hash.toLowerCase().indexOf('disablestream=true') < 0;
|
||||
|
||||
aRequest.QueryInterface(Ci.nsIChannel);
|
||||
|
||||
|
@ -914,12 +950,13 @@ PdfStreamConverter.prototype = {
|
|||
// may have changed during a redirect.
|
||||
var domWindow = getDOMWindow(channel);
|
||||
var actions;
|
||||
if (rangeRequest) {
|
||||
if (rangeRequest || streamRequest) {
|
||||
actions = new RangedChromeActions(
|
||||
domWindow, contentDispositionFilename, aRequest, dataListener);
|
||||
domWindow, contentDispositionFilename, aRequest,
|
||||
rangeRequest, streamRequest, dataListener);
|
||||
} else {
|
||||
actions = new StandardChromeActions(
|
||||
domWindow, contentDispositionFilename, dataListener);
|
||||
domWindow, contentDispositionFilename, dataListener);
|
||||
}
|
||||
var requestListener = new RequestListener(actions);
|
||||
domWindow.addEventListener(PDFJS_EVENT_ID, function(event) {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue