From 20b12d2bda2ca270884900f3b1b9ff7d4cf4f3a9 Mon Sep 17 00:00:00 2001 From: calixteman Date: Sun, 6 Sep 2020 17:14:56 +0200 Subject: [PATCH] Add tooltip if any in annotations layer --- src/core/annotation.js | 5 +++- src/display/annotation_layer.js | 16 ++++++++++-- test/unit/annotation_spec.js | 43 +++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/core/annotation.js b/src/core/annotation.js index 2a078c6766d8c..a2e89ca2c2340 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -1533,6 +1533,7 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { this.hasFieldFlag(AnnotationFieldFlag.RADIO) && !this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); this.data.pushButton = this.hasFieldFlag(AnnotationFieldFlag.PUSHBUTTON); + this.data.isTooltipOnly = false; if (this.data.checkBox) { this._processCheckBox(params); @@ -1770,11 +1771,13 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { } _processPushButton(params) { - if (!params.dict.has("A")) { + if (!params.dict.has("A") && !this.data.alternativeText) { warn("Push buttons without action dictionaries are not supported"); return; } + this.data.isTooltipOnly = !params.dict.has("A"); + Catalog.parseDestDictionary({ destDict: params.dict, resultObj: this.data, diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 6bac96d04e8bf..037efcb31c496 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -293,7 +293,8 @@ class LinkAnnotationElement extends AnnotationElement { const isRenderable = !!( parameters.data.url || parameters.data.dest || - parameters.data.action + parameters.data.action || + parameters.data.isTooltipOnly ); super(parameters, isRenderable); } @@ -322,8 +323,10 @@ class LinkAnnotationElement extends AnnotationElement { }); } else if (data.action) { this._bindNamedAction(link, data.action); - } else { + } else if (data.dest) { this._bindLink(link, data.dest); + } else { + this._bindLink(link, ""); } this.container.appendChild(link); @@ -420,6 +423,10 @@ class WidgetAnnotationElement extends AnnotationElement { */ render() { // Show only the container for unsupported field types. + if (this.data.alternativeText) { + this.container.title = this.data.alternativeText; + } + return this.container; } } @@ -647,6 +654,11 @@ class PushButtonWidgetAnnotationElement extends LinkAnnotationElement { // as performing actions on form fields (resetting, submitting, et cetera). const container = super.render(); container.className = "buttonWidgetAnnotation pushButton"; + + if (this.data.alternativeText) { + container.title = this.data.alternativeText; + } + return container; } } diff --git a/test/unit/annotation_spec.js b/test/unit/annotation_spec.js index a7713bedfbe53..b5a066317de63 100644 --- a/test/unit/annotation_spec.js +++ b/test/unit/annotation_spec.js @@ -2436,6 +2436,49 @@ describe("annotation", function () { }) .catch(done.fail); }); + + it("should handle push buttons", function (done) { + const buttonWidgetRef = Ref.get(124, 0); + buttonWidgetDict.set("Ff", AnnotationFieldFlag.PUSHBUTTON); + buttonWidgetDict.set("A", "whatever"); + + const xref = new XRefMock([ + { ref: buttonWidgetRef, data: buttonWidgetDict }, + ]); + + AnnotationFactory.create( + xref, + buttonWidgetRef, + pdfManagerMock, + idFactoryMock + ).then(({ data }) => { + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.pushButton).toEqual(true); + done(); + }, done.fail); + }); + + it("should handle push buttons that act as a tooltip only", function (done) { + const buttonWidgetRef = Ref.get(124, 0); + buttonWidgetDict.set("Ff", AnnotationFieldFlag.PUSHBUTTON); + buttonWidgetDict.set("TU", "An alternative text"); + + const xref = new XRefMock([ + { ref: buttonWidgetRef, data: buttonWidgetDict }, + ]); + + AnnotationFactory.create( + xref, + buttonWidgetRef, + pdfManagerMock, + idFactoryMock + ).then(({ data }) => { + expect(data.annotationType).toEqual(AnnotationType.WIDGET); + expect(data.pushButton).toEqual(true); + expect(data.alternativeText).toEqual("An alternative text"); + done(); + }, done.fail); + }); }); describe("ChoiceWidgetAnnotation", function () {