| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500 | 
							- /**
 
-  * @licstart The following is the entire license notice for the
 
-  * Javascript code in this page
 
-  *
 
-  * Copyright 2017 Mozilla Foundation
 
-  *
 
-  * Licensed under the Apache License, Version 2.0 (the "License");
 
-  * you may not use this file except in compliance with the License.
 
-  * You may obtain a copy of the License at
 
-  *
 
-  *     http://www.apache.org/licenses/LICENSE-2.0
 
-  *
 
-  * Unless required by applicable law or agreed to in writing, software
 
-  * distributed under the License is distributed on an "AS IS" BASIS,
 
-  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
-  * See the License for the specific language governing permissions and
 
-  * limitations under the License.
 
-  *
 
-  * @licend The above is the entire license notice for the
 
-  * Javascript code in this page
 
-  */
 
- 'use strict';
 
- Object.defineProperty(exports, "__esModule", {
 
-   value: true
 
- });
 
- exports.NetworkManager = exports.PDFNetworkStream = undefined;
 
- var _util = require('../shared/util');
 
- var _network_utils = require('./network_utils');
 
- var _global_scope = require('../shared/global_scope');
 
- var _global_scope2 = _interopRequireDefault(_global_scope);
 
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
 
- ;
 
- var OK_RESPONSE = 200;
 
- var PARTIAL_CONTENT_RESPONSE = 206;
 
- function NetworkManager(url, args) {
 
-   this.url = url;
 
-   args = args || {};
 
-   this.isHttp = /^https?:/i.test(url);
 
-   this.httpHeaders = this.isHttp && args.httpHeaders || {};
 
-   this.withCredentials = args.withCredentials || false;
 
-   this.getXhr = args.getXhr || function NetworkManager_getXhr() {
 
-     return new XMLHttpRequest();
 
-   };
 
-   this.currXhrId = 0;
 
-   this.pendingRequests = Object.create(null);
 
-   this.loadedRequests = Object.create(null);
 
- }
 
- function getArrayBuffer(xhr) {
 
-   var data = xhr.response;
 
-   if (typeof data !== 'string') {
 
-     return data;
 
-   }
 
-   var array = (0, _util.stringToBytes)(data);
 
-   return array.buffer;
 
- }
 
- var supportsMozChunked = function supportsMozChunkedClosure() {
 
-   try {
 
-     var x = new XMLHttpRequest();
 
-     x.open('GET', _global_scope2.default.location.href);
 
-     x.responseType = 'moz-chunked-arraybuffer';
 
-     return x.responseType === 'moz-chunked-arraybuffer';
 
-   } catch (e) {
 
-     return false;
 
-   }
 
- }();
 
