Fold CJS_EmbedObj classes into CJS_Object classes

This CL removes the CJS_EmbedObj class and various subclasses and folds
the subclasses into their CJS_Object counterparts.

Change-Id: If6b882a4995c0b1bf83ac783f5c27ba9216c2d5c
Reviewed-on: https://pdfium-review.googlesource.com/25410
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fxjs/JS_Define.h b/fxjs/JS_Define.h
index 540746a..61ad9ef 100644
--- a/fxjs/JS_Define.h
+++ b/fxjs/JS_Define.h
@@ -72,7 +72,7 @@
   if (!pJSObj)
     return;
 
-  C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
+  C* pObj = static_cast<C*>(pJSObj);
   CJS_Return result = (pObj->*M)(pRuntime);
   if (result.HasError()) {
     pRuntime->Error(JSFormatErrorString(class_name_string, prop_name_string,
@@ -99,7 +99,7 @@
   if (!pJSObj)
     return;
 
-  C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
+  C* pObj = static_cast<C*>(pJSObj);
   CJS_Return result = (pObj->*M)(pRuntime, value);
   if (result.HasError()) {
     pRuntime->Error(JSFormatErrorString(class_name_string, prop_name_string,
@@ -126,7 +126,7 @@
   for (unsigned int i = 0; i < (unsigned int)info.Length(); i++)
     parameters.push_back(info[i]);
 
-  C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
+  C* pObj = static_cast<C*>(pJSObj);
   CJS_Return result = (pObj->*M)(pRuntime, parameters);
   if (result.HasError()) {
     pRuntime->Error(JSFormatErrorString(class_name_string, method_name_string,
@@ -143,20 +143,20 @@
       v8::Local<v8::String> property,                             \
       const v8::PropertyCallbackInfo<v8::Value>& info) {          \
     JSPropGetter<class_name, &class_name::get_##prop_name>(       \
-        #err_name, #class_name, property, info);                  \
+        #err_name, class_name::kName, 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::set_##prop_name>(       \
-        #err_name, #class_name, property, value, info);           \
+        #err_name, class_name::kName, property, value, info);     \
   }
 
-#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_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::kName, info); \
   }
 
 #endif  // FXJS_JS_DEFINE_H_
diff --git a/fxjs/cjs_annot.cpp b/fxjs/cjs_annot.cpp
index 34084a9..fc38e11 100644
--- a/fxjs/cjs_annot.cpp
+++ b/fxjs/cjs_annot.cpp
@@ -26,6 +26,8 @@
 
 int CJS_Annot::ObjDefnID = -1;
 
+const char CJS_Annot::kName[] = "Annot";
+
 // static
 int CJS_Annot::GetObjDefnID() {
   return ObjDefnID;
@@ -33,20 +35,16 @@
 
 // static
 void CJS_Annot::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("Annot", FXJSOBJTYPE_DYNAMIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Annot::kName, FXJSOBJTYPE_DYNAMIC,
                                  JSConstructor<CJS_Annot>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
 }
 
-CJS_Annot::CJS_Annot(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<Annot>(this);
-}
+CJS_Annot::CJS_Annot(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
 
-Annot::Annot(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
+CJS_Annot::~CJS_Annot() = default;
 
-Annot::~Annot() = default;
-
-CJS_Return Annot::get_hidden(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Annot::get_hidden(CJS_Runtime* pRuntime) {
   if (!m_pAnnot)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -55,7 +53,8 @@
       CPDF_Annot::IsAnnotationHidden(pPDFAnnot->GetAnnotDict())));
 }
 
-CJS_Return Annot::set_hidden(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Annot::set_hidden(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   // May invalidate m_pAnnot.
   bool bHidden = pRuntime->ToBoolean(vp);
   if (!m_pAnnot)
@@ -78,14 +77,14 @@
   return CJS_Return(true);
 }
 
-CJS_Return Annot::get_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Annot::get_name(CJS_Runtime* pRuntime) {
   if (!m_pAnnot)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(
       pRuntime->NewString(ToBAAnnot(m_pAnnot.Get())->GetAnnotName().c_str()));
 }
 
-CJS_Return Annot::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Annot::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   // May invalidate m_pAnnot.
   WideString annotName = pRuntime->ToWideString(vp);
   if (!m_pAnnot)
@@ -95,7 +94,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Annot::get_type(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Annot::get_type(CJS_Runtime* pRuntime) {
   if (!m_pAnnot)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(pRuntime->NewString(
@@ -105,10 +104,6 @@
           .c_str()));
 }
 
-CJS_Return Annot::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Annot::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
-
-void Annot::SetSDKAnnot(CPDFSDK_BAAnnot* annot) {
-  m_pAnnot.Reset(annot);
-}
diff --git a/fxjs/cjs_annot.h b/fxjs/cjs_annot.h
index 9f0d771..bbcf4ac 100644
--- a/fxjs/cjs_annot.h
+++ b/fxjs/cjs_annot.h
@@ -10,10 +10,24 @@
 #include "fpdfsdk/cpdfsdk_baannot.h"
 #include "fxjs/JS_Define.h"
 
-class Annot : public CJS_EmbedObj {
+class CJS_Annot : public CJS_Object {
  public:
-  explicit Annot(CJS_Object* pJSObject);
-  ~Annot() override;
+  static int GetObjDefnID();
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
+
+  explicit CJS_Annot(v8::Local<v8::Object> pObject);
+  ~CJS_Annot() override;
+
+  void SetSDKAnnot(CPDFSDK_BAAnnot* annot) { m_pAnnot.Reset(annot); }
+
+  JS_STATIC_PROP(hidden, hidden, CJS_Annot);
+  JS_STATIC_PROP(name, name, CJS_Annot);
+  JS_STATIC_PROP(type, type, CJS_Annot);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSPropertySpec PropertySpecs[];
 
   CJS_Return get_hidden(CJS_Runtime* pRuntime);
   CJS_Return set_hidden(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
@@ -24,27 +38,7 @@
   CJS_Return get_type(CJS_Runtime* pRuntime);
   CJS_Return set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
 
-  void SetSDKAnnot(CPDFSDK_BAAnnot* annot);
-
- private:
   CPDFSDK_Annot::ObservedPtr m_pAnnot;
 };
 
-class CJS_Annot : public CJS_Object {
- public:
-  static int GetObjDefnID();
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Annot(v8::Local<v8::Object> pObject);
-  ~CJS_Annot() override = default;
-
-  JS_STATIC_PROP(hidden, hidden, Annot);
-  JS_STATIC_PROP(name, name, Annot);
-  JS_STATIC_PROP(type, type, Annot);
-
- private:
-  static int ObjDefnID;
-  static const JSPropertySpec PropertySpecs[];
-};
-
 #endif  // FXJS_CJS_ANNOT_H_
diff --git a/fxjs/cjs_app.cpp b/fxjs/cjs_app.cpp
index 6a540f9..1df0146 100644
--- a/fxjs/cjs_app.cpp
+++ b/fxjs/cjs_app.cpp
@@ -75,24 +75,22 @@
 
 int CJS_App::ObjDefnID = -1;
 
+const char CJS_App::kName[] = "app";
+
 // static
 void CJS_App::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("app", FXJSOBJTYPE_STATIC,
+  ObjDefnID = pEngine->DefineObj(CJS_App::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_App>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
-CJS_App::CJS_App(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<app>(this);
-}
+CJS_App::CJS_App(v8::Local<v8::Object> pObject)
+    : CJS_Object(pObject), m_bCalculate(true), m_bRuntimeHighLight(false) {}
 
-app::app(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject), m_bCalculate(true), m_bRuntimeHighLight(false) {}
+CJS_App::~CJS_App() = default;
 
-app::~app() = default;
-
-CJS_Return app::get_active_docs(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_active_docs(CJS_Runtime* pRuntime) {
   CJS_Document* pJSDocument = nullptr;
   v8::Local<v8::Object> pObj = pRuntime->GetThisObj();
   if (CFXJS_Engine::GetObjDefnID(pObj) == CJS_Document::GetObjDefnID())
@@ -108,49 +106,50 @@
   return CJS_Return(pRuntime->NewUndefined());
 }
 
-CJS_Return app::set_active_docs(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_active_docs(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_calculate(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_calculate(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewBoolean(m_bCalculate));
 }
 
-CJS_Return app::set_calculate(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_calculate(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   m_bCalculate = pRuntime->ToBoolean(vp);
   pRuntime->GetFormFillEnv()->GetInterForm()->EnableCalculate(m_bCalculate);
   return CJS_Return(true);
 }
 
-CJS_Return app::get_forms_version(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_forms_version(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewNumber(JS_NUM_FORMSVERSION));
 }
 
-CJS_Return app::set_forms_version(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_forms_version(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_viewer_type(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_viewer_type(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewString(JS_STR_VIEWERTYPE));
 }
 
-CJS_Return app::set_viewer_type(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_viewer_type(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_viewer_variation(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_viewer_variation(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewString(JS_STR_VIEWERVARIATION));
 }
 
-CJS_Return app::set_viewer_variation(CJS_Runtime* pRuntime,
-                                     v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_viewer_variation(CJS_Runtime* pRuntime,
+                                         v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_viewer_version(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_viewer_version(CJS_Runtime* pRuntime) {
 #ifdef PDF_ENABLE_XFA
   CPDFXFA_Context* pXFAContext = pRuntime->GetFormFillEnv()->GetXFAContext();
   if (pXFAContext->ContainsXFAForm())
@@ -159,12 +158,12 @@
   return CJS_Return(pRuntime->NewNumber(JS_NUM_VIEWERVERSION));
 }
 
-CJS_Return app::set_viewer_version(CJS_Runtime* pRuntime,
-                                   v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_viewer_version(CJS_Runtime* pRuntime,
+                                       v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_platform(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_platform(CJS_Runtime* pRuntime) {
 #ifdef PDF_ENABLE_XFA
   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
   if (!pFormFillEnv)
@@ -177,11 +176,12 @@
   return CJS_Return(pRuntime->NewString(JS_STR_PLATFORM));
 }
 
-CJS_Return app::set_platform(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_platform(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_language(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_language(CJS_Runtime* pRuntime) {
 #ifdef PDF_ENABLE_XFA
   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
   if (!pFormFillEnv)
@@ -194,7 +194,8 @@
   return CJS_Return(pRuntime->NewString(JS_STR_LANGUAGE));
 }
 
-CJS_Return app::set_language(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_language(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
@@ -202,8 +203,8 @@
 // comment: need reader support
 // note:
 // CFDF_Document * CPDFSDK_FormFillEnvironment::NewFDF();
-CJS_Return app::newFDF(CJS_Runtime* pRuntime,
-                       const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::newFDF(CJS_Runtime* pRuntime,
+                           const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
@@ -214,13 +215,13 @@
 // CFDF_Document * CPDFSDK_FormFillEnvironment::OpenFDF(string strPath,bool
 // bUserConv);
 
-CJS_Return app::openFDF(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::openFDF(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return app::alert(CJS_Runtime* pRuntime,
-                      const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::alert(CJS_Runtime* pRuntime,
+                          const std::vector<v8::Local<v8::Value>>& params) {
   std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
       pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle");
 
@@ -270,8 +271,8 @@
   return CJS_Return(ret);
 }
 
-CJS_Return app::beep(CJS_Runtime* pRuntime,
-                     const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::beep(CJS_Runtime* pRuntime,
+                         const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() == 1) {
     pRuntime->GetFormFillEnv()->JS_appBeep(pRuntime->ToInt32(params[0]));
     return CJS_Return(true);
@@ -279,26 +280,29 @@
   return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 }
 
-CJS_Return app::findComponent(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::findComponent(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return app::popUpMenuEx(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::popUpMenuEx(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return app::get_fs(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_fs(CJS_Runtime* pRuntime) {
   return CJS_Return(false);
 }
 
-CJS_Return app::set_fs(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_fs(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::setInterval(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::setInterval(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() > 2 || params.size() == 0)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
@@ -319,14 +323,13 @@
 
   CJS_TimerObj* pJS_TimerObj =
       static_cast<CJS_TimerObj*>(pRuntime->GetObjectPrivate(pRetObj));
-  TimerObj* pTimerObj = static_cast<TimerObj*>(pJS_TimerObj->GetEmbedObject());
-  pTimerObj->SetTimer(timerRef);
-
+  pJS_TimerObj->SetTimer(timerRef);
   return CJS_Return(pRetObj);
 }
 
-CJS_Return app::setTimeOut(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::setTimeOut(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() > 2 || params.size() == 0)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
@@ -347,31 +350,33 @@
 
   CJS_TimerObj* pJS_TimerObj =
       static_cast<CJS_TimerObj*>(pRuntime->GetObjectPrivate(pRetObj));
-  TimerObj* pTimerObj = static_cast<TimerObj*>(pJS_TimerObj->GetEmbedObject());
-  pTimerObj->SetTimer(timerRef);
+  pJS_TimerObj->SetTimer(timerRef);
 
   return CJS_Return(pRetObj);
 }
 
-CJS_Return app::clearTimeOut(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::clearTimeOut(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 1)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
-  app::ClearTimerCommon(pRuntime, params[0]);
+  CJS_App::ClearTimerCommon(pRuntime, params[0]);
   return CJS_Return(true);
 }
 
-CJS_Return app::clearInterval(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::clearInterval(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 1)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
-  app::ClearTimerCommon(pRuntime, params[0]);
+  CJS_App::ClearTimerCommon(pRuntime, params[0]);
   return CJS_Return(true);
 }
 
-void app::ClearTimerCommon(CJS_Runtime* pRuntime, v8::Local<v8::Value> param) {
+void CJS_App::ClearTimerCommon(CJS_Runtime* pRuntime,
+                               v8::Local<v8::Value> param) {
   if (!param->IsObject())
     return;
 
@@ -383,29 +388,27 @@
   if (!pJSObj)
     return;
 
-  TimerObj* pTimerObj = static_cast<TimerObj*>(pJSObj->GetEmbedObject());
-  if (!pTimerObj)
-    return;
-
-  GlobalTimer::Cancel(pTimerObj->GetTimerID());
+  CJS_TimerObj* pJS_TimerObj = static_cast<CJS_TimerObj*>(pJSObj);
+  GlobalTimer::Cancel(pJS_TimerObj->GetTimerID());
 }
 
-CJS_Return app::execMenuItem(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::execMenuItem(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-void app::TimerProc(GlobalTimer* pTimer) {
+void CJS_App::TimerProc(GlobalTimer* pTimer) {
   CJS_Runtime* pRuntime = pTimer->GetRuntime();
   if (pRuntime && (!pTimer->IsOneShot() || pTimer->GetTimeOut() > 0))
     RunJsScript(pRuntime, pTimer->GetJScript());
 }
 
-void app::CancelProc(GlobalTimer* pTimer) {
+void CJS_App::CancelProc(GlobalTimer* pTimer) {
   m_Timers.erase(pdfium::FakeUniquePtr<GlobalTimer>(pTimer));
 }
 
-void app::RunJsScript(CJS_Runtime* pRuntime, const WideString& wsScript) {
+void CJS_App::RunJsScript(CJS_Runtime* pRuntime, const WideString& wsScript) {
   if (!pRuntime->IsBlocking()) {
     IJS_EventContext* pContext = pRuntime->NewEventContext();
     pContext->OnExternal_Exec();
@@ -415,20 +418,20 @@
   }
 }
 
-CJS_Return app::goBack(CJS_Runtime* pRuntime,
-                       const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::goBack(CJS_Runtime* pRuntime,
+                           const std::vector<v8::Local<v8::Value>>& params) {
   // Not supported.
   return CJS_Return(true);
 }
 
-CJS_Return app::goForward(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::goForward(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   // Not supported.
   return CJS_Return(true);
 }
 
-CJS_Return app::mailMsg(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::mailMsg(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   std::vector<v8::Local<v8::Value>> newParams =
       ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc", L"cBcc",
                           L"cSubject", L"cMsg");
@@ -470,42 +473,44 @@
   return CJS_Return(true);
 }
 
-CJS_Return app::launchURL(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::launchURL(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return app::get_runtime_highlight(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_runtime_highlight(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewBoolean(m_bRuntimeHighLight));
 }
 
-CJS_Return app::set_runtime_highlight(CJS_Runtime* pRuntime,
-                                      v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_runtime_highlight(CJS_Runtime* pRuntime,
+                                          v8::Local<v8::Value> vp) {
   m_bRuntimeHighLight = pRuntime->ToBoolean(vp);
   return CJS_Return(true);
 }
 
-CJS_Return app::get_fullscreen(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_fullscreen(CJS_Runtime* pRuntime) {
   return CJS_Return(false);
 }
 
-CJS_Return app::set_fullscreen(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_fullscreen(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::popUpMenu(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::popUpMenu(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return app::browseForDoc(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::browseForDoc(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-WideString app::SysPathToPDFPath(const WideString& sOldPath) {
+WideString CJS_App::SysPathToPDFPath(const WideString& sOldPath) {
   WideString sRet = L"/";
   for (const wchar_t& c : sOldPath) {
     if (c != L':')
@@ -514,18 +519,18 @@
   return sRet;
 }
 
-CJS_Return app::newDoc(CJS_Runtime* pRuntime,
-                       const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::newDoc(CJS_Runtime* pRuntime,
+                           const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return app::openDoc(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::openDoc(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return app::response(CJS_Runtime* pRuntime,
-                         const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::response(CJS_Runtime* pRuntime,
+                             const std::vector<v8::Local<v8::Value>>& params) {
   std::vector<v8::Local<v8::Value>> newParams =
       ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle",
                           L"cDefault", L"bPassword", L"cLabel");
@@ -565,15 +570,16 @@
           .c_str()));
 }
 
-CJS_Return app::get_media(CJS_Runtime* pRuntime) {
+CJS_Return CJS_App::get_media(CJS_Runtime* pRuntime) {
   return CJS_Return(false);
 }
 
-CJS_Return app::set_media(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_App::set_media(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return app::execDialog(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_App::execDialog(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
diff --git a/fxjs/cjs_app.h b/fxjs/cjs_app.h
index 33b61a0..e195c6d 100644
--- a/fxjs/cjs_app.h
+++ b/fxjs/cjs_app.h
@@ -16,10 +16,58 @@
 class CJS_Runtime;
 class GlobalTimer;
 
-class app : public CJS_EmbedObj {
+class CJS_App : public CJS_Object {
  public:
-  explicit app(CJS_Object* pJSObject);
-  ~app() override;
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
+
+  explicit CJS_App(v8::Local<v8::Object> pObject);
+  ~CJS_App() override;
+
+  void TimerProc(GlobalTimer* pTimer);
+  void CancelProc(GlobalTimer* pTimer);
+
+  static WideString SysPathToPDFPath(const WideString& sOldPath);
+
+  JS_STATIC_PROP(activeDocs, active_docs, CJS_App);
+  JS_STATIC_PROP(calculate, calculate, CJS_App);
+  JS_STATIC_PROP(formsVersion, forms_version, CJS_App);
+  JS_STATIC_PROP(fs, fs, CJS_App);
+  JS_STATIC_PROP(fullscreen, fullscreen, CJS_App);
+  JS_STATIC_PROP(language, language, CJS_App);
+  JS_STATIC_PROP(media, media, CJS_App);
+  JS_STATIC_PROP(platform, platform, CJS_App);
+  JS_STATIC_PROP(runtimeHighlight, runtime_highlight, CJS_App);
+  JS_STATIC_PROP(viewerType, viewer_type, CJS_App);
+  JS_STATIC_PROP(viewerVariation, viewer_variation, CJS_App);
+  JS_STATIC_PROP(viewerVersion, viewer_version, CJS_App);
+
+  JS_STATIC_METHOD(alert, CJS_App);
+  JS_STATIC_METHOD(beep, CJS_App);
+  JS_STATIC_METHOD(browseForDoc, CJS_App);
+  JS_STATIC_METHOD(clearInterval, CJS_App);
+  JS_STATIC_METHOD(clearTimeOut, CJS_App);
+  JS_STATIC_METHOD(execDialog, CJS_App);
+  JS_STATIC_METHOD(execMenuItem, CJS_App);
+  JS_STATIC_METHOD(findComponent, CJS_App);
+  JS_STATIC_METHOD(goBack, CJS_App);
+  JS_STATIC_METHOD(goForward, CJS_App);
+  JS_STATIC_METHOD(launchURL, CJS_App);
+  JS_STATIC_METHOD(mailMsg, CJS_App);
+  JS_STATIC_METHOD(newFDF, CJS_App);
+  JS_STATIC_METHOD(newDoc, CJS_App);
+  JS_STATIC_METHOD(openDoc, CJS_App);
+  JS_STATIC_METHOD(openFDF, CJS_App);
+  JS_STATIC_METHOD(popUpMenuEx, CJS_App);
+  JS_STATIC_METHOD(popUpMenu, CJS_App);
+  JS_STATIC_METHOD(response, CJS_App);
+  JS_STATIC_METHOD(setInterval, CJS_App);
+  JS_STATIC_METHOD(setTimeOut, CJS_App);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSPropertySpec PropertySpecs[];
+  static const JSMethodSpec MethodSpecs[];
 
   CJS_Return get_active_docs(CJS_Runtime* pRuntime);
   CJS_Return set_active_docs(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
@@ -102,15 +150,7 @@
   CJS_Return setTimeOut(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
 
-  void TimerProc(GlobalTimer* pTimer);
-  void CancelProc(GlobalTimer* pTimer);
-
-  static WideString SysPathToPDFPath(const WideString& sOldPath);
-
- private:
-  // CJS_EmbedObj
   void RunJsScript(CJS_Runtime* pRuntime, const WideString& wsScript);
-
   void ClearTimerCommon(CJS_Runtime* pRuntime, v8::Local<v8::Value> param);
 
   bool m_bCalculate;
@@ -118,52 +158,4 @@
   std::set<std::unique_ptr<GlobalTimer>> m_Timers;
 };
 
-class CJS_App : public CJS_Object {
- public:
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_App(v8::Local<v8::Object> pObject);
-  ~CJS_App() override = default;
-
-  JS_STATIC_PROP(activeDocs, active_docs, app);
-  JS_STATIC_PROP(calculate, calculate, app);
-  JS_STATIC_PROP(formsVersion, forms_version, app);
-  JS_STATIC_PROP(fs, fs, app);
-  JS_STATIC_PROP(fullscreen, fullscreen, app);
-  JS_STATIC_PROP(language, language, app);
-  JS_STATIC_PROP(media, media, app);
-  JS_STATIC_PROP(platform, platform, app);
-  JS_STATIC_PROP(runtimeHighlight, runtime_highlight, app);
-  JS_STATIC_PROP(viewerType, viewer_type, app);
-  JS_STATIC_PROP(viewerVariation, viewer_variation, app);
-  JS_STATIC_PROP(viewerVersion, viewer_version, app);
-
-  JS_STATIC_METHOD(alert, app);
-  JS_STATIC_METHOD(beep, app);
-  JS_STATIC_METHOD(browseForDoc, app);
-  JS_STATIC_METHOD(clearInterval, app);
-  JS_STATIC_METHOD(clearTimeOut, app);
-  JS_STATIC_METHOD(execDialog, app);
-  JS_STATIC_METHOD(execMenuItem, app);
-  JS_STATIC_METHOD(findComponent, app);
-  JS_STATIC_METHOD(goBack, app);
-  JS_STATIC_METHOD(goForward, app);
-  JS_STATIC_METHOD(launchURL, app);
-  JS_STATIC_METHOD(mailMsg, app);
-  JS_STATIC_METHOD(newFDF, app);
-  JS_STATIC_METHOD(newDoc, app);
-  JS_STATIC_METHOD(openDoc, app);
-  JS_STATIC_METHOD(openFDF, app);
-  JS_STATIC_METHOD(popUpMenuEx, app);
-  JS_STATIC_METHOD(popUpMenu, app);
-  JS_STATIC_METHOD(response, app);
-  JS_STATIC_METHOD(setInterval, app);
-  JS_STATIC_METHOD(setTimeOut, app);
-
- private:
-  static int ObjDefnID;
-  static const JSPropertySpec PropertySpecs[];
-  static const JSMethodSpec MethodSpecs[];
-};
-
 #endif  // FXJS_CJS_APP_H_
diff --git a/fxjs/cjs_color.cpp b/fxjs/cjs_color.cpp
index 35747f9..a0cb02a 100644
--- a/fxjs/cjs_color.cpp
+++ b/fxjs/cjs_color.cpp
@@ -32,22 +32,19 @@
                                                {"equal", equal_static}};
 
 int CJS_Color::ObjDefnID = -1;
+const char CJS_Color::kName[] = "color";
 
 // static
 void CJS_Color::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("color", FXJSOBJTYPE_STATIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Color::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Color>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
-CJS_Color::CJS_Color(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<color>(this);
-}
-
 // static
-v8::Local<v8::Array> color::ConvertPWLColorToArray(CJS_Runtime* pRuntime,
-                                                   const CFX_Color& color) {
+v8::Local<v8::Array> CJS_Color::ConvertPWLColorToArray(CJS_Runtime* pRuntime,
+                                                       const CFX_Color& color) {
   v8::Local<v8::Array> array;
   switch (color.nColorType) {
     case CFX_Color::kTransparent:
@@ -79,8 +76,8 @@
 }
 
 // static
-CFX_Color color::ConvertArrayToPWLColor(CJS_Runtime* pRuntime,
-                                        v8::Local<v8::Array> array) {
+CFX_Color CJS_Color::ConvertArrayToPWLColor(CJS_Runtime* pRuntime,
+                                            v8::Local<v8::Array> array) {
   int nArrayLen = pRuntime->GetArrayLength(array);
   if (nArrayLen < 1)
     return CFX_Color();
@@ -124,132 +121,137 @@
   return CFX_Color();
 }
 
-color::color(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {
-  m_crTransparent = CFX_Color(CFX_Color::kTransparent);
-  m_crBlack = CFX_Color(CFX_Color::kGray, 0);
-  m_crWhite = CFX_Color(CFX_Color::kGray, 1);
-  m_crRed = CFX_Color(CFX_Color::kRGB, 1, 0, 0);
-  m_crGreen = CFX_Color(CFX_Color::kRGB, 0, 1, 0);
-  m_crBlue = CFX_Color(CFX_Color::kRGB, 0, 0, 1);
-  m_crCyan = CFX_Color(CFX_Color::kCMYK, 1, 0, 0, 0);
-  m_crMagenta = CFX_Color(CFX_Color::kCMYK, 0, 1, 0, 0);
-  m_crYellow = CFX_Color(CFX_Color::kCMYK, 0, 0, 1, 0);
-  m_crDKGray = CFX_Color(CFX_Color::kGray, 0.25);
-  m_crGray = CFX_Color(CFX_Color::kGray, 0.5);
-  m_crLTGray = CFX_Color(CFX_Color::kGray, 0.75);
-}
+CJS_Color::CJS_Color(v8::Local<v8::Object> pObject)
+    : CJS_Object(pObject),
+      m_crTransparent(CFX_Color::kTransparent),
+      m_crBlack(CFX_Color::kGray, 0),
+      m_crWhite(CFX_Color::kGray, 1),
+      m_crRed(CFX_Color::kRGB, 1, 0, 0),
+      m_crGreen(CFX_Color::kRGB, 0, 1, 0),
+      m_crBlue(CFX_Color::kRGB, 0, 0, 1),
+      m_crCyan(CFX_Color::kCMYK, 1, 0, 0, 0),
+      m_crMagenta(CFX_Color::kCMYK, 0, 1, 0, 0),
+      m_crYellow(CFX_Color::kCMYK, 0, 0, 1, 0),
+      m_crDKGray(CFX_Color::kGray, 0.25),
+      m_crGray(CFX_Color::kGray, 0.5),
+      m_crLTGray(CFX_Color::kGray, 0.75) {}
 
-color::~color() {}
+CJS_Color::~CJS_Color() = default;
 
-CJS_Return color::get_transparent(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_transparent(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crTransparent);
 }
 
-CJS_Return color::set_transparent(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_transparent(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crTransparent);
 }
 
-CJS_Return color::get_black(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_black(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crBlack);
 }
 
-CJS_Return color::set_black(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_black(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crBlack);
 }
 
-CJS_Return color::get_white(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_white(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crWhite);
 }
 
-CJS_Return color::set_white(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_white(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crWhite);
 }
 
-CJS_Return color::get_red(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_red(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crRed);
 }
 
-CJS_Return color::set_red(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_red(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crRed);
 }
 
-CJS_Return color::get_green(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_green(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crGreen);
 }
 
-CJS_Return color::set_green(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_green(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crGreen);
 }
 
-CJS_Return color::get_blue(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_blue(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crBlue);
 }
 
-CJS_Return color::set_blue(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_blue(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crBlue);
 }
 
-CJS_Return color::get_cyan(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_cyan(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crCyan);
 }
 
-CJS_Return color::set_cyan(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_cyan(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crCyan);
 }
 
-CJS_Return color::get_magenta(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_magenta(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crMagenta);
 }
 
-CJS_Return color::set_magenta(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_magenta(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crMagenta);
 }
 
-CJS_Return color::get_yellow(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_yellow(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crYellow);
 }
 
-CJS_Return color::set_yellow(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_yellow(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crYellow);
 }
 
-CJS_Return color::get_dark_gray(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_dark_gray(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crDKGray);
 }
 
-CJS_Return color::set_dark_gray(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_dark_gray(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crDKGray);
 }
 
-CJS_Return color::get_gray(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_gray(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crGray);
 }
 
-CJS_Return color::set_gray(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_gray(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crGray);
 }
 
-CJS_Return color::get_light_gray(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Color::get_light_gray(CJS_Runtime* pRuntime) {
   return GetPropertyHelper(pRuntime, &m_crLTGray);
 }
 
-CJS_Return color::set_light_gray(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Color::set_light_gray(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return SetPropertyHelper(pRuntime, vp, &m_crLTGray);
 }
 
-CJS_Return color::GetPropertyHelper(CJS_Runtime* pRuntime, CFX_Color* var) {
+CJS_Return CJS_Color::GetPropertyHelper(CJS_Runtime* pRuntime, CFX_Color* var) {
   v8::Local<v8::Value> array = ConvertPWLColorToArray(pRuntime, *var);
   if (array.IsEmpty())
     return CJS_Return(pRuntime->NewArray());
   return CJS_Return(array);
 }
 
-CJS_Return color::SetPropertyHelper(CJS_Runtime* pRuntime,
-                                    v8::Local<v8::Value> vp,
-                                    CFX_Color* var) {
+CJS_Return CJS_Color::SetPropertyHelper(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> vp,
+                                        CFX_Color* var) {
   if (vp.IsEmpty() || !vp->IsArray())
     return CJS_Return(false);
 
@@ -257,8 +259,8 @@
   return CJS_Return(true);
 }
 
-CJS_Return color::convert(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Color::convert(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   int iSize = params.size();
   if (iSize < 2)
     return CJS_Return(false);
@@ -286,8 +288,8 @@
   return CJS_Return(array);
 }
 
-CJS_Return color::equal(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Color::equal(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() < 2)
     return CJS_Return(false);
   if (params[0].IsEmpty() || !params[0]->IsArray() || params[1].IsEmpty() ||
diff --git a/fxjs/cjs_color.h b/fxjs/cjs_color.h
index fab035d..667a13c 100644
--- a/fxjs/cjs_color.h
+++ b/fxjs/cjs_color.h
@@ -12,15 +12,38 @@
 #include "fpdfsdk/pwl/cpwl_wnd.h"
 #include "fxjs/JS_Define.h"
 
-class color : public CJS_EmbedObj {
+class CJS_Color : public CJS_Object {
  public:
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
   static v8::Local<v8::Array> ConvertPWLColorToArray(CJS_Runtime* pRuntime,
                                                      const CFX_Color& color);
   static CFX_Color ConvertArrayToPWLColor(CJS_Runtime* pRuntime,
                                           v8::Local<v8::Array> array);
 
-  explicit color(CJS_Object* pJSObject);
-  ~color() override;
+  explicit CJS_Color(v8::Local<v8::Object> pObject);
+  ~CJS_Color() override;
+
+  JS_STATIC_PROP(black, black, CJS_Color);
+  JS_STATIC_PROP(blue, blue, CJS_Color);
+  JS_STATIC_PROP(cyan, cyan, CJS_Color);
+  JS_STATIC_PROP(dkGray, dark_gray, CJS_Color);
+  JS_STATIC_PROP(gray, gray, CJS_Color);
+  JS_STATIC_PROP(green, green, CJS_Color);
+  JS_STATIC_PROP(ltGray, light_gray, CJS_Color);
+  JS_STATIC_PROP(magenta, magenta, CJS_Color);
+  JS_STATIC_PROP(red, red, CJS_Color);
+  JS_STATIC_PROP(transparent, transparent, CJS_Color);
+  JS_STATIC_PROP(white, white, CJS_Color);
+  JS_STATIC_PROP(yellow, yellow, CJS_Color);
+
+  JS_STATIC_METHOD(convert, CJS_Color);
+  JS_STATIC_METHOD(equal, CJS_Color);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSPropertySpec PropertySpecs[];
+  static const JSMethodSpec MethodSpecs[];
 
   CJS_Return get_black(CJS_Runtime* pRuntime);
   CJS_Return set_black(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
@@ -63,7 +86,6 @@
   CJS_Return equal(CJS_Runtime* pRuntime,
                    const std::vector<v8::Local<v8::Value>>& params);
 
- private:
   CJS_Return GetPropertyHelper(CJS_Runtime* pRuntime, CFX_Color* val);
   CJS_Return SetPropertyHelper(CJS_Runtime* pRuntime,
                                v8::Local<v8::Value> vp,
@@ -83,33 +105,4 @@
   CFX_Color m_crLTGray;
 };
 
-class CJS_Color : public CJS_Object {
- public:
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Color(v8::Local<v8::Object> pObject);
-  ~CJS_Color() override = default;
-
-  JS_STATIC_PROP(black, black, color);
-  JS_STATIC_PROP(blue, blue, color);
-  JS_STATIC_PROP(cyan, cyan, color);
-  JS_STATIC_PROP(dkGray, dark_gray, color);
-  JS_STATIC_PROP(gray, gray, color);
-  JS_STATIC_PROP(green, green, color);
-  JS_STATIC_PROP(ltGray, light_gray, color);
-  JS_STATIC_PROP(magenta, magenta, color);
-  JS_STATIC_PROP(red, red, color);
-  JS_STATIC_PROP(transparent, transparent, color);
-  JS_STATIC_PROP(white, white, color);
-  JS_STATIC_PROP(yellow, yellow, color);
-
-  JS_STATIC_METHOD(convert, color);
-  JS_STATIC_METHOD(equal, color);
-
- private:
-  static int ObjDefnID;
-  static const JSPropertySpec PropertySpecs[];
-  static const JSMethodSpec MethodSpecs[];
-};
-
 #endif  // FXJS_CJS_COLOR_H_
diff --git a/fxjs/cjs_console.cpp b/fxjs/cjs_console.cpp
index 2b4dd27..2b7c84a 100644
--- a/fxjs/cjs_console.cpp
+++ b/fxjs/cjs_console.cpp
@@ -19,38 +19,36 @@
                                                  {"show", show_static}};
 
 int CJS_Console::ObjDefnID = -1;
+const char CJS_Console::kName[] = "console";
 
 // static
 void CJS_Console::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("console", FXJSOBJTYPE_STATIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Console::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Console>, JSDestructor);
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
-CJS_Console::CJS_Console(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<console>(this);
-}
+CJS_Console::CJS_Console(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
 
-console::console(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
+CJS_Console::~CJS_Console() = default;
 
-console::~console() = default;
-
-CJS_Return console::clear(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Console::clear(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return console::hide(CJS_Runtime* pRuntime,
-                         const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Console::hide(CJS_Runtime* pRuntime,
+                             const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return console::println(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Console::println(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(params.size() > 0);
 }
 
-CJS_Return console::show(CJS_Runtime* pRuntime,
-                         const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Console::show(CJS_Runtime* pRuntime,
+                             const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
diff --git a/fxjs/cjs_console.h b/fxjs/cjs_console.h
index 22c18de..56243cf 100644
--- a/fxjs/cjs_console.h
+++ b/fxjs/cjs_console.h
@@ -11,12 +11,23 @@
 
 #include "fxjs/JS_Define.h"
 
-class console : public CJS_EmbedObj {
+class CJS_Console : public CJS_Object {
  public:
-  explicit console(CJS_Object* pJSObject);
-  ~console() override;
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
 
- public:
+  explicit CJS_Console(v8::Local<v8::Object> pObject);
+  ~CJS_Console() override;
+
+  JS_STATIC_METHOD(clear, CJS_Console);
+  JS_STATIC_METHOD(hide, CJS_Console);
+  JS_STATIC_METHOD(println, CJS_Console);
+  JS_STATIC_METHOD(show, CJS_Console);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSMethodSpec MethodSpecs[];
+
   CJS_Return clear(CJS_Runtime* pRuntime,
                    const std::vector<v8::Local<v8::Value>>& params);
   CJS_Return hide(CJS_Runtime* pRuntime,
@@ -27,21 +38,4 @@
                   const std::vector<v8::Local<v8::Value>>& params);
 };
 
-class CJS_Console : public CJS_Object {
- public:
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Console(v8::Local<v8::Object> pObject);
-  ~CJS_Console() override = default;
-
-  JS_STATIC_METHOD(clear, console);
-  JS_STATIC_METHOD(hide, console);
-  JS_STATIC_METHOD(println, console);
-  JS_STATIC_METHOD(show, console);
-
- private:
-  static int ObjDefnID;
-  static const JSMethodSpec MethodSpecs[];
-};
-
 #endif  // FXJS_CJS_CONSOLE_H_
diff --git a/fxjs/cjs_document.cpp b/fxjs/cjs_document.cpp
index f8bdecd..c4a5ff4 100644
--- a/fxjs/cjs_document.cpp
+++ b/fxjs/cjs_document.cpp
@@ -108,6 +108,7 @@
     {"mailDoc", mailDoc_static}};
 
 int CJS_Document::ObjDefnID = -1;
+const char CJS_Document::kName[] = "Document";
 
 // static
 int CJS_Document::GetObjDefnID() {
@@ -116,33 +117,27 @@
 
 // static
 void CJS_Document::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("Document", FXJSOBJTYPE_GLOBAL,
+  ObjDefnID = pEngine->DefineObj(CJS_Document::kName, FXJSOBJTYPE_GLOBAL,
                                  JSConstructor<CJS_Document>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
 CJS_Document::CJS_Document(v8::Local<v8::Object> pObject)
-    : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<Document>(this);
-}
-
-void CJS_Document::InitInstance(IJS_Runtime* pIRuntime) {
-  CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime);
-  Document* pDoc = static_cast<Document*>(GetEmbedObject());
-  pDoc->SetFormFillEnv(pRuntime->GetFormFillEnv());
-}
-
-Document::Document(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject),
+    : CJS_Object(pObject),
       m_pFormFillEnv(nullptr),
       m_cwBaseURL(L""),
       m_bDelay(false) {}
 
-Document::~Document() = default;
+CJS_Document::~CJS_Document() = default;
+
+void CJS_Document::InitInstance(IJS_Runtime* pIRuntime) {
+  CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime);
+  SetFormFillEnv(pRuntime->GetFormFillEnv());
+}
 
 // The total number of fields in document.
-CJS_Return Document::get_num_fields(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_num_fields(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -152,18 +147,19 @@
       static_cast<int>(pPDFForm->CountFields(WideString()))));
 }
 
-CJS_Return Document::set_num_fields(CJS_Runtime* pRuntime,
-                                    v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_num_fields(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::get_dirty(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_dirty(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(pRuntime->NewBoolean(!!m_pFormFillEnv->GetChangeMark()));
 }
 
-CJS_Return Document::set_dirty(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_dirty(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -172,15 +168,16 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_ADBE(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_ADBE(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewUndefined());
 }
 
-CJS_Return Document::set_ADBE(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_ADBE(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_page_num(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_page_num(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -190,8 +187,8 @@
   return CJS_Return(pRuntime->NewNumber(pPageView->GetPageIndex()));
 }
 
-CJS_Return Document::set_page_num(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_page_num(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -207,41 +204,44 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::addAnnot(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::addAnnot(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // Not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::addField(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::addField(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // Not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::exportAsText(
+CJS_Return CJS_Document::exportAsText(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::exportAsFDF(
+CJS_Return CJS_Document::exportAsFDF(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::exportAsXFDF(
+CJS_Return CJS_Document::exportAsXFDF(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::getField(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::getField(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() < 1)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
   if (!m_pFormFillEnv)
@@ -260,8 +260,7 @@
 
   CJS_Field* pJSField =
       static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pFieldObj));
-  Field* pField = static_cast<Field*>(pJSField->GetEmbedObject());
-  pField->AttachField(this, wideName);
+  pJSField->AttachField(this, wideName);
   if (!pJSField)
     return CJS_Return(false);
 
@@ -269,7 +268,7 @@
 }
 
 // Gets the name of the nth field in the document
-CJS_Return Document::getNthFieldName(
+CJS_Return CJS_Document::getNthFieldName(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 1)
@@ -289,21 +288,21 @@
   return CJS_Return(pRuntime->NewString(pField->GetFullName().c_str()));
 }
 
-CJS_Return Document::importAnFDF(
+CJS_Return CJS_Document::importAnFDF(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::importAnXFDF(
+CJS_Return CJS_Document::importAnXFDF(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::importTextData(
+CJS_Return CJS_Document::importTextData(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
@@ -313,8 +312,9 @@
 // exports the form data and mails the resulting fdf file as an attachment to
 // all recipients.
 // comment: need reader supports
-CJS_Return Document::mailForm(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::mailForm(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   if (!m_pFormFillEnv->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
@@ -346,8 +346,9 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::print(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::print(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -368,17 +369,16 @@
         v8::Local<v8::Object> pObj = pRuntime->ToObject(params[8]);
         CJS_Object* pJSObj = pRuntime->GetObjectPrivate(pObj);
         if (pJSObj) {
-          if (PrintParamsObj* pprintparamsObj =
-                  static_cast<PrintParamsObj*>(pJSObj->GetEmbedObject())) {
-            bUI = pprintparamsObj->bUI;
-            nStart = pprintparamsObj->nStart;
-            nEnd = pprintparamsObj->nEnd;
-            bSilent = pprintparamsObj->bSilent;
-            bShrinkToFit = pprintparamsObj->bShrinkToFit;
-            bPrintAsImage = pprintparamsObj->bPrintAsImage;
-            bReverse = pprintparamsObj->bReverse;
-            bAnnotations = pprintparamsObj->bAnnotations;
-          }
+          CJS_PrintParamsObj* printObj =
+              static_cast<CJS_PrintParamsObj*>(pJSObj);
+          bUI = printObj->GetUI();
+          nStart = printObj->GetStart();
+          nEnd = printObj->GetEnd();
+          bSilent = printObj->GetSilent();
+          bShrinkToFit = printObj->GetShrinkToFit();
+          bPrintAsImage = printObj->GetPrintAsImage();
+          bReverse = printObj->GetReverse();
+          bAnnotations = printObj->GetAnnotations();
         }
       }
     }
@@ -413,7 +413,7 @@
 // comment:
 // note: if the filed name is not rational, adobe is dumb for it.
 
-CJS_Return Document::removeField(
+CJS_Return CJS_Document::removeField(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 1)
@@ -467,7 +467,7 @@
 // comment:
 // note: if the fields names r not rational, aodbe is dumb for it.
 
-CJS_Return Document::resetForm(
+CJS_Return CJS_Document::resetForm(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
@@ -510,19 +510,20 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::saveAs(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::saveAs(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::syncAnnotScan(
+CJS_Return CJS_Document::syncAnnotScan(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::submitForm(
+CJS_Return CJS_Document::submitForm(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   int nSize = params.size();
@@ -588,21 +589,22 @@
   return CJS_Return(true);
 }
 
-void Document::SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
+void CJS_Document::SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
   m_pFormFillEnv.Reset(pFormFillEnv);
 }
 
-CJS_Return Document::get_bookmark_root(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_bookmark_root(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_bookmark_root(CJS_Runtime* pRuntime,
-                                       v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_bookmark_root(CJS_Runtime* pRuntime,
+                                           v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::mailDoc(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::mailDoc(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // TODO(tsepez): Check maximum number of allowed params.
   bool bUI = true;
   WideString cTo = L"";
@@ -643,16 +645,16 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_author(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_author(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "Author");
 }
 
-CJS_Return Document::set_author(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_author(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "Author");
 }
 
-CJS_Return Document::get_info(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_info(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -711,12 +713,13 @@
   return CJS_Return(pObj);
 }
 
-CJS_Return Document::set_info(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_info(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::getPropertyInternal(CJS_Runtime* pRuntime,
-                                         const ByteString& propName) {
+CJS_Return CJS_Document::getPropertyInternal(CJS_Runtime* pRuntime,
+                                             const ByteString& propName) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -727,9 +730,9 @@
       pRuntime->NewString(pDictionary->GetUnicodeTextFor(propName).c_str()));
 }
 
-CJS_Return Document::setPropertyInternal(CJS_Runtime* pRuntime,
-                                         v8::Local<v8::Value> vp,
-                                         const ByteString& propName) {
+CJS_Return CJS_Document::setPropertyInternal(CJS_Runtime* pRuntime,
+                                             v8::Local<v8::Value> vp,
+                                             const ByteString& propName) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -747,31 +750,32 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_creation_date(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_creation_date(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "CreationDate");
 }
 
-CJS_Return Document::set_creation_date(CJS_Runtime* pRuntime,
-                                       v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_creation_date(CJS_Runtime* pRuntime,
+                                           v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "CreationDate");
 }
 
-CJS_Return Document::get_creator(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_creator(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "Creator");
 }
 
-CJS_Return Document::set_creator(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_creator(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "Creator");
 }
 
-CJS_Return Document::get_delay(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_delay(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(pRuntime->NewBoolean(m_bDelay));
 }
 
-CJS_Return Document::set_delay(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_delay(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   if (!m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY))
@@ -786,129 +790,131 @@
   std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
   DelayDataToProcess.swap(m_DelayData);
   for (const auto& pData : DelayDataToProcess)
-    Field::DoDelay(m_pFormFillEnv.Get(), pData.get());
+    CJS_Field::DoDelay(m_pFormFillEnv.Get(), pData.get());
 
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_keywords(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_keywords(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "Keywords");
 }
 
-CJS_Return Document::set_keywords(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_keywords(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "Keywords");
 }
 
-CJS_Return Document::get_mod_date(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_mod_date(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "ModDate");
 }
 
-CJS_Return Document::set_mod_date(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_mod_date(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "ModDate");
 }
 
-CJS_Return Document::get_producer(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_producer(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "Producer");
 }
 
-CJS_Return Document::set_producer(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_producer(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "Producer");
 }
 
-CJS_Return Document::get_subject(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_subject(CJS_Runtime* pRuntime) {
   return getPropertyInternal(pRuntime, "Subject");
 }
 
-CJS_Return Document::set_subject(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_subject(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return setPropertyInternal(pRuntime, vp, "Subject");
 }
 
-CJS_Return Document::get_title(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_title(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv || !m_pFormFillEnv->GetUnderlyingDocument())
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return getPropertyInternal(pRuntime, "Title");
 }
 
-CJS_Return Document::set_title(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_title(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   if (!m_pFormFillEnv || !m_pFormFillEnv->GetUnderlyingDocument())
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return setPropertyInternal(pRuntime, vp, "Title");
 }
 
-CJS_Return Document::get_num_pages(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_num_pages(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(pRuntime->NewNumber(m_pFormFillEnv->GetPageCount()));
 }
 
-CJS_Return Document::set_num_pages(CJS_Runtime* pRuntime,
-                                   v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_num_pages(CJS_Runtime* pRuntime,
+                                       v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::get_external(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_external(CJS_Runtime* pRuntime) {
   // In Chrome case, should always return true.
   return CJS_Return(pRuntime->NewBoolean(true));
 }
 
-CJS_Return Document::set_external(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_external(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_filesize(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_filesize(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewNumber(0));
 }
 
-CJS_Return Document::set_filesize(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_filesize(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::get_mouse_x(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_mouse_x(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_mouse_x(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_mouse_x(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_mouse_y(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_mouse_y(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_mouse_y(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_mouse_y(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_URL(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_URL(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(
       pRuntime->NewString(m_pFormFillEnv->JS_docGetFilePath().c_str()));
 }
 
-CJS_Return Document::set_URL(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_URL(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::get_base_URL(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_base_URL(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewString(m_cwBaseURL.c_str()));
 }
 
-CJS_Return Document::set_base_URL(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_base_URL(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   m_cwBaseURL = pRuntime->ToWideString(vp);
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_calculate(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_calculate(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -916,8 +922,8 @@
   return CJS_Return(pRuntime->NewBoolean(!!pInterForm->IsCalculateEnabled()));
 }
 
-CJS_Return Document::set_calculate(CJS_Runtime* pRuntime,
-                                   v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_calculate(CJS_Runtime* pRuntime,
+                                       v8::Local<v8::Value> vp) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -926,7 +932,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_document_file_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_document_file_name(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
 
@@ -944,58 +950,62 @@
   return CJS_Return(pRuntime->NewString(L""));
 }
 
-CJS_Return Document::set_document_file_name(CJS_Runtime* pRuntime,
-                                            v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_document_file_name(CJS_Runtime* pRuntime,
+                                                v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::get_path(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_path(CJS_Runtime* pRuntime) {
   if (!m_pFormFillEnv)
     return CJS_Return(JSGetStringFromID(JSMessage::kBadObjectError));
   return CJS_Return(pRuntime->NewString(
-      app::SysPathToPDFPath(m_pFormFillEnv->JS_docGetFilePath()).c_str()));
+      CJS_App::SysPathToPDFPath(m_pFormFillEnv->JS_docGetFilePath()).c_str()));
 }
 
-CJS_Return Document::set_path(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_path(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::get_page_window_rect(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_page_window_rect(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_page_window_rect(CJS_Runtime* pRuntime,
-                                          v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_page_window_rect(CJS_Runtime* pRuntime,
+                                              v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_layout(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_layout(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_layout(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_layout(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::addLink(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
-  return CJS_Return(true);
-}
-
-CJS_Return Document::closeDoc(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
-  return CJS_Return(true);
-}
-
-CJS_Return Document::getPageBox(
+CJS_Return CJS_Document::addLink(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::getAnnot(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::closeDoc(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
+  return CJS_Return(true);
+}
+
+CJS_Return CJS_Document::getPageBox(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
+  return CJS_Return(true);
+}
+
+CJS_Return CJS_Document::getAnnot(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 2)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
   if (!m_pFormFillEnv)
@@ -1030,13 +1040,11 @@
   if (!pJS_Annot)
     return CJS_Return(false);
 
-  Annot* pAnnot = static_cast<Annot*>(pJS_Annot->GetEmbedObject());
-  pAnnot->SetSDKAnnot(pSDKBAAnnot);
-
+  pJS_Annot->SetSDKAnnot(pSDKBAAnnot);
   return CJS_Return(pJS_Annot->ToV8Object());
 }
 
-CJS_Return Document::getAnnots(
+CJS_Return CJS_Document::getAnnots(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
@@ -1064,8 +1072,7 @@
 
       CJS_Annot* pJS_Annot =
           static_cast<CJS_Annot*>(pRuntime->GetObjectPrivate(pObj));
-      Annot* pAnnot = static_cast<Annot*>(pJS_Annot->GetEmbedObject());
-      pAnnot->SetSDKAnnot(static_cast<CPDFSDK_BAAnnot*>(pSDKAnnotCur.Get()));
+      pJS_Annot->SetSDKAnnot(static_cast<CPDFSDK_BAAnnot*>(pSDKAnnotCur.Get()));
       pRuntime->PutArrayElement(
           annots, i,
           pJS_Annot ? v8::Local<v8::Value>(pJS_Annot->ToV8Object())
@@ -1075,35 +1082,39 @@
   return CJS_Return(annots);
 }
 
-CJS_Return Document::getAnnot3D(
+CJS_Return CJS_Document::getAnnot3D(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(pRuntime->NewUndefined());
 }
 
-CJS_Return Document::getAnnots3D(
+CJS_Return CJS_Document::getAnnots3D(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::getOCGs(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::getOCGs(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::getLinks(CJS_Runtime* pRuntime,
-                              const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::getLinks(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-bool Document::IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect) {
+bool CJS_Document::IsEnclosedInRect(CFX_FloatRect rect,
+                                    CFX_FloatRect LinkRect) {
   return (rect.left <= LinkRect.left && rect.top <= LinkRect.top &&
           rect.right >= LinkRect.right && rect.bottom >= LinkRect.bottom);
 }
 
-CJS_Return Document::addIcon(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::addIcon(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 2)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
@@ -1117,14 +1128,14 @@
 
   v8::Local<v8::Object> pObj = pRuntime->ToObject(params[1]);
   CJS_Object* obj = pRuntime->GetObjectPrivate(pObj);
-  if (!obj->GetEmbedObject())
+  if (!obj)
     return CJS_Return(JSGetStringFromID(JSMessage::kTypeError));
 
   m_IconNames.push_back(swIconName);
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_icons(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_icons(CJS_Runtime* pRuntime) {
   if (m_IconNames.empty())
     return CJS_Return(pRuntime->NewUndefined());
 
@@ -1138,8 +1149,7 @@
 
     CJS_Icon* pJS_Icon =
         static_cast<CJS_Icon*>(pRuntime->GetObjectPrivate(pObj));
-    Icon* pIcon = static_cast<Icon*>(pJS_Icon->GetEmbedObject());
-    pIcon->SetIconName(name);
+    pJS_Icon->SetIconName(name);
     pRuntime->PutArrayElement(Icons, i++,
                               pJS_Icon
                                   ? v8::Local<v8::Value>(pJS_Icon->ToV8Object())
@@ -1148,12 +1158,14 @@
   return CJS_Return(Icons);
 }
 
-CJS_Return Document::set_icons(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_icons(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Document::getIcon(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::getIcon(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 1)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
@@ -1171,34 +1183,34 @@
   if (!pJS_Icon)
     return CJS_Return(false);
 
-  Icon* pIcon = static_cast<Icon*>(pJS_Icon->GetEmbedObject());
-  pIcon->SetIconName(*it);
+  pJS_Icon->SetIconName(*it);
   return CJS_Return(pJS_Icon->ToV8Object());
 }
 
-CJS_Return Document::removeIcon(
+CJS_Return CJS_Document::removeIcon(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, no supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::createDataObject(
+CJS_Return CJS_Document::createDataObject(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not implemented.
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_media(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_media(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_media(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_media(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::calculateNow(
+CJS_Return CJS_Document::calculateNow(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
@@ -1214,16 +1226,16 @@
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_collab(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_collab(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_collab(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_collab(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::getPageNthWord(
+CJS_Return CJS_Document::getPageNthWord(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
@@ -1270,7 +1282,7 @@
   return CJS_Return(pRuntime->NewString(swRet.c_str()));
 }
 
-CJS_Return Document::getPageNthWordQuads(
+CJS_Return CJS_Document::getPageNthWordQuads(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
@@ -1280,7 +1292,7 @@
   return CJS_Return(false);
 }
 
-CJS_Return Document::getPageNumWords(
+CJS_Return CJS_Document::getPageNumWords(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_pFormFillEnv)
@@ -1309,7 +1321,7 @@
   return CJS_Return(pRuntime->NewNumber(nWords));
 }
 
-CJS_Return Document::getPrintParams(
+CJS_Return CJS_Document::getPrintParams(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   v8::Local<v8::Object> pRetObj =
@@ -1324,7 +1336,7 @@
 
 #define ISLATINWORD(u) (u != 0x20 && u <= 0x28FF)
 
-int Document::CountWords(CPDF_TextObject* pTextObj) {
+int CJS_Document::CountWords(CPDF_TextObject* pTextObj) {
   if (!pTextObj)
     return 0;
 
@@ -1358,7 +1370,8 @@
   return nWords;
 }
 
-WideString Document::GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex) {
+WideString CJS_Document::GetObjWordStr(CPDF_TextObject* pTextObj,
+                                       int nWordIndex) {
   WideString swRet;
 
   CPDF_Font* pFont = pTextObj->GetFont();
@@ -1393,58 +1406,60 @@
   return swRet;
 }
 
-CJS_Return Document::get_zoom(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_zoom(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_zoom(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_zoom(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::get_zoom_type(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Document::get_zoom_type(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::set_zoom_type(CJS_Runtime* pRuntime,
-                                   v8::Local<v8::Value> vp) {
+CJS_Return CJS_Document::set_zoom_type(CJS_Runtime* pRuntime,
+                                       v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Document::deletePages(
+CJS_Return CJS_Document::deletePages(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::extractPages(
+CJS_Return CJS_Document::extractPages(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::insertPages(
+CJS_Return CJS_Document::insertPages(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::replacePages(
+CJS_Return CJS_Document::replacePages(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::getURL(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Document::getURL(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Document::gotoNamedDest(
+CJS_Return CJS_Document::gotoNamedDest(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 1)
@@ -1477,11 +1492,12 @@
   return CJS_Return(true);
 }
 
-void Document::AddDelayData(std::unique_ptr<CJS_DelayData> pData) {
+void CJS_Document::AddDelayData(std::unique_ptr<CJS_DelayData> pData) {
   m_DelayData.push_back(std::move(pData));
 }
 
-void Document::DoFieldDelay(const WideString& sFieldName, int nControlIndex) {
+void CJS_Document::DoFieldDelay(const WideString& sFieldName,
+                                int nControlIndex) {
   std::vector<std::unique_ptr<CJS_DelayData>> delayed_data;
   auto iter = m_DelayData.begin();
   while (iter != m_DelayData.end()) {
@@ -1494,9 +1510,5 @@
   }
 
   for (const auto& pData : delayed_data)
-    Field::DoDelay(m_pFormFillEnv.Get(), pData.get());
-}
-
-CJS_Document* Document::GetCJSDoc() const {
-  return static_cast<CJS_Document*>(m_pJSObject.Get());
+    CJS_Field::DoDelay(m_pFormFillEnv.Get(), pData.get());
 }
diff --git a/fxjs/cjs_document.h b/fxjs/cjs_document.h
index 0b0a158..179b8ef 100644
--- a/fxjs/cjs_document.h
+++ b/fxjs/cjs_document.h
@@ -18,10 +18,105 @@
 
 struct CJS_DelayData;
 
-class Document : public CJS_EmbedObj {
+class CJS_Document : public CJS_Object {
  public:
-  explicit Document(CJS_Object* pJSObject);
-  ~Document() override;
+  static int GetObjDefnID();
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
+
+  explicit CJS_Document(v8::Local<v8::Object> pObject);
+  ~CJS_Document() override;
+
+  // CJS_Object
+  void InitInstance(IJS_Runtime* pIRuntime) override;
+
+  void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv);
+  CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
+    return m_pFormFillEnv.Get();
+  }
+  void AddDelayData(std::unique_ptr<CJS_DelayData> pData);
+  void DoFieldDelay(const WideString& sFieldName, int nControlIndex);
+
+  JS_STATIC_PROP(ADBE, ADBE, CJS_Document);
+  JS_STATIC_PROP(author, author, CJS_Document);
+  JS_STATIC_PROP(baseURL, base_URL, CJS_Document);
+  JS_STATIC_PROP(bookmarkRoot, bookmark_root, CJS_Document);
+  JS_STATIC_PROP(calculate, calculate, CJS_Document);
+  JS_STATIC_PROP(Collab, collab, CJS_Document);
+  JS_STATIC_PROP(creationDate, creation_date, CJS_Document);
+  JS_STATIC_PROP(creator, creator, CJS_Document);
+  JS_STATIC_PROP(delay, delay, CJS_Document);
+  JS_STATIC_PROP(dirty, dirty, CJS_Document);
+  JS_STATIC_PROP(documentFileName, document_file_name, CJS_Document);
+  JS_STATIC_PROP(external, external, CJS_Document);
+  JS_STATIC_PROP(filesize, filesize, CJS_Document);
+  JS_STATIC_PROP(icons, icons, CJS_Document);
+  JS_STATIC_PROP(info, info, CJS_Document);
+  JS_STATIC_PROP(keywords, keywords, CJS_Document);
+  JS_STATIC_PROP(layout, layout, CJS_Document);
+  JS_STATIC_PROP(media, media, CJS_Document);
+  JS_STATIC_PROP(modDate, mod_date, CJS_Document);
+  JS_STATIC_PROP(mouseX, mouse_x, CJS_Document);
+  JS_STATIC_PROP(mouseY, mouse_y, CJS_Document);
+  JS_STATIC_PROP(numFields, num_fields, CJS_Document);
+  JS_STATIC_PROP(numPages, num_pages, CJS_Document);
+  JS_STATIC_PROP(pageNum, page_num, CJS_Document);
+  JS_STATIC_PROP(pageWindowRect, page_window_rect, CJS_Document);
+  JS_STATIC_PROP(path, path, CJS_Document);
+  JS_STATIC_PROP(producer, producer, CJS_Document);
+  JS_STATIC_PROP(subject, subject, CJS_Document);
+  JS_STATIC_PROP(title, title, CJS_Document);
+  JS_STATIC_PROP(URL, URL, CJS_Document);
+  JS_STATIC_PROP(zoom, zoom, CJS_Document);
+  JS_STATIC_PROP(zoomType, zoom_type, CJS_Document);
+
+  JS_STATIC_METHOD(addAnnot, CJS_Document);
+  JS_STATIC_METHOD(addField, CJS_Document);
+  JS_STATIC_METHOD(addLink, CJS_Document);
+  JS_STATIC_METHOD(addIcon, CJS_Document);
+  JS_STATIC_METHOD(calculateNow, CJS_Document);
+  JS_STATIC_METHOD(closeDoc, CJS_Document);
+  JS_STATIC_METHOD(createDataObject, CJS_Document);
+  JS_STATIC_METHOD(deletePages, CJS_Document);
+  JS_STATIC_METHOD(exportAsText, CJS_Document);
+  JS_STATIC_METHOD(exportAsFDF, CJS_Document);
+  JS_STATIC_METHOD(exportAsXFDF, CJS_Document);
+  JS_STATIC_METHOD(extractPages, CJS_Document);
+  JS_STATIC_METHOD(getAnnot, CJS_Document);
+  JS_STATIC_METHOD(getAnnots, CJS_Document);
+  JS_STATIC_METHOD(getAnnot3D, CJS_Document);
+  JS_STATIC_METHOD(getAnnots3D, CJS_Document);
+  JS_STATIC_METHOD(getField, CJS_Document);
+  JS_STATIC_METHOD(getIcon, CJS_Document);
+  JS_STATIC_METHOD(getLinks, CJS_Document);
+  JS_STATIC_METHOD(getNthFieldName, CJS_Document);
+  JS_STATIC_METHOD(getOCGs, CJS_Document);
+  JS_STATIC_METHOD(getPageBox, CJS_Document);
+  JS_STATIC_METHOD(getPageNthWord, CJS_Document);
+  JS_STATIC_METHOD(getPageNthWordQuads, CJS_Document);
+  JS_STATIC_METHOD(getPageNumWords, CJS_Document);
+  JS_STATIC_METHOD(getPrintParams, CJS_Document);
+  JS_STATIC_METHOD(getURL, CJS_Document);
+  JS_STATIC_METHOD(gotoNamedDest, CJS_Document);
+  JS_STATIC_METHOD(importAnFDF, CJS_Document);
+  JS_STATIC_METHOD(importAnXFDF, CJS_Document);
+  JS_STATIC_METHOD(importTextData, CJS_Document);
+  JS_STATIC_METHOD(insertPages, CJS_Document);
+  JS_STATIC_METHOD(mailForm, CJS_Document);
+  JS_STATIC_METHOD(print, CJS_Document);
+  JS_STATIC_METHOD(removeField, CJS_Document);
+  JS_STATIC_METHOD(replacePages, CJS_Document);
+  JS_STATIC_METHOD(removeIcon, CJS_Document);
+  JS_STATIC_METHOD(resetForm, CJS_Document);
+  JS_STATIC_METHOD(saveAs, CJS_Document);
+  JS_STATIC_METHOD(submitForm, CJS_Document);
+  JS_STATIC_METHOD(syncAnnotScan, CJS_Document);
+  JS_STATIC_METHOD(mailDoc, CJS_Document);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSPropertySpec PropertySpecs[];
+  static const JSMethodSpec MethodSpecs[];
 
   CJS_Return get_ADBE(CJS_Runtime* pRuntime);
   CJS_Return set_ADBE(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
@@ -207,15 +302,6 @@
   CJS_Return removeIcon(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
 
-  void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
-    return m_pFormFillEnv.Get();
-  }
-  void AddDelayData(std::unique_ptr<CJS_DelayData> pData);
-  void DoFieldDelay(const WideString& sFieldName, int nControlIndex);
-  CJS_Document* GetCJSDoc() const;
-
- private:
   bool IsEnclosedInRect(CFX_FloatRect rect, CFX_FloatRect LinkRect);
   int CountWords(CPDF_TextObject* pTextObj);
   WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);
@@ -234,97 +320,4 @@
   bool m_bDelay;
 };
 
-class CJS_Document : public CJS_Object {
- public:
-  static int GetObjDefnID();
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Document(v8::Local<v8::Object> pObject);
-  ~CJS_Document() override = default;
-
-  // CJS_Object
-  void InitInstance(IJS_Runtime* pIRuntime) override;
-
-  JS_STATIC_PROP(ADBE, ADBE, Document);
-  JS_STATIC_PROP(author, author, Document);
-  JS_STATIC_PROP(baseURL, base_URL, Document);
-  JS_STATIC_PROP(bookmarkRoot, bookmark_root, Document);
-  JS_STATIC_PROP(calculate, calculate, Document);
-  JS_STATIC_PROP(Collab, collab, Document);
-  JS_STATIC_PROP(creationDate, creation_date, Document);
-  JS_STATIC_PROP(creator, creator, Document);
-  JS_STATIC_PROP(delay, delay, Document);
-  JS_STATIC_PROP(dirty, dirty, Document);
-  JS_STATIC_PROP(documentFileName, document_file_name, Document);
-  JS_STATIC_PROP(external, external, Document);
-  JS_STATIC_PROP(filesize, filesize, Document);
-  JS_STATIC_PROP(icons, icons, Document);
-  JS_STATIC_PROP(info, info, Document);
-  JS_STATIC_PROP(keywords, keywords, Document);
-  JS_STATIC_PROP(layout, layout, Document);
-  JS_STATIC_PROP(media, media, Document);
-  JS_STATIC_PROP(modDate, mod_date, Document);
-  JS_STATIC_PROP(mouseX, mouse_x, Document);
-  JS_STATIC_PROP(mouseY, mouse_y, Document);
-  JS_STATIC_PROP(numFields, num_fields, Document);
-  JS_STATIC_PROP(numPages, num_pages, Document);
-  JS_STATIC_PROP(pageNum, page_num, Document);
-  JS_STATIC_PROP(pageWindowRect, page_window_rect, Document);
-  JS_STATIC_PROP(path, path, Document);
-  JS_STATIC_PROP(producer, producer, Document);
-  JS_STATIC_PROP(subject, subject, Document);
-  JS_STATIC_PROP(title, title, Document);
-  JS_STATIC_PROP(URL, URL, Document);
-  JS_STATIC_PROP(zoom, zoom, Document);
-  JS_STATIC_PROP(zoomType, zoom_type, Document);
-
-  JS_STATIC_METHOD(addAnnot, Document);
-  JS_STATIC_METHOD(addField, Document);
-  JS_STATIC_METHOD(addLink, Document);
-  JS_STATIC_METHOD(addIcon, Document);
-  JS_STATIC_METHOD(calculateNow, Document);
-  JS_STATIC_METHOD(closeDoc, Document);
-  JS_STATIC_METHOD(createDataObject, Document);
-  JS_STATIC_METHOD(deletePages, Document);
-  JS_STATIC_METHOD(exportAsText, Document);
-  JS_STATIC_METHOD(exportAsFDF, Document);
-  JS_STATIC_METHOD(exportAsXFDF, Document);
-  JS_STATIC_METHOD(extractPages, Document);
-  JS_STATIC_METHOD(getAnnot, Document);
-  JS_STATIC_METHOD(getAnnots, Document);
-  JS_STATIC_METHOD(getAnnot3D, Document);
-  JS_STATIC_METHOD(getAnnots3D, Document);
-  JS_STATIC_METHOD(getField, Document);
-  JS_STATIC_METHOD(getIcon, Document);
-  JS_STATIC_METHOD(getLinks, Document);
-  JS_STATIC_METHOD(getNthFieldName, Document);
-  JS_STATIC_METHOD(getOCGs, Document);
-  JS_STATIC_METHOD(getPageBox, Document);
-  JS_STATIC_METHOD(getPageNthWord, Document);
-  JS_STATIC_METHOD(getPageNthWordQuads, Document);
-  JS_STATIC_METHOD(getPageNumWords, Document);
-  JS_STATIC_METHOD(getPrintParams, Document);
-  JS_STATIC_METHOD(getURL, Document);
-  JS_STATIC_METHOD(gotoNamedDest, Document);
-  JS_STATIC_METHOD(importAnFDF, Document);
-  JS_STATIC_METHOD(importAnXFDF, Document);
-  JS_STATIC_METHOD(importTextData, Document);
-  JS_STATIC_METHOD(insertPages, Document);
-  JS_STATIC_METHOD(mailForm, Document);
-  JS_STATIC_METHOD(print, Document);
-  JS_STATIC_METHOD(removeField, Document);
-  JS_STATIC_METHOD(replacePages, Document);
-  JS_STATIC_METHOD(removeIcon, Document);
-  JS_STATIC_METHOD(resetForm, Document);
-  JS_STATIC_METHOD(saveAs, Document);
-  JS_STATIC_METHOD(submitForm, Document);
-  JS_STATIC_METHOD(syncAnnotScan, Document);
-  JS_STATIC_METHOD(mailDoc, Document);
-
- private:
-  static int ObjDefnID;
-  static const JSPropertySpec PropertySpecs[];
-  static const JSMethodSpec MethodSpecs[];
-};
-
 #endif  // FXJS_CJS_DOCUMENT_H_
diff --git a/fxjs/cjs_embedobj.cpp b/fxjs/cjs_embedobj.cpp
deleted file mode 100644
index cbebd63..0000000
--- a/fxjs/cjs_embedobj.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright 2017 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
-
-#include "fxjs/cjs_embedobj.h"
-
-#include "fxjs/cjs_object.h"
-
-CJS_EmbedObj::CJS_EmbedObj(CJS_Object* pJSObject) : m_pJSObject(pJSObject) {}
-
-CJS_EmbedObj::~CJS_EmbedObj() {}
diff --git a/fxjs/cjs_embedobj.h b/fxjs/cjs_embedobj.h
deleted file mode 100644
index 82e549e..0000000
--- a/fxjs/cjs_embedobj.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2017 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 FXJS_CJS_EMBEDOBJ_H_
-#define FXJS_CJS_EMBEDOBJ_H_
-
-#include "core/fxcrt/unowned_ptr.h"
-
-class CJS_Object;
-
-class CJS_EmbedObj {
- public:
-  explicit CJS_EmbedObj(CJS_Object* pJSObject);
-  virtual ~CJS_EmbedObj();
-
-  CJS_Object* GetJSObject() const { return m_pJSObject.Get(); }
-
- protected:
-  UnownedPtr<CJS_Object> const m_pJSObject;
-};
-
-#endif  // FXJS_CJS_EMBEDOBJ_H_
diff --git a/fxjs/cjs_event.cpp b/fxjs/cjs_event.cpp
index 7736f0d..341bcc4 100644
--- a/fxjs/cjs_event.cpp
+++ b/fxjs/cjs_event.cpp
@@ -35,29 +35,27 @@
     {"willCommit", get_will_commit_static, set_will_commit_static}};
 
 int CJS_Event::ObjDefnID = -1;
+const char CJS_Event::kName[] = "event";
 
 // static
 void CJS_Event::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("event", FXJSOBJTYPE_STATIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Event::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Event>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
 }
 
-CJS_Event::CJS_Event(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<event>(this);
-}
+CJS_Event::CJS_Event(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
 
-event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {}
+CJS_Event::~CJS_Event() = default;
 
-event::~event() = default;
-
-CJS_Return event::get_change(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_change(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewString(pEvent->Change().c_str()));
 }
 
-CJS_Return event::set_change(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_change(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -68,31 +66,31 @@
   return CJS_Return(true);
 }
 
-CJS_Return event::get_change_ex(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_change_ex(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
   return CJS_Return(pRuntime->NewString(pEvent->ChangeEx().c_str()));
 }
 
-CJS_Return event::set_change_ex(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_change_ex(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_commit_key(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_commit_key(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
   return CJS_Return(pRuntime->NewNumber(pEvent->CommitKey()));
 }
 
-CJS_Return event::set_commit_key(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_commit_key(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_field_full(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_field_full(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -102,82 +100,84 @@
   return CJS_Return(pRuntime->NewBoolean(pEvent->FieldFull()));
 }
 
-CJS_Return event::set_field_full(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_field_full(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_key_down(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_key_down(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewBoolean(pEvent->KeyDown()));
 }
 
-CJS_Return event::set_key_down(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_key_down(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_modifier(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_modifier(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewBoolean(pEvent->Modifier()));
 }
 
-CJS_Return event::set_modifier(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_modifier(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_name(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewString(pEvent->Name()));
 }
 
-CJS_Return event::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_rc(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_rc(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewBoolean(pEvent->Rc()));
 }
 
-CJS_Return event::set_rc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_rc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   pEvent->Rc() = pRuntime->ToBoolean(vp);
   return CJS_Return(true);
 }
 
-CJS_Return event::get_rich_change(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_rich_change(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return event::set_rich_change(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_rich_change(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return event::get_rich_change_ex(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_rich_change_ex(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return event::set_rich_change_ex(CJS_Runtime* pRuntime,
+CJS_Return CJS_Event::set_rich_change_ex(CJS_Runtime* pRuntime,
+                                         v8::Local<v8::Value> vp) {
+  return CJS_Return(true);
+}
+
+CJS_Return CJS_Event::get_rich_value(CJS_Runtime* pRuntime) {
+  return CJS_Return(true);
+}
+
+CJS_Return CJS_Event::set_rich_value(CJS_Runtime* pRuntime,
                                      v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return event::get_rich_value(CJS_Runtime* pRuntime) {
-  return CJS_Return(true);
-}
-
-CJS_Return event::set_rich_value(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
-  return CJS_Return(true);
-}
-
-CJS_Return event::get_sel_end(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_sel_end(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -187,7 +187,8 @@
   return CJS_Return(pRuntime->NewNumber(pEvent->SelEnd()));
 }
 
-CJS_Return event::set_sel_end(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_sel_end(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -198,7 +199,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return event::get_sel_start(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_sel_start(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -208,8 +209,8 @@
   return CJS_Return(pRuntime->NewNumber(pEvent->SelStart()));
 }
 
-CJS_Return event::set_sel_start(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_sel_start(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -220,58 +221,61 @@
   return CJS_Return(true);
 }
 
-CJS_Return event::get_shift(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_shift(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewBoolean(pEvent->Shift()));
 }
 
-CJS_Return event::set_shift(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_shift(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_source(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_source(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-  return CJS_Return(pEvent->Source()->GetJSObject()->ToV8Object());
+  return CJS_Return(pEvent->Source()->ToV8Object());
 }
 
-CJS_Return event::set_source(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_source(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_target(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_target(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-  return CJS_Return(pEvent->Target_Field()->GetJSObject()->ToV8Object());
+  return CJS_Return(pEvent->Target_Field()->ToV8Object());
 }
 
-CJS_Return event::set_target(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_target(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_target_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_target_name(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewString(pEvent->TargetName().c_str()));
 }
 
-CJS_Return event::set_target_name(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_target_name(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_type(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_type(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewString(pEvent->Type()));
 }
 
-CJS_Return event::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return event::get_value(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_value(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -284,7 +288,8 @@
   return CJS_Return(pRuntime->NewString(pEvent->Value().c_str()));
 }
 
-CJS_Return event::set_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_value(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -298,13 +303,13 @@
   return CJS_Return(true);
 }
 
-CJS_Return event::get_will_commit(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Event::get_will_commit(CJS_Runtime* pRuntime) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
   return CJS_Return(pRuntime->NewBoolean(pEvent->WillCommit()));
 }
 
-CJS_Return event::set_will_commit(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Event::set_will_commit(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
diff --git a/fxjs/cjs_event.h b/fxjs/cjs_event.h
index fa8c40b..291b6eb 100644
--- a/fxjs/cjs_event.h
+++ b/fxjs/cjs_event.h
@@ -9,10 +9,38 @@
 
 #include "fxjs/JS_Define.h"
 
-class event : public CJS_EmbedObj {
+class CJS_Event : public CJS_Object {
  public:
-  explicit event(CJS_Object* pJSObject);
-  ~event() override;
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
+
+  explicit CJS_Event(v8::Local<v8::Object> pObject);
+  ~CJS_Event() override;
+
+  JS_STATIC_PROP(change, change, CJS_Event);
+  JS_STATIC_PROP(changeEx, change_ex, CJS_Event);
+  JS_STATIC_PROP(commitKey, commit_key, CJS_Event);
+  JS_STATIC_PROP(fieldFull, field_full, CJS_Event);
+  JS_STATIC_PROP(keyDown, key_down, CJS_Event);
+  JS_STATIC_PROP(modifier, modifier, CJS_Event);
+  JS_STATIC_PROP(name, name, CJS_Event);
+  JS_STATIC_PROP(rc, rc, CJS_Event);
+  JS_STATIC_PROP(richChange, rich_change, CJS_Event);
+  JS_STATIC_PROP(richChangeEx, rich_change_ex, CJS_Event);
+  JS_STATIC_PROP(richValue, rich_value, CJS_Event);
+  JS_STATIC_PROP(selEnd, sel_end, CJS_Event);
+  JS_STATIC_PROP(selStart, sel_start, CJS_Event);
+  JS_STATIC_PROP(shift, shift, CJS_Event);
+  JS_STATIC_PROP(source, source, CJS_Event);
+  JS_STATIC_PROP(target, target, CJS_Event);
+  JS_STATIC_PROP(targetName, target_name, CJS_Event);
+  JS_STATIC_PROP(type, type, CJS_Event);
+  JS_STATIC_PROP(value, value, CJS_Event);
+  JS_STATIC_PROP(willCommit, will_commit, CJS_Event);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSPropertySpec PropertySpecs[];
 
   CJS_Return get_change(CJS_Runtime* pRuntime);
   CJS_Return set_change(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
@@ -75,37 +103,4 @@
   CJS_Return set_will_commit(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
 };
 
-class CJS_Event : public CJS_Object {
- public:
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Event(v8::Local<v8::Object> pObject);
-  ~CJS_Event() override = default;
-
-  JS_STATIC_PROP(change, change, event);
-  JS_STATIC_PROP(changeEx, change_ex, event);
-  JS_STATIC_PROP(commitKey, commit_key, event);
-  JS_STATIC_PROP(fieldFull, field_full, event);
-  JS_STATIC_PROP(keyDown, key_down, event);
-  JS_STATIC_PROP(modifier, modifier, event);
-  JS_STATIC_PROP(name, name, event);
-  JS_STATIC_PROP(rc, rc, event);
-  JS_STATIC_PROP(richChange, rich_change, event);
-  JS_STATIC_PROP(richChangeEx, rich_change_ex, event);
-  JS_STATIC_PROP(richValue, rich_value, event);
-  JS_STATIC_PROP(selEnd, sel_end, event);
-  JS_STATIC_PROP(selStart, sel_start, event);
-  JS_STATIC_PROP(shift, shift, event);
-  JS_STATIC_PROP(source, source, event);
-  JS_STATIC_PROP(target, target, event);
-  JS_STATIC_PROP(targetName, target_name, event);
-  JS_STATIC_PROP(type, type, event);
-  JS_STATIC_PROP(value, value, event);
-  JS_STATIC_PROP(willCommit, will_commit, event);
-
- private:
-  static int ObjDefnID;
-  static const JSPropertySpec PropertySpecs[];
-};
-
 #endif  // FXJS_CJS_EVENT_H_
diff --git a/fxjs/cjs_eventhandler.cpp b/fxjs/cjs_eventhandler.cpp
index eb150b2..6e7e840 100644
--- a/fxjs/cjs_eventhandler.cpp
+++ b/fxjs/cjs_eventhandler.cpp
@@ -587,7 +587,7 @@
   return m_bShift;
 }
 
-Field* CJS_EventHandler::Source() {
+CJS_Field* CJS_EventHandler::Source() {
   CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime();
   v8::Local<v8::Object> pDocObj =
       pRuntime->NewFxDynamicObj(CJS_Document::GetObjDefnID());
@@ -604,17 +604,15 @@
   CJS_Field* pJSField =
       static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pFieldObj));
 
-  Document* pDocument = static_cast<Document*>(pJSDocument->GetEmbedObject());
-  pDocument->SetFormFillEnv(m_pTargetFormFillEnv
-                                ? m_pTargetFormFillEnv.Get()
-                                : m_pJSEventContext->GetFormFillEnv());
+  pJSDocument->SetFormFillEnv(m_pTargetFormFillEnv
+                                  ? m_pTargetFormFillEnv.Get()
+                                  : m_pJSEventContext->GetFormFillEnv());
 
-  Field* pField = static_cast<Field*>(pJSField->GetEmbedObject());
-  pField->AttachField(pDocument, m_strSourceName);
-  return pField;
+  pJSField->AttachField(pJSDocument, m_strSourceName);
+  return pJSField;
 }
 
-Field* CJS_EventHandler::Target_Field() {
+CJS_Field* CJS_EventHandler::Target_Field() {
   CJS_Runtime* pRuntime = m_pJSEventContext->GetJSRuntime();
   v8::Local<v8::Object> pDocObj =
       pRuntime->NewFxDynamicObj(CJS_Document::GetObjDefnID());
@@ -631,14 +629,12 @@
   CJS_Field* pJSField =
       static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pFieldObj));
 
-  Document* pDocument = static_cast<Document*>(pJSDocument->GetEmbedObject());
-  pDocument->SetFormFillEnv(m_pTargetFormFillEnv
-                                ? m_pTargetFormFillEnv.Get()
-                                : m_pJSEventContext->GetFormFillEnv());
+  pJSDocument->SetFormFillEnv(m_pTargetFormFillEnv
+                                  ? m_pTargetFormFillEnv.Get()
+                                  : m_pJSEventContext->GetFormFillEnv());
 
-  Field* pField = static_cast<Field*>(pJSField->GetEmbedObject());
-  pField->AttachField(pDocument, m_strTargetName);
-  return pField;
+  pJSField->AttachField(pJSDocument, m_strTargetName);
+  return pJSField;
 }
 
 WideString& CJS_EventHandler::Value() {
diff --git a/fxjs/cjs_eventhandler.h b/fxjs/cjs_eventhandler.h
index 87ce1dc..4087355 100644
--- a/fxjs/cjs_eventhandler.h
+++ b/fxjs/cjs_eventhandler.h
@@ -13,10 +13,10 @@
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 
 class CJS_EventContext;
+class CJS_Field;
 class CPDFSDK_Annot;
 class CPDF_Bookmark;
 class CPDF_FormField;
-class Field;
 
 enum JS_EVENT_T {
   JET_UNKNOWN,
@@ -158,8 +158,8 @@
   void SetSelEnd(int value);
   void SetSelStart(int value);
   bool Shift() const;
-  Field* Source();
-  Field* Target_Field();
+  CJS_Field* Source();
+  CJS_Field* Target_Field();
   WideString& Value();
   bool WillCommit() const;
   const WideString& TargetName() const;
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index 7882a85..9138d93 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -156,6 +156,7 @@
     {"signatureValidate", signatureValidate_static}};
 
 int CJS_Field::ObjDefnID = -1;
+const char CJS_Field::kName[] = "Field";
 
 // static
 int CJS_Field::GetObjDefnID() {
@@ -164,32 +165,28 @@
 
 // static
 void CJS_Field::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("Field", FXJSOBJTYPE_DYNAMIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Field::kName, FXJSOBJTYPE_DYNAMIC,
                                  JSConstructor<CJS_Field>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
-CJS_Field::CJS_Field(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<Field>(this);
-}
-
-void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) {}
-
-Field::Field(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject),
+CJS_Field::CJS_Field(v8::Local<v8::Object> pObject)
+    : CJS_Object(pObject),
       m_pJSDoc(nullptr),
       m_pFormFillEnv(nullptr),
       m_nFormControlIndex(-1),
       m_bCanSet(false),
       m_bDelay(false) {}
 
-Field::~Field() = default;
+CJS_Field::~CJS_Field() = default;
+
+void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) {}
 
 // note: iControlNo = -1, means not a widget.
-void Field::ParseFieldName(const std::wstring& strFieldNameParsed,
-                           std::wstring& strFieldName,
-                           int& iControlNo) {
+void CJS_Field::ParseFieldName(const std::wstring& strFieldNameParsed,
+                               std::wstring& strFieldName,
+                               int& iControlNo) {
   int iStart = strFieldNameParsed.find_last_of(L'.');
   if (iStart == -1) {
     strFieldName = strFieldNameParsed;
@@ -213,7 +210,8 @@
   strFieldName = strFieldNameParsed.substr(0, iStart);
 }
 
-bool Field::AttachField(Document* pDocument, const WideString& csFieldName) {
+bool CJS_Field::AttachField(CJS_Document* pDocument,
+                            const WideString& csFieldName) {
   m_pJSDoc = pDocument;
   m_pFormFillEnv.Reset(pDocument->GetFormFillEnv());
   m_bCanSet = m_pFormFillEnv->GetPermissions(FPDFPERM_FILL_FORM) ||
@@ -243,7 +241,7 @@
   return true;
 }
 
-std::vector<CPDF_FormField*> Field::GetFormFields(
+std::vector<CPDF_FormField*> CJS_Field::GetFormFields(
     CPDFSDK_FormFillEnvironment* pFormFillEnv,
     const WideString& csFieldName) {
   std::vector<CPDF_FormField*> fields;
@@ -256,16 +254,16 @@
   return fields;
 }
 
-std::vector<CPDF_FormField*> Field::GetFormFields(
+std::vector<CPDF_FormField*> CJS_Field::GetFormFields(
     const WideString& csFieldName) const {
-  return Field::GetFormFields(m_pFormFillEnv.Get(), csFieldName);
+  return CJS_Field::GetFormFields(m_pFormFillEnv.Get(), csFieldName);
 }
 
-void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                            CPDF_FormField* pFormField,
-                            bool bChangeMark,
-                            bool bResetAP,
-                            bool bRefresh) {
+void CJS_Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                                CPDF_FormField* pFormField,
+                                bool bChangeMark,
+                                bool bResetAP,
+                                bool bRefresh) {
   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
 
   if (bResetAP) {
@@ -319,11 +317,11 @@
     pFormFillEnv->SetChangeMark();
 }
 
-void Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                              CPDF_FormControl* pFormControl,
-                              bool bChangeMark,
-                              bool bResetAP,
-                              bool bRefresh) {
+void CJS_Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                                  CPDF_FormControl* pFormControl,
+                                  bool bChangeMark,
+                                  bool bResetAP,
+                                  bool bRefresh) {
   ASSERT(pFormControl);
 
   CPDFSDK_InterForm* pForm = pFormFillEnv->GetInterForm();
@@ -357,14 +355,15 @@
     pFormFillEnv->SetChangeMark();
 }
 
-CPDFSDK_Widget* Field::GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                 CPDF_FormControl* pFormControl) {
+CPDFSDK_Widget* CJS_Field::GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                                     CPDF_FormControl* pFormControl) {
   CPDFSDK_InterForm* pInterForm =
       static_cast<CPDFSDK_InterForm*>(pFormFillEnv->GetInterForm());
   return pInterForm ? pInterForm->GetWidget(pFormControl) : nullptr;
 }
 
-bool Field::ValueIsOccur(CPDF_FormField* pFormField, WideString csOptLabel) {
+bool CJS_Field::ValueIsOccur(CPDF_FormField* pFormField,
+                             WideString csOptLabel) {
   for (int i = 0, sz = pFormField->CountOptions(); i < sz; i++) {
     if (csOptLabel.Compare(pFormField->GetOptionLabel(i)) == 0)
       return true;
@@ -373,7 +372,7 @@
   return false;
 }
 
-CPDF_FormControl* Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
+CPDF_FormControl* CJS_Field::GetSmartFieldControl(CPDF_FormField* pFormField) {
   if (!pFormField->CountControls() ||
       m_nFormControlIndex >= pFormField->CountControls())
     return nullptr;
@@ -382,7 +381,7 @@
   return pFormField->GetControl(m_nFormControlIndex);
 }
 
-CJS_Return Field::get_alignment(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_alignment(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -408,13 +407,13 @@
   return CJS_Return(pRuntime->NewString(L""));
 }
 
-CJS_Return Field::set_alignment(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_alignment(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_border_style(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_border_style(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -445,8 +444,8 @@
   return CJS_Return(pRuntime->NewString(L""));
 }
 
-CJS_Return Field::set_border_style(CJS_Runtime* pRuntime,
-                                   v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_border_style(CJS_Runtime* pRuntime,
+                                       v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
 
   if (!m_bCanSet)
@@ -456,16 +455,16 @@
   if (m_bDelay) {
     AddDelay_String(FP_BORDERSTYLE, byte_str);
   } else {
-    Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, byte_str);
+    CJS_Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName,
+                              m_nFormControlIndex, byte_str);
   }
   return CJS_Return(true);
 }
 
-void Field::SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                           const WideString& swFieldName,
-                           int nControlIndex,
-                           const ByteString& string) {
+void CJS_Field::SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                               const WideString& swFieldName,
+                               int nControlIndex,
+                               const ByteString& string) {
   ASSERT(pFormFillEnv);
 
   BorderStyle nBorderStyle = BorderStyle::SOLID;
@@ -514,7 +513,7 @@
   }
 }
 
-CJS_Return Field::get_button_align_x(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_button_align_x(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -538,13 +537,13 @@
   return CJS_Return(pRuntime->NewNumber(static_cast<int32_t>(fLeft)));
 }
 
-CJS_Return Field::set_button_align_x(CJS_Runtime* pRuntime,
-                                     v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_button_align_x(CJS_Runtime* pRuntime,
+                                         v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_button_align_y(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_button_align_y(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -568,13 +567,13 @@
   return CJS_Return(pRuntime->NewNumber(static_cast<int32_t>(fBottom)));
 }
 
-CJS_Return Field::set_button_align_y(CJS_Runtime* pRuntime,
-                                     v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_button_align_y(CJS_Runtime* pRuntime,
+                                         v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_button_fit_bounds(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_button_fit_bounds(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -593,13 +592,13 @@
       pRuntime->NewBoolean(pFormControl->GetIconFit().GetFittingBounds()));
 }
 
-CJS_Return Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
-                                        v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
+                                            v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_button_position(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_button_position(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -617,13 +616,13 @@
   return CJS_Return(pRuntime->NewNumber(pFormControl->GetTextPosition()));
 }
 
-CJS_Return Field::set_button_position(CJS_Runtime* pRuntime,
-                                      v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_button_position(CJS_Runtime* pRuntime,
+                                          v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_button_scale_how(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_button_scale_how(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -642,13 +641,13 @@
       pFormControl->GetIconFit().IsProportionalScale() ? 0 : 1));
 }
 
-CJS_Return Field::set_button_scale_how(CJS_Runtime* pRuntime,
-                                       v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_button_scale_how(CJS_Runtime* pRuntime,
+                                           v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_button_scale_when(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_button_scale_when(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -682,13 +681,13 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::set_button_scale_when(CJS_Runtime* pRuntime,
-                                        v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_button_scale_when(CJS_Runtime* pRuntime,
+                                            v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_calc_order_index(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_calc_order_index(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -707,13 +706,13 @@
       pInterForm->FindFieldInCalculationOrder(pFormField))));
 }
 
-CJS_Return Field::set_calc_order_index(CJS_Runtime* pRuntime,
-                                       v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_calc_order_index(CJS_Runtime* pRuntime,
+                                           v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_char_limit(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_char_limit(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -727,13 +726,13 @@
       pRuntime->NewNumber(static_cast<int32_t>(pFormField->GetMaxLen())));
 }
 
-CJS_Return Field::set_char_limit(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_char_limit(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_comb(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_comb(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -748,12 +747,12 @@
       pRuntime->NewBoolean(!!(pFormField->GetFieldFlags() & FIELDFLAG_COMB)));
 }
 
-CJS_Return Field::set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_comb(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_commit_on_sel_change(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_commit_on_sel_change(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -770,13 +769,13 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)));
 }
 
-CJS_Return Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
-                                           v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
+                                               v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_current_value_indices(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_current_value_indices(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -803,8 +802,8 @@
   return CJS_Return(SelArray);
 }
 
-CJS_Return Field::set_current_value_indices(CJS_Runtime* pRuntime,
-                                            v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_current_value_indices(CJS_Runtime* pRuntime,
+                                                v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
 
@@ -822,16 +821,17 @@
   if (m_bDelay) {
     AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
   } else {
-    Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
-                                  m_nFormControlIndex, array);
+    CJS_Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
+                                      m_nFormControlIndex, array);
   }
   return CJS_Return(true);
 }
 
-void Field::SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                   const WideString& swFieldName,
-                                   int nControlIndex,
-                                   const std::vector<uint32_t>& array) {
+void CJS_Field::SetCurrentValueIndices(
+    CPDFSDK_FormFillEnvironment* pFormFillEnv,
+    const WideString& swFieldName,
+    int nControlIndex,
+    const std::vector<uint32_t>& array) {
   ASSERT(pFormFillEnv);
   std::vector<CPDF_FormField*> FieldArray =
       GetFormFields(pFormFillEnv, swFieldName);
@@ -855,16 +855,16 @@
   }
 }
 
-CJS_Return Field::get_default_style(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_default_style(CJS_Runtime* pRuntime) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::set_default_style(CJS_Runtime* pRuntime,
-                                    v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_default_style(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::get_default_value(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_default_value(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -880,13 +880,13 @@
   return CJS_Return(pRuntime->NewString(pFormField->GetDefaultValue().c_str()));
 }
 
-CJS_Return Field::set_default_value(CJS_Runtime* pRuntime,
-                                    v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_default_value(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_do_not_scroll(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_do_not_scroll(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -901,13 +901,13 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)));
 }
 
-CJS_Return Field::set_do_not_scroll(CJS_Runtime* pRuntime,
-                                    v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_do_not_scroll(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_do_not_spell_check(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_do_not_spell_check(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -924,13 +924,13 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)));
 }
 
-CJS_Return Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
-                                         v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
+                                             v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-void Field::SetDelay(bool bDelay) {
+void CJS_Field::SetDelay(bool bDelay) {
   m_bDelay = bDelay;
 
   if (m_bDelay)
@@ -939,11 +939,12 @@
     m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
 }
 
-CJS_Return Field::get_delay(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_delay(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewBoolean(m_bDelay));
 }
 
-CJS_Return Field::set_delay(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_delay(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
 
@@ -951,7 +952,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_display(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_display(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -977,23 +978,24 @@
   return CJS_Return(pRuntime->NewNumber(2));
 }
 
-CJS_Return Field::set_display(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_display(CJS_Runtime* pRuntime,
+                                  v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
 
   if (m_bDelay) {
     AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp));
   } else {
-    Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                      pRuntime->ToInt32(vp));
+    CJS_Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, pRuntime->ToInt32(vp));
   }
   return CJS_Return(true);
 }
 
-void Field::SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                       const WideString& swFieldName,
-                       int nControlIndex,
-                       int number) {
+void CJS_Field::SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                           const WideString& swFieldName,
+                           int nControlIndex,
+                           int number) {
   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray =
       GetFormFields(pFormFillEnv, swFieldName);
@@ -1026,15 +1028,15 @@
   }
 }
 
-CJS_Return Field::get_doc(CJS_Runtime* pRuntime) {
-  return CJS_Return(m_pJSDoc->GetCJSDoc()->ToV8Object());
+CJS_Return CJS_Field::get_doc(CJS_Runtime* pRuntime) {
+  return CJS_Return(m_pJSDoc->ToV8Object());
 }
 
-CJS_Return Field::set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_doc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::get_editable(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_editable(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1047,11 +1049,12 @@
       pRuntime->NewBoolean(!!(pFormField->GetFieldFlags() & FIELDFLAG_EDIT)));
 }
 
-CJS_Return Field::set_editable(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_editable(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_export_values(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_export_values(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1086,8 +1089,8 @@
   return CJS_Return(ExportValuesArray);
 }
 
-CJS_Return Field::set_export_values(CJS_Runtime* pRuntime,
-                                    v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_export_values(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> vp) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1101,7 +1104,7 @@
   return CJS_Return(m_bCanSet && !vp.IsEmpty() && vp->IsArray());
 }
 
-CJS_Return Field::get_file_select(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_file_select(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1114,8 +1117,8 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT)));
 }
 
-CJS_Return Field::set_file_select(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_file_select(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1126,7 +1129,7 @@
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_fill_color(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_fill_color(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1161,14 +1164,15 @@
     return CJS_Return(false);
   }
 
-  v8::Local<v8::Value> array = color::ConvertPWLColorToArray(pRuntime, color);
+  v8::Local<v8::Value> array =
+      CJS_Color::ConvertPWLColorToArray(pRuntime, color);
   if (array.IsEmpty())
     return CJS_Return(pRuntime->NewArray());
   return CJS_Return(array);
 }
 
-CJS_Return Field::set_fill_color(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_fill_color(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1179,7 +1183,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_hidden(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_hidden(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1198,28 +1202,29 @@
                                          ANNOTFLAG_HIDDEN & dwFlags));
 }
 
-CJS_Return Field::set_hidden(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_hidden(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
 
   if (m_bDelay) {
     AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp));
   } else {
-    Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                     pRuntime->ToBoolean(vp));
+    CJS_Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                         pRuntime->ToBoolean(vp));
   }
   return CJS_Return(true);
 }
 
-void Field::SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                      const WideString& swFieldName,
-                      int nControlIndex,
-                      bool b) {
+void CJS_Field::SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                          const WideString& swFieldName,
+                          int nControlIndex,
+                          bool b) {
   int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
   SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
 }
 
-CJS_Return Field::get_highlight(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_highlight(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1250,13 +1255,13 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::set_highlight(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_highlight(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_line_width(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_line_width(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1279,24 +1284,24 @@
   return CJS_Return(pRuntime->NewNumber(pWidget->GetBorderWidth()));
 }
 
-CJS_Return Field::set_line_width(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_line_width(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
 
   if (m_bDelay) {
     AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp));
   } else {
-    Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                        pRuntime->ToInt32(vp));
+    CJS_Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName,
+                            m_nFormControlIndex, pRuntime->ToInt32(vp));
   }
   return CJS_Return(true);
 }
 
-void Field::SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                         const WideString& swFieldName,
-                         int nControlIndex,
-                         int number) {
+void CJS_Field::SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                             const WideString& swFieldName,
+                             int nControlIndex,
+                             int number) {
   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray =
       GetFormFields(pFormFillEnv, swFieldName);
@@ -1332,7 +1337,7 @@
   }
 }
 
-CJS_Return Field::get_multiline(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_multiline(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1347,13 +1352,13 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)));
 }
 
-CJS_Return Field::set_multiline(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_multiline(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_multiple_selection(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_multiple_selection(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1367,13 +1372,13 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT)));
 }
 
-CJS_Return Field::set_multiple_selection(CJS_Runtime* pRuntime,
-                                         v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_multiple_selection(CJS_Runtime* pRuntime,
+                                             v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_name(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1381,11 +1386,11 @@
   return CJS_Return(pRuntime->NewString(m_FieldName.c_str()));
 }
 
-CJS_Return Field::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::get_num_items(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_num_items(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1399,12 +1404,12 @@
   return CJS_Return(pRuntime->NewNumber(pFormField->CountOptions()));
 }
 
-CJS_Return Field::set_num_items(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_num_items(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::get_page(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_page(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1437,11 +1442,11 @@
   return CJS_Return(PageArray);
 }
 
-CJS_Return Field::set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_page(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(JSGetStringFromID(JSMessage::kReadOnlyError));
 }
 
-CJS_Return Field::get_password(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_password(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1456,12 +1461,13 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD)));
 }
 
-CJS_Return Field::set_password(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_password(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_print(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_print(CJS_Runtime* pRuntime) {
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1477,7 +1483,8 @@
       pRuntime->NewBoolean(!!(pWidget->GetFlags() & ANNOTFLAG_PRINT)));
 }
 
-CJS_Return Field::set_print(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_print(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1535,7 +1542,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_radios_in_unison(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_radios_in_unison(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1548,15 +1555,15 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)));
 }
 
-CJS_Return Field::set_radios_in_unison(CJS_Runtime* pRuntime,
-                                       v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_radios_in_unison(CJS_Runtime* pRuntime,
+                                           v8::Local<v8::Value> vp) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_readonly(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_readonly(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1565,14 +1572,15 @@
       !!(FieldArray[0]->GetFieldFlags() & FIELDFLAG_READONLY)));
 }
 
-CJS_Return Field::set_readonly(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_readonly(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_rect(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_rect(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1598,7 +1606,7 @@
   return CJS_Return(rcArray);
 }
 
-CJS_Return Field::set_rect(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_rect(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
   if (vp.IsEmpty() || !vp->IsArray())
@@ -1622,16 +1630,16 @@
   if (m_bDelay) {
     AddDelay_Rect(FP_RECT, crRect);
   } else {
-    Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                   crRect);
+    CJS_Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                       crRect);
   }
   return CJS_Return(true);
 }
 
-void Field::SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                    const WideString& swFieldName,
-                    int nControlIndex,
-                    const CFX_FloatRect& rect) {
+void CJS_Field::SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                        const WideString& swFieldName,
+                        int nControlIndex,
+                        const CFX_FloatRect& rect) {
   CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray =
       GetFormFields(pFormFillEnv, swFieldName);
@@ -1688,7 +1696,7 @@
   }
 }
 
-CJS_Return Field::get_required(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_required(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1701,14 +1709,15 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED)));
 }
 
-CJS_Return Field::set_required(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_required(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_rich_text(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_rich_text(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1723,22 +1732,22 @@
       !!(pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT)));
 }
 
-CJS_Return Field::set_rich_text(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_rich_text(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_rich_value(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_rich_value(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::set_rich_value(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_rich_value(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_rotation(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_rotation(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1753,12 +1762,13 @@
   return CJS_Return(pRuntime->NewNumber(pFormControl->GetRotation()));
 }
 
-CJS_Return Field::set_rotation(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_rotation(CJS_Runtime* pRuntime,
+                                   v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_stroke_color(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_stroke_color(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1790,14 +1800,15 @@
     return CJS_Return(false);
   }
 
-  v8::Local<v8::Value> array = color::ConvertPWLColorToArray(pRuntime, color);
+  v8::Local<v8::Value> array =
+      CJS_Color::ConvertPWLColorToArray(pRuntime, color);
   if (array.IsEmpty())
     return CJS_Return(pRuntime->NewArray());
   return CJS_Return(array);
 }
 
-CJS_Return Field::set_stroke_color(CJS_Runtime* pRuntime,
-                                   v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_stroke_color(CJS_Runtime* pRuntime,
+                                       v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
   if (vp.IsEmpty() || !vp->IsArray())
@@ -1805,7 +1816,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_style(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_style(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1849,21 +1860,22 @@
       pRuntime->NewString(WideString::FromLocal(csBCaption.c_str()).c_str()));
 }
 
-CJS_Return Field::set_style(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_style(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_submit_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_submit_name(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::set_submit_name(CJS_Runtime* pRuntime,
-                                  v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_submit_name(CJS_Runtime* pRuntime,
+                                      v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_text_color(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_text_color(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1890,14 +1902,15 @@
   if (iColorType == CFX_Color::kTransparent)
     crRet = CFX_Color(CFX_Color::kTransparent);
 
-  v8::Local<v8::Value> array = color::ConvertPWLColorToArray(pRuntime, crRet);
+  v8::Local<v8::Value> array =
+      CJS_Color::ConvertPWLColorToArray(pRuntime, crRet);
   if (array.IsEmpty())
     return CJS_Return(pRuntime->NewArray());
   return CJS_Return(array);
 }
 
-CJS_Return Field::set_text_color(CJS_Runtime* pRuntime,
-                                 v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_text_color(CJS_Runtime* pRuntime,
+                                     v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
   if (vp.IsEmpty() || !vp->IsArray())
@@ -1905,7 +1918,7 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::get_text_font(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_text_font(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1934,8 +1947,8 @@
       WideString::FromLocal(pFont->GetBaseFont().c_str()).c_str()));
 }
 
-CJS_Return Field::set_text_font(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_text_font(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
 
   if (!m_bCanSet)
@@ -1944,7 +1957,7 @@
       !ByteString::FromUnicode(pRuntime->ToWideString(vp)).IsEmpty());
 }
 
-CJS_Return Field::get_text_size(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_text_size(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1963,13 +1976,13 @@
   return CJS_Return(pRuntime->NewNumber(static_cast<int>(fFontSize)));
 }
 
-CJS_Return Field::set_text_size(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_text_size(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_type(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_type(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -1997,11 +2010,11 @@
   }
 }
 
-CJS_Return Field::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::get_user_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_user_name(CJS_Runtime* pRuntime) {
   ASSERT(m_pFormFillEnv);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -2012,13 +2025,13 @@
       pRuntime->NewString(FieldArray[0]->GetAlternateName().c_str()));
 }
 
-CJS_Return Field::set_user_name(CJS_Runtime* pRuntime,
-                                v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_user_name(CJS_Runtime* pRuntime,
+                                    v8::Local<v8::Value> vp) {
   ASSERT(m_pFormFillEnv);
   return CJS_Return(m_bCanSet);
 }
 
-CJS_Return Field::get_value(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_value(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -2077,7 +2090,8 @@
   return CJS_Return(pRuntime->MaybeCoerceToNumber(ret));
 }
 
-CJS_Return Field::set_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_value(CJS_Runtime* pRuntime,
+                                v8::Local<v8::Value> vp) {
   if (!m_bCanSet)
     return CJS_Return(false);
 
@@ -2095,16 +2109,16 @@
   if (m_bDelay) {
     AddDelay_WideStringArray(FP_VALUE, strArray);
   } else {
-    Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                    strArray);
+    CJS_Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        strArray);
   }
   return CJS_Return(true);
 }
 
-void Field::SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                     const WideString& swFieldName,
-                     int nControlIndex,
-                     const std::vector<WideString>& strArray) {
+void CJS_Field::SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                         const WideString& swFieldName,
+                         int nControlIndex,
+                         const std::vector<WideString>& strArray) {
   ASSERT(pFormFillEnv);
   if (strArray.empty())
     return;
@@ -2156,7 +2170,7 @@
   }
 }
 
-CJS_Return Field::get_value_as_string(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_value_as_string(CJS_Runtime* pRuntime) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -2190,12 +2204,12 @@
   return CJS_Return(pRuntime->NewString(pFormField->GetValue().c_str()));
 }
 
-CJS_Return Field::set_value_as_string(CJS_Runtime* pRuntime,
-                                      v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_value_as_string(CJS_Runtime* pRuntime,
+                                          v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::browseForFileToSubmit(
+CJS_Return CJS_Field::browseForFileToSubmit(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -2215,7 +2229,7 @@
   return CJS_Return(false);
 }
 
-CJS_Return Field::buttonGetCaption(
+CJS_Return CJS_Field::buttonGetCaption(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   int nface = 0;
@@ -2248,7 +2262,7 @@
   return CJS_Return(false);
 }
 
-CJS_Return Field::buttonGetIcon(
+CJS_Return CJS_Field::buttonGetIcon(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() >= 1) {
@@ -2280,25 +2294,25 @@
   return CJS_Return(pJS_Icon->ToV8Object());
 }
 
-CJS_Return Field::buttonImportIcon(
+CJS_Return CJS_Field::buttonImportIcon(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::buttonSetCaption(
+CJS_Return CJS_Field::buttonSetCaption(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::buttonSetIcon(
+CJS_Return CJS_Field::buttonSetIcon(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::checkThisBox(
+CJS_Return CJS_Field::checkThisBox(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   int iSize = params.size();
@@ -2333,12 +2347,13 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::clearItems(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::clearItems(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::defaultIsChecked(
+CJS_Return CJS_Field::defaultIsChecked(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (!m_bCanSet)
@@ -2362,14 +2377,15 @@
       pFormField->GetFieldType() == FormFieldType::kRadioButton));
 }
 
-CJS_Return Field::deleteItemAt(
+CJS_Return CJS_Field::deleteItemAt(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::getArray(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::getArray(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -2394,8 +2410,7 @@
 
     CJS_Field* pJSField =
         static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pObj));
-    Field* pField = static_cast<Field*>(pJSField->GetEmbedObject());
-    pField->AttachField(m_pJSDoc, *pStr);
+    pJSField->AttachField(m_pJSDoc, *pStr);
     pRuntime->PutArrayElement(FormFieldArray, j++,
                               pJSField
                                   ? v8::Local<v8::Value>(pJSField->ToV8Object())
@@ -2404,8 +2419,9 @@
   return CJS_Return(FormFieldArray);
 }
 
-CJS_Return Field::getItemAt(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::getItemAt(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   int iSize = params.size();
   int nIdx = -1;
   if (iSize >= 1)
@@ -2438,18 +2454,18 @@
   return CJS_Return(false);
 }
 
-CJS_Return Field::getLock(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::getLock(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::insertItemAt(
+CJS_Return CJS_Field::insertItemAt(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::isBoxChecked(
+CJS_Return CJS_Field::isBoxChecked(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   int nIndex = -1;
@@ -2470,7 +2486,7 @@
        pFormField->GetControl(nIndex)->IsChecked() != 0)));
 }
 
-CJS_Return Field::isDefaultChecked(
+CJS_Return CJS_Field::isDefaultChecked(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   int nIndex = -1;
@@ -2491,13 +2507,15 @@
        pFormField->GetControl(nIndex)->IsDefaultChecked() != 0)));
 }
 
-CJS_Return Field::setAction(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::setAction(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::setFocus(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::setFocus(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return CJS_Return(false);
@@ -2539,135 +2557,137 @@
   return CJS_Return(true);
 }
 
-CJS_Return Field::setItems(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::setItems(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::setLock(CJS_Runtime* pRuntime,
-                          const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Field::setLock(CJS_Runtime* pRuntime,
+                              const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::signatureGetModifications(
+CJS_Return CJS_Field::signatureGetModifications(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::signatureGetSeedValue(
+CJS_Return CJS_Field::signatureGetSeedValue(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::signatureInfo(
+CJS_Return CJS_Field::signatureInfo(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::signatureSetSeedValue(
+CJS_Return CJS_Field::signatureSetSeedValue(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::signatureSign(
+CJS_Return CJS_Field::signatureSign(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::signatureValidate(
+CJS_Return CJS_Field::signatureValidate(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   return CJS_Return(false);
 }
 
-CJS_Return Field::get_source(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Field::get_source(CJS_Runtime* pRuntime) {
   return CJS_Return(true);
 }
 
-CJS_Return Field::set_source(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Field::set_source(CJS_Runtime* pRuntime,
+                                 v8::Local<v8::Value> vp) {
   return CJS_Return(true);
 }
 
-void Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
+void CJS_Field::AddDelay_Int(FIELD_PROP prop, int32_t n) {
   auto pNewData =
       pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
   pNewData->num = n;
   m_pJSDoc->AddDelayData(std::move(pNewData));
 }
 
-void Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
+void CJS_Field::AddDelay_Bool(FIELD_PROP prop, bool b) {
   auto pNewData =
       pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
   pNewData->b = b;
   m_pJSDoc->AddDelayData(std::move(pNewData));
 }
 
-void Field::AddDelay_String(FIELD_PROP prop, const ByteString& string) {
+void CJS_Field::AddDelay_String(FIELD_PROP prop, const ByteString& string) {
   auto pNewData =
       pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
   pNewData->string = string;
   m_pJSDoc->AddDelayData(std::move(pNewData));
 }
 
-void Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
+void CJS_Field::AddDelay_Rect(FIELD_PROP prop, const CFX_FloatRect& rect) {
   auto pNewData =
       pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
   pNewData->rect = rect;
   m_pJSDoc->AddDelayData(std::move(pNewData));
 }
 
-void Field::AddDelay_WordArray(FIELD_PROP prop,
-                               const std::vector<uint32_t>& array) {
+void CJS_Field::AddDelay_WordArray(FIELD_PROP prop,
+                                   const std::vector<uint32_t>& array) {
   auto pNewData =
       pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
   pNewData->wordarray = array;
   m_pJSDoc->AddDelayData(std::move(pNewData));
 }
 
-void Field::AddDelay_WideStringArray(FIELD_PROP prop,
-                                     const std::vector<WideString>& array) {
+void CJS_Field::AddDelay_WideStringArray(FIELD_PROP prop,
+                                         const std::vector<WideString>& array) {
   auto pNewData =
       pdfium::MakeUnique<CJS_DelayData>(prop, m_nFormControlIndex, m_FieldName);
   pNewData->widestringarray = array;
   m_pJSDoc->AddDelayData(std::move(pNewData));
 }
 
-void Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                    CJS_DelayData* pData) {
+void CJS_Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                        CJS_DelayData* pData) {
   ASSERT(pFormFillEnv);
   switch (pData->eProp) {
     case FP_BORDERSTYLE:
-      Field::SetBorderStyle(pFormFillEnv, pData->sFieldName,
-                            pData->nControlIndex, pData->string);
+      CJS_Field::SetBorderStyle(pFormFillEnv, pData->sFieldName,
+                                pData->nControlIndex, pData->string);
       break;
     case FP_CURRENTVALUEINDICES:
-      Field::SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
-                                    pData->nControlIndex, pData->wordarray);
+      CJS_Field::SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
+                                        pData->nControlIndex, pData->wordarray);
       break;
     case FP_DISPLAY:
-      Field::SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
-                        pData->num);
+      CJS_Field::SetDisplay(pFormFillEnv, pData->sFieldName,
+                            pData->nControlIndex, pData->num);
       break;
     case FP_HIDDEN:
-      Field::SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
-                       pData->b);
+      CJS_Field::SetHidden(pFormFillEnv, pData->sFieldName,
+                           pData->nControlIndex, pData->b);
       break;
     case FP_LINEWIDTH:
-      Field::SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
-                          pData->num);
+      CJS_Field::SetLineWidth(pFormFillEnv, pData->sFieldName,
+                              pData->nControlIndex, pData->num);
       break;
     case FP_RECT:
-      Field::SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
-                     pData->rect);
+      CJS_Field::SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
+                         pData->rect);
       break;
     case FP_VALUE:
-      Field::SetValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
-                      pData->widestringarray);
+      CJS_Field::SetValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
+                          pData->widestringarray);
       break;
     default:
       NOTREACHED();
diff --git a/fxjs/cjs_field.h b/fxjs/cjs_field.h
index 7c470f5..51cc530 100644
--- a/fxjs/cjs_field.h
+++ b/fxjs/cjs_field.h
@@ -14,7 +14,7 @@
 
 class CPDF_FormControl;
 class CPDFSDK_Widget;
-class Document;
+class CJS_Document;
 struct CJS_DelayData;
 
 enum FIELD_PROP {
@@ -27,13 +27,159 @@
   FP_VALUE
 };
 
-class Field : public CJS_EmbedObj {
+class CJS_Field : public CJS_Object {
  public:
+  static int GetObjDefnID();
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
   static void DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       CJS_DelayData* pData);
 
-  explicit Field(CJS_Object* pJSObject);
-  ~Field() override;
+  explicit CJS_Field(v8::Local<v8::Object> pObject);
+  ~CJS_Field() override;
+
+  // CJS_Object
+  void InitInstance(IJS_Runtime* pIRuntime) override;
+
+  bool AttachField(CJS_Document* pDocument, const WideString& csFieldName);
+
+  JS_STATIC_PROP(alignment, alignment, CJS_Field);
+  JS_STATIC_PROP(borderStyle, border_style, CJS_Field);
+  JS_STATIC_PROP(buttonAlignX, button_align_x, CJS_Field);
+  JS_STATIC_PROP(buttonAlignY, button_align_y, CJS_Field);
+  JS_STATIC_PROP(buttonFitBounds, button_fit_bounds, CJS_Field);
+  JS_STATIC_PROP(buttonPosition, button_position, CJS_Field);
+  JS_STATIC_PROP(buttonScaleHow, button_scale_how, CJS_Field);
+  JS_STATIC_PROP(ButtonScaleWhen, button_scale_when, CJS_Field);
+  JS_STATIC_PROP(calcOrderIndex, calc_order_index, CJS_Field);
+  JS_STATIC_PROP(charLimit, char_limit, CJS_Field);
+  JS_STATIC_PROP(comb, comb, CJS_Field);
+  JS_STATIC_PROP(commitOnSelChange, commit_on_sel_change, CJS_Field);
+  JS_STATIC_PROP(currentValueIndices, current_value_indices, CJS_Field);
+  JS_STATIC_PROP(defaultStyle, default_style, CJS_Field);
+  JS_STATIC_PROP(defaultValue, default_value, CJS_Field);
+  JS_STATIC_PROP(doNotScroll, do_not_scroll, CJS_Field);
+  JS_STATIC_PROP(doNotSpellCheck, do_not_spell_check, CJS_Field);
+  JS_STATIC_PROP(delay, delay, CJS_Field);
+  JS_STATIC_PROP(display, display, CJS_Field);
+  JS_STATIC_PROP(doc, doc, CJS_Field);
+  JS_STATIC_PROP(editable, editable, CJS_Field);
+  JS_STATIC_PROP(exportValues, export_values, CJS_Field);
+  JS_STATIC_PROP(fileSelect, file_select, CJS_Field);
+  JS_STATIC_PROP(fillColor, fill_color, CJS_Field);
+  JS_STATIC_PROP(hidden, hidden, CJS_Field);
+  JS_STATIC_PROP(highlight, highlight, CJS_Field);
+  JS_STATIC_PROP(lineWidth, line_width, CJS_Field);
+  JS_STATIC_PROP(multiline, multiline, CJS_Field);
+  JS_STATIC_PROP(multipleSelection, multiple_selection, CJS_Field);
+  JS_STATIC_PROP(name, name, CJS_Field);
+  JS_STATIC_PROP(numItems, num_items, CJS_Field);
+  JS_STATIC_PROP(page, page, CJS_Field);
+  JS_STATIC_PROP(password, password, CJS_Field);
+  JS_STATIC_PROP(print, print, CJS_Field);
+  JS_STATIC_PROP(radiosInUnison, radios_in_unison, CJS_Field);
+  JS_STATIC_PROP(readonly, readonly, CJS_Field);
+  JS_STATIC_PROP(rect, rect, CJS_Field);
+  JS_STATIC_PROP(required, required, CJS_Field);
+  JS_STATIC_PROP(richText, rich_text, CJS_Field);
+  JS_STATIC_PROP(richValue, rich_value, CJS_Field);
+  JS_STATIC_PROP(rotation, rotation, CJS_Field);
+  JS_STATIC_PROP(strokeColor, stroke_color, CJS_Field);
+  JS_STATIC_PROP(style, style, CJS_Field);
+  JS_STATIC_PROP(submitName, submit_name, CJS_Field);
+  JS_STATIC_PROP(textColor, text_color, CJS_Field);
+  JS_STATIC_PROP(textFont, text_font, CJS_Field);
+  JS_STATIC_PROP(textSize, text_size, CJS_Field);
+  JS_STATIC_PROP(type, type, CJS_Field);
+  JS_STATIC_PROP(userName, user_name, CJS_Field);
+  JS_STATIC_PROP(value, value, CJS_Field);
+  JS_STATIC_PROP(valueAsString, value_as_string, CJS_Field);
+  JS_STATIC_PROP(source, source, CJS_Field);
+
+  JS_STATIC_METHOD(browseForFileToSubmit, CJS_Field);
+  JS_STATIC_METHOD(buttonGetCaption, CJS_Field);
+  JS_STATIC_METHOD(buttonGetIcon, CJS_Field);
+  JS_STATIC_METHOD(buttonImportIcon, CJS_Field);
+  JS_STATIC_METHOD(buttonSetCaption, CJS_Field);
+  JS_STATIC_METHOD(buttonSetIcon, CJS_Field);
+  JS_STATIC_METHOD(checkThisBox, CJS_Field);
+  JS_STATIC_METHOD(clearItems, CJS_Field);
+  JS_STATIC_METHOD(defaultIsChecked, CJS_Field);
+  JS_STATIC_METHOD(deleteItemAt, CJS_Field);
+  JS_STATIC_METHOD(getArray, CJS_Field);
+  JS_STATIC_METHOD(getItemAt, CJS_Field);
+  JS_STATIC_METHOD(getLock, CJS_Field);
+  JS_STATIC_METHOD(insertItemAt, CJS_Field);
+  JS_STATIC_METHOD(isBoxChecked, CJS_Field);
+  JS_STATIC_METHOD(isDefaultChecked, CJS_Field);
+  JS_STATIC_METHOD(setAction, CJS_Field);
+  JS_STATIC_METHOD(setFocus, CJS_Field);
+  JS_STATIC_METHOD(setItems, CJS_Field);
+  JS_STATIC_METHOD(setLock, CJS_Field);
+  JS_STATIC_METHOD(signatureGetModifications, CJS_Field);
+  JS_STATIC_METHOD(signatureGetSeedValue, CJS_Field);
+  JS_STATIC_METHOD(signatureInfo, CJS_Field);
+  JS_STATIC_METHOD(signatureSetSeedValue, CJS_Field);
+  JS_STATIC_METHOD(signatureSign, CJS_Field);
+  JS_STATIC_METHOD(signatureValidate, CJS_Field);
+
+  CJS_Return get_text_color(CJS_Runtime* pRuntime);
+  CJS_Return set_text_color(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
+
+ private:
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSPropertySpec PropertySpecs[];
+  static const JSMethodSpec MethodSpecs[];
+
+  static void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                             const WideString& swFieldName,
+                             int nControlIndex,
+                             const ByteString& string);
+  static void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                                     const WideString& swFieldName,
+                                     int nControlIndex,
+                                     const std::vector<uint32_t>& array);
+  static void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                         const WideString& swFieldName,
+                         int nControlIndex,
+                         int number);
+  static void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                        const WideString& swFieldName,
+                        int nControlIndex,
+                        bool b);
+  static void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                           const WideString& swFieldName,
+                           int nControlIndex,
+                           int number);
+  static void SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                           const WideString& swFieldName,
+                           int nControlIndex,
+                           bool b);
+  static void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                      const WideString& swFieldName,
+                      int nControlIndex,
+                      const CFX_FloatRect& rect);
+  static void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                       const WideString& swFieldName,
+                       int nControlIndex,
+                       const std::vector<WideString>& strArray);
+
+  static void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                              CPDF_FormField* pFormField,
+                              bool bChangeMark,
+                              bool bResetAP,
+                              bool bRefresh);
+  static void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                                CPDF_FormControl* pFormControl,
+                                bool bChangeMark,
+                                bool bResetAP,
+                                bool bRefresh);
+
+  static CPDFSDK_Widget* GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                                   CPDF_FormControl* pFormControl);
+  static std::vector<CPDF_FormField*> GetFormFields(
+      CPDFSDK_FormFillEnvironment* pFormFillEnv,
+      const WideString& csFieldName);
 
   CJS_Return get_alignment(CJS_Runtime* pRuntime);
   CJS_Return set_alignment(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
@@ -177,9 +323,6 @@
   CJS_Return get_submit_name(CJS_Runtime* pRuntime);
   CJS_Return set_submit_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
 
-  CJS_Return get_text_color(CJS_Runtime* pRuntime);
-  CJS_Return set_text_color(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
-
   CJS_Return get_text_font(CJS_Runtime* pRuntime);
   CJS_Return set_text_font(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
 
@@ -259,59 +402,6 @@
   CJS_Return signatureValidate(CJS_Runtime* pRuntime,
                                const std::vector<v8::Local<v8::Value>>& params);
 
-  bool AttachField(Document* pDocument, const WideString& csFieldName);
-
- private:
-  static void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                             const WideString& swFieldName,
-                             int nControlIndex,
-                             const ByteString& string);
-  static void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                     const WideString& swFieldName,
-                                     int nControlIndex,
-                                     const std::vector<uint32_t>& array);
-  static void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                         const WideString& swFieldName,
-                         int nControlIndex,
-                         int number);
-  static void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                        const WideString& swFieldName,
-                        int nControlIndex,
-                        bool b);
-  static void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                           const WideString& swFieldName,
-                           int nControlIndex,
-                           int number);
-  static void SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                           const WideString& swFieldName,
-                           int nControlIndex,
-                           bool b);
-  static void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                      const WideString& swFieldName,
-                      int nControlIndex,
-                      const CFX_FloatRect& rect);
-  static void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                       const WideString& swFieldName,
-                       int nControlIndex,
-                       const std::vector<WideString>& strArray);
-
-  static void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                              CPDF_FormField* pFormField,
-                              bool bChangeMark,
-                              bool bResetAP,
-                              bool bRefresh);
-  static void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                CPDF_FormControl* pFormControl,
-                                bool bChangeMark,
-                                bool bResetAP,
-                                bool bRefresh);
-
-  static CPDFSDK_Widget* GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                   CPDF_FormControl* pFormControl);
-  static std::vector<CPDF_FormField*> GetFormFields(
-      CPDFSDK_FormFillEnvironment* pFormFillEnv,
-      const WideString& csFieldName);
-
   void SetDelay(bool bDelay);
   void ParseFieldName(const std::wstring& strFieldNameParsed,
                       std::wstring& strFieldName,
@@ -331,7 +421,7 @@
 
   void DoDelay();
 
-  Document* m_pJSDoc;
+  CJS_Document* m_pJSDoc;
   CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
   WideString m_FieldName;
   int m_nFormControlIndex;
@@ -339,100 +429,4 @@
   bool m_bDelay;
 };
 
-class CJS_Field : public CJS_Object {
- public:
-  static int GetObjDefnID();
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Field(v8::Local<v8::Object> pObject);
-  ~CJS_Field() override = default;
-
-  void InitInstance(IJS_Runtime* pIRuntime) override;
-
-  JS_STATIC_PROP(alignment, alignment, Field);
-  JS_STATIC_PROP(borderStyle, border_style, Field);
-  JS_STATIC_PROP(buttonAlignX, button_align_x, Field);
-  JS_STATIC_PROP(buttonAlignY, button_align_y, Field);
-  JS_STATIC_PROP(buttonFitBounds, button_fit_bounds, Field);
-  JS_STATIC_PROP(buttonPosition, button_position, Field);
-  JS_STATIC_PROP(buttonScaleHow, button_scale_how, Field);
-  JS_STATIC_PROP(ButtonScaleWhen, button_scale_when, Field);
-  JS_STATIC_PROP(calcOrderIndex, calc_order_index, Field);
-  JS_STATIC_PROP(charLimit, char_limit, Field);
-  JS_STATIC_PROP(comb, comb, Field);
-  JS_STATIC_PROP(commitOnSelChange, commit_on_sel_change, Field);
-  JS_STATIC_PROP(currentValueIndices, current_value_indices, Field);
-  JS_STATIC_PROP(defaultStyle, default_style, Field);
-  JS_STATIC_PROP(defaultValue, default_value, Field);
-  JS_STATIC_PROP(doNotScroll, do_not_scroll, Field);
-  JS_STATIC_PROP(doNotSpellCheck, do_not_spell_check, Field);
-  JS_STATIC_PROP(delay, delay, Field);
-  JS_STATIC_PROP(display, display, Field);
-  JS_STATIC_PROP(doc, doc, Field);
-  JS_STATIC_PROP(editable, editable, Field);
-  JS_STATIC_PROP(exportValues, export_values, Field);
-  JS_STATIC_PROP(fileSelect, file_select, Field);
-  JS_STATIC_PROP(fillColor, fill_color, Field);
-  JS_STATIC_PROP(hidden, hidden, Field);
-  JS_STATIC_PROP(highlight, highlight, Field);
-  JS_STATIC_PROP(lineWidth, line_width, Field);
-  JS_STATIC_PROP(multiline, multiline, Field);
-  JS_STATIC_PROP(multipleSelection, multiple_selection, Field);
-  JS_STATIC_PROP(name, name, Field);
-  JS_STATIC_PROP(numItems, num_items, Field);
-  JS_STATIC_PROP(page, page, Field);
-  JS_STATIC_PROP(password, password, Field);
-  JS_STATIC_PROP(print, print, Field);
-  JS_STATIC_PROP(radiosInUnison, radios_in_unison, Field);
-  JS_STATIC_PROP(readonly, readonly, Field);
-  JS_STATIC_PROP(rect, rect, Field);
-  JS_STATIC_PROP(required, required, Field);
-  JS_STATIC_PROP(richText, rich_text, Field);
-  JS_STATIC_PROP(richValue, rich_value, Field);
-  JS_STATIC_PROP(rotation, rotation, Field);
-  JS_STATIC_PROP(strokeColor, stroke_color, Field);
-  JS_STATIC_PROP(style, style, Field);
-  JS_STATIC_PROP(submitName, submit_name, Field);
-  JS_STATIC_PROP(textColor, text_color, Field);
-  JS_STATIC_PROP(textFont, text_font, Field);
-  JS_STATIC_PROP(textSize, text_size, Field);
-  JS_STATIC_PROP(type, type, Field);
-  JS_STATIC_PROP(userName, user_name, Field);
-  JS_STATIC_PROP(value, value, Field);
-  JS_STATIC_PROP(valueAsString, value_as_string, Field);
-  JS_STATIC_PROP(source, source, Field);
-
-  JS_STATIC_METHOD(browseForFileToSubmit, Field);
-  JS_STATIC_METHOD(buttonGetCaption, Field);
-  JS_STATIC_METHOD(buttonGetIcon, Field);
-  JS_STATIC_METHOD(buttonImportIcon, Field);
-  JS_STATIC_METHOD(buttonSetCaption, Field);
-  JS_STATIC_METHOD(buttonSetIcon, Field);
-  JS_STATIC_METHOD(checkThisBox, Field);
-  JS_STATIC_METHOD(clearItems, Field);
-  JS_STATIC_METHOD(defaultIsChecked, Field);
-  JS_STATIC_METHOD(deleteItemAt, Field);
-  JS_STATIC_METHOD(getArray, Field);
-  JS_STATIC_METHOD(getItemAt, Field);
-  JS_STATIC_METHOD(getLock, Field);
-  JS_STATIC_METHOD(insertItemAt, Field);
-  JS_STATIC_METHOD(isBoxChecked, Field);
-  JS_STATIC_METHOD(isDefaultChecked, Field);
-  JS_STATIC_METHOD(setAction, Field);
-  JS_STATIC_METHOD(setFocus, Field);
-  JS_STATIC_METHOD(setItems, Field);
-  JS_STATIC_METHOD(setLock, Field);
-  JS_STATIC_METHOD(signatureGetModifications, Field);
-  JS_STATIC_METHOD(signatureGetSeedValue, Field);
-  JS_STATIC_METHOD(signatureInfo, Field);
-  JS_STATIC_METHOD(signatureSetSeedValue, Field);
-  JS_STATIC_METHOD(signatureSign, Field);
-  JS_STATIC_METHOD(signatureValidate, Field);
-
- private:
-  static int ObjDefnID;
-  static const JSPropertySpec PropertySpecs[];
-  static const JSMethodSpec MethodSpecs[];
-};
-
 #endif  // FXJS_CJS_FIELD_H_
diff --git a/fxjs/cjs_global.cpp b/fxjs/cjs_global.cpp
index 8816cf1..fbc6bf9 100644
--- a/fxjs/cjs_global.cpp
+++ b/fxjs/cjs_global.cpp
@@ -41,7 +41,7 @@
   if (!pJSObj)
     return;
 
-  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
+  Alt* pObj = static_cast<Alt*>(pJSObj);
   CJS_Return result =
       pObj->QueryProperty(PropFromV8Prop(info.GetIsolate(), property).c_str());
   info.GetReturnValue().Set(!result.HasError() ? 4 : 0);
@@ -60,7 +60,7 @@
   if (!pJSObj)
     return;
 
-  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
+  Alt* pObj = static_cast<Alt*>(pJSObj);
   CJS_Return result = pObj->GetProperty(
       pRuntime, PropFromV8Prop(info.GetIsolate(), property).c_str());
   if (result.HasError()) {
@@ -87,7 +87,7 @@
   if (!pJSObj)
     return;
 
-  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
+  Alt* pObj = static_cast<Alt*>(pJSObj);
   CJS_Return result = pObj->SetProperty(
       pRuntime, PropFromV8Prop(info.GetIsolate(), property).c_str(), value);
   if (result.HasError()) {
@@ -109,7 +109,7 @@
   if (!pJSObj)
     return;
 
-  Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
+  Alt* pObj = static_cast<Alt*>(pJSObj);
   CJS_Return result = pObj->DelProperty(
       pRuntime, PropFromV8Prop(info.GetIsolate(), property).c_str());
   if (result.HasError()) {
@@ -119,58 +119,20 @@
   }
 }
 
-struct JSGlobalData {
-  JSGlobalData();
-  ~JSGlobalData();
-
-  JS_GlobalDataType nType;
-  double dData;
-  bool bData;
-  ByteString sData;
-  v8::Global<v8::Object> pData;
-  bool bPersistent;
-  bool bDeleted;
-};
-
-class JSGlobalAlternate : public CJS_EmbedObj {
- public:
-  explicit JSGlobalAlternate(CJS_Object* pJSObject);
-  ~JSGlobalAlternate() override;
-
-  CJS_Return setPersistent(CJS_Runtime* pRuntime,
-                           const std::vector<v8::Local<v8::Value>>& params);
-  CJS_Return QueryProperty(const wchar_t* propname);
-  CJS_Return GetProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
-  CJS_Return SetProperty(CJS_Runtime* pRuntime,
-                         const wchar_t* propname,
-                         v8::Local<v8::Value> vp);
-  CJS_Return DelProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
-  void Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv);
-
- private:
-  void UpdateGlobalPersistentVariables();
-  void CommitGlobalPersisitentVariables(CJS_Runtime* pRuntime);
-  void DestroyGlobalPersisitentVariables();
-  CJS_Return SetGlobalVariables(const ByteString& propname,
-                                JS_GlobalDataType nType,
-                                double dData,
-                                bool bData,
-                                const ByteString& sData,
-                                v8::Local<v8::Object> pData,
-                                bool bDefaultPersistent);
-  void ObjectToArray(CJS_Runtime* pRuntime,
-                     v8::Local<v8::Object> pObj,
-                     CJS_GlobalVariableArray& array);
-  void PutObjectProperty(v8::Local<v8::Object> obj, CJS_KeyValue* pData);
-
-  std::map<ByteString, std::unique_ptr<JSGlobalData>> m_MapGlobal;
-  WideString m_sFilePath;
-  CJS_GlobalData* m_pGlobalData;
-  CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
-};
-
 }  // namespace
 
+CJS_Global::JSGlobalData::JSGlobalData()
+    : nType(JS_GlobalDataType::NUMBER),
+      dData(0),
+      bData(false),
+      sData(""),
+      bPersistent(false),
+      bDeleted(false) {}
+
+CJS_Global::JSGlobalData::~JSGlobalData() {
+  pData.Reset();
+}
+
 const JSMethodSpec CJS_Global::MethodSpecs[] = {
     {"setPersistent", setPersistent_static}};
 
@@ -179,22 +141,22 @@
 // static
 void CJS_Global::setPersistent_static(
     const v8::FunctionCallbackInfo<v8::Value>& info) {
-  JSMethod<JSGlobalAlternate, &JSGlobalAlternate::setPersistent>(
-      "setPersistent", "global", info);
+  JSMethod<CJS_Global, &CJS_Global::setPersistent>("setPersistent", "global",
+                                                   info);
 }
 
 // static
 void CJS_Global::queryprop_static(
     v8::Local<v8::String> property,
     const v8::PropertyCallbackInfo<v8::Integer>& info) {
-  JSSpecialPropQuery<JSGlobalAlternate>("global", property, info);
+  JSSpecialPropQuery<CJS_Global>("global", property, info);
 }
 
 // static
 void CJS_Global::getprop_static(
     v8::Local<v8::String> property,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  JSSpecialPropGet<JSGlobalAlternate>("global", property, info);
+  JSSpecialPropGet<CJS_Global>("global", property, info);
 }
 
 // static
@@ -202,14 +164,14 @@
     v8::Local<v8::String> property,
     v8::Local<v8::Value> value,
     const v8::PropertyCallbackInfo<v8::Value>& info) {
-  JSSpecialPropPut<JSGlobalAlternate>("global", property, value, info);
+  JSSpecialPropPut<CJS_Global>("global", property, value, info);
 }
 
 // static
 void CJS_Global::delprop_static(
     v8::Local<v8::String> property,
     const v8::PropertyCallbackInfo<v8::Boolean>& info) {
-  JSSpecialPropDel<JSGlobalAlternate>("global", property, info);
+  JSSpecialPropDel<CJS_Global>("global", property, info);
 }
 
 // static
@@ -227,49 +189,31 @@
   DefineAllProperties(pEngine);
 }
 
-CJS_Global::CJS_Global(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<JSGlobalAlternate>(this);
-}
+CJS_Global::CJS_Global(v8::Local<v8::Object> pObject)
+    : CJS_Object(pObject), m_pFormFillEnv(nullptr) {}
 
-void CJS_Global::InitInstance(IJS_Runtime* pIRuntime) {
-  CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime);
-  JSGlobalAlternate* pGlobal =
-      static_cast<JSGlobalAlternate*>(GetEmbedObject());
-  pGlobal->Initial(pRuntime->GetFormFillEnv());
-}
-
-JSGlobalData::JSGlobalData()
-    : nType(JS_GlobalDataType::NUMBER),
-      dData(0),
-      bData(false),
-      sData(""),
-      bPersistent(false),
-      bDeleted(false) {}
-
-JSGlobalData::~JSGlobalData() {
-  pData.Reset();
-}
-
-JSGlobalAlternate::JSGlobalAlternate(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject), m_pFormFillEnv(nullptr) {}
-
-JSGlobalAlternate::~JSGlobalAlternate() {
+CJS_Global::~CJS_Global() {
   DestroyGlobalPersisitentVariables();
   m_pGlobalData->Release();
 }
 
-void JSGlobalAlternate::Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
+void CJS_Global::InitInstance(IJS_Runtime* pIRuntime) {
+  CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>(pIRuntime);
+  Initial(pRuntime->GetFormFillEnv());
+}
+
+void CJS_Global::Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv) {
   m_pFormFillEnv.Reset(pFormFillEnv);
   m_pGlobalData = CJS_GlobalData::GetRetainedInstance(pFormFillEnv);
   UpdateGlobalPersistentVariables();
 }
 
-CJS_Return JSGlobalAlternate::QueryProperty(const wchar_t* propname) {
+CJS_Return CJS_Global::QueryProperty(const wchar_t* propname) {
   return CJS_Return(WideString(propname) != L"setPersistent");
 }
 
-CJS_Return JSGlobalAlternate::DelProperty(CJS_Runtime* pRuntime,
-                                          const wchar_t* propname) {
+CJS_Return CJS_Global::DelProperty(CJS_Runtime* pRuntime,
+                                   const wchar_t* propname) {
   auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
   if (it == m_MapGlobal.end())
     return CJS_Return(false);
@@ -278,8 +222,8 @@
   return CJS_Return(true);
 }
 
-CJS_Return JSGlobalAlternate::GetProperty(CJS_Runtime* pRuntime,
-                                          const wchar_t* propname) {
+CJS_Return CJS_Global::GetProperty(CJS_Runtime* pRuntime,
+                                   const wchar_t* propname) {
   auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
   if (it == m_MapGlobal.end())
     return CJS_Return(true);
@@ -307,9 +251,9 @@
   return CJS_Return(false);
 }
 
-CJS_Return JSGlobalAlternate::SetProperty(CJS_Runtime* pRuntime,
-                                          const wchar_t* propname,
-                                          v8::Local<v8::Value> vp) {
+CJS_Return CJS_Global::SetProperty(CJS_Runtime* pRuntime,
+                                   const wchar_t* propname,
+                                   v8::Local<v8::Value> vp) {
   ByteString sPropName = ByteString::FromUnicode(propname);
   if (vp->IsNumber()) {
     return SetGlobalVariables(sPropName, JS_GlobalDataType::NUMBER,
@@ -342,7 +286,7 @@
   return CJS_Return(false);
 }
 
-CJS_Return JSGlobalAlternate::setPersistent(
+CJS_Return CJS_Global::setPersistent(
     CJS_Runtime* pRuntime,
     const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() != 2)
@@ -357,10 +301,10 @@
   return CJS_Return(true);
 }
 
-void JSGlobalAlternate::UpdateGlobalPersistentVariables() {
+void CJS_Global::UpdateGlobalPersistentVariables() {
   CJS_Runtime* pRuntime =
       static_cast<CJS_Runtime*>(CFXJS_Engine::EngineFromIsolateCurrentContext(
-          m_pJSObject->ToV8Object()->GetIsolate()));
+          ToV8Object()->GetIsolate()));
 
   for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) {
     CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i);
@@ -369,8 +313,7 @@
         SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NUMBER,
                            pData->data.dData, false, "",
                            v8::Local<v8::Object>(), pData->bPersistent == 1);
-        pRuntime->PutObjectProperty(m_pJSObject->ToV8Object(),
-                                    pData->data.sKey.UTF8Decode(),
+        pRuntime->PutObjectProperty(ToV8Object(), pData->data.sKey.UTF8Decode(),
                                     pRuntime->NewNumber(pData->data.dData));
         break;
       case JS_GlobalDataType::BOOLEAN:
@@ -378,7 +321,7 @@
                            pData->data.bData == 1, "", v8::Local<v8::Object>(),
                            pData->bPersistent == 1);
         pRuntime->PutObjectProperty(
-            m_pJSObject->ToV8Object(), pData->data.sKey.UTF8Decode(),
+            ToV8Object(), pData->data.sKey.UTF8Decode(),
             pRuntime->NewBoolean(pData->data.bData == 1));
         break;
       case JS_GlobalDataType::STRING:
@@ -386,7 +329,7 @@
                            false, pData->data.sData, v8::Local<v8::Object>(),
                            pData->bPersistent == 1);
         pRuntime->PutObjectProperty(
-            m_pJSObject->ToV8Object(), pData->data.sKey.UTF8Decode(),
+            ToV8Object(), pData->data.sKey.UTF8Decode(),
             pRuntime->NewString(pData->data.sData.UTF8Decode().AsStringView()));
         break;
       case JS_GlobalDataType::OBJECT: {
@@ -395,7 +338,7 @@
           PutObjectProperty(pObj, &pData->data);
           SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0,
                              false, "", pObj, pData->bPersistent == 1);
-          pRuntime->PutObjectProperty(m_pJSObject->ToV8Object(),
+          pRuntime->PutObjectProperty(ToV8Object(),
                                       pData->data.sKey.UTF8Decode(), pObj);
         }
       } break;
@@ -403,16 +346,14 @@
         SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NULLOBJ, 0,
                            false, "", v8::Local<v8::Object>(),
                            pData->bPersistent == 1);
-        pRuntime->PutObjectProperty(m_pJSObject->ToV8Object(),
-                                    pData->data.sKey.UTF8Decode(),
+        pRuntime->PutObjectProperty(ToV8Object(), pData->data.sKey.UTF8Decode(),
                                     pRuntime->NewNull());
         break;
     }
   }
 }
 
-void JSGlobalAlternate::CommitGlobalPersisitentVariables(
-    CJS_Runtime* pRuntime) {
+void CJS_Global::CommitGlobalPersisitentVariables(CJS_Runtime* pRuntime) {
   for (const auto& iter : m_MapGlobal) {
     ByteString name = iter.first;
     JSGlobalData* pData = iter.second.get();
@@ -435,8 +376,8 @@
         break;
       case JS_GlobalDataType::OBJECT: {
         CJS_GlobalVariableArray array;
-        v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(
-            GetJSObject()->GetIsolate(), pData->pData);
+        v8::Local<v8::Object> obj =
+            v8::Local<v8::Object>::New(GetIsolate(), pData->pData);
         ObjectToArray(pRuntime, obj, array);
         m_pGlobalData->SetGlobalVariableObject(name, array);
         m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent);
@@ -449,9 +390,9 @@
   }
 }
 
-void JSGlobalAlternate::ObjectToArray(CJS_Runtime* pRuntime,
-                                      v8::Local<v8::Object> pObj,
-                                      CJS_GlobalVariableArray& array) {
+void CJS_Global::ObjectToArray(CJS_Runtime* pRuntime,
+                               v8::Local<v8::Object> pObj,
+                               CJS_GlobalVariableArray& array) {
   std::vector<WideString> pKeyList = pRuntime->GetObjectPropertyNames(pObj);
   for (const auto& ws : pKeyList) {
     ByteString sKey = ws.UTF8Encode();
@@ -498,10 +439,10 @@
   }
 }
 
-void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj,
-                                          CJS_KeyValue* pData) {
-  CJS_Runtime* pRuntime = CJS_Runtime::RuntimeFromIsolateCurrentContext(
-      m_pJSObject->ToV8Object()->GetIsolate());
+void CJS_Global::PutObjectProperty(v8::Local<v8::Object> pObj,
+                                   CJS_KeyValue* pData) {
+  CJS_Runtime* pRuntime =
+      CJS_Runtime::RuntimeFromIsolateCurrentContext(ToV8Object()->GetIsolate());
 
   for (int i = 0, sz = pData->objData.Count(); i < sz; i++) {
     CJS_KeyValue* pObjData = pData->objData.GetAt(i);
@@ -535,17 +476,17 @@
   }
 }
 
-void JSGlobalAlternate::DestroyGlobalPersisitentVariables() {
+void CJS_Global::DestroyGlobalPersisitentVariables() {
   m_MapGlobal.clear();
 }
 
-CJS_Return JSGlobalAlternate::SetGlobalVariables(const ByteString& propname,
-                                                 JS_GlobalDataType nType,
-                                                 double dData,
-                                                 bool bData,
-                                                 const ByteString& sData,
-                                                 v8::Local<v8::Object> pData,
-                                                 bool bDefaultPersistent) {
+CJS_Return CJS_Global::SetGlobalVariables(const ByteString& propname,
+                                          JS_GlobalDataType nType,
+                                          double dData,
+                                          bool bData,
+                                          const ByteString& sData,
+                                          v8::Local<v8::Object> pData,
+                                          bool bDefaultPersistent) {
   if (propname.IsEmpty())
     return CJS_Return(false);
 
diff --git a/fxjs/cjs_global.h b/fxjs/cjs_global.h
index 719f4b4..ab905bc 100644
--- a/fxjs/cjs_global.h
+++ b/fxjs/cjs_global.h
@@ -7,7 +7,14 @@
 #ifndef FXJS_CJS_GLOBAL_H_
 #define FXJS_CJS_GLOBAL_H_
 
+#include <map>
+#include <memory>
+#include <vector>
+
 #include "fxjs/JS_Define.h"
+#include "fxjs/cjs_keyvalue.h"
+
+class CJS_GlobalData;
 
 class CJS_Global : public CJS_Object {
  public:
@@ -29,14 +36,58 @@
       const v8::FunctionCallbackInfo<v8::Value>& info);
 
   explicit CJS_Global(v8::Local<v8::Object> pObject);
-  ~CJS_Global() override = default;
+  ~CJS_Global() override;
 
   // CJS_Object
   void InitInstance(IJS_Runtime* pIRuntime) override;
 
+  CJS_Return DelProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
+  void Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv);
+
+  CJS_Return setPersistent(CJS_Runtime* pRuntime,
+                           const std::vector<v8::Local<v8::Value>>& params);
+  CJS_Return QueryProperty(const wchar_t* propname);
+  CJS_Return GetProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
+  CJS_Return SetProperty(CJS_Runtime* pRuntime,
+                         const wchar_t* propname,
+                         v8::Local<v8::Value> vp);
+
  private:
+  struct JSGlobalData {
+    JSGlobalData();
+    ~JSGlobalData();
+
+    JS_GlobalDataType nType;
+    double dData;
+    bool bData;
+    ByteString sData;
+    v8::Global<v8::Object> pData;
+    bool bPersistent;
+    bool bDeleted;
+  };
+
   static int ObjDefnID;
   static const JSMethodSpec MethodSpecs[];
+
+  void UpdateGlobalPersistentVariables();
+  void CommitGlobalPersisitentVariables(CJS_Runtime* pRuntime);
+  void DestroyGlobalPersisitentVariables();
+  CJS_Return SetGlobalVariables(const ByteString& propname,
+                                JS_GlobalDataType nType,
+                                double dData,
+                                bool bData,
+                                const ByteString& sData,
+                                v8::Local<v8::Object> pData,
+                                bool bDefaultPersistent);
+  void ObjectToArray(CJS_Runtime* pRuntime,
+                     v8::Local<v8::Object> pObj,
+                     CJS_GlobalVariableArray& array);
+  void PutObjectProperty(v8::Local<v8::Object> obj, CJS_KeyValue* pData);
+
+  std::map<ByteString, std::unique_ptr<JSGlobalData>> m_MapGlobal;
+  WideString m_sFilePath;
+  CJS_GlobalData* m_pGlobalData;
+  CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
 };
 
 #endif  // FXJS_CJS_GLOBAL_H_
diff --git a/fxjs/cjs_icon.cpp b/fxjs/cjs_icon.cpp
index 69a6d45..40a2936 100644
--- a/fxjs/cjs_icon.cpp
+++ b/fxjs/cjs_icon.cpp
@@ -10,6 +10,7 @@
     {"name", get_name_static, set_name_static}};
 
 int CJS_Icon::ObjDefnID = -1;
+const char CJS_Icon::kName[] = "Icon";
 
 // static
 int CJS_Icon::GetObjDefnID() {
@@ -18,24 +19,20 @@
 
 // static
 void CJS_Icon::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("Icon", FXJSOBJTYPE_DYNAMIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Icon::kName, FXJSOBJTYPE_DYNAMIC,
                                  JSConstructor<CJS_Icon>, JSDestructor);
   DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs));
 }
 
-CJS_Icon::CJS_Icon(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<Icon>(this);
-}
+CJS_Icon::CJS_Icon(v8::Local<v8::Object> pObject)
+    : CJS_Object(pObject), m_swIconName(L"") {}
 
-Icon::Icon(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject), m_swIconName(L"") {}
+CJS_Icon::~CJS_Icon() = default;
 
-Icon::~Icon() = default;
-
-CJS_Return Icon::get_name(CJS_Runtime* pRuntime) {
+CJS_Return CJS_Icon::get_name(CJS_Runtime* pRuntime) {
   return CJS_Return(pRuntime->NewString(m_swIconName.c_str()));
 }
 
-CJS_Return Icon::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
+CJS_Return CJS_Icon::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) {
   return CJS_Return(false);
 }
diff --git a/fxjs/cjs_icon.h b/fxjs/cjs_icon.h
index 3ded32f..a346d69 100644
--- a/fxjs/cjs_icon.h
+++ b/fxjs/cjs_icon.h
@@ -9,34 +9,28 @@
 
 #include "fxjs/JS_Define.h"
 
-class Icon : public CJS_EmbedObj {
- public:
-  explicit Icon(CJS_Object* pJSObject);
-  ~Icon() override;
-
-  CJS_Return get_name(CJS_Runtime* pRuntime);
-  CJS_Return set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
-
-  WideString GetIconName() const { return m_swIconName; }
-  void SetIconName(WideString name) { m_swIconName = name; }
-
- private:
-  WideString m_swIconName;
-};
-
 class CJS_Icon : public CJS_Object {
  public:
   static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_Icon(v8::Local<v8::Object> pObject);
-  ~CJS_Icon() override = default;
+  ~CJS_Icon() override;
 
-  JS_STATIC_PROP(name, name, Icon);
+  WideString GetIconName() const { return m_swIconName; }
+  void SetIconName(WideString name) { m_swIconName = name; }
+
+  JS_STATIC_PROP(name, name, CJS_Icon);
 
  private:
   static int ObjDefnID;
+  static const char kName[];
   static const JSPropertySpec PropertySpecs[];
+
+  CJS_Return get_name(CJS_Runtime* pRuntime);
+  CJS_Return set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp);
+
+  WideString m_swIconName;
 };
 
 #endif  // FXJS_CJS_ICON_H_
diff --git a/fxjs/cjs_object.h b/fxjs/cjs_object.h
index 67389f5..22a5e16 100644
--- a/fxjs/cjs_object.h
+++ b/fxjs/cjs_object.h
@@ -11,7 +11,6 @@
 #include <utility>
 
 #include "fpdfsdk/fsdk_define.h"
-#include "fxjs/cjs_embedobj.h"
 #include "fxjs/cjs_runtime.h"
 #include "fxjs/fxjs_v8.h"
 
@@ -56,13 +55,9 @@
   virtual void InitInstance(IJS_Runtime* pIRuntime);
 
   v8::Local<v8::Object> ToV8Object() { return m_pV8Object.Get(m_pIsolate); }
-
-  CJS_EmbedObj* GetEmbedObject() const { return m_pEmbedObj.get(); }
-
   v8::Isolate* GetIsolate() const { return m_pIsolate; }
 
  protected:
-  std::unique_ptr<CJS_EmbedObj> m_pEmbedObj;
   v8::Global<v8::Object> m_pV8Object;
   v8::Isolate* m_pIsolate;
 };
diff --git a/fxjs/cjs_printparamsobj.cpp b/fxjs/cjs_printparamsobj.cpp
index 91d0220..b85925d 100644
--- a/fxjs/cjs_printparamsobj.cpp
+++ b/fxjs/cjs_printparamsobj.cpp
@@ -21,18 +21,6 @@
 }
 
 CJS_PrintParamsObj::CJS_PrintParamsObj(v8::Local<v8::Object> pObject)
-    : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<PrintParamsObj>(this);
-}
+    : CJS_Object(pObject) {}
 
-PrintParamsObj::PrintParamsObj(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject) {
-  bUI = true;
-  nStart = 0;
-  nEnd = 0;
-  bSilent = false;
-  bShrinkToFit = false;
-  bPrintAsImage = false;
-  bReverse = false;
-  bAnnotations = true;
-}
+CJS_PrintParamsObj::~CJS_PrintParamsObj() = default;
diff --git a/fxjs/cjs_printparamsobj.h b/fxjs/cjs_printparamsobj.h
index aa2b365..97028dd 100644
--- a/fxjs/cjs_printparamsobj.h
+++ b/fxjs/cjs_printparamsobj.h
@@ -9,32 +9,34 @@
 
 #include "fxjs/JS_Define.h"
 
-class PrintParamsObj : public CJS_EmbedObj {
- public:
-  explicit PrintParamsObj(CJS_Object* pJSObject);
-  ~PrintParamsObj() override {}
-
- public:
-  bool bUI;
-  int nStart;
-  int nEnd;
-  bool bSilent;
-  bool bShrinkToFit;
-  bool bPrintAsImage;
-  bool bReverse;
-  bool bAnnotations;
-};
-
 class CJS_PrintParamsObj : public CJS_Object {
  public:
   static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_PrintParamsObj(v8::Local<v8::Object> pObject);
-  ~CJS_PrintParamsObj() override = default;
+  ~CJS_PrintParamsObj() override;
+
+  bool GetUI() const { return bUI; }
+  int GetStart() const { return nStart; }
+  int GetEnd() const { return nEnd; }
+  bool GetSilent() const { return bSilent; }
+  bool GetShrinkToFit() const { return bShrinkToFit; }
+  bool GetPrintAsImage() const { return bPrintAsImage; }
+  bool GetReverse() const { return bReverse; }
+  bool GetAnnotations() const { return bAnnotations; }
 
  private:
   static int ObjDefnID;
+
+  bool bUI = true;
+  int nStart = 0;
+  int nEnd = 0;
+  bool bSilent = false;
+  bool bShrinkToFit = false;
+  bool bPrintAsImage = false;
+  bool bReverse = false;
+  bool bAnnotations = true;
 };
 
 #endif  // FXJS_CJS_PRINTPARAMSOBJ_H_
diff --git a/fxjs/cjs_publicmethods.cpp b/fxjs/cjs_publicmethods.cpp
index 9fcfc5f..30927be 100644
--- a/fxjs/cjs_publicmethods.cpp
+++ b/fxjs/cjs_publicmethods.cpp
@@ -936,7 +936,7 @@
       Value += L')';
     }
     if (iNegStyle == 1 || iNegStyle == 3) {
-      if (Field* fTarget = pEvent->Target_Field()) {
+      if (CJS_Field* fTarget = pEvent->Target_Field()) {
         v8::Local<v8::Array> arColor = pRuntime->NewArray();
         pRuntime->PutArrayElement(arColor, 0, pRuntime->NewString(L"RGB"));
         pRuntime->PutArrayElement(arColor, 1, pRuntime->NewNumber(1));
@@ -947,7 +947,7 @@
     }
   } else {
     if (iNegStyle == 1 || iNegStyle == 3) {
-      if (Field* fTarget = pEvent->Target_Field()) {
+      if (CJS_Field* fTarget = pEvent->Target_Field()) {
         v8::Local<v8::Array> arColor = pRuntime->NewArray();
         pRuntime->PutArrayElement(arColor, 0, pRuntime->NewString(L"RGB"));
         pRuntime->PutArrayElement(arColor, 1, pRuntime->NewNumber(0));
@@ -955,9 +955,10 @@
         pRuntime->PutArrayElement(arColor, 3, pRuntime->NewNumber(0));
 
         CJS_Return result = fTarget->get_text_color(pRuntime);
-        CFX_Color crProp = color::ConvertArrayToPWLColor(
+        CFX_Color crProp = CJS_Color::ConvertArrayToPWLColor(
             pRuntime, pRuntime->ToArray(result.Return()));
-        CFX_Color crColor = color::ConvertArrayToPWLColor(pRuntime, arColor);
+        CFX_Color crColor =
+            CJS_Color::ConvertArrayToPWLColor(pRuntime, arColor);
         if (crColor != crProp)
           fTarget->set_text_color(pRuntime, arColor);
       }
@@ -1374,7 +1375,7 @@
       wsFormat = L"99999-9999";
       break;
     case 2:
-      if (util::printx(L"9999999999", wsSource).GetLength() >= 10)
+      if (CJS_Util::printx(L"9999999999", wsSource).GetLength() >= 10)
         wsFormat = L"(999) 999-9999";
       else
         wsFormat = L"999-9999";
@@ -1384,7 +1385,7 @@
       break;
   }
 
-  pEvent->Value() = util::printx(wsFormat, wsSource);
+  pEvent->Value() = CJS_Util::printx(wsFormat, wsSource);
   return CJS_Return(true);
 }
 
diff --git a/fxjs/cjs_report.cpp b/fxjs/cjs_report.cpp
index a5e5441..2f5490c 100644
--- a/fxjs/cjs_report.cpp
+++ b/fxjs/cjs_report.cpp
@@ -16,30 +16,28 @@
     {"writeText", writeText_static}};
 
 int CJS_Report::ObjDefnID = -1;
+const char CJS_Report::kName[] = "Report";
 
 // static
 void CJS_Report::DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType) {
-  ObjDefnID = pEngine->DefineObj("Report", eObjType, JSConstructor<CJS_Report>,
-                                 JSDestructor);
+  ObjDefnID = pEngine->DefineObj(CJS_Report::kName, eObjType,
+                                 JSConstructor<CJS_Report>, JSDestructor);
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
-CJS_Report::CJS_Report(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<Report>(this);
-}
+CJS_Report::CJS_Report(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
 
-Report::Report(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
+CJS_Report::~CJS_Report() = default;
 
-Report::~Report() = default;
-
-CJS_Return Report::writeText(CJS_Runtime* pRuntime,
-                             const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Report::writeText(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
 
-CJS_Return Report::save(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Report::save(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   // Unsafe, not supported.
   return CJS_Return(true);
 }
diff --git a/fxjs/cjs_report.h b/fxjs/cjs_report.h
index 168df79..2a59206 100644
--- a/fxjs/cjs_report.h
+++ b/fxjs/cjs_report.h
@@ -11,31 +11,25 @@
 
 #include "fxjs/JS_Define.h"
 
-class Report : public CJS_EmbedObj {
- public:
-  explicit Report(CJS_Object* pJSObject);
-  ~Report() override;
-
- public:
-  CJS_Return save(CJS_Runtime* pRuntime,
-                  const std::vector<v8::Local<v8::Value>>& params);
-  CJS_Return writeText(CJS_Runtime* pRuntime,
-                       const std::vector<v8::Local<v8::Value>>& params);
-};
-
 class CJS_Report : public CJS_Object {
  public:
   static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
 
   explicit CJS_Report(v8::Local<v8::Object> pObject);
-  ~CJS_Report() override = default;
+  ~CJS_Report() override;
 
-  JS_STATIC_METHOD(save, Report)
-  JS_STATIC_METHOD(writeText, Report);
+  JS_STATIC_METHOD(save, CJS_Report);
+  JS_STATIC_METHOD(writeText, CJS_Report);
 
  private:
   static int ObjDefnID;
+  static const char kName[];
   static const JSMethodSpec MethodSpecs[];
+
+  CJS_Return save(CJS_Runtime* pRuntime,
+                  const std::vector<v8::Local<v8::Value>>& params);
+  CJS_Return writeText(CJS_Runtime* pRuntime,
+                       const std::vector<v8::Local<v8::Value>>& params);
 };
 
 #endif  // FXJS_CJS_REPORT_H_
diff --git a/fxjs/cjs_runtime.cpp b/fxjs/cjs_runtime.cpp
index 6622695..6da52ad 100644
--- a/fxjs/cjs_runtime.cpp
+++ b/fxjs/cjs_runtime.cpp
@@ -195,11 +195,7 @@
   if (!pJSDocument)
     return;
 
-  Document* pDocument = static_cast<Document*>(pJSDocument->GetEmbedObject());
-  if (!pDocument)
-    return;
-
-  pDocument->SetFormFillEnv(m_pFormFillEnv.Get());
+  pJSDocument->SetFormFillEnv(m_pFormFillEnv.Get());
 }
 
 CPDFSDK_FormFillEnvironment* CJS_Runtime::GetFormFillEnv() const {
diff --git a/fxjs/cjs_timerobj.cpp b/fxjs/cjs_timerobj.cpp
index 172ee5c..59d3842 100644
--- a/fxjs/cjs_timerobj.cpp
+++ b/fxjs/cjs_timerobj.cpp
@@ -22,15 +22,10 @@
 }
 
 CJS_TimerObj::CJS_TimerObj(v8::Local<v8::Object> pObject)
-    : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<TimerObj>(this);
-}
+    : CJS_Object(pObject), m_nTimerID(0) {}
 
-TimerObj::TimerObj(CJS_Object* pJSObject)
-    : CJS_EmbedObj(pJSObject), m_nTimerID(0) {}
+CJS_TimerObj::~CJS_TimerObj() = default;
 
-TimerObj::~TimerObj() = default;
-
-void TimerObj::SetTimer(GlobalTimer* pTimer) {
+void CJS_TimerObj::SetTimer(GlobalTimer* pTimer) {
   m_nTimerID = pTimer->GetTimerID();
 }
diff --git a/fxjs/cjs_timerobj.h b/fxjs/cjs_timerobj.h
index b4938c4..edc3def 100644
--- a/fxjs/cjs_timerobj.h
+++ b/fxjs/cjs_timerobj.h
@@ -11,28 +11,21 @@
 
 class GlobalTimer;
 
-class TimerObj : public CJS_EmbedObj {
- public:
-  explicit TimerObj(CJS_Object* pJSObject);
-  ~TimerObj() override;
-
-  void SetTimer(GlobalTimer* pTimer);
-  int GetTimerID() const { return m_nTimerID; }
-
- private:
-  int m_nTimerID;  // Weak reference to GlobalTimer through global map.
-};
-
 class CJS_TimerObj : public CJS_Object {
  public:
   static int GetObjDefnID();
   static void DefineJSObjects(CFXJS_Engine* pEngine);
 
   explicit CJS_TimerObj(v8::Local<v8::Object> pObject);
-  ~CJS_TimerObj() override = default;
+  ~CJS_TimerObj() override;
+
+  void SetTimer(GlobalTimer* pTimer);
+  int GetTimerID() const { return m_nTimerID; }
 
  private:
   static int ObjDefnID;
+
+  int m_nTimerID;  // Weak reference to GlobalTimer through global map.
 };
 
 #endif  // FXJS_CJS_TIMEROBJ_H_
diff --git a/fxjs/cjs_util.cpp b/fxjs/cjs_util.cpp
index db03dbd..fd064b3 100644
--- a/fxjs/cjs_util.cpp
+++ b/fxjs/cjs_util.cpp
@@ -65,24 +65,21 @@
     {"byteToChar", byteToChar_static}};
 
 int CJS_Util::ObjDefnID = -1;
+const char CJS_Util::kName[] = "util";
 
 // static
 void CJS_Util::DefineJSObjects(CFXJS_Engine* pEngine) {
-  ObjDefnID = pEngine->DefineObj("util", FXJSOBJTYPE_STATIC,
+  ObjDefnID = pEngine->DefineObj(CJS_Util::kName, FXJSOBJTYPE_STATIC,
                                  JSConstructor<CJS_Util>, JSDestructor);
   DefineMethods(pEngine, ObjDefnID, MethodSpecs, FX_ArraySize(MethodSpecs));
 }
 
-CJS_Util::CJS_Util(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {
-  m_pEmbedObj = pdfium::MakeUnique<util>(this);
-}
+CJS_Util::CJS_Util(v8::Local<v8::Object> pObject) : CJS_Object(pObject) {}
 
-util::util(CJS_Object* pJSObject) : CJS_EmbedObj(pJSObject) {}
+CJS_Util::~CJS_Util() = default;
 
-util::~util() = default;
-
-CJS_Return util::printf(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Util::printf(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   const size_t iSize = params.size();
   if (iSize < 1)
     return CJS_Return(false);
@@ -143,8 +140,8 @@
   return CJS_Return(pRuntime->NewString(c_strResult.c_str()));
 }
 
-CJS_Return util::printd(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Util::printd(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   const size_t iSize = params.size();
   if (iSize < 2)
     return CJS_Return(false);
@@ -253,8 +250,8 @@
   return CJS_Return(JSGetStringFromID(JSMessage::kTypeError));
 }
 
-CJS_Return util::printx(CJS_Runtime* pRuntime,
-                        const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Util::printx(CJS_Runtime* pRuntime,
+                            const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() < 2)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
@@ -274,8 +271,8 @@
   return input;
 }
 
-WideString util::printx(const WideString& wsFormat,
-                        const WideString& wsSource) {
+WideString CJS_Util::printx(const WideString& wsFormat,
+                            const WideString& wsSource) {
   WideString wsResult;
   size_t iSourceIdx = 0;
   size_t iFormatIdx = 0;
@@ -362,8 +359,8 @@
   return wsResult;
 }
 
-CJS_Return util::scand(CJS_Runtime* pRuntime,
-                       const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Util::scand(CJS_Runtime* pRuntime,
+                           const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() < 2)
     return CJS_Return(false);
 
@@ -378,8 +375,9 @@
   return CJS_Return(pRuntime->NewDate(dDate));
 }
 
-CJS_Return util::byteToChar(CJS_Runtime* pRuntime,
-                            const std::vector<v8::Local<v8::Value>>& params) {
+CJS_Return CJS_Util::byteToChar(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params) {
   if (params.size() < 1)
     return CJS_Return(JSGetStringFromID(JSMessage::kParamError));
 
@@ -395,7 +393,7 @@
 // directive which is safe to use with a single argument, and return the type
 // of argument expected, or -1 otherwise. If -1 is returned, it is NOT safe
 // to use sFormat with printf() and it must be copied byte-by-byte.
-int util::ParseDataType(std::wstring* sFormat) {
+int CJS_Util::ParseDataType(std::wstring* sFormat) {
   enum State { BEFORE, FLAGS, WIDTH, PRECISION, SPECIFIER, AFTER };
 
   int result = -1;
diff --git a/fxjs/cjs_util.h b/fxjs/cjs_util.h
index 1ed8405..0ad0fa1 100644
--- a/fxjs/cjs_util.h
+++ b/fxjs/cjs_util.h
@@ -17,10 +17,30 @@
 #define UTIL_DOUBLE 1
 #define UTIL_STRING 2
 
-class util : public CJS_EmbedObj {
+class CJS_Util : public CJS_Object {
  public:
-  explicit util(CJS_Object* pJSObject);
-  ~util() override;
+  static void DefineJSObjects(CFXJS_Engine* pEngine);
+
+  explicit CJS_Util(v8::Local<v8::Object> pObject);
+  ~CJS_Util() override;
+
+  static WideString printx(const WideString& cFormat,
+                           const WideString& cSource);
+
+  JS_STATIC_METHOD(printd, CJS_Util);
+  JS_STATIC_METHOD(printf, CJS_Util);
+  JS_STATIC_METHOD(printx, CJS_Util);
+  JS_STATIC_METHOD(scand, CJS_Util);
+  JS_STATIC_METHOD(byteToChar, CJS_Util);
+
+ private:
+  friend class CJS_Util_ParseDataType_Test;
+
+  static int ObjDefnID;
+  static const char kName[];
+  static const JSMethodSpec MethodSpecs[];
+
+  static int ParseDataType(std::wstring* sFormat);
 
   CJS_Return printd(CJS_Runtime* pRuntime,
                     const std::vector<v8::Local<v8::Value>>& params);
@@ -32,32 +52,6 @@
                    const std::vector<v8::Local<v8::Value>>& params);
   CJS_Return byteToChar(CJS_Runtime* pRuntime,
                         const std::vector<v8::Local<v8::Value>>& params);
-
-  static WideString printx(const WideString& cFormat,
-                           const WideString& cSource);
-
- private:
-  friend class CJS_Util_ParseDataType_Test;
-
-  static int ParseDataType(std::wstring* sFormat);
-};
-
-class CJS_Util : public CJS_Object {
- public:
-  static void DefineJSObjects(CFXJS_Engine* pEngine);
-
-  explicit CJS_Util(v8::Local<v8::Object> pObject);
-  ~CJS_Util() override = default;
-
-  JS_STATIC_METHOD(printd, util);
-  JS_STATIC_METHOD(printf, util);
-  JS_STATIC_METHOD(printx, util);
-  JS_STATIC_METHOD(scand, util);
-  JS_STATIC_METHOD(byteToChar, util);
-
- private:
-  static int ObjDefnID;
-  static const JSMethodSpec MethodSpecs[];
 };
 
 #endif  // FXJS_CJS_UTIL_H_
diff --git a/fxjs/cjs_util_unittest.cpp b/fxjs/cjs_util_unittest.cpp
index 6f43f0f..4e25ca1 100644
--- a/fxjs/cjs_util_unittest.cpp
+++ b/fxjs/cjs_util_unittest.cpp
@@ -107,7 +107,7 @@
 
   for (size_t i = 0; i < FX_ArraySize(cases); i++) {
     std::wstring input(cases[i].input_string);
-    EXPECT_EQ(cases[i].expected, util::ParseDataType(&input))
+    EXPECT_EQ(cases[i].expected, CJS_Util::ParseDataType(&input))
         << cases[i].input_string;
   }
 }
diff --git a/fxjs/global_timer.cpp b/fxjs/global_timer.cpp
index 6f7f09c..9c69ac2 100644
--- a/fxjs/global_timer.cpp
+++ b/fxjs/global_timer.cpp
@@ -6,7 +6,7 @@
 
 #include "fxjs/global_timer.h"
 
-GlobalTimer::GlobalTimer(app* pObj,
+GlobalTimer::GlobalTimer(CJS_App* pObj,
                          CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          CJS_Runtime* pRuntime,
                          int nType,
@@ -14,7 +14,7 @@
                          uint32_t dwElapse,
                          uint32_t dwTimeOut)
     : m_nTimerID(0),
-      m_pEmbedObj(pObj),
+      m_pEmbedApp(pObj),
       m_bProcessing(false),
       m_nType(nType),
       m_dwTimeOut(dwTimeOut),
@@ -48,8 +48,8 @@
     return;
 
   pTimer->m_bProcessing = true;
-  if (pTimer->m_pEmbedObj)
-    pTimer->m_pEmbedObj->TimerProc(pTimer);
+  if (pTimer->m_pEmbedApp)
+    pTimer->m_pEmbedApp->TimerProc(pTimer);
 
   // Timer proc may have destroyed timer, find it again.
   it = GetGlobalTimerMap()->find(nTimerID);
@@ -59,7 +59,7 @@
   pTimer = it->second;
   pTimer->m_bProcessing = false;
   if (pTimer->IsOneShot())
-    pTimer->m_pEmbedObj->CancelProc(pTimer);
+    pTimer->m_pEmbedApp->CancelProc(pTimer);
 }
 
 // static
@@ -69,7 +69,7 @@
     return;
 
   GlobalTimer* pTimer = it->second;
-  pTimer->m_pEmbedObj->CancelProc(pTimer);
+  pTimer->m_pEmbedApp->CancelProc(pTimer);
 }
 
 // static
diff --git a/fxjs/global_timer.h b/fxjs/global_timer.h
index ec8806b..63bda57 100644
--- a/fxjs/global_timer.h
+++ b/fxjs/global_timer.h
@@ -13,7 +13,7 @@
 
 class GlobalTimer {
  public:
-  GlobalTimer(app* pObj,
+  GlobalTimer(CJS_App* pObj,
               CPDFSDK_FormFillEnvironment* pFormFillEnv,
               CJS_Runtime* pRuntime,
               int nType,
@@ -36,7 +36,7 @@
   static TimerMap* GetGlobalTimerMap();
 
   uint32_t m_nTimerID;
-  app* const m_pEmbedObj;
+  CJS_App* const m_pEmbedApp;
   bool m_bProcessing;
 
   // data