Browse Source

PDF.js version 2.0.550 - See mozilla/pdf.js@tags/2.0.550

v2.0.550
pdfjsbot 7 years ago
parent
commit
87ac5992eb
  1. 2
      bower.json
  2. 6189
      build/pdf.js
  3. 2
      build/pdf.js.map
  4. 2
      build/pdf.min.js
  5. 77753
      build/pdf.worker.js
  6. 2
      build/pdf.worker.js.map
  7. 2
      build/pdf.worker.min.js
  8. 16
      lib/core/colorspace.js
  9. 79
      lib/core/function.js
  10. 18
      lib/core/jpg.js
  11. 10
      lib/core/type1_parser.js
  12. 12
      lib/core/worker.js
  13. 43
      lib/display/api.js
  14. 13
      lib/display/api_compatibility.js
  15. 22
      lib/display/content_disposition.js
  16. 130
      lib/display/dom_utils.js
  17. 19
      lib/display/fetch_stream.js
  18. 3
      lib/display/svg.js
  19. 4
      lib/pdf.js
  20. 4
      lib/pdf.worker.js
  21. 435
      lib/shared/message_handler.js
  22. 487
      lib/shared/util.js
  23. 3
      lib/test/unit/clitests_helper.js
  24. 2
      lib/test/unit/jasmine-boot.js
  25. 87
      lib/test/unit/message_handler_spec.js
  26. 238
      lib/test/unit/ui_utils_spec.js
  27. 131
      lib/web/app.js
  28. 85
      lib/web/base_viewer.js
  29. 4
      lib/web/pdf_viewer.component.js
  30. 52
      lib/web/pdf_viewer.js
  31. 4
      lib/web/preferences.js
  32. 52
      lib/web/secondary_toolbar.js
  33. 108
      lib/web/ui_utils.js
  34. 6
      lib/web/viewer_compatibility.js
  35. 6
      package.json
  36. 56
      web/pdf_viewer.css
  37. 7042
      web/pdf_viewer.js
  38. 2
      web/pdf_viewer.js.map