- NetworkManager.prototype = {
 
-   requestRange: function NetworkManager_requestRange(begin, end, listeners) {
 
-     var args = {
 
-       begin: begin,
 
-       end: end
 
-     };
 
-     for (var prop in listeners) {
 
-       args[prop] = listeners[prop];
 
-     }
 
-     return this.request(args);
 
-   },
 
-   requestFull: function NetworkManager_requestFull(listeners) {
 
-     return this.request(listeners);
 
-   },
 
-   request: function NetworkManager_request(args) {
 
-     var xhr = this.getXhr();
 
-     var xhrId = this.currXhrId++;
 
-     var pendingRequest = this.pendingRequests[xhrId] = { xhr: xhr };
 
-     xhr.open('GET', this.url);
 
-     xhr.withCredentials = this.withCredentials;
 
-     for (var property in this.httpHeaders) {
 
-       var value = this.httpHeaders[property];
 
-       if (typeof value === 'undefined') {
 
-         continue;
 
-       }
 
-       xhr.setRequestHeader(property, value);
 
-     }
 
-     if (this.isHttp && 'begin' in args && 'end' in args) {
 
-       var rangeStr = args.begin + '-' + (args.end - 1);
 
-       xhr.setRequestHeader('Range', 'bytes=' + rangeStr);
 
-       pendingRequest.expectedStatus = 206;
 
-     } else {
 
-       pendingRequest.expectedStatus = 200;
 
-     }
 
-     var useMozChunkedLoading = supportsMozChunked && !!args.onProgressiveData;
 
-     if (useMozChunkedLoading) {
 
-       xhr.responseType = 'moz-chunked-arraybuffer';
 
-       pendingRequest.onProgressiveData = args.onProgressiveData;
 
-       pendingRequest.mozChunked = true;
 
-     } else {
 
-       xhr.responseType = 'arraybuffer';
 
-     }
 
-     if (args.onError) {
 
-       xhr.onerror = function (evt) {
 
-         args.onError(xhr.status);
 
-       };
 
-     }
 
-     xhr.onreadystatechange = this.onStateChange.bind(this, xhrId);
 
-     xhr.onprogress = this.onProgress.bind(this, xhrId);
 
-     pendingRequest.onHeadersReceived = args.onHeadersReceived;
 
-     pendingRequest.onDone = args.onDone;
 
-     pendingRequest.onError = args.onError;
 
-     pendingRequest.onProgress = args.onProgress;
 
-     xhr.send(null);
 
-     return xhrId;
 
-   },
 
-   onProgress: function NetworkManager_onProgress(xhrId, evt) {
 
-     var pendingRequest = this.pendingRequests[xhrId];
 
-     if (!pendingRequest) {
 
-       return;
 
-     }
 
-     if (pendingRequest.mozChunked) {
 
-       var chunk = getArrayBuffer(pendingRequest.xhr);
 
-       pendingRequest.onProgressiveData(chunk);
 
-     }
 
-     var onProgress = pendingRequest.onProgress;
 
-     if (onProgress) {
 
-       onProgress(evt);
 
-     }
 
-   },
 
-   onStateChange: function NetworkManager_onStateChange(xhrId, evt) {
 
-     var pendingRequest = this.pendingRequests[xhrId];
 
-     if (!pendingRequest) {
 
-       return;
 
-     }
 
-     var xhr = pendingRequest.xhr;
 
-     if (xhr.readyState >= 2 && pendingRequest.onHeadersReceived) {
 
-       pendingRequest.onHeadersReceived();
 
-       delete pendingRequest.onHeadersReceived;
 
-     }
 
-     if (xhr.readyState !== 4) {
 
-       return;
 
-     }
 
-     if (!(xhrId in this.pendingRequests)) {
 
-       return;
 
-     }
 
-     delete this.pendingRequests[xhrId];
 
-     if (xhr.status === 0 && this.isHttp) {
 
-       if (pendingRequest.onError) {
 
-         pendingRequest.onError(xhr.status);
 
-       }
 
-       return;
 
-     }
 
-     var xhrStatus = xhr.status || OK_RESPONSE;
 
-     var ok_response_on_range_request = xhrStatus === OK_RESPONSE && pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
 
-     if (!ok_response_on_range_request && xhrStatus !== pendingRequest.expectedStatus) {
 
-       if (pendingRequest.onError) {
 
-         pendingRequest.onError(xhr.status);
 
-       }
 
-       return;
 
-     }
 
-     this.loadedRequests[xhrId] = true;
 
-     var chunk = getArrayBuffer(xhr);
 
-     if (xhrStatus === PARTIAL_CONTENT_RESPONSE) {
 
-       var rangeHeader = xhr.getResponseHeader('Content-Range');
 
-       var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
 
-       var begin = parseInt(matches[1], 10);
 
-       pendingRequest.onDone({
 
-         begin: begin,
 
-         chunk: chunk
 
-       });
 
-     } else if (pendingRequest.onProgressiveData) {
 
-       pendingRequest.onDone(null);
 
-     } else if (chunk) {
 
-       pendingRequest.onDone({
 
-         begin: 0,
 
-         chunk: chunk
 
-       });
 
-     } else if (pendingRequest.onError) {
 
-       pendingRequest.onError(xhr.status);
 
-     }
 
-   },
 
-   hasPendingRequests: function NetworkManager_hasPendingRequests() {
 
-     for (var xhrId in this.pendingRequests) {
 
-       return true;
 
-     }
 
-     return false;
 
-   },
 
-   getRequestXhr: function NetworkManager_getXhr(xhrId) {
 
-     return this.pendingRequests[xhrId].xhr;
 
-   },
 
-   isStreamingRequest: function NetworkManager_isStreamingRequest(xhrId) {
 
-     return !!this.pendingRequests[xhrId].onProgressiveData;
 
-   },
 
-   isPendingRequest: function NetworkManager_isPendingRequest(xhrId) {
 
-     return xhrId in this.pendingRequests;
 
-   },
 
-   isLoadedRequest: function NetworkManager_isLoadedRequest(xhrId) {
 
-     return xhrId in this.loadedRequests;
 
-   },
 
-   abortAllRequests: function NetworkManager_abortAllRequests() {
 
-     for (var xhrId in this.pendingRequests) {
 
-       this.abortRequest(xhrId | 0);
 
-     }
 
-   },
 
-   abortRequest: function NetworkManager_abortRequest(xhrId) {
 
-     var xhr = this.pendingRequests[xhrId].xhr;
 
-     delete this.pendingRequests[xhrId];
 
-     xhr.abort();
 
-   }
 
- };
 
