diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 2fa42d7b6..df4fa0953 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -1005,9 +1005,20 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // but doing so is meaningless without knowing the semantics. continue; default: - // Note: Let's hope that the ignored operator does not have any - // non-serializable arguments, otherwise postMessage will throw + // Note: Ignore the operator if it has `Dict` arguments, since + // those are non-serializable, otherwise postMessage will throw // "An object could not be cloned.". + if (args !== null) { + for (i = 0, ii = args.length; i < ii; i++) { + if (args[i] instanceof Dict) { + break; + } + } + if (i < ii) { + warn('getOperatorList - ignoring operator: ' + fn); + continue; + } + } } operatorList.addOp(fn, args); } @@ -2555,7 +2566,7 @@ var EvaluatorPreprocessor = (function EvaluatorPreprocessorClosure() { if (!args) { args = []; } - args.push((obj instanceof Dict ? obj.getAll() : obj)); + args.push(obj); assert(args.length <= 33, 'Too many arguments'); } } diff --git a/src/core/primitives.js b/src/core/primitives.js index 410a38470..730bacb1f 100644 --- a/src/core/primitives.js +++ b/src/core/primitives.js @@ -67,24 +67,6 @@ var Dict = (function DictClosure() { return nonSerializable; // creating closure on some variable }; - var GETALL_DICTIONARY_TYPES_WHITELIST = { - 'Background': true, - 'ExtGState': true, - 'Halftone': true, - 'Layout': true, - 'Mask': true, - 'Pagination': true, - 'Printing': true - }; - - function isRecursionAllowedFor(dict) { - if (!isName(dict.Type)) { - return true; - } - var dictType = dict.Type.name; - return GETALL_DICTIONARY_TYPES_WHITELIST[dictType] === true; - } - // xref is optional function Dict(xref) { // Map should only be used internally, use functions below to access. @@ -162,58 +144,6 @@ var Dict = (function DictClosure() { return this.map[key]; }, - // creates new map and dereferences all Refs - getAll: function Dict_getAll() { - var all = Object.create(null); - var queue = null; - var key, obj; - for (key in this.map) { - obj = this.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - (queue || (queue = [])).push({target: all, key: key, obj: obj}); - } else { - all[key] = this.getRaw(key); - } - } else { - all[key] = obj; - } - } - if (!queue) { - return all; - } - - // trying to take cyclic references into the account - var processed = Object.create(null); - while (queue.length > 0) { - var item = queue.shift(); - var itemObj = item.obj; - var objId = itemObj.objId; - if (objId && objId in processed) { - item.target[item.key] = processed[objId]; - continue; - } - var dereferenced = Object.create(null); - for (key in itemObj.map) { - obj = itemObj.get(key); - if (obj instanceof Dict) { - if (isRecursionAllowedFor(obj)) { - queue.push({target: dereferenced, key: key, obj: obj}); - } else { - dereferenced[key] = itemObj.getRaw(key); - } - } else { - dereferenced[key] = obj; - } - } - if (objId) { - processed[objId] = dereferenced; - } - item.target[item.key] = dereferenced; - } - return all; - }, - getKeys: function Dict_getKeys() { return Object.keys(this.map); }, diff --git a/test/pdfs/issue6549.pdf.link b/test/pdfs/issue6549.pdf.link new file mode 100644 index 000000000..9da866501 --- /dev/null +++ b/test/pdfs/issue6549.pdf.link @@ -0,0 +1 @@ +http://web.archive.org/web/20150306062422/http://www.kokuyo-st.co.jp/stationery/camiapp/CamiApp_Sample.pdf diff --git a/test/test_manifest.json b/test/test_manifest.json index e796620dc..589f96ba0 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -781,6 +781,15 @@ "rounds": 1, "type": "load" }, + { "id": "issue6549", + "file": "pdfs/issue6549.pdf", + "md5": "699aeea73a6f45375022ffc6cc80f12a", + "link": true, + "rounds": 1, + "firstPage": 2, + "lastPage": 3, + "type": "load" + }, { "id": "ibwa-bad", "file": "pdfs/ibwa-bad.pdf", "md5": "6ca059d32b74ac2688ae06f727fee755",