mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-20 23:28:06 +02:00
Merge pull request #5263 from yurydelendik/stream
Implement streaming using moz-chunk-arraybuffer
This commit is contained in:
commit
9c56c6f9f6
10 changed files with 282 additions and 85 deletions
|
@ -167,6 +167,21 @@ if (typeof PDFJS === 'undefined') {
|
|||
// The worker will be using XHR, so we can save time and disable worker.
|
||||
PDFJS.disableWorker = true;
|
||||
|
||||
Object.defineProperty(xhrPrototype, 'responseType', {
|
||||
get: function xmlHttpRequestGetResponseType() {
|
||||
return this._responseType || 'text';
|
||||
},
|
||||
set: function xmlHttpRequestSetResponseType(value) {
|
||||
if (value === 'text' || value === 'arraybuffer') {
|
||||
this._responseType = value;
|
||||
if (value === 'arraybuffer' &&
|
||||
typeof this.overrideMimeType === 'function') {
|
||||
this.overrideMimeType('text/plain; charset=x-user-defined');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Support: IE9
|
||||
if (typeof VBArray !== 'undefined') {
|
||||
Object.defineProperty(xhrPrototype, 'response', {
|
||||
|
@ -181,25 +196,20 @@ if (typeof PDFJS === 'undefined') {
|
|||
return;
|
||||
}
|
||||
|
||||
// other browsers
|
||||
function responseTypeSetter() {
|
||||
// will be only called to set "arraybuffer"
|
||||
this.overrideMimeType('text/plain; charset=x-user-defined');
|
||||
}
|
||||
if (typeof xhr.overrideMimeType === 'function') {
|
||||
Object.defineProperty(xhrPrototype, 'responseType',
|
||||
{ set: responseTypeSetter });
|
||||
}
|
||||
function responseGetter() {
|
||||
var text = this.responseText;
|
||||
var i, n = text.length;
|
||||
var result = new Uint8Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
result[i] = text.charCodeAt(i) & 0xFF;
|
||||
Object.defineProperty(xhrPrototype, 'response', {
|
||||
get: function xmlHttpRequestResponseGet() {
|
||||
if (this.responseType !== 'arraybuffer') {
|
||||
return this.responseText;
|
||||
}
|
||||
var text = this.responseText;
|
||||
var i, n = text.length;
|
||||
var result = new Uint8Array(n);
|
||||
for (i = 0; i < n; ++i) {
|
||||
result[i] = text.charCodeAt(i) & 0xFF;
|
||||
}
|
||||
return result.buffer;
|
||||
}
|
||||
return result.buffer;
|
||||
}
|
||||
Object.defineProperty(xhrPrototype, 'response', { get: responseGetter });
|
||||
});
|
||||
})();
|
||||
|
||||
// window.btoa (base64 encode function) ?
|
||||
|
@ -471,6 +481,7 @@ if (typeof PDFJS === 'undefined') {
|
|||
|
||||
if (isSafari || isOldAndroid) {
|
||||
PDFJS.disableRange = true;
|
||||
PDFJS.disableStream = true;
|
||||
}
|
||||
})();
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ var DEFAULT_PREFERENCES = {
|
|||
enableWebGL: false,
|
||||
pdfBugEnabled: false,
|
||||
disableRange: false,
|
||||
disableStream: false,
|
||||
disableAutoFetch: false,
|
||||
disableFontFace: false,
|
||||
//#if B2G
|
||||
|
|
|
@ -516,9 +516,15 @@ var PDFView = {
|
|||
|
||||
//#if (FIREFOX || MOZCENTRAL)
|
||||
initPassiveLoading: function pdfViewInitPassiveLoading() {
|
||||
var pdfDataRangeTransportReadyResolve;
|
||||
var pdfDataRangeTransportReady = new Promise(function (resolve) {
|
||||
pdfDataRangeTransportReadyResolve = resolve;
|
||||
});
|
||||
var pdfDataRangeTransport = {
|
||||
rangeListeners: [],
|
||||
progressListeners: [],
|
||||
progressiveReadListeners: [],
|
||||
ready: pdfDataRangeTransportReady,
|
||||
|
||||
addRangeListener: function PdfDataRangeTransport_addRangeListener(
|
||||
listener) {
|
||||
|
@ -530,6 +536,11 @@ var PDFView = {
|
|||
this.progressListeners.push(listener);
|
||||
},
|
||||
|
||||
addProgressiveReadListener:
|
||||
function PdfDataRangeTransport_addProgressiveReadListener(listener) {
|
||||
this.progressiveReadListeners.push(listener);
|
||||
},
|
||||
|
||||
onDataRange: function PdfDataRangeTransport_onDataRange(begin, chunk) {
|
||||
var listeners = this.rangeListeners;
|
||||
for (var i = 0, n = listeners.length; i < n; ++i) {
|
||||
|
@ -538,10 +549,26 @@ var PDFView = {
|
|||
},
|
||||
|
||||
onDataProgress: function PdfDataRangeTransport_onDataProgress(loaded) {
|
||||
var listeners = this.progressListeners;
|
||||
for (var i = 0, n = listeners.length; i < n; ++i) {
|
||||
listeners[i](loaded);
|
||||
}
|
||||
this.ready.then(function () {
|
||||
var listeners = this.progressListeners;
|
||||
for (var i = 0, n = listeners.length; i < n; ++i) {
|
||||
listeners[i](loaded);
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
onDataProgressiveRead:
|
||||
function PdfDataRangeTransport_onDataProgress(chunk) {
|
||||
this.ready.then(function () {
|
||||
var listeners = this.progressiveReadListeners;
|
||||
for (var i = 0, n = listeners.length; i < n; ++i) {
|
||||
listeners[i](chunk);
|
||||
}
|
||||
}.bind(this));
|
||||
},
|
||||
|
||||
transportReady: function PdfDataRangeTransport_transportReady() {
|
||||
pdfDataRangeTransportReadyResolve();
|
||||
},
|
||||
|
||||
requestDataRange: function PdfDataRangeTransport_requestDataRange(
|
||||
|
@ -574,6 +601,9 @@ var PDFView = {
|
|||
case 'rangeProgress':
|
||||
pdfDataRangeTransport.onDataProgress(args.loaded);
|
||||
break;
|
||||
case 'progressiveRead':
|
||||
pdfDataRangeTransport.onDataProgressiveRead(args.chunk);
|
||||
break;
|
||||
case 'progress':
|
||||
PDFView.progress(args.loaded / args.total);
|
||||
break;
|
||||
|
@ -1787,6 +1817,9 @@ function webViewerInitialized() {
|
|||
if ('disablerange' in hashParams) {
|
||||
PDFJS.disableRange = (hashParams['disablerange'] === 'true');
|
||||
}
|
||||
if ('disablestream' in hashParams) {
|
||||
PDFJS.disableStream = (hashParams['disablestream'] === 'true');
|
||||
}
|
||||
if ('disableautofetch' in hashParams) {
|
||||
PDFJS.disableAutoFetch = (hashParams['disableautofetch'] === 'true');
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue