diff --git a/src/scripting_api/aform.js b/src/scripting_api/aform.js index dd780d2c2..5719de438 100644 --- a/src/scripting_api/aform.js +++ b/src/scripting_api/aform.js @@ -220,10 +220,6 @@ class AForm { bCurrencyPrepend ) { const event = globalThis.event; - if (!event.value) { - return; - } - let value = this.AFMakeNumber(event.value); if (value === null) { event.value = ""; diff --git a/src/scripting_api/event.js b/src/scripting_api/event.js index 20be53657..c3f73b263 100644 --- a/src/scripting_api/event.js +++ b/src/scripting_api/event.js @@ -335,7 +335,7 @@ class EventDispatcher { event.value = null; const target = this._objects[targetId]; - let savedValue = target.obj.value; + let savedValue = target.obj._getValue(); this.runActions(source, target, event, "Calculate"); if (!event.rc) { continue; @@ -344,18 +344,23 @@ class EventDispatcher { if (event.value !== null) { // A new value has been calculated so set it. target.obj.value = event.value; + } else { + event.value = target.obj._getValue(); } - event.value = target.obj.value; this.runActions(target, target, event, "Validate"); if (!event.rc) { - if (target.obj.value !== savedValue) { + if (target.obj._getValue() !== savedValue) { target.wrapped.value = savedValue; } continue; } - savedValue = event.value = target.obj.value; + if (event.value === null) { + event.value = target.obj._getValue(); + } + + savedValue = target.obj._getValue(); let formattedValue = null; if (this.runActions(target, target, event, "Format")) { formattedValue = event.value?.toString?.(); diff --git a/test/integration/scripting_spec.mjs b/test/integration/scripting_spec.mjs index 8824be38b..daa572920 100644 --- a/test/integration/scripting_spec.mjs +++ b/test/integration/scripting_spec.mjs @@ -2324,4 +2324,46 @@ describe("Interaction", () => { ); }); }); + + describe("Textfield with a number and some decimals", () => { + let pages; + let otherPages; + + beforeAll(async () => { + otherPages = await Promise.all( + global.integrationSessions.map(async session => + session.browser.newPage() + ) + ); + pages = await loadAndWait("issue17540.pdf", getSelector("15R")); + }); + + afterAll(async () => { + await closePages(pages); + await Promise.all(otherPages.map(page => page.close())); + }); + + it("must check the number has the correct number of decimals", async () => { + await Promise.all( + pages.map(async ([browserName, page], i) => { + await page.waitForFunction( + "window.PDFViewerApplication.scriptingReady === true" + ); + + await page.click(getSelector("15R")); + await page.type(getSelector("15R"), "3"); + await page.keyboard.press("Enter"); + + await page.waitForFunction( + sel => document.querySelector(sel).value !== "", + {}, + getSelector("16R") + ); + + const text = await page.$eval(getSelector("16R"), el => el.value); + expect(text).withContext(`In ${browserName}`).toEqual("0.900"); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 640aa4184..2404660d8 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -625,3 +625,4 @@ !bug1871353.1.pdf !file_pdfjs_form.pdf !issue17492.pdf +!issue17540.pdf diff --git a/test/pdfs/issue17540.pdf b/test/pdfs/issue17540.pdf new file mode 100644 index 000000000..4f3cc5ac0 Binary files /dev/null and b/test/pdfs/issue17540.pdf differ diff --git a/test/unit/scripting_spec.js b/test/unit/scripting_spec.js index d3d85dc51..57ec42809 100644 --- a/test/unit/scripting_spec.js +++ b/test/unit/scripting_spec.js @@ -716,6 +716,11 @@ describe("Scripting", function () { `AFNumber_Format(2, 0, 3, 0, "€", false);` + `event.source.value = event.value;`, ], + test6: [ + `event.value = 0;` + + `AFNumber_Format(2, 0, 0, 0, "€", false);` + + `event.source.value = event.value;`, + ], }, type: "text", }, @@ -727,6 +732,30 @@ describe("Scripting", function () { }; sandbox.createSandbox(data); + await sandbox.dispatchEventInSandbox({ + id: refId, + value: "0", + name: "test1", + }); + expect(send_queue.has(refId)).toEqual(true); + expect(send_queue.get(refId)).toEqual({ + id: refId, + value: "0.00€", + }); + send_queue.delete(refId); + + await sandbox.dispatchEventInSandbox({ + id: refId, + value: "", + name: "test6", + }); + expect(send_queue.has(refId)).toEqual(true); + expect(send_queue.get(refId)).toEqual({ + id: refId, + value: "0.00€", + }); + send_queue.delete(refId); + await sandbox.dispatchEventInSandbox({ id: refId, value: "123456.789",