Ograniczone FormCalc i JavaScript w XFA

HotPDF ewaluuje skrypty obliczeń XFA podczas spłaszczania formularza, z zawsze dostępną ograniczoną ścieżką FormCalc i szerszą ścieżką QuickJS, która pozostaje wyłączona, dopóki aplikacja jawnie jej nie włączy

Rozszerzony FormCalc

Wyrażenia FormCalc wspierają arytmetykę, łańcuchy, wartości boolowskie, operatory porównań, zwarcowe And, Or i Not oraz leniwy warunek If(condition, whenTrue, whenFalse)

Sum, Avg, Min, Max i Count przyjmują mieszane argumenty skalarne i zbiory węzłów SOM przy użyciu ścieżek ukorzenionych, bezpośrednich, indeksowanych, wieloznacznych i potomnych, takich jak $record.rows[*].amount; ewaluowana jest tylko wybrana gałąź If, więc nieużywana nieprawidłowa gałąź nie odrzuca obliczenia

Zagnieżdżone wywołania mogą łączyć wyniki liczbowe, łańcuchowe i zbiory węzłów, z deterministycznym wsparciem dla At, Choose, Concat, LTrim, RTrim, Str, Stuff, Null, Sign, Exp, Log, Sin, Cos, Tan, Deg2Rad, Rad2Deg, Within i Oneof

Funkcje definiowane przez użytkownika, pętle, przypisania, klauzule obrazów locale oraz funkcje sieciowe pozostają poza natywnym podzbiorem i zachowują strategię fail closed

InstanceAdd(name, count) i InstanceRemove(name, index) są wywoływane przez OnXFAInstanceAction dopiero po walidacji argumentów i budżetu operacji

Opcjonalny JavaScript

Ustaw THotPDF.XFAJavaScriptEnabled na True przed ApplyXFAAsAcroForm lub FlattenLoadedXFA, aby uruchamiać skrypty, których contentType wybiera JavaScript

Runtime wspiera normalny przepływ sterowania JavaScript i natywne tablice typowane, takie jak Float64Array, ale nie otrzymuje żadnego obiektu plikowego, procesowego, sieciowego, przeglądarkowego ani aplikacyjnego; fetch, XMLHttpRequest, WebSocket, require, process i Deno są niedostępne

var
  Budgets: THPDFXFAFormScriptBudgets;
begin
  Budgets := THPDFXFAFormScriptBudgets.Default;
  Budgets.MaxElapsedMilliseconds := 100;
  Budgets.JavaScriptMemoryBytes := 8 * 1024 * 1024;
  PDF.XFAFormScriptBudgets := Budgets;
  PDF.XFAJavaScriptEnabled := True;
  PDF.OnXFAInstanceAction := HandleXFAInstanceAction;
  PDF.ApplyXFAAsAcroForm(XDPBytes, False);
end;

Kontekst skryptu

JavaScript otrzymuje mutowalne this.rawValue, event.value oraz zamrożoną fasadę xfa

Budżety i telemetria

THPDFXFAFormScriptBudgets ogranicza bajty skryptu, operacje FormCalc, upływający czas, głębokość wyrażeń, elementy powtarzanych tablic, bajty wartości, operacje na instancjach, pamięć JavaScript, użycie stosu JavaScript i sprawdzenia przerwań

Budżet stosu zapewnia granicę rekurencji, a budżety czasu i przerwań zatrzymują pętle, które się nie kończą; skrypty przekraczające jakąkolwiek granicę kończą się bezpieczną porażką i dopisują diagnostykę do XFAFlattenWarnings

XFAFlattenScriptsEvaluated, XFAFlattenScriptsRejected i XFAFlattenInstanceOperations raportują ostatni przebieg spłaszczania

Bezpośrednia integracja runtime

Rozszerzone przeciążenie HPDFXFAFlatten przyjmuje bezpośrednio TXFAFormScriptOptions i TXFAFormInstanceAction; przypisz TXFAFormScriptOptions.JavaScriptEvaluator, aby zaadaptować statyczne bindowanie QuickJS albo inny ewaluator należący do aplikacji, zachowując ten sam wrapper i budżety

Zobacz TXFAFormScriptOptions, TXFAFormScriptLimits, THPDFXFAFormScriptBudgets i THPDFXFAInstanceAction