// Copyright 2014 PDFium Authors. All rights reserved.
// 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 FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_
#define FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_

#include "../jsapi/fxjs_v8.h"
#include "resource.h"
#include "JS_Object.h"
#include "JS_Value.h"

struct JSConstSpec {
  const wchar_t* pName;
  double number;
  const wchar_t* string;
  uint8_t t;  // 0:double 1:str
};

struct JSPropertySpec {
  const wchar_t* pName;
  v8::AccessorGetterCallback pPropGet;
  v8::AccessorSetterCallback pPropPut;
};

struct JSMethodSpec {
  const wchar_t* pName;
  v8::FunctionCallback pMethodCall;
};

/* ====================================== PUBLIC DEFINE SPEC
 * ============================================== */
#define JS_WIDESTRING(widestring) L## #widestring

#define BEGIN_JS_STATIC_CONST(js_class_name) \
  JSConstSpec js_class_name::JS_Class_Consts[] = {
#define JS_STATIC_CONST_ENTRY_NUMBER(const_name, pValue) \
  { const_name, pValue, L"", 0 }                         \
  ,
#define JS_STATIC_CONST_ENTRY_STRING(const_name, pValue) \
  { const_name, 0, pValue, 1 }                           \
  ,
#define END_JS_STATIC_CONST() \
  { 0, 0, 0, 0 }              \
  }                           \
  ;

#define BEGIN_JS_STATIC_PROP(js_class_name) \
  JSPropertySpec js_class_name::JS_Class_Properties[] = {
#define JS_STATIC_PROP_ENTRY(prop_name)                                          \
  {                                                                              \
    JS_WIDESTRING(prop_name), get_##prop_name##_static, set_##prop_name##_static \
  }                                                                              \
  ,
#define END_JS_STATIC_PROP() \
  { 0, 0, 0 }                \
  }                          \
  ;

#define BEGIN_JS_STATIC_METHOD(js_class_name) \
  JSMethodSpec js_class_name::JS_Class_Methods[] = {
#define JS_STATIC_METHOD_ENTRY(method_name)            \
  { JS_WIDESTRING(method_name), method_name##_static } \
  ,
#define END_JS_STATIC_METHOD() \
  { 0, 0 }                     \
  }                            \
  ;

/* ======================================== PROP CALLBACK
 * ============================================ */

template <class C,
          FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, CFX_WideString&)>
void JSPropGetter(const char* prop_name_string,
                  const char* class_name_string,
                  v8::Local<v8::String> property,
                  const v8::PropertyCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_PropValue value(isolate);
  value.StartGetting();
  CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate, info.Holder());
  C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
  CFX_WideString sError;
  if (!(pObj->*M)(pRuntimeContext, value, sError)) {
    JS_Error(isolate,
             JSFormatErrorString(class_name_string, prop_name_string, sError));
    return;
  }
  info.GetReturnValue().Set((v8::Local<v8::Value>)value);
}

template <class C,
          FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, CFX_WideString&)>
void JSPropSetter(const char* prop_name_string,
                  const char* class_name_string,
                  v8::Local<v8::String> property,
                  v8::Local<v8::Value> value,
                  const v8::PropertyCallbackInfo<void>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_PropValue propValue(CJS_Value(isolate, value, VT_unknown));
  propValue.StartSetting();
  CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate, info.Holder());
  C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
  CFX_WideString sError;
  if (!(pObj->*M)(pRuntimeContext, propValue, sError)) {
    JS_Error(isolate,
             JSFormatErrorString(class_name_string, prop_name_string, sError));
  }
}

#define JS_STATIC_PROP(prop_name, class_name)                                 \
  static void get_##prop_name##_static(                                       \
      v8::Local<v8::String> property,                                         \
      const v8::PropertyCallbackInfo<v8::Value>& info) {                      \
    JSPropGetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \
                                                     property, info);         \
  }                                                                           \
  static void set_##prop_name##_static(                                       \
      v8::Local<v8::String> property, v8::Local<v8::Value> value,             \
      const v8::PropertyCallbackInfo<void>& info) {                           \
    JSPropSetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \
                                                     property, value, info);  \
  }

/* ========================================= METHOD CALLBACK
 * =========================================== */

