From ad12f3399934aa8f72fea19d88ffb7bddf900007 Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Mon, 5 Aug 2024 19:11:48 +0200 Subject: [PATCH] Don't stop calculating field values when a Calculate callback throws It fixes #18561. --- src/scripting_api/event.js | 11 ++++++++++- test/integration/scripting_spec.mjs | 28 ++++++++++++++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue18561.pdf | Bin 0 -> 7043 bytes 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100755 test/pdfs/issue18561.pdf diff --git a/src/scripting_api/event.js b/src/scripting_api/event.js index 2df21a923..4683f9b8f 100644 --- a/src/scripting_api/event.js +++ b/src/scripting_api/event.js @@ -14,6 +14,7 @@ */ import { + serializeError, USERACTIVATION_CALLBACKID, USERACTIVATION_MAXTIME_VALIDITY, } from "./app_utils.js"; @@ -344,7 +345,15 @@ class EventDispatcher { event.value = null; const target = this._objects[targetId]; let savedValue = target.obj._getValue(); - this.runActions(source, target, event, "Calculate"); + try { + this.runActions(source, target, event, "Calculate"); + } catch (error) { + const fieldId = target.obj._id; + const serializedError = serializeError(error); + serializedError.value = `Error when calculating value for field "${fieldId}"\n${serializedError.value}`; + this._externalCall("send", [serializedError]); + continue; + } if (!event.rc) { continue; } diff --git a/test/integration/scripting_spec.mjs b/test/integration/scripting_spec.mjs index 94e5f3a7e..d0b1a7485 100644 --- a/test/integration/scripting_spec.mjs +++ b/test/integration/scripting_spec.mjs @@ -2510,4 +2510,32 @@ describe("Interaction", () => { ); }); }); + + describe("Calculate field value even if one callback throws", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("issue18561.pdf", getSelector("24R")); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must check that the product is computed although a callback threw", async () => { + await Promise.all( + pages.map(async ([browserName, page], i) => { + await waitForScripting(page); + + const inputSelector = getSelector("24R"); + await page.click(inputSelector); + await page.type(inputSelector, "123"); + await page.click(getSelector("25R")); + await page.waitForFunction( + `${getQuerySelector("28R")}.value === "12300"` + ); + }) + ); + }); + }); }); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index b353f8d31..af276cad1 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -660,3 +660,4 @@ !issue18099_reduced.pdf !file_pdfjs_test.pdf !issue18536.pdf +!issue18561.pdf diff --git a/test/pdfs/issue18561.pdf b/test/pdfs/issue18561.pdf new file mode 100755 index 0000000000000000000000000000000000000000..2965cdcaa34ceb004bc4cd5ced525121abdeda59 GIT binary patch literal 7043 zcmeHM2~-nz8VBVv1r;r>ipLm_iW26?Bq0$HNQ_(&2vJ0el1wHLNHTFU9NvOAx}JE| zi>kDxT`kyGp|-WKXgxqJ6s_8p)}ty`t<@sxYTf@N!Ni(&>wDYxcHfgDFEjI=Eo%dE_2b9E5Qh&LNl;ocNlhCqz@wBh zh!hWvlFDT`5*mev%48zhxG0evkBUMgGT>N~mMlyMiKAln zKt}>}j9Z9y*Hj*uAi5P4>mH zm+t-K=I-Sd_>I>cKMsJ|yg;CQ?Ax-N1IEWu-`0#Owaz9QdzHyUhS`dJ# zGb51@tfL5pQy{(=o&<%8o{2XzGn35BR1$7o@(C|ht;eBY-vQo99%*lGDymyuw59r^ zUA6w)lSgZ7Jh}6opI2NYVMWePuPB11 z

