From 8990de8614680d3a881984f1b287798ce6c9bfff Mon Sep 17 00:00:00 2001 From: Tim van der Meij Date: Sat, 25 Feb 2017 23:34:26 +0100 Subject: [PATCH] Interactive forms: make choice widget options inheritable (issue 8094) Even though the PDF specification does not state that `Opt` fields are inheritable, in practice there are PDF generators that let annotations inherit the options from a parent. --- src/core/annotation.js | 5 ++++- test/unit/annotation_spec.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/core/annotation.js b/src/core/annotation.js index 212485448..f22a48ce2 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -845,9 +845,12 @@ var ChoiceWidgetAnnotation = (function ChoiceWidgetAnnotationClosure() { // the display value. If the array consists of strings, then these // represent both the export and display value. In this case, we convert // it to an array of arrays as well for convenience in the display layer. + // Note that the specification does not state that the `Opt` field is + // inheritable, but in practice PDF generators do make annotations + // inherit the options from a parent annotation (issue 8094). this.data.options = []; - var options = params.dict.get('Opt'); + var options = Util.getInheritableProperty(params.dict, 'Opt'); if (isArray(options)) { var xref = params.xref; for (var i = 0, ii = options.length; i < ii; i++) { diff --git a/test/unit/annotation_spec.js b/test/unit/annotation_spec.js index 9498e221f..d81c38748 100644 --- a/test/unit/annotation_spec.js +++ b/test/unit/annotation_spec.js @@ -1142,6 +1142,34 @@ describe('annotation', function() { expect(data.options).toEqual(expected); }); + it('should handle inherited option arrays (issue 8094)', function() { + var options = [ + ['Value1', 'Description1'], + ['Value2', 'Description2'], + ]; + var expected = [ + { exportValue: 'Value1', displayValue: 'Description1' }, + { exportValue: 'Value2', displayValue: 'Description2' }, + ]; + + var parentDict = new Dict(); + parentDict.set('Opt', options); + + choiceWidgetDict.set('Parent', parentDict); + + var choiceWidgetRef = new Ref(123, 0); + var xref = new XRefMock([ + { ref: choiceWidgetRef, data: choiceWidgetDict, }, + ]); + + var annotation = annotationFactory.create(xref, choiceWidgetRef, + pdfManagerMock, idFactoryMock); + var data = annotation.data; + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + + expect(data.options).toEqual(expected); + }); + it('should handle array field values', function() { var fieldValue = ['Foo', 'Bar'];