Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a new size getter and getRawValues method, to Dict instances, to simplify some code #12101

Merged
merged 3 commits into from
Jul 17, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/core/document.js
Original file line number Diff line number Diff line change
Expand Up @@ -551,7 +551,7 @@ class PDFDocument {
// Check if a Collection dictionary is present in the document.
try {
const collection = this.catalog.catDict.get("Collection");
if (isDict(collection) && collection.getKeys().length > 0) {
if (isDict(collection) && collection.size > 0) {
this.collection = collection;
}
} catch (ex) {
Expand Down
10 changes: 3 additions & 7 deletions src/core/evaluator.js
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,7 @@ class PartialEvaluator {
// First check the current resources for blend modes.
var graphicStates = node.get("ExtGState");
if (graphicStates instanceof Dict) {
for (const key of graphicStates.getKeys()) {
let graphicState = graphicStates.getRaw(key);
for (let graphicState of graphicStates.getRawValues()) {
if (graphicState instanceof Ref) {
if (processed.has(graphicState)) {
continue; // The ExtGState has already been processed.
Expand Down Expand Up @@ -301,8 +300,7 @@ class PartialEvaluator {
if (!(xObjects instanceof Dict)) {
continue;
}
for (const key of xObjects.getKeys()) {
var xObject = xObjects.getRaw(key);
for (let xObject of xObjects.getRawValues()) {
if (xObject instanceof Ref) {
if (processed.has(xObject)) {
// The XObject has already been processed, and by avoiding a
Expand Down Expand Up @@ -3078,9 +3076,7 @@ class PartialEvaluator {
} else if (isRef(encoding)) {
hash.update(encoding.toString());
} else if (isDict(encoding)) {
var keys = encoding.getKeys();
for (var i = 0, ii = keys.length; i < ii; i++) {
var entry = encoding.getRaw(keys[i]);
for (const entry of encoding.getRawValues()) {
if (isName(entry)) {
hash.update(entry.name);
} else if (isRef(entry)) {
Expand Down
25 changes: 10 additions & 15 deletions src/core/obj.js
Original file line number Diff line number Diff line change
Expand Up @@ -2205,21 +2205,16 @@ const ObjectLoader = (function () {
}

function addChildren(node, nodesToVisit) {
if (node instanceof Dict || isStream(node)) {
const dict = node instanceof Dict ? node : node.dict;
const dictKeys = dict.getKeys();
for (let i = 0, ii = dictKeys.length; i < ii; i++) {
const rawValue = dict.getRaw(dictKeys[i]);
if (mayHaveChildren(rawValue)) {
nodesToVisit.push(rawValue);
}
}
} else if (Array.isArray(node)) {
for (let i = 0, ii = node.length; i < ii; i++) {
const value = node[i];
if (mayHaveChildren(value)) {
nodesToVisit.push(value);
}
if (node instanceof Dict) {
node = node.getRawValues();
} else if (isStream(node)) {
node = node.dict.getRawValues();
} else if (!Array.isArray(node)) {
return;
}
for (const rawValue of node) {
if (mayHaveChildren(rawValue)) {
nodesToVisit.push(rawValue);
}
}
}
Expand Down
9 changes: 9 additions & 0 deletions src/core/primitives.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ var Dict = (function DictClosure() {
this.xref = newXref;
},

get size() {
return Object.keys(this._map).length;
},

// automatically dereferences Ref objects
get(key1, key2, key3) {
let value = this._map[key1];
Expand Down Expand Up @@ -140,6 +144,11 @@ var Dict = (function DictClosure() {
return Object.keys(this._map);
},

// no dereferencing
getRawValues: function Dict_getRawValues() {
return Object.values(this._map);
},

set: function Dict_set(key, value) {
if (
(typeof PDFJSDev === "undefined" ||
Expand Down
40 changes: 40 additions & 0 deletions test/unit/primitives_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,17 @@ describe("primitives", function () {
expect(dict.xref).toEqual(xref);
});

it("should return correct size", function () {
const dict = new Dict(null);
expect(dict.size).toEqual(0);

dict.set("Type", Name.get("Page"));
expect(dict.size).toEqual(1);

dict.set("Contents", Ref.get(10, 0));
expect(dict.size).toEqual(2);
});

it("should return invalid values for unknown keys", function () {
checkInvalidHasValues(emptyDict);
checkInvalidKeyValues(emptyDict);
Expand Down Expand Up @@ -264,6 +275,35 @@ describe("primitives", function () {
expect(keys.sort()).toEqual(expectedKeys);
});

it("should get all raw values", function () {
// Test direct objects:
const expectedRawValues1 = [testFontFile, testFontFile2, testFontFile3];
const rawValues1 = dictWithManyKeys.getRawValues();

expect(rawValues1.sort()).toEqual(expectedRawValues1);

// Test indirect objects:
const typeName = Name.get("Page");
const resources = new Dict(null),
resourcesRef = Ref.get(5, 0);
const contents = new StringStream("data"),
contentsRef = Ref.get(10, 0);
const xref = new XRefMock([
{ ref: resourcesRef, data: resources },
{ ref: contentsRef, data: contents },
]);

const dict = new Dict(xref);
dict.set("Type", typeName);
dict.set("Resources", resourcesRef);
dict.set("Contents", contentsRef);

const expectedRawValues2 = [contentsRef, resourcesRef, typeName];
const rawValues2 = dict.getRawValues();

expect(rawValues2.sort()).toEqual(expectedRawValues2);
});

it("should create only one object for Dict.empty", function () {
const firstDictEmpty = Dict.empty;
const secondDictEmpty = Dict.empty;
Expand Down