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:
