From 642d8621ef871cc241ad3b0256faef18d2eb803a Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Sun, 8 Jan 2017 16:51:30 +0100 Subject: [PATCH] Replace direct lookup of `uniquePrefix`/`idCounters`, in `Page` instances, with an `idFactory` containing an `createObjId` method instead We're currently making use of `uniquePrefix`/`idCounters` in multiple files, to create unique object id's, and adding a new occurrence of them requires some care to ensure that an object id isn't accidentally reused. Furthermore, having to pass around multiple parameters as we currently do seem like something you want to avoid. Instead, this patch adds a factory which means that there's only *one* thing that needs to be passed around. And since it's now only necessary to call a method in order to obtain a unique object id, the details are thus abstracted away at the call-sites which avoids accidental reuse of object id's. To test that this works as expected a very simple `Page` unit-test is added, and the existing `Annotation layer` tests are also adjusted slightly. --- src/core/annotation.js | 9 +- src/core/document.js | 23 +-- src/core/evaluator.js | 10 +- test/unit/annotation_layer_spec.js | 277 +++++++++++++++++------------ test/unit/clitests.json | 1 + test/unit/document_spec.js | 56 ++++++ test/unit/jasmine-boot.js | 31 ++-- 7 files changed, 252 insertions(+), 155 deletions(-) create mode 100644 test/unit/document_spec.js diff --git a/src/core/annotation.js b/src/core/annotation.js index 75d030535..c198374f3 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -65,18 +65,15 @@ AnnotationFactory.prototype = /** @lends AnnotationFactory.prototype */ { * @param {XRef} xref * @param {Object} ref * @param {PDFManager} pdfManager - * @param {string} uniquePrefix - * @param {Object} idCounters + * @param {Object} idFactory * @returns {Annotation} */ - create: function AnnotationFactory_create(xref, ref, pdfManager, - uniquePrefix, idCounters) { + create: function AnnotationFactory_create(xref, ref, pdfManager, idFactory) { var dict = xref.fetchIfRef(ref); if (!isDict(dict)) { return; } - var id = isRef(ref) ? ref.toString() : - 'annot_' + (uniquePrefix || '') + (++idCounters.obj); + var id = isRef(ref) ? ref.toString() : 'annot_' + idFactory.createObjId(); // Determine the annotation's subtype. var subtype = dict.get('Subtype'); diff --git a/src/core/document.js b/src/core/document.js index df8268fdf..9b2e4eade 100644 --- a/src/core/document.js +++ b/src/core/document.js @@ -78,12 +78,18 @@ var Page = (function PageClosure() { this.xref = xref; this.ref = ref; this.fontCache = fontCache; - this.uniquePrefix = 'p' + this.pageIndex + '_'; - this.idCounters = { - obj: 0 - }; this.evaluatorOptions = pdfManager.evaluatorOptions; this.resourcesPromise = null; + + var uniquePrefix = 'p' + this.pageIndex + '_'; + var idCounters = { + obj: 0, + }; + this.idFactory = { + createObjId: function () { + return uniquePrefix + (++idCounters.obj); + }, + }; } Page.prototype = { @@ -240,8 +246,7 @@ var Page = (function PageClosure() { var partialEvaluator = new PartialEvaluator(pdfManager, this.xref, handler, this.pageIndex, - this.uniquePrefix, - this.idCounters, + this.idFactory, this.fontCache, this.evaluatorOptions); @@ -308,8 +313,7 @@ var Page = (function PageClosure() { var contentStream = data[0]; var partialEvaluator = new PartialEvaluator(pdfManager, self.xref, handler, self.pageIndex, - self.uniquePrefix, - self.idCounters, + self.idFactory, self.fontCache, self.evaluatorOptions); @@ -345,8 +349,7 @@ var Page = (function PageClosure() { var annotationRef = annotationRefs[i]; var annotation = annotationFactory.create(this.xref, annotationRef, this.pdfManager, - this.uniquePrefix, - this.idCounters); + this.idFactory); if (annotation) { annotations.push(annotation); } diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 74ab517a3..ead82fbf8 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -169,13 +169,12 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { }; function PartialEvaluator(pdfManager, xref, handler, pageIndex, - uniquePrefix, idCounters, fontCache, options) { + idFactory, fontCache, options) { this.pdfManager = pdfManager; this.xref = xref; this.handler = handler; this.pageIndex = pageIndex; - this.uniquePrefix = uniquePrefix; - this.idCounters = idCounters; + this.idFactory = idFactory; this.fontCache = fontCache; this.options = options || DefaultPartialEvaluatorOptions; } @@ -391,8 +390,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { // If there is no imageMask, create the PDFImage and a lot // of image processing can be done here. - var uniquePrefix = (this.uniquePrefix || ''); - var objId = 'img_' + uniquePrefix + (++this.idCounters.obj); + var objId = 'img_' + this.idFactory.createObjId(); operatorList.addDependency(objId); args = [objId, w, h]; @@ -733,7 +731,7 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { this.fontCache.put(fontRef, fontCapability.promise); } else { if (!fontID) { - fontID = (this.uniquePrefix || 'F_') + (++this.idCounters.obj); + fontID = this.idFactory.createObjId(); } this.fontCache.put('id_' + fontID, fontCapability.promise); } diff --git a/test/unit/annotation_layer_spec.js b/test/unit/annotation_layer_spec.js index a7be57244..aeb33dafd 100644 --- a/test/unit/annotation_layer_spec.js +++ b/test/unit/annotation_layer_spec.js @@ -17,21 +17,19 @@ (function (root, factory) { if (typeof define === 'function' && define.amd) { define('pdfjs-test/unit/annotation_layer_spec', ['exports', - 'pdfjs/core/primitives', 'pdfjs/core/annotation', - 'pdfjs/core/stream', 'pdfjs/core/parser', - 'pdfjs/shared/util', 'pdfjs/display/global'], factory); + 'pdfjs/core/primitives', 'pdfjs/core/annotation', 'pdfjs/core/stream', + 'pdfjs/core/parser', 'pdfjs/shared/util', 'pdfjs/display/global'], + factory); } else if (typeof exports !== 'undefined') { factory(exports, require('../../src/core/primitives.js'), - require('../../src/core/annotation.js'), - require('../../src/core/stream.js'), - require('../../src/core/parser.js'), - require('../../src/shared/util.js'), - require('../../src/display/global.js')); + require('../../src/core/annotation.js'), + require('../../src/core/stream.js'), require('../../src/core/parser.js'), + require('../../src/shared/util.js'), + require('../../src/display/global.js')); } else { factory((root.pdfjsTestUnitAnnotationLayerSpec = {}), - root.pdfjsCorePrimitives, root.pdfjsCoreAnnotation, - root.pdfjsCoreStream, root.pdfjsCoreParser, - root.pdfjsSharedUtil, root.pdfjsDisplayGlobal); + root.pdfjsCorePrimitives, root.pdfjsCoreAnnotation, root.pdfjsCoreStream, + root.pdfjsCoreParser, root.pdfjsSharedUtil, root.pdfjsDisplayGlobal); } }(this, function (exports, corePrimitives, coreAnnotation, coreStream, coreParser, sharedUtil, displayGlobal) { @@ -80,19 +78,34 @@ describe('Annotation layer', function() { } PDFManagerMock.prototype = {}; - var annotationFactory, pdfManagerMock; + function IdFactoryMock(params) { + var uniquePrefix = params.prefix || 'p0_'; + var idCounters = { + obj: params.startObjId || 0, + }; + return { + createObjId: function () { + return uniquePrefix + (++idCounters.obj); + }, + }; + } + IdFactoryMock.prototype = {}; + + var annotationFactory, pdfManagerMock, idFactoryMock; beforeAll(function (done) { annotationFactory = new AnnotationFactory(); pdfManagerMock = new PDFManagerMock({ docBaseUrl: null, }); + idFactoryMock = new IdFactoryMock({ }); done(); }); afterAll(function () { annotationFactory = null; pdfManagerMock = null; + idFactoryMock = null; }); describe('AnnotationFactory', function () { @@ -107,7 +120,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -121,14 +134,15 @@ describe('Annotation layer', function() { annotationDict.set('Subtype', Name.get('Link')); var xref = new XRefMock(); - var uniquePrefix = 'p0_', idCounters = { obj: 0, }; + var idFactory = new IdFactoryMock({ + prefix: 'p0_', + startObjId: 0, + }); var annotation1 = annotationFactory.create(xref, annotationDict, - pdfManagerMock, - uniquePrefix, idCounters); + pdfManagerMock, idFactory); var annotation2 = annotationFactory.create(xref, annotationDict, - pdfManagerMock, - uniquePrefix, idCounters); + pdfManagerMock, idFactory); var data1 = annotation1.data, data2 = annotation2.data; expect(data1.annotationType).toEqual(AnnotationType.LINK); expect(data2.annotationType).toEqual(AnnotationType.LINK); @@ -147,7 +161,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toBeUndefined(); }); @@ -332,7 +346,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -360,7 +374,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -393,7 +407,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -423,7 +437,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -452,7 +466,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -484,7 +498,7 @@ describe('Annotation layer', function() { }); var annotation = annotationFactory.create(xref, annotationRef, - pdfManager); + pdfManager, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -513,7 +527,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -543,7 +557,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -583,7 +597,7 @@ describe('Annotation layer', function() { }); var annotation = annotationFactory.create(xref, annotationRef, - pdfManager); + pdfManager, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -617,7 +631,8 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, + idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -665,7 +680,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -686,7 +701,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -709,7 +724,7 @@ describe('Annotation layer', function() { ]); var annotation = annotationFactory.create(xref, annotationRef, - pdfManagerMock); + pdfManagerMock, idFactoryMock); var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.LINK); @@ -741,10 +756,11 @@ describe('Annotation layer', function() { { ref: widgetRef, data: widgetDict, } ]); - var widgetAnnotation = annotationFactory.create(xref, widgetRef, - pdfManagerMock); - var data = widgetAnnotation.data; + var annotation = annotationFactory.create(xref, widgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.fieldName).toEqual(''); }); @@ -757,10 +773,11 @@ describe('Annotation layer', function() { { ref: widgetRef, data: widgetDict, } ]); - var widgetAnnotation = annotationFactory.create(xref, widgetRef, - pdfManagerMock); - var data = widgetAnnotation.data; + var annotation = annotationFactory.create(xref, widgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.fieldName).toEqual('foo'); }); @@ -780,10 +797,11 @@ describe('Annotation layer', function() { { ref: widgetRef, data: widgetDict, } ]); - var widgetAnnotation = annotationFactory.create(xref, widgetRef, - pdfManagerMock); - var data = widgetAnnotation.data; + var annotation = annotationFactory.create(xref, widgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.fieldName).toEqual('foo.bar.baz'); }); }); @@ -811,13 +829,16 @@ describe('Annotation layer', function() { { ref: textWidgetRef, data: textWidgetDict, } ]); - var textWidgetAnnotation = annotationFactory.create(xref, textWidgetRef, - pdfManagerMock); - expect(textWidgetAnnotation.data.textAlignment).toEqual(null); - expect(textWidgetAnnotation.data.maxLen).toEqual(null); - expect(textWidgetAnnotation.data.readOnly).toEqual(false); - expect(textWidgetAnnotation.data.multiLine).toEqual(false); - expect(textWidgetAnnotation.data.comb).toEqual(false); + var annotation = annotationFactory.create(xref, textWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.textAlignment).toEqual(null); + expect(data.maxLen).toEqual(null); + expect(data.readOnly).toEqual(false); + expect(data.multiLine).toEqual(false); + expect(data.comb).toEqual(false); }); it('should not set invalid text alignment, maximum length and flags', @@ -831,13 +852,16 @@ describe('Annotation layer', function() { { ref: textWidgetRef, data: textWidgetDict, } ]); - var textWidgetAnnotation = annotationFactory.create(xref, textWidgetRef, - pdfManagerMock); - expect(textWidgetAnnotation.data.textAlignment).toEqual(null); - expect(textWidgetAnnotation.data.maxLen).toEqual(null); - expect(textWidgetAnnotation.data.readOnly).toEqual(false); - expect(textWidgetAnnotation.data.multiLine).toEqual(false); - expect(textWidgetAnnotation.data.comb).toEqual(false); + var annotation = annotationFactory.create(xref, textWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.textAlignment).toEqual(null); + expect(data.maxLen).toEqual(null); + expect(data.readOnly).toEqual(false); + expect(data.multiLine).toEqual(false); + expect(data.comb).toEqual(false); }); it('should set valid text alignment, maximum length and flags', @@ -852,12 +876,15 @@ describe('Annotation layer', function() { { ref: textWidgetRef, data: textWidgetDict, } ]); - var textWidgetAnnotation = annotationFactory.create(xref, textWidgetRef, - pdfManagerMock); - expect(textWidgetAnnotation.data.textAlignment).toEqual(1); - expect(textWidgetAnnotation.data.maxLen).toEqual(20); - expect(textWidgetAnnotation.data.readOnly).toEqual(true); - expect(textWidgetAnnotation.data.multiLine).toEqual(true); + var annotation = annotationFactory.create(xref, textWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.textAlignment).toEqual(1); + expect(data.maxLen).toEqual(20); + expect(data.readOnly).toEqual(true); + expect(data.multiLine).toEqual(true); }); it('should reject comb fields without a maximum length', function() { @@ -868,9 +895,12 @@ describe('Annotation layer', function() { { ref: textWidgetRef, data: textWidgetDict, } ]); - var textWidgetAnnotation = annotationFactory.create(xref, textWidgetRef, - pdfManagerMock); - expect(textWidgetAnnotation.data.comb).toEqual(false); + var annotation = annotationFactory.create(xref, textWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.comb).toEqual(false); }); it('should accept comb fields with a maximum length', function() { @@ -882,9 +912,12 @@ describe('Annotation layer', function() { { ref: textWidgetRef, data: textWidgetDict, } ]); - var textWidgetAnnotation = annotationFactory.create(xref, textWidgetRef, - pdfManagerMock); - expect(textWidgetAnnotation.data.comb).toEqual(true); + var annotation = annotationFactory.create(xref, textWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.comb).toEqual(true); }); it('should only accept comb fields when the flags are valid', function() { @@ -907,10 +940,14 @@ describe('Annotation layer', function() { { ref: textWidgetRef, data: textWidgetDict, } ]); - var textWidgetAnnotation = annotationFactory.create(xref, textWidgetRef, - pdfManagerMock); + var annotation = annotationFactory.create(xref, textWidgetRef, + pdfManagerMock, + idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + var valid = (invalidFieldFlags.length === 0); - expect(textWidgetAnnotation.data.comb).toEqual(valid); + expect(data.comb).toEqual(valid); // Remove the last invalid flag for the next iteration. if (!valid) { @@ -944,11 +981,14 @@ describe('Annotation layer', function() { { ref: buttonWidgetRef, data: buttonWidgetDict, } ]); - var buttonWidgetAnnotation = - annotationFactory.create(xref, buttonWidgetRef); - expect(buttonWidgetAnnotation.data.checkBox).toEqual(true); - expect(buttonWidgetAnnotation.data.fieldValue).toEqual('1'); - expect(buttonWidgetAnnotation.data.radioButton).toEqual(false); + var annotation = annotationFactory.create(xref, buttonWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.checkBox).toEqual(true); + expect(data.fieldValue).toEqual('1'); + expect(data.radioButton).toEqual(false); }); it('should handle radio buttons', function() { @@ -970,12 +1010,15 @@ describe('Annotation layer', function() { { ref: buttonWidgetRef, data: buttonWidgetDict, } ]); - var buttonWidgetAnnotation = - annotationFactory.create(xref, buttonWidgetRef); - expect(buttonWidgetAnnotation.data.checkBox).toEqual(false); - expect(buttonWidgetAnnotation.data.radioButton).toEqual(true); - expect(buttonWidgetAnnotation.data.fieldValue).toEqual('1'); - expect(buttonWidgetAnnotation.data.buttonValue).toEqual('2'); + var annotation = annotationFactory.create(xref, buttonWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.checkBox).toEqual(false); + expect(data.radioButton).toEqual(true); + expect(data.fieldValue).toEqual('1'); + expect(data.buttonValue).toEqual('2'); }); }); @@ -1001,11 +1044,11 @@ describe('Annotation layer', function() { { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.options).toEqual([]); }); @@ -1036,11 +1079,11 @@ describe('Annotation layer', function() { { ref: optionOneRef, data: optionOneArr, }, ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.options).toEqual(expected); }); @@ -1068,11 +1111,11 @@ describe('Annotation layer', function() { { ref: optionBarRef, data: optionBarStr, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.options).toEqual(expected); }); @@ -1086,11 +1129,11 @@ describe('Annotation layer', function() { { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.fieldValue).toEqual(fieldValue); }); @@ -1104,11 +1147,11 @@ describe('Annotation layer', function() { { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.fieldValue).toEqual([fieldValue]); }); @@ -1118,11 +1161,11 @@ describe('Annotation layer', function() { { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.readOnly).toEqual(false); expect(data.combo).toEqual(false); expect(data.multiSelect).toEqual(false); @@ -1136,11 +1179,11 @@ describe('Annotation layer', function() { { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.readOnly).toEqual(false); expect(data.combo).toEqual(false); expect(data.multiSelect).toEqual(false); @@ -1156,11 +1199,11 @@ describe('Annotation layer', function() { { ref: choiceWidgetRef, data: choiceWidgetDict, } ]); - var choiceWidgetAnnotation = annotationFactory.create(xref, - choiceWidgetRef, - pdfManagerMock); - var data = choiceWidgetAnnotation.data; + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.readOnly).toEqual(true); expect(data.combo).toEqual(true); expect(data.multiSelect).toEqual(true); @@ -1217,15 +1260,15 @@ describe('Annotation layer', function() { { ref: popupRef, data: popupDict, } ]); - var popupAnnotation = annotationFactory.create(xref, popupRef, - pdfManagerMock); - var data = popupAnnotation.data; + var annotation = annotationFactory.create(xref, popupRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; expect(data.annotationType).toEqual(AnnotationType.POPUP); // Should not modify the `annotationFlags` returned e.g. through the API. expect(data.annotationFlags).toEqual(25); // The Popup should inherit the `viewable` property of the parent. - expect(popupAnnotation.viewable).toEqual(true); + expect(annotation.viewable).toEqual(true); }); }); }); diff --git a/test/unit/clitests.json b/test/unit/clitests.json index fbf81d93c..e1635a9b4 100644 --- a/test/unit/clitests.json +++ b/test/unit/clitests.json @@ -3,6 +3,7 @@ "spec_files": [ "cff_parser_spec.js", "crypto_spec.js", + "document_spec.js", "dom_utils_spec.js", "evaluator_spec.js", "fonts_spec.js", diff --git a/test/unit/document_spec.js b/test/unit/document_spec.js new file mode 100644 index 000000000..cdec2ae6b --- /dev/null +++ b/test/unit/document_spec.js @@ -0,0 +1,56 @@ +/* Copyright 2017 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +(function (root, factory) { + if (typeof define === 'function' && define.amd) { + define('pdfjs-test/unit/document_spec', ['exports', 'pdfjs/core/document'], + factory); + } else if (typeof exports !== 'undefined') { + factory(exports, require('../../src/core/document.js')); + } else { + factory((root.pdfjsTestUnitDocumentSpec = {}), + root.pdfjsCoreDocument); + } +}(this, function (exports, coreDocument) { + +var Page = coreDocument.Page; + +describe('document', function () { + describe('Page', function () { + it('should create correct objId using the idFactory', function () { + var page1 = new Page(/* pdfManager = */ { }, /* xref = */ null, + /* pageIndex = */ 0, + /* pageDict = */ null, /* ref = */ null, + /* fontCache = */ null); + var page2 = new Page(/* pdfManager = */ { }, /* xref = */ null, + /* pageIndex = */ 1, + /* pageDict = */ null, /* ref = */ null, + /* fontCache = */ null); + + var idFactory1 = page1.idFactory, idFactory2 = page2.idFactory; + + expect(idFactory1.createObjId()).toEqual('p0_1'); + expect(idFactory1.createObjId()).toEqual('p0_2'); + + expect(idFactory2.createObjId()).toEqual('p1_1'); + expect(idFactory2.createObjId()).toEqual('p1_2'); + + expect(idFactory1.createObjId()).toEqual('p0_3'); + expect(idFactory1.createObjId()).toEqual('p0_4'); + }); + }); +}); +})); diff --git a/test/unit/jasmine-boot.js b/test/unit/jasmine-boot.js index f30578a90..b010e4f7e 100644 --- a/test/unit/jasmine-boot.js +++ b/test/unit/jasmine-boot.js @@ -48,23 +48,22 @@ function initializePDFJS(callback) { require(['pdfjs/display/global', 'pdfjs-test/unit/annotation_layer_spec', 'pdfjs-test/unit/api_spec', 'pdfjs-test/unit/cff_parser_spec', 'pdfjs-test/unit/cmap_spec', 'pdfjs-test/unit/crypto_spec', - 'pdfjs-test/unit/dom_utils_spec', 'pdfjs-test/unit/evaluator_spec', - 'pdfjs-test/unit/fonts_spec', 'pdfjs-test/unit/function_spec', - 'pdfjs-test/unit/metadata_spec', 'pdfjs-test/unit/murmurhash3_spec', - 'pdfjs-test/unit/network_spec', 'pdfjs-test/unit/parser_spec', - 'pdfjs-test/unit/primitives_spec', 'pdfjs-test/unit/stream_spec', - 'pdfjs-test/unit/type1_parser_spec', 'pdfjs-test/unit/ui_utils_spec', - 'pdfjs-test/unit/unicode_spec', 'pdfjs-test/unit/util_spec'], - function (displayGlobal, testUnitAnnotationLayerSpec, - testUnitApiSpec, testUnitCFFParserSpec, - testUnitCMapSpec, testUnitCryptoSpec, - testUnitDOMUtilsSpec, testUnitEvaluatorSpec, - testUnitFontsSpec, testUnitFunctionSpec, - testUnitMetadataSpec, testUnitMurmurHash3Spec, - testUnitNetworkSpec, testUnitParserSpec, + 'pdfjs-test/unit/document_spec', 'pdfjs-test/unit/dom_utils_spec', + 'pdfjs-test/unit/evaluator_spec', 'pdfjs-test/unit/fonts_spec', + 'pdfjs-test/unit/function_spec', 'pdfjs-test/unit/metadata_spec', + 'pdfjs-test/unit/murmurhash3_spec', 'pdfjs-test/unit/network_spec', + 'pdfjs-test/unit/parser_spec', 'pdfjs-test/unit/primitives_spec', + 'pdfjs-test/unit/stream_spec', 'pdfjs-test/unit/type1_parser_spec', + 'pdfjs-test/unit/ui_utils_spec', 'pdfjs-test/unit/unicode_spec', + 'pdfjs-test/unit/util_spec'], + function (displayGlobal, testUnitAnnotationLayerSpec, testUnitApiSpec, + testUnitCFFParserSpec, testUnitCMapSpec, testUnitCryptoSpec, + testUnitDocumentSpec, testUnitDOMUtilsSpec, testUnitEvaluatorSpec, + testUnitFontsSpec, testUnitFunctionSpec, testUnitMetadataSpec, + testUnitMurmurHash3Spec, testUnitNetworkSpec, testUnitParserSpec, testUnitPrimitivesSpec, testUnitStreamSpec, - testUnitType1ParserSpec, testUnitUiUtilsSpec, - testUnitUnicodeSpec, testUnitUtilSpec) { + testUnitType1ParserSpec, testUnitUiUtilsSpec, testUnitUnicodeSpec, + testUnitUtilSpec) { // Configure the worker. displayGlobal.PDFJS.workerSrc = '../../src/worker_loader.js';