xref: /aosp_15_r20/external/pdfium/fxjs/xfa/cfxjse_formcalc_context.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2014 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef FXJS_XFA_CFXJSE_FORMCALC_CONTEXT_H_
8 #define FXJS_XFA_CFXJSE_FORMCALC_CONTEXT_H_
9 
10 #include <stdint.h>
11 
12 #include <functional>
13 
14 #include "core/fxcrt/bytestring.h"
15 #include "core/fxcrt/widetext_buffer.h"
16 #include "fxjs/xfa/fxjse.h"
17 #include "third_party/abseil-cpp/absl/types/optional.h"
18 #include "v8/include/cppgc/persistent.h"
19 #include "v8/include/v8-forward.h"
20 #include "v8/include/v8-persistent-handle.h"
21 
22 class CFXJSE_Context;
23 class CXFA_Document;
24 
25 namespace cppgc {
26 class Heap;
27 }  // namespace cppgc
28 
29 class CFXJSE_FormCalcContext final : public CFXJSE_HostObject {
30  public:
31   CFXJSE_FormCalcContext(v8::Isolate* pIsolate,
32                          CFXJSE_Context* pScriptContext,
33                          CXFA_Document* pDoc);
34   ~CFXJSE_FormCalcContext() override;
35 
36   // CFXJSE_HostObject:
37   CFXJSE_FormCalcContext* AsFormCalcContext() override;
38 
39   static void Abs(CFXJSE_HostObject* pThis,
40                   const v8::FunctionCallbackInfo<v8::Value>& info);
41   static void Avg(CFXJSE_HostObject* pThis,
42                   const v8::FunctionCallbackInfo<v8::Value>& info);
43   static void Ceil(CFXJSE_HostObject* pThis,
44                    const v8::FunctionCallbackInfo<v8::Value>& info);
45   static void Count(CFXJSE_HostObject* pThis,
46                     const v8::FunctionCallbackInfo<v8::Value>& info);
47   static void Floor(CFXJSE_HostObject* pThis,
48                     const v8::FunctionCallbackInfo<v8::Value>& info);
49   static void Max(CFXJSE_HostObject* pThis,
50                   const v8::FunctionCallbackInfo<v8::Value>& info);
51   static void Min(CFXJSE_HostObject* pThis,
52                   const v8::FunctionCallbackInfo<v8::Value>& info);
53   static void Mod(CFXJSE_HostObject* pThis,
54                   const v8::FunctionCallbackInfo<v8::Value>& info);
55   static void Round(CFXJSE_HostObject* pThis,
56                     const v8::FunctionCallbackInfo<v8::Value>& info);
57   static void Sum(CFXJSE_HostObject* pThis,
58                   const v8::FunctionCallbackInfo<v8::Value>& info);
59   static void Date(CFXJSE_HostObject* pThis,
60                    const v8::FunctionCallbackInfo<v8::Value>& info);
61   static void Date2Num(CFXJSE_HostObject* pThis,
62                        const v8::FunctionCallbackInfo<v8::Value>& info);
63   static void DateFmt(CFXJSE_HostObject* pThis,
64                       const v8::FunctionCallbackInfo<v8::Value>& info);
65   static void IsoDate2Num(CFXJSE_HostObject* pThis,
66                           const v8::FunctionCallbackInfo<v8::Value>& info);
67   static void IsoTime2Num(CFXJSE_HostObject* pThis,
68                           const v8::FunctionCallbackInfo<v8::Value>& info);
69   static void LocalDateFmt(CFXJSE_HostObject* pThis,
70                            const v8::FunctionCallbackInfo<v8::Value>& info);
71   static void LocalTimeFmt(CFXJSE_HostObject* pThis,
72                            const v8::FunctionCallbackInfo<v8::Value>& info);
73   static void Num2Date(CFXJSE_HostObject* pThis,
74                        const v8::FunctionCallbackInfo<v8::Value>& info);
75   static void Num2GMTime(CFXJSE_HostObject* pThis,
76                          const v8::FunctionCallbackInfo<v8::Value>& info);
77   static void Num2Time(CFXJSE_HostObject* pThis,
78                        const v8::FunctionCallbackInfo<v8::Value>& info);
79   static void Time(CFXJSE_HostObject* pThis,
80                    const v8::FunctionCallbackInfo<v8::Value>& info);
81   static void Time2Num(CFXJSE_HostObject* pThis,
82                        const v8::FunctionCallbackInfo<v8::Value>& info);
83   static void TimeFmt(CFXJSE_HostObject* pThis,
84                       const v8::FunctionCallbackInfo<v8::Value>& info);
85 
86   static ByteString Local2IsoDate(CFXJSE_HostObject* pThis,
87                                   ByteStringView bsDate,
88                                   ByteStringView bsFormat,
89                                   ByteStringView bsLocale);
90   static ByteString IsoDate2Local(CFXJSE_HostObject* pThis,
91                                   ByteStringView bsDate,
92                                   ByteStringView bsFormat,
93                                   ByteStringView bsLocale);
94   static ByteString IsoTime2Local(CFXJSE_HostObject* pThis,
95                                   ByteStringView bsTime,
96                                   ByteStringView bsFormat,
97                                   ByteStringView bsLocale);
98   static ByteString GetLocalDateFormat(CFXJSE_HostObject* pThis,
99                                        int32_t iStyle,
100                                        ByteStringView bsLocale,
101                                        bool bStandard);
102   static ByteString GetLocalTimeFormat(CFXJSE_HostObject* pThis,
103                                        int32_t iStyle,
104                                        ByteStringView bsLocale,
105                                        bool bStandard);
106   static ByteString GetStandardDateFormat(CFXJSE_HostObject* pThis,
107                                           int32_t iStyle,
108                                           ByteStringView bsLocale);
109   static ByteString GetStandardTimeFormat(CFXJSE_HostObject* pThis,
110                                           int32_t iStyle,
111                                           ByteStringView bsLocale);
112   static ByteString Num2AllTime(CFXJSE_HostObject* pThis,
113                                 int32_t iTime,
114                                 ByteStringView bsFormat,
115                                 ByteStringView bsLocale,
116                                 bool bGM);
117 
118   static void Apr(CFXJSE_HostObject* pThis,
119                   const v8::FunctionCallbackInfo<v8::Value>& info);
120   static void CTerm(CFXJSE_HostObject* pThis,
121                     const v8::FunctionCallbackInfo<v8::Value>& info);
122   static void FV(CFXJSE_HostObject* pThis,
123                  const v8::FunctionCallbackInfo<v8::Value>& info);
124   static void IPmt(CFXJSE_HostObject* pThis,
125                    const v8::FunctionCallbackInfo<v8::Value>& info);
126   static void NPV(CFXJSE_HostObject* pThis,
127                   const v8::FunctionCallbackInfo<v8::Value>& info);
128   static void Pmt(CFXJSE_HostObject* pThis,
129                   const v8::FunctionCallbackInfo<v8::Value>& info);
130   static void PPmt(CFXJSE_HostObject* pThis,
131                    const v8::FunctionCallbackInfo<v8::Value>& info);
132   static void PV(CFXJSE_HostObject* pThis,
133                  const v8::FunctionCallbackInfo<v8::Value>& info);
134   static void Rate(CFXJSE_HostObject* pThis,
135                    const v8::FunctionCallbackInfo<v8::Value>& info);
136   static void Term(CFXJSE_HostObject* pThis,
137                    const v8::FunctionCallbackInfo<v8::Value>& info);
138   static void Choose(CFXJSE_HostObject* pThis,
139                      const v8::FunctionCallbackInfo<v8::Value>& info);
140   static void Exists(CFXJSE_HostObject* pThis,
141                      const v8::FunctionCallbackInfo<v8::Value>& info);
142   static void HasValue(CFXJSE_HostObject* pThis,
143                        const v8::FunctionCallbackInfo<v8::Value>& info);
144   static void Oneof(CFXJSE_HostObject* pThis,
145                     const v8::FunctionCallbackInfo<v8::Value>& info);
146   static void Within(CFXJSE_HostObject* pThis,
147                      const v8::FunctionCallbackInfo<v8::Value>& info);
148   static void If(CFXJSE_HostObject* pThis,
149                  const v8::FunctionCallbackInfo<v8::Value>& info);
150   static void Eval(CFXJSE_HostObject* pThis,
151                    const v8::FunctionCallbackInfo<v8::Value>& info);
152   static void Ref(CFXJSE_HostObject* pThis,
153                   const v8::FunctionCallbackInfo<v8::Value>& info);
154   static void UnitType(CFXJSE_HostObject* pThis,
155                        const v8::FunctionCallbackInfo<v8::Value>& info);
156   static void UnitValue(CFXJSE_HostObject* pThis,
157                         const v8::FunctionCallbackInfo<v8::Value>& info);
158 
159   static void At(CFXJSE_HostObject* pThis,
160                  const v8::FunctionCallbackInfo<v8::Value>& info);
161   static void Concat(CFXJSE_HostObject* pThis,
162                      const v8::FunctionCallbackInfo<v8::Value>& info);
163   static void Decode(CFXJSE_HostObject* pThis,
164                      const v8::FunctionCallbackInfo<v8::Value>& info);
165   static void Encode(CFXJSE_HostObject* pThis,
166                      const v8::FunctionCallbackInfo<v8::Value>& info);
167   static void Format(CFXJSE_HostObject* pThis,
168                      const v8::FunctionCallbackInfo<v8::Value>& info);
169   static void Left(CFXJSE_HostObject* pThis,
170                    const v8::FunctionCallbackInfo<v8::Value>& info);
171   static void Len(CFXJSE_HostObject* pThis,
172                   const v8::FunctionCallbackInfo<v8::Value>& info);
173   static void Lower(CFXJSE_HostObject* pThis,
174                     const v8::FunctionCallbackInfo<v8::Value>& info);
175   static void Ltrim(CFXJSE_HostObject* pThis,
176                     const v8::FunctionCallbackInfo<v8::Value>& info);
177   static void Parse(CFXJSE_HostObject* pThis,
178                     const v8::FunctionCallbackInfo<v8::Value>& info);
179   static void Replace(CFXJSE_HostObject* pThis,
180                       const v8::FunctionCallbackInfo<v8::Value>& info);
181   static void Right(CFXJSE_HostObject* pThis,
182                     const v8::FunctionCallbackInfo<v8::Value>& info);
183   static void Rtrim(CFXJSE_HostObject* pThis,
184                     const v8::FunctionCallbackInfo<v8::Value>& info);
185   static void Space(CFXJSE_HostObject* pThis,
186                     const v8::FunctionCallbackInfo<v8::Value>& info);
187   static void Str(CFXJSE_HostObject* pThis,
188                   const v8::FunctionCallbackInfo<v8::Value>& info);
189   static void Stuff(CFXJSE_HostObject* pThis,
190                     const v8::FunctionCallbackInfo<v8::Value>& info);
191   static void Substr(CFXJSE_HostObject* pThis,
192                      const v8::FunctionCallbackInfo<v8::Value>& info);
193   static void Uuid(CFXJSE_HostObject* pThis,
194                    const v8::FunctionCallbackInfo<v8::Value>& info);
195   static void Upper(CFXJSE_HostObject* pThis,
196                     const v8::FunctionCallbackInfo<v8::Value>& info);
197   static void WordNum(CFXJSE_HostObject* pThis,
198                       const v8::FunctionCallbackInfo<v8::Value>& info);
199 
200   static void Get(CFXJSE_HostObject* pThis,
201                   const v8::FunctionCallbackInfo<v8::Value>& info);
202   static void Post(CFXJSE_HostObject* pThis,
203                    const v8::FunctionCallbackInfo<v8::Value>& info);
204   static void Put(CFXJSE_HostObject* pThis,
205                   const v8::FunctionCallbackInfo<v8::Value>& info);
206   static void assign_value_operator(
207       CFXJSE_HostObject* pThis,
208       const v8::FunctionCallbackInfo<v8::Value>& info);
209   static void logical_or_operator(
210       CFXJSE_HostObject* pThis,
211       const v8::FunctionCallbackInfo<v8::Value>& info);
212   static void logical_and_operator(
213       CFXJSE_HostObject* pThis,
214       const v8::FunctionCallbackInfo<v8::Value>& info);
215   static void equality_operator(
216       CFXJSE_HostObject* pThis,
217       const v8::FunctionCallbackInfo<v8::Value>& info);
218   static void notequality_operator(
219       CFXJSE_HostObject* pThis,
220       const v8::FunctionCallbackInfo<v8::Value>& info);
221   static bool fm_ref_equal(CFXJSE_HostObject* pThis,
222                            const v8::FunctionCallbackInfo<v8::Value>& info);
223   static void less_operator(CFXJSE_HostObject* pThis,
224                             const v8::FunctionCallbackInfo<v8::Value>& info);
225   static void lessequal_operator(
226       CFXJSE_HostObject* pThis,
227       const v8::FunctionCallbackInfo<v8::Value>& info);
228   static void greater_operator(CFXJSE_HostObject* pThis,
229                                const v8::FunctionCallbackInfo<v8::Value>& info);
230   static void greaterequal_operator(
231       CFXJSE_HostObject* pThis,
232       const v8::FunctionCallbackInfo<v8::Value>& info);
233   static void plus_operator(CFXJSE_HostObject* pThis,
234                             const v8::FunctionCallbackInfo<v8::Value>& info);
235   static void minus_operator(CFXJSE_HostObject* pThis,
236                              const v8::FunctionCallbackInfo<v8::Value>& info);
237   static void multiple_operator(
238       CFXJSE_HostObject* pThis,
239       const v8::FunctionCallbackInfo<v8::Value>& info);
240   static void divide_operator(CFXJSE_HostObject* pThis,
241                               const v8::FunctionCallbackInfo<v8::Value>& info);
242   static void positive_operator(
243       CFXJSE_HostObject* pThis,
244       const v8::FunctionCallbackInfo<v8::Value>& info);
245   static void negative_operator(
246       CFXJSE_HostObject* pThis,
247       const v8::FunctionCallbackInfo<v8::Value>& info);
248   static void logical_not_operator(
249       CFXJSE_HostObject* pThis,
250       const v8::FunctionCallbackInfo<v8::Value>& info);
251   static void dot_accessor(CFXJSE_HostObject* pThis,
252                            const v8::FunctionCallbackInfo<v8::Value>& info);
253   static void dotdot_accessor(CFXJSE_HostObject* pThis,
254                               const v8::FunctionCallbackInfo<v8::Value>& info);
255   static void eval_translation(CFXJSE_HostObject* pThis,
256                                const v8::FunctionCallbackInfo<v8::Value>& info);
257   static void is_fm_object(CFXJSE_HostObject* pThis,
258                            const v8::FunctionCallbackInfo<v8::Value>& info);
259   static void is_fm_array(CFXJSE_HostObject* pThis,
260                           const v8::FunctionCallbackInfo<v8::Value>& info);
261   static void get_fm_value(CFXJSE_HostObject* pThis,
262                            const v8::FunctionCallbackInfo<v8::Value>& info);
263   static void get_fm_jsobj(CFXJSE_HostObject* pThis,
264                            const v8::FunctionCallbackInfo<v8::Value>& info);
265   static void fm_var_filter(CFXJSE_HostObject* pThis,
266                             const v8::FunctionCallbackInfo<v8::Value>& info);
267   static void concat_fm_object(CFXJSE_HostObject* pThis,
268                                const v8::FunctionCallbackInfo<v8::Value>& info);
269 
270   static absl::optional<WideTextBuffer> Translate(cppgc::Heap* pHeap,
271                                                   WideStringView wsFormcalc);
272 
273   v8::Local<v8::Value> GlobalPropertyGetter();
GetIsolate()274   v8::Isolate* GetIsolate() const { return m_pIsolate; }
GetDocument()275   CXFA_Document* GetDocument() const { return m_pDocument.Get(); }
276 
277  private:
278   friend class FormCalcContextTest_GenerateSomExpression_Test;
279   friend class FormCalcContextTest_IsIsoDateFormat_Test;
280   friend class FormCalcContextTest_IsIsoTimeFormat_Test;
281 
282   static ByteString GenerateSomExpression(ByteStringView bsName,
283                                           int32_t iIndexFlags,
284                                           int32_t iIndexValue,
285                                           bool bIsStar);
286 
287   static void DotAccessorCommon(CFXJSE_HostObject* pThis,
288                                 const v8::FunctionCallbackInfo<v8::Value>& info,
289                                 bool bDotAccessor);
290 
291   static bool IsIsoDateTimeFormat(ByteStringView bsData,
292                                   int32_t* pYear,
293                                   int32_t* pMonth,
294                                   int32_t* pDay);
295 
296   static bool IsIsoDateFormat(ByteStringView bsData,
297                               int32_t* pYear,
298                               int32_t* pMonth,
299                               int32_t* pDay);
300 
301   static bool IsIsoTimeFormat(ByteStringView bsData);
302 
303   static int32_t DateString2Num(ByteStringView bsDate);
304 
305   bool ApplyToExpansion(
306       std::function<void(v8::Isolate*, v8::Local<v8::Value>)> fn,
307       const v8::FunctionCallbackInfo<v8::Value>& info,
308       bool bStrict);
309 
310   bool ApplyToArray(v8::Isolate* pIsolate,
311                     std::function<void(v8::Isolate*, v8::Local<v8::Value>)> fn,
312                     v8::Local<v8::Array> pArray);
313 
314   void ApplyToObject(v8::Isolate* pIsolate,
315                      std::function<void(v8::Isolate*, v8::Local<v8::Value>)> fn,
316                      v8::Local<v8::Object> pObject);
317 
318   void ThrowArgumentMismatchException() const;
319   void ThrowNoDefaultPropertyException(ByteStringView name) const;
320   void ThrowCompilerErrorException() const;
321   void ThrowDivideByZeroException() const;
322   void ThrowServerDeniedException() const;
323   void ThrowPropertyNotInObjectException(ByteStringView name,
324                                          ByteStringView exp) const;
325   void ThrowParamCountMismatchException(ByteStringView method) const;
326   void ThrowException(ByteStringView str) const;
327 
328   UnownedPtr<v8::Isolate> const m_pIsolate;
329   v8::Global<v8::Value> m_Value;
330   cppgc::WeakPersistent<CXFA_Document> const m_pDocument;
331 };
332 
333 #endif  // FXJS_XFA_CFXJSE_FORMCALC_CONTEXT_H_
334