Refactoring JS Callbacks.

This CL updates the fpdfsdk/javascript callbacks to have explicit
get/set methods instead of one method which worked differently
depending on the mode.

This allows better ownership of the passed in params, (get takes a *
and set takes a const&). The Value object was changed to have To*
and Set methods to make the code clearer compared to the operator<<
and operator>> overloading.

Bug:
Change-Id: Id6ff20a4e3252adfd0a78b643e50b9f095085018
Reviewed-on: https://pdfium-review.googlesource.com/16330
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
diff --git a/fpdfsdk/javascript/Annot.cpp b/fpdfsdk/javascript/Annot.cpp
index 9cc5d0f..0fb83e0 100644
--- a/fpdfsdk/javascript/Annot.cpp
+++ b/fpdfsdk/javascript/Annot.cpp
@@ -35,23 +35,25 @@
 
 Annot::~Annot() {}
 
-bool Annot::hidden(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (vp.IsGetting()) {
-    if (!m_pAnnot) {
-      sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
-      return false;
-    }
-    CPDF_Annot* pPDFAnnot = ToBAAnnot(m_pAnnot.Get())->GetPDFAnnot();
-    vp << CPDF_Annot::IsAnnotationHidden(pPDFAnnot->GetAnnotDict());
-    return true;
+bool Annot::get_hidden(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
+  if (!m_pAnnot) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
   }
 
-  bool bHidden;
-  vp >> bHidden;  // May invalidate m_pAnnot.
+  CPDF_Annot* pPDFAnnot = ToBAAnnot(m_pAnnot.Get())->GetPDFAnnot();
+  vp->Set(CPDF_Annot::IsAnnotationHidden(pPDFAnnot->GetAnnotDict()));
+  return true;
+}
+
+bool Annot::set_hidden(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  bool bHidden = vp.ToBool();  // May invalidate m_pAnnot.
   if (!m_pAnnot) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
 
@@ -68,23 +70,28 @@
     flags |= ANNOTFLAG_PRINT;
   }
   ToBAAnnot(m_pAnnot.Get())->SetFlags(flags);
+
   return true;
 }
 
-bool Annot::name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (vp.IsGetting()) {
-    if (!m_pAnnot) {
-      sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
-      return false;
-    }
-    vp << ToBAAnnot(m_pAnnot.Get())->GetAnnotName();
-    return true;
+bool Annot::get_name(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
+  if (!m_pAnnot) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
   }
 
-  WideString annotName;
-  vp >> annotName;  // May invalidate m_pAnnot.
+  vp->Set(ToBAAnnot(m_pAnnot.Get())->GetAnnotName());
+  return true;
+}
+
+bool Annot::set_name(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  WideString annotName = vp.ToWideString();  // May invalidate m_pAnnot.
   if (!m_pAnnot) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
 
@@ -92,20 +99,26 @@
   return true;
 }
 
-bool Annot::type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Annot::get_type(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   if (!m_pAnnot) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  vp << CPDF_Annot::AnnotSubtypeToString(
-      ToBAAnnot(m_pAnnot.Get())->GetAnnotSubtype());
+
+  vp->Set(CPDF_Annot::AnnotSubtypeToString(
+      ToBAAnnot(m_pAnnot.Get())->GetAnnotSubtype()));
   return true;
 }
 