- function PDFNetworkStream(source) {
 
-   this._source = source;
 
-   this._manager = new NetworkManager(source.url, {
 
-     httpHeaders: source.httpHeaders,
 
-     withCredentials: source.withCredentials
 
-   });
 
-   this._rangeChunkSize = source.rangeChunkSize;
 
-   this._fullRequestReader = null;
 
-   this._rangeRequestReaders = [];
 
- }
 
- PDFNetworkStream.prototype = {
 
-   _onRangeRequestReaderClosed: function PDFNetworkStream_onRangeRequestReaderClosed(reader) {
 
-     var i = this._rangeRequestReaders.indexOf(reader);
 
-     if (i >= 0) {
 
-       this._rangeRequestReaders.splice(i, 1);
 
-     }
 
-   },
 
-   getFullReader: function PDFNetworkStream_getFullReader() {
 
-     (0, _util.assert)(!this._fullRequestReader);
 
-     this._fullRequestReader = new PDFNetworkStreamFullRequestReader(this._manager, this._source);
 
-     return this._fullRequestReader;
 
-   },
 
-   getRangeReader: function PDFNetworkStream_getRangeReader(begin, end) {
 
-     var reader = new PDFNetworkStreamRangeRequestReader(this._manager, begin, end);
 
-     reader.onClosed = this._onRangeRequestReaderClosed.bind(this);
 
-     this._rangeRequestReaders.push(reader);
 
-     return reader;
 
-   },
 
-   cancelAllRequests: function PDFNetworkStream_cancelAllRequests(reason) {
 
-     if (this._fullRequestReader) {
 
-       this._fullRequestReader.cancel(reason);
 
-     }
 
-     var readers = this._rangeRequestReaders.slice(0);
 
-     readers.forEach(function (reader) {
 
-       reader.cancel(reason);
 
-     });
 
-   }
 
- };
 
- function PDFNetworkStreamFullRequestReader(manager, source) {
 
-   this._manager = manager;
 
-   var args = {
 
-     onHeadersReceived: this._onHeadersReceived.bind(this),
 
-     onProgressiveData: source.disableStream ? null : this._onProgressiveData.bind(this),
 
-     onDone: this._onDone.bind(this),
 
-     onError: this._onError.bind(this),
 
-     onProgress: this._onProgress.bind(this)
 
-   };
 
-   this._url = source.url;
 
-   this._fullRequestId = manager.requestFull(args);
 
-   this._headersReceivedCapability = (0, _util.createPromiseCapability)();
 
-   this._disableRange = source.disableRange || false;
 
-   this._contentLength = source.length;
 
-   this._rangeChunkSize = source.rangeChunkSize;
 
-   if (!this._rangeChunkSize && !this._disableRange) {
 
-     this._disableRange = true;
 
-   }
 
-   this._isStreamingSupported = false;
 
-   this._isRangeSupported = false;
 
-   this._cachedChunks = [];
 
-   this._requests = [];
 
-   this._done = false;
 
-   this._storedError = undefined;
 
-   this._filename = null;
 
-   this.onProgress = null;
 
- }
 