2
bower.json

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
{
"name": "pdfjs-dist",
"version": "2.0.489",
"version": "2.0.550",
"main": [
"build/pdf.js",
"build/pdf.worker.js"

6189
build/pdf.js

File diff suppressed because it is too large Load Diff

2
build/pdf.js.map

File diff suppressed because one or more lines are too long

2
build/pdf.min.js vendored

File diff suppressed because one or more lines are too long

77753
build/pdf.worker.js vendored

File diff suppressed because it is too large Load Diff

2
build/pdf.worker.js.map vendored

File diff suppressed because one or more lines are too long

2
build/pdf.worker.min.js vendored

File diff suppressed because one or more lines are too long

16
lib/core/colorspace.js

@ -141,9 +141,9 @@ var ColorSpace = function ColorSpaceClosure() { @@ -141,9 +141,9 @@ var ColorSpace = function ColorSpaceClosure() {
};
ColorSpace.parse = function (cs, xref, res, pdfFunctionFactory) {
var IR = ColorSpace.parseToIR(cs, xref, res, pdfFunctionFactory);
return ColorSpace.fromIR(IR, pdfFunctionFactory);
return ColorSpace.fromIR(IR);
};
ColorSpace.fromIR = function (IR, pdfFunctionFactory) {
ColorSpace.fromIR = function (IR) {
var name = Array.isArray(IR) ? IR[0] : IR;
var whitePoint, blackPoint, gamma;
switch (name) {
@ -167,19 +167,19 @@ var ColorSpace = function ColorSpaceClosure() { @@ -167,19 +167,19 @@ var ColorSpace = function ColorSpaceClosure() {
case 'PatternCS':
var basePatternCS = IR[1];
if (basePatternCS) {
basePatternCS = ColorSpace.fromIR(basePatternCS, pdfFunctionFactory);
basePatternCS = ColorSpace.fromIR(basePatternCS);
}
return new PatternCS(basePatternCS);
case 'IndexedCS':
var baseIndexedCS = IR[1];
var hiVal = IR[2];
var lookup = IR[3];
return new IndexedCS(ColorSpace.fromIR(baseIndexedCS, pdfFunctionFactory), hiVal, lookup);
return new IndexedCS(ColorSpace.fromIR(baseIndexedCS), hiVal, lookup);
case 'AlternateCS':
var numComps = IR[1];
var alt = IR[2];
var tintFnIR = IR[3];
return new AlternateCS(numComps, ColorSpace.fromIR(alt, pdfFunctionFactory), pdfFunctionFactory.createFromIR(tintFnIR));
var tintFn = IR[3];
return new AlternateCS(numComps, ColorSpace.fromIR(alt), tintFn);
case 'LabCS':
whitePoint = IR[1];
blackPoint = IR[2];
@ -291,8 +291,8 @@ var ColorSpace = function ColorSpaceClosure() { @@ -291,8 +291,8 @@ var ColorSpace = function ColorSpaceClosure() {
var name = xref.fetchIfRef(cs[1]);
numComps = Array.isArray(name) ? name.length : 1;
alt = ColorSpace.parseToIR(cs[2], xref, res, pdfFunctionFactory);
var tintFnIR = pdfFunctionFactory.createIR(xref.fetchIfRef(cs[3]));
return ['AlternateCS', numComps, alt, tintFnIR];
var tintFn = pdfFunctionFactory.create(xref.fetchIfRef(cs[3]));
return ['AlternateCS', numComps, alt, tintFn];
case 'Lab':
params = xref.fetchIfRef(cs[1]);
whitePoint = params.getArray('WhitePoint');

79
lib/core/function.js

@ -74,29 +74,27 @@ var PDFFunctionFactory = function () { @@ -74,29 +74,27 @@ var PDFFunctionFactory = function () {
fnObj: fnObj
});
}
}, {
key: 'createFromIR',
value: function createFromIR(IR) {
return PDFFunction.fromIR({
xref: this.xref,
isEvalSupported: this.isEvalSupported,
IR: IR
});
}
}, {
key: 'createIR',
value: function createIR(fn) {
return PDFFunction.getIR({
xref: this.xref,
isEvalSupported: this.isEvalSupported,
fn: fn
});
}
}]);
return PDFFunctionFactory;
}();
function toNumberArray(arr) {
if (!Array.isArray(arr)) {
return null;
}
var length = arr.length;
for (var i = 0; i < length; i++) {
if (typeof arr[i] !== 'number') {
var result = new Array(length);
for (var _i = 0; _i < length; _i++) {
result[_i] = +arr[_i];
}
return result;
}
}
return arr;
}
var PDFFunction = function PDFFunctionClosure() {
var CONSTRUCT_SAMPLED = 0;
var CONSTRUCT_INTERPOLATED = 2;
@ -241,8 +239,8 @@ var PDFFunction = function PDFFunctionClosure() { @@ -241,8 +239,8 @@ var PDFFunction = function PDFFunctionClosure() {
}
return out;
}
var domain = dict.getArray('Domain');
var range = dict.getArray('Range');
var domain = toNumberArray(dict.getArray('Domain'));
var range = toNumberArray(dict.getArray('Range'));
if (!domain || !range) {
throw new _util.FormatError('No domain or range');
}
@ -250,22 +248,22 @@ var PDFFunction = function PDFFunctionClosure() { @@ -250,22 +248,22 @@ var PDFFunction = function PDFFunctionClosure() {
var outputSize = range.length / 2;
domain = toMultiArray(domain);
range = toMultiArray(range);
var size = dict.get('Size');
var size = toNumberArray(dict.getArray('Size'));
var bps = dict.get('BitsPerSample');
var order = dict.get('Order') || 1;
if (order !== 1) {
(0, _util.info)('No support for cubic spline interpolation: ' + order);
}
var encode = dict.getArray('Encode');
var encode = toNumberArray(dict.getArray('Encode'));
if (!encode) {
encode = [];
for (var i = 0; i < inputSize; ++i) {
encode.push(0);
encode.push(size[i] - 1);
encode.push([0, size[i] - 1]);
}
} else {
encode = toMultiArray(encode);
}
encode = toMultiArray(encode);
var decode = dict.getArray('Decode');
var decode = toNumberArray(dict.getArray('Decode'));
if (!decode) {
decode = range;
} else {
@ -340,12 +338,9 @@ var PDFFunction = function PDFFunctionClosure() { @@ -340,12 +338,9 @@ var PDFFunction = function PDFFunctionClosure() {
fn = _ref8.fn,
dict = _ref8.dict;
var c0 = dict.getArray('C0') || [0];
var c1 = dict.getArray('C1') || [1];
var c0 = toNumberArray(dict.getArray('C0')) || [0];
var c1 = toNumberArray(dict.getArray('C1')) || [1];
var n = dict.get('N');
if (!Array.isArray(c0) || !Array.isArray(c1)) {
throw new _util.FormatError('Illegal dictionary for interpolated function');
}
var length = c0.length;
var diff = [];
for (var i = 0; i < length; ++i) {
@ -375,7 +370,7 @@ var PDFFunction = function PDFFunctionClosure() { @@ -375,7 +370,7 @@ var PDFFunction = function PDFFunctionClosure() {
fn = _ref10.fn,
dict = _ref10.dict;
var domain = dict.getArray('Domain');
var domain = toNumberArray(dict.getArray('Domain'));
if (!domain) {
throw new _util.FormatError('No domain');
}
@ -386,14 +381,14 @@ var PDFFunction = function PDFFunctionClosure() { @@ -386,14 +381,14 @@ var PDFFunction = function PDFFunctionClosure() {
var fnRefs = dict.get('Functions');
var fns = [];
for (var i = 0, ii = fnRefs.length; i < ii; ++i) {
fns.push(this.getIR({
fns.push(this.parse({
xref: xref,
isEvalSupported: isEvalSupported,
fn: xref.fetchIfRef(fnRefs[i])
}));
}
var bounds = dict.getArray('Bounds');
var encode = dict.getArray('Encode');
var bounds = toNumberArray(dict.getArray('Bounds'));
var encode = toNumberArray(dict.getArray('Encode'));
return [CONSTRUCT_STICHED, domain, bounds, encode, fns];
},
constructStichedFromIR: function constructStichedFromIR(_ref11) {
@ -404,16 +399,8 @@ var PDFFunction = function PDFFunctionClosure() { @@ -404,16 +399,8 @@ var PDFFunction = function PDFFunctionClosure() {
var domain = IR[1];
var bounds = IR[2];
var encode = IR[3];
var fnsIR = IR[4];
var fns = [];
var fns = IR[4];
var tmpBuf = new Float32Array(1);
for (var i = 0, ii = fnsIR.length; i < ii; i++) {
fns.push(this.fromIR({
xref: xref,
isEvalSupported: isEvalSupported,
IR: fnsIR[i]
}));
}
return function constructStichedFromIRResult(src, srcOffset, dest, destOffset) {
var clip = function constructStichedFromIRClip(v, min, max) {
if (v > max) {
@ -449,8 +436,8 @@ var PDFFunction = function PDFFunctionClosure() { @@ -449,8 +436,8 @@ var PDFFunction = function PDFFunctionClosure() {
fn = _ref12.fn,
dict = _ref12.dict;
var domain = dict.getArray('Domain');
var range = dict.getArray('Range');
var domain = toNumberArray(dict.getArray('Domain'));
var range = toNumberArray(dict.getArray('Range'));
if (!domain) {
throw new _util.FormatError('No domain.');
}

18
lib/core/jpg.js

@ -49,6 +49,15 @@ var DNLMarkerError = function DNLMarkerErrorClosure() { @@ -49,6 +49,15 @@ var DNLMarkerError = function DNLMarkerErrorClosure() {
DNLMarkerError.constructor = DNLMarkerError;
return DNLMarkerError;
}();
var EOIMarkerError = function EOIMarkerErrorClosure() {
function EOIMarkerError(message) {
this.message = message;
}
EOIMarkerError.prototype = new Error();
EOIMarkerError.prototype.name = 'EOIMarkerError';
EOIMarkerError.constructor = EOIMarkerError;
return EOIMarkerError;
}();
var JpegImage = function JpegImageClosure() {
var dctZigZag = new Uint8Array([0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63]);
var dctCos1 = 4017;
@ -134,6 +143,8 @@ var JpegImage = function JpegImageClosure() { @@ -134,6 +143,8 @@ var JpegImage = function JpegImageClosure() {
if (scanLines > 0 && scanLines !== frame.scanLines) {
throw new DNLMarkerError('Found DNL marker (0xFFDC) while parsing scan data', scanLines);
}
} else if (nextByte === 0xD9) {
throw new EOIMarkerError('Found EOI marker (0xFFD9) while parsing scan data');
}
throw new JpegError('unexpected marker ' + (bitsData << 8 | nextByte).toString(16));
}
@ -624,7 +635,7 @@ var JpegImage = function JpegImageClosure() { @@ -624,7 +635,7 @@ var JpegImage = function JpegImageClosure() {
throw new JpegError('SOI not found');
}
fileMarker = readUint16();
while (fileMarker !== 0xFFD9) {
markerLoop: while (fileMarker !== 0xFFD9) {
var i, j, l;
switch (fileMarker) {
case 0xFFE0:
@ -782,8 +793,11 @@ var JpegImage = function JpegImageClosure() { @@ -782,8 +793,11 @@ var JpegImage = function JpegImageClosure() {
offset += processed;
} catch (ex) {
if (ex instanceof DNLMarkerError) {
(0, _util.warn)('Attempting to re-parse JPEG image using "scanLines" ' + 'parameter found in DNL marker (0xFFDC) segment.');
(0, _util.warn)(ex.message + ' -- attempting to re-parse the JPEG image.');
return this.parse(data, { dnlScanLines: ex.scanLines });
} else if (ex instanceof EOIMarkerError) {
(0, _util.warn)(ex.message + ' -- ignoring the rest of the image data.');
break markerLoop;
}
throw ex;
}

10
lib/core/type1_parser.js

@ -439,10 +439,9 @@ var Type1Parser = function Type1ParserClosure() { @@ -439,10 +439,9 @@ var Type1Parser = function Type1ParserClosure() {
var glyph = this.getToken();
length = this.readInt();
this.getToken();
data = stream.makeSubStream(stream.pos, length);
data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
lenIV = program.properties.privateData['lenIV'];
encoded = this.readCharStrings(data.getBytes(), lenIV);
stream.skip(length);
encoded = this.readCharStrings(data, lenIV);
this.nextChar();
token = this.getToken();
if (token === 'noaccess') {
@ -461,10 +460,9 @@ var Type1Parser = function Type1ParserClosure() { @@ -461,10 +460,9 @@ var Type1Parser = function Type1ParserClosure() {
var index = this.readInt();
length = this.readInt();
this.getToken();
data = stream.makeSubStream(stream.pos, length);
data = length > 0 ? stream.getBytes(length) : new Uint8Array(0);
lenIV = program.properties.privateData['lenIV'];
encoded = this.readCharStrings(data.getBytes(), lenIV);
stream.skip(length);
encoded = this.readCharStrings(data, lenIV);
this.nextChar();
token = this.getToken();
if (token === 'noaccess') {

12
lib/core/worker.js

@ -38,6 +38,8 @@ var _is_node = require('../shared/is_node'); @@ -38,6 +38,8 @@ var _is_node = require('../shared/is_node');
var _is_node2 = _interopRequireDefault(_is_node);
var _message_handler = require('../shared/message_handler');
var _primitives = require('./primitives');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@ -223,14 +225,14 @@ var WorkerMessageHandler = { @@ -223,14 +225,14 @@ var WorkerMessageHandler = {
var cancelXHRs = null;
var WorkerTasks = [];
var apiVersion = docParams.apiVersion;
var workerVersion = '2.0.489';
var workerVersion = '2.0.550';
if (apiVersion !== null && apiVersion !== workerVersion) {
throw new Error('The API version "' + apiVersion + '" does not match ' + ('the Worker version "' + workerVersion + '".'));
}
var docId = docParams.docId;
var docBaseUrl = docParams.docBaseUrl;
var workerHandlerName = docParams.docId + '_worker';
var handler = new _util.MessageHandler(workerHandlerName, docId, port);
var handler = new _message_handler.MessageHandler(workerHandlerName, docId, port);
handler.postMessageTransfers = docParams.postMessageTransfers;
function ensureNotTerminated() {
if (terminated) {
@ -382,9 +384,9 @@ var WorkerMessageHandler = { @@ -382,9 +384,9 @@ var WorkerMessageHandler = {
finishWorkerTask(task);
pdfManager.updatePassword(data.password);
pdfManagerReady();
}).catch(function (ex) {
}).catch(function (boundException) {
finishWorkerTask(task);
handler.send('PasswordException', ex);
handler.send('PasswordException', boundException);
}.bind(null, e));
} else if (e instanceof _util.InvalidPDFException) {
handler.send('InvalidPDF', e);
@ -596,7 +598,7 @@ var WorkerMessageHandler = { @@ -596,7 +598,7 @@ var WorkerMessageHandler = {
return workerHandlerName;
},
initializeFromPort: function initializeFromPort(port) {
var handler = new _util.MessageHandler('worker', 'main', port);
var handler = new _message_handler.MessageHandler('worker', 'main', port);
WorkerMessageHandler.setup(handler, port);
handler.send('ready', null);
}

43
lib/display/api.js

@ -46,6 +46,8 @@ var _global_scope2 = _interopRequireDefault(_global_scope); @@ -46,6 +46,8 @@ var _global_scope2 = _interopRequireDefault(_global_scope);
var _worker_options = require('./worker_options');
var _message_handler = require('../shared/message_handler');
var _metadata = require('./metadata');
var _transport_stream = require('./transport_stream');
@ -147,7 +149,7 @@ function getDocument(src) { @@ -147,7 +149,7 @@ function getDocument(src) {
params.pdfBug = params.pdfBug === true;
var NativeImageDecoderValues = Object.values(_util.NativeImageDecoding);
if (params.nativeImageDecoderSupport === undefined || !NativeImageDecoderValues.includes(params.nativeImageDecoderSupport)) {
params.nativeImageDecoderSupport = _util.NativeImageDecoding.DECODE;
params.nativeImageDecoderSupport = _api_compatibility.apiCompatibilityParams.nativeImageDecoderSupport || _util.NativeImageDecoding.DECODE;
}
if (!Number.isInteger(params.maxImageSize)) {
params.maxImageSize = -1;
@ -156,7 +158,7 @@ function getDocument(src) { @@ -156,7 +158,7 @@ function getDocument(src) {
params.isEvalSupported = true;
}
if (typeof params.disableFontFace !== 'boolean') {
params.disableFontFace = false;
params.disableFontFace = _api_compatibility.apiCompatibilityParams.disableFontFace || false;
}
if (typeof params.disableRange !== 'boolean') {
params.disableRange = _api_compatibility.apiCompatibilityParams.disableRange || false;
@ -213,7 +215,7 @@ function getDocument(src) { @@ -213,7 +215,7 @@ function getDocument(src) {
disableStream: params.disableStream
});
}
var messageHandler = new _util.MessageHandler(docId, workerId, worker.port);
var messageHandler = new _message_handler.MessageHandler(docId, workerId, worker.port);
messageHandler.postMessageTransfers = worker.postMessageTransfers;
var transport = new WorkerTransport(messageHandler, task, networkStream, params, CMapReaderFactory);
task._transport = transport;
@ -232,7 +234,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { @@ -232,7 +234,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) {
}
return worker.messageHandler.sendWithPromise('GetDocRequest', {
docId: docId,
apiVersion: '2.0.489',
apiVersion: '2.0.550',
source: {
data: source.data,
url: source.url,
@ -450,7 +452,12 @@ var PDFPageProxy = function PDFPageProxyClosure() { @@ -450,7 +452,12 @@ var PDFPageProxy = function PDFPageProxyClosure() {
var rotate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.rotate;
var dontFlip = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
return new _util.PageViewport(this.view, scale, rotate, 0, 0, dontFlip);
return new _dom_utils.PageViewport({
viewBox: this.view,
scale: scale,
rotation: rotate,
dontFlip: dontFlip
});
},
getAnnotations: function PDFPageProxy_getAnnotations(params) {
@ -677,7 +684,9 @@ var PDFPageProxy = function PDFPageProxyClosure() { @@ -677,7 +684,9 @@ var PDFPageProxy = function PDFPageProxyClosure() {
}();
var LoopbackPort = function () {
function LoopbackPort(defer) {
function LoopbackPort() {
var defer = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
_classCallCheck(this, LoopbackPort);
this._listeners = [];
@ -846,7 +855,7 @@ var PDFWorker = function PDFWorkerClosure() { @@ -846,7 +855,7 @@ var PDFWorker = function PDFWorkerClosure() {
},
_initializeFromPort: function PDFWorker_initializeFromPort(port) {
this._port = port;
this._messageHandler = new _util.MessageHandler('main', 'worker', port);
this._messageHandler = new _message_handler.MessageHandler('main', 'worker', port);
this._messageHandler.on('ready', function () {});
this._readyCapability.resolve();
},
@ -860,7 +869,7 @@ var PDFWorker = function PDFWorkerClosure() { @@ -860,7 +869,7 @@ var PDFWorker = function PDFWorkerClosure() {
workerSrc = createCDNWrapper(new URL(workerSrc, window.location).href);
}
var worker = new Worker(workerSrc);
var messageHandler = new _util.MessageHandler('main', 'worker', worker);
var messageHandler = new _message_handler.MessageHandler('main', 'worker', worker);
var terminateEarly = function terminateEarly() {
worker.removeEventListener('error', onWorkerError);
messageHandler.destroy();
@ -945,9 +954,9 @@ var PDFWorker = function PDFWorkerClosure() { @@ -945,9 +954,9 @@ var PDFWorker = function PDFWorkerClosure() {
var port = new LoopbackPort(isTypedArraysPresent);
_this7._port = port;
var id = 'fake' + nextFakeWorkerId++;
var workerHandler = new _util.MessageHandler(id + '_worker', id, port);
var workerHandler = new _message_handler.MessageHandler(id + '_worker', id, port);
WorkerMessageHandler.setup(workerHandler, port);
var messageHandler = new _util.MessageHandler(id, id + '_worker', port);
var messageHandler = new _message_handler.MessageHandler(id, id + '_worker', port);
_this7._messageHandler = messageHandler;
_this7._readyCapability.resolve();
});
@ -1137,7 +1146,11 @@ var WorkerTransport = function WorkerTransportClosure() { @@ -1137,7 +1146,11 @@ var WorkerTransport = function WorkerTransportClosure() {
var updatePassword = function updatePassword(password) {
_this11._passwordCapability.resolve({ password: password });
};
loadingTask.onPassword(updatePassword, exception.code);
try {
loadingTask.onPassword(updatePassword, exception.code);
} catch (ex) {
this._passwordCapability.reject(ex);
}
} else {
this._passwordCapability.reject(new _util.PasswordException(exception.message, exception.code));
}
@ -1450,7 +1463,9 @@ var WorkerTransport = function WorkerTransportClosure() { @@ -1450,7 +1463,9 @@ var WorkerTransport = function WorkerTransportClosure() {
disableRange: params.disableRange,
disableStream: params.disableStream,
disableAutoFetch: params.disableAutoFetch,
disableCreateObjectURL: params.disableCreateObjectURL
disableCreateObjectURL: params.disableCreateObjectURL,
disableFontFace: params.disableFontFace,
nativeImageDecoderSupport: params.nativeImageDecoderSupport
});
}
};
@ -1650,8 +1665,8 @@ var InternalRenderTask = function InternalRenderTaskClosure() { @@ -1650,8 +1665,8 @@ var InternalRenderTask = function InternalRenderTaskClosure() {
}();
var version, build;
{
exports.version = version = '2.0.489';
exports.build = build = '7d7bc80e';
exports.version = version = '2.0.550';
exports.build = build = '76337fdc';
}
exports.getDocument = getDocument;
exports.LoopbackPort = LoopbackPort;

13
lib/display/api_compatibility.js

@ -21,11 +21,9 @@ @@ -21,11 +21,9 @@
*/
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var compatibilityParams = Object.create(null);
{
var isNodeJS = require('../shared/is_node');
var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';
var isIE = /Trident/.test(userAgent);
var isIOS = /\b(iPad|iPhone|iPod)(?=;)/.test(userAgent);
@ -42,6 +40,11 @@ var compatibilityParams = Object.create(null); @@ -42,6 +40,11 @@ var compatibilityParams = Object.create(null);
compatibilityParams.disableStream = true;
}
})();
(function checkFontFaceAndImage() {
if (isNodeJS()) {
compatibilityParams.disableFontFace = true;
compatibilityParams.nativeImageDecoderSupport = 'none';
}
})();
}
var apiCompatibilityParams = Object.freeze(compatibilityParams);
exports.apiCompatibilityParams = apiCompatibilityParams;
exports.apiCompatibilityParams = Object.freeze(compatibilityParams);

22
lib/display/content_disposition.js

@ -55,21 +55,23 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { @@ -55,21 +55,23 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
}
function textdecode(encoding, value) {
if (encoding) {
if (!/^[^\x00-\xFF]+$/.test(value)) {
if (!/^[\x00-\xFF]+$/.test(value)) {
return value;
}
try {
var decoder = new TextDecoder(encoding, { fatal: true });
var bytes = new Array(value.length);
for (var i = 0; i < value.length; ++i) {
bytes[i] = value.charCodeAt(0);
bytes[i] = value.charCodeAt(i);
}
value = decoder.decode(new Uint8Array(bytes));
needsEncodingFixup = false;
} catch (e) {
if (/^utf-?8$/i.test(encoding)) {
value = decodeURIComponent(escape(value));
needsEncodingFixup = false;
try {
value = decodeURIComponent(escape(value));
needsEncodingFixup = false;
} catch (err) {}
}
}
}
@ -77,7 +79,10 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { @@ -77,7 +79,10 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
}
function fixupEncoding(value) {
if (needsEncodingFixup && /[\x80-\xff]/.test(value)) {
return textdecode('utf-8', value);
value = textdecode('utf-8', value);
if (needsEncodingFixup) {
value = textdecode('iso-8859-1', value);
}
}
return value;
}
@ -160,10 +165,9 @@ function getFilenameFromContentDispositionHeader(contentDisposition) { @@ -160,10 +165,9 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
return textdecode(charset, text);
}
try {
return atob(text);
} catch (e) {
return text;
}
text = atob(text);
} catch (e) {}
return textdecode(charset, text);
});
}
return '';

130
lib/display/dom_utils.js

@ -24,7 +24,7 @@ @@ -24,7 +24,7 @@
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.getFilenameFromUrl = exports.addLinkAttributes = exports.RenderingCancelledException = undefined;
exports.DummyStatTimer = exports.StatTimer = exports.DOMSVGFactory = exports.DOMCMapReaderFactory = exports.DOMCanvasFactory = exports.DEFAULT_LINK_REL = exports.LinkTarget = exports.getFilenameFromUrl = exports.addLinkAttributes = exports.RenderingCancelledException = exports.PageViewport = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@ -173,6 +173,125 @@ var DOMSVGFactory = function () { @@ -173,6 +173,125 @@ var DOMSVGFactory = function () {
return DOMSVGFactory;
}();
var PageViewport = function () {
function PageViewport(_ref3) {
var viewBox = _ref3.viewBox,
scale = _ref3.scale,
rotation = _ref3.rotation,
_ref3$offsetX = _ref3.offsetX,
offsetX = _ref3$offsetX === undefined ? 0 : _ref3$offsetX,
_ref3$offsetY = _ref3.offsetY,
offsetY = _ref3$offsetY === undefined ? 0 : _ref3$offsetY,
_ref3$dontFlip = _ref3.dontFlip,
dontFlip = _ref3$dontFlip === undefined ? false : _ref3$dontFlip;
_classCallCheck(this, PageViewport);
this.viewBox = viewBox;
this.scale = scale;
this.rotation = rotation;
this.offsetX = offsetX;
this.offsetY = offsetY;
var centerX = (viewBox[2] + viewBox[0]) / 2;
var centerY = (viewBox[3] + viewBox[1]) / 2;
var rotateA = void 0,
rotateB = void 0,
rotateC = void 0,
rotateD = void 0;
rotation = rotation % 360;
rotation = rotation < 0 ? rotation + 360 : rotation;
switch (rotation) {
case 180:
rotateA = -1;
rotateB = 0;
rotateC = 0;
rotateD = 1;
break;
case 90:
rotateA = 0;
rotateB = 1;
rotateC = 1;
rotateD = 0;
break;
case 270:
rotateA = 0;
rotateB = -1;
rotateC = -1;
rotateD = 0;
break;
default:
rotateA = 1;
rotateB = 0;
rotateC = 0;
rotateD = -1;
break;
}
if (dontFlip) {
rotateC = -rotateC;
rotateD = -rotateD;
}
var offsetCanvasX = void 0,
offsetCanvasY = void 0;
var width = void 0,
height = void 0;
if (rotateA === 0) {
offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
width = Math.abs(viewBox[3] - viewBox[1]) * scale;
height = Math.abs(viewBox[2] - viewBox[0]) * scale;
} else {
offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
width = Math.abs(viewBox[2] - viewBox[0]) * scale;
height = Math.abs(viewBox[3] - viewBox[1]) * scale;
}
this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
this.width = width;
this.height = height;
}
_createClass(PageViewport, [{
key: 'clone',
value: function clone() {
var _ref4 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
_ref4$scale = _ref4.scale,
scale = _ref4$scale === undefined ? this.scale : _ref4$scale,
_ref4$rotation = _ref4.rotation,
rotation = _ref4$rotation === undefined ? this.rotation : _ref4$rotation,
_ref4$dontFlip = _ref4.dontFlip,
dontFlip = _ref4$dontFlip === undefined ? false : _ref4$dontFlip;
return new PageViewport({
viewBox: this.viewBox.slice(),
scale: scale,
rotation: rotation,
offsetX: this.offsetX,
offsetY: this.offsetY,
dontFlip: dontFlip
});
}
}, {
key: 'convertToViewportPoint',
value: function convertToViewportPoint(x, y) {
return _util.Util.applyTransform([x, y], this.transform);
}
}, {
key: 'convertToViewportRectangle',
value: function convertToViewportRectangle(rect) {
var tl = _util.Util.applyTransform([rect[0], rect[1]], this.transform);
var br = _util.Util.applyTransform([rect[2], rect[3]], this.transform);
return [tl[0], tl[1], br[0], br[1]];
}
}, {
key: 'convertToPdfPoint',
value: function convertToPdfPoint(x, y) {
return _util.Util.applyInverseTransform([x, y], this.transform);
}
}]);
return PageViewport;
}();
var RenderingCancelledException = function RenderingCancelledException() {
function RenderingCancelledException(msg, type) {
this.message = msg;
@ -192,10 +311,10 @@ var LinkTarget = { @@ -192,10 +311,10 @@ var LinkTarget = {
};
var LinkTargetStringMap = ['', '_self', '_blank', '_parent', '_top'];
function addLinkAttributes(link) {
var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
url = _ref3.url,
target = _ref3.target,
rel = _ref3.rel;
var _ref5 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
url = _ref5.url,
target = _ref5.target,
rel = _ref5.rel;
link.href = link.title = url ? (0, _util.removeNullCharacters)(url) : '';
if (url) {
@ -297,6 +416,7 @@ var DummyStatTimer = function () { @@ -297,6 +416,7 @@ var DummyStatTimer = function () {
return DummyStatTimer;
}();
exports.PageViewport = PageViewport;
exports.RenderingCancelledException = RenderingCancelledException;
exports.addLinkAttributes = addLinkAttributes;
exports.getFilenameFromUrl = getFilenameFromUrl;

19
lib/display/fetch_stream.js

@ -34,10 +34,11 @@ var _network_utils = require('./network_utils'); @@ -34,10 +34,11 @@ var _network_utils = require('./network_utils');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function createFetchOptions(headers, withCredentials) {
function createFetchOptions(headers, withCredentials, abortController) {
return {
method: 'GET',
headers: headers,
signal: abortController && abortController.signal,
mode: 'cors',
credentials: withCredentials ? 'include' : 'same-origin',
redirect: 'follow'
@ -104,6 +105,9 @@ var PDFFetchStreamReader = function () { @@ -104,6 +105,9 @@ var PDFFetchStreamReader = function () {
if (!this._rangeChunkSize && !this._disableRange) {
this._disableRange = true;
}
if (typeof AbortController !== 'undefined') {
this._abortController = new AbortController();
}
this._isStreamingSupported = !source.disableStream;
this._isRangeSupported = !source.disableRange;
this._headers = new Headers();
@ -115,7 +119,7 @@ var PDFFetchStreamReader = function () { @@ -115,7 +119,7 @@ var PDFFetchStreamReader = function () {
this._headers.append(property, value);
}
var url = source.url;
fetch(url, createFetchOptions(this._headers, this._withCredentials)).then(function (response) {
fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) {
if (!(0, _network_utils.validateResponseStatus)(response.status)) {
throw (0, _network_utils.createResponseStatusError)(response.status, url);
}
@ -181,6 +185,9 @@ var PDFFetchStreamReader = function () { @@ -181,6 +185,9 @@ var PDFFetchStreamReader = function () {
if (this._reader) {
this._reader.cancel(reason);
}
if (this._abortController) {
this._abortController.abort();
}
}
}, {
key: 'headersReady',
@ -225,6 +232,9 @@ var PDFFetchStreamRangeReader = function () { @@ -225,6 +232,9 @@ var PDFFetchStreamRangeReader = function () {
this._withCredentials = source.withCredentials;
this._readCapability = (0, _util.createPromiseCapability)();
this._isStreamingSupported = !source.disableStream;
if (typeof AbortController !== 'undefined') {
this._abortController = new AbortController();
}
this._headers = new Headers();
for (var property in this._stream.httpHeaders) {
var value = this._stream.httpHeaders[property];
@ -236,7 +246,7 @@ var PDFFetchStreamRangeReader = function () { @@ -236,7 +246,7 @@ var PDFFetchStreamRangeReader = function () {
var rangeStr = begin + '-' + (end - 1);
this._headers.append('Range', 'bytes=' + rangeStr);
var url = source.url;
fetch(url, createFetchOptions(this._headers, this._withCredentials)).then(function (response) {
fetch(url, createFetchOptions(this._headers, this._withCredentials, this._abortController)).then(function (response) {
if (!(0, _network_utils.validateResponseStatus)(response.status)) {
throw (0, _network_utils.createResponseStatusError)(response.status, url);
}
@ -280,6 +290,9 @@ var PDFFetchStreamRangeReader = function () { @@ -280,6 +290,9 @@ var PDFFetchStreamRangeReader = function () {
if (this._reader) {
this._reader.cancel(reason);
}
if (this._abortController) {
this._abortController.abort();
}
}
}, {
key: 'isStreamingSupported',

3
lib/display/svg.js

@ -823,6 +823,7 @@ var SVGGraphics = function SVGGraphics() { @@ -823,6 +823,7 @@ var SVGGraphics = function SVGGraphics() {
this.extraStack.forEach(function (prev) {
prev.clipGroup = null;
});
clipPath.setAttributeNS(null, 'clip-path', current.activeClipUrl);
}
current.activeClipUrl = 'url(#' + clipId + ')';
this.tgrp = null;
@ -888,6 +889,7 @@ var SVGGraphics = function SVGGraphics() { @@ -888,6 +889,7 @@ var SVGGraphics = function SVGGraphics() {
if (current.element) {
current.element.setAttributeNS(null, 'fill', current.fillColor);
current.element.setAttributeNS(null, 'fill-opacity', current.fillAlpha);
this.endPath();
}
},
stroke: function SVGGraphics_stroke() {
@ -902,6 +904,7 @@ var SVGGraphics = function SVGGraphics() { @@ -902,6 +904,7 @@ var SVGGraphics = function SVGGraphics() {
current.element.setAttributeNS(null, 'stroke-dasharray', current.dashArray.map(pf).join(' '));
current.element.setAttributeNS(null, 'stroke-dashoffset', pf(current.dashPhase) + 'px');
current.element.setAttributeNS(null, 'fill', 'none');
this.endPath();
}
},
eoFill: function SVGGraphics_eoFill() {

4
lib/pdf.js

@ -21,8 +21,8 @@ @@ -21,8 +21,8 @@
*/
'use strict';
var pdfjsVersion = '2.0.489';
var pdfjsBuild = '7d7bc80e';
var pdfjsVersion = '2.0.550';
var pdfjsBuild = '76337fdc';
var pdfjsSharedUtil = require('./shared/util.js');
var pdfjsDisplayAPI = require('./display/api.js');
var pdfjsDisplayTextLayer = require('./display/text_layer.js');

4
lib/pdf.worker.js vendored

@ -21,7 +21,7 @@ @@ -21,7 +21,7 @@
*/
'use strict';
var pdfjsVersion = '2.0.489';
var pdfjsBuild = '7d7bc80e';
var pdfjsVersion = '2.0.550';
var pdfjsBuild = '76337fdc';
var pdfjsCoreWorker = require('./core/worker.js');
exports.WorkerMessageHandler = pdfjsCoreWorker.WorkerMessageHandler;

435
lib/shared/message_handler.js

@ -0,0 +1,435 @@ @@ -0,0 +1,435 @@
/**
* @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.MessageHandler = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _util = require('./util');
function resolveCall(fn, args) {
var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (!fn) {
return Promise.resolve(undefined);
}
return new Promise(function (resolve, reject) {
resolve(fn.apply(thisArg, args));
});
}
function wrapReason(reason) {
if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {
return reason;
}
switch (reason.name) {
case 'AbortException':
return new _util.AbortException(reason.message);
case 'MissingPDFException':
return new _util.MissingPDFException(reason.message);
case 'UnexpectedResponseException':
return new _util.UnexpectedResponseException(reason.message, reason.status);
default:
return new _util.UnknownErrorException(reason.message, reason.details);
}
}
function makeReasonSerializable(reason) {
if (!(reason instanceof Error) || reason instanceof _util.AbortException || reason instanceof _util.MissingPDFException || reason instanceof _util.UnexpectedResponseException || reason instanceof _util.UnknownErrorException) {
return reason;
}
return new _util.UnknownErrorException(reason.message, reason.toString());
}
function resolveOrReject(capability, success, reason) {
if (success) {
capability.resolve();
} else {
capability.reject(reason);
}
}
function finalize(promise) {
return Promise.resolve(promise).catch(function () {});
}
function MessageHandler(sourceName, targetName, comObj) {
var _this = this;
this.sourceName = sourceName;
this.targetName = targetName;
this.comObj = comObj;
this.callbackId = 1;
this.streamId = 1;
this.postMessageTransfers = true;
this.streamSinks = Object.create(null);
this.streamControllers = Object.create(null);
var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
var ah = this.actionHandler = Object.create(null);
this._onComObjOnMessage = function (event) {
var data = event.data;
if (data.targetName !== _this.sourceName) {
return;
}
if (data.stream) {
_this._processStreamMessage(data);
} else if (data.isReply) {
var callbackId = data.callbackId;
if (data.callbackId in callbacksCapabilities) {
var callback = callbacksCapabilities[callbackId];
delete callbacksCapabilities[callbackId];
if ('error' in data) {
callback.reject(wrapReason(data.error));
} else {
callback.resolve(data.data);
}
} else {
throw new Error('Cannot resolve callback ' + callbackId);
}
} else if (data.action in ah) {
var action = ah[data.action];
if (data.callbackId) {
var _sourceName = _this.sourceName;
var _targetName = data.sourceName;
Promise.resolve().then(function () {
return action[0].call(action[1], data.data);
}).then(function (result) {
comObj.postMessage({
sourceName: _sourceName,
targetName: _targetName,
isReply: true,
callbackId: data.callbackId,
data: result
});
}, function (reason) {
comObj.postMessage({
sourceName: _sourceName,
targetName: _targetName,
isReply: true,
callbackId: data.callbackId,
error: makeReasonSerializable(reason)
});
});
} else if (data.streamId) {
_this._createStreamSink(data);
} else {
action[0].call(action[1], data.data);
}
} else {
throw new Error('Unknown action from worker: ' + data.action);
}
};
comObj.addEventListener('message', this._onComObjOnMessage);
}
MessageHandler.prototype = {
on: function on(actionName, handler, scope) {
var ah = this.actionHandler;
if (ah[actionName]) {
throw new Error('There is already an actionName called "' + actionName + '"');
}
ah[actionName] = [handler, scope];
},
send: function send(actionName, data, transfers) {
var message = {
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
data: data
};
this.postMessage(message, transfers);
},
sendWithPromise: function sendWithPromise(actionName, data, transfers) {
var callbackId = this.callbackId++;
var message = {
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
data: data,
callbackId: callbackId
};
var capability = (0, _util.createPromiseCapability)();
this.callbacksCapabilities[callbackId] = capability;
try {
this.postMessage(message, transfers);
} catch (e) {
capability.reject(e);
}
return capability.promise;
},
sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {
var _this2 = this;
var streamId = this.streamId++;
var sourceName = this.sourceName;
var targetName = this.targetName;
return new _util.ReadableStream({
start: function start(controller) {
var startCapability = (0, _util.createPromiseCapability)();
_this2.streamControllers[streamId] = {
controller: controller,
startCall: startCapability,
isClosed: false
};
_this2.postMessage({
sourceName: sourceName,
targetName: targetName,
action: actionName,
streamId: streamId,
data: data,
desiredSize: controller.desiredSize
});
return startCapability.promise;
},
pull: function pull(controller) {
var pullCapability = (0, _util.createPromiseCapability)();
_this2.streamControllers[streamId].pullCall = pullCapability;
_this2.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: 'pull',
streamId: streamId,
desiredSize: controller.desiredSize
});
return pullCapability.promise;
},
cancel: function cancel(reason) {
var cancelCapability = (0, _util.createPromiseCapability)();
_this2.streamControllers[streamId].cancelCall = cancelCapability;
_this2.streamControllers[streamId].isClosed = true;
_this2.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: 'cancel',
reason: reason,
streamId: streamId
});
return cancelCapability.promise;
}
}, queueingStrategy);
},
_createStreamSink: function _createStreamSink(data) {
var _this3 = this;
var self = this;
var action = this.actionHandler[data.action];
var streamId = data.streamId;
var desiredSize = data.desiredSize;
var sourceName = this.sourceName;
var targetName = data.sourceName;
var capability = (0, _util.createPromiseCapability)();
var sendStreamRequest = function sendStreamRequest(_ref) {
var stream = _ref.stream,
chunk = _ref.chunk,
transfers = _ref.transfers,
success = _ref.success,
reason = _ref.reason;
_this3.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: stream,
streamId: streamId,
chunk: chunk,
success: success,
reason: reason
}, transfers);
};
var streamSink = {
enqueue: function enqueue(chunk) {
var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var transfers = arguments[2];
if (this.isCancelled) {
return;
}
var lastDesiredSize = this.desiredSize;
this.desiredSize -= size;
if (lastDesiredSize > 0 && this.desiredSize <= 0) {
this.sinkCapability = (0, _util.createPromiseCapability)();
this.ready = this.sinkCapability.promise;
}
sendStreamRequest({
stream: 'enqueue',
chunk: chunk,
transfers: transfers
});
},
close: function close() {
if (this.isCancelled) {
return;
}
this.isCancelled = true;
sendStreamRequest({ stream: 'close' });
delete self.streamSinks[streamId];
},
error: function error(reason) {
if (this.isCancelled) {
return;
}
this.isCancelled = true;
sendStreamRequest({
stream: 'error',
reason: reason
});
},
sinkCapability: capability,
onPull: null,
onCancel: null,
isCancelled: false,
desiredSize: desiredSize,
ready: null
};
streamSink.sinkCapability.resolve();
streamSink.ready = streamSink.sinkCapability.promise;
this.streamSinks[streamId] = streamSink;
resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
sendStreamRequest({
stream: 'start_complete',
success: true
});
}, function (reason) {
sendStreamRequest({
stream: 'start_complete',
success: false,
reason: reason
});
});
},
_processStreamMessage: function _processStreamMessage(data) {
var _this4 = this;
var sourceName = this.sourceName;
var targetName = data.sourceName;
var streamId = data.streamId;
var sendStreamResponse = function sendStreamResponse(_ref2) {
var stream = _ref2.stream,
success = _ref2.success,
reason = _ref2.reason;
_this4.comObj.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: stream,
success: success,
streamId: streamId,
reason: reason
});
};
var deleteStreamController = function deleteStreamController() {
Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
return capability && finalize(capability.promise);
})).then(function () {
delete _this4.streamControllers[data.streamId];
});
};
switch (data.stream) {
case 'start_complete':
resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
break;
case 'pull_complete':
resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
break;
case 'pull':
if (!this.streamSinks[data.streamId]) {
sendStreamResponse({
stream: 'pull_complete',
success: true
});
break;
}
if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
this.streamSinks[data.streamId].sinkCapability.resolve();
}
this.streamSinks[data.streamId].desiredSize = data.desiredSize;
resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
sendStreamResponse({
stream: 'pull_complete',
success: true
});
}, function (reason) {
sendStreamResponse({
stream: 'pull_complete',
success: false,
reason: reason
});
});
break;
case 'enqueue':
(0, _util.assert)(this.streamControllers[data.streamId], 'enqueue should have stream controller');
if (!this.streamControllers[data.streamId].isClosed) {
this.streamControllers[data.streamId].controller.enqueue(data.chunk);
}
break;
case 'close':
(0, _util.assert)(this.streamControllers[data.streamId], 'close should have stream controller');
if (this.streamControllers[data.streamId].isClosed) {
break;
}
this.streamControllers[data.streamId].isClosed = true;
this.streamControllers[data.streamId].controller.close();
deleteStreamController();
break;
case 'error':
(0, _util.assert)(this.streamControllers[data.streamId], 'error should have stream controller');
this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
deleteStreamController();
break;
case 'cancel_complete':
resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
deleteStreamController();
break;
case 'cancel':
if (!this.streamSinks[data.streamId]) {
break;
}
resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
sendStreamResponse({
stream: 'cancel_complete',
success: true
});
}, function (reason) {
sendStreamResponse({
stream: 'cancel_complete',
success: false,
reason: reason
});
});
this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
this.streamSinks[data.streamId].isCancelled = true;
delete this.streamSinks[data.streamId];
break;
default:
throw new Error('Unexpected stream case');
}
},
postMessage: function postMessage(message, transfers) {
if (transfers && this.postMessageTransfers) {
this.comObj.postMessage(message, transfers);
} else {
this.comObj.postMessage(message);
}
},
destroy: function destroy() {
this.comObj.removeEventListener('message', this._onComObjOnMessage);
}
};
exports.MessageHandler = MessageHandler;

487
lib/shared/util.js

@ -24,7 +24,7 @@ @@ -24,7 +24,7 @@
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isSpace = exports.isString = exports.isNum = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.info = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.getInheritableProperty = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.createBlob = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PasswordResponses = exports.PasswordException = exports.PageViewport = exports.NotImplementedException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.MessageHandler = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;
exports.unreachable = exports.warn = exports.utf8StringToString = exports.stringToUTF8String = exports.stringToPDFString = exports.stringToBytes = exports.string32 = exports.shadow = exports.setVerbosityLevel = exports.ReadableStream = exports.removeNullCharacters = exports.readUint32 = exports.readUint16 = exports.readInt8 = exports.log2 = exports.isEvalSupported = exports.isLittleEndian = exports.createValidAbsoluteUrl = exports.isSameOrigin = exports.isSpace = exports.isString = exports.isNum = exports.isEmptyObj = exports.isBool = exports.isArrayBuffer = exports.info = exports.getVerbosityLevel = exports.getLookupTableFactory = exports.getInheritableProperty = exports.deprecated = exports.createObjectURL = exports.createPromiseCapability = exports.createBlob = exports.bytesToString = exports.assert = exports.arraysToBytes = exports.arrayByteLength = exports.FormatError = exports.XRefParseException = exports.Util = exports.UnknownErrorException = exports.UnexpectedResponseException = exports.TextRenderingMode = exports.StreamType = exports.PasswordResponses = exports.PasswordException = exports.NotImplementedException = exports.NativeImageDecoding = exports.MissingPDFException = exports.MissingDataException = exports.InvalidPDFException = exports.AbortException = exports.CMapCompressionType = exports.ImageKind = exports.FontType = exports.AnnotationType = exports.AnnotationFlag = exports.AnnotationFieldFlag = exports.AnnotationBorderStyleType = exports.UNSUPPORTED_FEATURES = exports.VerbosityLevel = exports.OPS = exports.IDENTITY_MATRIX = exports.FONT_IDENTITY_MATRIX = undefined;
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
@ -716,87 +716,6 @@ var Util = function UtilClosure() { @@ -716,87 +716,6 @@ var Util = function UtilClosure() {
};
return Util;
}();
var PageViewport = function PageViewportClosure() {
function PageViewport(viewBox, scale, rotation, offsetX, offsetY, dontFlip) {
this.viewBox = viewBox;
this.scale = scale;
this.rotation = rotation;
this.offsetX = offsetX;
this.offsetY = offsetY;
var centerX = (viewBox[2] + viewBox[0]) / 2;
var centerY = (viewBox[3] + viewBox[1]) / 2;
var rotateA, rotateB, rotateC, rotateD;
rotation = rotation % 360;
rotation = rotation < 0 ? rotation + 360 : rotation;
switch (rotation) {
case 180:
rotateA = -1;
rotateB = 0;
rotateC = 0;
rotateD = 1;
break;
case 90:
rotateA = 0;
rotateB = 1;
rotateC = 1;
rotateD = 0;
break;
case 270:
rotateA = 0;
rotateB = -1;
rotateC = -1;
rotateD = 0;
break;
default:
rotateA = 1;
rotateB = 0;
rotateC = 0;
rotateD = -1;
break;
}
if (dontFlip) {
rotateC = -rotateC;
rotateD = -rotateD;
}
var offsetCanvasX, offsetCanvasY;
var width, height;
if (rotateA === 0) {
offsetCanvasX = Math.abs(centerY - viewBox[1]) * scale + offsetX;
offsetCanvasY = Math.abs(centerX - viewBox[0]) * scale + offsetY;
width = Math.abs(viewBox[3] - viewBox[1]) * scale;
height = Math.abs(viewBox[2] - viewBox[0]) * scale;
} else {
offsetCanvasX = Math.abs(centerX - viewBox[0]) * scale + offsetX;
offsetCanvasY = Math.abs(centerY - viewBox[1]) * scale + offsetY;
width = Math.abs(viewBox[2] - viewBox[0]) * scale;
height = Math.abs(viewBox[3] - viewBox[1]) * scale;
}
this.transform = [rotateA * scale, rotateB * scale, rotateC * scale, rotateD * scale, offsetCanvasX - rotateA * scale * centerX - rotateC * scale * centerY, offsetCanvasY - rotateB * scale * centerX - rotateD * scale * centerY];
this.width = width;
this.height = height;
this.fontScale = scale;
}
PageViewport.prototype = {
clone: function PageViewPort_clone(args) {
args = args || {};
var scale = 'scale' in args ? args.scale : this.scale;
var rotation = 'rotation' in args ? args.rotation : this.rotation;
return new PageViewport(this.viewBox.slice(), scale, rotation, this.offsetX, this.offsetY, args.dontFlip);
},
convertToViewportPoint: function PageViewport_convertToViewportPoint(x, y) {
return Util.applyTransform([x, y], this.transform);
},
convertToViewportRectangle: function PageViewport_convertToViewportRectangle(rect) {
var tl = Util.applyTransform([rect[0], rect[1]], this.transform);
var br = Util.applyTransform([rect[2], rect[3]], this.transform);
return [tl[0], tl[1], br[0], br[1]];
},
convertToPdfPoint: function PageViewport_convertToPdfPoint(x, y) {
return Util.applyInverseTransform([x, y], this.transform);
}
};
return PageViewport;
}();
var PDFStringTranslateTable = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2D8, 0x2C7, 0x2C6, 0x2D9, 0x2DD, 0x2DB, 0x2DA, 0x2DC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x192, 0x2044, 0x2039, 0x203A, 0x2212, 0x2030, 0x201E, 0x201C, 0x201D, 0x2018, 0x2019, 0x201A, 0x2122, 0xFB01, 0xFB02, 0x141, 0x152, 0x160, 0x178, 0x17D, 0x131, 0x142, 0x153, 0x161, 0x17E, 0, 0x20AC];
function stringToPDFString(str) {
var i,
@ -878,408 +797,6 @@ var createObjectURL = function createObjectURLClosure() { @@ -878,408 +797,6 @@ var createObjectURL = function createObjectURLClosure() {
return buffer;
};
}();
function resolveCall(fn, args) {
var thisArg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
if (!fn) {
return Promise.resolve(undefined);
}
return new Promise(function (resolve, reject) {
resolve(fn.apply(thisArg, args));
});
}
function wrapReason(reason) {
if ((typeof reason === 'undefined' ? 'undefined' : _typeof(reason)) !== 'object') {
return reason;
}
switch (reason.name) {
case 'AbortException':
return new AbortException(reason.message);
case 'MissingPDFException':
return new MissingPDFException(reason.message);
case 'UnexpectedResponseException':
return new UnexpectedResponseException(reason.message, reason.status);
default:
return new UnknownErrorException(reason.message, reason.details);
}
}
function makeReasonSerializable(reason) {
if (!(reason instanceof Error) || reason instanceof AbortException || reason instanceof MissingPDFException || reason instanceof UnexpectedResponseException || reason instanceof UnknownErrorException) {
return reason;
}
return new UnknownErrorException(reason.message, reason.toString());
}
function resolveOrReject(capability, success, reason) {
if (success) {
capability.resolve();
} else {
capability.reject(reason);
}
}
function finalize(promise) {
return Promise.resolve(promise).catch(function () {});
}
function MessageHandler(sourceName, targetName, comObj) {
var _this = this;
this.sourceName = sourceName;
this.targetName = targetName;
this.comObj = comObj;
this.callbackId = 1;
this.streamId = 1;
this.postMessageTransfers = true;
this.streamSinks = Object.create(null);
this.streamControllers = Object.create(null);
var callbacksCapabilities = this.callbacksCapabilities = Object.create(null);
var ah = this.actionHandler = Object.create(null);
this._onComObjOnMessage = function (event) {
var data = event.data;
if (data.targetName !== _this.sourceName) {
return;
}
if (data.stream) {
_this._processStreamMessage(data);
} else if (data.isReply) {
var callbackId = data.callbackId;
if (data.callbackId in callbacksCapabilities) {
var callback = callbacksCapabilities[callbackId];
delete callbacksCapabilities[callbackId];
if ('error' in data) {
callback.reject(wrapReason(data.error));
} else {
callback.resolve(data.data);
}
} else {
throw new Error('Cannot resolve callback ' + callbackId);
}
} else if (data.action in ah) {
var action = ah[data.action];
if (data.callbackId) {
var _sourceName = _this.sourceName;
var _targetName = data.sourceName;
Promise.resolve().then(function () {
return action[0].call(action[1], data.data);
}).then(function (result) {
comObj.postMessage({
sourceName: _sourceName,
targetName: _targetName,
isReply: true,
callbackId: data.callbackId,
data: result
});
}, function (reason) {
comObj.postMessage({
sourceName: _sourceName,
targetName: _targetName,
isReply: true,
callbackId: data.callbackId,
error: makeReasonSerializable(reason)
});
});
} else if (data.streamId) {
_this._createStreamSink(data);
} else {
action[0].call(action[1], data.data);
}
} else {
throw new Error('Unknown action from worker: ' + data.action);
}
};
comObj.addEventListener('message', this._onComObjOnMessage);
}
MessageHandler.prototype = {
on: function on(actionName, handler, scope) {
var ah = this.actionHandler;
if (ah[actionName]) {
throw new Error('There is already an actionName called "' + actionName + '"');
}
ah[actionName] = [handler, scope];
},
send: function send(actionName, data, transfers) {
var message = {
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
data: data
};
this.postMessage(message, transfers);
},
sendWithPromise: function sendWithPromise(actionName, data, transfers) {
var callbackId = this.callbackId++;
var message = {
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
data: data,
callbackId: callbackId
};
var capability = createPromiseCapability();
this.callbacksCapabilities[callbackId] = capability;
try {
this.postMessage(message, transfers);
} catch (e) {
capability.reject(e);
}
return capability.promise;
},
sendWithStream: function sendWithStream(actionName, data, queueingStrategy, transfers) {
var _this2 = this;
var streamId = this.streamId++;
var sourceName = this.sourceName;
var targetName = this.targetName;
return new _streams_polyfill.ReadableStream({
start: function start(controller) {
var startCapability = createPromiseCapability();
_this2.streamControllers[streamId] = {
controller: controller,
startCall: startCapability,
isClosed: false
};
_this2.postMessage({
sourceName: sourceName,
targetName: targetName,
action: actionName,
streamId: streamId,
data: data,
desiredSize: controller.desiredSize
});
return startCapability.promise;
},
pull: function pull(controller) {
var pullCapability = createPromiseCapability();
_this2.streamControllers[streamId].pullCall = pullCapability;
_this2.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: 'pull',
streamId: streamId,
desiredSize: controller.desiredSize
});
return pullCapability.promise;
},
cancel: function cancel(reason) {
var cancelCapability = createPromiseCapability();
_this2.streamControllers[streamId].cancelCall = cancelCapability;
_this2.streamControllers[streamId].isClosed = true;
_this2.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: 'cancel',
reason: reason,
streamId: streamId
});
return cancelCapability.promise;
}
}, queueingStrategy);
},
_createStreamSink: function _createStreamSink(data) {
var _this3 = this;
var self = this;
var action = this.actionHandler[data.action];
var streamId = data.streamId;
var desiredSize = data.desiredSize;
var sourceName = this.sourceName;
var targetName = data.sourceName;
var capability = createPromiseCapability();
var sendStreamRequest = function sendStreamRequest(_ref2) {
var stream = _ref2.stream,
chunk = _ref2.chunk,
transfers = _ref2.transfers,
success = _ref2.success,
reason = _ref2.reason;
_this3.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: stream,
streamId: streamId,
chunk: chunk,
success: success,
reason: reason
}, transfers);
};
var streamSink = {
enqueue: function enqueue(chunk) {
var size = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
var transfers = arguments[2];
if (this.isCancelled) {
return;
}
var lastDesiredSize = this.desiredSize;
this.desiredSize -= size;
if (lastDesiredSize > 0 && this.desiredSize <= 0) {
this.sinkCapability = createPromiseCapability();
this.ready = this.sinkCapability.promise;
}
sendStreamRequest({
stream: 'enqueue',
chunk: chunk,
transfers: transfers
});
},
close: function close() {
if (this.isCancelled) {
return;
}
this.isCancelled = true;
sendStreamRequest({ stream: 'close' });
delete self.streamSinks[streamId];
},
error: function error(reason) {
if (this.isCancelled) {
return;
}
this.isCancelled = true;
sendStreamRequest({
stream: 'error',
reason: reason
});
},
sinkCapability: capability,
onPull: null,
onCancel: null,
isCancelled: false,
desiredSize: desiredSize,
ready: null
};
streamSink.sinkCapability.resolve();
streamSink.ready = streamSink.sinkCapability.promise;
this.streamSinks[streamId] = streamSink;
resolveCall(action[0], [data.data, streamSink], action[1]).then(function () {
sendStreamRequest({
stream: 'start_complete',
success: true
});
}, function (reason) {
sendStreamRequest({
stream: 'start_complete',
success: false,
reason: reason
});
});
},
_processStreamMessage: function _processStreamMessage(data) {
var _this4 = this;
var sourceName = this.sourceName;
var targetName = data.sourceName;
var streamId = data.streamId;
var sendStreamResponse = function sendStreamResponse(_ref3) {
var stream = _ref3.stream,
success = _ref3.success,
reason = _ref3.reason;
_this4.comObj.postMessage({
sourceName: sourceName,
targetName: targetName,
stream: stream,
success: success,
streamId: streamId,
reason: reason
});
};
var deleteStreamController = function deleteStreamController() {
Promise.all([_this4.streamControllers[data.streamId].startCall, _this4.streamControllers[data.streamId].pullCall, _this4.streamControllers[data.streamId].cancelCall].map(function (capability) {
return capability && finalize(capability.promise);
})).then(function () {
delete _this4.streamControllers[data.streamId];
});
};
switch (data.stream) {
case 'start_complete':
resolveOrReject(this.streamControllers[data.streamId].startCall, data.success, wrapReason(data.reason));
break;
case 'pull_complete':
resolveOrReject(this.streamControllers[data.streamId].pullCall, data.success, wrapReason(data.reason));
break;
case 'pull':
if (!this.streamSinks[data.streamId]) {
sendStreamResponse({
stream: 'pull_complete',
success: true
});
break;
}
if (this.streamSinks[data.streamId].desiredSize <= 0 && data.desiredSize > 0) {
this.streamSinks[data.streamId].sinkCapability.resolve();
}
this.streamSinks[data.streamId].desiredSize = data.desiredSize;
resolveCall(this.streamSinks[data.streamId].onPull).then(function () {
sendStreamResponse({
stream: 'pull_complete',
success: true
});
}, function (reason) {
sendStreamResponse({
stream: 'pull_complete',
success: false,
reason: reason
});
});
break;
case 'enqueue':
assert(this.streamControllers[data.streamId], 'enqueue should have stream controller');
if (!this.streamControllers[data.streamId].isClosed) {
this.streamControllers[data.streamId].controller.enqueue(data.chunk);
}
break;
case 'close':
assert(this.streamControllers[data.streamId], 'close should have stream controller');
if (this.streamControllers[data.streamId].isClosed) {
break;
}
this.streamControllers[data.streamId].isClosed = true;
this.streamControllers[data.streamId].controller.close();
deleteStreamController();
break;
case 'error':
assert(this.streamControllers[data.streamId], 'error should have stream controller');
this.streamControllers[data.streamId].controller.error(wrapReason(data.reason));
deleteStreamController();
break;
case 'cancel_complete':
resolveOrReject(this.streamControllers[data.streamId].cancelCall, data.success, wrapReason(data.reason));
deleteStreamController();
break;
case 'cancel':
if (!this.streamSinks[data.streamId]) {
break;
}
resolveCall(this.streamSinks[data.streamId].onCancel, [wrapReason(data.reason)]).then(function () {
sendStreamResponse({
stream: 'cancel_complete',
success: true
});
}, function (reason) {
sendStreamResponse({
stream: 'cancel_complete',
success: false,
reason: reason
});
});
this.streamSinks[data.streamId].sinkCapability.reject(wrapReason(data.reason));
this.streamSinks[data.streamId].isCancelled = true;
delete this.streamSinks[data.streamId];
break;
default:
throw new Error('Unexpected stream case');
}
},
postMessage: function postMessage(message, transfers) {
if (transfers && this.postMessageTransfers) {
this.comObj.postMessage(message, transfers);
} else {
this.comObj.postMessage(message);
}
},
destroy: function destroy() {
this.comObj.removeEventListener('message', this._onComObjOnMessage);
}
};
exports.FONT_IDENTITY_MATRIX = FONT_IDENTITY_MATRIX;
exports.IDENTITY_MATRIX = IDENTITY_MATRIX;
exports.OPS = OPS;
@ -1294,12 +811,10 @@ exports.ImageKind = ImageKind; @@ -1294,12 +811,10 @@ exports.ImageKind = ImageKind;
exports.CMapCompressionType = CMapCompressionType;
exports.AbortException = AbortException;
exports.InvalidPDFException = InvalidPDFException;
exports.MessageHandler = MessageHandler;
exports.MissingDataException = MissingDataException;
exports.MissingPDFException = MissingPDFException;
exports.NativeImageDecoding = NativeImageDecoding;
exports.NotImplementedException = NotImplementedException;
exports.PageViewport = PageViewport;
exports.PasswordException = PasswordException;
exports.PasswordResponses = PasswordResponses;
exports.StreamType = StreamType;

3
lib/test/unit/clitests_helper.js

@ -21,6 +21,8 @@ @@ -21,6 +21,8 @@
*/
'use strict';
var _util = require('../../shared/util');
var _is_node = require('../../shared/is_node');
var _is_node2 = _interopRequireDefault(_is_node);
@ -34,6 +36,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de @@ -34,6 +36,7 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
if (!(0, _is_node2.default)()) {
throw new Error('The `gulp unittestcli` command can only be used in ' + 'Node.js environments.');
}
(0, _util.setVerbosityLevel)(_util.VerbosityLevel.ERRORS);
(0, _api.setPDFNetworkStreamFactory)(function (params) {
return new _node_stream.PDFNodeStream(params);
});

2
lib/test/unit/jasmine-boot.js

@ -22,7 +22,7 @@ @@ -22,7 +22,7 @@
'use strict';
function initializePDFJS(callback) {
Promise.all(['pdfjs/display/api', 'pdfjs/display/worker_options', 'pdfjs/display/network', 'pdfjs/display/fetch_stream', 'pdfjs/shared/is_node', 'pdfjs-test/unit/annotation_spec', 'pdfjs-test/unit/api_spec', 'pdfjs-test/unit/bidi_spec', 'pdfjs-test/unit/cff_parser_spec', 'pdfjs-test/unit/cmap_spec', 'pdfjs-test/unit/colorspace_spec', 'pdfjs-test/unit/crypto_spec', 'pdfjs-test/unit/custom_spec', 'pdfjs-test/unit/display_svg_spec', 'pdfjs-test/unit/document_spec', 'pdfjs-test/unit/dom_utils_spec', 'pdfjs-test/unit/encodings_spec', 'pdfjs-test/unit/evaluator_spec', 'pdfjs-test/unit/fonts_spec', 'pdfjs-test/unit/function_spec', 'pdfjs-test/unit/metadata_spec', 'pdfjs-test/unit/murmurhash3_spec', 'pdfjs-test/unit/network_spec', 'pdfjs-test/unit/network_utils_spec', 'pdfjs-test/unit/parser_spec', 'pdfjs-test/unit/pdf_history_spec', 'pdfjs-test/unit/primitives_spec', 'pdfjs-test/unit/stream_spec', 'pdfjs-test/unit/type1_parser_spec', 'pdfjs-test/unit/ui_utils_spec', 'pdfjs-test/unit/unicode_spec', 'pdfjs-test/unit/util_spec', 'pdfjs-test/unit/util_stream_spec'].map(function (moduleName) {
Promise.all(['pdfjs/display/api', 'pdfjs/display/worker_options', 'pdfjs/display/network', 'pdfjs/display/fetch_stream', 'pdfjs/shared/is_node', 'pdfjs-test/unit/annotation_spec', 'pdfjs-test/unit/api_spec', 'pdfjs-test/unit/bidi_spec', 'pdfjs-test/unit/cff_parser_spec', 'pdfjs-test/unit/cmap_spec', 'pdfjs-test/unit/colorspace_spec', 'pdfjs-test/unit/crypto_spec', 'pdfjs-test/unit/custom_spec', 'pdfjs-test/unit/display_svg_spec', 'pdfjs-test/unit/document_spec', 'pdfjs-test/unit/dom_utils_spec', 'pdfjs-test/unit/encodings_spec', 'pdfjs-test/unit/evaluator_spec', 'pdfjs-test/unit/fonts_spec', 'pdfjs-test/unit/function_spec', 'pdfjs-test/unit/message_handler_spec', 'pdfjs-test/unit/metadata_spec', 'pdfjs-test/unit/murmurhash3_spec', 'pdfjs-test/unit/network_spec', 'pdfjs-test/unit/network_utils_spec', 'pdfjs-test/unit/parser_spec', 'pdfjs-test/unit/pdf_history_spec', 'pdfjs-test/unit/primitives_spec', 'pdfjs-test/unit/stream_spec', 'pdfjs-test/unit/type1_parser_spec', 'pdfjs-test/unit/ui_utils_spec', 'pdfjs-test/unit/unicode_spec', 'pdfjs-test/unit/util_spec'].map(function (moduleName) {
return SystemJS.import(moduleName);
})).then(function (modules) {
var displayApi = modules[0];

87
lib/test/unit/util_stream_spec.js → lib/test/unit/message_handler_spec.js

@ -23,54 +23,13 @@ @@ -23,54 +23,13 @@
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _util = require('../../shared/util');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
describe('util_stream', function () {
var FakePort = function () {
function FakePort() {
_classCallCheck(this, FakePort);
this._listeners = [];
this._deferred = Promise.resolve(undefined);
}
_createClass(FakePort, [{
key: 'postMessage',
value: function postMessage(obj) {
var _this = this;
var event = { data: obj };
this._deferred.then(function () {
_this._listeners.forEach(function (listener) {
listener.call(this, event);
}, _this);
});
}
}, {
key: 'addEventListener',
value: function addEventListener(name, listener) {
this._listeners.push(listener);
}
}, {
key: 'removeEventListener',
value: function removeEventListener(name, listener) {
var i = this._listeners.indexOf(listener);
this._listeners.splice(i, 1);
}
}, {
key: 'terminate',
value: function terminate() {
this._listeners = [];
}
}]);
var _api = require('../../display/api');
return FakePort;
}();
var _message_handler = require('../../shared/message_handler');
describe('message_handler', function () {
function sleep(ticks) {
return Promise.resolve().then(function () {
return ticks && sleep(ticks - 1);
@ -78,17 +37,17 @@ describe('util_stream', function () { @@ -78,17 +37,17 @@ describe('util_stream', function () {
}
describe('sendWithStream', function () {
it('should return a ReadableStream', function () {
var port = new FakePort();
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var port = new _api.LoopbackPort();
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var readable = messageHandler1.sendWithStream('fakeHandler');
expect(typeof readable === 'undefined' ? 'undefined' : _typeof(readable)).toEqual('object');
expect(_typeof(readable.getReader)).toEqual('function');
});
it('should read using a reader', function (done) {
var log = '';
var port = new FakePort();
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
var port = new _api.LoopbackPort();
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
messageHandler2.on('fakeHandler', function (data, sink) {
sink.onPull = function () {
log += 'p';
@ -129,8 +88,8 @@ describe('util_stream', function () { @@ -129,8 +88,8 @@ describe('util_stream', function () {
});
it('should not read any data when cancelled', function (done) {
var log = '';
var port = new FakePort();
var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
var port = new _api.LoopbackPort();
var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
messageHandler2.on('fakeHandler', function (data, sink) {
sink.onPull = function () {
log += 'p';
@ -154,7 +113,7 @@ describe('util_stream', function () { @@ -154,7 +113,7 @@ describe('util_stream', function () {
log += '4';
});
});
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
highWaterMark: 4,
size: function size(arr) {
@ -179,8 +138,8 @@ describe('util_stream', function () { @@ -179,8 +138,8 @@ describe('util_stream', function () {
});
it('should not read when errored', function (done) {
var log = '';
var port = new FakePort();
var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
var port = new _api.LoopbackPort();
var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
messageHandler2.on('fakeHandler', function (data, sink) {
sink.onPull = function () {
log += 'p';
@ -196,7 +155,7 @@ describe('util_stream', function () { @@ -196,7 +155,7 @@ describe('util_stream', function () {
sink.error('error');
});
});
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
highWaterMark: 4,
size: function size(arr) {
@ -218,8 +177,8 @@ describe('util_stream', function () { @@ -218,8 +177,8 @@ describe('util_stream', function () {
});
it('should read data with blocking promise', function (done) {
var log = '';
var port = new FakePort();
var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
var port = new _api.LoopbackPort();
var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
messageHandler2.on('fakeHandler', function (data, sink) {
sink.onPull = function () {
log += 'p';
@ -240,7 +199,7 @@ describe('util_stream', function () { @@ -240,7 +199,7 @@ describe('util_stream', function () {
sink.close();
});
});
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
highWaterMark: 4,
size: function size(arr) {
@ -273,8 +232,8 @@ describe('util_stream', function () { @@ -273,8 +232,8 @@ describe('util_stream', function () {
});
it('should read data with blocking promise and buffer whole data' + ' into stream', function (done) {
var log = '';
var port = new FakePort();
var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
var port = new _api.LoopbackPort();
var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
messageHandler2.on('fakeHandler', function (data, sink) {
sink.onPull = function () {
log += 'p';
@ -296,7 +255,7 @@ describe('util_stream', function () { @@ -296,7 +255,7 @@ describe('util_stream', function () {
});
return sleep(10);
});
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
highWaterMark: 8,
size: function size(arr) {
@ -329,9 +288,9 @@ describe('util_stream', function () { @@ -329,9 +288,9 @@ describe('util_stream', function () {
});
it('should ignore any pull after close is called', function (done) {
var log = '';
var port = new FakePort();
var port = new _api.LoopbackPort();
var capability = (0, _util.createPromiseCapability)();
var messageHandler2 = new _util.MessageHandler('worker', 'main', port);
var messageHandler2 = new _message_handler.MessageHandler('worker', 'main', port);
messageHandler2.on('fakeHandler', function (data, sink) {
sink.onPull = function () {
log += 'p';
@ -348,7 +307,7 @@ describe('util_stream', function () { @@ -348,7 +307,7 @@ describe('util_stream', function () {
sink.close();
});
});
var messageHandler1 = new _util.MessageHandler('main', 'worker', port);
var messageHandler1 = new _message_handler.MessageHandler('main', 'worker', port);
var readable = messageHandler1.sendWithStream('fakeHandler', {}, {
highWaterMark: 10,
size: function size(arr) {

238
lib/test/unit/ui_utils_spec.js

@ -21,6 +21,8 @@ @@ -21,6 +21,8 @@
*/
'use strict';
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
var _ui_utils = require('../../web/ui_utils');
var _util = require('../../shared/util');
@ -378,4 +380,240 @@ describe('ui_utils', function () { @@ -378,4 +380,240 @@ describe('ui_utils', function () {
expect(height2).toEqual(8.5);
});
});
describe('getVisibleElements', function () {
var BORDER_WIDTH = 9;
var SPACING = 2 * BORDER_WIDTH - 7;
function makePages(lines) {
var result = [];
var lineTop = 0,
id = 0;
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = lines[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var line = _step.value;
var lineHeight = line.reduce(function (maxHeight, pair) {
return Math.max(maxHeight, pair[1]);
}, 0);
var offsetLeft = -BORDER_WIDTH;
var _iteratorNormalCompletion2 = true;
var _didIteratorError2 = false;
var _iteratorError2 = undefined;
try {
for (var _iterator2 = line[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
var _ref = _step2.value;
var _ref2 = _slicedToArray(_ref, 2);
var clientWidth = _ref2[0];
var clientHeight = _ref2[1];
var offsetTop = lineTop + (lineHeight - clientHeight) / 2 - BORDER_WIDTH;
var div = {
offsetLeft: offsetLeft,
offsetTop: offsetTop,
clientWidth: clientWidth,
clientHeight: clientHeight,
clientLeft: BORDER_WIDTH,
clientTop: BORDER_WIDTH
};
result.push({
id: id,
div: div
});
++id;
offsetLeft += clientWidth + SPACING;
}
} catch (err) {
_didIteratorError2 = true;
_iteratorError2 = err;
} finally {
try {
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
} finally {
if (_didIteratorError2) {
throw _iteratorError2;
}
}
}
lineTop += lineHeight + SPACING;
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return result;
}
function slowGetVisibleElements(scroll, pages) {
var views = [];
var scrollLeft = scroll.scrollLeft,
scrollTop = scroll.scrollTop;
var scrollRight = scrollLeft + scroll.clientWidth;
var scrollBottom = scrollTop + scroll.clientHeight;
var _iteratorNormalCompletion3 = true;
var _didIteratorError3 = false;
var _iteratorError3 = undefined;
try {
for (var _iterator3 = pages[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
var view = _step3.value;
var div = view.div;
var viewLeft = div.offsetLeft + div.clientLeft;
var viewRight = viewLeft + div.clientWidth;
var viewTop = div.offsetTop + div.clientTop;
var viewBottom = viewTop + div.clientHeight;
if (viewLeft < scrollRight && viewRight > scrollLeft && viewTop < scrollBottom && viewBottom > scrollTop) {
var hiddenHeight = Math.max(0, scrollTop - viewTop) + Math.max(0, viewBottom - scrollBottom);
var hiddenWidth = Math.max(0, scrollLeft - viewLeft) + Math.max(0, viewRight - scrollRight);
var visibleArea = (div.clientHeight - hiddenHeight) * (div.clientWidth - hiddenWidth);
var percent = visibleArea * 100 / div.clientHeight / div.clientWidth | 0;
views.push({
id: view.id,
x: viewLeft,
y: viewTop,
view: view,
percent: percent
});
}
}
} catch (err) {
_didIteratorError3 = true;
_iteratorError3 = err;
} finally {
try {
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
} finally {
if (_didIteratorError3) {
throw _iteratorError3;
}
}
}
return {
first: views[0],
last: views[views.length - 1],
views: views
};
}
function scrollOverDocument(pages) {
var horizontally = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
var size = pages.reduce(function (max, _ref3) {
var div = _ref3.div;
return Math.max(max, horizontally ? div.offsetLeft + div.clientLeft + div.clientWidth : div.offsetTop + div.clientTop + div.clientHeight);
}, 0);
for (var i = 0; i < size; i += 7) {
for (var j = i + 5; j < size; j += j - i) {
var scroll = horizontally ? {
scrollTop: 0,
scrollLeft: i,
clientHeight: 10000,
clientWidth: j - i
} : {
scrollTop: i,
scrollLeft: 0,
clientHeight: j - i,
clientWidth: 10000
};
expect((0, _ui_utils.getVisibleElements)(scroll, pages, false, horizontally)).toEqual(slowGetVisibleElements(scroll, pages));
}
}
}
it('with pages of varying height', function () {
var pages = makePages([[[50, 20], [20, 50]], [[30, 12], [12, 30]], [[20, 50], [50, 20]], [[50, 20], [20, 50]]]);
scrollOverDocument(pages);
});
it('widescreen challenge', function () {
var pages = makePages([[[10, 50], [10, 60], [10, 70], [10, 80], [10, 90]], [[10, 90], [10, 80], [10, 70], [10, 60], [10, 50]], [[10, 50], [10, 60], [10, 70], [10, 80], [10, 90]]]);
scrollOverDocument(pages);
});
it('works with horizontal scrolling', function () {
var pages = makePages([[[10, 50], [20, 20], [30, 10]]]);
scrollOverDocument(pages, true);
});
describe('backtrackBeforeAllVisibleElements', function () {
var tallPage = [10, 50];
var shortPage = [10, 10];
var top1 = 20 + SPACING + 40;
var top2 = 20 + SPACING + 10;
it('handles case 1', function () {
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, shortPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]], [[10, 20]]]);
var bsResult = 4;
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top1)).toEqual(4);
});
it('handles case 2', function () {
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, tallPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]]]);
var bsResult = 6;
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top1)).toEqual(4);
});
it('handles case 3', function () {
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, shortPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]]]);
var bsResult = 8;
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top1)).toEqual(4);
});
it('handles case 4', function () {
var pages = makePages([[[10, 20], [10, 20], [10, 20], [10, 20]], [tallPage, shortPage, tallPage, shortPage], [[10, 50], [10, 50], [10, 50], [10, 50]], [[10, 20], [10, 20], [10, 20], [10, 20]]]);
var bsResult = 4;
expect((0, _ui_utils.backtrackBeforeAllVisibleElements)(bsResult, pages, top2)).toEqual(4);
});
});
});
describe('moveToEndOfArray', function () {
it('works on empty arrays', function () {
var data = [];
(0, _ui_utils.moveToEndOfArray)(data, function () {});
expect(data).toEqual([]);
});
it('works when moving everything', function () {
var data = [1, 2, 3, 4, 5];
(0, _ui_utils.moveToEndOfArray)(data, function () {
return true;
});
expect(data).toEqual([1, 2, 3, 4, 5]);
});
it('works when moving some things', function () {
var data = [1, 2, 3, 4, 5];
(0, _ui_utils.moveToEndOfArray)(data, function (x) {
return x % 2 === 0;
});
expect(data).toEqual([1, 3, 5, 2, 4]);
});
it('works when moving one thing', function () {
var data = [1, 2, 3, 4, 5];
(0, _ui_utils.moveToEndOfArray)(data, function (x) {
return x === 1;
});
expect(data).toEqual([2, 3, 4, 5, 1]);
});
it('works when moving nothing', function () {
var data = [1, 2, 3, 4, 5];
(0, _ui_utils.moveToEndOfArray)(data, function (x) {
return x === 0;
});
expect(data).toEqual([1, 2, 3, 4, 5]);
});
});
});

131
lib/web/app.js

@ -213,6 +213,10 @@ var PDFViewerApplication = { @@ -213,6 +213,10 @@ var PDFViewerApplication = {
_app_options.AppOptions.set('disablePageLabels', value);
}), preferences.get('enablePrintAutoRotate').then(function resolved(value) {
_app_options.AppOptions.set('enablePrintAutoRotate', value);
}), preferences.get('scrollModeOnLoad').then(function resolved(value) {
_app_options.AppOptions.set('scrollModeOnLoad', value);
}), preferences.get('spreadModeOnLoad').then(function resolved(value) {
_app_options.AppOptions.set('spreadModeOnLoad', value);
})]).catch(function (reason) {});
},
_parseHashParameters: function _parseHashParameters() {
@ -549,11 +553,6 @@ var PDFViewerApplication = { @@ -549,11 +553,6 @@ var PDFViewerApplication = {
parameters[prop] = args[prop];
}
}
if (this.url && (0, _ui_utils.isFileSchema)(this.url)) {
var appConfig = this.appConfig;
appConfig.toolbar.download.setAttribute('hidden', 'true');
appConfig.secondaryToolbar.downloadButton.setAttribute('hidden', 'true');
}
var loadingTask = (0, _pdf.getDocument)(parameters);
this.pdfLoadingTask = loadingTask;
loadingTask.onPassword = function (updateCallback, reason) {
@ -733,7 +732,9 @@ var PDFViewerApplication = { @@ -733,7 +732,9 @@ var PDFViewerApplication = {
scrollLeft: '0',
scrollTop: '0',
rotation: null,
sidebarView: _pdf_sidebar.SidebarView.NONE
sidebarView: _pdf_sidebar.SidebarView.NONE,
scrollMode: null,
spreadMode: null
}).catch(function () {});
Promise.all([storePromise, pageModePromise]).then(function (_ref2) {
var _ref3 = _slicedToArray(_ref2, 2),
@ -744,10 +745,18 @@ var PDFViewerApplication = { @@ -744,10 +745,18 @@ var PDFViewerApplication = {
var hash = _app_options.AppOptions.get('defaultZoomValue') ? 'zoom=' + _app_options.AppOptions.get('defaultZoomValue') : null;
var rotation = null;
var sidebarView = _app_options.AppOptions.get('sidebarViewOnLoad');
var scrollMode = _app_options.AppOptions.get('scrollModeOnLoad');
var spreadMode = _app_options.AppOptions.get('spreadModeOnLoad');
if (values.exists && _app_options.AppOptions.get('showPreviousViewOnLoad')) {
hash = 'page=' + values.page + '&zoom=' + (_app_options.AppOptions.get('defaultZoomValue') || values.zoom) + ',' + values.scrollLeft + ',' + values.scrollTop;
rotation = parseInt(values.rotation, 10);
sidebarView = sidebarView || values.sidebarView | 0;
if (values.scrollMode !== null) {
scrollMode = values.scrollMode;
}
if (values.spreadMode !== null) {
spreadMode = values.spreadMode;
}
}
if (pageMode && !_app_options.AppOptions.get('disablePageMode')) {
sidebarView = sidebarView || apiPageModeToSidebarView(pageMode);
@ -755,18 +764,24 @@ var PDFViewerApplication = { @@ -755,18 +764,24 @@ var PDFViewerApplication = {
return {
hash: hash,
rotation: rotation,
sidebarView: sidebarView
sidebarView: sidebarView,
scrollMode: scrollMode,
spreadMode: spreadMode
};
}).then(function (_ref4) {
var hash = _ref4.hash,
rotation = _ref4.rotation,
sidebarView = _ref4.sidebarView;
sidebarView = _ref4.sidebarView,
scrollMode = _ref4.scrollMode,
spreadMode = _ref4.spreadMode;
initialParams.bookmark = _this6.initialBookmark;
initialParams.hash = hash;
_this6.setInitialView(hash, {
rotation: rotation,
sidebarView: sidebarView
sidebarView: sidebarView,
scrollMode: scrollMode,
spreadMode: spreadMode
});
if (!_this6.isViewerEmbedded) {
pdfViewer.focus();
@ -876,15 +891,23 @@ var PDFViewerApplication = { @@ -876,15 +891,23 @@ var PDFViewerApplication = {
setInitialView: function setInitialView(storedHash) {
var _this7 = this;
var _ref6 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
rotation = _ref6.rotation,
sidebarView = _ref6.sidebarView;
var values = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var rotation = values.rotation,
sidebarView = values.sidebarView,
scrollMode = values.scrollMode,
spreadMode = values.spreadMode;
var setRotation = function setRotation(angle) {
if ((0, _ui_utils.isValidRotation)(angle)) {
_this7.pdfViewer.pagesRotation = angle;
}
};
if (Number.isInteger(scrollMode)) {
this.pdfViewer.setScrollMode(scrollMode);
}
if (Number.isInteger(spreadMode)) {
this.pdfViewer.setSpreadMode(spreadMode);
}
this.isInitialViewSet = true;
this.pdfSidebar.setInitialView(sidebarView);
if (this.initialBookmark) {
@ -997,6 +1020,10 @@ var PDFViewerApplication = { @@ -997,6 +1020,10 @@ var PDFViewerApplication = {
eventBus.on('scalechanged', webViewerScaleChanged);
eventBus.on('rotatecw', webViewerRotateCw);
eventBus.on('rotateccw', webViewerRotateCcw);
eventBus.on('switchscrollmode', webViewerSwitchScrollMode);
eventBus.on('scrollmodechanged', webViewerScrollModeChanged);
eventBus.on('switchspreadmode', webViewerSwitchSpreadMode);
eventBus.on('spreadmodechanged', webViewerSpreadModeChanged);
eventBus.on('documentproperties', webViewerDocumentProperties);
eventBus.on('find', webViewerFind);
eventBus.on('findfromurlhash', webViewerFindFromUrlHash);
@ -1058,6 +1085,10 @@ var PDFViewerApplication = { @@ -1058,6 +1085,10 @@ var PDFViewerApplication = {
eventBus.off('scalechanged', webViewerScaleChanged);
eventBus.off('rotatecw', webViewerRotateCw);
eventBus.off('rotateccw', webViewerRotateCcw);
eventBus.off('switchscrollmode', webViewerSwitchScrollMode);
eventBus.off('scrollmodechanged', webViewerScrollModeChanged);
eventBus.off('switchspreadmode', webViewerSwitchSpreadMode);
eventBus.off('spreadmodechanged', webViewerSpreadModeChanged);
eventBus.off('documentproperties', webViewerDocumentProperties);
eventBus.off('find', webViewerFind);
eventBus.off('findfromurlhash', webViewerFindFromUrlHash);
@ -1094,9 +1125,9 @@ var validateFileURL = void 0; @@ -1094,9 +1125,9 @@ var validateFileURL = void 0;
return;
}
var _ref7 = new URL(file, window.location.href),
origin = _ref7.origin,
protocol = _ref7.protocol;
var _ref6 = new URL(file, window.location.href),
origin = _ref6.origin,
protocol = _ref6.protocol;
if (origin !== viewerOrigin && protocol !== 'blob:') {
throw new Error('file origin does not match viewer\'s');
@ -1311,6 +1342,18 @@ function webViewerUpdateViewarea(evt) { @@ -1311,6 +1342,18 @@ function webViewerUpdateViewarea(evt) {
var loading = currentPage.renderingState !== _pdf_rendering_queue.RenderingStates.FINISHED;
PDFViewerApplication.toolbar.updateLoadingIndicatorState(loading);
}
function webViewerScrollModeChanged(evt) {
var store = PDFViewerApplication.store;
if (store && PDFViewerApplication.isInitialViewSet) {
store.set('scrollMode', evt.mode).catch(function () {});
}
}
function webViewerSpreadModeChanged(evt) {
var store = PDFViewerApplication.store;
if (store && PDFViewerApplication.isInitialViewSet) {
store.set('spreadMode', evt.mode).catch(function () {});
}
}
function webViewerResize() {
var pdfDocument = PDFViewerApplication.pdfDocument,
pdfViewer = PDFViewerApplication.pdfViewer;
@ -1408,6 +1451,12 @@ function webViewerRotateCw() { @@ -1408,6 +1451,12 @@ function webViewerRotateCw() {
function webViewerRotateCcw() {
PDFViewerApplication.rotatePages(-90);
}
function webViewerSwitchScrollMode(evt) {
PDFViewerApplication.pdfViewer.setScrollMode(evt.mode);
}
function webViewerSwitchSpreadMode(evt) {
PDFViewerApplication.pdfViewer.setSpreadMode(evt.mode);
}
function webViewerDocumentProperties() {
PDFViewerApplication.pdfDocumentProperties.open();
}
@ -1612,23 +1661,29 @@ function webViewerKeyDown(evt) { @@ -1612,23 +1661,29 @@ function webViewerKeyDown(evt) {
}
}
if (cmd === 0) {
var turnPage = 0,
turnOnlyIfPageFit = false;
switch (evt.keyCode) {
case 38:
case 33:
if (pdfViewer.isVerticalScrollbarEnabled) {
turnOnlyIfPageFit = true;
}
turnPage = -1;
break;
case 8:
if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {
break;
if (!isViewerInPresentationMode) {
turnOnlyIfPageFit = true;
}
turnPage = -1;
break;
case 37:
if (pdfViewer.isHorizontalScrollbarEnabled) {
break;
turnOnlyIfPageFit = true;
}
case 75:
case 80:
if (PDFViewerApplication.page > 1) {
PDFViewerApplication.page--;
}
handled = true;
turnPage = -1;
break;
case 27:
if (PDFViewerApplication.secondaryToolbar.isOpen) {
@ -1640,23 +1695,27 @@ function webViewerKeyDown(evt) { @@ -1640,23 +1695,27 @@ function webViewerKeyDown(evt) {
handled = true;
}
break;
case 13:
case 40:
case 34:
if (pdfViewer.isVerticalScrollbarEnabled) {
turnOnlyIfPageFit = true;
}
turnPage = 1;
break;
case 13:
case 32:
if (!isViewerInPresentationMode && pdfViewer.currentScaleValue !== 'page-fit') {
break;
if (!isViewerInPresentationMode) {
turnOnlyIfPageFit = true;
}
turnPage = 1;
break;
case 39:
if (pdfViewer.isHorizontalScrollbarEnabled) {
break;
turnOnlyIfPageFit = true;
}
case 74:
case 78:
if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
PDFViewerApplication.page++;
}
handled = true;
turnPage = 1;
break;
case 36:
if (isViewerInPresentationMode || PDFViewerApplication.page > 1) {
@ -1682,6 +1741,18 @@ function webViewerKeyDown(evt) { @@ -1682,6 +1741,18 @@ function webViewerKeyDown(evt) {
PDFViewerApplication.rotatePages(90);
break;
}
if (turnPage !== 0 && (!turnOnlyIfPageFit || pdfViewer.currentScaleValue === 'page-fit')) {
if (turnPage > 0) {
if (PDFViewerApplication.page < PDFViewerApplication.pagesCount) {
PDFViewerApplication.page++;
}
} else {
if (PDFViewerApplication.page > 1) {
PDFViewerApplication.page--;
}
}
handled = true;
}
}
if (cmd === 4) {
switch (evt.keyCode) {

85
lib/web/base_viewer.js

@ -24,7 +24,7 @@ @@ -24,7 +24,7 @@
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.BaseViewer = undefined;
exports.SpreadMode = exports.ScrollMode = exports.BaseViewer = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@ -47,6 +47,16 @@ var _text_layer_builder = require('./text_layer_builder'); @@ -47,6 +47,16 @@ var _text_layer_builder = require('./text_layer_builder');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var DEFAULT_CACHE_SIZE = 10;
var ScrollMode = {
VERTICAL: 0,
HORIZONTAL: 1,
WRAPPED: 2
};
var SpreadMode = {
NONE: 0,
ODD: 1,
EVEN: 2
};
function PDFPageViewBuffer(size) {
var data = [];
this.push = function (view) {
@ -59,8 +69,17 @@ function PDFPageViewBuffer(size) { @@ -59,8 +69,17 @@ function PDFPageViewBuffer(size) {
data.shift().destroy();
}
};
this.resize = function (newSize) {
this.resize = function (newSize, pagesToKeep) {
size = newSize;
if (pagesToKeep) {
var pageIdsToKeep = new Set();
for (var i = 0, iMax = pagesToKeep.length; i < iMax; ++i) {
pageIdsToKeep.add(pagesToKeep[i].id);
}
(0, _ui_utils.moveToEndOfArray)(data, function (page) {
return pageIdsToKeep.has(page.id);
});
}
while (data.length > size) {
data.shift().destroy();
}
@ -100,6 +119,8 @@ var BaseViewer = function () { @@ -100,6 +119,8 @@ var BaseViewer = function () {
this.useOnlyCssZoom = options.useOnlyCssZoom || false;
this.maxCanvasPixels = options.maxCanvasPixels;
this.l10n = options.l10n || _ui_utils.NullL10n;
this.scrollMode = options.scrollMode || ScrollMode.VERTICAL;
this.spreadMode = options.spreadMode || SpreadMode.NONE;
this.defaultRenderingQueue = !options.renderingQueue;
if (this.defaultRenderingQueue) {
this.renderingQueue = new _pdf_rendering_queue.PDFRenderingQueue();
@ -113,6 +134,7 @@ var BaseViewer = function () { @@ -113,6 +134,7 @@ var BaseViewer = function () {
if (this.removePageBorders) {
this.viewer.classList.add('removePageBorders');
}
this._updateScrollModeClasses();
}
_createClass(BaseViewer, [{
@ -215,6 +237,9 @@ var BaseViewer = function () { @@ -215,6 +237,9 @@ var BaseViewer = function () {
bindOnAfterAndBeforeDraw(pageView);
_this._pages.push(pageView);
}
if (_this.spreadMode !== SpreadMode.NONE) {
_this._regroupSpreads();
}
onePageRenderedCapability.promise.then(function () {
if (pdfDocument.loadingParams['disableAutoFetch']) {
pagesCapability.resolve();
@ -372,6 +397,11 @@ var BaseViewer = function () { @@ -372,6 +397,11 @@ var BaseViewer = function () {
}
var hPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.SCROLLBAR_PADDING;
var vPadding = this.isInPresentationMode || this.removePageBorders ? 0 : _ui_utils.VERTICAL_PADDING;
if (this.scrollMode === ScrollMode.HORIZONTAL) {
var temp = hPadding;
hPadding = vPadding;
vPadding = temp;
}
var pageWidthScale = (this.container.clientWidth - hPadding) / currentPage.width * currentPage.scale;
var pageHeightScale = (this.container.clientHeight - vPadding) / currentPage.height * currentPage.scale;
switch (value) {
@ -508,9 +538,9 @@ var BaseViewer = function () { @@ -508,9 +538,9 @@ var BaseViewer = function () {
}
}, {
key: '_resizeBuffer',
value: function _resizeBuffer(numVisiblePages) {
value: function _resizeBuffer(numVisiblePages, visiblePages) {
var suggestedCacheSize = Math.max(DEFAULT_CACHE_SIZE, 2 * numVisiblePages + 1);
this._buffer.resize(suggestedCacheSize);
this._buffer.resize(suggestedCacheSize, visiblePages);
}
}, {
key: '_updateLocation',
@ -605,7 +635,8 @@ var BaseViewer = function () { @@ -605,7 +635,8 @@ var BaseViewer = function () {
var _this3 = this;
var visiblePages = currentlyVisiblePages || this._getVisiblePages();
var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, this.scroll.down);
var scrollAhead = this.scrollMode === ScrollMode.HORIZONTAL ? this.scroll.right : this.scroll.down;
var pageView = this.renderingQueue.getHighestPriority(visiblePages, this._pages, scrollAhead);
if (pageView) {
this._ensurePdfPageLoaded(pageView).then(function () {
_this3.renderingQueue.renderView(pageView);
@ -683,6 +714,41 @@ var BaseViewer = function () { @@ -683,6 +714,41 @@ var BaseViewer = function () {
};
});
}
}, {
key: 'setScrollMode',
value: function setScrollMode(mode) {
if (mode !== this.scrollMode) {
this.scrollMode = mode;
this._updateScrollModeClasses();
this.eventBus.dispatch('scrollmodechanged', { mode: mode });
var pageNumber = this._currentPageNumber;
if (isNaN(this._currentScaleValue)) {
this._setScale(this._currentScaleValue, this.isInPresentationMode);
}
this.scrollPageIntoView({ pageNumber: pageNumber });
this.update();
}
}
}, {
key: '_updateScrollModeClasses',
value: function _updateScrollModeClasses() {
var mode = this.scrollMode,
classList = this.viewer.classList;
classList.toggle('scrollHorizontal', mode === ScrollMode.HORIZONTAL);
classList.toggle('scrollWrapped', mode === ScrollMode.WRAPPED);
}
}, {
key: 'setSpreadMode',
value: function setSpreadMode(mode) {
if (mode !== this.spreadMode) {
this.spreadMode = mode;
this.eventBus.dispatch('spreadmodechanged', { mode: mode });
this._regroupSpreads();
}
}
}, {
key: '_regroupSpreads',
value: function _regroupSpreads() {}
}, {
key: 'pagesCount',
get: function get() {
@ -800,6 +866,11 @@ var BaseViewer = function () { @@ -800,6 +866,11 @@ var BaseViewer = function () {
get: function get() {
return this.isInPresentationMode ? false : this.container.scrollWidth > this.container.clientWidth;
}
}, {
key: 'isVerticalScrollbarEnabled',
get: function get() {
return this.isInPresentationMode ? false : this.container.scrollHeight > this.container.clientHeight;
}
}, {
key: 'hasEqualPageSizes',
get: function get() {
@ -817,4 +888,6 @@ var BaseViewer = function () { @@ -817,4 +888,6 @@ var BaseViewer = function () {
return BaseViewer;
}();
exports.BaseViewer = BaseViewer;
exports.BaseViewer = BaseViewer;
exports.ScrollMode = ScrollMode;
exports.SpreadMode = SpreadMode;

4
lib/web/pdf_viewer.component.js

@ -48,8 +48,8 @@ var _pdf_single_page_viewer = require('./pdf_single_page_viewer'); @@ -48,8 +48,8 @@ var _pdf_single_page_viewer = require('./pdf_single_page_viewer');
var _pdf_viewer = require('./pdf_viewer.js');
var pdfjsVersion = '2.0.489';
var pdfjsBuild = '7d7bc80e';
var pdfjsVersion = '2.0.550';
var pdfjsBuild = '76337fdc';
exports.PDFViewer = _pdf_viewer.PDFViewer;
exports.PDFSinglePageViewer = _pdf_single_page_viewer.PDFSinglePageViewer;
exports.PDFPageView = _pdf_page_view.PDFPageView;

52
lib/web/pdf_viewer.js

@ -28,10 +28,10 @@ exports.PDFViewer = undefined; @@ -28,10 +28,10 @@ exports.PDFViewer = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _ui_utils = require('./ui_utils');
var _base_viewer = require('./base_viewer');
var _ui_utils = require('./ui_utils');
var _pdf = require('../pdf');
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
@ -56,13 +56,27 @@ var PDFViewer = function (_BaseViewer) { @@ -56,13 +56,27 @@ var PDFViewer = function (_BaseViewer) {
_ref$pageSpot = _ref.pageSpot,
pageSpot = _ref$pageSpot === undefined ? null : _ref$pageSpot;
if (!pageSpot) {
var left = pageDiv.offsetLeft + pageDiv.clientLeft;
var right = left + pageDiv.clientWidth;
var _container = this.container,
scrollLeft = _container.scrollLeft,
clientWidth = _container.clientWidth;
if (this.scrollMode === _base_viewer.ScrollMode.HORIZONTAL || left < scrollLeft || right > scrollLeft + clientWidth) {
pageSpot = {
left: 0,
top: 0
};
}
}
(0, _ui_utils.scrollIntoView)(pageDiv, pageSpot);
}
}, {
key: '_getVisiblePages',
value: function _getVisiblePages() {
if (!this.isInPresentationMode) {
return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true);
return (0, _ui_utils.getVisibleElements)(this.container, this._pages, true, this.scrollMode === _base_viewer.ScrollMode.HORIZONTAL);
}
var currentPage = this._pages[this._currentPageNumber - 1];
var visible = [{
@ -84,7 +98,7 @@ var PDFViewer = function (_BaseViewer) { @@ -84,7 +98,7 @@ var PDFViewer = function (_BaseViewer) {
if (numVisiblePages === 0) {
return;
}
this._resizeBuffer(numVisiblePages);
this._resizeBuffer(numVisiblePages, visiblePages);
this.renderingQueue.renderHighestPriority(visible);
var currentId = this._currentPageNumber;
var stillFullyVisible = false;
@ -110,6 +124,36 @@ var PDFViewer = function (_BaseViewer) { @@ -110,6 +124,36 @@ var PDFViewer = function (_BaseViewer) {
location: this._location
});
}
}, {
key: '_regroupSpreads',
value: function _regroupSpreads() {
var container = this._setDocumentViewerElement,
pages = this._pages;
while (container.firstChild) {
container.firstChild.remove();
}
if (this.spreadMode === _base_viewer.SpreadMode.NONE) {
for (var i = 0, iMax = pages.length; i < iMax; ++i) {
container.appendChild(pages[i].div);
}
} else {
var parity = this.spreadMode - 1;
var spread = null;
for (var _i = 0, _iMax = pages.length; _i < _iMax; ++_i) {
if (spread === null) {
spread = document.createElement('div');
spread.className = 'spread';
container.appendChild(spread);
} else if (_i % 2 === parity) {
spread = spread.cloneNode(false);
container.appendChild(spread);
}
spread.appendChild(pages[_i].div);
}
}
this.scrollPageIntoView({ pageNumber: this._currentPageNumber });
this.update();
}
}, {
key: '_setDocumentViewerElement',
get: function get() {

4
lib/web/preferences.js

@ -55,7 +55,9 @@ function getDefaultPreferences() { @@ -55,7 +55,9 @@ function getDefaultPreferences() {
"renderInteractiveForms": false,
"enablePrintAutoRotate": false,
"disablePageMode": false,
"disablePageLabels": false
"disablePageLabels": false,
"scrollModeOnLoad": 0,
"spreadModeOnLoad": 0
});
}
return defaultPreferences;

52
lib/web/secondary_toolbar.js

@ -28,6 +28,8 @@ exports.SecondaryToolbar = undefined; @@ -28,6 +28,8 @@ exports.SecondaryToolbar = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _base_viewer = require('./base_viewer');
var _pdf_cursor_tools = require('./pdf_cursor_tools');
var _ui_utils = require('./ui_utils');
@ -87,6 +89,36 @@ var SecondaryToolbar = function () { @@ -87,6 +89,36 @@ var SecondaryToolbar = function () {
eventName: 'switchcursortool',
eventDetails: { tool: _pdf_cursor_tools.CursorTool.HAND },
close: true
}, {
element: options.scrollVerticalButton,
eventName: 'switchscrollmode',
eventDetails: { mode: _base_viewer.ScrollMode.VERTICAL },
close: true
}, {
element: options.scrollHorizontalButton,
eventName: 'switchscrollmode',
eventDetails: { mode: _base_viewer.ScrollMode.HORIZONTAL },
close: true
}, {
element: options.scrollWrappedButton,
eventName: 'switchscrollmode',
eventDetails: { mode: _base_viewer.ScrollMode.WRAPPED },
close: true
}, {
element: options.spreadNoneButton,
eventName: 'switchspreadmode',
eventDetails: { mode: _base_viewer.SpreadMode.NONE },
close: true
}, {
element: options.spreadOddButton,
eventName: 'switchspreadmode',
eventDetails: { mode: _base_viewer.SpreadMode.ODD },
close: true
}, {
element: options.spreadEvenButton,
eventName: 'switchspreadmode',
eventDetails: { mode: _base_viewer.SpreadMode.EVEN },
close: true
}, {
element: options.documentPropertiesButton,
eventName: 'documentproperties',
@ -106,6 +138,8 @@ var SecondaryToolbar = function () { @@ -106,6 +138,8 @@ var SecondaryToolbar = function () {
this.reset();
this._bindClickListeners();
this._bindCursorToolsListener(options);
this._bindScrollModeListener(options);
this._bindSpreadModeListener(options);
this.eventBus.on('resize', this._setMaxHeight.bind(this));
}
@ -184,6 +218,24 @@ var SecondaryToolbar = function () { @@ -184,6 +218,24 @@ var SecondaryToolbar = function () {
}
});
}
}, {
key: '_bindScrollModeListener',
value: function _bindScrollModeListener(buttons) {
this.eventBus.on('scrollmodechanged', function (evt) {
buttons.scrollVerticalButton.classList.toggle('toggled', evt.mode === _base_viewer.ScrollMode.VERTICAL);
buttons.scrollHorizontalButton.classList.toggle('toggled', evt.mode === _base_viewer.ScrollMode.HORIZONTAL);
buttons.scrollWrappedButton.classList.toggle('toggled', evt.mode === _base_viewer.ScrollMode.WRAPPED);
});
}
}, {
key: '_bindSpreadModeListener',
value: function _bindSpreadModeListener(buttons) {
this.eventBus.on('spreadmodechanged', function (evt) {
buttons.spreadNoneButton.classList.toggle('toggled', evt.mode === _base_viewer.SpreadMode.NONE);
buttons.spreadOddButton.classList.toggle('toggled', evt.mode === _base_viewer.SpreadMode.ODD);
buttons.spreadEvenButton.classList.toggle('toggled', evt.mode === _base_viewer.SpreadMode.EVEN);
});
}
}, {
key: 'open',
value: function open() {

108
lib/web/ui_utils.js

@ -24,7 +24,7 @@ @@ -24,7 +24,7 @@
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.waitOnEventOrTimeout = exports.WaitOnType = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.getPageSizeInches = exports.roundToDivide = exports.getVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.TextLayerMode = exports.RendererType = exports.PresentationModeState = exports.cloneObj = exports.isFileSchema = exports.isPortraitOrientation = exports.isValidRotation = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined;
exports.moveToEndOfArray = exports.waitOnEventOrTimeout = exports.WaitOnType = exports.animationStarted = exports.normalizeWheelEventDelta = exports.binarySearchFirstItem = exports.watchScroll = exports.scrollIntoView = exports.getOutputScale = exports.approximateFraction = exports.getPageSizeInches = exports.roundToDivide = exports.getVisibleElements = exports.backtrackBeforeAllVisibleElements = exports.parseQueryString = exports.noContextMenuHandler = exports.getPDFFileNameFromURL = exports.ProgressBar = exports.EventBus = exports.NullL10n = exports.TextLayerMode = exports.RendererType = exports.PresentationModeState = exports.cloneObj = exports.isPortraitOrientation = exports.isValidRotation = exports.VERTICAL_PADDING = exports.SCROLLBAR_PADDING = exports.MAX_AUTO_SCALE = exports.UNKNOWN_SCALE = exports.MAX_SCALE = exports.MIN_SCALE = exports.DEFAULT_SCALE = exports.DEFAULT_SCALE_VALUE = exports.CSS_UNITS = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
@ -102,7 +102,7 @@ function scrollIntoView(element, spot) { @@ -102,7 +102,7 @@ function scrollIntoView(element, spot) {
}
var offsetY = element.offsetTop + element.clientTop;
var offsetX = element.offsetLeft + element.clientLeft;
while (parent.clientHeight === parent.scrollHeight || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {
while (parent.clientHeight === parent.scrollHeight && parent.clientWidth === parent.scrollWidth || skipOverflowHiddenElements && getComputedStyle(parent).overflow === 'hidden') {
if (parent.dataset._scaleY) {
offsetY /= parent.dataset._scaleY;
offsetX /= parent.dataset._scaleX;
@ -132,6 +132,12 @@ function watchScroll(viewAreaElement, callback) { @@ -132,6 +132,12 @@ function watchScroll(viewAreaElement, callback) {
}
rAF = window.requestAnimationFrame(function viewAreaElementScrolled() {
rAF = null;
var currentX = viewAreaElement.scrollLeft;
var lastX = state.lastX;
if (currentX !== lastX) {
state.right = currentX > lastX;
}
state.lastX = currentX;
var currentY = viewAreaElement.scrollTop;
var lastY = state.lastY;
if (currentY !== lastY) {
@ -142,7 +148,9 @@ function watchScroll(viewAreaElement, callback) { @@ -142,7 +148,9 @@ function watchScroll(viewAreaElement, callback) {
});
};
var state = {
right: true,
down: true,
lastX: viewAreaElement.scrollLeft,
lastY: viewAreaElement.scrollTop,
_eventHandler: debounceScroll
};
@ -242,49 +250,88 @@ function getPageSizeInches(_ref) { @@ -242,49 +250,88 @@ function getPageSizeInches(_ref) {
height: changeOrientation ? width : height
};
}
function backtrackBeforeAllVisibleElements(index, views, top) {
if (index < 2) {
return index;
}
var elt = views[index].div;
var pageTop = elt.offsetTop + elt.clientTop;
if (pageTop >= top) {
elt = views[index - 1].div;
pageTop = elt.offsetTop + elt.clientTop;
}
for (var i = index - 2; i >= 0; --i) {
elt = views[i].div;
if (elt.offsetTop + elt.clientTop + elt.clientHeight <= pageTop) {
break;
}
index = i;
}
return index;
}
function getVisibleElements(scrollEl, views) {
var sortByVisibility = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var horizontal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
var top = scrollEl.scrollTop,
bottom = top + scrollEl.clientHeight;
var left = scrollEl.scrollLeft,
right = left + scrollEl.clientWidth;
function isElementBottomBelowViewTop(view) {
function isElementBottomAfterViewTop(view) {
var element = view.div;
var elementBottom = element.offsetTop + element.clientTop + element.clientHeight;
return elementBottom > top;
}
function isElementRightAfterViewLeft(view) {
var element = view.div;
var elementRight = element.offsetLeft + element.clientLeft + element.clientWidth;
return elementRight > left;
}
var visible = [],
view = void 0,
element = void 0;
var currentHeight = void 0,
viewHeight = void 0,
hiddenHeight = void 0,
percentHeight = void 0;
viewBottom = void 0,
hiddenHeight = void 0;
var currentWidth = void 0,
viewWidth = void 0;
var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, isElementBottomBelowViewTop);
viewWidth = void 0,
viewRight = void 0,
hiddenWidth = void 0;
var percentVisible = void 0;
var firstVisibleElementInd = views.length === 0 ? 0 : binarySearchFirstItem(views, horizontal ? isElementRightAfterViewLeft : isElementBottomAfterViewTop);
if (views.length > 0 && !horizontal) {
firstVisibleElementInd = backtrackBeforeAllVisibleElements(firstVisibleElementInd, views, top);
}
var lastEdge = horizontal ? right : -1;
for (var i = firstVisibleElementInd, ii = views.length; i < ii; i++) {
view = views[i];
element = view.div;
currentWidth = element.offsetLeft + element.clientLeft;
currentHeight = element.offsetTop + element.clientTop;
viewWidth = element.clientWidth;
viewHeight = element.clientHeight;
if (currentHeight > bottom) {
viewRight = currentWidth + viewWidth;
viewBottom = currentHeight + viewHeight;
if (lastEdge === -1) {
if (viewBottom >= bottom) {
lastEdge = viewBottom;
}
} else if ((horizontal ? currentWidth : currentHeight) > lastEdge) {
break;
}
currentWidth = element.offsetLeft + element.clientLeft;
viewWidth = element.clientWidth;
if (currentWidth + viewWidth < left || currentWidth > right) {
if (viewBottom <= top || currentHeight >= bottom || viewRight <= left || currentWidth >= right) {
continue;
}
hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, currentHeight + viewHeight - bottom);
percentHeight = (viewHeight - hiddenHeight) * 100 / viewHeight | 0;
hiddenHeight = Math.max(0, top - currentHeight) + Math.max(0, viewBottom - bottom);
hiddenWidth = Math.max(0, left - currentWidth) + Math.max(0, viewRight - right);
percentVisible = (viewHeight - hiddenHeight) * (viewWidth - hiddenWidth) * 100 / viewHeight / viewWidth | 0;
visible.push({
id: view.id,
x: currentWidth,
y: currentHeight,
view: view,
percent: percentHeight
percent: percentVisible
});
}
var first = visible[0];
@ -307,14 +354,6 @@ function getVisibleElements(scrollEl, views) { @@ -307,14 +354,6 @@ function getVisibleElements(scrollEl, views) {
function noContextMenuHandler(evt) {
evt.preventDefault();
}
function isFileSchema(url) {
var i = 0,
ii = url.length;
while (i < ii && url[i].trim() === '') {
i++;
}
return url.substr(i, 7).toLowerCase() === 'file://';
}
function isDataSchema(url) {
var i = 0,
ii = url.length;
@ -412,6 +451,10 @@ function waitOnEventOrTimeout(_ref2) { @@ -412,6 +451,10 @@ function waitOnEventOrTimeout(_ref2) {
return capability.promise;
}
var animationStarted = new Promise(function (resolve) {
if (typeof window === 'undefined') {
setTimeout(resolve, 20);
return;
}
window.requestAnimationFrame(resolve);
});
@ -541,6 +584,22 @@ var ProgressBar = function () { @@ -541,6 +584,22 @@ var ProgressBar = function () {
return ProgressBar;
}();
function moveToEndOfArray(arr, condition) {
var moved = [],
len = arr.length;
var write = 0;
for (var read = 0; read < len; ++read) {
if (condition(arr[read])) {
moved.push(arr[read]);
} else {
arr[write] = arr[read];
++write;
}
}
for (var _read = 0; write < len; ++_read, ++write) {
arr[write] = moved[_read];
}
}
exports.CSS_UNITS = CSS_UNITS;
exports.DEFAULT_SCALE_VALUE = DEFAULT_SCALE_VALUE;
exports.DEFAULT_SCALE = DEFAULT_SCALE;
@ -552,7 +611,6 @@ exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING; @@ -552,7 +611,6 @@ exports.SCROLLBAR_PADDING = SCROLLBAR_PADDING;
exports.VERTICAL_PADDING = VERTICAL_PADDING;
exports.isValidRotation = isValidRotation;
exports.isPortraitOrientation = isPortraitOrientation;
exports.isFileSchema = isFileSchema;
exports.cloneObj = cloneObj;
exports.PresentationModeState = PresentationModeState;
exports.RendererType = RendererType;
@ -563,6 +621,7 @@ exports.ProgressBar = ProgressBar; @@ -563,6 +621,7 @@ exports.ProgressBar = ProgressBar;
exports.getPDFFileNameFromURL = getPDFFileNameFromURL;
exports.noContextMenuHandler = noContextMenuHandler;
exports.parseQueryString = parseQueryString;
exports.backtrackBeforeAllVisibleElements = backtrackBeforeAllVisibleElements;
exports.getVisibleElements = getVisibleElements;
exports.roundToDivide = roundToDivide;
exports.getPageSizeInches = getPageSizeInches;
@ -574,4 +633,5 @@ exports.binarySearchFirstItem = binarySearchFirstItem; @@ -574,4 +633,5 @@ exports.binarySearchFirstItem = binarySearchFirstItem;
exports.normalizeWheelEventDelta = normalizeWheelEventDelta;
exports.animationStarted = animationStarted;
exports.WaitOnType = WaitOnType;
exports.waitOnEventOrTimeout = waitOnEventOrTimeout;
exports.waitOnEventOrTimeout = waitOnEventOrTimeout;
exports.moveToEndOfArray = moveToEndOfArray;

6
lib/web/viewer_compatibility.js

@ -21,9 +21,6 @@ @@ -21,9 +21,6 @@
*/
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var compatibilityParams = Object.create(null);
{
var userAgent = typeof navigator !== 'undefined' && navigator.userAgent || '';
@ -41,5 +38,4 @@ var compatibilityParams = Object.create(null); @@ -41,5 +38,4 @@ var compatibilityParams = Object.create(null);
}
})();
}
var viewerCompatibilityParams = Object.freeze(compatibilityParams);
exports.viewerCompatibilityParams = viewerCompatibilityParams;
exports.viewerCompatibilityParams = Object.freeze(compatibilityParams);

6
package.json

@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
{
"name": "pdfjs-dist",
"version": "2.0.489",
"version": "2.0.550",
"main": "build/pdf.js",
"description": "Generic build of Mozilla's PDF.js library.",
"keywords": [
@ -13,10 +13,10 @@ @@ -13,10 +13,10 @@
"license": "Apache-2.0",
"dependencies": {
"node-ensure": "^0.0.0",
"worker-loader": "^1.1.1"
"worker-loader": "^2.0.0"
},
"peerDependencies": {
"webpack": "^2.0.0 || ^3.0.0"
"webpack": "^3.0.0 || ^4.0.0-alpha.0 || ^4.0.0"
},
"browser": {
"fs": false,

56
web/pdf_viewer.css

@ -297,6 +297,46 @@ @@ -297,6 +297,46 @@
border: none;
}
.pdfViewer.scrollHorizontal, .pdfViewer.scrollWrapped, .spread {
margin-left: 3.5px;
margin-right: 3.5px;
text-align: center;
}
.pdfViewer.scrollHorizontal, .spread {
white-space: nowrap;
}
.pdfViewer.removePageBorders,
.pdfViewer.scrollHorizontal .spread,
.pdfViewer.scrollWrapped .spread {
margin-left: 0;
margin-right: 0;
}
.spread .page,
.pdfViewer.scrollHorizontal .page,
.pdfViewer.scrollWrapped .page,
.pdfViewer.scrollHorizontal .spread,
.pdfViewer.scrollWrapped .spread {
display: inline-block;
vertical-align: middle;
}
.spread .page,
.pdfViewer.scrollHorizontal .page,
.pdfViewer.scrollWrapped .page {
margin-left: -3.5px;
margin-right: -3.5px;
}
.pdfViewer.removePageBorders .spread .page,
.pdfViewer.removePageBorders.scrollHorizontal .page,
.pdfViewer.removePageBorders.scrollWrapped .page {
margin-left: 5px;
margin-right: 5px;
}
.pdfViewer .page canvas {
margin: 0;
display: block;
@ -316,6 +356,22 @@ @@ -316,6 +356,22 @@
background: url('images/loading-icon.gif') center no-repeat;
}
.pdfPresentationMode .pdfViewer {
margin-left: 0;
margin-right: 0;
}
.pdfPresentationMode .pdfViewer .page,
.pdfPresentationMode .pdfViewer .spread {
display: block;
}
.pdfPresentationMode .pdfViewer .page,
.pdfPresentationMode .pdfViewer.removePageBorders .page {
margin-left: auto;
margin-right: auto;
}
.pdfPresentationMode:-ms-fullscreen .pdfViewer .page {
margin-bottom: 100% !important;
}

7042
web/pdf_viewer.js

File diff suppressed because it is too large Load Diff

2
web/pdf_viewer.js.map

File diff suppressed because one or more lines are too long
Loading…
Cancel
Save