template <class C,
          FX_BOOL (C::*M)(IFXJS_Context*,
                          const CJS_Parameters&,
                          CJS_Value&,
                          CFX_WideString&)>
void JSMethod(const char* method_name_string,
              const char* class_name_string,
              const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_Parameters parameters;
  for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
    parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));
  }
  CJS_Value valueRes(isolate);
  CJS_Object* pJSObj = (CJS_Object*)JS_GetPrivate(isolate, info.Holder());
  C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
  CFX_WideString sError;
  if (!(pObj->*M)(pRuntimeContext, parameters, valueRes, sError)) {
    JS_Error(isolate, JSFormatErrorString(class_name_string, method_name_string,
                                          sError));
    return;
  }
  info.GetReturnValue().Set(valueRes.ToV8Value());
}

#define JS_STATIC_METHOD(method_name, class_name)                             \
  static void method_name##_static(                                           \
      const v8::FunctionCallbackInfo<v8::Value>& info) {                      \
    JSMethod<class_name, &class_name::method_name>(#method_name, #class_name, \
                                                   info);                     \
  }

#define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \
  static void method_name##_static(                                        \
      const v8::FunctionCallbackInfo<v8::Value>& info) {                   \
    JSMethod<class_alternate, &class_alternate::method_name>(              \
        #method_name, #class_name, info);                                  \
  }

/* ===================================== JS CLASS
 * =============================================== */

#define DECLARE_JS_CLASS(js_class_name)                         \
  static void JSConstructor(IFXJS_Context* cc, JSFXObject obj,  \
                            JSFXObject global);                 \
  static void JSDestructor(JSFXObject obj);                     \
  static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType); \
  static JSConstSpec JS_Class_Consts[];                         \
  static JSPropertySpec JS_Class_Properties[];                  \
  static JSMethodSpec JS_Class_Methods[];                       \
  static const wchar_t* m_pClassName

#define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name)    \
  const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);      \
  void js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj,         \
                                    JSFXObject global) {                       \
    CJS_Object* pObj = new js_class_name(obj);                                 \
    pObj->SetEmbedObject(new class_alternate(pObj));                           \
    JS_SetPrivate(NULL, obj, (void*)pObj);                                     \
    pObj->InitInstance(cc);                                                    \
  }                                                                            \
                                                                               \
  void js_class_name::JSDestructor(JSFXObject obj) {                           \
    js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL, obj);            \
    ASSERT(pObj != NULL);                                                      \
    pObj->ExitInstance();                                                      \
    delete pObj;                                                               \
  }                                                                            \
                                                                               \
  int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType) {       \
    int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName,       \
                                  eObjType, JSConstructor, JSDestructor);      \
    if (nObjDefnID >= 0) {                                                     \
      for (int j = 0,                                                          \
               szj = sizeof(JS_Class_Properties) / sizeof(JSPropertySpec) - 1; \
           j < szj; j++) {                                                     \
        if (JS_DefineObjProperty(pRuntime, nObjDefnID,                         \
                                 JS_Class_Properties[j].pName,                 \
                                 JS_Class_Properties[j].pPropGet,              \
                                 JS_Class_Properties[j].pPropPut) < 0)         \
          return -1;                                                           \
      }                                                                        \
      for (int k = 0,                                                          \
               szk = sizeof(JS_Class_Methods) / sizeof(JSMethodSpec) - 1;      \
           k < szk; k++) {                                                     \
        if (JS_DefineObjMethod(pRuntime, nObjDefnID,                           \
                               JS_Class_Methods[k].pName,                      \
                               JS_Class_Methods[k].pMethodCall) < 0)           \
          return -1;                                                           \
      }                                                                        \
      return nObjDefnID;                                                       \
    }                                                                          \
    return -1;                                                                 \
  }

#define IMPLEMENT_JS_CLASS(js_class_name, class_name) \
  IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name)

/* ======================================== CONST CLASS
 * ============================================ */

#define DECLARE_JS_CLASS_CONST()                                \
  static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType); \
  static JSConstSpec JS_Class_Consts[];                         \
  static const wchar_t* m_pClassName