- PDFNetworkStreamFullRequestReader.prototype = {
 
-   _onHeadersReceived: function PDFNetworkStreamFullRequestReader_onHeadersReceived() {
 
-     var fullRequestXhrId = this._fullRequestId;
 
-     var fullRequestXhr = this._manager.getRequestXhr(fullRequestXhrId);
 
-     var getResponseHeader = function getResponseHeader(name) {
 
-       return fullRequestXhr.getResponseHeader(name);
 
-     };
 
-     var _validateRangeRequest = (0, _network_utils.validateRangeRequestCapabilities)({
 
-       getResponseHeader: getResponseHeader,
 
-       isHttp: this._manager.isHttp,
 
-       rangeChunkSize: this._rangeChunkSize,
 
-       disableRange: this._disableRange
 
-     }),
 
-         allowRangeRequests = _validateRangeRequest.allowRangeRequests,
 
-         suggestedLength = _validateRangeRequest.suggestedLength;
 
-     if (allowRangeRequests) {
 
-       this._isRangeSupported = true;
 
-     }
 
-     this._contentLength = suggestedLength || this._contentLength;
 
-     this._filename = (0, _network_utils.extractFilenameFromHeader)(getResponseHeader);
 
-     var networkManager = this._manager;
 
-     if (networkManager.isStreamingRequest(fullRequestXhrId)) {
 
-       this._isStreamingSupported = true;
 
-     } else if (this._isRangeSupported) {
 
-       networkManager.abortRequest(fullRequestXhrId);
 
-     }
 
-     this._headersReceivedCapability.resolve();
 
-   },
 
-   _onProgressiveData: function PDFNetworkStreamFullRequestReader_onProgressiveData(chunk) {
 
-     if (this._requests.length > 0) {
 
-       var requestCapability = this._requests.shift();
 
-       requestCapability.resolve({
 
-         value: chunk,
 
-         done: false
 
-       });
 
-     } else {
 
-       this._cachedChunks.push(chunk);
 
-     }
 
-   },
 
-   _onDone: function PDFNetworkStreamFullRequestReader_onDone(args) {
 
-     if (args) {
 
-       this._onProgressiveData(args.chunk);
 
-     }
 
-     this._done = true;
 
-     if (this._cachedChunks.length > 0) {
 
-       return;
 
-     }
 
-     this._requests.forEach(function (requestCapability) {
 
-       requestCapability.resolve({
 
-         value: undefined,
 
-         done: true
 
-       });
 
-     });
 
-     this._requests = [];
 
-   },
 
-   _onError: function PDFNetworkStreamFullRequestReader_onError(status) {
 
-     var url = this._url;
 
-     var exception = (0, _network_utils.createResponseStatusError)(status, url);
 
-     this._storedError = exception;
 
-     this._headersReceivedCapability.reject(exception);
 
-     this._requests.forEach(function (requestCapability) {
 
-       requestCapability.reject(exception);
 
-     });
 
-     this._requests = [];
 
-     this._cachedChunks = [];
 
-   },
 
-   _onProgress: function PDFNetworkStreamFullRequestReader_onProgress(data) {
 
-     if (this.onProgress) {
 
-       this.onProgress({
 
-         loaded: data.loaded,
 
-         total: data.lengthComputable ? data.total : this._contentLength
 
-       });
 
-     }
 
-   },
 
-   get filename() {
 
-     return this._filename;
 
-   },
 
-   get isRangeSupported() {
 
-     return this._isRangeSupported;
 
-   },
 
-   get isStreamingSupported() {
 
-     return this._isStreamingSupported;
 
-   },
 
-   get contentLength() {
 
-     return this._contentLength;
 
-   },
 
-   get headersReady() {
 
-     return this._headersReceivedCapability.promise;
 
-   },
 
-   read: function PDFNetworkStreamFullRequestReader_read() {
 
-     if (this._storedError) {
 
-       return Promise.reject(this._storedError);
 
-     }
 
-     if (this._cachedChunks.length > 0) {
 
-       var chunk = this._cachedChunks.shift();
 
-       return Promise.resolve({
 
-         value: chunk,
 
-         done: false
 
-       });
 
-     }
 
-     if (this._done) {
 
-       return Promise.resolve({
 
-         value: undefined,
 
-         done: true
 
-       });
 
-     }
 
-     var requestCapability = (0, _util.createPromiseCapability)();
 
-     this._requests.push(requestCapability);
 
-     return requestCapability.promise;
 
-   },
 
-   cancel: function PDFNetworkStreamFullRequestReader_cancel(reason) {
 
-     this._done = true;
 
-     this._headersReceivedCapability.reject(reason);
 
-     this._requests.forEach(function (requestCapability) {
 
-       requestCapability.resolve({
 
-         value: undefined,
 
-         done: true
 
-       });
 
-     });
 
-     this._requests = [];
 
-     if (this._manager.isPendingRequest(this._fullRequestId)) {
 
-       this._manager.abortRequest(this._fullRequestId);
 
-     }
 
-     this._fullRequestReader = null;
 
-   }
 
- };
 
