From 1ee016b005ff3265b82f784bbde253bd99657d94 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 12 Feb 2016 18:16:45 +0100 Subject: [PATCH] Remove `Dict_getAll` since it is now unused `Dict_getAll` is problematic for a number of reasons. First of all, as issue 6961 shows, it can be really bad for performance, since it dereferences all indirect objects. Second of all, all the derefencing can lead to data being unncessarily requested when ranged/chunked loading is used, thus unnecessarily delaying rendering. Note: For cases where `Dict_getAll` was previously used, `Dict_getKeys` in combination with `Dict_get` can be used instead. This has the advantage that data isn't requested until it's actually needed. --- src/core/primitives.js | 70 ------------------------------------------ 1 file changed, 70 deletions(-) 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); },