#define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name)                   \
  const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);     \
  int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType) {      \
    int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName,      \
                                  eObjType, NULL, NULL);                      \
    if (nObjDefnID >= 0) {                                                    \
      for (int i = 0, sz = sizeof(JS_Class_Consts) / sizeof(JSConstSpec) - 1; \
           i < sz; i++) {                                                     \
        if (JS_Class_Consts[i].t == 0) {                                      \
          if (JS_DefineObjConst(                                              \
                  pRuntime, nObjDefnID, JS_Class_Consts[i].pName,             \
                  JS_NewNumber(pRuntime, JS_Class_Consts[i].number)) < 0)     \
            return -1;                                                        \
        } else {                                                              \
          if (JS_DefineObjConst(                                              \
                  pRuntime, nObjDefnID, JS_Class_Consts[i].pName,             \
                  JS_NewString(pRuntime, JS_Class_Consts[i].string)) < 0)     \
            return -1;                                                        \
        }                                                                     \
      }                                                                       \
      return nObjDefnID;                                                      \
    }                                                                         \
    return -1;                                                                \
  }

/* ===================================== SPECIAL JS CLASS
 * =============================================== */

template <class Alt>
void JSSpecialPropQuery(const char*,
                        v8::Local<v8::String> property,
                        const v8::PropertyCallbackInfo<v8::Integer>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::String::Utf8Value utf8_value(property);
  CFX_WideString propname =
      CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());
  CJS_Object* pJSObj =
      reinterpret_cast<CJS_Object*>(JS_GetPrivate(isolate, info.Holder()));
  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
  FX_BOOL bRet = pObj->QueryProperty(propname.c_str());
  info.GetReturnValue().Set(bRet ? 4 : 0);
}

template <class Alt>
void JSSpecialPropGet(const char* class_name,
                      v8::Local<v8::String> property,
                      const v8::PropertyCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_Object* pJSObj =
      reinterpret_cast<CJS_Object*>(JS_GetPrivate(isolate, info.Holder()));
  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
  v8::String::Utf8Value utf8_value(property);
  CFX_WideString propname =
      CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());
  CFX_WideString sError;
  CJS_PropValue value(isolate);
  value.StartGetting();
  if (!pObj->DoProperty(pRuntimeContext, propname.c_str(), value, sError)) {
    JS_Error(isolate, JSFormatErrorString(class_name, "GetProperty", sError));
    return;
  }
  info.GetReturnValue().Set((v8::Local<v8::Value>)value);
}

template <class Alt>
void JSSpecialPropPut(const char* class_name,
                      v8::Local<v8::String> property,
                      v8::Local<v8::Value> value,
                      const v8::PropertyCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_Object* pJSObj =
      reinterpret_cast<CJS_Object*>(JS_GetPrivate(isolate, info.Holder()));
  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
  v8::String::Utf8Value utf8_value(property);
  CFX_WideString propname =
      CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());
  CFX_WideString sError;
  CJS_PropValue PropValue(CJS_Value(isolate, value, VT_unknown));
  PropValue.StartSetting();
  if (!pObj->DoProperty(pRuntimeContext, propname.c_str(), PropValue, sError)) {
    JS_Error(isolate, JSFormatErrorString(class_name, "PutProperty", sError));
  }
}

template <class Alt>
void JSSpecialPropDel(const char* class_name,
                      v8::Local<v8::String> property,
                      const v8::PropertyCallbackInfo<v8::Boolean>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  v8::Local<v8::Context> context = isolate->GetCurrentContext();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_Object* pJSObj =
      reinterpret_cast<CJS_Object*>(JS_GetPrivate(isolate, info.Holder()));
  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
  v8::String::Utf8Value utf8_value(property);
  CFX_WideString propname =
      CFX_WideString::FromUTF8(*utf8_value, utf8_value.length());
  CFX_WideString sError;
  if (!pObj->DelProperty(pRuntimeContext, propname.c_str(), sError)) {
    CFX_ByteString cbName;
    cbName.Format("%s.%s", class_name, "DelProperty");
    // Probably a missing call to JS_Error().
  }
}

