From 7172f0a9286fd09f9baaeb82f808bd6543c3f5cb Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Fri, 8 Jan 2021 16:43:16 +0100 Subject: [PATCH] JS -- update radio/checkbox values even if there are no actions --- src/core/annotation.js | 2 +- src/display/annotation_layer.js | 14 ++--- test/integration/scripting_spec.js | 82 ++++++++++++++++++++--------- test/pdfs/js-buttons.pdf | Bin 24363 -> 29410 bytes test/test_manifest.json | 2 +- 5 files changed, 65 insertions(+), 35 deletions(-) diff --git a/src/core/annotation.js b/src/core/annotation.js index d0b4199be..7740543d5 100644 --- a/src/core/annotation.js +++ b/src/core/annotation.js @@ -1986,7 +1986,7 @@ class ButtonWidgetAnnotation extends WidgetAnnotation { } return { id: this.data.id, - value: this.data.fieldValue || null, + value: this.data.fieldValue || "Off", defaultValue: this.data.defaultFieldValue, exportValues, editable: !this.data.readOnly, diff --git a/src/display/annotation_layer.js b/src/display/annotation_layer.js index 5d2462d8a..25a8fda52 100644 --- a/src/display/annotation_layer.js +++ b/src/display/annotation_layer.js @@ -544,9 +544,6 @@ class WidgetAnnotationElement extends AnnotationElement { } _setEventListener(element, baseName, eventName, valueGetter) { - if (this.data.actions[eventName.replace(" ", "")] === undefined) { - return; - } if (baseName.includes("mouse")) { // Mouse events element.addEventListener(baseName, event => { @@ -577,11 +574,14 @@ class WidgetAnnotationElement extends AnnotationElement { } _setEventListeners(element, names, getter) { - if (!this.data.actions) { - return; - } for (const [baseName, eventName] of names) { - this._setEventListener(element, baseName, eventName, getter); + if ( + eventName === "Action" || + (this.data.actions && + this.data.actions[eventName.replace(" ", "")] !== undefined) + ) { + this._setEventListener(element, baseName, eventName, getter); + } } } } diff --git a/test/integration/scripting_spec.js b/test/integration/scripting_spec.js index 01f6e7ea5..4ff428d86 100644 --- a/test/integration/scripting_spec.js +++ b/test/integration/scripting_spec.js @@ -218,20 +218,20 @@ describe("Interaction", () => { ); const expected = [ - ["#\\36 8R", "Group1=Choice1::1"], - ["#\\36 9R", "Group1=Choice2::2"], - ["#\\37 0R", "Group1=Choice3::3"], - ["#\\37 1R", "Group1=Choice4::4"], + ["#\\38 1R", "Group1=Choice1::1"], + ["#\\38 2R", "Group1=Choice2::2"], + ["#\\38 3R", "Group1=Choice3::3"], + ["#\\38 4R", "Group1=Choice4::4"], ]; for (const [selector, expectedText] of expected) { // Clear the textfield - await clearInput(page, "#\\36 7R"); + await clearInput(page, "#\\38 0R"); await page.click(selector); await page.waitForFunction( - `document.querySelector("#\\\\36 7R").value !== ""` + `document.querySelector("#\\\\38 0R").value !== ""` ); - const text = await page.$eval("#\\36 7R", el => el.value); + const text = await page.$eval("#\\38 0R", el => el.value); expect(text).withContext(`In ${browserName}`).toEqual(expectedText); } }) @@ -242,24 +242,24 @@ describe("Interaction", () => { await Promise.all( pages.map(async ([browserName, page]) => { const expected = [ - ["#\\37 2R", "Check1=Yes::5"], - ["#\\37 4R", "Check2=Yes::6"], - ["#\\37 5R", "Check3=Yes::7"], - ["#\\37 6R", "Check4=Yes::8"], - ["#\\37 2R", "Check1=Off::5"], - ["#\\37 4R", "Check2=Off::6"], - ["#\\37 5R", "Check3=Off::7"], - ["#\\37 6R", "Check4=Off::8"], + ["#\\38 5R", "Check1=Yes::5"], + ["#\\38 7R", "Check2=Yes::6"], + ["#\\38 8R", "Check3=Yes::7"], + ["#\\38 9R", "Check4=Yes::8"], + ["#\\38 5R", "Check1=Off::5"], + ["#\\38 7R", "Check2=Off::6"], + ["#\\38 8R", "Check3=Off::7"], + ["#\\38 9R", "Check4=Off::8"], ]; for (const [selector, expectedText] of expected) { // Clear the textfield - await clearInput(page, "#\\36 7R"); + await clearInput(page, "#\\38 0R"); await page.click(selector); await page.waitForFunction( - `document.querySelector("#\\\\36 7R").value !== ""` + `document.querySelector("#\\\\38 0R").value !== ""` ); - const text = await page.$eval("#\\36 7R", el => el.value); + const text = await page.$eval("#\\38 0R", el => el.value); expect(text).withContext(`In ${browserName}`).toEqual(expectedText); } }) @@ -270,21 +270,51 @@ describe("Interaction", () => { await Promise.all( pages.map(async ([browserName, page]) => { const expected = [ - ["#\\37 7R", "Check5=Yes1::9"], - ["#\\37 8R", "Check5=Yes2::10"], - ["#\\37 9R", "Check5=Yes3::11"], - ["#\\38 0R", "Check5=Yes4::12"], - ["#\\38 0R", "Check5=Off::12"], + ["#\\39 0R", "Check5=Yes1::9"], + ["#\\39 1R", "Check5=Yes2::10"], + ["#\\39 2R", "Check5=Yes3::11"], + ["#\\39 3R", "Check5=Yes4::12"], + ["#\\39 3R", "Check5=Off::12"], ]; for (const [selector, expectedText] of expected) { // Clear the textfield - await clearInput(page, "#\\36 7R"); + await clearInput(page, "#\\38 0R"); await page.click(selector); await page.waitForFunction( - `document.querySelector("#\\\\36 7R").value !== ""` + `document.querySelector("#\\\\38 0R").value !== ""` ); - const text = await page.$eval("#\\36 7R", el => el.value); + const text = await page.$eval("#\\38 0R", el => el.value); + expect(text).withContext(`In ${browserName}`).toEqual(expectedText); + } + }) + ); + }); + + it("must show values in a text input when clicking on checkboxes or radio with no actions", async () => { + await Promise.all( + pages.map(async ([browserName, page]) => { + const expected = [ + ["", "Off;Off"], + ["#\\39 4R", "Yes;Off"], + ["#\\39 5R", "Yes;NoAct2"], + ["#\\39 6R", "Yes;NoAct3"], + ["#\\39 4R", "Off;NoAct3"], + ["#\\39 5R", "Off;NoAct2"], + ]; + for (const [selector, expectedText] of expected) { + // Clear the textfield + await clearInput(page, "#\\38 0R"); + + if (selector) { + await page.click(selector); + } + + await page.click("[data-annotation-id='97R']"); + await page.waitForFunction( + `document.querySelector("#\\\\38 0R").value !== ""` + ); + const text = await page.$eval("#\\38 0R", el => el.value); expect(text).withContext(`In ${browserName}`).toEqual(expectedText); } }) diff --git a/test/pdfs/js-buttons.pdf b/test/pdfs/js-buttons.pdf index 4238249b91dad9f3d4bd3496f3322e1839d15eab..a839176de1a39211bf0ed084d3736d9dff4504e3 100644 GIT binary patch delta 5757 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�QZkkN3pm#Zi0`occCHkBk>>c)MMXO+li#qksE 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