diff --git a/src/core/annotation.js b/src/core/annotation.js index 1da94633861e6..5133633c09f9f 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -1610,11 +1610,14 @@ class ChoiceWidgetAnnotation extends WidgetAnnotation { } } - // Determine the field value. In this case, it may be a string or an - // array of strings. For convenience in the display layer, convert the - // string to an array of one string as well. - if (!Array.isArray(this.data.fieldValue)) { + // The field value can be `null` if no item is selected, a string if one + // item is selected or an array of strings if multiple items are selected. + // For consistency in the API and convenience in the display layer, we + // always make the field value an array with zero, one or multiple items. + if (isString(this.data.fieldValue)) { this.data.fieldValue = [this.data.fieldValue]; + } else if (!this.data.fieldValue) { + this.data.fieldValue = []; } // Process field flags for the display layer. diff --git a/test/unit/annotation_spec.js b/test/unit/annotation_spec.js index 134b946c0bbf2..9964cb67618fd 100644 --- a/test/unit/annotation_spec.js +++ b/test/unit/annotation_spec.js @@ -2478,48 +2478,32 @@ describe("annotation", function () { }, done.fail); }); - it("should handle array field values", function (done) { - const fieldValue = ["Foo", "Bar"]; + it("should convert the field value to an array", function (done) { + const inputs = [null, "Foo", ["Foo", "Bar"]]; + const outputs = [[], ["Foo"], ["Foo", "Bar"]]; - choiceWidgetDict.set("V", fieldValue); - - const choiceWidgetRef = Ref.get(968, 0); - const xref = new XRefMock([ - { ref: choiceWidgetRef, data: choiceWidgetDict }, - ]); - - AnnotationFactory.create( - xref, - choiceWidgetRef, - pdfManagerMock, - idFactoryMock - ).then(({ data }) => { - expect(data.annotationType).toEqual(AnnotationType.WIDGET); - expect(data.fieldValue).toEqual(fieldValue); - done(); - }, done.fail); - }); - - it("should handle string field values", function (done) { - const fieldValue = "Foo"; - - choiceWidgetDict.set("V", fieldValue); + let promise = Promise.resolve(); + for (let i = 0, ii = inputs.length; i < ii; i++) { + promise = promise.then(() => { + choiceWidgetDict.set("V", inputs[i]); - const choiceWidgetRef = Ref.get(978, 0); - const xref = new XRefMock([ - { ref: choiceWidgetRef, data: choiceWidgetDict }, - ]); + const choiceWidgetRef = Ref.get(968, 0); + const xref = new XRefMock([ + { ref: choiceWidgetRef, data: choiceWidgetDict }, + ]); - AnnotationFactory.create( - xref, - choiceWidgetRef, - pdfManagerMock, - idFactoryMock - ).then(({ data }) => { - expect(data.annotationType).toEqual(AnnotationType.WIDGET); - expect(data.fieldValue).toEqual([fieldValue]); - done(); - }, done.fail); + return AnnotationFactory.create( + xref, + choiceWidgetRef, + pdfManagerMock, + idFactoryMock + ).then(({ data }) => { + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.fieldValue).toEqual(outputs[i]); + }); + }); + } + promise.then(done, done.fail); }); it("should handle unknown flags", function (done) {