#define DECLARE_SPECIAL_JS_CLASS(js_class_name)                   \
  static void JSConstructor(IFXJS_Context* cc, JSFXObject obj,    \
                            JSFXObject global);                   \
  static void JSDestructor(JSFXObject obj);                       \
  static JSConstSpec JS_Class_Consts[];                           \
  static JSPropertySpec JS_Class_Properties[];                    \
  static JSMethodSpec JS_Class_Methods[];                         \
  static int Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType);   \
  static const wchar_t* m_pClassName;                             \
  static void queryprop_##js_class_name##_static(                 \
      v8::Local<v8::String> property,                             \
      const v8::PropertyCallbackInfo<v8::Integer>& info);         \
  static void getprop_##js_class_name##_static(                   \
      v8::Local<v8::String> property,                             \
      const v8::PropertyCallbackInfo<v8::Value>& info);           \
  static void putprop_##js_class_name##_static(                   \
      v8::Local<v8::String> property, v8::Local<v8::Value> value, \
      const v8::PropertyCallbackInfo<v8::Value>& info);           \
  static void delprop_##js_class_name##_static(                   \
      v8::Local<v8::String> property,                             \
      const v8::PropertyCallbackInfo<v8::Boolean>& info)

#define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \
  const wchar_t* js_class_name::m_pClassName = JS_WIDESTRING(class_name);      \
  void js_class_name::queryprop_##js_class_name##_static(                      \
      v8::Local<v8::String> property,                                          \
      const v8::PropertyCallbackInfo<v8::Integer>& info) {                     \
    JSSpecialPropQuery<class_alternate>(#class_name, property, info);          \
  }                                                                            \
  void js_class_name::getprop_##js_class_name##_static(                        \
      v8::Local<v8::String> property,                                          \
      const v8::PropertyCallbackInfo<v8::Value>& info) {                       \
    JSSpecialPropGet<class_alternate>(#class_name, property, info);            \
  }                                                                            \
  void js_class_name::putprop_##js_class_name##_static(                        \
      v8::Local<v8::String> property, v8::Local<v8::Value> value,              \
      const v8::PropertyCallbackInfo<v8::Value>& info) {                       \
    JSSpecialPropPut<class_alternate>(#class_name, property, value, info);     \
  }                                                                            \
  void js_class_name::delprop_##js_class_name##_static(                        \
      v8::Local<v8::String> property,                                          \
      const v8::PropertyCallbackInfo<v8::Boolean>& info) {                     \
    JSSpecialPropDel<class_alternate>(#class_name, property, info);            \
  }                                                                            \
  void js_class_name::JSConstructor(IFXJS_Context* cc, JSFXObject obj,         \
                                    JSFXObject global) {                       \
    CJS_Object* pObj = new js_class_name(obj);                                 \
    pObj->SetEmbedObject(new class_alternate(pObj));                           \
    JS_SetPrivate(NULL, obj, (void*)pObj);                                     \
    pObj->InitInstance(cc);                                                    \
  }                                                                            \
                                                                               \
  void js_class_name::JSDestructor(JSFXObject obj) {                           \
    js_class_name* pObj = (js_class_name*)JS_GetPrivate(NULL, obj);            \
    ASSERT(pObj != NULL);                                                      \
    pObj->ExitInstance();                                                      \
    delete pObj;                                                               \
  }                                                                            \
                                                                               \
  int js_class_name::Init(IJS_Runtime* pRuntime, FXJSOBJTYPE eObjType) {       \
    int nObjDefnID = JS_DefineObj(pRuntime, js_class_name::m_pClassName,       \
                                  eObjType, JSConstructor, JSDestructor);      \
                                                                               \
    if (nObjDefnID >= 0) {                                                     \
      for (int j = 0,                                                          \
               szj = sizeof(JS_Class_Properties) / sizeof(JSPropertySpec) - 1; \
           j < szj; j++) {                                                     \
        if (JS_DefineObjProperty(pRuntime, nObjDefnID,                         \
                                 JS_Class_Properties[j].pName,                 \
                                 JS_Class_Properties[j].pPropGet,              \
                                 JS_Class_Properties[j].pPropPut) < 0)         \
          return -1;                                                           \
      }                                                                        \
                                                                               \
      for (int k = 0,                                                          \
               szk = sizeof(JS_Class_Methods) / sizeof(JSMethodSpec) - 1;      \
           k < szk; k++) {                                                     \
        if (JS_DefineObjMethod(pRuntime, nObjDefnID,                           \
                               JS_Class_Methods[k].pName,                      \
                               JS_Class_Methods[k].pMethodCall) < 0)           \
          return -1;                                                           \
      }                                                                        \
      if (JS_DefineObjAllProperties(                                           \
              pRuntime, nObjDefnID,                                            \
              js_class_name::queryprop_##js_class_name##_static,               \
              js_class_name::getprop_##js_class_name##_static,                 \
              js_class_name::putprop_##js_class_name##_static,                 \
              js_class_name::delprop_##js_class_name##_static) < 0)            \
        return -1;                                                             \
                                                                               \
      return nObjDefnID;                                                       \
    }                                                                          \
                                                                               \
    return -1;                                                                 \
  }

/* ======================================== GLOBAL METHODS
 * ============================================ */

template <FX_BOOL (
    *F)(IFXJS_Context*, const CJS_Parameters&, CJS_Value&, CFX_WideString&)>
void JSGlobalFunc(const char* func_name_string,
                  const v8::FunctionCallbackInfo<v8::Value>& info) {
  v8::Isolate* isolate = info.GetIsolate();
  IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)isolate->GetData(2);
  IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext();
  CJS_Parameters parameters;
  for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
    parameters.push_back(CJS_Value(isolate, info[i], VT_unknown));
  }
  CJS_Value valueRes(isolate);
  CFX_WideString sError;
  if (!(*F)(pRuntimeContext, parameters, valueRes, sError)) {
    JS_Error(isolate, JSFormatErrorString(func_name_string, nullptr, sError));
    return;
  }
  info.GetReturnValue().Set(valueRes.ToV8Value());
}

#define JS_STATIC_GLOBAL_FUN(fun_name)                   \
  static void fun_name##_static(                         \
      const v8::FunctionCallbackInfo<v8::Value>& info) { \
    JSGlobalFunc<fun_name>(#fun_name, info);             \
  }

#define JS_STATIC_DECLARE_GLOBAL_FUN()  \
  static JSMethodSpec global_methods[]; \
  static int Init(IJS_Runtime* pRuntime)

#define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
  JSMethodSpec js_class_name::global_methods[] = {
#define JS_STATIC_GLOBAL_FUN_ENTRY(method_name) \
  JS_STATIC_METHOD_ENTRY(method_name)

#define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD()

#define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name)            \
  int js_class_name::Init(IJS_Runtime* pRuntime) {               \
    for (int i = 0, sz = sizeof(js_class_name::global_methods) / \
                             sizeof(JSMethodSpec) -              \
                         1;                                      \
         i < sz; i++) {                                          \
      if (JS_DefineGlobalMethod(                                 \
              pRuntime, js_class_name::global_methods[i].pName,  \
              js_class_name::global_methods[i].pMethodCall) < 0) \
        return -1;                                               \
    }                                                            \
    return 0;                                                    \
  }

/* ======================================== GLOBAL CONSTS
 * ============================================ */
#define DEFINE_GLOBAL_CONST(pRuntime, const_name, const_value) \
  if (JS_DefineGlobalConst(                                    \
          pRuntime, JS_WIDESTRING(const_name),                 \
          JS_NewString(pRuntime, JS_WIDESTRING(const_value)))) \
  return -1

/* ======================================== GLOBAL ARRAYS
 * ============================================ */

#define DEFINE_GLOBAL_ARRAY(pRuntime)                           \
  int size = FX_ArraySize(ArrayContent);                        \
                                                                \
  CJS_Array array(pRuntime);                                    \
  for (int i = 0; i < size; i++)                                \
    array.SetElement(i, CJS_Value(pRuntime, ArrayContent[i]));  \
                                                                \
  CJS_PropValue prop(pRuntime);                                 \
  prop << array;                                                \
  if (JS_DefineGlobalConst(pRuntime, (const wchar_t*)ArrayName, \
                           prop.ToV8Value()) < 0)               \
  return -1

/* ============================================================ */

#define VALUE_NAME_STRING L"string"
#define VALUE_NAME_NUMBER L"number"
#define VALUE_NAME_BOOLEAN L"boolean"
#define VALUE_NAME_DATE L"date"
#define VALUE_NAME_OBJECT L"object"
#define VALUE_NAME_FXOBJ L"fxobj"
#define VALUE_NAME_NULL L"null"
#define VALUE_NAME_UNDEFINED L"undefined"

FXJSVALUETYPE GET_VALUE_TYPE(v8::Local<v8::Value> p);

#endif  // FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_
