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