Merge pull request #12377 from calixteman/fix_radio_saving
Set parent of radio annotation even if there is no 'V' field
This commit is contained in:
commit
e73354a32d
@ -1741,10 +1741,10 @@ class ButtonWidgetAnnotation extends WidgetAnnotation {
|
||||
// The parent field's `V` entry holds a `Name` object with the appearance
|
||||
// state of whichever child field is currently in the "on" state.
|
||||
const fieldParent = params.dict.get("Parent");
|
||||
if (isDict(fieldParent) && fieldParent.has("V")) {
|
||||
if (isDict(fieldParent)) {
|
||||
this.parent = params.dict.getRaw("Parent");
|
||||
const fieldParentValue = fieldParent.get("V");
|
||||
if (isName(fieldParentValue)) {
|
||||
this.parent = params.dict.getRaw("Parent");
|
||||
this.data.fieldValue = this._decodeFormValue(fieldParentValue);
|
||||
}
|
||||
}
|
||||
|
@ -2318,6 +2318,68 @@ describe("annotation", function () {
|
||||
}, done.fail);
|
||||
});
|
||||
|
||||
it("should save radio buttons without a field value", function (done) {
|
||||
const appearanceStatesDict = new Dict();
|
||||
const normalAppearanceDict = new Dict();
|
||||
|
||||
normalAppearanceDict.set("Checked", Ref.get(314, 0));
|
||||
normalAppearanceDict.set("Off", Ref.get(271, 0));
|
||||
appearanceStatesDict.set("N", normalAppearanceDict);
|
||||
|
||||
buttonWidgetDict.set("Ff", AnnotationFieldFlag.RADIO);
|
||||
buttonWidgetDict.set("AP", appearanceStatesDict);
|
||||
|
||||
const buttonWidgetRef = Ref.get(123, 0);
|
||||
const parentRef = Ref.get(456, 0);
|
||||
|
||||
const parentDict = new Dict();
|
||||
parentDict.set("Kids", [buttonWidgetRef]);
|
||||
buttonWidgetDict.set("Parent", parentRef);
|
||||
|
||||
const xref = new XRefMock([
|
||||
{ ref: buttonWidgetRef, data: buttonWidgetDict },
|
||||
{ ref: parentRef, data: parentDict },
|
||||
]);
|
||||
|
||||
parentDict.xref = xref;
|
||||
buttonWidgetDict.xref = xref;
|
||||
partialEvaluator.xref = xref;
|
||||
const task = new WorkerTask("test save");
|
||||
|
||||
AnnotationFactory.create(
|
||||
xref,
|
||||
buttonWidgetRef,
|
||||
pdfManagerMock,
|
||||
idFactoryMock
|
||||
)
|
||||
.then(annotation => {
|
||||
const annotationStorage = {};
|
||||
annotationStorage[annotation.data.id] = true;
|
||||
return Promise.all([
|
||||
annotation,
|
||||
annotation.save(partialEvaluator, task, annotationStorage),
|
||||
]);
|
||||
})
|
||||
.then(([annotation, data]) => {
|
||||
expect(data.length).toEqual(2);
|
||||
const [radioData, parentData] = data;
|
||||
radioData.data = radioData.data.replace(/\(D:[0-9]+\)/, "(date)");
|
||||
expect(radioData.ref).toEqual(Ref.get(123, 0));
|
||||
expect(radioData.data).toEqual(
|
||||
"123 0 obj\n" +
|
||||
"<< /Type /Annot /Subtype /Widget /FT /Btn /Ff 32768 " +
|
||||
"/AP << /N << /Checked 314 0 R /Off 271 0 R>>>> " +
|
||||
"/Parent 456 0 R /AS /Checked /M (date)>>\nendobj\n"
|
||||
);
|
||||
expect(parentData.ref).toEqual(Ref.get(456, 0));
|
||||
expect(parentData.data).toEqual(
|
||||
"456 0 obj\n<< /Kids [123 0 R] /V /Checked>>\nendobj\n"
|
||||
);
|
||||
done();
|
||||
})
|
||||
.catch(done.fail);
|
||||
});
|
||||
|
||||
it("should save nothing", function (done) {
|
||||
const buttonWidgetRef = Ref.get(124, 0);
|
||||
const xref = new XRefMock([
|
||||
|
Loading…
Reference in New Issue
Block a user