Skip to content

Commit d3ec162

Browse files
committed
Use the original value of a field when propagating event (fixes mozilla#17540)
And avoid to not format a field when the value is 0.
1 parent f8e3c79 commit d3ec162

File tree

6 files changed

+82
-9
lines changed

6 files changed

+82
-9
lines changed

src/scripting_api/aform.js

-4
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,6 @@ class AForm {
220220
bCurrencyPrepend
221221
) {
222222
const event = globalThis.event;
223-
if (!event.value) {
224-
return;
225-
}
226-
227223
let value = this.AFMakeNumber(event.value);
228224
if (value === null) {
229225
event.value = "";

src/scripting_api/event.js

+9-4
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ class EventDispatcher {
335335

336336
event.value = null;
337337
const target = this._objects[targetId];
338-
let savedValue = target.obj.value;
338+
let savedValue = target.obj._getValue();
339339
this.runActions(source, target, event, "Calculate");
340340
if (!event.rc) {
341341
continue;
@@ -344,18 +344,23 @@ class EventDispatcher {
344344
if (event.value !== null) {
345345
// A new value has been calculated so set it.
346346
target.obj.value = event.value;
347+
} else {
348+
event.value = target.obj._getValue();
347349
}
348350

349-
event.value = target.obj.value;
350351
this.runActions(target, target, event, "Validate");
351352
if (!event.rc) {
352-
if (target.obj.value !== savedValue) {
353+
if (target.obj._getValue() !== savedValue) {
353354
target.wrapped.value = savedValue;
354355
}
355356
continue;
356357
}
357358

358-
savedValue = event.value = target.obj.value;
359+
if (event.value === null) {
360+
event.value = target.obj._getValue();
361+
}
362+
363+
savedValue = target.obj._getValue();
359364
let formattedValue = null;
360365
if (this.runActions(target, target, event, "Format")) {
361366
formattedValue = event.value?.toString?.();

test/integration/scripting_spec.mjs

+43-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import {
2929
waitForEntryInStorage,
3030
} from "./test_utils.mjs";
3131

32-
describe("Interaction", () => {
32+
fdescribe("Interaction", () => {
3333
async function actAndWaitForInput(page, selector, action, clear = true) {
3434
await page.waitForSelector(selector, {
3535
timeout: 0,
@@ -2324,4 +2324,46 @@ describe("Interaction", () => {
23242324
);
23252325
});
23262326
});
2327+
2328+
describe("Textfield with a number and some decimals", () => {
2329+
let pages;
2330+
let otherPages;
2331+
2332+
beforeAll(async () => {
2333+
otherPages = await Promise.all(
2334+
global.integrationSessions.map(async session =>
2335+
session.browser.newPage()
2336+
)
2337+
);
2338+
pages = await loadAndWait("issue17540.pdf", getSelector("15R"));
2339+
});
2340+
2341+
afterAll(async () => {
2342+
await closePages(pages);
2343+
await Promise.all(otherPages.map(page => page.close()));
2344+
});
2345+
2346+
it("must check the number has the correct number of decimals", async () => {
2347+
await Promise.all(
2348+
pages.map(async ([browserName, page], i) => {
2349+
await page.waitForFunction(
2350+
"window.PDFViewerApplication.scriptingReady === true"
2351+
);
2352+
2353+
await page.click(getSelector("15R"));
2354+
await page.type(getSelector("15R"), "3");
2355+
await page.keyboard.press("Enter");
2356+
2357+
await page.waitForFunction(
2358+
sel => document.querySelector(sel).value !== "",
2359+
{},
2360+
getSelector("16R")
2361+
);
2362+
2363+
const text = await page.$eval(getSelector("16R"), el => el.value);
2364+
expect(text).withContext(`In ${browserName}`).toEqual("0.900");
2365+
})
2366+
);
2367+
});
2368+
});
23272369
});

test/pdfs/.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -625,3 +625,4 @@
625625
!bug1871353.1.pdf
626626
!file_pdfjs_form.pdf
627627
!issue17492.pdf
628+
!issue17540.pdf

test/pdfs/issue17540.pdf

38.9 KB
Binary file not shown.

test/unit/scripting_spec.js

+29
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,11 @@ describe("Scripting", function () {
716716
`AFNumber_Format(2, 0, 3, 0, "€", false);` +
717717
`event.source.value = event.value;`,
718718
],
719+
test6: [
720+
`event.value = 0;` +
721+
`AFNumber_Format(2, 0, 0, 0, "€", false);` +
722+
`event.source.value = event.value;`,
723+
],
719724
},
720725
type: "text",
721726
},
@@ -727,6 +732,30 @@ describe("Scripting", function () {
727732
};
728733

729734
sandbox.createSandbox(data);
735+
await sandbox.dispatchEventInSandbox({
736+
id: refId,
737+
value: "0",
738+
name: "test1",
739+
});
740+
expect(send_queue.has(refId)).toEqual(true);
741+
expect(send_queue.get(refId)).toEqual({
742+
id: refId,
743+
value: "0.00€",
744+
});
745+
send_queue.delete(refId);
746+
747+
await sandbox.dispatchEventInSandbox({
748+
id: refId,
749+
value: "",
750+
name: "test6",
751+
});
752+
expect(send_queue.has(refId)).toEqual(true);
753+
expect(send_queue.get(refId)).toEqual({
754+
id: refId,
755+
value: "0.00€",
756+
});
757+
send_queue.delete(refId);
758+
730759
await sandbox.dispatchEventInSandbox({
731760
id: refId,
732761
value: "123456.789",

0 commit comments

Comments
 (0)