d$FgA20tRNY+R?Vm(mV!z+F^@3-0$L!E^)N}D1-_#;Q7ht7AZwtq9CSkk4hW)5 zCW^5@m~ADcl!+lt;20HKjY(RlrOrT< zq=m|(2@;SOuvAGgfS(XzV+0$qQ*c5@aM8}zQ2`qPW_8WN!RE&9HyimxB3PkjXgwgP zJyurQ>3at36ay>=iGqC;LmKiSjP%#}ygam9>-MMIaIUe?syn010&f;$jcW^|Xay_pO~9Vlkhs z!FIZV)k|TFj@8R<-97PZ(1<$K`kb?9JID^eN5CD)-=9 z-3}P&iA&$wdFtcC?a@EHw#XuFc`#t_MB>`nFOLllx-fK_A#H%?`~^OxvXT)eP_1m+ma(}wz?9fL+B^*D)NzwhBi|&T4SZ;svisjCe-V@ek$4n(?$-%PS z%}vQ$6|s+2Ub;MOOBe}{X0bEp5~=~?GDmn?`n;@AEvxvc+|0TtnkD^K5FvD&hy|ItM!jTv#X7e)8m zel_OT{QVU*`#-#VX8yaX1&L+HM)w`^inh)7;AFCL_wM}OvfnS|h3m&qdsx^3Dr|D!gwNz&MS<9lIE zy662-wW;Cvulrn^{NZ}}jUU`6U7!bdX&;g_cxKCzm3M~>Fy+UkjNY}kVtn;J&p|a| z1MUvm=w1B@ziv*y(8t@~#xfxSB37*!81J#dr*BjJ((VgXi$~O?xbN-qdi(dR)kTGU zCis_Rc5U+7dDGu`By^$l(sFZX#o+oF$%*$7V}1I%K|3l<4=2o>`>^}2Z9gQdU;CcR5$Lt*sH9xD0=n5MDEsp%Cyz*{xogM+I5>ZPBCP8w|wu@!dcrb zCOFRXI=*CNL-4WK)8^x`jSZ80ViFQhdyLLoCd57C$IImIdP~{gXOxS@RS)YP-g+?P zL4H2lFIAj>ZLEvb*gL-+ir-C5(3zP~Wb044{8Fgx(Ls?&$iv_ z`FtV%^tL=%kzj+lvnz5eW7yb2vzo{y8AwBB=}qC>pFaMK3+c7t+*E-AQJAGB)P*P|#8$pi+6&ejDi=;4|s|H;v4X&{Yk;|TOnmwEtGh2p8IOLs=2OHH#A9?$533&0)UrIK2kO%VkSAfHiW8)}W3 ziDG3^DLPkYpbBgWTi1g{2&@W-SfZe`dff~eXjUV@GU7ZWl!pjZs7QkIC8&5bf=Li0 z4E~Lz18S=cDHw3TFy_JrB0&VsHk>4XW22MYuB<#4iG4h<%KpZV)dNMVD9R9F)aFVAcaV-zm2tW{Ok(#F#iA1PQOo~Gh+!}^L;jH_d z-B=Tt{7eMdX;-At@NrBnVohQ^9My&LLPCTgO`7oH><4$|tR#2>GK}7-8 z41QY9oVaac_+RqrNaQauZ!`MR$qRw|60VnUy$}K~B>a+HFX4J21YSt^CAaB&<1 z5qMM{&Mg4rj*EedeP;is=RpDT$Mc}dHV>YJPmE4RS~^Z91g!)^D#z>a^(E{C=soPM zxBGm3&fTN0+m-fL&bx@l=~4B6o=#B=`{Qtwws1n?6v4+DPg!Dv!3bT2fz}?aL=XWk z0#9R43lXIVN&0HxJICQ>bHcI2xQXV3kmF#2P4*diJauUk!f#R>4_?-!La-)&GaswO z`KMbtP9)ahO=rL8W#T4Lae8{x&+_xuv|fdfJQry>J>>qMc(e2T%N+dqS2(EsiN+ti z!g1>|LVogzZ-VcN>Zn7rp}KS*O?%POA0y9YZJ8hJ