Skip to content

Commit

Permalink
[JS] Skip throwing actions
Browse files Browse the repository at this point in the history
It fixes #19505.

We were invaliding throwing actions (in setting event.rc to false) and all the event process was stopped.
Now we're just dumping the exception in the console: the action is skipped and event.rc is not set
else the input fields aren't updated wit KeyStroke actions.
  • Loading branch information
calixteman committed Feb 17, 2025
1 parent affce70 commit 8f92322
Show file tree
Hide file tree
Showing 6 changed files with 49 additions and 23 deletions.
11 changes: 9 additions & 2 deletions src/scripting_api/doc.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,9 +175,16 @@ class Doc extends PDFObject {

_runActions(name) {
const actions = this._actions.get(name);
if (actions) {
for (const action of actions) {
if (!actions) {
return;
}
for (const action of actions) {
try {
this._globalEval(action);
} catch (error) {
const serializedError = serializeError(error);
serializedError.value = `Error when executing "${name}" for document\n${serializedError.value}`;
this._send(serializedError);
}
}
}
Expand Down
19 changes: 3 additions & 16 deletions src/scripting_api/event.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
*/

import {
serializeError,
USERACTIVATION_CALLBACKID,
USERACTIVATION_MAXTIME_VALIDITY,
} from "./app_utils.js";
Expand Down Expand Up @@ -311,12 +310,7 @@ class EventDispatcher {
const source = this._objects[first];
globalThis.event = new Event({});

try {
this.runCalculate(source, globalThis.event);
} catch (error) {
this._isCalculating = false;
throw error;
}
this.runCalculate(source, globalThis.event);

this._isCalculating = false;
}
Expand Down Expand Up @@ -345,15 +339,8 @@ class EventDispatcher {
event.value = null;
const target = this._objects[targetId];
let savedValue = target.obj._getValue();
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;
}
this.runActions(source, target, event, "Calculate");

if (!event.rc) {
continue;
}
Expand Down
12 changes: 7 additions & 5 deletions src/scripting_api/field.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import { createActionsMap, FieldType, getFieldType } from "./common.js";
import { Color } from "./color.js";
import { PDFObject } from "./pdf_object.js";
import { serializeError } from "./app_utils.js";

class Field extends PDFObject {
constructor(data) {
Expand Down Expand Up @@ -552,14 +553,15 @@ class Field extends PDFObject {
}

const actions = this._actions.get(eventName);
try {
for (const action of actions) {
for (const action of actions) {
try {
// Action evaluation must happen in the global scope
this._globalEval(action);
} catch (error) {
const serializedError = serializeError(error);
serializedError.value = `Error when executing "${eventName}" for field "${this._id}"\n${serializedError.value}`;
this._send(serializedError);
}
} catch (error) {
event.rc = false;
throw error;
}

return true;
Expand Down
29 changes: 29 additions & 0 deletions test/integration/scripting_spec.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -2528,4 +2528,33 @@ describe("Interaction", () => {
);
});
});

describe("Skip throwing actions (issue 19505)", () => {
let pages;

beforeAll(async () => {
pages = await loadAndWait("issue19505.pdf", "[data-annotation-id='24R']");
});

afterAll(async () => {
await closePages(pages);
});

it("must check that date entered are in the input", async () => {
await Promise.all(
pages.map(async ([browserName, page]) => {
await waitForScripting(page);

const fieldSelector = getSelector("24R");
for (const c of "Hello World") {
await page.type(fieldSelector, c);
await waitForSandboxTrip(page);
}

const value = await page.$eval(fieldSelector, el => el.value);
expect(value).withContext(`In ${browserName}`).toEqual("Hello World");
})
);
});
});
});
1 change: 1 addition & 0 deletions test/pdfs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -704,3 +704,4 @@
!issue19360.pdf
!bug1019475_1.pdf
!bug1019475_2.pdf
!issue19505.pdf
Binary file added test/pdfs/issue19505.pdf
Binary file not shown.

0 comments on commit 8f92322

Please sign in to comment.