|
|
@ -178,6 +178,7 @@ function makeContentReadable(obj, window) { |
|
|
|
function PdfDataListener(length) { |
|
|
|
function PdfDataListener(length) { |
|
|
|
this.length = length; // less than 0, if length is unknown
|
|
|
|
this.length = length; // less than 0, if length is unknown
|
|
|
|
this.data = new Uint8Array(length >= 0 ? length : 0x10000); |
|
|
|
this.data = new Uint8Array(length >= 0 ? length : 0x10000); |
|
|
|
|
|
|
|
this.position = 0; |
|
|
|
this.loaded = 0; |
|
|
|
this.loaded = 0; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -200,6 +201,11 @@ PdfDataListener.prototype = { |
|
|
|
this.loaded = willBeLoaded; |
|
|
|
this.loaded = willBeLoaded; |
|
|
|
this.onprogress(this.loaded, this.length >= 0 ? this.length : void(0)); |
|
|
|
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() { |
|
|
|
getData: function PdfDataListener_getData() { |
|
|
|
var data = this.data; |
|
|
|
var data = this.data; |
|
|
|
if (this.loaded != data.length) |
|
|
|
if (this.loaded != data.length) |
|
|
@ -523,11 +529,13 @@ var RangedChromeActions = (function RangedChromeActionsClosure() { |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
function RangedChromeActions( |
|
|
|
function RangedChromeActions( |
|
|
|
domWindow, contentDispositionFilename, originalRequest, |
|
|
|
domWindow, contentDispositionFilename, originalRequest, |
|
|
|
dataListener) { |
|
|
|
rangeEnabled, streamingEnabled, dataListener) { |
|
|
|
|
|
|
|
|
|
|
|
ChromeActions.call(this, domWindow, contentDispositionFilename); |
|
|
|
ChromeActions.call(this, domWindow, contentDispositionFilename); |
|
|
|
this.dataListener = dataListener; |
|
|
|
this.dataListener = dataListener; |
|
|
|
this.originalRequest = originalRequest; |
|
|
|
this.originalRequest = originalRequest; |
|
|
|
|
|
|
|
this.rangeEnabled = rangeEnabled; |
|
|
|
|
|
|
|
this.streamingEnabled = streamingEnabled; |
|
|
|
|
|
|
|
|
|
|
|
this.pdfUrl = originalRequest.URI.spec; |
|
|
|
this.pdfUrl = originalRequest.URI.spec; |
|
|
|
this.contentLength = originalRequest.contentLength; |
|
|
|
this.contentLength = originalRequest.contentLength; |
|
|
@ -585,20 +593,46 @@ var RangedChromeActions = (function RangedChromeActionsClosure() { |
|
|
|
proto.constructor = RangedChromeActions; |
|
|
|
proto.constructor = RangedChromeActions; |
|
|
|
|
|
|
|
|
|
|
|
proto.initPassiveLoading = function RangedChromeActions_initPassiveLoading() { |
|
|
|
proto.initPassiveLoading = function RangedChromeActions_initPassiveLoading() { |
|
|
|
this.originalRequest.cancel(Cr.NS_BINDING_ABORTED); |
|
|
|
var self = this; |
|
|
|
this.originalRequest = null; |
|
|
|
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({ |
|
|
|
this.domWindow.postMessage({ |
|
|
|
pdfjsLoadAction: 'supportsRangedLoading', |
|
|
|
pdfjsLoadAction: 'supportsRangedLoading', |
|
|
|
|
|
|
|
rangeEnabled: this.rangeEnabled, |
|
|
|
|
|
|
|
streamingEnabled: this.streamingEnabled, |
|
|
|
pdfUrl: this.pdfUrl, |
|
|
|
pdfUrl: this.pdfUrl, |
|
|
|
length: this.contentLength, |
|
|
|
length: this.contentLength, |
|
|
|
data: this.dataListener.getData() |
|
|
|
data: data |
|
|
|
}, '*'); |
|
|
|
}, '*'); |
|
|
|
this.dataListener = null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
|
}; |
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
proto.requestDataRange = function RangedChromeActions_requestDataRange(args) { |
|
|
|
proto.requestDataRange = function RangedChromeActions_requestDataRange(args) { |
|
|
|
|
|
|
|
if (!this.rangeEnabled) { |
|
|
|
|
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
var begin = args.begin; |
|
|
|
var begin = args.begin; |
|
|
|
var end = args.end; |
|
|
|
var end = args.end; |
|
|
|
var domWindow = this.domWindow; |
|
|
|
var domWindow = this.domWindow; |
|
|
@ -840,7 +874,8 @@ PdfStreamConverter.prototype = { |
|
|
|
} catch (e) {} |
|
|
|
} catch (e) {} |
|
|
|
|
|
|
|
|
|
|
|
var rangeRequest = false; |
|
|
|
var rangeRequest = false; |
|
|
|
if (isHttpRequest) { |
|
|
|
var hash = aRequest.URI.ref; |
|
|
|
|
|
|
|
if (isHttpRequest && !getBoolPref(PREF_PREFIX + '.disableRange', false)) { |
|
|
|
var contentEncoding = 'identity'; |
|
|
|
var contentEncoding = 'identity'; |
|
|
|
try { |
|
|
|
try { |
|
|
|
contentEncoding = aRequest.getResponseHeader('Content-Encoding'); |
|
|
|
contentEncoding = aRequest.getResponseHeader('Content-Encoding'); |
|
|
@ -851,12 +886,13 @@ PdfStreamConverter.prototype = { |
|
|
|
acceptRanges = aRequest.getResponseHeader('Accept-Ranges'); |
|
|
|
acceptRanges = aRequest.getResponseHeader('Accept-Ranges'); |
|
|
|
} catch (e) {} |
|
|
|
} catch (e) {} |
|
|
|
|
|
|
|
|
|
|
|
var hash = aRequest.URI.ref; |
|
|
|
|
|
|
|
rangeRequest = contentEncoding === 'identity' && |
|
|
|
rangeRequest = contentEncoding === 'identity' && |
|
|
|
acceptRanges === 'bytes' && |
|
|
|
acceptRanges === 'bytes' && |
|
|
|
aRequest.contentLength >= 0 && |
|
|
|
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); |
|
|
|
aRequest.QueryInterface(Ci.nsIChannel); |
|
|
|
|
|
|
|
|
|
|
@ -914,12 +950,13 @@ PdfStreamConverter.prototype = { |
|
|
|
// may have changed during a redirect.
|
|
|
|
// may have changed during a redirect.
|
|
|
|
var domWindow = getDOMWindow(channel); |
|
|
|
var domWindow = getDOMWindow(channel); |
|
|
|
var actions; |
|
|
|
var actions; |
|
|
|
if (rangeRequest) { |
|
|
|
if (rangeRequest || streamRequest) { |
|
|
|
actions = new RangedChromeActions( |
|
|
|
actions = new RangedChromeActions( |
|
|
|
domWindow, contentDispositionFilename, aRequest, dataListener); |
|
|
|
domWindow, contentDispositionFilename, aRequest, |
|
|
|
|
|
|
|
rangeRequest, streamRequest, dataListener); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
actions = new StandardChromeActions( |
|
|
|
actions = new StandardChromeActions( |
|
|
|
domWindow, contentDispositionFilename, dataListener); |
|
|
|
domWindow, contentDispositionFilename, dataListener); |
|
|
|
} |
|
|
|
} |
|
|
|
var requestListener = new RequestListener(actions); |
|
|
|
var requestListener = new RequestListener(actions); |
|
|
|
domWindow.addEventListener(PDFJS_EVENT_ID, function(event) { |
|
|
|
domWindow.addEventListener(PDFJS_EVENT_ID, function(event) { |
|
|
|