+bool Annot::set_type(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
 void Annot::SetSDKAnnot(CPDFSDK_BAAnnot* annot) {
   m_pAnnot.Reset(annot);
 }
diff --git a/fpdfsdk/javascript/Annot.h b/fpdfsdk/javascript/Annot.h
index d70f96a..c5fb3f2 100644
--- a/fpdfsdk/javascript/Annot.h
+++ b/fpdfsdk/javascript/Annot.h
@@ -17,9 +17,20 @@
   explicit Annot(CJS_Object* pJSObject);
   ~Annot() override;
 
-  bool hidden(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
+  bool get_hidden(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_hidden(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_name(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_type(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_type(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
 
   void SetSDKAnnot(CPDFSDK_BAAnnot* annot);
 
@@ -33,9 +44,9 @@
   ~CJS_Annot() override {}
 
   DECLARE_JS_CLASS();
-  JS_STATIC_PROP(hidden, Annot);
-  JS_STATIC_PROP(name, Annot);
-  JS_STATIC_PROP(type, Annot);
+  JS_STATIC_PROP(hidden, hidden, Annot);
+  JS_STATIC_PROP(name, name, Annot);
+  JS_STATIC_PROP(type, type, Annot);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_ANNOT_H_
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index 5d0f35c..e7dee1c 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -66,16 +66,16 @@
 JSPropertySpec CJS_Document::PropertySpecs[] = {
     {"ADBE", get_ADBE_static, set_ADBE_static},
     {"author", get_author_static, set_author_static},
-    {"baseURL", get_baseURL_static, set_baseURL_static},
-    {"bookmarkRoot", get_bookmarkRoot_static, set_bookmarkRoot_static},
+    {"baseURL", get_base_URL_static, set_base_URL_static},
+    {"bookmarkRoot", get_bookmark_root_static, set_bookmark_root_static},
     {"calculate", get_calculate_static, set_calculate_static},
-    {"Collab", get_Collab_static, set_Collab_static},
-    {"creationDate", get_creationDate_static, set_creationDate_static},
+    {"Collab", get_collab_static, set_collab_static},
+    {"creationDate", get_creation_date_static, set_creation_date_static},
     {"creator", get_creator_static, set_creator_static},
     {"delay", get_delay_static, set_delay_static},
     {"dirty", get_dirty_static, set_dirty_static},
-    {"documentFileName", get_documentFileName_static,
-     set_documentFileName_static},
+    {"documentFileName", get_document_file_name_static,
+     set_document_file_name_static},
     {"external", get_external_static, set_external_static},
     {"filesize", get_filesize_static, set_filesize_static},
     {"icons", get_icons_static, set_icons_static},
@@ -83,20 +83,21 @@
     {"keywords", get_keywords_static, set_keywords_static},
     {"layout", get_layout_static, set_layout_static},
     {"media", get_media_static, set_media_static},
-    {"modDate", get_modDate_static, set_modDate_static},
-    {"mouseX", get_mouseX_static, set_mouseX_static},
-    {"mouseY", get_mouseY_static, set_mouseY_static},
-    {"numFields", get_numFields_static, set_numFields_static},
-    {"numPages", get_numPages_static, set_numPages_static},
-    {"pageNum", get_pageNum_static, set_pageNum_static},
-    {"pageWindowRect", get_pageWindowRect_static, set_pageWindowRect_static},
+    {"modDate", get_mod_date_static, set_mod_date_static},
+    {"mouseX", get_mouse_x_static, set_mouse_x_static},
+    {"mouseY", get_mouse_y_static, set_mouse_y_static},
+    {"numFields", get_num_fields_static, set_num_fields_static},
+    {"numPages", get_num_pages_static, set_num_pages_static},
+    {"pageNum", get_page_num_static, set_page_num_static},
+    {"pageWindowRect", get_page_window_rect_static,
+     set_page_window_rect_static},
     {"path", get_path_static, set_path_static},
     {"producer", get_producer_static, set_producer_static},
     {"subject", get_subject_static, set_subject_static},
     {"title", get_title_static, set_title_static},
     {"URL", get_URL_static, set_URL_static},
     {"zoom", get_zoom_static, set_zoom_static},
-    {"zoomType", get_zoomType_static, set_zoomType_static},
+    {"zoomType", get_zoom_type_static, set_zoom_type_static},
     {0, 0, 0}};
 
 JSMethodSpec CJS_Document::MethodSpecs[] = {
@@ -158,72 +159,92 @@
       m_cwBaseURL(L""),
       m_bDelay(false) {}
 
-Document::~Document() {
-}
+Document::~Document() {}
 
-// the total number of fileds in document.
-bool Document::numFields(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+// the total number of fields in document.
+bool Document::get_num_fields(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
+
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
-  vp << static_cast<int>(pPDFForm->CountFields(WideString()));
+  vp->Set(static_cast<int>(pPDFForm->CountFields(WideString())));
   return true;
 }
 
-bool Document::dirty(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Document::set_num_fields(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Document::get_dirty(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  if (vp.IsGetting()) {
-    vp << !!m_pFormFillEnv->GetChangeMark();
-    return true;
-  }
-  bool bChanged = false;
-  vp >> bChanged;
-  if (bChanged)
-    m_pFormFillEnv->SetChangeMark();
-  else
-    m_pFormFillEnv->ClearChangeMark();
 
+  vp->Set(!!m_pFormFillEnv->GetChangeMark());
   return true;
 }
 
-bool Document::ADBE(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  if (vp.IsGetting())
-    vp.GetJSValue()->SetNull(pRuntime);
-
-  return true;
-}
-
-bool Document::pageNum(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool Document::set_dirty(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  if (vp.IsGetting()) {
-    if (CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetCurrentView())
-      vp << pPageView->GetPageIndex();
-    return true;
+
+  vp.ToBool() ? m_pFormFillEnv->SetChangeMark()
+              : m_pFormFillEnv->ClearChangeMark();
+
+  return true;
+}
+
+bool Document::get_ADBE(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
+  vp->GetJSValue()->SetNull(pRuntime);
+  return true;
+}
+
+bool Document::set_ADBE(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  return true;
+}
+
+bool Document::get_page_num(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  if (!m_pFormFillEnv) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
   }
+
+  if (CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetCurrentView())
+    vp->Set(pPageView->GetPageIndex());
+  return true;
+}
+
+bool Document::set_page_num(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  if (!m_pFormFillEnv) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
+  }
+
   int iPageCount = m_pFormFillEnv->GetPageCount();
-  int iPageNum = 0;
-  vp >> iPageNum;
+  int iPageNum = vp.ToInt();
   if (iPageNum >= 0 && iPageNum < iPageCount)
     m_pFormFillEnv->JS_docgotoPage(iPageNum);
   else if (iPageNum >= iPageCount)
@@ -675,9 +696,15 @@
   m_pFormFillEnv.Reset(pFormFillEnv);
 }
 
-bool Document::bookmarkRoot(CJS_Runtime* pRuntime,
-                            CJS_PropValue& vp,
-                            WideString& sError) {
+bool Document::get_bookmark_root(CJS_Runtime* pRuntime,
+                                 CJS_PropValue* vp,
+                                 WideString* sError) {
+  return true;
+}
+
+bool Document::set_bookmark_root(CJS_Runtime* pRuntime,
+                                 const CJS_PropValue& vp,
+                                 WideString* sError) {
   return true;
 }
 
@@ -736,23 +763,26 @@
   return true;
 }
 
-bool Document::author(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Document::get_author(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "Author", sError);
 }
 
-bool Document::info(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Document::set_author(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "Author", sError);
+}
+
+bool Document::get_info(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
+
   const auto* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo();
   if (!pDictionary)
     return false;
@@ -805,70 +835,112 @@
           pObj, wsKey, pRuntime->NewBoolean(!!pValueObj->GetInteger()));
     }
   }
-  vp << pObj;
+  vp->Set(pObj);
   return true;
 }
 
+bool Document::set_info(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
 bool Document::getPropertyInternal(CJS_Runtime* pRuntime,
-                                   CJS_PropValue& vp,
+                                   CJS_PropValue* vp,
                                    const ByteString& propName,
-                                   WideString& sError) {
+                                   WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
+
   CPDF_Dictionary* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo();
   if (!pDictionary)
     return false;
 
-  if (vp.IsGetting()) {
-    vp << pDictionary->GetUnicodeTextFor(propName);
-  } else {
-    if (!m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY)) {
-      sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
-      return false;
-    }
-    WideString csProperty;
-    vp >> csProperty;
-    pDictionary->SetNewFor<CPDF_String>(propName, PDF_EncodeText(csProperty),
-                                        false);
-    m_pFormFillEnv->SetChangeMark();
-  }
+  vp->Set(pDictionary->GetUnicodeTextFor(propName));
   return true;
 }
 
-bool Document::creationDate(CJS_Runtime* pRuntime,
-                            CJS_PropValue& vp,
-                            WideString& sError) {
+bool Document::setPropertyInternal(CJS_Runtime* pRuntime,
+                                   const CJS_PropValue& vp,
+                                   const ByteString& propName,
+                                   WideString* sError) {
+  if (!m_pFormFillEnv) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
+  }
+
+  CPDF_Dictionary* pDictionary = m_pFormFillEnv->GetPDFDocument()->GetInfo();
+  if (!pDictionary)
+    return false;
+
+  if (!m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY)) {
+    *sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
+    return false;
+  }
+  WideString csProperty = vp.ToWideString();
+  pDictionary->SetNewFor<CPDF_String>(propName, PDF_EncodeText(csProperty),
+                                      false);
+  m_pFormFillEnv->SetChangeMark();
+  return true;
+}
+
+bool Document::get_creation_date(CJS_Runtime* pRuntime,
+                                 CJS_PropValue* vp,
+                                 WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "CreationDate", sError);
 }
 
-bool Document::creator(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool Document::set_creation_date(CJS_Runtime* pRuntime,
+                                 const CJS_PropValue& vp,
+                                 WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "CreationDate", sError);
+}
+
+bool Document::get_creator(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "Creator", sError);
 }
 
-bool Document::delay(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Document::set_creator(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "Creator", sError);
+}
+
+bool Document::get_delay(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  if (vp.IsGetting()) {
-    vp << m_bDelay;
-    return true;
+  vp->Set(m_bDelay);
+  return true;
+}
+
+bool Document::set_delay(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  if (!m_pFormFillEnv) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
   }
+
   if (!m_pFormFillEnv->GetPermissions(FPDFPERM_MODIFY)) {
-    sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
+    *sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return false;
   }
-  vp >> m_bDelay;
+
+  m_bDelay = vp.ToBool();
   if (m_bDelay) {
     m_DelayData.clear();
     return true;
   }
+
   std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
   DelayDataToProcess.swap(m_DelayData);
   for (const auto& pData : DelayDataToProcess)
@@ -877,143 +949,210 @@
   return true;
 }
 
-bool Document::keywords(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
+bool Document::get_keywords(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "Keywords", sError);
 }
 
-bool Document::modDate(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool Document::set_keywords(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "Keywords", sError);
+}
+
+bool Document::get_mod_date(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "ModDate", sError);
 }
 
-bool Document::producer(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
+bool Document::set_mod_date(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "ModDate", sError);
+}
+
+bool Document::get_producer(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "Producer", sError);
 }
 
-bool Document::subject(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool Document::set_producer(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "Producer", sError);
+}
+
+bool Document::get_subject(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   return getPropertyInternal(pRuntime, vp, "Subject", sError);
 }
 
-bool Document::title(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Document::set_subject(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return setPropertyInternal(pRuntime, vp, "Subject", sError);
+}
+
+bool Document::get_title(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   if (!m_pFormFillEnv || !m_pFormFillEnv->GetUnderlyingDocument()) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
   return getPropertyInternal(pRuntime, vp, "Title", sError);
 }
 
-bool Document::numPages(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+bool Document::set_title(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  if (!m_pFormFillEnv || !m_pFormFillEnv->GetUnderlyingDocument()) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
+  return setPropertyInternal(pRuntime, vp, "Title", sError);
+}
+
+bool Document::get_num_pages(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  vp << m_pFormFillEnv->GetPageCount();
+  vp->Set(m_pFormFillEnv->GetPageCount());
   return true;
 }
 
-bool Document::external(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
+bool Document::set_num_pages(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Document::get_external(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   // In Chrome case, should always return true.
-  if (vp.IsGetting()) {
-    vp << true;
-  }
+  vp->Set(true);
   return true;
 }
 
-bool Document::filesize(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
-  vp << 0;
+bool Document::set_external(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
   return true;
 }
 
-bool Document::mouseX(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Document::get_filesize(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  vp->Set(0);
   return true;
 }
 
-bool Document::mouseY(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Document::set_filesize(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Document::get_mouse_x(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   return true;
 }
 
-bool Document::URL(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Document::set_mouse_x(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return true;
+}
+
+bool Document::get_mouse_y(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
+  return true;
+}
+
+bool Document::set_mouse_y(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return true;
+}
+
+bool Document::get_URL(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  vp << m_pFormFillEnv->JS_docGetFilePath();
+  vp->Set(m_pFormFillEnv->JS_docGetFilePath());
   return true;
 }
 
-bool Document::baseURL(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
-  if (vp.IsGetting()) {
-    vp << m_cwBaseURL;
-  } else {
-    vp >> m_cwBaseURL;
-  }
+bool Document::set_URL(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Document::get_base_URL(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  vp->Set(m_cwBaseURL);
   return true;
 }
 
-bool Document::calculate(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool Document::set_base_URL(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  m_cwBaseURL = vp.ToWideString();
+  return true;
+}
+
+bool Document::get_calculate(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
+
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
-  if (vp.IsGetting()) {
-    vp << !!pInterForm->IsCalculateEnabled();
-    return true;
-  }
-  bool bCalculate;
-  vp >> bCalculate;
-  pInterForm->EnableCalculate(bCalculate);
+  vp->Set(!!pInterForm->IsCalculateEnabled());
   return true;
 }
 
-bool Document::documentFileName(CJS_Runtime* pRuntime,
-                                CJS_PropValue& vp,
-                                WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Document::set_calculate(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
+
+  CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
+  pInterForm->EnableCalculate(vp.ToBool());
+  return true;
+}
+
+bool Document::get_document_file_name(CJS_Runtime* pRuntime,
+                                      CJS_PropValue* vp,
+                                      WideString* sError) {
+  if (!m_pFormFillEnv) {
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    return false;
+  }
+
   WideString wsFilePath = m_pFormFillEnv->JS_docGetFilePath();
   size_t i = wsFilePath.GetLength();
   for (; i > 0; i--) {
@@ -1022,37 +1161,59 @@
   }
 
   if (i > 0 && i < wsFilePath.GetLength())
-    vp << (wsFilePath.GetBuffer(wsFilePath.GetLength()) + i);
+    vp->Set(wsFilePath.GetBuffer(wsFilePath.GetLength()) + i);
   else
-    vp << L"";
+    vp->Set(L"");
 
   return true;
 }
 
-bool Document::path(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Document::set_document_file_name(CJS_Runtime* pRuntime,
+                                      const CJS_PropValue& vp,
+                                      WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Document::get_path(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
   if (!m_pFormFillEnv) {
-    sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+    *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  vp << app::SysPathToPDFPath(m_pFormFillEnv->JS_docGetFilePath());
+  vp->Set(app::SysPathToPDFPath(m_pFormFillEnv->JS_docGetFilePath()));
   return true;
 }
 
-bool Document::pageWindowRect(CJS_Runtime* pRuntime,
-                              CJS_PropValue& vp,
-                              WideString& sError) {
+bool Document::set_path(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Document::get_page_window_rect(CJS_Runtime* pRuntime,
+                                    CJS_PropValue* vp,
+                                    WideString* sError) {
   return true;
 }
 
-bool Document::layout(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Document::set_page_window_rect(CJS_Runtime* pRuntime,
+                                    const CJS_PropValue& vp,
+                                    WideString* sError) {
+  return true;
+}
+
+bool Document::get_layout(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
+  return true;
+}
+
+bool Document::set_layout(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
   return true;
 }
 
@@ -1226,15 +1387,11 @@
   return true;
 }
 
-bool Document::icons(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (vp.IsSetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Document::get_icons(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   if (m_IconNames.empty()) {
-    vp.GetJSValue()->SetNull(pRuntime);
+    vp->GetJSValue()->SetNull(pRuntime);
     return true;
   }
 
@@ -1253,10 +1410,17 @@
     Icons.SetElement(pRuntime, i++, CJS_Value(pRuntime, pJS_Icon));
   }
 
-  vp << Icons;
+  vp->Set(Icons);
   return true;
 }
 
+bool Document::set_icons(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
 bool Document::getIcon(CJS_Runtime* pRuntime,
                        const std::vector<CJS_Value>& params,
                        CJS_Value& vRet,
@@ -1299,9 +1463,15 @@
   return true;
 }
 
-bool Document::media(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Document::get_media(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
+  return true;
+}
+
+bool Document::set_media(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
   return true;
 }
 
@@ -1323,9 +1493,15 @@
   return true;
 }
 
-bool Document::Collab(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Document::get_collab(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
+  return true;
+}
+
+bool Document::set_collab(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
   return true;
 }
 
@@ -1524,25 +1700,26 @@
   return swRet;
 }
 
-bool Document::zoom(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
+bool Document::get_zoom(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
   return true;
 }
 
-/**
-(none,  NoVary)
-(fitP,  FitPage)
-(fitW,  FitWidth)
-(fitH,  FitHeight)
-(fitV,  FitVisibleWidth)
-(pref,  Preferred)
-(refW,  ReflowWidth)
-*/
+bool Document::set_zoom(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  return true;
+}
 
-bool Document::zoomType(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
+bool Document::get_zoom_type(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError) {
+  return true;
+}
+bool Document::set_zoom_type(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError) {
   return true;
 }
 
diff --git a/fpdfsdk/javascript/Document.h b/fpdfsdk/javascript/Document.h
index 3cec9fa..8535cd0 100644
--- a/fpdfsdk/javascript/Document.h
+++ b/fpdfsdk/javascript/Document.h
@@ -50,45 +50,203 @@
   explicit Document(CJS_Object* pJSObject);
   ~Document() override;
 
-  bool ADBE(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool author(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool baseURL(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool bookmarkRoot(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool calculate(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool Collab(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool creationDate(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool creator(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool delay(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool dirty(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool documentFileName(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError);
-  bool external(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool filesize(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool icons(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool info(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool keywords(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool layout(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool media(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool modDate(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool mouseX(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool mouseY(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool numFields(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool numPages(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool pageNum(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool pageWindowRect(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError);
-  bool path(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool producer(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool subject(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool title(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool zoom(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool zoomType(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
+  bool get_ADBE(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_ADBE(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_author(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_author(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_base_URL(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_base_URL(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_bookmark_root(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_bookmark_root(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_calculate(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_calculate(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_collab(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_collab(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_creation_date(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_creation_date(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_creator(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_creator(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_delay(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_delay(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_dirty(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_dirty(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_document_file_name(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError);
+  bool set_document_file_name(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError);
+
+  bool get_external(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_external(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_filesize(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_filesize(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_icons(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_icons(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_info(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_info(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_keywords(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_keywords(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_layout(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_layout(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_media(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_media(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_mod_date(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_mod_date(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_mouse_x(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_mouse_x(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_mouse_y(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_mouse_y(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_num_fields(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_num_fields(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_num_pages(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_num_pages(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_page_num(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_page_num(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_page_window_rect(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError);
+  bool set_page_window_rect(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError);
+
+  bool get_path(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_path(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_producer(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_producer(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_subject(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_subject(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_title(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_title(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_zoom(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_zoom(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_zoom_type(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_zoom_type(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_URL(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_URL(CJS_Runtime* pRuntime,
+               const CJS_PropValue& vp,
+               WideString* sError);
 
   bool addAnnot(CJS_Runtime* pRuntime,
                 const std::vector<CJS_Value>& params,
@@ -258,7 +416,6 @@
                   const std::vector<CJS_Value>& params,
                   CJS_Value& vRet,
                   WideString& sError);
-  bool URL(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
 
   void SetFormFillEnv(CPDFSDK_FormFillEnvironment* pFormFillEnv);
   CPDFSDK_FormFillEnvironment* GetFormFillEnv() const {
@@ -274,9 +431,13 @@
   WideString GetObjWordStr(CPDF_TextObject* pTextObj, int nWordIndex);
 
   bool getPropertyInternal(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
+                           CJS_PropValue* vp,
                            const ByteString& propName,
-                           WideString& sError);
+                           WideString* sError);
+  bool setPropertyInternal(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           const ByteString& propName,
+                           WideString* sError);
 
   CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
   WideString m_cwBaseURL;
@@ -296,38 +457,38 @@
 
   DECLARE_JS_CLASS();
 
-  JS_STATIC_PROP(ADBE, Document);
-  JS_STATIC_PROP(author, Document);
-  JS_STATIC_PROP(baseURL, Document);
-  JS_STATIC_PROP(bookmarkRoot, Document);
-  JS_STATIC_PROP(calculate, Document);
-  JS_STATIC_PROP(Collab, Document);
-  JS_STATIC_PROP(creationDate, Document);
-  JS_STATIC_PROP(creator, Document);
-  JS_STATIC_PROP(delay, Document);
-  JS_STATIC_PROP(dirty, Document);
-  JS_STATIC_PROP(documentFileName, Document);
-  JS_STATIC_PROP(external, Document);
-  JS_STATIC_PROP(filesize, Document);
-  JS_STATIC_PROP(icons, Document);
-  JS_STATIC_PROP(info, Document);
-  JS_STATIC_PROP(keywords, Document);
-  JS_STATIC_PROP(layout, Document);
-  JS_STATIC_PROP(media, Document);
-  JS_STATIC_PROP(modDate, Document);
-  JS_STATIC_PROP(mouseX, Document);
-  JS_STATIC_PROP(mouseY, Document);
-  JS_STATIC_PROP(numFields, Document);
-  JS_STATIC_PROP(numPages, Document);
-  JS_STATIC_PROP(pageNum, Document);
-  JS_STATIC_PROP(pageWindowRect, Document);
-  JS_STATIC_PROP(path, Document);
-  JS_STATIC_PROP(producer, Document);
-  JS_STATIC_PROP(subject, Document);
-  JS_STATIC_PROP(title, Document);
-  JS_STATIC_PROP(URL, Document);
-  JS_STATIC_PROP(zoom, Document);
-  JS_STATIC_PROP(zoomType, Document);
+  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);
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 4e40e6f..ce272d5 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -76,59 +76,65 @@
 
 JSPropertySpec CJS_Field::PropertySpecs[] = {
     {"alignment", get_alignment_static, set_alignment_static},
-    {"borderStyle", get_borderStyle_static, set_borderStyle_static},
-    {"buttonAlignX", get_buttonAlignX_static, set_buttonAlignX_static},
-    {"buttonAlignY", get_buttonAlignY_static, set_buttonAlignY_static},
-    {"buttonFitBounds", get_buttonFitBounds_static, set_buttonFitBounds_static},
-    {"buttonPosition", get_buttonPosition_static, set_buttonPosition_static},
-    {"buttonScaleHow", get_buttonScaleHow_static, set_buttonScaleHow_static},
-    {"buttonScaleWhen", get_buttonScaleWhen_static, set_buttonScaleWhen_static},
-    {"calcOrderIndex", get_calcOrderIndex_static, set_calcOrderIndex_static},
-    {"charLimit", get_charLimit_static, set_charLimit_static},
+    {"borderStyle", get_border_style_static, set_border_style_static},
+    {"buttonAlignX", get_button_align_x_static, set_button_align_x_static},
+    {"buttonAlignY", get_button_align_y_static, set_button_align_y_static},
+    {"buttonFitBounds", get_button_fit_bounds_static,
+     set_button_fit_bounds_static},
+    {"buttonPosition", get_button_position_static, set_button_position_static},
+    {"buttonScaleHow", get_button_scale_how_static,
+     set_button_scale_how_static},
+    {"buttonScaleWhen", get_button_scale_when_static,
+     set_button_scale_when_static},
+    {"calcOrderIndex", get_calc_order_index_static,
+     set_calc_order_index_static},
+    {"charLimit", get_char_limit_static, set_char_limit_static},
     {"comb", get_comb_static, set_comb_static},
-    {"commitOnSelChange", get_commitOnSelChange_static,
-     set_commitOnSelChange_static},
-    {"currentValueIndices", get_currentValueIndices_static,
-     set_currentValueIndices_static},
-    {"defaultStyle", get_defaultStyle_static, set_defaultStyle_static},
-    {"defaultValue", get_defaultValue_static, set_defaultValue_static},
-    {"doNotScroll", get_doNotScroll_static, set_doNotScroll_static},
-    {"doNotSpellCheck", get_doNotSpellCheck_static, set_doNotSpellCheck_static},
+    {"commitOnSelChange", get_commit_on_sel_change_static,
+     set_commit_on_sel_change_static},
+    {"currentValueIndices", get_current_value_indices_static,
+     set_current_value_indices_static},
+    {"defaultStyle", get_default_style_static, set_default_style_static},
+    {"defaultValue", get_default_value_static, set_default_value_static},
+    {"doNotScroll", get_do_not_scroll_static, set_do_not_scroll_static},
+    {"doNotSpellCheck", get_do_not_spell_check_static,
+     set_do_not_spell_check_static},
     {"delay", get_delay_static, set_delay_static},
     {"display", get_display_static, set_display_static},
     {"doc", get_doc_static, set_doc_static},
     {"editable", get_editable_static, set_editable_static},
-    {"exportValues", get_exportValues_static, set_exportValues_static},
+    {"exportValues", get_export_values_static, set_export_values_static},
     {"hidden", get_hidden_static, set_hidden_static},
-    {"fileSelect", get_fileSelect_static, set_fileSelect_static},
-    {"fillColor", get_fillColor_static, set_fillColor_static},
-    {"lineWidth", get_lineWidth_static, set_lineWidth_static},
+    {"fileSelect", get_file_select_static, set_file_select_static},
+    {"fillColor", get_fill_color_static, set_fill_color_static},
+    {"lineWidth", get_line_width_static, set_line_width_static},
     {"highlight", get_highlight_static, set_highlight_static},
     {"multiline", get_multiline_static, set_multiline_static},
-    {"multipleSelection", get_multipleSelection_static,
-     set_multipleSelection_static},
+    {"multipleSelection", get_multiple_selection_static,
+     set_multiple_selection_static},
     {"name", get_name_static, set_name_static},
-    {"numItems", get_numItems_static, set_numItems_static},
+    {"numItems", get_num_items_static, set_num_items_static},
     {"page", get_page_static, set_page_static},
     {"password", get_password_static, set_password_static},
     {"print", get_print_static, set_print_static},
-    {"radiosInUnison", get_radiosInUnison_static, set_radiosInUnison_static},
+    {"radiosInUnison", get_radios_in_unison_static,
+     set_radios_in_unison_static},
     {"readonly", get_readonly_static, set_readonly_static},
     {"rect", get_rect_static, set_rect_static},
     {"required", get_required_static, set_required_static},
-    {"richText", get_richText_static, set_richText_static},
-    {"richValue", get_richValue_static, set_richValue_static},
+    {"richText", get_rich_text_static, set_rich_text_static},
+    {"richValue", get_rich_value_static, set_rich_value_static},
     {"rotation", get_rotation_static, set_rotation_static},
-    {"strokeColor", get_strokeColor_static, set_strokeColor_static},
+    {"strokeColor", get_stroke_color_static, set_stroke_color_static},
     {"style", get_style_static, set_style_static},
-    {"submitName", get_submitName_static, set_submitName_static},
-    {"textColor", get_textColor_static, set_textColor_static},
-    {"textFont", get_textFont_static, set_textFont_static},
-    {"textSize", get_textSize_static, set_textSize_static},
+    {"submitName", get_submit_name_static, set_submit_name_static},
+    {"textColor", get_text_color_static, set_text_color_static},
+    {"textFont", get_text_font_static, set_text_font_static},
+    {"textSize", get_text_size_static, set_text_size_static},
     {"type", get_type_static, set_type_static},
-    {"userName", get_userName_static, set_userName_static},
+    {"userName", get_user_name_static, set_user_name_static},
     {"value", get_value_static, set_value_static},
-    {"valueAsString", get_valueAsString_static, set_valueAsString_static},
+    {"valueAsString", get_value_as_string_static, set_value_as_string_static},
     {"source", get_source_static, set_source_static},
     {0, 0, 0}};
 
@@ -168,8 +174,7 @@
 
 CJS_DelayData::~CJS_DelayData() {}
 
-void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) {
-}
+void CJS_Field::InitInstance(IJS_Runtime* pIRuntime) {}
 
 Field::Field(CJS_Object* pJSObject)
     : CJS_EmbedObj(pJSObject),
@@ -378,25 +383,11 @@
   return pFormField->GetControl(m_nFormControlIndex);
 }
 
-bool Field::alignment(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Field::get_alignment(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    ByteString alignStr;
-    vp >> alignStr;
-
-    if (m_bDelay) {
-      AddDelay_String(FP_ALIGNMENT, alignStr);
-    } else {
-      Field::SetAlignment(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, alignStr);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -411,22 +402,38 @@
 
     switch (pFormControl->GetControlAlignment()) {
       case 1:
-        vp << L"center";
+        vp->Set(L"center");
         break;
       case 0:
-        vp << L"left";
+        vp->Set(L"left");
         break;
       case 2:
-        vp << L"right";
+        vp->Set(L"right");
         break;
       default:
-        vp << L"";
+        vp->Set(L"");
     }
-  }
 
   return true;
 }
 
+bool Field::set_alignment(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_String(FP_ALIGNMENT, vp.ToByteString());
+  } else {
+    Field::SetAlignment(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        vp.ToByteString());
+  }
+  return true;
+}
+
 void Field::SetAlignment(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
@@ -434,60 +441,61 @@
   // Not supported.
 }
 
-bool Field::borderStyle(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
+bool Field::get_border_style(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-    ByteString strType = "";
-    vp >> strType;
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (!pFormField)
+    return false;
 
-    if (m_bDelay) {
-      AddDelay_String(FP_BORDERSTYLE, strType);
-    } else {
-      Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName,
-                            m_nFormControlIndex, strType);
-    }
-  } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
+  CPDFSDK_Widget* pWidget =
+      GetWidget(m_pFormFillEnv.Get(), GetSmartFieldControl(pFormField));
+  if (!pWidget)
+    return false;
 
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (!pFormField)
-      return false;
-
-    CPDFSDK_Widget* pWidget =
-        GetWidget(m_pFormFillEnv.Get(), GetSmartFieldControl(pFormField));
-    if (!pWidget)
-      return false;
-
-    switch (pWidget->GetBorderStyle()) {
-      case BorderStyle::SOLID:
-        vp << L"solid";
-        break;
-      case BorderStyle::DASH:
-        vp << L"dashed";
-        break;
-      case BorderStyle::BEVELED:
-        vp << L"beveled";
-        break;
-      case BorderStyle::INSET:
-        vp << L"inset";
-        break;
-      case BorderStyle::UNDERLINE:
-        vp << L"underline";
-        break;
-      default:
-        vp << L"";
-        break;
-    }
+  switch (pWidget->GetBorderStyle()) {
+    case BorderStyle::SOLID:
+      vp->Set(L"solid");
+      break;
+    case BorderStyle::DASH:
+      vp->Set(L"dashed");
+      break;
+    case BorderStyle::BEVELED:
+      vp->Set(L"beveled");
+      break;
+    case BorderStyle::INSET:
+      vp->Set(L"inset");
+      break;
+    case BorderStyle::UNDERLINE:
+      vp->Set(L"underline");
+      break;
+    default:
+      vp->Set(L"");
+      break;
   }
+  return true;
+}
 
+bool Field::set_border_style(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_String(FP_BORDERSTYLE, vp.ToByteString());
+  } else {
+    Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, vp.ToByteString());
+  }
   return true;
 }
 
@@ -543,45 +551,47 @@
   }
 }
 
-bool Field::buttonAlignX(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool Field::get_button_align_x(CJS_Runtime* pRuntime,
+                               CJS_PropValue* vp,
+                               WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-    int nVP;
-    vp >> nVP;
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+    return false;
 
-    if (m_bDelay) {
-      AddDelay_Int(FP_BUTTONALIGNX, nVP);
-    } else {
-      Field::SetButtonAlignX(m_pFormFillEnv.Get(), m_FieldName,
-                             m_nFormControlIndex, nVP);
-    }
+  CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+  if (!pFormControl)
+    return false;
+
+  CPDF_IconFit IconFit = pFormControl->GetIconFit();
+
+  float fLeft;
+  float fBottom;
+  IconFit.GetIconPosition(fLeft, fBottom);
+
+  vp->Set(static_cast<int32_t>(fLeft));
+  return true;
+}
+
+bool Field::set_button_align_x(CJS_Runtime* pRuntime,
+                               const CJS_PropValue& vp,
+                               WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_BUTTONALIGNX, vp.ToInt());
   } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
-
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-      return false;
-
-    CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-    if (!pFormControl)
-      return false;
-
-    CPDF_IconFit IconFit = pFormControl->GetIconFit();
-
-    float fLeft, fBottom;
-    IconFit.GetIconPosition(fLeft, fBottom);
-
-    vp << (int32_t)fLeft;
+    Field::SetButtonAlignX(m_pFormFillEnv.Get(), m_FieldName,
+                           m_nFormControlIndex, vp.ToInt());
   }
-
   return true;
 }
 
@@ -592,43 +602,46 @@
   // Not supported.
 }
 
-bool Field::buttonAlignY(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool Field::get_button_align_y(CJS_Runtime* pRuntime,
+                               CJS_PropValue* vp,
+                               WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-    int nVP;
-    vp >> nVP;
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
+    return false;
 
-    if (m_bDelay) {
-      AddDelay_Int(FP_BUTTONALIGNY, nVP);
-    } else {
-      Field::SetButtonAlignY(m_pFormFillEnv.Get(), m_FieldName,
-                             m_nFormControlIndex, nVP);
-    }
+  CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
+  if (!pFormControl)
+    return false;
+
+  CPDF_IconFit IconFit = pFormControl->GetIconFit();
+
+  float fLeft;
+  float fBottom;
+  IconFit.GetIconPosition(fLeft, fBottom);
+
+  vp->Set(static_cast<int32_t>(fBottom));
+  return true;
+}
+
+bool Field::set_button_align_y(CJS_Runtime* pRuntime,
+                               const CJS_PropValue& vp,
+                               WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_BUTTONALIGNY, vp.ToInt());
   } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
-
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (pFormField->GetFieldType() != FIELDTYPE_PUSHBUTTON)
-      return false;
-
-    CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
-    if (!pFormControl)
-      return false;
-
-    CPDF_IconFit IconFit = pFormControl->GetIconFit();
-
-    float fLeft, fBottom;
-    IconFit.GetIconPosition(fLeft, fBottom);
-
-    vp << (int32_t)fBottom;
+    Field::SetButtonAlignY(m_pFormFillEnv.Get(), m_FieldName,
+                           m_nFormControlIndex, vp.ToInt());
   }
 
   return true;
@@ -641,25 +654,11 @@
   // Not supported.
 }
 
-bool Field::buttonFitBounds(CJS_Runtime* pRuntime,
-                            CJS_PropValue& vp,
-                            WideString& sError) {
+bool Field::get_button_fit_bounds(CJS_Runtime* pRuntime,
+                                  CJS_PropValue* vp,
+                                  WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-
-    if (m_bDelay) {
-      AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);
-    } else {
-      Field::SetButtonFitBounds(m_pFormFillEnv.Get(), m_FieldName,
-                                m_nFormControlIndex, bVP);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -672,9 +671,24 @@
     if (!pFormControl)
       return false;
 
-    vp << pFormControl->GetIconFit().GetFittingBounds();
-  }
+    vp->Set(pFormControl->GetIconFit().GetFittingBounds());
+    return true;
+}
 
+bool Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
+                                  const CJS_PropValue& vp,
+                                  WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Bool(FP_BUTTONFITBOUNDS, vp.ToBool());
+  } else {
+    Field::SetButtonFitBounds(m_pFormFillEnv.Get(), m_FieldName,
+                              m_nFormControlIndex, vp.ToBool());
+  }
   return true;
 }
 
@@ -685,25 +699,11 @@
   // Not supported.
 }
 
-bool Field::buttonPosition(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           WideString& sError) {
+bool Field::get_button_position(CJS_Runtime* pRuntime,
+                                CJS_PropValue* vp,
+                                WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    int nVP;
-    vp >> nVP;
-
-    if (m_bDelay) {
-      AddDelay_Int(FP_BUTTONPOSITION, nVP);
-    } else {
-      Field::SetButtonPosition(m_pFormFillEnv.Get(), m_FieldName,
-                               m_nFormControlIndex, nVP);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -716,7 +716,23 @@
     if (!pFormControl)
       return false;
 
-    vp << pFormControl->GetTextPosition();
+    vp->Set(pFormControl->GetTextPosition());
+    return true;
+}
+
+bool Field::set_button_position(CJS_Runtime* pRuntime,
+                                const CJS_PropValue& vp,
+                                WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_BUTTONPOSITION, vp.ToInt());
+  } else {
+    Field::SetButtonPosition(m_pFormFillEnv.Get(), m_FieldName,
+                             m_nFormControlIndex, vp.ToInt());
   }
   return true;
 }
@@ -728,25 +744,11 @@
   // Not supported.
 }
 
-bool Field::buttonScaleHow(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           WideString& sError) {
+bool Field::get_button_scale_how(CJS_Runtime* pRuntime,
+                                 CJS_PropValue* vp,
+                                 WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    int nVP;
-    vp >> nVP;
-
-    if (m_bDelay) {
-      AddDelay_Int(FP_BUTTONSCALEHOW, nVP);
-    } else {
-      Field::SetButtonScaleHow(m_pFormFillEnv.Get(), m_FieldName,
-                               m_nFormControlIndex, nVP);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -759,13 +761,24 @@
     if (!pFormControl)
       return false;
 
-    CPDF_IconFit IconFit = pFormControl->GetIconFit();
-    if (IconFit.IsProportionalScale())
-      vp << (int32_t)0;
-    else
-      vp << (int32_t)1;
-  }
+    vp->Set(pFormControl->GetIconFit().IsProportionalScale() ? 0 : 1);
+    return true;
+}
 
+bool Field::set_button_scale_how(CJS_Runtime* pRuntime,
+                                 const CJS_PropValue& vp,
+                                 WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_BUTTONSCALEHOW, vp.ToInt());
+  } else {
+    Field::SetButtonScaleHow(m_pFormFillEnv.Get(), m_FieldName,
+                             m_nFormControlIndex, vp.ToInt());
+  }
   return true;
 }
 
@@ -776,25 +789,11 @@
   // Not supported.
 }
 
-bool Field::buttonScaleWhen(CJS_Runtime* pRuntime,
-                            CJS_PropValue& vp,
-                            WideString& sError) {
+bool Field::get_button_scale_when(CJS_Runtime* pRuntime,
+                                  CJS_PropValue* vp,
+                                  WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    int nVP;
-    vp >> nVP;
-
-    if (m_bDelay) {
-      AddDelay_Int(FP_BUTTONSCALEWHEN, nVP);
-    } else {
-      Field::SetButtonScaleWhen(m_pFormFillEnv.Get(), m_FieldName,
-                                m_nFormControlIndex, nVP);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -811,20 +810,35 @@
     int ScaleM = IconFit.GetScaleMethod();
     switch (ScaleM) {
       case CPDF_IconFit::Always:
-        vp << (int32_t)CPDF_IconFit::Always;
+        vp->Set(static_cast<int32_t>(CPDF_IconFit::Always));
         break;
       case CPDF_IconFit::Bigger:
-        vp << (int32_t)CPDF_IconFit::Bigger;
+        vp->Set(static_cast<int32_t>(CPDF_IconFit::Bigger));
         break;
       case CPDF_IconFit::Never:
-        vp << (int32_t)CPDF_IconFit::Never;
+        vp->Set(static_cast<int32_t>(CPDF_IconFit::Never));
         break;
       case CPDF_IconFit::Smaller:
-        vp << (int32_t)CPDF_IconFit::Smaller;
+        vp->Set(static_cast<int32_t>(CPDF_IconFit::Smaller));
         break;
     }
-  }
+    return true;
+}
 
+bool Field::set_button_scale_when(CJS_Runtime* pRuntime,
+                                  const CJS_PropValue& vp,
+                                  WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_BUTTONSCALEWHEN, vp.ToInt());
+  } else {
+    Field::SetButtonScaleWhen(m_pFormFillEnv.Get(), m_FieldName,
+                              m_nFormControlIndex, vp.ToInt());
+  }
   return true;
 }
 
@@ -835,25 +849,11 @@
   // Not supported.
 }
 
-bool Field::calcOrderIndex(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           WideString& sError) {
+bool Field::get_calc_order_index(CJS_Runtime* pRuntime,
+                                 CJS_PropValue* vp,
+                                 WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    int nVP;
-    vp >> nVP;
-
-    if (m_bDelay) {
-      AddDelay_Int(FP_CALCORDERINDEX, nVP);
-    } else {
-      Field::SetCalcOrderIndex(m_pFormFillEnv.Get(), m_FieldName,
-                               m_nFormControlIndex, nVP);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -866,9 +866,25 @@
 
     CPDFSDK_InterForm* pRDInterForm = m_pFormFillEnv->GetInterForm();
     CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
-    vp << (int32_t)pInterForm->FindFieldInCalculationOrder(pFormField);
-  }
+    vp->Set(static_cast<int32_t>(
+        pInterForm->FindFieldInCalculationOrder(pFormField)));
+    return true;
+}
 
+bool Field::set_calc_order_index(CJS_Runtime* pRuntime,
+                                 const CJS_PropValue& vp,
+                                 WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_CALCORDERINDEX, vp.ToInt());
+  } else {
+    Field::SetCalcOrderIndex(m_pFormFillEnv.Get(), m_FieldName,
+                             m_nFormControlIndex, vp.ToInt());
+  }
   return true;
 }
 
@@ -879,34 +895,36 @@
   // Not supported.
 }
 
-bool Field::charLimit(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Field::get_char_limit(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-    int nVP;
-    vp >> nVP;
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+    return false;
 
-    if (m_bDelay) {
-      AddDelay_Int(FP_CHARLIMIT, nVP);
-    } else {
-      Field::SetCharLimit(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, nVP);
-    }
+  vp->Set(static_cast<int32_t>(pFormField->GetMaxLen()));
+  return true;
+}
+
+bool Field::set_char_limit(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_CHARLIMIT, vp.ToInt());
   } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
-
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-      return false;
-
-    vp << (int32_t)pFormField->GetMaxLen();
+    Field::SetCharLimit(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        vp.ToInt());
   }
   return true;
 }
@@ -918,35 +936,36 @@
   // Not supported.
 }
 
-bool Field::comb(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
+bool Field::get_comb(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-    bool bVP;
-    vp >> bVP;
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+    return false;
 
-    if (m_bDelay) {
-      AddDelay_Bool(FP_COMB, bVP);
-    } else {
-      Field::SetComb(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                     bVP);
-    }
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_COMB));
+  return true;
+}
+
+bool Field::set_comb(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Bool(FP_COMB, vp.ToBool());
   } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
-
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-      return false;
-
-    if (pFormField->GetFieldFlags() & FIELDFLAG_COMB)
-      vp << true;
-    else
-      vp << false;
+    Field::SetComb(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                   vp.ToBool());
   }
 
   return true;
@@ -959,25 +978,11 @@
   // Not supported.
 }
 
-bool Field::commitOnSelChange(CJS_Runtime* pRuntime,
-                              CJS_PropValue& vp,
-                              WideString& sError) {
+bool Field::get_commit_on_sel_change(CJS_Runtime* pRuntime,
+                                     CJS_PropValue* vp,
+                                     WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-
-    if (m_bDelay) {
-      AddDelay_Bool(FP_COMMITONSELCHANGE, bVP);
-    } else {
-      Field::SetCommitOnSelChange(m_pFormFillEnv.Get(), m_FieldName,
-                                  m_nFormControlIndex, bVP);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -988,12 +993,24 @@
       return false;
     }
 
-    if (pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE)
-      vp << true;
-    else
-      vp << false;
-  }
+    vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_COMMITONSELCHANGE));
+    return true;
+}
 
+bool Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
+                                     const CJS_PropValue& vp,
+                                     WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Bool(FP_COMMITONSELCHANGE, vp.ToBool());
+  } else {
+    Field::SetCommitOnSelChange(m_pFormFillEnv.Get(), m_FieldName,
+                                m_nFormControlIndex, vp.ToBool());
+  }
   return true;
 }
 
@@ -1004,61 +1021,63 @@
   // Not supported.
 }
 
-bool Field::currentValueIndices(CJS_Runtime* pRuntime,
-                                CJS_PropValue& vp,
-                                WideString& sError) {
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+bool Field::get_current_value_indices(CJS_Runtime* pRuntime,
+                                      CJS_PropValue* vp,
+                                      WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-    std::vector<uint32_t> array;
-    if (vp.GetJSValue()->GetType() == CJS_Value::VT_number) {
-      int iSelecting = 0;
-      vp >> iSelecting;
-      array.push_back(iSelecting);
-    } else if (vp.GetJSValue()->IsArrayObject()) {
-      CJS_Array SelArray;
-      CJS_Value SelValue(pRuntime);
-      int iSelecting;
-      vp >> SelArray;
-      for (int i = 0, sz = SelArray.GetLength(pRuntime); i < sz; i++) {
-        SelArray.GetElement(pRuntime, i, SelValue);
-        iSelecting = SelValue.ToInt(pRuntime);
-        array.push_back(iSelecting);
-      }
-    }
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
+      pFormField->GetFieldType() != FIELDTYPE_LISTBOX) {
+    return false;
+  }
 
-    if (m_bDelay) {
-      AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
-    } else {
-      Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
-                                    m_nFormControlIndex, array);
-    }
-  } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
+  int count = pFormField->CountSelectedItems();
+  if (count <= 0) {
+    vp->Set(-1);
+    return true;
+  }
+  if (count == 1) {
+    vp->Set(pFormField->GetSelectedIndex(0));
+    return true;
+  }
 
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX &&
-        pFormField->GetFieldType() != FIELDTYPE_LISTBOX) {
-      return false;
-    }
+  CJS_Array SelArray;
+  for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
+    SelArray.SetElement(pRuntime, i,
+                        CJS_Value(pRuntime, pFormField->GetSelectedIndex(i)));
+  }
+  vp->Set(SelArray);
 
-    if (pFormField->CountSelectedItems() == 1) {
-      vp << pFormField->GetSelectedIndex(0);
-    } else if (pFormField->CountSelectedItems() > 1) {
-      CJS_Array SelArray;
-      for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
-        SelArray.SetElement(
-            pRuntime, i, CJS_Value(pRuntime, pFormField->GetSelectedIndex(i)));
-      }
-      vp << SelArray;
-    } else {
-      vp << -1;
+  return true;
+}
+
+bool Field::set_current_value_indices(CJS_Runtime* pRuntime,
+                                      const CJS_PropValue& vp,
+                                      WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  std::vector<uint32_t> array;
+  if (vp.GetJSValue()->GetType() == CJS_Value::VT_number) {
+    array.push_back(vp.ToInt());
+  } else if (vp.GetJSValue()->IsArrayObject()) {
+    CJS_Array SelArray = vp.ToArray();
+    CJS_Value SelValue(pRuntime);
+    for (int i = 0, sz = SelArray.GetLength(pRuntime); i < sz; i++) {
+      SelArray.GetElement(pRuntime, i, SelValue);
+      array.push_back(SelValue.ToInt(pRuntime));
     }
   }
 
+  if (m_bDelay) {
+    AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
+  } else {
+    Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
+                                  m_nFormControlIndex, array);
+  }
   return true;
 }
 
@@ -1088,9 +1107,15 @@
   }
 }
 
-bool Field::defaultStyle(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool Field::get_default_style(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError) {
+  return false;
+}
+
+bool Field::set_default_style(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError) {
   return false;
 }
 
@@ -1100,25 +1125,11 @@
   // Not supported.
 }
 
-bool Field::defaultValue(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool Field::get_default_value(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    WideString WideStr;
-    vp >> WideStr;
-
-    if (m_bDelay) {
-      AddDelay_WideString(FP_DEFAULTVALUE, WideStr);
-    } else {
-      Field::SetDefaultValue(m_pFormFillEnv.Get(), m_FieldName,
-                             m_nFormControlIndex, WideStr);
-    }
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -1129,7 +1140,23 @@
       return false;
     }
 
-    vp << pFormField->GetDefaultValue();
+    vp->Set(pFormField->GetDefaultValue());
+    return true;
+}
+
+bool Field::set_default_value(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_WideString(FP_DEFAULTVALUE, vp.ToWideString());
+  } else {
+    Field::SetDefaultValue(m_pFormFillEnv.Get(), m_FieldName,
+                           m_nFormControlIndex, vp.ToWideString());
   }
   return true;
 }
@@ -1141,39 +1168,37 @@
   // Not supported.
 }
 
-bool Field::doNotScroll(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
+bool Field::get_do_not_scroll(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
+
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+    return false;
+
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL));
+  return true;
+}
+
+bool Field::set_do_not_scroll(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
     if (!m_bCanSet)
       return false;
 
-    bool bVP;
-    vp >> bVP;
-
     if (m_bDelay) {
-      AddDelay_Bool(FP_DONOTSCROLL, bVP);
+      AddDelay_Bool(FP_DONOTSCROLL, vp.ToBool());
     } else {
       Field::SetDoNotScroll(m_pFormFillEnv.Get(), m_FieldName,
-                            m_nFormControlIndex, bVP);
+                            m_nFormControlIndex, vp.ToBool());
     }
-  } else {
-    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
-    if (FieldArray.empty())
-      return false;
-
-    CPDF_FormField* pFormField = FieldArray[0];
-    if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
-      return false;
-
-    if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSCROLL)
-      vp << true;
-    else
-      vp << false;
-  }
-
   return true;
 }
 
@@ -1184,18 +1209,11 @@
   // Not supported.
 }
 
-bool Field::doNotSpellCheck(CJS_Runtime* pRuntime,
-                            CJS_PropValue& vp,
-                            WideString& sError) {
+bool Field::get_do_not_spell_check(CJS_Runtime* pRuntime,
+                                   CJS_PropValue* vp,
+                                   WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-  } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
     if (FieldArray.empty())
       return false;
@@ -1206,63 +1224,54 @@
       return false;
     }
 
-    if (pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK)
-      vp << true;
-    else
-      vp << false;
-  }
+    vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_DONOTSPELLCHECK));
+    return true;
+}
 
-  return true;
+bool Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
+                                   const CJS_PropValue& vp,
+                                   WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+  return m_bCanSet;
 }
 
 void Field::SetDelay(bool bDelay) {
   m_bDelay = bDelay;
 
-  if (!m_bDelay) {
-    if (m_pJSDoc)
-      m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
-  }
+  if (m_bDelay)
+    return;
+
+  if (m_pJSDoc)
+    m_pJSDoc->DoFieldDelay(m_FieldName, m_nFormControlIndex);
 }
 
-bool Field::delay(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
-  if (!vp.IsSetting()) {
-    vp << m_bDelay;
-    return true;
-  }
-  if (!m_bCanSet)
-    return false;
-
-  bool bVP;
-  vp >> bVP;
-  SetDelay(bVP);
+bool Field::get_delay(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
+  vp->Set(m_bDelay);
   return true;
 }
 
-bool Field::display(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+bool Field::set_delay(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  if (!m_bCanSet)
+    return false;
 
-    int nVP;
-    vp >> nVP;
-    if (m_bDelay) {
-      AddDelay_Int(FP_DISPLAY, nVP);
-    } else {
-      Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                        nVP);
-    }
-    return true;
-  }
+  SetDelay(vp.ToBool());
+  return true;
+}
+
+bool Field::get_display(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
   CPDF_FormField* pFormField = FieldArray[0];
   ASSERT(pFormField);
+
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   CPDFSDK_Widget* pWidget =
       pInterForm->GetWidget(GetSmartFieldControl(pFormField));
@@ -1271,17 +1280,31 @@
 
   uint32_t dwFlag = pWidget->GetFlags();
   if (ANNOTFLAG_INVISIBLE & dwFlag || ANNOTFLAG_HIDDEN & dwFlag) {
-    vp << (int32_t)1;
+    vp->Set(1);
+    return true;
+  }
+  if (ANNOTFLAG_PRINT & dwFlag) {
+    if (ANNOTFLAG_NOVIEW & dwFlag)
+      vp->Set(3);
+    else
+      vp->Set(0);
   } else {
-    if (ANNOTFLAG_PRINT & dwFlag) {
-      if (ANNOTFLAG_NOVIEW & dwFlag) {
-        vp << (int32_t)3;
-      } else {
-        vp << (int32_t)0;
-      }
-    } else {
-      vp << (int32_t)2;
-    }
+    vp->Set(2);
+  }
+  return true;
+}
+
+bool Field::set_display(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_DISPLAY, vp.ToInt());
+  } else {
+    Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                      vp.ToInt());
   }
   return true;
 }
@@ -1322,25 +1345,22 @@
   }
 }
 
-bool Field::doc(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
-  vp << m_pJSDoc->GetCJSDoc();
+bool Field::get_doc(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError) {
+  vp->Set(m_pJSDoc->GetCJSDoc());
   return true;
 }
 
-bool Field::editable(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+bool Field::set_doc(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError) {
+  return false;
+}
 
-    bool bVP;
-    vp >> bVP;
-    return true;
-  }
+bool Field::get_editable(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1349,13 +1369,19 @@
   if (pFormField->GetFieldType() != FIELDTYPE_COMBOBOX)
     return false;
 
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_EDIT);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_EDIT));
   return true;
 }
 
-bool Field::exportValues(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool Field::set_editable(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  return m_bCanSet;
+}
+
+bool Field::get_export_values(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1365,8 +1391,6 @@
       pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) {
     return false;
   }
-  if (vp.IsSetting())
-    return m_bCanSet && vp.GetJSValue()->IsArrayObject();
 
   CJS_Array ExportValusArray;
   if (m_nFormControlIndex < 0) {
@@ -1389,13 +1413,30 @@
         pRuntime, 0,
         CJS_Value(pRuntime, pFormControl->GetExportValue().c_str()));
   }
-  vp << ExportValusArray;
+
+  vp->Set(ExportValusArray);
   return true;
 }
 
-bool Field::fileSelect(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool Field::set_export_values(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
+
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_CHECKBOX &&
+      pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON) {
+    return false;
+  }
+
+  return m_bCanSet && vp.GetJSValue()->IsArrayObject();
+}
+
+bool Field::get_file_select(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1404,45 +1445,32 @@
   if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
     return false;
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    return true;
-  }
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT));
   return true;
 }
 
-bool Field::fillColor(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Field::set_file_select(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
+
+  CPDF_FormField* pFormField = FieldArray[0];
+  if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
+    return false;
+
+  return m_bCanSet;
+}
+
+bool Field::get_fill_color(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   CJS_Array crArray;
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    if (!vp.GetJSValue()->IsArrayObject())
-      return false;
-
-    vp >> crArray;
-
-    CFX_Color color;
-    color::ConvertArrayToPWLColor(pRuntime, crArray, &color);
-    if (m_bDelay) {
-      AddDelay_Color(FP_FILLCOLOR, color);
-    } else {
-      Field::SetFillColor(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, color);
-    }
-    return true;
-  }
   CPDF_FormField* pFormField = FieldArray[0];
   ASSERT(pFormField);
   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
@@ -1472,8 +1500,34 @@
   } else {
     return false;
   }
+
   color::ConvertPWLColorToArray(pRuntime, color, &crArray);
-  vp << crArray;
+  vp->Set(crArray);
+  return true;
+}
+
+bool Field::set_fill_color(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
+
+  if (!m_bCanSet)
+    return false;
+
+  if (!vp.GetJSValue()->IsArrayObject())
+    return false;
+
+  CJS_Array crArray = vp.ToArray();
+  CFX_Color color;
+  color::ConvertArrayToPWLColor(pRuntime, crArray, &color);
+  if (m_bDelay) {
+    AddDelay_Color(FP_FILLCOLOR, color);
+  } else {
+    Field::SetFillColor(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        color);
+  }
   return true;
 }
 
@@ -1484,29 +1538,16 @@
   // Not supported.
 }
 
-bool Field::hidden(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    if (m_bDelay) {
-      AddDelay_Bool(FP_HIDDEN, bVP);
-    } else {
-      Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                       bVP);
-    }
-    return true;
-  }
+bool Field::get_hidden(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
   CPDF_FormField* pFormField = FieldArray[0];
   ASSERT(pFormField);
+
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   CPDFSDK_Widget* pWidget =
       pInterForm->GetWidget(GetSmartFieldControl(pFormField));
@@ -1514,11 +1555,22 @@
     return false;
 
   uint32_t dwFlags = pWidget->GetFlags();
-  if (ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags)
-    vp << true;
-  else
-    vp << false;
+  vp->Set(ANNOTFLAG_INVISIBLE & dwFlags || ANNOTFLAG_HIDDEN & dwFlags);
+  return true;
+}
 
+bool Field::set_hidden(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Bool(FP_HIDDEN, vp.ToBool());
+  } else {
+    Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                     vp.ToBool());
+  }
   return true;
 }
 
@@ -1530,25 +1582,11 @@
   SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
 }
 
-bool Field::highlight(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Field::get_highlight(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
 
-    ByteString strMode;
-    vp >> strMode;
-
-    if (m_bDelay) {
-      AddDelay_String(FP_HIGHLIGHT, strMode);
-    } else {
-      Field::SetHighlight(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, strMode);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1564,24 +1602,40 @@
   int eHM = pFormControl->GetHighlightingMode();
   switch (eHM) {
     case CPDF_FormControl::None:
-      vp << L"none";
+      vp->Set(L"none");
       break;
     case CPDF_FormControl::Push:
-      vp << L"push";
+      vp->Set(L"push");
       break;
     case CPDF_FormControl::Invert:
-      vp << L"invert";
+      vp->Set(L"invert");
       break;
     case CPDF_FormControl::Outline:
-      vp << L"outline";
+      vp->Set(L"outline");
       break;
     case CPDF_FormControl::Toggle:
-      vp << L"toggle";
+      vp->Set(L"toggle");
       break;
   }
   return true;
 }
 
+bool Field::set_highlight(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_String(FP_HIGHLIGHT, vp.ToByteString());
+  } else {
+    Field::SetHighlight(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        vp.ToByteString());
+  }
+  return true;
+}
+
 void Field::SetHighlight(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
@@ -1589,30 +1643,16 @@
   // Not supported.
 }
 
-bool Field::lineWidth(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    int iWidth;
-    vp >> iWidth;
-
-    if (m_bDelay) {
-      AddDelay_Int(FP_LINEWIDTH, iWidth);
-    } else {
-      Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, iWidth);
-    }
-    return true;
-  }
+bool Field::get_line_width(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
   CPDF_FormField* pFormField = FieldArray[0];
   ASSERT(pFormField);
+
   CPDF_FormControl* pFormControl = GetSmartFieldControl(pFormField);
   if (!pFormControl)
     return false;
@@ -1625,7 +1665,22 @@
   if (!pWidget)
     return false;
 
-  vp << (int32_t)pWidget->GetBorderWidth();
+  vp->Set(pWidget->GetBorderWidth());
+  return true;
+}
+
+bool Field::set_line_width(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_LINEWIDTH, vp.ToInt());
+  } else {
+    Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        vp.ToInt());
+  }
   return true;
 }
 
@@ -1668,26 +1723,11 @@
   }
 }
 
-bool Field::multiline(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool Field::get_multiline(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-
-    if (m_bDelay) {
-      AddDelay_Bool(FP_MULTILINE, bVP);
-    } else {
-      Field::SetMultiline(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, bVP);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1696,14 +1736,27 @@
   if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
     return false;
 
-  if (pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE)
-    vp << true;
-  else
-    vp << false;
-
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_MULTILINE));
   return true;
 }
 
+bool Field::set_multiline(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+    if (!m_bCanSet)
+      return false;
+
+    if (m_bDelay) {
+      AddDelay_Bool(FP_MULTILINE, vp.ToBool());
+    } else {
+      Field::SetMultiline(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, vp.ToBool());
+    }
+    return true;
+}
+
 void Field::SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const WideString& swFieldName,
                          int nControlIndex,
@@ -1711,24 +1764,10 @@
   // Not supported.
 }
 
-bool Field::multipleSelection(CJS_Runtime* pRuntime,
-                              CJS_PropValue& vp,
-                              WideString& sError) {
+bool Field::get_multiple_selection(CJS_Runtime* pRuntime,
+                                   CJS_PropValue* vp,
+                                   WideString* sError) {
   ASSERT(m_pFormFillEnv);
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    if (m_bDelay) {
-      AddDelay_Bool(FP_MULTIPLESELECTION, bVP);
-    } else {
-      Field::SetMultipleSelection(m_pFormFillEnv.Get(), m_FieldName,
-                                  m_nFormControlIndex, bVP);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1737,7 +1776,24 @@
   if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
     return false;
 
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_MULTISELECT));
+  return true;
+}
+
+bool Field::set_multiple_selection(CJS_Runtime* pRuntime,
+                                   const CJS_PropValue& vp,
+                                   WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Bool(FP_MULTIPLESELECTION, vp.ToBool());
+  } else {
+    Field::SetMultipleSelection(m_pFormFillEnv.Get(), m_FieldName,
+                                m_nFormControlIndex, vp.ToBool());
+  }
   return true;
 }
 
@@ -1748,24 +1804,26 @@
   // Not supported.
 }
 
-bool Field::name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool Field::get_name(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  vp << m_FieldName;
+  vp->Set(m_FieldName);
   return true;
 }
 
-bool Field::numItems(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool Field::set_name(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return false;
+}
 
+bool Field::get_num_items(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1776,16 +1834,19 @@
     return false;
   }
 
-  vp << (int32_t)pFormField->CountOptions();
+  vp->Set(pFormField->CountOptions());
   return true;
 }
 
-bool Field::page(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting()) {
-    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
-    return false;
-  }
+bool Field::set_num_items(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  return false;
+}
 
+bool Field::get_page(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1797,7 +1858,7 @@
   std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
   m_pFormFillEnv->GetInterForm()->GetWidgets(pFormField, &widgets);
   if (widgets.empty()) {
-    vp << (int32_t)-1;
+    vp->Set(-1);
     return true;
   }
 
@@ -1805,7 +1866,7 @@
   int i = 0;
   for (const auto& pObserved : widgets) {
     if (!pObserved) {
-      sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
+      *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
       return false;
     }
 
@@ -1819,30 +1880,22 @@
     ++i;
   }
 
-  vp << PageArray;
+  vp->Set(PageArray);
   return true;
 }
 
-bool Field::password(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::set_page(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
+  return false;
+}
+
+bool Field::get_password(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    if (m_bDelay) {
-      AddDelay_Bool(FP_PASSWORD, bVP);
-    } else {
-      Field::SetPassword(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                         bVP);
-    }
-    return true;
-  }
-
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -1851,32 +1904,63 @@
   if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
     return false;
 
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_PASSWORD));
   return true;
 }
 
-void Field::SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                        const WideString& swFieldName,
-                        int nControlIndex,
-                        bool b) {
-  // Not supported.
+bool Field::set_password(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+    if (!m_bCanSet)
+      return false;
+
+    if (m_bDelay) {
+      AddDelay_Bool(FP_PASSWORD, vp.ToBool());
+    } else {
+      Field::SetPassword(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                         vp.ToBool());
+    }
+    return true;
+  }
+
+  void Field::SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                          const WideString& swFieldName,
+                          int nControlIndex,
+                          bool b) {
+    // Not supported.
+  }
+
+  bool Field::get_print(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
+    CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
+    std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+    if (FieldArray.empty())
+      return false;
+
+    CPDF_FormField* pFormField = FieldArray[0];
+    CPDFSDK_Widget* pWidget =
+        pInterForm->GetWidget(GetSmartFieldControl(pFormField));
+    if (!pWidget)
+      return false;
+
+    vp->Set(!!(pWidget->GetFlags() & ANNOTFLAG_PRINT));
+    return true;
 }
 
-bool Field::print(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
+bool Field::set_print(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  if (vp.IsSetting()) {
     if (!m_bCanSet)
       return false;
 
-    bool bVP;
-    vp >> bVP;
-
     for (CPDF_FormField* pFormField : FieldArray) {
       if (m_nFormControlIndex < 0) {
         bool bSet = false;
@@ -1884,7 +1968,7 @@
           if (CPDFSDK_Widget* pWidget =
                   pInterForm->GetWidget(pFormField->GetControl(i))) {
             uint32_t dwFlags = pWidget->GetFlags();
-            if (bVP)
+            if (vp.ToBool())
               dwFlags |= ANNOTFLAG_PRINT;
             else
               dwFlags &= ~ANNOTFLAG_PRINT;
@@ -1898,117 +1982,81 @@
 
         if (bSet)
           UpdateFormField(m_pFormFillEnv.Get(), pFormField, true, false, true);
-      } else {
-        if (m_nFormControlIndex >= pFormField->CountControls())
-          return false;
-        if (CPDF_FormControl* pFormControl =
-                pFormField->GetControl(m_nFormControlIndex)) {
-          if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
-            uint32_t dwFlags = pWidget->GetFlags();
-            if (bVP)
-              dwFlags |= ANNOTFLAG_PRINT;
-            else
-              dwFlags &= ~ANNOTFLAG_PRINT;
 
-            if (dwFlags != pWidget->GetFlags()) {
-              pWidget->SetFlags(dwFlags);
-              UpdateFormControl(m_pFormFillEnv.Get(),
-                                pFormField->GetControl(m_nFormControlIndex),
-                                true, false, true);
-            }
+        continue;
+      }
+
+      if (m_nFormControlIndex >= pFormField->CountControls())
+        return false;
+      if (CPDF_FormControl* pFormControl =
+              pFormField->GetControl(m_nFormControlIndex)) {
+        if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
+          uint32_t dwFlags = pWidget->GetFlags();
+          if (vp.ToBool())
+            dwFlags |= ANNOTFLAG_PRINT;
+          else
+            dwFlags &= ~ANNOTFLAG_PRINT;
+
+          if (dwFlags != pWidget->GetFlags()) {
+            pWidget->SetFlags(dwFlags);
+            UpdateFormControl(m_pFormFillEnv.Get(),
+                              pFormField->GetControl(m_nFormControlIndex), true,
+                              false, true);
           }
         }
       }
     }
     return true;
-  }
-
-  CPDF_FormField* pFormField = FieldArray[0];
-  CPDFSDK_Widget* pWidget =
-      pInterForm->GetWidget(GetSmartFieldControl(pFormField));
-  if (!pWidget)
-    return false;
-
-  vp << !!(pWidget->GetFlags() & ANNOTFLAG_PRINT);
-  return true;
 }
 
-bool Field::radiosInUnison(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           WideString& sError) {
+bool Field::get_radios_in_unison(CJS_Runtime* pRuntime,
+                                 CJS_PropValue* vp,
+                                 WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    return true;
-  }
   CPDF_FormField* pFormField = FieldArray[0];
   if (pFormField->GetFieldType() != FIELDTYPE_RADIOBUTTON)
     return false;
 
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON));
   return true;
 }
 
-bool Field::readonly(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::set_radios_in_unison(CJS_Runtime* pRuntime,
+                                 const CJS_PropValue& vp,
+                                 WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
+  return m_bCanSet;
+}
+
+bool Field::get_readonly(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    return true;
-  }
-  vp << !!(FieldArray[0]->GetFieldFlags() & FIELDFLAG_READONLY);
+  vp->Set(!!(FieldArray[0]->GetFieldFlags() & FIELDFLAG_READONLY));
   return true;
 }
 
-bool Field::rect(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  CJS_Value Upper_Leftx(pRuntime);
-  CJS_Value Upper_Lefty(pRuntime);
-  CJS_Value Lower_Rightx(pRuntime);
-  CJS_Value Lower_Righty(pRuntime);
+bool Field::set_readonly(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-    if (!vp.GetJSValue()->IsArrayObject())
-      return false;
+  return m_bCanSet;
+}
 
-    CJS_Array rcArray;
-    vp >> rcArray;
-    rcArray.GetElement(pRuntime, 0, Upper_Leftx);
-    rcArray.GetElement(pRuntime, 1, Upper_Lefty);
-    rcArray.GetElement(pRuntime, 2, Lower_Rightx);
-    rcArray.GetElement(pRuntime, 3, Lower_Righty);
-
-    float pArray[4] = {0.0f, 0.0f, 0.0f, 0.0f};
-    pArray[0] = static_cast<float>(Upper_Leftx.ToInt(pRuntime));
-    pArray[1] = static_cast<float>(Lower_Righty.ToInt(pRuntime));
-    pArray[2] = static_cast<float>(Lower_Rightx.ToInt(pRuntime));
-    pArray[3] = static_cast<float>(Upper_Lefty.ToInt(pRuntime));
-
-    CFX_FloatRect crRect(pArray);
-    if (m_bDelay) {
-      AddDelay_Rect(FP_RECT, crRect);
-    } else {
-      Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                     crRect);
-    }
-    return true;
-  }
+bool Field::get_rect(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2021,17 +2069,51 @@
     return false;
 
   CFX_FloatRect crRect = pWidget->GetRect();
-  Upper_Leftx = CJS_Value(pRuntime, static_cast<int32_t>(crRect.left));
-  Upper_Lefty = CJS_Value(pRuntime, static_cast<int32_t>(crRect.top));
-  Lower_Rightx = CJS_Value(pRuntime, static_cast<int32_t>(crRect.right));
-  Lower_Righty = CJS_Value(pRuntime, static_cast<int32_t>(crRect.bottom));
-
   CJS_Array rcArray;
-  rcArray.SetElement(pRuntime, 0, Upper_Leftx);
-  rcArray.SetElement(pRuntime, 1, Upper_Lefty);
-  rcArray.SetElement(pRuntime, 2, Lower_Rightx);
-  rcArray.SetElement(pRuntime, 3, Lower_Righty);
-  vp << rcArray;
+  rcArray.SetElement(pRuntime, 0,
+                     CJS_Value(pRuntime, static_cast<int32_t>(crRect.left)));
+  rcArray.SetElement(pRuntime, 1,
+                     CJS_Value(pRuntime, static_cast<int32_t>(crRect.top)));
+  rcArray.SetElement(pRuntime, 2,
+                     CJS_Value(pRuntime, static_cast<int32_t>(crRect.right)));
+  rcArray.SetElement(pRuntime, 3,
+                     CJS_Value(pRuntime, static_cast<int32_t>(crRect.bottom)));
+  vp->Set(rcArray);
+  return true;
+}
+
+bool Field::set_rect(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+  if (!vp.GetJSValue()->IsArrayObject())
+    return false;
+
+  CJS_Value Upper_Leftx(pRuntime);
+  CJS_Value Upper_Lefty(pRuntime);
+  CJS_Value Lower_Rightx(pRuntime);
+  CJS_Value Lower_Righty(pRuntime);
+
+  CJS_Array rcArray = vp.ToArray();
+  rcArray.GetElement(pRuntime, 0, Upper_Leftx);
+  rcArray.GetElement(pRuntime, 1, Upper_Lefty);
+  rcArray.GetElement(pRuntime, 2, Lower_Rightx);
+  rcArray.GetElement(pRuntime, 3, Lower_Righty);
+
+  float pArray[4];
+  pArray[0] = static_cast<float>(Upper_Leftx.ToInt(pRuntime));
+  pArray[1] = static_cast<float>(Lower_Righty.ToInt(pRuntime));
+  pArray[2] = static_cast<float>(Lower_Rightx.ToInt(pRuntime));
+  pArray[3] = static_cast<float>(Upper_Lefty.ToInt(pRuntime));
+
+  CFX_FloatRect crRect(pArray);
+  if (m_bDelay) {
+    AddDelay_Rect(FP_RECT, crRect);
+  } else {
+    Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                   crRect);
+  }
   return true;
 }
 
@@ -2068,24 +2150,26 @@
 
       if (bSet)
         UpdateFormField(pFormFillEnv, pFormField, true, true, true);
-    } else {
-      if (nControlIndex >= pFormField->CountControls())
-        return;
-      if (CPDF_FormControl* pFormControl =
-              pFormField->GetControl(nControlIndex)) {
-        if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
-          CFX_FloatRect crRect = rect;
 
-          CPDF_Page* pPDFPage = pWidget->GetPDFPage();
-          crRect.Intersect(pPDFPage->GetPageBBox());
+      continue;
+    }
 
-          if (!crRect.IsEmpty()) {
-            CFX_FloatRect rcOld = pWidget->GetRect();
-            if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
-                crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
-              pWidget->SetRect(crRect);
-              UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
-            }
+    if (nControlIndex >= pFormField->CountControls())
+      return;
+    if (CPDF_FormControl* pFormControl =
+            pFormField->GetControl(nControlIndex)) {
+      if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
+        CFX_FloatRect crRect = rect;
+
+        CPDF_Page* pPDFPage = pWidget->GetPDFPage();
+        crRect.Intersect(pPDFPage->GetPageBBox());
+
+        if (!crRect.IsEmpty()) {
+          CFX_FloatRect rcOld = pWidget->GetRect();
+          if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
+              crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
+            pWidget->SetRect(crRect);
+            UpdateFormControl(pFormFillEnv, pFormControl, true, true, true);
           }
         }
       }
@@ -2093,46 +2177,36 @@
   }
 }
 
-bool Field::required(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::get_required(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    return true;
-  }
   CPDF_FormField* pFormField = FieldArray[0];
   if (pFormField->GetFieldType() == FIELDTYPE_PUSHBUTTON)
     return false;
 
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_REQUIRED));
   return true;
 }
 
-bool Field::richText(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::set_required(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
+  if (FieldArray.empty())
+    return false;
+
+  return m_bCanSet;
+}
+
+bool Field::get_rich_text(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    bool bVP;
-    vp >> bVP;
-    if (m_bDelay)
-      AddDelay_Bool(FP_RICHTEXT, bVP);
-
-    return true;
-  }
-
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2141,35 +2215,41 @@
   if (pFormField->GetFieldType() != FIELDTYPE_TEXTFIELD)
     return false;
 
-  vp << !!(pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT);
+  vp->Set(!!(pFormField->GetFieldFlags() & FIELDFLAG_RICHTEXT));
   return true;
 }
 
-bool Field::richValue(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
-  return true;
-}
-
-bool Field::rotation(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::set_rich_text(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
+  if (!m_bCanSet)
+    return false;
 
-    int nVP;
-    vp >> nVP;
-    if (m_bDelay) {
-      AddDelay_Int(FP_ROTATION, nVP);
-    } else {
-      Field::SetRotation(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                         nVP);
-    }
-    return true;
-  }
+  if (m_bDelay)
+    AddDelay_Bool(FP_RICHTEXT, vp.ToBool());
+
+  return true;
+}
+
+bool Field::get_rich_value(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
+  return true;
+}
+
+bool Field::set_rich_value(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return true;
+}
+
+bool Field::get_rotation(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2179,7 +2259,23 @@
   if (!pFormControl)
     return false;
 
-  vp << (int32_t)pFormControl->GetRotation();
+  vp->Set(pFormControl->GetRotation());
+  return true;
+}
+
+bool Field::set_rotation(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  ASSERT(m_pFormFillEnv);
+  if (m_bDelay) {
+    AddDelay_Int(FP_ROTATION, vp.ToInt());
+  } else {
+    Field::SetRotation(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                       vp.ToInt());
+  }
   return true;
 }
 
@@ -2190,30 +2286,9 @@
   // Not supported.
 }
 
-bool Field::strokeColor(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
-  CJS_Array crArray;
-
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    if (!vp.GetJSValue()->IsArrayObject())
-      return false;
-
-    vp >> crArray;
-
-    CFX_Color color;
-    color::ConvertArrayToPWLColor(pRuntime, crArray, &color);
-    if (m_bDelay) {
-      AddDelay_Color(FP_STROKECOLOR, color);
-    } else {
-      Field::SetStrokeColor(m_pFormFillEnv.Get(), m_FieldName,
-                            m_nFormControlIndex, color);
-    }
-    return true;
-  }
+bool Field::get_stroke_color(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2245,8 +2320,30 @@
     return false;
   }
 
+  CJS_Array crArray;
   color::ConvertPWLColorToArray(pRuntime, color, &crArray);
-  vp << crArray;
+  vp->Set(crArray);
+  return true;
+}
+
+bool Field::set_stroke_color(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  if (!vp.GetJSValue()->IsArrayObject())
+    return false;
+
+  CJS_Array crArray = vp.ToArray();
+  CFX_Color color;
+  color::ConvertArrayToPWLColor(pRuntime, crArray, &color);
+  if (m_bDelay) {
+    AddDelay_Color(FP_STROKECOLOR, color);
+  } else {
+    Field::SetStrokeColor(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, color);
+  }
   return true;
 }
 
@@ -2257,26 +2354,11 @@
   // Not supported.
 }
 
-bool Field::style(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
+bool Field::get_style(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    ByteString csBCaption;
-    vp >> csBCaption;
-
-    if (m_bDelay) {
-      AddDelay_String(FP_STYLE, csBCaption);
-    } else {
-      Field::SetStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                      csBCaption);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2314,7 +2396,24 @@
       csBCaption = "check";
       break;
   }
-  vp << csBCaption;
+  vp->Set(csBCaption);
+  return true;
+}
+
+bool Field::set_style(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_String(FP_STYLE, vp.ToByteString());
+  } else {
+    Field::SetStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                    vp.ToByteString());
+  }
   return true;
 }
 
@@ -2325,36 +2424,21 @@
   // Not supported.
 }
 
-bool Field::submitName(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool Field::get_submit_name(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   return true;
 }
 
-bool Field::textColor(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
-  CJS_Array crArray;
+bool Field::set_submit_name(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return true;
+}
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    if (!vp.GetJSValue()->IsArrayObject())
-      return false;
-
-    vp >> crArray;
-
-    CFX_Color color;
-    color::ConvertArrayToPWLColor(pRuntime, crArray, &color);
-    if (m_bDelay) {
-      AddDelay_Color(FP_TEXTCOLOR, color);
-    } else {
-      Field::SetTextColor(m_pFormFillEnv.Get(), m_FieldName,
-                          m_nFormControlIndex, color);
-    }
-    return true;
-  }
+bool Field::get_text_color(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2381,8 +2465,31 @@
   if (iColorType == CFX_Color::kTransparent)
     crRet = CFX_Color(CFX_Color::kTransparent);
 
+  CJS_Array crArray;
   color::ConvertPWLColorToArray(pRuntime, crRet, &crArray);
-  vp << crArray;
+  vp->Set(crArray);
+  return true;
+}
+
+bool Field::set_text_color(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  if (!vp.GetJSValue()->IsArrayObject())
+    return false;
+
+  CJS_Array crArray = vp.ToArray();
+  CFX_Color color;
+  color::ConvertArrayToPWLColor(pRuntime, crArray, &color);
+
+  if (m_bDelay) {
+    AddDelay_Color(FP_TEXTCOLOR, color);
+  } else {
+    Field::SetTextColor(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                        color);
+  }
   return true;
 }
 
@@ -2393,28 +2500,11 @@
   // Not supported.
 }
 
-bool Field::textFont(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::get_text_font(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    ByteString csFontName;
-    vp >> csFontName;
-    if (csFontName.IsEmpty())
-      return false;
-
-    if (m_bDelay) {
-      AddDelay_String(FP_TEXTFONT, csFontName);
-    } else {
-      Field::SetTextFont(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                         csFontName);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2434,10 +2524,31 @@
   if (!pFont)
     return false;
 
-  vp << pFont->GetBaseFont();
+  vp->Set(pFont->GetBaseFont());
   return true;
 }
 
+bool Field::set_text_font(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+    if (!m_bCanSet)
+      return false;
+
+    ByteString fontName = vp.ToByteString();
+    if (fontName.IsEmpty())
+      return false;
+
+    if (m_bDelay) {
+      AddDelay_String(FP_TEXTFONT, fontName);
+    } else {
+      Field::SetTextFont(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                         fontName);
+    }
+    return true;
+}
+
 void Field::SetTextFont(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const WideString& swFieldName,
                         int nControlIndex,
@@ -2445,25 +2556,11 @@
   // Not supported.
 }
 
-bool Field::textSize(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::get_text_size(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    int nVP;
-    vp >> nVP;
-    if (m_bDelay) {
-      AddDelay_Int(FP_TEXTSIZE, nVP);
-    } else {
-      Field::SetTextSize(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                         nVP);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2477,7 +2574,24 @@
   float fFontSize;
   CPDF_DefaultAppearance FieldAppearance = pFormControl->GetDefaultAppearance();
   FieldAppearance.GetFont(&fFontSize);
-  vp << static_cast<int>(fFontSize);
+  vp->Set(static_cast<int>(fFontSize));
+  return true;
+}
+
+bool Field::set_text_size(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+  if (!m_bCanSet)
+    return false;
+
+  if (m_bDelay) {
+    AddDelay_Int(FP_TEXTSIZE, vp.ToInt());
+  } else {
+    Field::SetTextSize(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                       vp.ToInt());
+  }
   return true;
 }
 
@@ -2488,10 +2602,9 @@
   // Not supported.
 }
 
-bool Field::type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool Field::get_type(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2499,64 +2612,72 @@
   CPDF_FormField* pFormField = FieldArray[0];
   switch (pFormField->GetFieldType()) {
     case FIELDTYPE_UNKNOWN:
-      vp << L"unknown";
+      vp->Set(L"unknown");
       break;
     case FIELDTYPE_PUSHBUTTON:
-      vp << L"button";
+      vp->Set(L"button");
       break;
     case FIELDTYPE_CHECKBOX:
-      vp << L"checkbox";
+      vp->Set(L"checkbox");
       break;
     case FIELDTYPE_RADIOBUTTON:
-      vp << L"radiobutton";
+      vp->Set(L"radiobutton");
       break;
     case FIELDTYPE_COMBOBOX:
-      vp << L"combobox";
+      vp->Set(L"combobox");
       break;
     case FIELDTYPE_LISTBOX:
-      vp << L"listbox";
+      vp->Set(L"listbox");
       break;
     case FIELDTYPE_TEXTFIELD:
-      vp << L"text";
+      vp->Set(L"text");
       break;
     case FIELDTYPE_SIGNATURE:
-      vp << L"signature";
+      vp->Set(L"signature");
       break;
     default:
-      vp << L"unknown";
+      vp->Set(L"unknown");
       break;
   }
   return true;
 }
 
-bool Field::userName(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool Field::set_type(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return false;
+}
+
+bool Field::get_user_name(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    WideString swName;
-    vp >> swName;
-
-    if (m_bDelay) {
-      AddDelay_WideString(FP_USERNAME, swName);
-    } else {
-      Field::SetUserName(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                         swName);
-    }
-    return true;
-  }
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
 
-  vp << FieldArray[0]->GetAlternateName();
+  vp->Set(FieldArray[0]->GetAlternateName());
   return true;
 }
 
+bool Field::set_user_name(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  ASSERT(m_pFormFillEnv);
+
+    if (!m_bCanSet)
+      return false;
+
+    if (m_bDelay) {
+      AddDelay_WideString(FP_USERNAME, vp.ToWideString());
+    } else {
+      Field::SetUserName(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                         vp.ToWideString());
+    }
+    return true;
+}
+
 void Field::SetUserName(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const WideString& swFieldName,
                         int nControlIndex,
@@ -2564,37 +2685,9 @@
   // Not supported.
 }
 
-bool Field::value(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
-  if (vp.IsSetting()) {
-    if (!m_bCanSet)
-      return false;
-
-    std::vector<WideString> strArray;
-    if (vp.GetJSValue()->IsArrayObject()) {
-      CJS_Array ValueArray;
-      vp.GetJSValue()->ConvertToArray(pRuntime, ValueArray);
-      for (int i = 0, sz = ValueArray.GetLength(pRuntime); i < sz; i++) {
-        CJS_Value ElementValue(pRuntime);
-        ValueArray.GetElement(pRuntime, i, ElementValue);
-        strArray.push_back(ElementValue.ToCFXWideString(pRuntime));
-      }
-    } else {
-      WideString swValue;
-      vp >> swValue;
-      strArray.push_back(swValue);
-    }
-
-    if (m_bDelay) {
-      AddDelay_WideStringArray(FP_VALUE, strArray);
-    } else {
-      Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                      strArray);
-    }
-    return true;
-  }
-
+bool Field::get_value(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2604,9 +2697,9 @@
     case FIELDTYPE_PUSHBUTTON:
       return false;
     case FIELDTYPE_COMBOBOX:
-    case FIELDTYPE_TEXTFIELD: {
-      vp << pFormField->GetValue();
-    } break;
+    case FIELDTYPE_TEXTFIELD:
+      vp->Set(pFormField->GetValue());
+      break;
     case FIELDTYPE_LISTBOX: {
       if (pFormField->CountSelectedItems() > 1) {
         CJS_Array ValueArray;
@@ -2622,29 +2715,59 @@
           }
           ValueArray.SetElement(pRuntime, i, ElementValue);
         }
-        vp << ValueArray;
+        vp->Set(ValueArray);
       } else {
-        vp << pFormField->GetValue();
+        vp->Set(pFormField->GetValue());
       }
-    } break;
+      break;
+    }
     case FIELDTYPE_CHECKBOX:
     case FIELDTYPE_RADIOBUTTON: {
       bool bFind = false;
       for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
         if (pFormField->GetControl(i)->IsChecked()) {
-          vp << pFormField->GetControl(i)->GetExportValue();
+          vp->Set(pFormField->GetControl(i)->GetExportValue());
           bFind = true;
           break;
         }
       }
       if (!bFind)
-        vp << L"Off";
-    } break;
+        vp->Set(L"Off");
+
+      break;
+    }
     default:
-      vp << pFormField->GetValue();
+      vp->Set(pFormField->GetValue());
       break;
   }
-  vp.GetJSValue()->MaybeCoerceToNumber(pRuntime);
+  vp->GetJSValue()->MaybeCoerceToNumber(pRuntime);
+  return true;
+}
+
+bool Field::set_value(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  if (!m_bCanSet)
+    return false;
+
+  std::vector<WideString> strArray;
+  if (vp.GetJSValue()->IsArrayObject()) {
+    CJS_Array ValueArray = vp.ToArray();
+    for (int i = 0, sz = ValueArray.GetLength(pRuntime); i < sz; i++) {
+      CJS_Value ElementValue(pRuntime);
+      ValueArray.GetElement(pRuntime, i, ElementValue);
+      strArray.push_back(ElementValue.ToCFXWideString(pRuntime));
+    }
+  } else {
+    strArray.push_back(vp.ToWideString());
+  }
+
+  if (m_bDelay) {
+    AddDelay_WideStringArray(FP_VALUE, strArray);
+  } else {
+    Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                    strArray);
+  }
   return true;
 }
 
@@ -2702,12 +2825,9 @@
   }
 }
 
-bool Field::valueAsString(CJS_Runtime* pRuntime,
-                          CJS_PropValue& vp,
-                          WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool Field::get_value_as_string(CJS_Runtime* pRuntime,
+                                CJS_PropValue* vp,
+                                WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2720,30 +2840,39 @@
     if (!pFormField->CountControls())
       return false;
 
-    if (pFormField->GetControl(0)->IsChecked())
-      vp << L"Yes";
-    else
-      vp << L"Off";
-  } else if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON &&
-             !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)) {
+    vp->Set(pFormField->GetControl(0)->IsChecked() ? L"Yes" : L"Off");
+    return true;
+  }
+
+  if (pFormField->GetFieldType() == FIELDTYPE_RADIOBUTTON &&
+      !(pFormField->GetFieldFlags() & FIELDFLAG_RADIOSINUNISON)) {
     for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
       if (pFormField->GetControl(i)->IsChecked()) {
-        vp << pFormField->GetControl(i)->GetExportValue().c_str();
+        vp->Set(pFormField->GetControl(i)->GetExportValue().c_str());
         break;
       } else {
-        vp << L"Off";
+        vp->Set(L"Off");
       }
     }
-  } else if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX &&
-             (pFormField->CountSelectedItems() > 1)) {
-    vp << L"";
+    return true;
+  }
+
+  if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX &&
+      (pFormField->CountSelectedItems() > 1)) {
+    vp->Set(L"");
   } else {
-    vp << pFormField->GetValue().c_str();
+    vp->Set(pFormField->GetValue().c_str());
   }
 
   return true;
 }
 
+bool Field::set_value_as_string(CJS_Runtime* pRuntime,
+                                const CJS_PropValue& vp,
+                                WideString* sError) {
+  return false;
+}
+
 bool Field::browseForFileToSubmit(CJS_Runtime* pRuntime,
                                   const std::vector<CJS_Value>& params,
                                   CJS_Value& vRet,
@@ -3174,13 +3303,16 @@
   return false;
 }
 
-bool Field::source(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (vp.IsGetting()) {
-    vp << (CJS_Object*)nullptr;
-  }
+bool Field::get_source(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
+  vp->Set(static_cast<CJS_Object*>(nullptr));
+  return true;
+}
 
+bool Field::set_source(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
   return true;
 }
 
diff --git a/fpdfsdk/javascript/Field.h b/fpdfsdk/javascript/Field.h
index 69e27d0..bd90ff7 100644
--- a/fpdfsdk/javascript/Field.h
+++ b/fpdfsdk/javascript/Field.h
@@ -77,96 +77,345 @@
   explicit Field(CJS_Object* pJSObject);
   ~Field() override;
 
-  bool alignment(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool borderStyle(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError);
-  bool buttonAlignX(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool buttonAlignY(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool buttonFitBounds(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError);
-  bool buttonPosition(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError);
-  bool buttonScaleHow(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError);
-  bool buttonScaleWhen(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError);
-  bool calcOrderIndex(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError);
-  bool charLimit(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool comb(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool commitOnSelChange(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError);
-  bool currentValueIndices(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           WideString& sError);
-  bool defaultStyle(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool defaultValue(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool doNotScroll(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError);
-  bool doNotSpellCheck(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError);
-  bool delay(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool display(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool doc(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool editable(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool exportValues(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool fileSelect(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool fillColor(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool hidden(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool highlight(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool lineWidth(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool multiline(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool multipleSelection(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError);
-  bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool numItems(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool page(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool password(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool print(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool radiosInUnison(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError);
-  bool readonly(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool rect(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool required(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool richText(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool richValue(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool rotation(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool strokeColor(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError);
-  bool style(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool submitName(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool textColor(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool textFont(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool textSize(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool userName(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool value(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool valueAsString(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError);
-  bool source(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
+  bool get_alignment(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_alignment(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_border_style(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError);
+  bool set_border_style(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError);
+
+  bool get_button_align_x(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError);
+  bool set_button_align_x(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError);
+
+  bool get_button_align_y(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError);
+  bool set_button_align_y(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError);
+
+  bool get_button_fit_bounds(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError);
+  bool set_button_fit_bounds(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError);
+
+  bool get_button_position(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError);
+  bool set_button_position(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError);
+
+  bool get_button_scale_how(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError);
+  bool set_button_scale_how(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError);
+
+  bool get_button_scale_when(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError);
+  bool set_button_scale_when(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError);
+
+  bool get_calc_order_index(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError);
+  bool set_calc_order_index(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError);
+
+  bool get_char_limit(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_char_limit(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_comb(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_comb(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_commit_on_sel_change(CJS_Runtime* pRuntime,
+                                CJS_PropValue* vp,
+                                WideString* sError);
+  bool set_commit_on_sel_change(CJS_Runtime* pRuntime,
+                                const CJS_PropValue& vp,
+                                WideString* sError);
+
+  bool get_current_value_indices(CJS_Runtime* pRuntime,
+                                 CJS_PropValue* vp,
+                                 WideString* sError);
+  bool set_current_value_indices(CJS_Runtime* pRuntime,
+                                 const CJS_PropValue& vp,
+                                 WideString* sError);
+
+  bool get_default_style(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_default_style(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_default_value(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_default_value(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_do_not_scroll(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_do_not_scroll(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_do_not_spell_check(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError);
+  bool set_do_not_spell_check(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError);
+
+  bool get_delay(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_delay(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_display(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_display(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_doc(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_doc(CJS_Runtime* pRuntime,
+               const CJS_PropValue& vp,
+               WideString* sError);
+
+  bool get_editable(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_editable(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_export_values(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_export_values(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_file_select(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_file_select(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_fill_color(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_fill_color(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_hidden(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_hidden(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_highlight(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_highlight(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_line_width(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_line_width(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_multiline(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_multiline(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_multiple_selection(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              WideString* sError);
+  bool set_multiple_selection(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              WideString* sError);
+
+  bool get_name(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_num_items(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_num_items(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_page(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_page(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_password(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_password(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_print(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_print(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_radios_in_unison(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError);
+  bool set_radios_in_unison(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError);
+
+  bool get_readonly(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_readonly(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_rect(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_rect(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_required(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_required(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_rich_text(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_rich_text(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_rich_value(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_rich_value(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_rotation(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_rotation(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_stroke_color(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError);
+  bool set_stroke_color(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError);
+
+  bool get_style(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_style(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_submit_name(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_submit_name(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_text_color(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_text_color(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_text_font(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_text_font(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_text_size(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_text_size(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_type(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_type(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_user_name(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_user_name(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_value(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_value(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_value_as_string(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError);
+  bool set_value_as_string(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError);
+
+  bool get_source(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_source(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
 
   bool browseForFileToSubmit(CJS_Runtime* pRuntime,
                              const std::vector<CJS_Value>& params,
@@ -472,58 +721,58 @@
   void InitInstance(IJS_Runtime* pIRuntime) override;
 
   DECLARE_JS_CLASS();
-  JS_STATIC_PROP(alignment, Field);
-  JS_STATIC_PROP(borderStyle, Field);
-  JS_STATIC_PROP(buttonAlignX, Field);
-  JS_STATIC_PROP(buttonAlignY, Field);
-  JS_STATIC_PROP(buttonFitBounds, Field);
-  JS_STATIC_PROP(buttonPosition, Field);
-  JS_STATIC_PROP(buttonScaleHow, Field);
-  JS_STATIC_PROP(buttonScaleWhen, Field);
-  JS_STATIC_PROP(calcOrderIndex, Field);
-  JS_STATIC_PROP(charLimit, Field);
-  JS_STATIC_PROP(comb, Field);
-  JS_STATIC_PROP(commitOnSelChange, Field);
-  JS_STATIC_PROP(currentValueIndices, Field);
-  JS_STATIC_PROP(defaultStyle, Field);
-  JS_STATIC_PROP(defaultValue, Field);
-  JS_STATIC_PROP(doNotScroll, Field);
-  JS_STATIC_PROP(doNotSpellCheck, Field);
-  JS_STATIC_PROP(delay, Field);
-  JS_STATIC_PROP(display, Field);
-  JS_STATIC_PROP(doc, Field);
-  JS_STATIC_PROP(editable, Field);
-  JS_STATIC_PROP(exportValues, Field);
-  JS_STATIC_PROP(fileSelect, Field);
-  JS_STATIC_PROP(fillColor, Field);
-  JS_STATIC_PROP(hidden, Field);
-  JS_STATIC_PROP(highlight, Field);
-  JS_STATIC_PROP(lineWidth, Field);
-  JS_STATIC_PROP(multiline, Field);
-  JS_STATIC_PROP(multipleSelection, Field);
-  JS_STATIC_PROP(name, Field);
-  JS_STATIC_PROP(numItems, Field);
-  JS_STATIC_PROP(page, Field);
-  JS_STATIC_PROP(password, Field);
-  JS_STATIC_PROP(print, Field);
-  JS_STATIC_PROP(radiosInUnison, Field);
-  JS_STATIC_PROP(readonly, Field);
-  JS_STATIC_PROP(rect, Field);
-  JS_STATIC_PROP(required, Field);
-  JS_STATIC_PROP(richText, Field);
-  JS_STATIC_PROP(richValue, Field);
-  JS_STATIC_PROP(rotation, Field);
-  JS_STATIC_PROP(strokeColor, Field);
-  JS_STATIC_PROP(style, Field);
-  JS_STATIC_PROP(submitName, Field);
-  JS_STATIC_PROP(textColor, Field);
-  JS_STATIC_PROP(textFont, Field);
-  JS_STATIC_PROP(textSize, Field);
-  JS_STATIC_PROP(type, Field);
-  JS_STATIC_PROP(userName, Field);
-  JS_STATIC_PROP(value, Field);
-  JS_STATIC_PROP(valueAsString, Field);
-  JS_STATIC_PROP(source, Field);
+  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);
diff --git a/fpdfsdk/javascript/Icon.cpp b/fpdfsdk/javascript/Icon.cpp
index 47781dd..6083307 100644
--- a/fpdfsdk/javascript/Icon.cpp
+++ b/fpdfsdk/javascript/Icon.cpp
@@ -25,10 +25,15 @@
 
 Icon::~Icon() {}
 
-bool Icon::name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
-  vp << m_swIconName;
+bool Icon::get_name(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError) {
+  vp->Set(m_swIconName);
   return true;
 }
+
+bool Icon::set_name(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError) {
+  return false;
+}
diff --git a/fpdfsdk/javascript/Icon.h b/fpdfsdk/javascript/Icon.h
index e856ee9..df2e4bd 100644
--- a/fpdfsdk/javascript/Icon.h
+++ b/fpdfsdk/javascript/Icon.h
@@ -16,7 +16,11 @@
   explicit Icon(CJS_Object* pJSObject);
   ~Icon() override;
 
-  bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
+  bool get_name(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
   WideString GetIconName() const { return m_swIconName; }
   void SetIconName(WideString name) { m_swIconName = name; }
 
@@ -30,7 +34,7 @@
   ~CJS_Icon() override {}
 
   DECLARE_JS_CLASS();
-  JS_STATIC_PROP(name, Icon);
+  JS_STATIC_PROP(name, name, Icon);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_ICON_H_
diff --git a/fpdfsdk/javascript/JS_Define.h b/fpdfsdk/javascript/JS_Define.h
index 470a8fe..24ce23d 100644
--- a/fpdfsdk/javascript/JS_Define.h
+++ b/fpdfsdk/javascript/JS_Define.h
@@ -34,7 +34,7 @@
   v8::FunctionCallback pMethodCall;
 };
 
-template <class C, bool (C::*M)(CJS_Runtime*, CJS_PropValue&, WideString&)>
+template <class C, bool (C::*M)(CJS_Runtime*, CJS_PropValue*, WideString*)>
 void JSPropGetter(const char* prop_name_string,
                   const char* class_name_string,
                   v8::Local<v8::String> property,
@@ -43,15 +43,18 @@
       CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
   if (!pRuntime)
     return;
+
   CJS_Object* pJSObj =
       static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
   if (!pJSObj)
     return;
+
   C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
   WideString sError;
+
   CJS_PropValue value(pRuntime);
   value.StartGetting();
-  if (!(pObj->*M)(pRuntime, value, sError)) {
+  if (!(pObj->*M)(pRuntime, &value, &sError)) {
     pRuntime->Error(
         JSFormatErrorString(class_name_string, prop_name_string, sError));
     return;
@@ -59,7 +62,8 @@
   info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(pRuntime));
 }
 
-template <class C, bool (C::*M)(CJS_Runtime*, CJS_PropValue&, WideString&)>
+template <class C,
+          bool (C::*M)(CJS_Runtime*, const CJS_PropValue&, WideString*)>
 void JSPropSetter(const char* prop_name_string,
                   const char* class_name_string,
                   v8::Local<v8::String> property,
@@ -69,32 +73,35 @@
       CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
   if (!pRuntime)
     return;
+
   CJS_Object* pJSObj =
       static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
   if (!pJSObj)
     return;
+
   C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
   WideString sError;
+
   CJS_PropValue propValue(pRuntime, CJS_Value(pRuntime, value));
   propValue.StartSetting();
-  if (!(pObj->*M)(pRuntime, propValue, sError)) {
+  if (!(pObj->*M)(pRuntime, propValue, &sError)) {
     pRuntime->Error(
         JSFormatErrorString(class_name_string, prop_name_string, sError));
   }
 }
 
-#define JS_STATIC_PROP(prop_name, class_name)                                 \
-  static void get_##prop_name##_static(                                       \
-      v8::Local<v8::String> property,                                         \
-      const v8::PropertyCallbackInfo<v8::Value>& info) {                      \
-    JSPropGetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \
-                                                     property, info);         \
-  }                                                                           \
-  static void set_##prop_name##_static(                                       \
-      v8::Local<v8::String> property, v8::Local<v8::Value> value,             \
-      const v8::PropertyCallbackInfo<void>& info) {                           \
-    JSPropSetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \
-                                                     property, value, info);  \
+#define JS_STATIC_PROP(err_name, prop_name, class_name)           \
+  static void get_##prop_name##_static(                           \
+      v8::Local<v8::String> property,                             \
+      const v8::PropertyCallbackInfo<v8::Value>& info) {          \
+    JSPropGetter<class_name, &class_name::get_##prop_name>(       \
+        #err_name, #class_name, property, info);                  \
+  }                                                               \
+  static void set_##prop_name##_static(                           \
+      v8::Local<v8::String> property, v8::Local<v8::Value> value, \
+      const v8::PropertyCallbackInfo<void>& info) {               \
+    JSPropSetter<class_name, &class_name::set_##prop_name>(       \
+        #err_name, #class_name, property, value, info);           \
   }
 
 template <class C,
@@ -349,11 +356,11 @@
   v8::String::Utf8Value utf8_value(property);
   WideString propname =
       WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
-  WideString sError;
+
   CJS_PropValue value(pRuntime);
   value.StartGetting();
-  if (!pObj->DoProperty(pRuntime, propname.c_str(), value, sError)) {
-    pRuntime->Error(JSFormatErrorString(class_name, "GetProperty", sError));
+  if (!pObj->GetProperty(pRuntime, propname.c_str(), &value)) {
+    pRuntime->Error(JSFormatErrorString(class_name, "GetProperty", L""));
     return;
   }
   info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(pRuntime));
@@ -378,11 +385,10 @@
   v8::String::Utf8Value utf8_value(property);
   WideString propname =
       WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
-  WideString sError;
   CJS_PropValue PropValue(pRuntime, CJS_Value(pRuntime, value));
   PropValue.StartSetting();
-  if (!pObj->DoProperty(pRuntime, propname.c_str(), PropValue, sError)) {
-    pRuntime->Error(JSFormatErrorString(class_name, "PutProperty", sError));
+  if (!pObj->SetProperty(pRuntime, propname.c_str(), PropValue)) {
+    pRuntime->Error(JSFormatErrorString(class_name, "PutProperty", L""));
   }
 }
 
@@ -404,8 +410,7 @@
   v8::String::Utf8Value utf8_value(property);
   WideString propname =
       WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
-  WideString sError;
-  if (!pObj->DelProperty(pRuntime, propname.c_str(), sError)) {
+  if (!pObj->DelProperty(pRuntime, propname.c_str())) {
     ByteString cbName;
     cbName.Format("%s.%s", class_name, "DelProperty");
     // Probably a missing call to JSFX_Error().
diff --git a/fpdfsdk/javascript/JS_Value.cpp b/fpdfsdk/javascript/JS_Value.cpp
index ee81102..6529a9d 100644
--- a/fpdfsdk/javascript/JS_Value.cpp
+++ b/fpdfsdk/javascript/JS_Value.cpp
@@ -338,107 +338,111 @@
 
 CJS_PropValue::~CJS_PropValue() {}
 
-void CJS_PropValue::operator<<(int iValue) {
+void CJS_PropValue::Set(int iValue) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), iValue);
 }
 
-void CJS_PropValue::operator>>(int& iValue) const {
+int CJS_PropValue::ToInt() const {
   ASSERT(m_bIsSetting);
-  iValue = m_Value.ToInt(m_pJSRuntime.Get());
+  return m_Value.ToInt(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(bool bValue) {
+void CJS_PropValue::Set(bool bValue) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), bValue);
 }
 
-void CJS_PropValue::operator>>(bool& bValue) const {
+bool CJS_PropValue::ToBool() const {
   ASSERT(m_bIsSetting);
-  bValue = m_Value.ToBool(m_pJSRuntime.Get());
+  return m_Value.ToBool(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(double dValue) {
+void CJS_PropValue::Set(double dValue) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), dValue);
 }
 
-void CJS_PropValue::operator>>(double& dValue) const {
+double CJS_PropValue::ToDouble() const {
   ASSERT(m_bIsSetting);
-  dValue = m_Value.ToDouble(m_pJSRuntime.Get());
+  return m_Value.ToDouble(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(CJS_Object* pObj) {
+void CJS_PropValue::Set(CJS_Object* pObj) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), pObj);
 }
 
-void CJS_PropValue::operator>>(CJS_Object*& ppObj) const {
+CJS_Object* CJS_PropValue::ToObject() const {
   ASSERT(m_bIsSetting);
-  ppObj = m_Value.ToCJSObject(m_pJSRuntime.Get());
+  return m_Value.ToCJSObject(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(CJS_Document* pJsDoc) {
+void CJS_PropValue::Set(CJS_Document* pJsDoc) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), pJsDoc);
 }
 
-void CJS_PropValue::operator>>(CJS_Document*& ppJsDoc) const {
+CJS_Document* CJS_PropValue::ToDocument() const {
   ASSERT(m_bIsSetting);
-  ppJsDoc = static_cast<CJS_Document*>(m_Value.ToCJSObject(m_pJSRuntime.Get()));
+  return static_cast<CJS_Document*>(m_Value.ToCJSObject(m_pJSRuntime.Get()));
 }
 
-void CJS_PropValue::operator<<(v8::Local<v8::Object> pObj) {
+void CJS_PropValue::Set(v8::Local<v8::Object> pObj) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), pObj);
 }
 
-void CJS_PropValue::operator>>(v8::Local<v8::Object>& ppObj) const {
+v8::Local<v8::Object> CJS_PropValue::ToV8Object() const {
   ASSERT(m_bIsSetting);
-  ppObj = m_Value.ToV8Object(m_pJSRuntime.Get());
+  return m_Value.ToV8Object(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(ByteString str) {
+void CJS_PropValue::Set(const ByteString& str) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), str.c_str());
 }
 
-void CJS_PropValue::operator>>(ByteString& str) const {
+ByteString CJS_PropValue::ToByteString() const {
   ASSERT(m_bIsSetting);
-  str = m_Value.ToCFXByteString(m_pJSRuntime.Get());
+  return m_Value.ToCFXByteString(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(const wchar_t* str) {
+void CJS_PropValue::Set(const wchar_t* str) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), str);
 }
 
-void CJS_PropValue::operator>>(WideString& wide_string) const {
+WideString CJS_PropValue::ToWideString() const {
   ASSERT(m_bIsSetting);
-  wide_string = m_Value.ToCFXWideString(m_pJSRuntime.Get());
+  return m_Value.ToCFXWideString(m_pJSRuntime.Get());
 }
 
-void CJS_PropValue::operator<<(WideString wide_string) {
+void CJS_PropValue::Set(const WideString& wide_string) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), wide_string.c_str());
 }
 
-void CJS_PropValue::operator>>(CJS_Array& array) const {
+CJS_Array CJS_PropValue::ToArray() const {
   ASSERT(m_bIsSetting);
-  m_Value.ConvertToArray(m_pJSRuntime.Get(), array);
+  CJS_Array ary;
+  m_Value.ConvertToArray(m_pJSRuntime.Get(), ary);
+  return ary;
 }
 
-void CJS_PropValue::operator<<(CJS_Array& array) {
+void CJS_PropValue::Set(const CJS_Array& array) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), array.ToV8Array(m_pJSRuntime.Get()));
 }
 
-void CJS_PropValue::operator>>(CJS_Date& date) const {
+CJS_Date CJS_PropValue::ToDate() const {
   ASSERT(m_bIsSetting);
+  CJS_Date date;
   m_Value.ConvertToDate(m_pJSRuntime.Get(), date);
+  return date;
 }
 
-void CJS_PropValue::operator<<(CJS_Date& date) {
+void CJS_PropValue::Set(const CJS_Date& date) {
   ASSERT(!m_bIsSetting);
   m_Value = CJS_Value(m_pJSRuntime.Get(), date);
 }
@@ -496,6 +500,8 @@
                    int sec)
     : m_pDate(pRuntime->NewDate(MakeDate(year, mon, day, hour, min, sec, 0))) {}
 
+CJS_Date::CJS_Date(const CJS_Date& other) = default;
+
 CJS_Date::~CJS_Date() {}
 
 bool CJS_Date::IsValidDate(CJS_Runtime* pRuntime) const {
diff --git a/fpdfsdk/javascript/JS_Value.h b/fpdfsdk/javascript/JS_Value.h
index 8c94ca7..47e8cce 100644
--- a/fpdfsdk/javascript/JS_Value.h
+++ b/fpdfsdk/javascript/JS_Value.h
@@ -90,29 +90,39 @@
   bool IsGetting() const { return !m_bIsSetting; }
   CJS_Runtime* GetJSRuntime() const { return m_pJSRuntime.Get(); }
   CJS_Value* GetJSValue() { return &m_Value; }
+  const CJS_Value* GetJSValue() const { return &m_Value; }
 
   // These calls may re-enter JS (and hence invalidate objects).
-  void operator<<(int val);
-  void operator>>(int&) const;
-  void operator<<(bool val);
-  void operator>>(bool&) const;
-  void operator<<(double val);
-  void operator>>(double&) const;
-  void operator<<(CJS_Object* pObj);
-  void operator>>(CJS_Object*& ppObj) const;
-  void operator<<(CJS_Document* pJsDoc);
-  void operator>>(CJS_Document*& ppJsDoc) const;
-  void operator<<(ByteString);
-  void operator>>(ByteString&) const;
-  void operator<<(WideString);
-  void operator>>(WideString&) const;
-  void operator<<(const wchar_t* c_string);
-  void operator<<(v8::Local<v8::Object>);
-  void operator>>(v8::Local<v8::Object>&) const;
-  void operator>>(CJS_Array& array) const;
-  void operator<<(CJS_Array& array);
-  void operator<<(CJS_Date& date);
-  void operator>>(CJS_Date& date) const;
+  void Set(int val);
+  int ToInt() const;
+
+  void Set(bool val);
+  bool ToBool() const;
+
+  void Set(double val);
+  double ToDouble() const;
+
+  void Set(CJS_Object* pObj);
+  CJS_Object* ToObject() const;
+
+  void Set(CJS_Document* pJsDoc);
+  CJS_Document* ToDocument() const;
+
+  void Set(const ByteString&);
+  ByteString ToByteString() const;
+
+  void Set(const WideString&);
+  void Set(const wchar_t* c_string);
+  WideString ToWideString() const;
+
+  void Set(v8::Local<v8::Object>);
+  v8::Local<v8::Object> ToV8Object() const;
+
+  void Set(const CJS_Array& array);
+  CJS_Array ToArray() const;
+
+  void Set(const CJS_Date& date);
+  CJS_Date ToDate() const;
 
  private:
   bool m_bIsSetting;
@@ -154,6 +164,7 @@
            int hour,
            int min,
            int sec);
+  CJS_Date(const CJS_Date&);
   virtual ~CJS_Date();
 
   void Attach(v8::Local<v8::Date> pDate);
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index af47159..7758771 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -850,9 +850,9 @@
 
         CJS_PropValue vProp(pRuntime);
         vProp.StartGetting();
-        vProp << arColor;
+        vProp.Set(arColor);
         vProp.StartSetting();
-        fTarget->textColor(pRuntime, vProp, sError);  // red
+        fTarget->set_text_color(pRuntime, vProp, &sError);  // red
       }
     }
   } else {
@@ -869,7 +869,7 @@
 
         CJS_PropValue vProp(pRuntime);
         vProp.StartGetting();
-        fTarget->textColor(pRuntime, vProp, sError);
+        fTarget->get_text_color(pRuntime, &vProp, &sError);
 
         CJS_Array aProp;
         vProp.GetJSValue()->ConvertToArray(pRuntime, aProp);
@@ -882,9 +882,9 @@
         if (crColor != crProp) {
           CJS_PropValue vProp2(pRuntime);
           vProp2.StartGetting();
-          vProp2 << arColor;
+          vProp2.Set(arColor);
           vProp2.StartSetting();
-          fTarget->textColor(pRuntime, vProp2, sError);
+          fTarget->set_text_color(pRuntime, vProp2, &sError);
         }
       }
     }
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index eec4681..9fac461 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -161,19 +161,20 @@
 JSConstSpec CJS_App::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}};
 
 JSPropertySpec CJS_App::PropertySpecs[] = {
-    {"activeDocs", get_activeDocs_static, set_activeDocs_static},
+    {"activeDocs", get_active_docs_static, set_active_docs_static},
     {"calculate", get_calculate_static, set_calculate_static},
-    {"formsVersion", get_formsVersion_static, set_formsVersion_static},
+    {"formsVersion", get_forms_version_static, set_forms_version_static},
     {"fs", get_fs_static, set_fs_static},
     {"fullscreen", get_fullscreen_static, set_fullscreen_static},
     {"language", get_language_static, set_language_static},
     {"media", get_media_static, set_media_static},
     {"platform", get_platform_static, set_platform_static},
-    {"runtimeHighlight", get_runtimeHighlight_static,
-     set_runtimeHighlight_static},
-    {"viewerType", get_viewerType_static, set_viewerType_static},
-    {"viewerVariation", get_viewerVariation_static, set_viewerVariation_static},
-    {"viewerVersion", get_viewerVersion_static, set_viewerVersion_static},
+    {"runtimeHighlight", get_runtime_highlight_static,
+     set_runtime_highlight_static},
+    {"viewerType", get_viewer_type_static, set_viewer_type_static},
+    {"viewerVariation", get_viewer_variation_static,
+     set_viewer_variation_static},
+    {"viewerVersion", get_viewer_version_static, set_viewer_version_static},
     {0, 0, 0}};
 
 JSMethodSpec CJS_App::MethodSpecs[] = {{"alert", alert_static},
@@ -207,12 +208,9 @@
 app::~app() {
 }
 
-bool app::activeDocs(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool app::get_active_docs(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   CJS_Document* pJSDocument = nullptr;
   v8::Local<v8::Object> pObj = pRuntime->GetThisObj();
   if (CFXJS_Engine::GetObjDefnID(pObj) == CJS_Document::g_nObjDefnID)
@@ -221,114 +219,141 @@
   CJS_Array aDocs;
   aDocs.SetElement(pRuntime, 0, CJS_Value(pRuntime, pJSDocument));
   if (aDocs.GetLength(pRuntime) > 0)
-    vp << aDocs;
+    vp->Set(aDocs);
   else
-    vp.GetJSValue()->SetNull(pRuntime);
+    vp->GetJSValue()->SetNull(pRuntime);
 
   return true;
 }
 
-bool app::calculate(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  if (vp.IsSetting()) {
-    bool bVP;
-    vp >> bVP;
-    m_bCalculate = bVP;
-    pRuntime->GetFormFillEnv()->GetInterForm()->EnableCalculate(m_bCalculate);
-  } else {
-    vp << m_bCalculate;
-  }
+bool app::set_active_docs(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  return false;
+}
+
+bool app::get_calculate(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
+  vp->Set(m_bCalculate);
   return true;
 }
 
-bool app::formsVersion(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
-  if (vp.IsGetting()) {
-    vp << JS_NUM_FORMSVERSION;
-    return true;
-  }
+bool app::set_calculate(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  m_bCalculate = vp.ToBool();
+  pRuntime->GetFormFillEnv()->GetInterForm()->EnableCalculate(m_bCalculate);
+  return true;
+}
 
+bool app::get_forms_version(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  vp->Set(JS_NUM_FORMSVERSION);
+  return true;
+}
+
+bool app::set_forms_version(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
   return false;
 }
 
-bool app::viewerType(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (vp.IsGetting()) {
-    vp << JS_STR_VIEWERTYPE;
-    return true;
-  }
+bool app::get_viewer_type(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
+  vp->Set(JS_STR_VIEWERTYPE);
+  return true;
+}
 
+bool app::set_viewer_type(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
   return false;
 }
 
-bool app::viewerVariation(CJS_Runtime* pRuntime,
-                          CJS_PropValue& vp,
-                          WideString& sError) {
-  if (vp.IsGetting()) {
-    vp << JS_STR_VIEWERVARIATION;
-    return true;
-  }
+bool app::get_viewer_variation(CJS_Runtime* pRuntime,
+                               CJS_PropValue* vp,
+                               WideString* sError) {
+  vp->Set(JS_STR_VIEWERVARIATION);
+  return true;
+}
 
+bool app::set_viewer_variation(CJS_Runtime* pRuntime,
+                               const CJS_PropValue& vp,
+                               WideString* sError) {
   return false;
 }
 
-bool app::viewerVersion(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool app::get_viewer_version(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError) {
 #ifdef PDF_ENABLE_XFA
   CPDFXFA_Context* pXFAContext = pRuntime->GetFormFillEnv()->GetXFAContext();
   if (pXFAContext->ContainsXFAForm()) {
-    vp << JS_NUM_VIEWERVERSION_XFA;
+    vp->Set(JS_NUM_VIEWERVERSION_XFA);
     return true;
   }
 #endif  // PDF_ENABLE_XFA
-  vp << JS_NUM_VIEWERVERSION;
+  vp->Set(JS_NUM_VIEWERVERSION);
   return true;
 }
 
-bool app::platform(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool app::set_viewer_version(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError) {
+  return false;
+}
+
+bool app::get_platform(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
 #ifdef PDF_ENABLE_XFA
   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
   if (!pFormFillEnv)
     return false;
+
   WideString platfrom = pFormFillEnv->GetPlatform();
   if (!platfrom.IsEmpty()) {
-    vp << platfrom;
+    vp->Set(platfrom);
     return true;
   }
 #endif
-  vp << JS_STR_PLATFORM;
+  vp->Set(JS_STR_PLATFORM);
   return true;
 }
 
-bool app::language(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool app::set_platform(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  return false;
+}
+
+bool app::get_language(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
 #ifdef PDF_ENABLE_XFA
   CPDFSDK_FormFillEnvironment* pFormFillEnv = pRuntime->GetFormFillEnv();
   if (!pFormFillEnv)
     return false;
+
   WideString language = pFormFillEnv->GetLanguage();
   if (!language.IsEmpty()) {
-    vp << language;
+    vp->Set(language);
     return true;
   }
 #endif
-  vp << JS_STR_LANGUAGE;
+  vp->Set(JS_STR_LANGUAGE);
   return true;
 }
 
+bool app::set_language(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  return false;
+}
+
 // creates a new fdf object that contains no data
 // comment: need reader support
 // note:
@@ -441,7 +466,13 @@
   return false;
 }
 
-bool app::fs(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
+bool app::get_fs(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError) {
+  return false;
+}
+
+bool app::set_fs(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError) {
   return false;
 }
 
@@ -660,20 +691,29 @@
   return true;
 }
 
-bool app::runtimeHighlight(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           WideString& sError) {
-  if (vp.IsSetting()) {
-    vp >> m_bRuntimeHighLight;
-  } else {
-    vp << m_bRuntimeHighLight;
-  }
+bool app::get_runtime_highlight(CJS_Runtime* pRuntime,
+                                CJS_PropValue* vp,
+                                WideString* sError) {
+  vp->Set(m_bRuntimeHighLight);
   return true;
 }
 
-bool app::fullscreen(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool app::set_runtime_highlight(CJS_Runtime* pRuntime,
+                                const CJS_PropValue& vp,
+                                WideString* sError) {
+  m_bRuntimeHighLight = vp.ToBool();
+  return true;
+}
+
+bool app::get_fullscreen(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
+  return false;
+}
+
+bool app::set_fullscreen(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
   return false;
 }
 
@@ -764,7 +804,15 @@
   return true;
 }
 
-bool app::media(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
+bool app::get_media(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError) {
+  return false;
+}
+
+bool app::set_media(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError) {
   return false;
 }
 
diff --git a/fpdfsdk/javascript/app.h b/fpdfsdk/javascript/app.h
index e77c8cd..8c0ac3a 100644
--- a/fpdfsdk/javascript/app.h
+++ b/fpdfsdk/javascript/app.h
@@ -41,26 +41,85 @@
   explicit app(CJS_Object* pJSObject);
   ~app() override;
 
-  bool activeDocs(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool calculate(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool formsVersion(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool fs(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool fullscreen(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool language(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool media(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool platform(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool runtimeHighlight(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError);
-  bool viewerType(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool viewerVariation(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError);
-  bool viewerVersion(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError);
+  bool get_active_docs(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_active_docs(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_calculate(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_calculate(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_forms_version(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError);
+  bool set_forms_version(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError);
+
+  bool get_fs(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_fs(CJS_Runtime* pRuntime,
+              const CJS_PropValue& vp,
+              WideString* sError);
+
+  bool get_fullscreen(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_fullscreen(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_language(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_language(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_media(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_media(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_platform(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_platform(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_runtime_highlight(CJS_Runtime* pRuntime,
+                             CJS_PropValue* vp,
+                             WideString* sError);
+  bool set_runtime_highlight(CJS_Runtime* pRuntime,
+                             const CJS_PropValue& vp,
+                             WideString* sError);
+
+  bool get_viewer_type(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_viewer_type(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_viewer_variation(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError);
+  bool set_viewer_variation(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError);
+
+  bool get_viewer_version(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError);
+  bool set_viewer_version(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError);
 
   bool alert(CJS_Runtime* pRuntime,
              const std::vector<CJS_Value>& params,
@@ -170,18 +229,18 @@
 
   DECLARE_JS_CLASS();
 
-  JS_STATIC_PROP(activeDocs, app);
-  JS_STATIC_PROP(calculate, app);
-  JS_STATIC_PROP(formsVersion, app);
-  JS_STATIC_PROP(fs, app);
-  JS_STATIC_PROP(fullscreen, app);
-  JS_STATIC_PROP(language, app);
-  JS_STATIC_PROP(media, app);
-  JS_STATIC_PROP(platform, app);
-  JS_STATIC_PROP(runtimeHighlight, app);
-  JS_STATIC_PROP(viewerType, app);
-  JS_STATIC_PROP(viewerVariation, app);
-  JS_STATIC_PROP(viewerVersion, app);
+  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);
diff --git a/fpdfsdk/javascript/color.cpp b/fpdfsdk/javascript/color.cpp
index db860d3..f1dc26e 100644
--- a/fpdfsdk/javascript/color.cpp
+++ b/fpdfsdk/javascript/color.cpp
@@ -21,10 +21,10 @@
     {"black", get_black_static, set_black_static},
     {"blue", get_blue_static, set_blue_static},
     {"cyan", get_cyan_static, set_cyan_static},
-    {"dkGray", get_dkGray_static, set_dkGray_static},
+    {"dkGray", get_dark_gray_static, set_dark_gray_static},
     {"gray", get_gray_static, set_gray_static},
     {"green", get_green_static, set_green_static},
-    {"ltGray", get_ltGray_static, set_ltGray_static},
+    {"ltGray", get_light_gray_static, set_light_gray_static},
     {"magenta", get_magenta_static, set_magenta_static},
     {"red", get_red_static, set_red_static},
     {"transparent", get_transparent_static, set_transparent_static},
@@ -130,79 +130,163 @@
   }
 }
 
-bool color::transparent(CJS_Runtime* pRuntime,
-                        CJS_PropValue& vp,
-                        WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crTransparent);
+bool color::get_transparent(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crTransparent);
 }
 
-bool color::black(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crBlack);
+bool color::set_transparent(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crTransparent);
 }
 
-bool color::white(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crWhite);
+bool color::get_black(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crBlack);
 }
 
-bool color::red(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crRed);
+bool color::set_black(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crBlack);
 }
 
-bool color::green(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crGreen);
+bool color::get_white(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crWhite);
 }
 
-bool color::blue(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crBlue);
+bool color::set_white(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crWhite);
 }
 
-bool color::cyan(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crCyan);
+bool color::get_red(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crRed);
 }
 
-bool color::magenta(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crMagenta);
+bool color::set_red(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crRed);
 }
 
-bool color::yellow(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crYellow);
+bool color::get_green(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crGreen);
 }
 
-bool color::dkGray(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crDKGray);
+bool color::set_green(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crGreen);
 }
 
-bool color::gray(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crGray);
+bool color::get_blue(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crBlue);
 }
 
-bool color::ltGray(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  return PropertyHelper(pRuntime, vp, &m_crLTGray);
+bool color::set_blue(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crBlue);
 }
 
-bool color::PropertyHelper(CJS_Runtime* pRuntime,
-                           CJS_PropValue& vp,
-                           CFX_Color* var) {
+bool color::get_cyan(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crCyan);
+}
+
+bool color::set_cyan(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crCyan);
+}
+
+bool color::get_magenta(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crMagenta);
+}
+
+bool color::set_magenta(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crMagenta);
+}
+
+bool color::get_yellow(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crYellow);
+}
+
+bool color::set_yellow(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crYellow);
+}
+
+bool color::get_dark_gray(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crDKGray);
+}
+
+bool color::set_dark_gray(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crDKGray);
+}
+
+bool color::get_gray(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crGray);
+}
+
+bool color::set_gray(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crGray);
+}
+
+bool color::get_light_gray(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
+  return GetPropertyHelper(pRuntime, vp, &m_crLTGray);
+}
+
+bool color::set_light_gray(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return SetPropertyHelper(pRuntime, vp, &m_crLTGray);
+}
+
+bool color::GetPropertyHelper(CJS_Runtime* pRuntime,
+                              CJS_PropValue* vp,
+                              CFX_Color* var) {
   CJS_Array array;
-  if (vp.IsGetting()) {
     ConvertPWLColorToArray(pRuntime, *var, &array);
-    vp << array;
+    vp->Set(array);
     return true;
-  }
+}
+
+bool color::SetPropertyHelper(CJS_Runtime* pRuntime,
+                              const CJS_PropValue& vp,
+                              CFX_Color* var) {
+  CJS_Array array;
   if (!vp.GetJSValue()->ConvertToArray(pRuntime, array))
     return false;
 
diff --git a/fpdfsdk/javascript/color.h b/fpdfsdk/javascript/color.h
index 5e1e871..d4ca43a 100644
--- a/fpdfsdk/javascript/color.h
+++ b/fpdfsdk/javascript/color.h
@@ -17,20 +17,73 @@
   explicit color(CJS_Object* pJSObject);
   ~color() override;
 
-  bool black(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool blue(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool cyan(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool dkGray(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool gray(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool green(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool ltGray(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool magenta(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool red(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool transparent(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError);
-  bool white(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool yellow(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
+  bool get_black(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_black(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_blue(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_blue(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_cyan(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_cyan(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_dark_gray(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_dark_gray(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_gray(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_gray(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_green(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_green(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_light_gray(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_light_gray(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_magenta(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_magenta(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_red(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_red(CJS_Runtime* pRuntime,
+               const CJS_PropValue& vp,
+               WideString* sError);
+
+  bool get_transparent(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_transparent(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_white(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_white(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_yellow(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_yellow(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
 
   bool convert(CJS_Runtime* pRuntime,
                const std::vector<CJS_Value>& params,
@@ -49,7 +102,12 @@
                                      CFX_Color* color);
 
  private:
-  bool PropertyHelper(CJS_Runtime* pRuntime, CJS_PropValue& vp, CFX_Color* val);
+  bool GetPropertyHelper(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         CFX_Color* val);
+  bool SetPropertyHelper(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         CFX_Color* val);
 
   CFX_Color m_crTransparent;
   CFX_Color m_crBlack;
@@ -72,18 +130,18 @@
 
   DECLARE_JS_CLASS();
 
-  JS_STATIC_PROP(black, color);
-  JS_STATIC_PROP(blue, color);
-  JS_STATIC_PROP(cyan, color);
-  JS_STATIC_PROP(dkGray, color);
-  JS_STATIC_PROP(gray, color);
-  JS_STATIC_PROP(green, color);
-  JS_STATIC_PROP(ltGray, color);
-  JS_STATIC_PROP(magenta, color);
-  JS_STATIC_PROP(red, color);
-  JS_STATIC_PROP(transparent, color);
-  JS_STATIC_PROP(white, color);
-  JS_STATIC_PROP(yellow, color);
+  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);
diff --git a/fpdfsdk/javascript/event.cpp b/fpdfsdk/javascript/event.cpp
index efc704d..9c2e3f4 100644
--- a/fpdfsdk/javascript/event.cpp
+++ b/fpdfsdk/javascript/event.cpp
@@ -17,25 +17,25 @@
 
 JSPropertySpec CJS_Event::PropertySpecs[] = {
     {"change", get_change_static, set_change_static},
-    {"changeEx", get_changeEx_static, set_changeEx_static},
-    {"commitKey", get_commitKey_static, set_commitKey_static},
-    {"fieldFull", get_fieldFull_static, set_fieldFull_static},
-    {"keyDown", get_keyDown_static, set_keyDown_static},
+    {"changeEx", get_change_ex_static, set_change_ex_static},
+    {"commitKey", get_commit_key_static, set_commit_key_static},
+    {"fieldFull", get_field_full_static, set_field_full_static},
+    {"keyDown", get_key_down_static, set_key_down_static},
     {"modifier", get_modifier_static, set_modifier_static},
     {"name", get_name_static, set_name_static},
     {"rc", get_rc_static, set_rc_static},
-    {"richChange", get_richChange_static, set_richChange_static},
-    {"richChangeEx", get_richChangeEx_static, set_richChangeEx_static},
-    {"richValue", get_richValue_static, set_richValue_static},
-    {"selEnd", get_selEnd_static, set_selEnd_static},
-    {"selStart", get_selStart_static, set_selStart_static},
+    {"richChange", get_rich_change_static, set_rich_change_static},
+    {"richChangeEx", get_rich_change_ex_static, set_rich_change_ex_static},
+    {"richValue", get_rich_value_static, set_rich_value_static},
+    {"selEnd", get_sel_end_static, set_sel_end_static},
+    {"selStart", get_sel_start_static, set_sel_start_static},
     {"shift", get_shift_static, set_shift_static},
     {"source", get_source_static, set_source_static},
     {"target", get_target_static, set_target_static},
-    {"targetName", get_targetName_static, set_targetName_static},
+    {"targetName", get_target_name_static, set_target_name_static},
     {"type", get_type_static, set_type_static},
     {"value", get_value_static, set_value_static},
-    {"willCommit", get_willCommit_static, set_willCommit_static},
+    {"willCommit", get_will_commit_static, set_will_commit_static},
     {0, 0, 0}};
 
 JSMethodSpec CJS_Event::MethodSpecs[] = {{0, 0}};
@@ -46,231 +46,308 @@
 
 event::~event() {}
 
-bool event::change(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
+bool event::get_change(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-  WideString& wChange = pEvent->Change();
-  if (vp.IsSetting()) {
-    if (vp.GetJSValue()->GetType() == CJS_Value::VT_string)
-      vp >> wChange;
-    return true;
+  vp->Set(pEvent->Change());
+  return true;
+}
+
+bool event::set_change(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+
+  if (vp.GetJSValue()->GetType() == CJS_Value::VT_string) {
+    WideString& wChange = pEvent->Change();
+    wChange = vp.ToWideString();
   }
-  vp << wChange;
   return true;
 }
 
-bool event::changeEx(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (!vp.IsGetting())
+bool event::get_change_ex(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+
+  vp->Set(pEvent->ChangeEx());
+  return true;
+}
+
+bool event::set_change_ex(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
+  return false;
+}
+
+bool event::get_commit_key(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+
+  vp->Set(pEvent->CommitKey());
+  return true;
+}
+
+bool event::set_commit_key(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return false;
+}
+
+bool event::get_field_full(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+
+  if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
     return false;
 
+  vp->Set(pEvent->FieldFull());
+  return true;
+}
+
+bool event::set_field_full(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return false;
+}
+
+bool event::get_key_down(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->ChangeEx();
+  vp->Set(pEvent->KeyDown());
   return true;
 }
 
-bool event::commitKey(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool event::set_key_down(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  return false;
+}
 
+bool event::get_modifier(CJS_Runtime* pRuntime,
+                         CJS_PropValue* vp,
+                         WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->CommitKey();
+  vp->Set(pEvent->Modifier());
   return true;
 }
 
-bool event::fieldFull(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool event::set_modifier(CJS_Runtime* pRuntime,
+                         const CJS_PropValue& vp,
+                         WideString* sError) {
+  return false;
+}
+
+bool event::get_name(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  if (!vp.IsGetting() &&
-      wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
-    return false;
-
-  vp << pEvent->FieldFull();
+  vp->Set(pEvent->Name());
   return true;
 }
 
-bool event::keyDown(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool event::set_name(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return false;
+}
 
+bool event::get_rc(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->KeyDown();
+  vp->Set(pEvent->Rc());
   return true;
 }
 
-bool event::modifier(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool event::set_rc(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->Modifier();
+  pEvent->Rc() = vp.ToBool();
   return true;
 }
 
-bool event::name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
-  CJS_EventHandler* pEvent =
-      pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->Name();
+bool event::get_rich_change(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
   return true;
 }
 
-bool event::rc(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  CJS_EventHandler* pEvent =
-      pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  bool& bRc = pEvent->Rc();
-  if (vp.IsSetting())
-    vp >> bRc;
-  else
-    vp << bRc;
-
+bool event::set_rich_change(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
   return true;
 }
 
-bool event::richChange(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
+bool event::get_rich_change_ex(CJS_Runtime* pRuntime,
+                               CJS_PropValue* vp,
+                               WideString* sError) {
   return true;
 }
 
-bool event::richChangeEx(CJS_Runtime* pRuntime,
-                         CJS_PropValue& vp,
-                         WideString& sError) {
+bool event::set_rich_change_ex(CJS_Runtime* pRuntime,
+                               const CJS_PropValue& vp,
+                               WideString* sError) {
   return true;
 }
 
-bool event::richValue(CJS_Runtime* pRuntime,
-                      CJS_PropValue& vp,
-                      WideString& sError) {
+bool event::get_rich_value(CJS_Runtime* pRuntime,
+                           CJS_PropValue* vp,
+                           WideString* sError) {
   return true;
 }
 
-bool event::selEnd(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
+bool event::set_rich_value(CJS_Runtime* pRuntime,
+                           const CJS_PropValue& vp,
+                           WideString* sError) {
+  return true;
+}
+
+bool event::get_sel_end(CJS_Runtime* pRuntime,
+                        CJS_PropValue* vp,
+                        WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
   if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
     return true;
 
-  int& iSelEnd = pEvent->SelEnd();
-  if (vp.IsSetting())
-    vp >> iSelEnd;
-  else
-    vp << iSelEnd;
-
+  vp->Set(pEvent->SelEnd());
   return true;
 }
 
-bool event::selStart(CJS_Runtime* pRuntime,
-                     CJS_PropValue& vp,
-                     WideString& sError) {
+bool event::set_sel_end(CJS_Runtime* pRuntime,
+                        const CJS_PropValue& vp,
+                        WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
   if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
     return true;
 
-  int& iSelStart = pEvent->SelStart();
-  if (vp.IsSetting())
-    vp >> iSelStart;
-  else
-    vp << iSelStart;
-
+  pEvent->SelEnd() = vp.ToInt();
   return true;
 }
 
-bool event::shift(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool event::get_sel_start(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
-  vp << pEvent->Shift();
+  if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
+    return true;
+
+  vp->Set(pEvent->SelStart());
   return true;
 }
 
-bool event::source(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool event::set_sel_start(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
-  vp << pEvent->Source()->GetJSObject();
+  if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
+    return true;
+
+  pEvent->SelStart() = vp.ToInt();
   return true;
 }
 
-bool event::target(CJS_Runtime* pRuntime,
-                   CJS_PropValue& vp,
-                   WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool event::get_shift(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->Target_Field()->GetJSObject();
+  vp->Set(pEvent->Shift());
   return true;
 }
 
-bool event::targetName(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool event::set_shift(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
+  return false;
+}
 
+bool event::get_source(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->TargetName();
+  vp->Set(pEvent->Source()->GetJSObject());
   return true;
 }
 
-bool event::type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
+bool event::set_source(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  return false;
+}
 
+bool event::get_target(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-
-  vp << pEvent->Type();
+  vp->Set(pEvent->Target_Field()->GetJSObject());
   return true;
 }
 
-bool event::value(CJS_Runtime* pRuntime,
-                  CJS_PropValue& vp,
-                  WideString& sError) {
+bool event::set_target(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError) {
+  return false;
+}
+
+bool event::get_target_name(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+  vp->Set(pEvent->TargetName());
+  return true;
+}
+
+bool event::set_target_name(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return false;
+}
+
+bool event::get_type(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+  vp->Set(pEvent->Type());
+  return true;
+}
+
+bool event::set_type(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError) {
+  return false;
+}
+
+bool event::get_value(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
@@ -280,24 +357,37 @@
   if (!pEvent->m_pValue)
     return false;
 
-  WideString& val = pEvent->Value();
-  if (vp.IsSetting())
-    vp >> val;
-  else
-    vp << val;
-
+  vp->Set(pEvent->Value());
   return true;
 }
 
-bool event::willCommit(CJS_Runtime* pRuntime,
-                       CJS_PropValue& vp,
-                       WideString& sError) {
-  if (!vp.IsGetting())
-    return false;
-
+bool event::set_value(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
-  vp << pEvent->WillCommit();
+  if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0)
+    return false;
+
+  if (!pEvent->m_pValue)
+    return false;
+
+  pEvent->Value() = vp.ToWideString();
   return true;
 }
+
+bool event::get_will_commit(CJS_Runtime* pRuntime,
+                            CJS_PropValue* vp,
+                            WideString* sError) {
+  CJS_EventHandler* pEvent =
+      pRuntime->GetCurrentEventContext()->GetEventHandler();
+  vp->Set(pEvent->WillCommit());
+  return true;
+}
+
+bool event::set_will_commit(CJS_Runtime* pRuntime,
+                            const CJS_PropValue& vp,
+                            WideString* sError) {
+  return false;
+}
diff --git a/fpdfsdk/javascript/event.h b/fpdfsdk/javascript/event.h
index 8574237..e67aa2b 100644
--- a/fpdfsdk/javascript/event.h
+++ b/fpdfsdk/javascript/event.h
@@ -15,28 +15,129 @@
   ~event() override;
 
  public:
-  bool change(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool changeEx(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool commitKey(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool fieldFull(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool keyDown(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool modifier(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool name(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool rc(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool richChange(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool richChangeEx(CJS_Runtime* pRuntime,
-                    CJS_PropValue& vp,
-                    WideString& sError);
-  bool richValue(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool selEnd(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool selStart(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool shift(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool source(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool target(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool targetName(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool type(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool value(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
-  bool willCommit(CJS_Runtime* pRuntime, CJS_PropValue& vp, WideString& sError);
+  bool get_change(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_change(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_change_ex(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_change_ex(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_commit_key(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_commit_key(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_field_full(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_field_full(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_key_down(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_key_down(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_modifier(CJS_Runtime* pRuntime,
+                    CJS_PropValue* vp,
+                    WideString* sError);
+  bool set_modifier(CJS_Runtime* pRuntime,
+                    const CJS_PropValue& vp,
+                    WideString* sError);
+
+  bool get_name(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_rc(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_rc(CJS_Runtime* pRuntime,
+              const CJS_PropValue& vp,
+              WideString* sError);
+
+  bool get_rich_change(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_rich_change(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_rich_change_ex(CJS_Runtime* pRuntime,
+                          CJS_PropValue* vp,
+                          WideString* sError);
+  bool set_rich_change_ex(CJS_Runtime* pRuntime,
+                          const CJS_PropValue& vp,
+                          WideString* sError);
+
+  bool get_rich_value(CJS_Runtime* pRuntime,
+                      CJS_PropValue* vp,
+                      WideString* sError);
+  bool set_rich_value(CJS_Runtime* pRuntime,
+                      const CJS_PropValue& vp,
+                      WideString* sError);
+
+  bool get_sel_end(CJS_Runtime* pRuntime,
+                   CJS_PropValue* vp,
+                   WideString* sError);
+  bool set_sel_end(CJS_Runtime* pRuntime,
+                   const CJS_PropValue& vp,
+                   WideString* sError);
+
+  bool get_sel_start(CJS_Runtime* pRuntime,
+                     CJS_PropValue* vp,
+                     WideString* sError);
+  bool set_sel_start(CJS_Runtime* pRuntime,
+                     const CJS_PropValue& vp,
+                     WideString* sError);
+
+  bool get_shift(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_shift(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_source(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_source(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_target(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_target(CJS_Runtime* pRuntime,
+                  const CJS_PropValue& vp,
+                  WideString* sError);
+
+  bool get_target_name(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_target_name(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
+
+  bool get_type(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_type(CJS_Runtime* pRuntime,
+                const CJS_PropValue& vp,
+                WideString* sError);
+
+  bool get_value(CJS_Runtime* pRuntime, CJS_PropValue* vp, WideString* sError);
+  bool set_value(CJS_Runtime* pRuntime,
+                 const CJS_PropValue& vp,
+                 WideString* sError);
+
+  bool get_will_commit(CJS_Runtime* pRuntime,
+                       CJS_PropValue* vp,
+                       WideString* sError);
+  bool set_will_commit(CJS_Runtime* pRuntime,
+                       const CJS_PropValue& vp,
+                       WideString* sError);
 };
 
 class CJS_Event : public CJS_Object {
@@ -45,26 +146,26 @@
   ~CJS_Event() override {}
 
   DECLARE_JS_CLASS();
-  JS_STATIC_PROP(change, event);
-  JS_STATIC_PROP(changeEx, event);
-  JS_STATIC_PROP(commitKey, event);
-  JS_STATIC_PROP(fieldFull, event);
-  JS_STATIC_PROP(keyDown, event);
-  JS_STATIC_PROP(modifier, event);
-  JS_STATIC_PROP(name, event);
-  JS_STATIC_PROP(rc, event);
-  JS_STATIC_PROP(richChange, event);
-  JS_STATIC_PROP(richChangeEx, event);
-  JS_STATIC_PROP(richValue, event);
-  JS_STATIC_PROP(selEnd, event);
-  JS_STATIC_PROP(selStart, event);
-  JS_STATIC_PROP(shift, event);
-  JS_STATIC_PROP(source, event);
-  JS_STATIC_PROP(target, event);
-  JS_STATIC_PROP(targetName, event);
-  JS_STATIC_PROP(type, event);
-  JS_STATIC_PROP(value, event);
-  JS_STATIC_PROP(willCommit, event);
+  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);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_EVENT_H_
diff --git a/fpdfsdk/javascript/global.cpp b/fpdfsdk/javascript/global.cpp
index 9827b2a..43c461c 100644
--- a/fpdfsdk/javascript/global.cpp
+++ b/fpdfsdk/javascript/global.cpp
@@ -66,8 +66,7 @@
 }
 
 bool JSGlobalAlternate::DelProperty(CJS_Runtime* pRuntime,
-                                    const wchar_t* propname,
-                                    WideString& sError) {
+                                    const wchar_t* propname) {
   auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
   if (it == m_MapGlobal.end())
     return false;
@@ -76,81 +75,73 @@
   return true;
 }
 
-bool JSGlobalAlternate::DoProperty(CJS_Runtime* pRuntime,
-                                   const wchar_t* propname,
-                                   CJS_PropValue& vp,
-                                   WideString& sError) {
-  if (vp.IsSetting()) {
-    ByteString sPropName = ByteString::FromUnicode(propname);
-    switch (vp.GetJSValue()->GetType()) {
-      case CJS_Value::VT_number: {
-        double dData;
-        vp >> dData;
-        return SetGlobalVariables(sPropName, JS_GlobalDataType::NUMBER, dData,
-                                  false, "", v8::Local<v8::Object>(), false);
-      }
-      case CJS_Value::VT_boolean: {
-        bool bData;
-        vp >> bData;
-        return SetGlobalVariables(sPropName, JS_GlobalDataType::BOOLEAN, 0,
-                                  bData, "", v8::Local<v8::Object>(), false);
-      }
-      case CJS_Value::VT_string: {
-        ByteString sData;
-        vp >> sData;
-        return SetGlobalVariables(sPropName, JS_GlobalDataType::STRING, 0,
-                                  false, sData, v8::Local<v8::Object>(), false);
-      }
-      case CJS_Value::VT_object: {
-        v8::Local<v8::Object> pData;
-        vp >> pData;
-        return SetGlobalVariables(sPropName, JS_GlobalDataType::OBJECT, 0,
-                                  false, "", pData, false);
-      }
-      case CJS_Value::VT_null: {
-        return SetGlobalVariables(sPropName, JS_GlobalDataType::NULLOBJ, 0,
-                                  false, "", v8::Local<v8::Object>(), false);
-      }
-      case CJS_Value::VT_undefined: {
-        DelProperty(pRuntime, propname, sError);
-        return true;
-      }
-      default:
-        break;
-    }
-  } else {
-    auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
-    if (it == m_MapGlobal.end()) {
-      vp.GetJSValue()->SetNull(pRuntime);
+bool JSGlobalAlternate::GetProperty(CJS_Runtime* pRuntime,
+                                    const wchar_t* propname,
+                                    CJS_PropValue* vp) {
+  auto it = m_MapGlobal.find(ByteString::FromUnicode(propname));
+  if (it == m_MapGlobal.end()) {
+    vp->GetJSValue()->SetNull(pRuntime);
+    return true;
+  }
+
+  JSGlobalData* pData = it->second.get();
+  if (pData->bDeleted) {
+    vp->GetJSValue()->SetNull(pRuntime);
+    return true;
+  }
+
+  switch (pData->nType) {
+    case JS_GlobalDataType::NUMBER:
+      vp->Set(pData->dData);
+      return true;
+    case JS_GlobalDataType::BOOLEAN:
+      vp->Set(pData->bData);
+      return true;
+    case JS_GlobalDataType::STRING:
+      vp->Set(pData->sData);
+      return true;
+    case JS_GlobalDataType::OBJECT: {
+      vp->Set(v8::Local<v8::Object>::New(vp->GetJSRuntime()->GetIsolate(),
+                                         pData->pData));
       return true;
     }
-    JSGlobalData* pData = it->second.get();
-    if (pData->bDeleted) {
-      vp.GetJSValue()->SetNull(pRuntime);
+    case JS_GlobalDataType::NULLOBJ:
+      vp->GetJSValue()->SetNull(pRuntime);
       return true;
-    }
-    switch (pData->nType) {
-      case JS_GlobalDataType::NUMBER:
-        vp << pData->dData;
-        return true;
-      case JS_GlobalDataType::BOOLEAN:
-        vp << pData->bData;
-        return true;
-      case JS_GlobalDataType::STRING:
-        vp << pData->sData;
-        return true;
-      case JS_GlobalDataType::OBJECT: {
-        v8::Local<v8::Object> obj = v8::Local<v8::Object>::New(
-            vp.GetJSRuntime()->GetIsolate(), pData->pData);
-        vp << obj;
-        return true;
-      }
-      case JS_GlobalDataType::NULLOBJ:
-        vp.GetJSValue()->SetNull(pRuntime);
-        return true;
-      default:
-        break;
-    }
+    default:
+      break;
+  }
+  return false;
+}
+
+bool JSGlobalAlternate::SetProperty(CJS_Runtime* pRuntime,
+                                    const wchar_t* propname,
+                                    const CJS_PropValue& vp) {
+  ByteString sPropName = ByteString::FromUnicode(propname);
+  switch (vp.GetJSValue()->GetType()) {
+    case CJS_Value::VT_number:
+      return SetGlobalVariables(sPropName, JS_GlobalDataType::NUMBER,
+                                vp.ToDouble(), false, "",
+                                v8::Local<v8::Object>(), false);
+    case CJS_Value::VT_boolean:
+      return SetGlobalVariables(sPropName, JS_GlobalDataType::BOOLEAN, 0,
+                                vp.ToBool(), "", v8::Local<v8::Object>(),
+                                false);
+    case CJS_Value::VT_string:
+      return SetGlobalVariables(sPropName, JS_GlobalDataType::STRING, 0, false,
+                                vp.ToByteString(), v8::Local<v8::Object>(),
+                                false);
+    case CJS_Value::VT_object:
+      return SetGlobalVariables(sPropName, JS_GlobalDataType::OBJECT, 0, false,
+                                "", vp.ToV8Object(), false);
+    case CJS_Value::VT_null:
+      return SetGlobalVariables(sPropName, JS_GlobalDataType::NULLOBJ, 0, false,
+                                "", v8::Local<v8::Object>(), false);
+    case CJS_Value::VT_undefined:
+      DelProperty(pRuntime, propname);
+      return true;
+    default:
+      break;
   }
   return false;
 }
diff --git a/fpdfsdk/javascript/global.h b/fpdfsdk/javascript/global.h
index 5005b2a..c741a1a 100644
--- a/fpdfsdk/javascript/global.h
+++ b/fpdfsdk/javascript/global.h
@@ -41,13 +41,13 @@
                      CJS_Value& vRet,
                      WideString& sError);
   bool QueryProperty(const wchar_t* propname);
-  bool DoProperty(CJS_Runtime* pRuntime,
-                  const wchar_t* propname,
-                  CJS_PropValue& vp,
-                  WideString& sError);
-  bool DelProperty(CJS_Runtime* pRuntime,
+  bool GetProperty(CJS_Runtime* pRuntime,
                    const wchar_t* propname,
-                   WideString& sError);
+                   CJS_PropValue* vp);
+  bool SetProperty(CJS_Runtime* pRuntime,
+                   const wchar_t* propname,
+                   const CJS_PropValue& vp);
+  bool DelProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
   void Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv);
 
  private: