|  | // Copyright 2014 The PDFium Authors | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 
|  |  | 
|  | #ifndef FXJS_XFA_FXJSE_H_ | 
|  | #define FXJS_XFA_FXJSE_H_ | 
|  |  | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include "core/fxcrt/fx_string.h" | 
|  | #include "core/fxcrt/span.h" | 
|  | #include "v8/include/v8-forward.h" | 
|  |  | 
|  | namespace pdfium { | 
|  | namespace fxjse { | 
|  |  | 
|  | // These are strings by design. With ASLR, their addresses should be random, so | 
|  | // it should be very unlikely for an object to accidentally have the same tag. | 
|  | extern const char kFuncTag[]; | 
|  | extern const char kClassTag[]; | 
|  |  | 
|  | }  // namespace fxjse | 
|  | }  // namespace pdfium | 
|  |  | 
|  | class CFXJSE_FormCalcContext; | 
|  | class CJS_Result; | 
|  | class CJX_Object; | 
|  |  | 
|  | enum class FXJSE_ClassPropType { | 
|  | kNone, | 
|  | kProperty, | 
|  | kMethod, | 
|  | }; | 
|  |  | 
|  | // C++ object which is retrieved from v8 object's slot. | 
|  | class CFXJSE_HostObject { | 
|  | public: | 
|  | static CFXJSE_HostObject* FromV8(v8::Local<v8::Value> arg); | 
|  | virtual ~CFXJSE_HostObject(); | 
|  |  | 
|  | // Two subclasses. | 
|  | virtual CFXJSE_FormCalcContext* AsFormCalcContext(); | 
|  | virtual CJX_Object* AsCJXObject(); | 
|  |  | 
|  | v8::Local<v8::Object> NewBoundV8Object(v8::Isolate* pIsolate, | 
|  | v8::Local<v8::FunctionTemplate> tmpl); | 
|  |  | 
|  | protected: | 
|  | CFXJSE_HostObject(); | 
|  | }; | 
|  |  | 
|  | using FXJSE_MethodCallback = | 
|  | CJS_Result (*)(const v8::FunctionCallbackInfo<v8::Value>& info, | 
|  | const WideString& functionName); | 
|  | using FXJSE_FuncCallback = | 
|  | void (*)(CFXJSE_HostObject* pThis, | 
|  | const v8::FunctionCallbackInfo<v8::Value>& info); | 
|  | using FXJSE_PropGetter = v8::Local<v8::Value> (*)(v8::Isolate* pIsolate, | 
|  | v8::Local<v8::Object> pObject, | 
|  | ByteStringView szPropName); | 
|  | using FXJSE_PropSetter = void (*)(v8::Isolate* pIsolate, | 
|  | v8::Local<v8::Object> pObject, | 
|  | ByteStringView szPropName, | 
|  | v8::Local<v8::Value> pValue); | 
|  | using FXJSE_PropTypeGetter = | 
|  | FXJSE_ClassPropType (*)(v8::Isolate* pIsolate, | 
|  | v8::Local<v8::Object> pObject, | 
|  | ByteStringView szPropName, | 
|  | bool bQueryIn); | 
|  |  | 
|  | struct FXJSE_FUNCTION_DESCRIPTOR { | 
|  | const char* tag;  // `pdfium::fxjse::kFuncTag` always. | 
|  | const char* name; | 
|  | FXJSE_FuncCallback callbackProc; | 
|  | }; | 
|  |  | 
|  | struct FXJSE_CLASS_DESCRIPTOR { | 
|  | const char* tag;  // `pdfium::fxjse::kClassTag` always. | 
|  | const char* name; | 
|  | pdfium::span<const FXJSE_FUNCTION_DESCRIPTOR> methods; | 
|  | FXJSE_PropTypeGetter dynPropTypeGetter; | 
|  | FXJSE_PropGetter dynPropGetter; | 
|  | FXJSE_PropSetter dynPropSetter; | 
|  | FXJSE_MethodCallback dynMethodCall; | 
|  | }; | 
|  |  | 
|  | extern const FXJSE_CLASS_DESCRIPTOR kGlobalClassDescriptor; | 
|  | extern const FXJSE_CLASS_DESCRIPTOR kNormalClassDescriptor; | 
|  | extern const FXJSE_CLASS_DESCRIPTOR kVariablesClassDescriptor; | 
|  | extern const FXJSE_CLASS_DESCRIPTOR kFormCalcDescriptor; | 
|  |  | 
|  | void FXJSE_ThrowMessage(v8::Isolate* pIsolate, ByteStringView utf8Message); | 
|  |  | 
|  | #endif  // FXJS_XFA_FXJSE_H_ |