- function PDFNetworkStreamRangeRequestReader(manager, begin, end) {
 
-   this._manager = manager;
 
-   var args = {
 
-     onDone: this._onDone.bind(this),
 
-     onProgress: this._onProgress.bind(this)
 
-   };
 
-   this._requestId = manager.requestRange(begin, end, args);
 
-   this._requests = [];
 
-   this._queuedChunk = null;
 
-   this._done = false;
 
-   this.onProgress = null;
 
-   this.onClosed = null;
 
- }
 
- PDFNetworkStreamRangeRequestReader.prototype = {
 
-   _close: function PDFNetworkStreamRangeRequestReader_close() {
 
-     if (this.onClosed) {
 
-       this.onClosed(this);
 
-     }
 
-   },
 
-   _onDone: function PDFNetworkStreamRangeRequestReader_onDone(data) {
 
-     var chunk = data.chunk;
 
-     if (this._requests.length > 0) {
 
-       var requestCapability = this._requests.shift();
 
-       requestCapability.resolve({
 
-         value: chunk,
 
-         done: false
 
-       });
 
-     } else {
 
-       this._queuedChunk = chunk;
 
-     }
 
-     this._done = true;
 
-     this._requests.forEach(function (requestCapability) {
 
-       requestCapability.resolve({
 
-         value: undefined,
 
-         done: true
 
-       });
 
-     });
 
-     this._requests = [];
 
-     this._close();
 
-   },
 
-   _onProgress: function PDFNetworkStreamRangeRequestReader_onProgress(evt) {
 
-     if (!this.isStreamingSupported && this.onProgress) {
 
-       this.onProgress({ loaded: evt.loaded });
 
-     }
 
-   },
 
-   get isStreamingSupported() {
 
-     return false;
 
-   },
 
-   read: function PDFNetworkStreamRangeRequestReader_read() {
 
-     if (this._queuedChunk !== null) {
 
-       var chunk = this._queuedChunk;
 
-       this._queuedChunk = null;
 
-       return Promise.resolve({
 
-         value: chunk,
 
-         done: false
 
-       });
 
-     }
 
-     if (this._done) {
 
-       return Promise.resolve({
 
-         value: undefined,
 
-         done: true
 
-       });
 
-     }
 
-     var requestCapability = (0, _util.createPromiseCapability)();
 
-     this._requests.push(requestCapability);
 
-     return requestCapability.promise;
 
-   },
 
-   cancel: function PDFNetworkStreamRangeRequestReader_cancel(reason) {
 
-     this._done = true;
 
-     this._requests.forEach(function (requestCapability) {
 
-       requestCapability.resolve({
 
-         value: undefined,
 
-         done: true
 
-       });
 
-     });
 
-     this._requests = [];
 
-     if (this._manager.isPendingRequest(this._requestId)) {
 
-       this._manager.abortRequest(this._requestId);
 
-     }
 
-     this._close();
 
-   }
 
- };
 
- exports.PDFNetworkStream = PDFNetworkStream;
 
- exports.NetworkManager = NetworkManager;
 
 
  |