in src/scripting_api/event.js [83:239]
dispatch(baseEvent) {
if (
typeof PDFJSDev !== "undefined" &&
PDFJSDev.test("TESTING") &&
baseEvent.name === "sandboxtripbegin"
) {
this._externalCall("send", [{ command: "sandboxTripEnd" }]);
return;
}
const id = baseEvent.id;
if (!(id in this._objects)) {
let event;
if (id === "doc" || id === "page") {
event = globalThis.event = new Event(baseEvent);
event.source = event.target = this._document.wrapped;
event.name = baseEvent.name;
}
if (id === "doc") {
const eventName = event.name;
if (eventName === "Open") {
// The user has decided to open this pdf, hence we enable
// userActivation.
this.userActivation();
// Initialize named actions before calling formatAll to avoid any
// errors in the case where a formatter is using one of those named
// actions (see #15818).
this._document.obj._initActions();
// Before running the Open event, we run the format callbacks but
// without changing the value of the fields.
// Acrobat does the same thing.
this.formatAll();
}
if (
!["DidPrint", "DidSave", "WillPrint", "WillSave"].includes(eventName)
) {
this.userActivation();
}
this._document.obj._dispatchDocEvent(event.name);
} else if (id === "page") {
this.userActivation();
this._document.obj._dispatchPageEvent(
event.name,
baseEvent.actions,
baseEvent.pageNumber
);
} else if (id === "app" && baseEvent.name === "ResetForm") {
this.userActivation();
for (const fieldId of baseEvent.ids) {
const obj = this._objects[fieldId];
obj?.obj._reset();
}
}
return;
}
const name = baseEvent.name;
const source = this._objects[id];
const event = (globalThis.event = new Event(baseEvent));
let savedChange;
this.userActivation();
if (source.obj._isButton()) {
source.obj._id = id;
event.value = source.obj._getExportValue(event.value);
if (name === "Action") {
source.obj._value = event.value;
}
}
switch (name) {
case "Keystroke":
savedChange = {
value: event.value,
changeEx: event.changeEx,
change: event.change,
selStart: event.selStart,
selEnd: event.selEnd,
};
break;
case "Blur":
case "Focus":
Object.defineProperty(event, "value", {
configurable: false,
writable: false,
enumerable: true,
value: event.value,
});
break;
case "Validate":
this.runValidation(source, event);
return;
case "Action":
this.runActions(source, source, event, name);
this.runCalculate(source, event);
return;
}
this.runActions(source, source, event, name);
if (name !== "Keystroke") {
return;
}
if (event.rc) {
if (event.willCommit) {
this.runValidation(source, event);
} else {
if (source.obj._isChoice) {
source.obj.value = savedChange.changeEx;
source.obj._send({
id: source.obj._id,
siblings: source.obj._siblings,
value: source.obj.value,
});
return;
}
const value = (source.obj.value = this.mergeChange(event));
let selStart, selEnd;
if (
event.selStart !== savedChange.selStart ||
event.selEnd !== savedChange.selEnd
) {
// Selection has been changed by the script so apply the changes.
selStart = event.selStart;
selEnd = event.selEnd;
} else {
selEnd = selStart = savedChange.selStart + event.change.length;
}
source.obj._send({
id: source.obj._id,
siblings: source.obj._siblings,
value,
selRange: [selStart, selEnd],
});
}
} else if (!event.willCommit) {
source.obj._send({
id: source.obj._id,
siblings: source.obj._siblings,
value: savedChange.value,
selRange: [savedChange.selStart, savedChange.selEnd],
});
} else {
// Entry is not valid (rc == false) and it's a commit
// so just clear the field.
source.obj._send({
id: source.obj._id,
siblings: source.obj._siblings,
value: "",
formattedValue: null,
selRange: [0, 0],
});
}
}