1
0
Fork 0
mirror of https://github.com/mozilla/pdf.js.git synced 2025-04-25 09:38:06 +02:00

Check isEvalSupported, and test that eval is actually supported, before attempting to use the PostScriptCompiler (issue 5573)

Currently `PDFFunction` is implemented (basically) like a class with only `static` methods. Since it's used directly in a number of different `src/core/` files, attempting to pass in `isEvalSupported` would result in code that's *very* messy, not to mention difficult to maintain (since *every* single `PDFFunction` method call would need to include a `isEvalSupported` argument).

Rather than having to wait for a possible re-factoring of `PDFFunction` that would avoid the above problems by design, it probably makes sense to at least set `isEvalSupported` globally for `PDFFunction`.

Please note that there's one caveat with this solution: If `PDFJS.getDocument` is used to open multiple files simultaneously, with *different* `PDFJS.isEvalSupported` values set before each call, then the last one will always win.
However, that seems like enough of an edge-case that we shouldn't have to worry about it. Besides, since we'll also test that `eval` is actually supported, it should be fine.

Fixes 5573.
This commit is contained in:
Jonas Jenwald 2017-09-14 15:38:57 +02:00
parent d0d7046129
commit dc926ffc0f
5 changed files with 32 additions and 9 deletions

View file

@ -13,17 +13,31 @@
* limitations under the License.
*/
import { FormatError, info, isBool } from '../shared/util';
import {
FormatError, info, isBool, isEvalSupported, shadow
} from '../shared/util';
import { isDict, isStream } from './primitives';
import { PostScriptLexer, PostScriptParser } from './ps_parser';
let IsEvalSupportedCached = {
get value() {
return shadow(this, 'value', isEvalSupported());
},
};
var PDFFunction = (function PDFFunctionClosure() {
var CONSTRUCT_SAMPLED = 0;
var CONSTRUCT_INTERPOLATED = 2;
var CONSTRUCT_STICHED = 3;
var CONSTRUCT_POSTSCRIPT = 4;
let isEvalSupported = true;
return {
setIsEvalSupported(support = true) {
isEvalSupported = support !== false;
},
getSampleArray: function PDFFunction_getSampleArray(size, outputSize, bps,
str) {
var i, ii;
@ -399,15 +413,17 @@ var PDFFunction = (function PDFFunctionClosure() {
var range = IR[2];
var code = IR[3];
var compiled = (new PostScriptCompiler()).compile(code, domain, range);
if (compiled) {
// Compiled function consists of simple expressions such as addition,
// subtraction, Math.max, and also contains 'var' and 'return'
// statements. See the generation in the PostScriptCompiler below.
// eslint-disable-next-line no-new-func
return new Function('src', 'srcOffset', 'dest', 'destOffset', compiled);
if (isEvalSupported && IsEvalSupportedCached.value) {
let compiled = (new PostScriptCompiler()).compile(code, domain, range);
if (compiled) {
// Compiled function consists of simple expressions such as addition,
// subtraction, Math.max, and also contains 'var' and 'return'
// statements. See the generation in the PostScriptCompiler below.
// eslint-disable-next-line no-new-func
return new Function('src', 'srcOffset', 'dest', 'destOffset',
compiled);
}
}
info('Unable to compile PS function');
var numOutputs = range.length >> 1;