From f3900c4e57accc3f326dab98153d15c8f844929f Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 17 Feb 2018 21:49:14 +0100 Subject: [PATCH] Move the `isEvalSupported` option from the global `PDFJS` object and into `getDocument` instead --- src/display/api.js | 11 +++++++++-- src/display/dom_utils.js | 2 -- src/display/font_loader.js | 32 +++++++++++++------------------- src/display/global.js | 8 -------- web/app_options.js | 5 +++++ 5 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 437312678..7dc3cec67 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -157,6 +157,9 @@ function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) { * @property {number} maxImageSize - (optional) The maximum allowed image size * in total pixels, i.e. width * height. Images above this value will not be * rendered. Use -1 for no limit, which is also the default value. + * @property {boolean} isEvalSupported - (optional) Determines if we can eval + * strings as JS. Primarily used to improve performance of font rendering, + * and when parsing PDF functions. The default value is `true`. */ /** @@ -252,6 +255,9 @@ function getDocument(src) { if (!Number.isInteger(params.maxImageSize)) { params.maxImageSize = -1; } + if (typeof params.isEvalSupported !== 'boolean') { + params.isEvalSupported = true; + } // Set the main-thread verbosity level. setVerbosityLevel(params.verbosity); @@ -344,7 +350,7 @@ function _fetchDocument(worker, source, pdfDataRangeTransport, docId) { docBaseUrl: source.docBaseUrl, nativeImageDecoderSupport: source.nativeImageDecoderSupport, ignoreErrors: source.ignoreErrors, - isEvalSupported: getDefaultSetting('isEvalSupported'), + isEvalSupported: source.isEvalSupported, }).then(function (workerId) { if (worker.destroyed) { throw new Error('Worker was destroyed'); @@ -1806,6 +1812,7 @@ var WorkerTransport = (function WorkerTransportClosure() { switch (type) { case 'Font': var exportedData = data[2]; + let params = this._params; if ('error' in exportedData) { var exportedError = exportedData.error; @@ -1823,7 +1830,7 @@ var WorkerTransport = (function WorkerTransportClosure() { }; } var font = new FontFaceObject(exportedData, { - isEvalSupported: getDefaultSetting('isEvalSupported'), + isEvalSupported: params.isEvalSupported, disableFontFace: getDefaultSetting('disableFontFace'), fontRegistry, }); diff --git a/src/display/dom_utils.js b/src/display/dom_utils.js index f1146f74b..ea88ad6f7 100644 --- a/src/display/dom_utils.js +++ b/src/display/dom_utils.js @@ -346,8 +346,6 @@ function getDefaultSetting(id) { return globalSettings ? globalSettings.disableFontFace : false; case 'disableCreateObjectURL': return globalSettings ? globalSettings.disableCreateObjectURL : false; - case 'isEvalSupported': - return globalSettings ? globalSettings.isEvalSupported : true; default: throw new Error('Unknown default setting: ' + id); } diff --git a/src/display/font_loader.js b/src/display/font_loader.js index 7e8ffcdd2..904712bf6 100644 --- a/src/display/font_loader.js +++ b/src/display/font_loader.js @@ -336,13 +336,17 @@ var IsEvalSupportedCached = { }; var FontFaceObject = (function FontFaceObjectClosure() { - function FontFaceObject(translatedData, options) { + function FontFaceObject(translatedData, { isEvalSupported = true, + disableFontFace = false, + fontRegistry = null, }) { this.compiledGlyphs = Object.create(null); // importing translated data for (var i in translatedData) { this[i] = translatedData[i]; } - this.options = options; + this.isEvalSupported = isEvalSupported !== false; + this.disableFontFace = disableFontFace === true; + this.fontRegistry = fontRegistry; } FontFaceObject.prototype = { createNativeFontFace: function FontFaceObject_createNativeFontFace() { @@ -350,30 +354,20 @@ var FontFaceObject = (function FontFaceObjectClosure() { throw new Error('Not implemented: createNativeFontFace'); } - if (!this.data) { - return null; - } - - if (this.options.disableFontFace) { - this.disableFontFace = true; + if (!this.data || this.disableFontFace) { return null; } var nativeFontFace = new FontFace(this.loadedName, this.data, {}); - if (this.options.fontRegistry) { - this.options.fontRegistry.registerFont(this); + if (this.fontRegistry) { + this.fontRegistry.registerFont(this); } return nativeFontFace; }, createFontFaceRule: function FontFaceObject_createFontFaceRule() { - if (!this.data) { - return null; - } - - if (this.options.disableFontFace) { - this.disableFontFace = true; + if (!this.data || this.disableFontFace) { return null; } @@ -384,8 +378,8 @@ var FontFaceObject = (function FontFaceObjectClosure() { var url = ('url(data:' + this.mimetype + ';base64,' + btoa(data) + ');'); var rule = '@font-face { font-family:"' + fontName + '";src:' + url + '}'; - if (this.options.fontRegistry) { - this.options.fontRegistry.registerFont(this, url); + if (this.fontRegistry) { + this.fontRegistry.registerFont(this, url); } return rule; @@ -398,7 +392,7 @@ var FontFaceObject = (function FontFaceObjectClosure() { var current, i, len; // If we can, compile cmds into JS for MAXIMUM SPEED - if (this.options.isEvalSupported && IsEvalSupportedCached.value) { + if (this.isEvalSupported && IsEvalSupportedCached.value) { var args, js = ''; for (i = 0, len = cmds.length; i < len; i++) { current = cmds[i]; diff --git a/src/display/global.js b/src/display/global.js index 6fabc84df..725ace290 100644 --- a/src/display/global.js +++ b/src/display/global.js @@ -116,14 +116,6 @@ PDFJS.pdfBug = (PDFJS.pdfBug === undefined ? false : PDFJS.pdfBug); PDFJS.disableCreateObjectURL = (PDFJS.disableCreateObjectURL === undefined ? false : PDFJS.disableCreateObjectURL); -/** - * Determines if we can eval strings as JS. Primarily used to improve - * performance for font rendering. - * @var {boolean} - */ -PDFJS.isEvalSupported = (PDFJS.isEvalSupported === undefined ? - true : PDFJS.isEvalSupported); - PDFJS.getDocument = getDocument; PDFJS.LoopbackPort = LoopbackPort; PDFJS.PDFDataRangeTransport = PDFDataRangeTransport; diff --git a/web/app_options.js b/web/app_options.js index f0c532bbb..432e0c5e8 100644 --- a/web/app_options.js +++ b/web/app_options.js @@ -139,6 +139,11 @@ const defaultOptions = { '../external/bcmaps/' : '../web/cmaps/'), kind: OptionKind.API, }, + isEvalSupported: { + /** @type {boolean} */ + value: true, + kind: OptionKind.API, + }, maxImageSize: { /** @type {number} */ value: -1,