Use a Map, rather than an Object, internally in the Catalog.openAction getter (PR 11644 follow-up)

This provides a work-around to avoid having to conditionally try to initialize the `openAction`-object in multiple places.
Given that `Object.fromEntries` doesn't seem to *guarantee* that a `null` prototype is used, we thus hack around that by using `Object.assign` with `Object.create(null)`.
This commit is contained in:
Jonas Jenwald 2020-10-28 14:04:09 +01:00
parent ea4d88a330
commit 9fc7cdcc9d
2 changed files with 16 additions and 14 deletions

View File

@ -25,6 +25,7 @@ import {
isBool, isBool,
isNum, isNum,
isString, isString,
objectFromEntries,
PermissionFlag, PermissionFlag,
shadow, shadow,
stringToPDFString, stringToPDFString,
@ -786,7 +787,7 @@ class Catalog {
*/ */
get openAction() { get openAction() {
const obj = this._catDict.get("OpenAction"); const obj = this._catDict.get("OpenAction");
let openAction = null; const openActionMap = new Map();
if (isDict(obj)) { if (isDict(obj)) {
// Convert the OpenAction dictionary into a format that works with // Convert the OpenAction dictionary into a format that works with
@ -798,23 +799,18 @@ class Catalog {
Catalog.parseDestDictionary({ destDict, resultObj }); Catalog.parseDestDictionary({ destDict, resultObj });
if (Array.isArray(resultObj.dest)) { if (Array.isArray(resultObj.dest)) {
if (!openAction) { openActionMap.set("dest", resultObj.dest);
openAction = Object.create(null);
}
openAction.dest = resultObj.dest;
} else if (resultObj.action) { } else if (resultObj.action) {
if (!openAction) { openActionMap.set("action", resultObj.action);
openAction = Object.create(null);
}
openAction.action = resultObj.action;
} }
} else if (Array.isArray(obj)) { } else if (Array.isArray(obj)) {
if (!openAction) { openActionMap.set("dest", obj);
openAction = Object.create(null);
}
openAction.dest = obj;
} }
return shadow(this, "openAction", openAction); return shadow(
this,
"openAction",
openActionMap.size > 0 ? objectFromEntries(openActionMap) : null
);
} }
get attachments() { get attachments() {

View File

@ -585,6 +585,11 @@ function string32(value) {
); );
} }
// Ensures that the returned Object has a `null` prototype.
function objectFromEntries(iterable) {
return Object.assign(Object.create(null), Object.fromEntries(iterable));
}
// Checks the endianness of the platform. // Checks the endianness of the platform.
function isLittleEndian() { function isLittleEndian() {
const buffer8 = new Uint8Array(4); const buffer8 = new Uint8Array(4);
@ -1035,6 +1040,7 @@ export {
isString, isString,
isSameOrigin, isSameOrigin,
createValidAbsoluteUrl, createValidAbsoluteUrl,
objectFromEntries,
IsLittleEndianCached, IsLittleEndianCached,
IsEvalSupportedCached, IsEvalSupportedCached,
removeNullCharacters, removeNullCharacters,