From 2fe9f3ff8f4270dcbc9e61c7bdd7cec1414ab686 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sat, 25 May 2019 17:40:14 +0200 Subject: [PATCH] Add caching to reduce the number of `Ref` objects This is similar to the existing caching used to reduced the number of `Cmd` and `Name` objects. With the `tracemonkey.pdf` file, this patch changes the number of `Ref` objects as follows (in the default viewer): | | Loading the first page | Loading *all* the pages | |----------|------------------------|-------------------------| | `master` | 332 | 3265 | | `patch` | 163 | 996 | --- src/core/document.js | 2 +- src/core/obj.js | 2 +- src/core/parser.js | 2 +- src/core/primitives.js | 21 ++++++- src/core/worker.js | 2 +- test/unit/annotation_spec.js | 110 +++++++++++++++++------------------ test/unit/colorspace_spec.js | 22 +++---- test/unit/core_utils_spec.js | 6 +- test/unit/primitives_spec.js | 24 ++++---- 9 files changed, 103 insertions(+), 88 deletions(-) diff --git a/src/core/document.js b/src/core/document.js index 525f70312..e1d998a91 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -627,7 +627,7 @@ class PDFDocument { const { catalog, linearization, } = this; assert(linearization && linearization.pageFirst === pageIndex); - const ref = new Ref(linearization.objectNumberFirst, 0); + const ref = Ref.get(linearization.objectNumberFirst, 0); return this.xref.fetchAsync(ref).then((obj) => { // Ensure that the object that was found is actually a Page dictionary. if (isDict(obj, 'Page') || diff --git a/src/core/obj.js b/src/core/obj.js index e8299963a..5784172aa 100644 --- a/src/core/obj.js +++ b/src/core/obj.js @@ -1697,7 +1697,7 @@ var XRef = (function XRefClosure() { fetchCompressed(ref, xrefEntry, suppressEncryption = false) { var tableOffset = xrefEntry.offset; - var stream = this.fetch(new Ref(tableOffset, 0)); + var stream = this.fetch(Ref.get(tableOffset, 0)); if (!isStream(stream)) { throw new FormatError('bad ObjStm stream'); } diff --git a/src/core/parser.js b/src/core/parser.js index 21da1475b..e3fb9a836 100644 --- a/src/core/parser.js +++ b/src/core/parser.js @@ -150,7 +150,7 @@ class Parser { if (Number.isInteger(buf1)) { // indirect reference or integer const num = buf1; if (Number.isInteger(this.buf1) && isCmd(this.buf2, 'R')) { - const ref = new Ref(num, this.buf1); + const ref = Ref.get(num, this.buf1); this.shift(); this.shift(); return ref; diff --git a/src/core/primitives.js b/src/core/primitives.js index 14d8016c3..7074676a8 100644 --- a/src/core/primitives.js +++ b/src/core/primitives.js @@ -14,6 +14,8 @@ */ /* uses XRef */ +import { assert } from '../shared/util'; + var EOF = {}; var Name = (function NameClosure() { @@ -176,6 +178,8 @@ var Dict = (function DictClosure() { })(); var Ref = (function RefClosure() { + const refCache = Object.create(null); + function Ref(num, gen) { this.num = num; this.gen = gen; @@ -185,13 +189,19 @@ var Ref = (function RefClosure() { toString: function Ref_toString() { // This function is hot, so we make the string as compact as possible. // |this.gen| is almost always zero, so we treat that case specially. - if (this.gen !== 0) { - return `${this.num}R${this.gen}`; + if (this.gen === 0) { + return `${this.num}R`; } - return `${this.num}R`; + return `${this.num}R${this.gen}`; }, }; + Ref.get = function(num, gen) { + const key = (gen === 0 ? `${num}R` : `${num}R${gen}`); + const refValue = refCache[key]; + return (refValue ? refValue : (refCache[key] = new Ref(num, gen))); + }; + return Ref; })(); @@ -277,6 +287,11 @@ function isRef(v) { } function isRefsEqual(v1, v2) { + if (typeof PDFJSDev === 'undefined' || + PDFJSDev.test('!PRODUCTION || TESTING')) { + assert(v1 instanceof Ref && v2 instanceof Ref, + 'isRefsEqual: Both parameters should be `Ref`s.'); + } return v1.num === v2.num && v1.gen === v2.gen; } diff --git a/src/core/worker.js b/src/core/worker.js index fee45edaf..71dc63219 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -494,7 +494,7 @@ var WorkerMessageHandler = { }); handler.on('GetPageIndex', function wphSetupGetPageIndex(data) { - var ref = new Ref(data.ref.num, data.ref.gen); + var ref = Ref.get(data.ref.num, data.ref.gen); var catalog = pdfManager.pdfDocument.catalog; return catalog.getPageIndex(ref); }); diff --git a/test/unit/annotation_spec.js b/test/unit/annotation_spec.js index b737550f3..da2457404 100644 --- a/test/unit/annotation_spec.js +++ b/test/unit/annotation_spec.js @@ -64,7 +64,7 @@ describe('annotation', function() { annotationDict.set('Type', Name.get('Annot')); annotationDict.set('Subtype', Name.get('Link')); - const annotationRef = new Ref(10, 0); + const annotationRef = Ref.get(10, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -105,7 +105,7 @@ describe('annotation', function() { const annotationDict = new Dict(); annotationDict.set('Type', Name.get('Annot')); - const annotationRef = new Ref(1, 0); + const annotationRef = Ref.get(1, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -123,7 +123,7 @@ describe('annotation', function() { beforeAll(function(done) { dict = new Dict(); - ref = new Ref(1, 0); + ref = Ref.get(1, 0); done(); }); @@ -322,7 +322,7 @@ describe('annotation', function() { beforeAll(function(done) { dict = new Dict(); - ref = new Ref(1, 0); + ref = Ref.get(1, 0); done(); }); @@ -357,7 +357,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(820, 0); + const annotationRef = Ref.get(820, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -385,7 +385,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(353, 0); + const annotationRef = Ref.get(353, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -418,7 +418,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(8, 0); + const annotationRef = Ref.get(8, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -448,7 +448,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(798, 0); + const annotationRef = Ref.get(798, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -477,7 +477,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(489, 0); + const annotationRef = Ref.get(489, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -506,7 +506,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(489, 0); + const annotationRef = Ref.get(489, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -538,7 +538,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(495, 0); + const annotationRef = Ref.get(495, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -567,7 +567,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(489, 0); + const annotationRef = Ref.get(489, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -604,7 +604,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(88, 0); + const annotationRef = Ref.get(88, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -642,7 +642,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(46, 0); + const annotationRef = Ref.get(46, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -697,7 +697,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('A', actionDict); - const annotationRef = new Ref(12, 0); + const annotationRef = Ref.get(12, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -718,7 +718,7 @@ describe('annotation', function() { annotationDict.set('Subtype', Name.get('Link')); annotationDict.set('Dest', Name.get('LI0')); - const annotationRef = new Ref(583, 0); + const annotationRef = Ref.get(583, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -738,10 +738,10 @@ describe('annotation', function() { const annotationDict = new Dict(); annotationDict.set('Type', Name.get('Annot')); annotationDict.set('Subtype', Name.get('Link')); - annotationDict.set('Dest', [new Ref(17, 0), Name.get('XYZ'), + annotationDict.set('Dest', [Ref.get(17, 0), Name.get('XYZ'), 0, 841.89, null]); - const annotationRef = new Ref(10, 0); + const annotationRef = Ref.get(10, 0); const xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -771,7 +771,7 @@ describe('annotation', function() { // section 12.3.3, but there are PDF files where it's a dictionary. annotationDict.set('Dest', destDict); - let annotationRef = new Ref(798, 0); + let annotationRef = Ref.get(798, 0); let xref = new XRefMock([ { ref: annotationRef, data: annotationDict, } ]); @@ -802,7 +802,7 @@ describe('annotation', function() { }); it('should handle unknown field names', function(done) { - const widgetRef = new Ref(20, 0); + const widgetRef = Ref.get(20, 0); const xref = new XRefMock([ { ref: widgetRef, data: widgetDict, } ]); @@ -819,7 +819,7 @@ describe('annotation', function() { function(done) { widgetDict.set('T', 'foo'); - const widgetRef = new Ref(21, 0); + const widgetRef = Ref.get(21, 0); const xref = new XRefMock([ { ref: widgetRef, data: widgetDict, } ]); @@ -844,7 +844,7 @@ describe('annotation', function() { widgetDict.set('Parent', secondParent); widgetDict.set('T', 'baz'); - const widgetRef = new Ref(22, 0); + const widgetRef = Ref.get(22, 0); const xref = new XRefMock([ { ref: widgetRef, data: widgetDict, } ]); @@ -866,7 +866,7 @@ describe('annotation', function() { widgetDict.set('Parent', parentDict); widgetDict.set('T', 'bar'); - const widgetRef = new Ref(22, 0); + const widgetRef = Ref.get(22, 0); const xref = new XRefMock([ { ref: widgetRef, data: widgetDict, } ]); @@ -897,7 +897,7 @@ describe('annotation', function() { it('should handle unknown text alignment, maximum length and flags', function(done) { - const textWidgetRef = new Ref(124, 0); + const textWidgetRef = Ref.get(124, 0); const xref = new XRefMock([ { ref: textWidgetRef, data: textWidgetDict, } ]); @@ -920,7 +920,7 @@ describe('annotation', function() { textWidgetDict.set('MaxLen', 'five'); textWidgetDict.set('Ff', 'readonly'); - const textWidgetRef = new Ref(43, 0); + const textWidgetRef = Ref.get(43, 0); const xref = new XRefMock([ { ref: textWidgetRef, data: textWidgetDict, } ]); @@ -944,7 +944,7 @@ describe('annotation', function() { textWidgetDict.set('Ff', AnnotationFieldFlag.READONLY + AnnotationFieldFlag.MULTILINE); - const textWidgetRef = new Ref(84, 0); + const textWidgetRef = Ref.get(84, 0); const xref = new XRefMock([ { ref: textWidgetRef, data: textWidgetDict, } ]); @@ -963,7 +963,7 @@ describe('annotation', function() { it('should reject comb fields without a maximum length', function(done) { textWidgetDict.set('Ff', AnnotationFieldFlag.COMB); - const textWidgetRef = new Ref(46, 0); + const textWidgetRef = Ref.get(46, 0); const xref = new XRefMock([ { ref: textWidgetRef, data: textWidgetDict, } ]); @@ -980,7 +980,7 @@ describe('annotation', function() { textWidgetDict.set('MaxLen', 20); textWidgetDict.set('Ff', AnnotationFieldFlag.COMB); - const textWidgetRef = new Ref(46, 0); + const textWidgetRef = Ref.get(46, 0); const xref = new XRefMock([ { ref: textWidgetRef, data: textWidgetDict, } ]); @@ -1012,7 +1012,7 @@ describe('annotation', function() { textWidgetDict.set('MaxLen', 20); textWidgetDict.set('Ff', flags); - const textWidgetRef = new Ref(93, 0); + const textWidgetRef = Ref.get(93, 0); const xref = new XRefMock([ { ref: textWidgetRef, data: textWidgetDict, } ]); @@ -1061,7 +1061,7 @@ describe('annotation', function() { appearanceStatesDict.set('D', exportValueOptionsDict); buttonWidgetDict.set('AP', appearanceStatesDict); - const buttonWidgetRef = new Ref(124, 0); + const buttonWidgetRef = Ref.get(124, 0); const xref = new XRefMock([ { ref: buttonWidgetRef, data: buttonWidgetDict, } ]); @@ -1080,7 +1080,7 @@ describe('annotation', function() { it('should handle checkboxes without export value', function(done) { buttonWidgetDict.set('V', Name.get('1')); - const buttonWidgetRef = new Ref(124, 0); + const buttonWidgetRef = Ref.get(124, 0); const xref = new XRefMock([ { ref: buttonWidgetRef, data: buttonWidgetDict, } ]); @@ -1109,7 +1109,7 @@ describe('annotation', function() { buttonWidgetDict.set('Parent', parentDict); buttonWidgetDict.set('AP', appearanceStatesDict); - const buttonWidgetRef = new Ref(124, 0); + const buttonWidgetRef = Ref.get(124, 0); const xref = new XRefMock([ { ref: buttonWidgetRef, data: buttonWidgetDict, } ]); @@ -1135,7 +1135,7 @@ describe('annotation', function() { buttonWidgetDict.set('Ff', AnnotationFieldFlag.RADIO); buttonWidgetDict.set('AP', appearanceStatesDict); - const buttonWidgetRef = new Ref(124, 0); + const buttonWidgetRef = Ref.get(124, 0); const xref = new XRefMock([ { ref: buttonWidgetRef, data: buttonWidgetDict, } ]); @@ -1168,7 +1168,7 @@ describe('annotation', function() { }); it('should handle missing option arrays', function(done) { - const choiceWidgetRef = new Ref(122, 0); + const choiceWidgetRef = Ref.get(122, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); @@ -1182,9 +1182,9 @@ describe('annotation', function() { }); it('should handle option arrays with array elements', function(done) { - const optionBarRef = new Ref(20, 0); + const optionBarRef = Ref.get(20, 0); const optionBarStr = 'Bar'; - const optionOneRef = new Ref(10, 0); + const optionOneRef = Ref.get(10, 0); const optionOneArr = ['bar_export', optionBarRef]; const options = [['foo_export', 'Foo'], optionOneRef]; @@ -1195,7 +1195,7 @@ describe('annotation', function() { choiceWidgetDict.set('Opt', options); - const choiceWidgetRef = new Ref(123, 0); + const choiceWidgetRef = Ref.get(123, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, }, { ref: optionBarRef, data: optionBarStr, }, @@ -1211,7 +1211,7 @@ describe('annotation', function() { }); it('should handle option arrays with string elements', function(done) { - const optionBarRef = new Ref(10, 0); + const optionBarRef = Ref.get(10, 0); const optionBarStr = 'Bar'; const options = ['Foo', optionBarRef]; @@ -1222,7 +1222,7 @@ describe('annotation', function() { choiceWidgetDict.set('Opt', options); - const choiceWidgetRef = new Ref(981, 0); + const choiceWidgetRef = Ref.get(981, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, }, { ref: optionBarRef, data: optionBarStr, } @@ -1251,7 +1251,7 @@ describe('annotation', function() { choiceWidgetDict.set('Parent', parentDict); - const choiceWidgetRef = new Ref(123, 0); + const choiceWidgetRef = Ref.get(123, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, }, ]); @@ -1276,7 +1276,7 @@ describe('annotation', function() { choiceWidgetDict.set('Opt', options); - const choiceWidgetRef = new Ref(984, 0); + const choiceWidgetRef = Ref.get(984, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, }, ]); @@ -1294,7 +1294,7 @@ describe('annotation', function() { choiceWidgetDict.set('V', fieldValue); - const choiceWidgetRef = new Ref(968, 0); + const choiceWidgetRef = Ref.get(968, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); @@ -1312,7 +1312,7 @@ describe('annotation', function() { choiceWidgetDict.set('V', fieldValue); - const choiceWidgetRef = new Ref(978, 0); + const choiceWidgetRef = Ref.get(978, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); @@ -1326,7 +1326,7 @@ describe('annotation', function() { }); it('should handle unknown flags', function(done) { - const choiceWidgetRef = new Ref(166, 0); + const choiceWidgetRef = Ref.get(166, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); @@ -1344,7 +1344,7 @@ describe('annotation', function() { it('should not set invalid flags', function(done) { choiceWidgetDict.set('Ff', 'readonly'); - const choiceWidgetRef = new Ref(165, 0); + const choiceWidgetRef = Ref.get(165, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); @@ -1364,7 +1364,7 @@ describe('annotation', function() { AnnotationFieldFlag.COMBO + AnnotationFieldFlag.MULTISELECT); - const choiceWidgetRef = new Ref(512, 0); + const choiceWidgetRef = Ref.get(512, 0); const xref = new XRefMock([ { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); @@ -1387,7 +1387,7 @@ describe('annotation', function() { lineDict.set('Subtype', Name.get('Line')); lineDict.set('L', [1, 2, 3, 4]); - const lineRef = new Ref(122, 0); + const lineRef = Ref.get(122, 0); const xref = new XRefMock([ { ref: lineRef, data: lineDict, } ]); @@ -1415,20 +1415,20 @@ describe('annotation', function() { const lexer = new Lexer(fileStream); const parser = new Parser(lexer, /* allowStreams = */ true); - const fileStreamRef = new Ref(18, 0); + const fileStreamRef = Ref.get(18, 0); const fileStreamDict = parser.getObj(); const embeddedFileDict = new Dict(); embeddedFileDict.set('F', fileStreamRef); - const fileSpecRef = new Ref(19, 0); + const fileSpecRef = Ref.get(19, 0); const fileSpecDict = new Dict(); fileSpecDict.set('Type', Name.get('Filespec')); fileSpecDict.set('Desc', ''); fileSpecDict.set('EF', embeddedFileDict); fileSpecDict.set('UF', 'Test.txt'); - const fileAttachmentRef = new Ref(20, 0); + const fileAttachmentRef = Ref.get(20, 0); const fileAttachmentDict = new Dict(); fileAttachmentDict.set('Type', Name.get('Annot')); fileAttachmentDict.set('Subtype', Name.get('FileAttachment')); @@ -1468,7 +1468,7 @@ describe('annotation', function() { popupDict.set('Subtype', Name.get('Popup')); popupDict.set('Parent', parentDict); - const popupRef = new Ref(13, 0); + const popupRef = Ref.get(13, 0); const xref = new XRefMock([ { ref: popupRef, data: popupDict, } ]); @@ -1492,7 +1492,7 @@ describe('annotation', function() { popupDict.set('Subtype', Name.get('Popup')); popupDict.set('Parent', parentDict); - const popupRef = new Ref(13, 0); + const popupRef = Ref.get(13, 0); const xref = new XRefMock([ { ref: popupRef, data: popupDict, } ]); @@ -1519,7 +1519,7 @@ describe('annotation', function() { popupDict.set('F', 25); // not viewable popupDict.set('Parent', parentDict); - const popupRef = new Ref(13, 0); + const popupRef = Ref.get(13, 0); const xref = new XRefMock([ { ref: popupRef, data: popupDict, } ]); @@ -1544,7 +1544,7 @@ describe('annotation', function() { inkDict.set('Subtype', Name.get('Ink')); inkDict.set('InkList', [[1, 1, 1, 2, 2, 2, 3, 3]]); - const inkRef = new Ref(142, 0); + const inkRef = Ref.get(142, 0); const xref = new XRefMock([ { ref: inkRef, data: inkDict, } ]); @@ -1572,7 +1572,7 @@ describe('annotation', function() { [3, 3, 4, 5], ]); - const inkRef = new Ref(143, 0); + const inkRef = Ref.get(143, 0); const xref = new XRefMock([ { ref: inkRef, data: inkDict, } ]); diff --git a/test/unit/colorspace_spec.js b/test/unit/colorspace_spec.js index 43845430b..0749b9d70 100644 --- a/test/unit/colorspace_spec.js +++ b/test/unit/colorspace_spec.js @@ -50,7 +50,7 @@ describe('colorspace', function () { it('should handle the case when cs is a Name object', function () { let cs = Name.get('DeviceGray'); let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -89,7 +89,7 @@ describe('colorspace', function () { expect(testDest).toEqual(expectedDest); }); it('should handle the case when cs is an indirect object', function () { - let cs = new Ref(10, 0); + let cs = Ref.get(10, 0); let xref = new XRefMock([{ ref: cs, data: Name.get('DeviceGray'), @@ -128,7 +128,7 @@ describe('colorspace', function () { it('should handle the case when cs is a Name object', function () { let cs = Name.get('DeviceRGB'); let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -172,7 +172,7 @@ describe('colorspace', function () { expect(testDest).toEqual(expectedDest); }); it('should handle the case when cs is an indirect object', function () { - let cs = new Ref(10, 0); + let cs = Ref.get(10, 0); let xref = new XRefMock([{ ref: cs, data: Name.get('DeviceRGB'), @@ -216,7 +216,7 @@ describe('colorspace', function () { it('should handle the case when cs is a Name object', function () { let cs = Name.get('DeviceCMYK'); let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -260,7 +260,7 @@ describe('colorspace', function () { expect(testDest).toEqual(expectedDest); }); it('should handle the case when cs is an indirect object', function () { - let cs = new Ref(10, 0); + let cs = Ref.get(10, 0); let xref = new XRefMock([{ ref: cs, data: Name.get('DeviceCMYK'), @@ -312,7 +312,7 @@ describe('colorspace', function () { params, ]; let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -365,7 +365,7 @@ describe('colorspace', function () { params, ]; let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -415,7 +415,7 @@ describe('colorspace', function () { params, ]; let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -468,7 +468,7 @@ describe('colorspace', function () { lookup, ]; let xref = new XRefMock([{ - ref: new Ref(10, 0), + ref: Ref.get(10, 0), data: new Dict(), }]); let res = new Dict(); @@ -515,7 +515,7 @@ describe('colorspace', function () { 'exch 0.21 mul }'); fn = new Stream(fn.bytes, 0, 58, fnDict); - let fnRef = new Ref(10, 0); + let fnRef = Ref.get(10, 0); let cs = [ Name.get('Separation'), diff --git a/test/unit/core_utils_spec.js b/test/unit/core_utils_spec.js index fcdcadff8..74a618f9d 100644 --- a/test/unit/core_utils_spec.js +++ b/test/unit/core_utils_spec.js @@ -42,7 +42,7 @@ describe('core_utils', function() { }); it('fetches the property if it is not inherited', function() { - const ref = new Ref(10, 0); + const ref = Ref.get(10, 0); const xref = new XRefMock([{ ref, data: 'quux', }]); const dict = new Dict(xref); @@ -58,7 +58,7 @@ describe('core_utils', function() { it('fetches the property if it is inherited and present on one level', function() { - const ref = new Ref(10, 0); + const ref = Ref.get(10, 0); const xref = new XRefMock([{ ref, data: 'quux', }]); const firstDict = new Dict(xref); const secondDict = new Dict(xref); @@ -78,7 +78,7 @@ describe('core_utils', function() { it('fetches the property if it is inherited and present on multiple levels', function() { - const ref = new Ref(10, 0); + const ref = Ref.get(10, 0); const xref = new XRefMock([{ ref, data: 'quux', }]); const firstDict = new Dict(xref); const secondDict = new Dict(xref); diff --git a/test/unit/primitives_spec.js b/test/unit/primitives_spec.js index 38fe568a9..1e94a8c8d 100644 --- a/test/unit/primitives_spec.js +++ b/test/unit/primitives_spec.js @@ -185,7 +185,7 @@ describe('primitives', function() { it('should handle keys pointing to indirect objects, both sync and async', function (done) { - var fontRef = new Ref(1, 0); + var fontRef = Ref.get(1, 0); var xref = new XRefMock([ { ref: fontRef, data: testFontFile, } ]); @@ -206,7 +206,7 @@ describe('primitives', function() { }); it('should handle arrays containing indirect objects', function () { - var minCoordRef = new Ref(1, 0), maxCoordRef = new Ref(2, 0); + var minCoordRef = Ref.get(1, 0), maxCoordRef = Ref.get(2, 0); var minCoord = 0, maxCoord = 1; var xref = new XRefMock([ { ref: minCoordRef, data: minCoord, }, @@ -254,7 +254,7 @@ describe('primitives', function() { it('should retain the stored values', function() { var storedNum = 4; var storedGen = 2; - var ref = new Ref(storedNum, storedGen); + var ref = Ref.get(storedNum, storedGen); expect(ref.num).toEqual(storedNum); expect(ref.gen).toEqual(storedGen); }); @@ -262,18 +262,18 @@ describe('primitives', function() { describe('RefSet', function() { it('should have a stored value', function() { - var ref = new Ref(4, 2); + var ref = Ref.get(4, 2); var refset = new RefSet(); refset.put(ref); expect(refset.has(ref)).toBeTruthy(); }); it('should not have an unknown value', function() { - var ref = new Ref(4, 2); + var ref = Ref.get(4, 2); var refset = new RefSet(); expect(refset.has(ref)).toBeFalsy(); refset.put(ref); - var anotherRef = new Ref(2, 4); + var anotherRef = Ref.get(2, 4); expect(refset.has(anotherRef)).toBeFalsy(); }); }); @@ -341,21 +341,21 @@ describe('primitives', function() { }); it('handles refs', function () { - var ref = new Ref(1, 0); + var ref = Ref.get(1, 0); expect(isRef(ref)).toEqual(true); }); }); describe('isRefsEqual', function () { - it('should handle different Refs pointing to the same object', function () { - var ref1 = new Ref(1, 0); - var ref2 = new Ref(1, 0); + it('should handle Refs pointing to the same object', function () { + var ref1 = Ref.get(1, 0); + var ref2 = Ref.get(1, 0); expect(isRefsEqual(ref1, ref2)).toEqual(true); }); it('should handle Refs pointing to different objects', function () { - var ref1 = new Ref(1, 0); - var ref2 = new Ref(2, 0); + var ref1 = Ref.get(1, 0); + var ref2 = Ref.get(2, 0); expect(isRefsEqual(ref1, ref2)).toEqual(false); }); });