diff --git a/fpdfsdk/javascript/Annot.cpp b/fpdfsdk/javascript/Annot.cpp
index d80c755..a068e28 100644
--- a/fpdfsdk/javascript/Annot.cpp
+++ b/fpdfsdk/javascript/Annot.cpp
@@ -50,10 +50,10 @@
 }
 
 bool Annot::set_hidden(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   // May invalidate m_pAnnot.
-  bool bHidden = pRuntime->ToBoolean(vp.ToV8Value());
+  bool bHidden = pRuntime->ToBoolean(vp);
   if (!m_pAnnot) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
@@ -88,10 +88,10 @@
 }
 
 bool Annot::set_name(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   // May invalidate m_pAnnot.
-  WideString annotName = pRuntime->ToWideString(vp.ToV8Value());
+  WideString annotName = pRuntime->ToWideString(vp);
   if (!m_pAnnot) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
@@ -116,7 +116,7 @@
 }
 
 bool Annot::set_type(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
diff --git a/fpdfsdk/javascript/Annot.h b/fpdfsdk/javascript/Annot.h
index 00872a4..94b6762 100644
--- a/fpdfsdk/javascript/Annot.h
+++ b/fpdfsdk/javascript/Annot.h
@@ -17,14 +17,18 @@
 
   bool get_hidden(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_hidden(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_name(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_name(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_type(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_type(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_type(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   void SetSDKAnnot(CPDFSDK_BAAnnot* annot);
 
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index 22fe8b4..9404ded 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -178,7 +178,7 @@
 }
 
 bool Document::set_num_fields(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -197,15 +197,15 @@
 }
 
 bool Document::set_dirty(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   if (!m_pFormFillEnv) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
 
-  pRuntime->ToBoolean(vp.ToV8Value()) ? m_pFormFillEnv->SetChangeMark()
-                                      : m_pFormFillEnv->ClearChangeMark();
+  pRuntime->ToBoolean(vp) ? m_pFormFillEnv->SetChangeMark()
+                          : m_pFormFillEnv->ClearChangeMark();
 
   return true;
 }
@@ -218,7 +218,7 @@
 }
 
 bool Document::set_ADBE(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   return true;
 }
@@ -237,7 +237,7 @@
 }
 
 bool Document::set_page_num(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   if (!m_pFormFillEnv) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
@@ -245,7 +245,7 @@
   }
 
   int iPageCount = m_pFormFillEnv->GetPageCount();
-  int iPageNum = pRuntime->ToInt32(vp.ToV8Value());
+  int iPageNum = pRuntime->ToInt32(vp);
   if (iPageNum >= 0 && iPageNum < iPageCount)
     m_pFormFillEnv->JS_docgotoPage(iPageNum);
   else if (iPageNum >= iPageCount)
@@ -257,7 +257,7 @@
 }
 
 bool Document::addAnnot(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   // Not supported.
@@ -265,7 +265,7 @@
 }
 
 bool Document::addField(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   // Not supported.
@@ -273,7 +273,7 @@
 }
 
 bool Document::exportAsText(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError) {
   // Unsafe, not supported.
@@ -281,7 +281,7 @@
 }
 
 bool Document::exportAsFDF(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError) {
   // Unsafe, not supported.
@@ -289,7 +289,7 @@
 }
 
 bool Document::exportAsXFDF(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError) {
   // Unsafe, not supported.
@@ -297,7 +297,7 @@
 }
 
 bool Document::getField(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   if (params.size() < 1) {
@@ -308,7 +308,7 @@
     sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  WideString wideName = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString wideName = pRuntime->ToWideString(params[0]);
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
   if (pPDFForm->CountFields(wideName) <= 0) {
@@ -333,7 +333,7 @@
 
 // Gets the name of the nth field in the document
 bool Document::getNthFieldName(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError) {
   if (params.size() != 1) {
@@ -344,7 +344,8 @@
     sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
   }
-  int nIndex = pRuntime->ToInt32(params[0].ToV8Value());
+  int nIndex = pRuntime->ToInt32(params[0]);
+
   if (nIndex < 0) {
     sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
     return false;
@@ -360,7 +361,7 @@
 }
 
 bool Document::importAnFDF(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError) {
   // Unsafe, not supported.
@@ -368,7 +369,7 @@
 }
 
 bool Document::importAnXFDF(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError) {
   // Unsafe, not supported.
@@ -376,7 +377,7 @@
 }
 
 bool Document::importTextData(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
                               WideString& sError) {
   // Unsafe, not supported.
@@ -387,7 +388,7 @@
 // all recipients.
 // comment: need reader supports
 bool Document::mailForm(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -399,17 +400,12 @@
     return false;
   }
   int iLength = params.size();
-  bool bUI = iLength > 0 ? pRuntime->ToBoolean(params[0].ToV8Value()) : true;
-  WideString cTo =
-      iLength > 1 ? pRuntime->ToWideString(params[1].ToV8Value()) : L"";
-  WideString cCc =
-      iLength > 2 ? pRuntime->ToWideString(params[2].ToV8Value()) : L"";
-  WideString cBcc =
-      iLength > 3 ? pRuntime->ToWideString(params[3].ToV8Value()) : L"";
-  WideString cSubject =
-      iLength > 4 ? pRuntime->ToWideString(params[4].ToV8Value()) : L"";
-  WideString cMsg =
-      iLength > 5 ? pRuntime->ToWideString(params[5].ToV8Value()) : L"";
+  bool bUI = iLength > 0 ? pRuntime->ToBoolean(params[0]) : true;
+  WideString cTo = iLength > 1 ? pRuntime->ToWideString(params[1]) : L"";
+  WideString cCc = iLength > 2 ? pRuntime->ToWideString(params[2]) : L"";
+  WideString cBcc = iLength > 3 ? pRuntime->ToWideString(params[3]) : L"";
+  WideString cSubject = iLength > 4 ? pRuntime->ToWideString(params[4]) : L"";
+  WideString cMsg = iLength > 5 ? pRuntime->ToWideString(params[5]) : L"";
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   ByteString sTextBuf = pInterForm->ExportFormToFDFTextBuf();
   if (sTextBuf.GetLength() == 0)
@@ -430,7 +426,7 @@
 }
 
 bool Document::print(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -447,11 +443,11 @@
   bool bAnnotations = false;
   int nlength = params.size();
   if (nlength == 9) {
-    if (params[8].ToV8Value()->IsObject()) {
-      v8::Local<v8::Object> pObj = pRuntime->ToObject(params[8].ToV8Value());
+    if (params[8]->IsObject()) {
+      v8::Local<v8::Object> pObj = pRuntime->ToObject(params[8]);
       if (CFXJS_Engine::GetObjDefnID(pObj) ==
           CJS_PrintParamsObj::g_nObjDefnID) {
-        v8::Local<v8::Object> pObj = pRuntime->ToObject(params[8].ToV8Value());
+        v8::Local<v8::Object> pObj = pRuntime->ToObject(params[8]);
         CJS_Object* pJSObj =
             static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(pObj));
         if (pJSObj) {
@@ -471,21 +467,21 @@
     }
   } else {
     if (nlength >= 1)
-      bUI = pRuntime->ToBoolean(params[0].ToV8Value());
+      bUI = pRuntime->ToBoolean(params[0]);
     if (nlength >= 2)
-      nStart = pRuntime->ToInt32(params[1].ToV8Value());
+      nStart = pRuntime->ToInt32(params[1]);
     if (nlength >= 3)
-      nEnd = pRuntime->ToInt32(params[2].ToV8Value());
+      nEnd = pRuntime->ToInt32(params[2]);
     if (nlength >= 4)
-      bSilent = pRuntime->ToBoolean(params[3].ToV8Value());
+      bSilent = pRuntime->ToBoolean(params[3]);
     if (nlength >= 5)
-      bShrinkToFit = pRuntime->ToBoolean(params[4].ToV8Value());
+      bShrinkToFit = pRuntime->ToBoolean(params[4]);
     if (nlength >= 6)
-      bPrintAsImage = pRuntime->ToBoolean(params[5].ToV8Value());
+      bPrintAsImage = pRuntime->ToBoolean(params[5]);
     if (nlength >= 7)
-      bReverse = pRuntime->ToBoolean(params[6].ToV8Value());
+      bReverse = pRuntime->ToBoolean(params[6]);
     if (nlength >= 8)
-      bAnnotations = pRuntime->ToBoolean(params[7].ToV8Value());
+      bAnnotations = pRuntime->ToBoolean(params[7]);
   }
 
   if (m_pFormFillEnv) {
@@ -501,7 +497,7 @@
 // note: if the filed name is not rational, adobe is dumb for it.
 
 bool Document::removeField(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError) {
   if (params.size() != 1) {
@@ -517,7 +513,7 @@
     sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return false;
   }
-  WideString sFieldName = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString sFieldName = pRuntime->ToWideString(params[0]);
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   std::vector<CPDFSDK_Annot::ObservedPtr> widgets;
   pInterForm->GetWidgets(sFieldName, &widgets);
@@ -560,7 +556,7 @@
 // note: if the fields names r not rational, aodbe is dumb for it.
 
 bool Document::resetForm(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -584,15 +580,14 @@
     return true;
   }
 
-  if (params[0].ToV8Value()->IsString())
+  if (params[0]->IsString())
     aName.SetElement(pRuntime, 0, params[0]);
   else
-    aName = CJS_Array(pRuntime->ToArray(params[0].ToV8Value()));
+    aName = CJS_Array(pRuntime->ToArray(params[0]));
 
   std::vector<CPDF_FormField*> aFields;
   for (int i = 0, isz = aName.GetLength(pRuntime); i < isz; ++i) {
-    WideString swVal =
-        pRuntime->ToWideString(aName.GetElement(pRuntime, i).ToV8Value());
+    WideString swVal = pRuntime->ToWideString(aName.GetElement(pRuntime, i));
     for (int j = 0, jsz = pPDFForm->CountFields(swVal); j < jsz; ++j)
       aFields.push_back(pPDFForm->GetField(j, swVal));
   }
@@ -606,7 +601,7 @@
 }
 
 bool Document::saveAs(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   // Unsafe, not supported.
@@ -614,14 +609,14 @@
 }
 
 bool Document::syncAnnotScan(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   return true;
 }
 
 bool Document::submitForm(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   int nSize = params.size();
@@ -638,17 +633,16 @@
   WideString strURL;
   bool bFDF = true;
   bool bEmpty = false;
-  CJS_Value v(params[0]);
-  if (v.ToV8Value()->IsString()) {
-    strURL = pRuntime->ToWideString(params[0].ToV8Value());
+  if (params[0]->IsString()) {
+    strURL = pRuntime->ToWideString(params[0]);
     if (nSize > 1)
-      bFDF = pRuntime->ToBoolean(params[1].ToV8Value());
+      bFDF = pRuntime->ToBoolean(params[1]);
     if (nSize > 2)
-      bEmpty = pRuntime->ToBoolean(params[2].ToV8Value());
+      bEmpty = pRuntime->ToBoolean(params[2]);
     if (nSize > 3)
-      aFields = CJS_Array(pRuntime->ToArray(params[3].ToV8Value()));
-  } else if (v.ToV8Value()->IsObject()) {
-    v8::Local<v8::Object> pObj = pRuntime->ToObject(params[0].ToV8Value());
+      aFields = CJS_Array(pRuntime->ToArray(params[3]));
+  } else if (params[0]->IsObject()) {
+    v8::Local<v8::Object> pObj = pRuntime->ToObject(params[0]);
     v8::Local<v8::Value> pValue = pRuntime->GetObjectProperty(pObj, L"cURL");
     if (!pValue.IsEmpty())
       strURL = pRuntime->ToWideString(pValue);
@@ -672,8 +666,7 @@
 
   std::vector<CPDF_FormField*> fieldObjects;
   for (int i = 0, sz = aFields.GetLength(pRuntime); i < sz; ++i) {
-    WideString sName =
-        pRuntime->ToWideString(aFields.GetElement(pRuntime, i).ToV8Value());
+    WideString sName = pRuntime->ToWideString(aFields.GetElement(pRuntime, i));
     CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
     for (int j = 0, jsz = pPDFForm->CountFields(sName); j < jsz; ++j) {
       CPDF_FormField* pField = pPDFForm->GetField(j, sName);
@@ -703,13 +696,13 @@
 }
 
 bool Document::set_bookmark_root(CJS_Runtime* pRuntime,
-                                 const CJS_Value& vp,
+                                 v8::Local<v8::Value> vp,
                                  WideString* sError) {
   return true;
 }
 
 bool Document::mailDoc(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   // TODO(tsepez): Check maximum number of allowed params.
@@ -721,20 +714,20 @@
   WideString cMsg = L"";
 
   if (params.size() >= 1)
-    bUI = pRuntime->ToBoolean(params[0].ToV8Value());
+    bUI = pRuntime->ToBoolean(params[0]);
   if (params.size() >= 2)
-    cTo = pRuntime->ToWideString(params[1].ToV8Value());
+    cTo = pRuntime->ToWideString(params[1]);
   if (params.size() >= 3)
-    cCc = pRuntime->ToWideString(params[2].ToV8Value());
+    cCc = pRuntime->ToWideString(params[2]);
   if (params.size() >= 4)
-    cBcc = pRuntime->ToWideString(params[3].ToV8Value());
+    cBcc = pRuntime->ToWideString(params[3]);
   if (params.size() >= 5)
-    cSubject = pRuntime->ToWideString(params[4].ToV8Value());
+    cSubject = pRuntime->ToWideString(params[4]);
   if (params.size() >= 6)
-    cMsg = pRuntime->ToWideString(params[5].ToV8Value());
+    cMsg = pRuntime->ToWideString(params[5]);
 
-  if (params.size() >= 1 && params[0].ToV8Value()->IsObject()) {
-    v8::Local<v8::Object> pObj = pRuntime->ToObject(params[0].ToV8Value());
+  if (params.size() >= 1 && params[0]->IsObject()) {
+    v8::Local<v8::Object> pObj = pRuntime->ToObject(params[0]);
     bUI = pRuntime->ToBoolean(pRuntime->GetObjectProperty(pObj, L"bUI"));
     cTo = pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cTo"));
     cCc = pRuntime->ToWideString(pRuntime->GetObjectProperty(pObj, L"cCc"));
@@ -759,7 +752,7 @@
 }
 
 bool Document::set_author(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "Author", sError);
 }
@@ -829,7 +822,7 @@
 }
 
 bool Document::set_info(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -854,7 +847,7 @@
 }
 
 bool Document::setPropertyInternal(CJS_Runtime* pRuntime,
-                                   const CJS_Value& vp,
+                                   v8::Local<v8::Value> vp,
                                    const ByteString& propName,
                                    WideString* sError) {
   if (!m_pFormFillEnv) {
@@ -870,7 +863,7 @@
     *sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return false;
   }
-  WideString csProperty = pRuntime->ToWideString(vp.ToV8Value());
+  WideString csProperty = pRuntime->ToWideString(vp);
   pDictionary->SetNewFor<CPDF_String>(propName, PDF_EncodeText(csProperty),
                                       false);
   m_pFormFillEnv->SetChangeMark();
@@ -884,7 +877,7 @@
 }
 
 bool Document::set_creation_date(CJS_Runtime* pRuntime,
-                                 const CJS_Value& vp,
+                                 v8::Local<v8::Value> vp,
                                  WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "CreationDate", sError);
 }
@@ -896,7 +889,7 @@
 }
 
 bool Document::set_creator(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "Creator", sError);
 }
@@ -913,7 +906,7 @@
 }
 
 bool Document::set_delay(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   if (!m_pFormFillEnv) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
@@ -925,7 +918,7 @@
     return false;
   }
 
-  m_bDelay = pRuntime->ToBoolean(vp.ToV8Value());
+  m_bDelay = pRuntime->ToBoolean(vp);
   if (m_bDelay) {
     m_DelayData.clear();
     return true;
@@ -946,7 +939,7 @@
 }
 
 bool Document::set_keywords(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "Keywords", sError);
 }
@@ -958,7 +951,7 @@
 }
 
 bool Document::set_mod_date(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "ModDate", sError);
 }
@@ -970,7 +963,7 @@
 }
 
 bool Document::set_producer(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "Producer", sError);
 }
@@ -982,7 +975,7 @@
 }
 
 bool Document::set_subject(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return setPropertyInternal(pRuntime, vp, "Subject", sError);
 }
@@ -998,7 +991,7 @@
 }
 
 bool Document::set_title(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   if (!m_pFormFillEnv || !m_pFormFillEnv->GetUnderlyingDocument()) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
@@ -1019,7 +1012,7 @@
 }
 
 bool Document::set_num_pages(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -1034,7 +1027,7 @@
 }
 
 bool Document::set_external(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return true;
 }
@@ -1047,7 +1040,7 @@
 }
 
 bool Document::set_filesize(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -1060,7 +1053,7 @@
 }
 
 bool Document::set_mouse_x(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return true;
 }
@@ -1072,7 +1065,7 @@
 }
 
 bool Document::set_mouse_y(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return true;
 }
@@ -1089,7 +1082,7 @@
 }
 
 bool Document::set_URL(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -1103,9 +1096,9 @@
 }
 
 bool Document::set_base_URL(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
-  m_cwBaseURL = pRuntime->ToWideString(vp.ToV8Value());
+  m_cwBaseURL = pRuntime->ToWideString(vp);
   return true;
 }
 
@@ -1123,7 +1116,7 @@
 }
 
 bool Document::set_calculate(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError) {
   if (!m_pFormFillEnv) {
     *sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
@@ -1131,7 +1124,7 @@
   }
 
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
-  pInterForm->EnableCalculate(pRuntime->ToBoolean(vp.ToV8Value()));
+  pInterForm->EnableCalculate(pRuntime->ToBoolean(vp));
   return true;
 }
 
@@ -1160,7 +1153,7 @@
 }
 
 bool Document::set_document_file_name(CJS_Runtime* pRuntime,
-                                      const CJS_Value& vp,
+                                      v8::Local<v8::Value> vp,
                                       WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -1179,7 +1172,7 @@
 }
 
 bool Document::set_path(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -1192,7 +1185,7 @@
 }
 
 bool Document::set_page_window_rect(CJS_Runtime* pRuntime,
-                                    const CJS_Value& vp,
+                                    v8::Local<v8::Value> vp,
                                     WideString* sError) {
   return true;
 }
@@ -1204,34 +1197,34 @@
 }
 
 bool Document::set_layout(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return true;
 }
 
 bool Document::addLink(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   return true;
 }
 
 bool Document::closeDoc(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   return true;
 }
 
 bool Document::getPageBox(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   return true;
 }
 
 bool Document::getAnnot(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   if (params.size() != 2) {
@@ -1243,8 +1236,8 @@
     return false;
   }
 
-  int nPageNo = pRuntime->ToInt32(params[0].ToV8Value());
-  WideString swAnnotName = pRuntime->ToWideString(params[1].ToV8Value());
+  int nPageNo = pRuntime->ToInt32(params[0]);
+  WideString swAnnotName = pRuntime->ToWideString(params[1]);
   CPDFSDK_PageView* pPageView = m_pFormFillEnv->GetPageView(nPageNo);
   if (!pPageView)
     return false;
@@ -1278,7 +1271,7 @@
 }
 
 bool Document::getAnnots(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -1311,9 +1304,10 @@
           static_cast<CJS_Annot*>(pRuntime->GetObjectPrivate(pObj));
       Annot* pAnnot = static_cast<Annot*>(pJS_Annot->GetEmbedObject());
       pAnnot->SetSDKAnnot(static_cast<CPDFSDK_BAAnnot*>(pSDKAnnotCur.Get()));
-      annots.SetElement(
-          pRuntime, i,
-          pJS_Annot ? CJS_Value(pJS_Annot->ToV8Object()) : CJS_Value());
+      annots.SetElement(pRuntime, i,
+                        pJS_Annot
+                            ? v8::Local<v8::Value>(pJS_Annot->ToV8Object())
+                            : v8::Local<v8::Value>());
     }
   }
   if (annots.ToV8Value().IsEmpty())
@@ -1324,7 +1318,7 @@
 }
 
 bool Document::getAnnot3D(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   vRet.Set(pRuntime->NewNull());
@@ -1332,21 +1326,21 @@
 }
 
 bool Document::getAnnots3D(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError) {
   return true;
 }
 
 bool Document::getOCGs(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   return true;
 }
 
 bool Document::getLinks(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   return true;
@@ -1358,7 +1352,7 @@
 }
 
 bool Document::addIcon(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   if (params.size() != 2) {
@@ -1366,19 +1360,19 @@
     return false;
   }
 
-  WideString swIconName = pRuntime->ToWideString(params[0].ToV8Value());
-  if (!params[1].ToV8Value()->IsObject()) {
+  WideString swIconName = pRuntime->ToWideString(params[0]);
+  if (!params[1]->IsObject()) {
     sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
     return false;
   }
 
-  v8::Local<v8::Object> pJSIcon = pRuntime->ToObject(params[1].ToV8Value());
+  v8::Local<v8::Object> pJSIcon = pRuntime->ToObject(params[1]);
   if (CFXJS_Engine::GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) {
     sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
     return false;
   }
 
-  v8::Local<v8::Object> pObj = pRuntime->ToObject(params[1].ToV8Value());
+  v8::Local<v8::Object> pObj = pRuntime->ToObject(params[1]);
   CJS_Object* obj = static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(pObj));
   if (!obj->GetEmbedObject()) {
     sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
@@ -1409,9 +1403,9 @@
         static_cast<CJS_Icon*>(pRuntime->GetObjectPrivate(pObj));
     Icon* pIcon = static_cast<Icon*>(pJS_Icon->GetEmbedObject());
     pIcon->SetIconName(name);
-    Icons.SetElement(
-        pRuntime, i++,
-        pJS_Icon ? CJS_Value(pJS_Icon->ToV8Object()) : CJS_Value());
+    Icons.SetElement(pRuntime, i++,
+                     pJS_Icon ? v8::Local<v8::Value>(pJS_Icon->ToV8Object())
+                              : v8::Local<v8::Value>());
   }
 
   if (Icons.ToV8Value().IsEmpty())
@@ -1423,14 +1417,14 @@
 }
 
 bool Document::set_icons(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
 }
 
 bool Document::getIcon(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   if (params.size() != 1) {
@@ -1438,7 +1432,7 @@
     return false;
   }
 
-  WideString swIconName = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString swIconName = pRuntime->ToWideString(params[0]);
   auto it = std::find(m_IconNames.begin(), m_IconNames.end(), swIconName);
   if (it == m_IconNames.end())
     return false;
@@ -1458,7 +1452,7 @@
 }
 
 bool Document::removeIcon(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   // Unsafe, no supported.
@@ -1466,7 +1460,7 @@
 }
 
 bool Document::createDataObject(CJS_Runtime* pRuntime,
-                                const std::vector<CJS_Value>& params,
+                                const std::vector<v8::Local<v8::Value>>& params,
                                 CJS_Value& vRet,
                                 WideString& sError) {
   // Unsafe, not implemented.
@@ -1480,13 +1474,13 @@
 }
 
 bool Document::set_media(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   return true;
 }
 
 bool Document::calculateNow(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -1510,13 +1504,13 @@
 }
 
 bool Document::set_collab(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return true;
 }
 
 bool Document::getPageNthWord(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
                               WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -1530,12 +1524,9 @@
 
   // TODO(tsepez): check maximum allowable params.
 
-  int nPageNo =
-      params.size() > 0 ? pRuntime->ToInt32(params[0].ToV8Value()) : 0;
-  int nWordNo =
-      params.size() > 1 ? pRuntime->ToInt32(params[1].ToV8Value()) : 0;
-  bool bStrip =
-      params.size() > 2 ? pRuntime->ToBoolean(params[2].ToV8Value()) : true;
+  int nPageNo = params.size() > 0 ? pRuntime->ToInt32(params[0]) : 0;
+  int nWordNo = params.size() > 1 ? pRuntime->ToInt32(params[1]) : 0;
+  bool bStrip = params.size() > 2 ? pRuntime->ToBoolean(params[2]) : true;
 
   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
   if (!pDocument)
@@ -1576,10 +1567,11 @@
   return true;
 }
 
-bool Document::getPageNthWordQuads(CJS_Runtime* pRuntime,
-                                   const std::vector<CJS_Value>& params,
-                                   CJS_Value& vRet,
-                                   WideString& sError) {
+bool Document::getPageNthWordQuads(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (!m_pFormFillEnv) {
     sError = JSGetStringFromID(IDS_STRING_JSBADOBJECT);
     return false;
@@ -1592,7 +1584,7 @@
 }
 
 bool Document::getPageNumWords(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError) {
   if (!m_pFormFillEnv) {
@@ -1603,8 +1595,7 @@
     sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return false;
   }
-  int nPageNo =
-      params.size() > 0 ? pRuntime->ToInt32(params[0].ToV8Value()) : 0;
+  int nPageNo = params.size() > 0 ? pRuntime->ToInt32(params[0]) : 0;
   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
   if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
     sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
@@ -1629,7 +1620,7 @@
 }
 
 bool Document::getPrintParams(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
                               WideString& sError) {
   v8::Local<v8::Object> pRetObj =
@@ -1721,7 +1712,7 @@
 }
 
 bool Document::set_zoom(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   return true;
 }
@@ -1732,13 +1723,13 @@
   return true;
 }
 bool Document::set_zoom_type(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError) {
   return true;
 }
 
 bool Document::deletePages(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError) {
   // Unsafe, no supported.
@@ -1746,7 +1737,7 @@
 }
 
 bool Document::extractPages(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError) {
   // Unsafe, not supported.
@@ -1754,7 +1745,7 @@
 }
 
 bool Document::insertPages(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError) {
   // Unsafe, not supported.
@@ -1762,7 +1753,7 @@
 }
 
 bool Document::replacePages(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError) {
   // Unsafe, not supported.
@@ -1770,7 +1761,7 @@
 }
 
 bool Document::getURL(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   // Unsafe, not supported.
@@ -1778,7 +1769,7 @@
 }
 
 bool Document::gotoNamedDest(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   if (params.size() != 1) {
@@ -1790,7 +1781,7 @@
     return false;
   }
 
-  WideString wideName = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString wideName = pRuntime->ToWideString(params[0]);
   CPDF_Document* pDocument = m_pFormFillEnv->GetPDFDocument();
   if (!pDocument)
     return false;
diff --git a/fpdfsdk/javascript/Document.h b/fpdfsdk/javascript/Document.h
index 49ac75b..4b49d7f 100644
--- a/fpdfsdk/javascript/Document.h
+++ b/fpdfsdk/javascript/Document.h
@@ -51,329 +51,339 @@
   ~Document() override;
 
   bool get_ADBE(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_ADBE(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_ADBE(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_author(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_author(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_base_URL(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_base_URL(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_bookmark_root(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_bookmark_root(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_calculate(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_calculate(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_collab(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_collab(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_creation_date(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_creation_date(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_creator(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_creator(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_delay(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_delay(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_dirty(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_dirty(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_document_file_name(CJS_Runtime* pRuntime,
                               CJS_Value* vp,
                               WideString* sError);
   bool set_document_file_name(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError);
 
   bool get_external(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_external(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_filesize(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_filesize(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_icons(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_icons(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_info(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_info(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_info(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_keywords(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_keywords(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_layout(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_layout(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_media(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_media(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_mod_date(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_mod_date(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_mouse_x(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_mouse_x(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_mouse_y(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_mouse_y(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_num_fields(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_num_fields(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_num_pages(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_num_pages(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_page_num(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_page_num(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_page_window_rect(CJS_Runtime* pRuntime,
                             CJS_Value* vp,
                             WideString* sError);
   bool set_page_window_rect(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError);
 
   bool get_path(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_path(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_path(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_producer(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_producer(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_subject(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_subject(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_title(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_title(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_zoom(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_zoom(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_zoom(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_zoom_type(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_zoom_type(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_URL(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_URL(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_URL(CJS_Runtime* pRuntime,
+               v8::Local<v8::Value> vp,
+               WideString* sError);
 
   bool addAnnot(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool addField(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool addLink(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool addIcon(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool calculateNow(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool closeDoc(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool createDataObject(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError);
   bool deletePages(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool exportAsText(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool exportAsFDF(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool exportAsXFDF(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool extractPages(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool getAnnot(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool getAnnots(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool getAnnot3D(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
   bool getAnnots3D(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool getField(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool getIcon(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool getLinks(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool getNthFieldName(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError);
   bool getOCGs(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool getPageBox(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
   bool getPageNthWord(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError);
   bool getPageNthWordQuads(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError);
   bool getPageNumWords(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError);
   bool getPrintParams(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError);
   bool getURL(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool gotoNamedDest(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool importAnFDF(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool importAnXFDF(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool importTextData(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError);
   bool insertPages(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool mailForm(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool print(CJS_Runtime* pRuntime,
-             const std::vector<CJS_Value>& params,
+             const std::vector<v8::Local<v8::Value>>& params,
              CJS_Value& vRet,
              WideString& sError);
   bool removeField(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool replacePages(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool resetForm(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool saveAs(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool submitForm(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
   bool syncAnnotScan(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool mailDoc(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool removeIcon(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
 
@@ -395,7 +405,7 @@
                            const ByteString& propName,
                            WideString* sError);
   bool setPropertyInternal(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            const ByteString& propName,
                            WideString* sError);
 
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 93017c4..d530ef8 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -416,7 +416,7 @@
 }
 
 bool Field::set_alignment(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -464,15 +464,14 @@
 }
 
 bool Field::set_border_style(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
   if (!m_bCanSet)
     return false;
 
-  ByteString byte_str =
-      ByteString::FromUnicode(pRuntime->ToWideString(vp.ToV8Value()));
+  ByteString byte_str = ByteString::FromUnicode(pRuntime->ToWideString(vp));
   if (m_bDelay) {
     AddDelay_String(FP_BORDERSTYLE, byte_str);
   } else {
@@ -562,7 +561,7 @@
 }
 
 bool Field::set_button_align_x(CJS_Runtime* pRuntime,
-                               const CJS_Value& vp,
+                               v8::Local<v8::Value> vp,
                                WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -596,7 +595,7 @@
 }
 
 bool Field::set_button_align_y(CJS_Runtime* pRuntime,
-                               const CJS_Value& vp,
+                               v8::Local<v8::Value> vp,
                                WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -624,7 +623,7 @@
 }
 
 bool Field::set_button_fit_bounds(CJS_Runtime* pRuntime,
-                                  const CJS_Value& vp,
+                                  v8::Local<v8::Value> vp,
                                   WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -652,7 +651,7 @@
 }
 
 bool Field::set_button_position(CJS_Runtime* pRuntime,
-                                const CJS_Value& vp,
+                                v8::Local<v8::Value> vp,
                                 WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -681,7 +680,7 @@
 }
 
 bool Field::set_button_scale_how(CJS_Runtime* pRuntime,
-                                 const CJS_Value& vp,
+                                 v8::Local<v8::Value> vp,
                                  WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -724,7 +723,7 @@
 }
 
 bool Field::set_button_scale_when(CJS_Runtime* pRuntime,
-                                  const CJS_Value& vp,
+                                  v8::Local<v8::Value> vp,
                                   WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -753,7 +752,7 @@
 }
 
 bool Field::set_calc_order_index(CJS_Runtime* pRuntime,
-                                 const CJS_Value& vp,
+                                 v8::Local<v8::Value> vp,
                                  WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -777,7 +776,7 @@
 }
 
 bool Field::set_char_limit(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -800,7 +799,7 @@
 }
 
 bool Field::set_comb(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -827,7 +826,7 @@
 }
 
 bool Field::set_commit_on_sel_change(CJS_Runtime* pRuntime,
-                                     const CJS_Value& vp,
+                                     v8::Local<v8::Value> vp,
                                      WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -858,9 +857,8 @@
 
   CJS_Array SelArray;
   for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
-    SelArray.SetElement(
-        pRuntime, i,
-        CJS_Value(pRuntime->NewNumber(pFormField->GetSelectedIndex(i))));
+    SelArray.SetElement(pRuntime, i,
+                        pRuntime->NewNumber(pFormField->GetSelectedIndex(i)));
   }
   if (SelArray.ToV8Value().IsEmpty())
     vp->Set(pRuntime->NewArray());
@@ -871,19 +869,18 @@
 }
 
 bool Field::set_current_value_indices(CJS_Runtime* pRuntime,
-                                      const CJS_Value& vp,
+                                      v8::Local<v8::Value> vp,
                                       WideString* sError) {
   if (!m_bCanSet)
     return false;
 
   std::vector<uint32_t> array;
-  if (vp.ToV8Value()->IsNumber()) {
-    array.push_back(pRuntime->ToInt32(vp.ToV8Value()));
-  } else if (!vp.ToV8Value().IsEmpty() && vp.ToV8Value()->IsArray()) {
-    CJS_Array SelArray(pRuntime->ToArray(vp.ToV8Value()));
+  if (vp->IsNumber()) {
+    array.push_back(pRuntime->ToInt32(vp));
+  } else if (!vp.IsEmpty() && vp->IsArray()) {
+    CJS_Array SelArray(pRuntime->ToArray(vp));
     for (int i = 0, sz = SelArray.GetLength(pRuntime); i < sz; i++)
-      array.push_back(
-          pRuntime->ToInt32(SelArray.GetElement(pRuntime, i).ToV8Value()));
+      array.push_back(pRuntime->ToInt32(SelArray.GetElement(pRuntime, i)));
   }
 
   if (m_bDelay) {
@@ -928,7 +925,7 @@
 }
 
 bool Field::set_default_style(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError) {
   return false;
 }
@@ -953,7 +950,7 @@
 }
 
 bool Field::set_default_value(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -978,7 +975,7 @@
 }
 
 bool Field::set_do_not_scroll(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1005,7 +1002,7 @@
 }
 
 bool Field::set_do_not_spell_check(CJS_Runtime* pRuntime,
-                                   const CJS_Value& vp,
+                                   v8::Local<v8::Value> vp,
                                    WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1028,12 +1025,12 @@
 }
 
 bool Field::set_delay(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   if (!m_bCanSet)
     return false;
 
-  SetDelay(pRuntime->ToBoolean(vp.ToV8Value()));
+  SetDelay(pRuntime->ToBoolean(vp));
   return true;
 }
 
@@ -1070,16 +1067,16 @@
 }
 
 bool Field::set_display(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   if (!m_bCanSet)
     return false;
 
   if (m_bDelay) {
-    AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp.ToV8Value()));
+    AddDelay_Int(FP_DISPLAY, pRuntime->ToInt32(vp));
   } else {
     Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                      pRuntime->ToInt32(vp.ToV8Value()));
+                      pRuntime->ToInt32(vp));
   }
   return true;
 }
@@ -1126,7 +1123,7 @@
 }
 
 bool Field::set_doc(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError) {
   return false;
 }
@@ -1148,7 +1145,7 @@
 }
 
 bool Field::set_editable(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   return m_bCanSet;
 }
@@ -1172,8 +1169,7 @@
       CPDF_FormControl* pFormControl = pFormField->GetControl(i);
       ExportValuesArray.SetElement(
           pRuntime, i,
-          CJS_Value(
-              pRuntime->NewString(pFormControl->GetExportValue().c_str())));
+          pRuntime->NewString(pFormControl->GetExportValue().c_str()));
     }
   } else {
     if (m_nFormControlIndex >= pFormField->CountControls())
@@ -1186,7 +1182,7 @@
 
     ExportValuesArray.SetElement(
         pRuntime, 0,
-        CJS_Value(pRuntime->NewString(pFormControl->GetExportValue().c_str())));
+        pRuntime->NewString(pFormControl->GetExportValue().c_str()));
   }
 
   if (ExportValuesArray.ToV8Value().IsEmpty())
@@ -1198,7 +1194,7 @@
 }
 
 bool Field::set_export_values(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1210,7 +1206,7 @@
     return false;
   }
 
-  return m_bCanSet && !vp.ToV8Value().IsEmpty() && vp.ToV8Value()->IsArray();
+  return m_bCanSet && !vp.IsEmpty() && vp->IsArray();
 }
 
 bool Field::get_file_select(CJS_Runtime* pRuntime,
@@ -1230,7 +1226,7 @@
 }
 
 bool Field::set_file_select(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1290,14 +1286,14 @@
 }
 
 bool Field::set_fill_color(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
   if (!m_bCanSet)
     return false;
-  if (vp.ToV8Value().IsEmpty() || !vp.ToV8Value()->IsArray())
+  if (vp.IsEmpty() || !vp->IsArray())
     return false;
   return true;
 }
@@ -1325,16 +1321,16 @@
 }
 
 bool Field::set_hidden(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   if (!m_bCanSet)
     return false;
 
   if (m_bDelay) {
-    AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp.ToV8Value()));
+    AddDelay_Bool(FP_HIDDEN, pRuntime->ToBoolean(vp));
   } else {
     Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                     pRuntime->ToBoolean(vp.ToV8Value()));
+                     pRuntime->ToBoolean(vp));
   }
   return true;
 }
@@ -1386,7 +1382,7 @@
 }
 
 bool Field::set_highlight(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1419,16 +1415,16 @@
 }
 
 bool Field::set_line_width(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   if (!m_bCanSet)
     return false;
 
   if (m_bDelay) {
-    AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp.ToV8Value()));
+    AddDelay_Int(FP_LINEWIDTH, pRuntime->ToInt32(vp));
   } else {
     Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
-                        pRuntime->ToInt32(vp.ToV8Value()));
+                        pRuntime->ToInt32(vp));
   }
   return true;
 }
@@ -1491,7 +1487,7 @@
 }
 
 bool Field::set_multiline(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1515,7 +1511,7 @@
 }
 
 bool Field::set_multiple_selection(CJS_Runtime* pRuntime,
-                                   const CJS_Value& vp,
+                                   v8::Local<v8::Value> vp,
                                    WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1531,7 +1527,7 @@
 }
 
 bool Field::set_name(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return false;
 }
@@ -1554,7 +1550,7 @@
 }
 
 bool Field::set_num_items(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return false;
 }
@@ -1588,9 +1584,9 @@
     if (!pPageView)
       return false;
 
-    PageArray.SetElement(pRuntime, i,
-                         CJS_Value(pRuntime->NewNumber(
-                             static_cast<int32_t>(pPageView->GetPageIndex()))));
+    PageArray.SetElement(
+        pRuntime, i,
+        pRuntime->NewNumber(static_cast<int32_t>(pPageView->GetPageIndex())));
     ++i;
   }
 
@@ -1603,7 +1599,7 @@
 }
 
 bool Field::set_page(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   *sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
   return false;
@@ -1628,7 +1624,7 @@
 }
 
 bool Field::set_password(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1653,7 +1649,7 @@
 }
 
 bool Field::set_print(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   CPDFSDK_InterForm* pInterForm = m_pFormFillEnv->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1670,7 +1666,7 @@
           if (CPDFSDK_Widget* pWidget =
                   pInterForm->GetWidget(pFormField->GetControl(i))) {
             uint32_t dwFlags = pWidget->GetFlags();
-            if (pRuntime->ToBoolean(vp.ToV8Value()))
+            if (pRuntime->ToBoolean(vp))
               dwFlags |= ANNOTFLAG_PRINT;
             else
               dwFlags &= ~ANNOTFLAG_PRINT;
@@ -1694,7 +1690,7 @@
               pFormField->GetControl(m_nFormControlIndex)) {
         if (CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl)) {
           uint32_t dwFlags = pWidget->GetFlags();
-          if (pRuntime->ToBoolean(vp.ToV8Value()))
+          if (pRuntime->ToBoolean(vp))
             dwFlags |= ANNOTFLAG_PRINT;
           else
             dwFlags &= ~ANNOTFLAG_PRINT;
@@ -1728,7 +1724,7 @@
 }
 
 bool Field::set_radios_in_unison(CJS_Runtime* pRuntime,
-                                 const CJS_Value& vp,
+                                 v8::Local<v8::Value> vp,
                                  WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1749,7 +1745,7 @@
 }
 
 bool Field::set_readonly(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1771,18 +1767,14 @@
 
   CFX_FloatRect crRect = pWidget->GetRect();
   CJS_Array rcArray;
-  rcArray.SetElement(
-      pRuntime, 0,
-      CJS_Value(pRuntime->NewNumber(static_cast<int32_t>(crRect.left))));
-  rcArray.SetElement(
-      pRuntime, 1,
-      CJS_Value(pRuntime->NewNumber(static_cast<int32_t>(crRect.top))));
-  rcArray.SetElement(
-      pRuntime, 2,
-      CJS_Value(pRuntime->NewNumber(static_cast<int32_t>(crRect.right))));
-  rcArray.SetElement(
-      pRuntime, 3,
-      CJS_Value(pRuntime->NewNumber(static_cast<int32_t>(crRect.bottom))));
+  rcArray.SetElement(pRuntime, 0,
+                     pRuntime->NewNumber(static_cast<int32_t>(crRect.left)));
+  rcArray.SetElement(pRuntime, 1,
+                     pRuntime->NewNumber(static_cast<int32_t>(crRect.top)));
+  rcArray.SetElement(pRuntime, 2,
+                     pRuntime->NewNumber(static_cast<int32_t>(crRect.right)));
+  rcArray.SetElement(pRuntime, 3,
+                     pRuntime->NewNumber(static_cast<int32_t>(crRect.bottom)));
 
   if (rcArray.ToV8Value().IsEmpty())
     vp->Set(pRuntime->NewArray());
@@ -1793,23 +1785,23 @@
 }
 
 bool Field::set_rect(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   if (!m_bCanSet)
     return false;
-  if (vp.ToV8Value().IsEmpty() || !vp.ToV8Value()->IsArray())
+  if (vp.IsEmpty() || !vp->IsArray())
     return false;
 
-  CJS_Array rcArray(pRuntime->ToArray(vp.ToV8Value()));
+  CJS_Array rcArray(pRuntime->ToArray(vp));
   float pArray[4];
-  pArray[0] = static_cast<float>(
-      pRuntime->ToInt32(rcArray.GetElement(pRuntime, 0).ToV8Value()));
-  pArray[1] = static_cast<float>(
-      pRuntime->ToInt32(rcArray.GetElement(pRuntime, 1).ToV8Value()));
-  pArray[2] = static_cast<float>(
-      pRuntime->ToInt32(rcArray.GetElement(pRuntime, 2).ToV8Value()));
-  pArray[3] = static_cast<float>(
-      pRuntime->ToInt32(rcArray.GetElement(pRuntime, 3).ToV8Value()));
+  pArray[0] =
+      static_cast<float>(pRuntime->ToInt32(rcArray.GetElement(pRuntime, 0)));
+  pArray[1] =
+      static_cast<float>(pRuntime->ToInt32(rcArray.GetElement(pRuntime, 1)));
+  pArray[2] =
+      static_cast<float>(pRuntime->ToInt32(rcArray.GetElement(pRuntime, 2)));
+  pArray[3] =
+      static_cast<float>(pRuntime->ToInt32(rcArray.GetElement(pRuntime, 3)));
 
   CFX_FloatRect crRect(pArray);
   if (m_bDelay) {
@@ -1898,7 +1890,7 @@
 }
 
 bool Field::set_required(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -1926,7 +1918,7 @@
 }
 
 bool Field::set_rich_text(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -1939,7 +1931,7 @@
 }
 
 bool Field::set_rich_value(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return true;
 }
@@ -1963,7 +1955,7 @@
 }
 
 bool Field::set_rotation(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -2013,11 +2005,11 @@
 }
 
 bool Field::set_stroke_color(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError) {
   if (!m_bCanSet)
     return false;
-  if (vp.ToV8Value().IsEmpty() || !vp.ToV8Value()->IsArray())
+  if (vp.IsEmpty() || !vp->IsArray())
     return false;
   return true;
 }
@@ -2070,7 +2062,7 @@
 }
 
 bool Field::set_style(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -2083,7 +2075,7 @@
 }
 
 bool Field::set_submit_name(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return true;
 }
@@ -2127,11 +2119,11 @@
 }
 
 bool Field::set_text_color(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   if (!m_bCanSet)
     return false;
-  if (vp.ToV8Value().IsEmpty() || !vp.ToV8Value()->IsArray())
+  if (vp.IsEmpty() || !vp->IsArray())
     return false;
   return true;
 }
@@ -2166,14 +2158,13 @@
 }
 
 bool Field::set_text_font(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
 
   if (!m_bCanSet)
     return false;
-  return !ByteString::FromUnicode(pRuntime->ToWideString(vp.ToV8Value()))
-              .IsEmpty();
+  return !ByteString::FromUnicode(pRuntime->ToWideString(vp)).IsEmpty();
 }
 
 bool Field::get_text_size(CJS_Runtime* pRuntime,
@@ -2199,7 +2190,7 @@
 }
 
 bool Field::set_text_size(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -2244,7 +2235,7 @@
 }
 
 bool Field::set_type(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return false;
 }
@@ -2263,7 +2254,7 @@
 }
 
 bool Field::set_user_name(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   ASSERT(m_pFormFillEnv);
   return m_bCanSet;
@@ -2287,17 +2278,15 @@
     case FIELDTYPE_LISTBOX: {
       if (pFormField->CountSelectedItems() > 1) {
         CJS_Array ValueArray;
-        CJS_Value ElementValue;
+        v8::Local<v8::Value> ElementValue;
         int iIndex;
         for (int i = 0, sz = pFormField->CountSelectedItems(); i < sz; i++) {
           iIndex = pFormField->GetSelectedIndex(i);
-          ElementValue = CJS_Value(
-              pRuntime->NewString(pFormField->GetOptionValue(iIndex).c_str()));
-          if (wcslen(
-                  pRuntime->ToWideString(ElementValue.ToV8Value()).c_str()) ==
-              0) {
-            ElementValue = CJS_Value(pRuntime->NewString(
-                pFormField->GetOptionLabel(iIndex).c_str()));
+          ElementValue =
+              pRuntime->NewString(pFormField->GetOptionValue(iIndex).c_str());
+          if (wcslen(pRuntime->ToWideString(ElementValue).c_str()) == 0) {
+            ElementValue =
+                pRuntime->NewString(pFormField->GetOptionLabel(iIndex).c_str());
           }
           ValueArray.SetElement(pRuntime, i, ElementValue);
         }
@@ -2336,20 +2325,20 @@
 }
 
 bool Field::set_value(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   if (!m_bCanSet)
     return false;
 
   std::vector<WideString> strArray;
-  if (!vp.ToV8Value().IsEmpty() && vp.ToV8Value()->IsArray()) {
-    CJS_Array ValueArray(pRuntime->ToArray(vp.ToV8Value()));
+  if (!vp.IsEmpty() && vp->IsArray()) {
+    CJS_Array ValueArray(pRuntime->ToArray(vp));
     for (int i = 0, sz = ValueArray.GetLength(pRuntime); i < sz; i++) {
-      CJS_Value ElementValue(ValueArray.GetElement(pRuntime, i));
-      strArray.push_back(pRuntime->ToWideString(ElementValue.ToV8Value()));
+      strArray.push_back(
+          pRuntime->ToWideString(ValueArray.GetElement(pRuntime, i)));
     }
   } else {
-    strArray.push_back(pRuntime->ToWideString(vp.ToV8Value()));
+    strArray.push_back(pRuntime->ToWideString(vp));
   }
 
   if (m_bDelay) {
@@ -2460,15 +2449,16 @@
 }
 
 bool Field::set_value_as_string(CJS_Runtime* pRuntime,
-                                const CJS_Value& vp,
+                                v8::Local<v8::Value> vp,
                                 WideString* sError) {
   return false;
 }
 
-bool Field::browseForFileToSubmit(CJS_Runtime* pRuntime,
-                                  const std::vector<CJS_Value>& params,
-                                  CJS_Value& vRet,
-                                  WideString& sError) {
+bool Field::browseForFileToSubmit(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2487,13 +2477,13 @@
 }
 
 bool Field::buttonGetCaption(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   int nface = 0;
   int iSize = params.size();
   if (iSize >= 1)
-    nface = pRuntime->ToInt32(params[0].ToV8Value());
+    nface = pRuntime->ToInt32(params[0]);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -2523,11 +2513,11 @@
 }
 
 bool Field::buttonGetIcon(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   if (params.size() >= 1) {
-    int nFace = pRuntime->ToInt32(params[0].ToV8Value());
+    int nFace = pRuntime->ToInt32(params[0]);
     if (nFace < 0 || nFace > 2)
       return false;
   }
@@ -2557,28 +2547,28 @@
 }
 
 bool Field::buttonImportIcon(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   return true;
 }
 
 bool Field::buttonSetCaption(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   return false;
 }
 
 bool Field::buttonSetIcon(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   return false;
 }
 
 bool Field::checkThisBox(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError) {
   int iSize = params.size();
@@ -2588,10 +2578,10 @@
   if (!m_bCanSet)
     return false;
 
-  int nWidget = pRuntime->ToInt32(params[0].ToV8Value());
+  int nWidget = pRuntime->ToInt32(params[0]);
   bool bCheckit = true;
   if (iSize >= 2)
-    bCheckit = pRuntime->ToBoolean(params[1].ToV8Value());
+    bCheckit = pRuntime->ToBoolean(params[1]);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -2615,14 +2605,14 @@
 }
 
 bool Field::clearItems(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   return true;
 }
 
 bool Field::defaultIsChecked(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   if (!m_bCanSet)
@@ -2632,7 +2622,7 @@
   if (iSize < 1)
     return false;
 
-  int nWidget = pRuntime->ToInt32(params[0].ToV8Value());
+  int nWidget = pRuntime->ToInt32(params[0]);
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return false;
@@ -2649,14 +2639,14 @@
 }
 
 bool Field::deleteItemAt(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError) {
   return true;
 }
 
 bool Field::getArray(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -2686,9 +2676,10 @@
         static_cast<CJS_Field*>(pRuntime->GetObjectPrivate(pObj));
     Field* pField = static_cast<Field*>(pJSField->GetEmbedObject());
     pField->AttachField(m_pJSDoc, *pStr);
-    FormFieldArray.SetElement(
-        pRuntime, j++,
-        pJSField ? CJS_Value(pJSField->ToV8Object()) : CJS_Value());
+    FormFieldArray.SetElement(pRuntime, j++,
+                              pJSField
+                                  ? v8::Local<v8::Value>(pJSField->ToV8Object())
+                                  : v8::Local<v8::Value>());
   }
 
   if (FormFieldArray.ToV8Value().IsEmpty())
@@ -2700,17 +2691,17 @@
 }
 
 bool Field::getItemAt(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   int iSize = params.size();
   int nIdx = -1;
   if (iSize >= 1)
-    nIdx = pRuntime->ToInt32(params[0].ToV8Value());
+    nIdx = pRuntime->ToInt32(params[0]);
 
   bool bExport = true;
   if (iSize >= 2)
-    bExport = pRuntime->ToBoolean(params[1].ToV8Value());
+    bExport = pRuntime->ToBoolean(params[1]);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -2740,26 +2731,26 @@
 }
 
 bool Field::getLock(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   return false;
 }
 
 bool Field::insertItemAt(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError) {
   return true;
 }
 
 bool Field::isBoxChecked(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError) {
   int nIndex = -1;
   if (params.size() >= 1)
-    nIndex = pRuntime->ToInt32(params[0].ToV8Value());
+    nIndex = pRuntime->ToInt32(params[0]);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -2777,12 +2768,12 @@
 }
 
 bool Field::isDefaultChecked(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError) {
   int nIndex = -1;
   if (params.size() >= 1)
-    nIndex = pRuntime->ToInt32(params[0].ToV8Value());
+    nIndex = pRuntime->ToInt32(params[0]);
 
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
@@ -2800,14 +2791,14 @@
 }
 
 bool Field::setAction(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   return true;
 }
 
 bool Field::setFocus(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError) {
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -2852,56 +2843,59 @@
 }
 
 bool Field::setItems(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError) {
   return true;
 }
 
 bool Field::setLock(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   return false;
 }
 
-bool Field::signatureGetModifications(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool Field::signatureGetModifications(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   return false;
 }
 
-bool Field::signatureGetSeedValue(CJS_Runtime* pRuntime,
-                                  const std::vector<CJS_Value>& params,
-                                  CJS_Value& vRet,
-                                  WideString& sError) {
+bool Field::signatureGetSeedValue(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   return false;
 }
 
 bool Field::signatureInfo(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   return false;
 }
 
-bool Field::signatureSetSeedValue(CJS_Runtime* pRuntime,
-                                  const std::vector<CJS_Value>& params,
-                                  CJS_Value& vRet,
-                                  WideString& sError) {
+bool Field::signatureSetSeedValue(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   return false;
 }
 
 bool Field::signatureSign(CJS_Runtime* pRuntime,
-                          const std::vector<CJS_Value>& params,
+                          const std::vector<v8::Local<v8::Value>>& params,
                           CJS_Value& vRet,
                           WideString& sError) {
   return false;
 }
 
 bool Field::signatureValidate(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
                               WideString& sError) {
   return false;
@@ -2915,7 +2909,7 @@
 }
 
 bool Field::set_source(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   return true;
 }
diff --git a/fpdfsdk/javascript/Field.h b/fpdfsdk/javascript/Field.h
index 8dcdbc6..8ea8459 100644
--- a/fpdfsdk/javascript/Field.h
+++ b/fpdfsdk/javascript/Field.h
@@ -55,396 +55,409 @@
 
   bool get_alignment(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_alignment(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_border_style(CJS_Runtime* pRuntime,
                         CJS_Value* vp,
                         WideString* sError);
   bool set_border_style(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError);
 
   bool get_button_align_x(CJS_Runtime* pRuntime,
                           CJS_Value* vp,
                           WideString* sError);
   bool set_button_align_x(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError);
 
   bool get_button_align_y(CJS_Runtime* pRuntime,
                           CJS_Value* vp,
                           WideString* sError);
   bool set_button_align_y(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError);
 
   bool get_button_fit_bounds(CJS_Runtime* pRuntime,
                              CJS_Value* vp,
                              WideString* sError);
   bool set_button_fit_bounds(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError);
 
   bool get_button_position(CJS_Runtime* pRuntime,
                            CJS_Value* vp,
                            WideString* sError);
   bool set_button_position(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError);
 
   bool get_button_scale_how(CJS_Runtime* pRuntime,
                             CJS_Value* vp,
                             WideString* sError);
   bool set_button_scale_how(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError);
 
   bool get_button_scale_when(CJS_Runtime* pRuntime,
                              CJS_Value* vp,
                              WideString* sError);
   bool set_button_scale_when(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError);
 
   bool get_calc_order_index(CJS_Runtime* pRuntime,
                             CJS_Value* vp,
                             WideString* sError);
   bool set_calc_order_index(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError);
 
   bool get_char_limit(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_char_limit(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_comb(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_comb(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_comb(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_commit_on_sel_change(CJS_Runtime* pRuntime,
                                 CJS_Value* vp,
                                 WideString* sError);
   bool set_commit_on_sel_change(CJS_Runtime* pRuntime,
-                                const CJS_Value& vp,
+                                v8::Local<v8::Value> vp,
                                 WideString* sError);
 
   bool get_current_value_indices(CJS_Runtime* pRuntime,
                                  CJS_Value* vp,
                                  WideString* sError);
   bool set_current_value_indices(CJS_Runtime* pRuntime,
-                                 const CJS_Value& vp,
+                                 v8::Local<v8::Value> vp,
                                  WideString* sError);
 
   bool get_default_style(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_default_style(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_default_value(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_default_value(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_do_not_scroll(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_do_not_scroll(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_do_not_spell_check(CJS_Runtime* pRuntime,
                               CJS_Value* vp,
                               WideString* sError);
   bool set_do_not_spell_check(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError);
 
   bool get_delay(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_delay(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_display(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_display(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_doc(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_doc(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_doc(CJS_Runtime* pRuntime,
+               v8::Local<v8::Value> vp,
+               WideString* sError);
 
   bool get_editable(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_editable(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_export_values(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_export_values(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_file_select(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_file_select(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_fill_color(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_fill_color(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_hidden(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_hidden(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_highlight(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_highlight(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_line_width(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_line_width(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_multiline(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_multiline(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_multiple_selection(CJS_Runtime* pRuntime,
                               CJS_Value* vp,
                               WideString* sError);
   bool set_multiple_selection(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               WideString* sError);
 
   bool get_name(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_name(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_num_items(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_num_items(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_page(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_page(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_page(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_password(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_password(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_print(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_print(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_radios_in_unison(CJS_Runtime* pRuntime,
                             CJS_Value* vp,
                             WideString* sError);
   bool set_radios_in_unison(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError);
 
   bool get_readonly(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_readonly(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_rect(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_rect(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_rect(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_required(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_required(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_rich_text(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_rich_text(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_rich_value(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_rich_value(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_rotation(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_rotation(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_stroke_color(CJS_Runtime* pRuntime,
                         CJS_Value* vp,
                         WideString* sError);
   bool set_stroke_color(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError);
 
   bool get_style(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_style(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_submit_name(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_submit_name(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_text_color(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_text_color(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_text_font(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_text_font(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_text_size(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_text_size(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_type(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_type(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_type(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_user_name(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_user_name(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_value(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_value(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_value_as_string(CJS_Runtime* pRuntime,
                            CJS_Value* vp,
                            WideString* sError);
   bool set_value_as_string(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError);
 
   bool get_source(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_source(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool browseForFileToSubmit(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError);
   bool buttonGetCaption(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError);
   bool buttonGetIcon(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool buttonImportIcon(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError);
   bool buttonSetCaption(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError);
   bool buttonSetIcon(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool checkThisBox(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool clearItems(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
   bool defaultIsChecked(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError);
   bool deleteItemAt(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool getArray(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool getItemAt(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool getLock(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool insertItemAt(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool isBoxChecked(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool isDefaultChecked(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError);
   bool setAction(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool setFocus(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool setItems(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool setLock(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
-  bool signatureGetModifications(CJS_Runtime* pRuntime,
-                                 const std::vector<CJS_Value>& params,
-                                 CJS_Value& vRet,
-                                 WideString& sError);
+  bool signatureGetModifications(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
   bool signatureGetSeedValue(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError);
   bool signatureInfo(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool signatureSetSeedValue(CJS_Runtime* pRuntime,
-                             const std::vector<CJS_Value>& params,
+                             const std::vector<v8::Local<v8::Value>>& params,
                              CJS_Value& vRet,
                              WideString& sError);
   bool signatureSign(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool signatureValidate(CJS_Runtime* pRuntime,
-                         const std::vector<CJS_Value>& params,
+                         const std::vector<v8::Local<v8::Value>>& params,
                          CJS_Value& vRet,
                          WideString& sError);
 
diff --git a/fpdfsdk/javascript/Icon.cpp b/fpdfsdk/javascript/Icon.cpp
index 53f549d..dbd3e64 100644
--- a/fpdfsdk/javascript/Icon.cpp
+++ b/fpdfsdk/javascript/Icon.cpp
@@ -31,7 +31,7 @@
 }
 
 bool Icon::set_name(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError) {
   return false;
 }
diff --git a/fpdfsdk/javascript/Icon.h b/fpdfsdk/javascript/Icon.h
index 261ad63..89c185a 100644
--- a/fpdfsdk/javascript/Icon.h
+++ b/fpdfsdk/javascript/Icon.h
@@ -17,7 +17,9 @@
   ~Icon() override;
 
   bool get_name(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_name(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   WideString GetIconName() const { return m_swIconName; }
   void SetIconName(WideString name) { m_swIconName = name; }
diff --git a/fpdfsdk/javascript/JS_Define.h b/fpdfsdk/javascript/JS_Define.h
index 46469d7..819cc9c 100644
--- a/fpdfsdk/javascript/JS_Define.h
+++ b/fpdfsdk/javascript/JS_Define.h
@@ -61,7 +61,8 @@
   info.GetReturnValue().Set(prop_value.ToV8Value());
 }
 
-template <class C, bool (C::*M)(CJS_Runtime*, const CJS_Value&, WideString*)>
+template <class C,
+          bool (C::*M)(CJS_Runtime*, v8::Local<v8::Value>, WideString*)>
 void JSPropSetter(const char* prop_name_string,
                   const char* class_name_string,
                   v8::Local<v8::String> property,
@@ -80,8 +81,7 @@
   C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
   WideString sError;
 
-  CJS_Value prop_value(value);
-  if (!(pObj->*M)(pRuntime, prop_value, &sError)) {
+  if (!(pObj->*M)(pRuntime, value, &sError)) {
     pRuntime->Error(
         JSFormatErrorString(class_name_string, prop_name_string, sError));
   }
@@ -103,7 +103,7 @@
 
 template <class C,
           bool (C::*M)(CJS_Runtime*,
-                       const std::vector<CJS_Value>&,
+                       const std::vector<v8::Local<v8::Value>>&,
                        CJS_Value&,
                        WideString&)>
 void JSMethod(const char* method_name_string,
@@ -114,9 +114,9 @@
   if (!pRuntime)
     return;
 
-  std::vector<CJS_Value> parameters;
+  std::vector<v8::Local<v8::Value>> parameters;
   for (unsigned int i = 0; i < (unsigned int)info.Length(); i++)
-    parameters.push_back(CJS_Value(info[i]));
+    parameters.push_back(info[i]);
 
   CJS_Object* pJSObj =
       static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
diff --git a/fpdfsdk/javascript/JS_Value.cpp b/fpdfsdk/javascript/JS_Value.cpp
index ddea0a4..bac338a 100644
--- a/fpdfsdk/javascript/JS_Value.cpp
+++ b/fpdfsdk/javascript/JS_Value.cpp
@@ -202,20 +202,20 @@
 
 CJS_Array::~CJS_Array() {}
 
-CJS_Value CJS_Array::GetElement(CJS_Runtime* pRuntime, unsigned index) const {
+v8::Local<v8::Value> CJS_Array::GetElement(CJS_Runtime* pRuntime,
+                                           unsigned index) const {
   if (!m_pArray.IsEmpty())
-    return CJS_Value(
-        v8::Local<v8::Value>(pRuntime->GetArrayElement(m_pArray, index)));
+    return {pRuntime->GetArrayElement(m_pArray, index)};
   return {};
 }
 
 void CJS_Array::SetElement(CJS_Runtime* pRuntime,
                            unsigned index,
-                           const CJS_Value& value) {
+                           v8::Local<v8::Value> value) {
   if (m_pArray.IsEmpty())
     m_pArray = pRuntime->NewArray();
 
-  pRuntime->PutArrayElement(m_pArray, index, value.ToV8Value());
+  pRuntime->PutArrayElement(m_pArray, index, value);
 }
 
 int CJS_Array::GetLength(CJS_Runtime* pRuntime) const {
@@ -393,33 +393,34 @@
   return day * 86400000 + time;
 }
 
-std::vector<CJS_Value> ExpandKeywordParams(
+std::vector<v8::Local<v8::Value>> ExpandKeywordParams(
     CJS_Runtime* pRuntime,
-    const std::vector<CJS_Value>& originals,
+    const std::vector<v8::Local<v8::Value>>& originals,
     size_t nKeywords,
     ...) {
   ASSERT(nKeywords);
 
-  std::vector<CJS_Value> result(nKeywords, CJS_Value());
+  std::vector<v8::Local<v8::Value>> result(nKeywords, v8::Local<v8::Value>());
   size_t size = std::min(originals.size(), nKeywords);
   for (size_t i = 0; i < size; ++i)
     result[i] = originals[i];
 
-  if (originals.size() != 1 || !originals[0].ToV8Value()->IsObject() ||
-      originals[0].ToV8Value()->IsArray()) {
+  if (originals.size() != 1 || !originals[0]->IsObject() ||
+      originals[0]->IsArray()) {
     return result;
   }
-  v8::Local<v8::Object> pObj = pRuntime->ToObject(originals[0].ToV8Value());
-  result[0] = CJS_Value();  // Make unknown.
+  result[0] = v8::Local<v8::Value>();  // Make unknown.
 
+  v8::Local<v8::Object> pObj = pRuntime->ToObject(originals[0]);
   va_list ap;
   va_start(ap, nKeywords);
   for (size_t i = 0; i < nKeywords; ++i) {
     const wchar_t* property = va_arg(ap, const wchar_t*);
     v8::Local<v8::Value> v8Value = pRuntime->GetObjectProperty(pObj, property);
     if (!v8Value->IsUndefined())
-      result[i] = CJS_Value(v8Value);
+      result[i] = v8Value;
   }
   va_end(ap);
+
   return result;
 }
diff --git a/fpdfsdk/javascript/JS_Value.h b/fpdfsdk/javascript/JS_Value.h
index d098812..b97a706 100644
--- a/fpdfsdk/javascript/JS_Value.h
+++ b/fpdfsdk/javascript/JS_Value.h
@@ -43,10 +43,10 @@
   int GetLength(CJS_Runtime* pRuntime) const;
 
   // These two calls may re-enter JS (and hence invalidate objects).
-  CJS_Value GetElement(CJS_Runtime* pRuntime, unsigned index) const;
+  v8::Local<v8::Value> GetElement(CJS_Runtime* pRuntime, unsigned index) const;
   void SetElement(CJS_Runtime* pRuntime,
                   unsigned index,
-                  const CJS_Value& value);
+                  v8::Local<v8::Value> value);
 
   v8::Local<v8::Value> ToV8Value() const { return m_pArray; }
 
@@ -102,9 +102,9 @@
 // names as wchar_t string literals corresponding to each positional argument.
 // The result will always contain |nKeywords| value, with unspecified ones
 // being set to type VT_unknown.
-std::vector<CJS_Value> ExpandKeywordParams(
+std::vector<v8::Local<v8::Value>> ExpandKeywordParams(
     CJS_Runtime* pRuntime,
-    const std::vector<CJS_Value>& originals,
+    const std::vector<v8::Local<v8::Value>>& originals,
     size_t nKeywords,
     ...);
 
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index 867a265..c0441a8 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -112,18 +112,21 @@
 #endif
 
 // NOLINTNEXTLINE(whitespace/parens)
-template <bool (
-    *F)(CJS_Runtime*, const std::vector<CJS_Value>&, CJS_Value&, WideString&)>
+template <bool (*F)(CJS_Runtime*,
+                    const std::vector<v8::Local<v8::Value>>&,
+                    CJS_Value&,
+                    WideString&)>
 void JSGlobalFunc(const char* func_name_string,
                   const v8::FunctionCallbackInfo<v8::Value>& info) {
   CJS_Runtime* pRuntime =
       CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
   if (!pRuntime)
     return;
-  std::vector<CJS_Value> parameters;
-  for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
-    parameters.push_back(CJS_Value(info[i]));
-  }
+
+  std::vector<v8::Local<v8::Value>> parameters;
+  for (unsigned int i = 0; i < (unsigned int)info.Length(); i++)
+    parameters.push_back(info[i]);
+
   CJS_Value valueRes;
   WideString sError;
   if (!(*F)(pRuntime, parameters, valueRes, sError)) {
@@ -246,11 +249,11 @@
 }
 
 CJS_Array CJS_PublicMethods::AF_MakeArrayFromList(CJS_Runtime* pRuntime,
-                                                  CJS_Value val) {
-  if (!val.ToV8Value().IsEmpty() && val.ToV8Value()->IsArray())
-    return CJS_Array(pRuntime->ToArray(val.ToV8Value()));
+                                                  v8::Local<v8::Value> val) {
+  if (!val.IsEmpty() && val->IsArray())
+    return CJS_Array(pRuntime->ToArray(val));
 
-  WideString wsStr = pRuntime->ToWideString(val.ToV8Value());
+  WideString wsStr = pRuntime->ToWideString(val);
   ByteString t = ByteString::FromUnicode(wsStr);
   const char* p = t.c_str();
 
@@ -261,9 +264,8 @@
   while (*p) {
     const char* pTemp = strchr(p, ch);
     if (!pTemp) {
-      StrArray.SetElement(
-          pRuntime, nIndex,
-          CJS_Value(pRuntime->NewString(StrTrim(ByteString(p)).c_str())));
+      StrArray.SetElement(pRuntime, nIndex,
+                          pRuntime->NewString(StrTrim(ByteString(p)).c_str()));
       break;
     }
 
@@ -271,9 +273,8 @@
     strncpy(pSub, p, pTemp - p);
     *(pSub + (pTemp - p)) = '\0';
 
-    StrArray.SetElement(
-        pRuntime, nIndex,
-        CJS_Value(pRuntime->NewString(StrTrim(ByteString(pSub)).c_str())));
+    StrArray.SetElement(pRuntime, nIndex,
+                        pRuntime->NewString(StrTrim(ByteString(pSub)).c_str()));
     delete[] pSub;
 
     nIndex++;
@@ -807,10 +808,11 @@
 
 // function AFNumber_Format(nDec, sepStyle, negStyle, currStyle, strCurrency,
 // bCurrencyPrepend)
-bool CJS_PublicMethods::AFNumber_Format(CJS_Runtime* pRuntime,
-                                        const std::vector<CJS_Value>& params,
-                                        CJS_Value& vRet,
-                                        WideString& sError) {
+bool CJS_PublicMethods::AFNumber_Format(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
 #if _FX_OS_ != _FX_OS_ANDROID_
   if (params.size() != 6) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
@@ -827,12 +829,12 @@
   if (strValue.IsEmpty())
     return true;
 
-  int iDec = pRuntime->ToInt32(params[0].ToV8Value());
-  int iSepStyle = pRuntime->ToInt32(params[1].ToV8Value());
-  int iNegStyle = pRuntime->ToInt32(params[2].ToV8Value());
+  int iDec = pRuntime->ToInt32(params[0]);
+  int iSepStyle = pRuntime->ToInt32(params[1]);
+  int iNegStyle = pRuntime->ToInt32(params[2]);
   // params[3] is iCurrStyle, it's not used.
-  WideString wstrCurrency = pRuntime->ToWideString(params[4].ToV8Value());
-  bool bCurrencyPrepend = pRuntime->ToBoolean(params[5].ToV8Value());
+  WideString wstrCurrency = pRuntime->ToWideString(params[4]);
+  bool bCurrencyPrepend = pRuntime->ToBoolean(params[5]);
 
   if (iDec < 0)
     iDec = -iDec;
@@ -898,36 +900,21 @@
     if (iNegStyle == 1 || iNegStyle == 3) {
       if (Field* fTarget = pEvent->Target_Field()) {
         CJS_Array arColor;
-        CJS_Value vColElm(pRuntime->NewString(L"RGB"));
-        arColor.SetElement(pRuntime, 0, vColElm);
-
-        vColElm = CJS_Value(pRuntime->NewNumber(1));
-        arColor.SetElement(pRuntime, 1, vColElm);
-
-        vColElm = CJS_Value(pRuntime->NewNumber(0));
-        arColor.SetElement(pRuntime, 2, vColElm);
-        arColor.SetElement(pRuntime, 3, vColElm);
-
-        CJS_Value vProp;
-        if (arColor.ToV8Value().IsEmpty())
-          vProp.Set(pRuntime->NewArray());
-        else
-          vProp.Set(arColor.ToV8Value());
-
-        fTarget->set_text_color(pRuntime, vProp, &sError);  // red
+        arColor.SetElement(pRuntime, 0, pRuntime->NewString(L"RGB"));
+        arColor.SetElement(pRuntime, 1, pRuntime->NewNumber(1));
+        arColor.SetElement(pRuntime, 2, pRuntime->NewNumber(0));
+        arColor.SetElement(pRuntime, 3, pRuntime->NewNumber(0));
+        fTarget->set_text_color(pRuntime, arColor.ToV8Value(), &sError);  // red
       }
     }
   } else {
     if (iNegStyle == 1 || iNegStyle == 3) {
       if (Field* fTarget = pEvent->Target_Field()) {
         CJS_Array arColor;
-        CJS_Value vColElm(pRuntime->NewString(L"RGB"));
-        arColor.SetElement(pRuntime, 0, vColElm);
-
-        vColElm = CJS_Value(pRuntime->NewNumber(0));
-        arColor.SetElement(pRuntime, 1, vColElm);
-        arColor.SetElement(pRuntime, 2, vColElm);
-        arColor.SetElement(pRuntime, 3, vColElm);
+        arColor.SetElement(pRuntime, 0, pRuntime->NewString(L"RGB"));
+        arColor.SetElement(pRuntime, 1, pRuntime->NewNumber(0));
+        arColor.SetElement(pRuntime, 2, pRuntime->NewNumber(0));
+        arColor.SetElement(pRuntime, 3, pRuntime->NewNumber(0));
 
         CJS_Value vProp;
         fTarget->get_text_color(pRuntime, &vProp, &sError);
@@ -935,15 +922,8 @@
         CFX_Color crProp = color::ConvertArrayToPWLColor(
             pRuntime, CJS_Array(pRuntime->ToArray(vProp.ToV8Value())));
         CFX_Color crColor = color::ConvertArrayToPWLColor(pRuntime, arColor);
-        if (crColor != crProp) {
-          CJS_Value value;
-          if (arColor.ToV8Value().IsEmpty())
-            value.Set(pRuntime->NewArray());
-          else
-            value.Set(arColor.ToV8Value());
-
-          fTarget->set_text_color(pRuntime, value, &sError);
-        }
+        if (crColor != crProp)
+          fTarget->set_text_color(pRuntime, arColor.ToV8Value(), &sError);
       }
     }
   }
@@ -953,10 +933,11 @@
 
 // function AFNumber_Keystroke(nDec, sepStyle, negStyle, currStyle, strCurrency,
 // bCurrencyPrepend)
-bool CJS_PublicMethods::AFNumber_Keystroke(CJS_Runtime* pRuntime,
-                                           const std::vector<CJS_Value>& params,
-                                           CJS_Value& vRet,
-                                           WideString& sError) {
+bool CJS_PublicMethods::AFNumber_Keystroke(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() < 2)
     return false;
 
@@ -998,7 +979,7 @@
     }
   }
 
-  int iSepStyle = pRuntime->ToInt32(params[1].ToV8Value());
+  int iSepStyle = pRuntime->ToInt32(params[1]);
   if (iSepStyle < 0 || iSepStyle > 3)
     iSepStyle = 0;
   const wchar_t cSep = iSepStyle < 2 ? L'.' : L',';
@@ -1048,10 +1029,11 @@
 }
 
 // function AFPercent_Format(nDec, sepStyle)
-bool CJS_PublicMethods::AFPercent_Format(CJS_Runtime* pRuntime,
-                                         const std::vector<CJS_Value>& params,
-                                         CJS_Value& vRet,
-                                         WideString& sError) {
+bool CJS_PublicMethods::AFPercent_Format(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
 #if _FX_OS_ != _FX_OS_ANDROID_
   if (params.size() != 2) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
@@ -1068,11 +1050,11 @@
   if (strValue.IsEmpty())
     return true;
 
-  int iDec = pRuntime->ToInt32(params[0].ToV8Value());
+  int iDec = pRuntime->ToInt32(params[0]);
   if (iDec < 0)
     iDec = -iDec;
 
-  int iSepStyle = pRuntime->ToInt32(params[1].ToV8Value());
+  int iSepStyle = pRuntime->ToInt32(params[1]);
   if (iSepStyle < 0 || iSepStyle > 3)
     iSepStyle = 0;
 
@@ -1141,17 +1123,18 @@
 // AFPercent_Keystroke(nDec, sepStyle)
 bool CJS_PublicMethods::AFPercent_Keystroke(
     CJS_Runtime* pRuntime,
-    const std::vector<CJS_Value>& params,
+    const std::vector<v8::Local<v8::Value>>& params,
     CJS_Value& vRet,
     WideString& sError) {
   return AFNumber_Keystroke(pRuntime, params, vRet, sError);
 }
 
 // function AFDate_FormatEx(cFormat)
-bool CJS_PublicMethods::AFDate_FormatEx(CJS_Runtime* pRuntime,
-                                        const std::vector<CJS_Value>& params,
-                                        CJS_Value& vRet,
-                                        WideString& sError) {
+bool CJS_PublicMethods::AFDate_FormatEx(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
@@ -1167,7 +1150,7 @@
   if (strValue.IsEmpty())
     return true;
 
-  WideString sFormat = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString sFormat = pRuntime->ToWideString(params[0]);
   double dDate = 0.0f;
 
   if (strValue.Contains(L"GMT")) {
@@ -1246,10 +1229,11 @@
 }
 
 // AFDate_KeystrokeEx(cFormat)
-bool CJS_PublicMethods::AFDate_KeystrokeEx(CJS_Runtime* pRuntime,
-                                           const std::vector<CJS_Value>& params,
-                                           CJS_Value& vRet,
-                                           WideString& sError) {
+bool CJS_PublicMethods::AFDate_KeystrokeEx(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = L"AFDate_KeystrokeEx's parameters' size r not correct";
     return false;
@@ -1265,7 +1249,7 @@
     if (strValue.IsEmpty())
       return true;
 
-    WideString sFormat = pRuntime->ToWideString(params[0].ToV8Value());
+    WideString sFormat = pRuntime->ToWideString(params[0]);
     bool bWrongFormat = false;
     double dRet = MakeRegularDate(strValue, sFormat, &bWrongFormat);
     if (bWrongFormat || std::isnan(dRet)) {
@@ -1280,16 +1264,17 @@
   return true;
 }
 
-bool CJS_PublicMethods::AFDate_Format(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool CJS_PublicMethods::AFDate_Format(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  int iIndex = pRuntime->ToInt32(params[0].ToV8Value());
+  int iIndex = pRuntime->ToInt32(params[0]);
   const wchar_t* cFormats[] = {L"m/d",
                                L"m/d/yy",
                                L"mm/dd/yy",
@@ -1308,22 +1293,23 @@
   if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats)))
     iIndex = 0;
 
-  std::vector<CJS_Value> newParams;
-  newParams.push_back(CJS_Value(pRuntime->NewString(cFormats[iIndex])));
+  std::vector<v8::Local<v8::Value>> newParams;
+  newParams.push_back(pRuntime->NewString(cFormats[iIndex]));
   return AFDate_FormatEx(pRuntime, newParams, vRet, sError);
 }
 
 // AFDate_KeystrokeEx(cFormat)
-bool CJS_PublicMethods::AFDate_Keystroke(CJS_Runtime* pRuntime,
-                                         const std::vector<CJS_Value>& params,
-                                         CJS_Value& vRet,
-                                         WideString& sError) {
+bool CJS_PublicMethods::AFDate_Keystroke(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  int iIndex = pRuntime->ToInt32(params[0].ToV8Value());
+  int iIndex = pRuntime->ToInt32(params[0]);
   const wchar_t* cFormats[] = {L"m/d",
                                L"m/d/yy",
                                L"mm/dd/yy",
@@ -1342,73 +1328,78 @@
   if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats)))
     iIndex = 0;
 
-  std::vector<CJS_Value> newParams;
-  newParams.push_back(CJS_Value(pRuntime->NewString(cFormats[iIndex])));
+  std::vector<v8::Local<v8::Value>> newParams;
+  newParams.push_back(pRuntime->NewString(cFormats[iIndex]));
   return AFDate_KeystrokeEx(pRuntime, newParams, vRet, sError);
 }
 
 // function AFTime_Format(ptf)
-bool CJS_PublicMethods::AFTime_Format(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool CJS_PublicMethods::AFTime_Format(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  int iIndex = pRuntime->ToInt32(params[0].ToV8Value());
+  int iIndex = pRuntime->ToInt32(params[0]);
   const wchar_t* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss",
                                L"h:MM:ss tt"};
 
   if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats)))
     iIndex = 0;
 
-  std::vector<CJS_Value> newParams;
-  newParams.push_back(CJS_Value(pRuntime->NewString(cFormats[iIndex])));
+  std::vector<v8::Local<v8::Value>> newParams;
+  newParams.push_back(pRuntime->NewString(cFormats[iIndex]));
   return AFDate_FormatEx(pRuntime, newParams, vRet, sError);
 }
 
-bool CJS_PublicMethods::AFTime_Keystroke(CJS_Runtime* pRuntime,
-                                         const std::vector<CJS_Value>& params,
-                                         CJS_Value& vRet,
-                                         WideString& sError) {
+bool CJS_PublicMethods::AFTime_Keystroke(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  int iIndex = pRuntime->ToInt32(params[0].ToV8Value());
+  int iIndex = pRuntime->ToInt32(params[0]);
   const wchar_t* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss",
                                L"h:MM:ss tt"};
 
   if (iIndex < 0 || (static_cast<size_t>(iIndex) >= FX_ArraySize(cFormats)))
     iIndex = 0;
 
-  std::vector<CJS_Value> newParams;
-  newParams.push_back(CJS_Value(pRuntime->NewString(cFormats[iIndex])));
+  std::vector<v8::Local<v8::Value>> newParams;
+  newParams.push_back(pRuntime->NewString(cFormats[iIndex]));
   return AFDate_KeystrokeEx(pRuntime, newParams, vRet, sError);
 }
 
-bool CJS_PublicMethods::AFTime_FormatEx(CJS_Runtime* pRuntime,
-                                        const std::vector<CJS_Value>& params,
-                                        CJS_Value& vRet,
-                                        WideString& sError) {
+bool CJS_PublicMethods::AFTime_FormatEx(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   return AFDate_FormatEx(pRuntime, params, vRet, sError);
 }
 
-bool CJS_PublicMethods::AFTime_KeystrokeEx(CJS_Runtime* pRuntime,
-                                           const std::vector<CJS_Value>& params,
-                                           CJS_Value& vRet,
-                                           WideString& sError) {
+bool CJS_PublicMethods::AFTime_KeystrokeEx(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   return AFDate_KeystrokeEx(pRuntime, params, vRet, sError);
 }
 
 // function AFSpecial_Format(psf)
-bool CJS_PublicMethods::AFSpecial_Format(CJS_Runtime* pRuntime,
-                                         const std::vector<CJS_Value>& params,
-                                         CJS_Value& vRet,
-                                         WideString& sError) {
+bool CJS_PublicMethods::AFSpecial_Format(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
@@ -1421,7 +1412,7 @@
 
   WideString wsSource = pEvent->Value();
   WideString wsFormat;
-  switch (pRuntime->ToInt32(params[0].ToV8Value())) {
+  switch (pRuntime->ToInt32(params[0])) {
     case 0:
       wsFormat = L"99999";
       break;
@@ -1446,7 +1437,7 @@
 // function AFSpecial_KeystrokeEx(mask)
 bool CJS_PublicMethods::AFSpecial_KeystrokeEx(
     CJS_Runtime* pRuntime,
-    const std::vector<CJS_Value>& params,
+    const std::vector<v8::Local<v8::Value>>& params,
     CJS_Value& vRet,
     WideString& sError) {
   if (params.size() < 1) {
@@ -1460,7 +1451,7 @@
     return false;
 
   WideString& valEvent = pEvent->Value();
-  WideString wstrMask = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString wstrMask = pRuntime->ToWideString(params[0]);
   if (wstrMask.IsEmpty())
     return true;
 
@@ -1529,7 +1520,7 @@
 // function AFSpecial_Keystroke(psf)
 bool CJS_PublicMethods::AFSpecial_Keystroke(
     CJS_Runtime* pRuntime,
-    const std::vector<CJS_Value>& params,
+    const std::vector<v8::Local<v8::Value>>& params,
     CJS_Value& vRet,
     WideString& sError) {
   if (params.size() != 1) {
@@ -1543,7 +1534,7 @@
     return false;
 
   const char* cFormat = "";
-  switch (pRuntime->ToInt32(params[0].ToV8Value())) {
+  switch (pRuntime->ToInt32(params[0])) {
     case 0:
       cFormat = "99999";
       break;
@@ -1561,15 +1552,16 @@
       break;
   }
 
-  std::vector<CJS_Value> params2;
-  params2.push_back(CJS_Value(pRuntime->NewString(cFormat)));
+  std::vector<v8::Local<v8::Value>> params2;
+  params2.push_back(pRuntime->NewString(cFormat));
   return AFSpecial_KeystrokeEx(pRuntime, params2, vRet, sError);
 }
 
-bool CJS_PublicMethods::AFMergeChange(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool CJS_PublicMethods::AFMergeChange(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
@@ -1606,17 +1598,18 @@
   return true;
 }
 
-bool CJS_PublicMethods::AFParseDateEx(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool CJS_PublicMethods::AFParseDateEx(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 2) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  WideString sValue = pRuntime->ToWideString(params[0].ToV8Value());
-  WideString sFormat = pRuntime->ToWideString(params[1].ToV8Value());
+  WideString sValue = pRuntime->ToWideString(params[0]);
+  WideString sFormat = pRuntime->ToWideString(params[1]);
   double dDate = MakeRegularDate(sValue, sFormat, nullptr);
   if (std::isnan(dDate)) {
     WideString swMsg;
@@ -1630,33 +1623,34 @@
   return true;
 }
 
-bool CJS_PublicMethods::AFSimple(CJS_Runtime* pRuntime,
-                                 const std::vector<CJS_Value>& params,
-                                 CJS_Value& vRet,
-                                 WideString& sError) {
+bool CJS_PublicMethods::AFSimple(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 3) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  vRet = CJS_Value(pRuntime->NewNumber(static_cast<double>(
-      AF_Simple(pRuntime->ToWideString(params[0].ToV8Value()).c_str(),
-                pRuntime->ToDouble(params[1].ToV8Value()),
-                pRuntime->ToDouble(params[2].ToV8Value())))));
+  vRet = CJS_Value(pRuntime->NewNumber(static_cast<double>(AF_Simple(
+      pRuntime->ToWideString(params[0]).c_str(), pRuntime->ToDouble(params[1]),
+      pRuntime->ToDouble(params[2])))));
 
   return true;
 }
 
-bool CJS_PublicMethods::AFMakeNumber(CJS_Runtime* pRuntime,
-                                     const std::vector<CJS_Value>& params,
-                                     CJS_Value& vRet,
-                                     WideString& sError) {
+bool CJS_PublicMethods::AFMakeNumber(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  WideString ws = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString ws = pRuntime->ToWideString(params[0]);
   ws.Replace(L",", L".");
   vRet =
       CJS_Value(pRuntime->MaybeCoerceToNumber(pRuntime->NewString(ws.c_str())));
@@ -1665,18 +1659,18 @@
   return true;
 }
 
-bool CJS_PublicMethods::AFSimple_Calculate(CJS_Runtime* pRuntime,
-                                           const std::vector<CJS_Value>& params,
-                                           CJS_Value& vRet,
-                                           WideString& sError) {
+bool CJS_PublicMethods::AFSimple_Calculate(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 2) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  CJS_Value params1(params[1]);
-  if ((params[1].ToV8Value().IsEmpty() || !params[1].ToV8Value()->IsArray()) &&
-      !params1.ToV8Value()->IsString()) {
+  if ((params[1].IsEmpty() || !params[1]->IsArray()) &&
+      !params[1]->IsString()) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
@@ -1685,15 +1679,15 @@
       pRuntime->GetFormFillEnv()->GetInterForm();
   CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
 
-  WideString sFunction = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString sFunction = pRuntime->ToWideString(params[0]);
   double dValue = wcscmp(sFunction.c_str(), L"PRD") == 0 ? 1.0 : 0.0;
 
-  CJS_Array FieldNameArray = AF_MakeArrayFromList(pRuntime, params1);
+  CJS_Array FieldNameArray = AF_MakeArrayFromList(pRuntime, params[0]);
   int nFieldsCount = 0;
 
   for (int i = 0, isz = FieldNameArray.GetLength(pRuntime); i < isz; i++) {
-    WideString wsFieldName = pRuntime->ToWideString(
-        FieldNameArray.GetElement(pRuntime, i).ToV8Value());
+    WideString wsFieldName =
+        pRuntime->ToWideString(FieldNameArray.GetElement(pRuntime, i));
 
     for (int j = 0, jsz = pInterForm->CountFields(wsFieldName); j < jsz; j++) {
       if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName)) {
@@ -1765,10 +1759,11 @@
 /* This function validates the current event to ensure that its value is
 ** within the specified range. */
 
-bool CJS_PublicMethods::AFRange_Validate(CJS_Runtime* pRuntime,
-                                         const std::vector<CJS_Value>& params,
-                                         CJS_Value& vRet,
-                                         WideString& sError) {
+bool CJS_PublicMethods::AFRange_Validate(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 4) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
@@ -1782,25 +1777,25 @@
     return true;
 
   double dEentValue = atof(ByteString::FromUnicode(pEvent->Value()).c_str());
-  bool bGreaterThan = pRuntime->ToBoolean(params[0].ToV8Value());
-  double dGreaterThan = pRuntime->ToDouble(params[1].ToV8Value());
-  bool bLessThan = pRuntime->ToBoolean(params[2].ToV8Value());
-  double dLessThan = pRuntime->ToDouble(params[3].ToV8Value());
+  bool bGreaterThan = pRuntime->ToBoolean(params[0]);
+  double dGreaterThan = pRuntime->ToDouble(params[1]);
+  bool bLessThan = pRuntime->ToBoolean(params[2]);
+  double dLessThan = pRuntime->ToDouble(params[3]);
   WideString swMsg;
 
   if (bGreaterThan && bLessThan) {
     if (dEentValue < dGreaterThan || dEentValue > dLessThan)
       swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE1).c_str(),
-                   pRuntime->ToWideString(params[1].ToV8Value()).c_str(),
-                   pRuntime->ToWideString(params[3].ToV8Value()).c_str());
+                   pRuntime->ToWideString(params[1]).c_str(),
+                   pRuntime->ToWideString(params[3]).c_str());
   } else if (bGreaterThan) {
     if (dEentValue < dGreaterThan)
       swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE2).c_str(),
-                   pRuntime->ToWideString(params[1].ToV8Value()).c_str());
+                   pRuntime->ToWideString(params[1]).c_str());
   } else if (bLessThan) {
     if (dEentValue > dLessThan)
       swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE3).c_str(),
-                   pRuntime->ToWideString(params[3].ToV8Value()).c_str());
+                   pRuntime->ToWideString(params[3]).c_str());
   }
 
   if (!swMsg.IsEmpty()) {
@@ -1810,16 +1805,17 @@
   return true;
 }
 
-bool CJS_PublicMethods::AFExtractNums(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool CJS_PublicMethods::AFExtractNums(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 1) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
 
-  WideString str = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString str = pRuntime->ToWideString(params[0]);
   if (str.GetLength() > 0 && (str[0] == L'.' || str[0] == L','))
     str = L"0" + str;
 
@@ -1830,15 +1826,13 @@
     if (std::iswdigit(wc)) {
       sPart += wc;
     } else if (sPart.GetLength() > 0) {
-      nums.SetElement(pRuntime, nIndex,
-                      CJS_Value(pRuntime->NewString(sPart.c_str())));
+      nums.SetElement(pRuntime, nIndex, pRuntime->NewString(sPart.c_str()));
       sPart = L"";
       nIndex++;
     }
   }
   if (sPart.GetLength() > 0)
-    nums.SetElement(pRuntime, nIndex,
-                    CJS_Value(pRuntime->NewString(sPart.c_str())));
+    nums.SetElement(pRuntime, nIndex, pRuntime->NewString(sPart.c_str()));
 
   if (nums.GetLength(pRuntime) > 0) {
     if (nums.ToV8Value().IsEmpty())
diff --git a/fpdfsdk/javascript/PublicMethods.h b/fpdfsdk/javascript/PublicMethods.h
index 1d30832..60659ba 100644
--- a/fpdfsdk/javascript/PublicMethods.h
+++ b/fpdfsdk/javascript/PublicMethods.h
@@ -19,91 +19,98 @@
   ~CJS_PublicMethods() override {}
 
   static bool AFNumber_Format(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
                               WideString& sError);
-  static bool AFNumber_Keystroke(CJS_Runtime* pRuntime,
-                                 const std::vector<CJS_Value>& params,
-                                 CJS_Value& vRet,
-                                 WideString& sError);
+  static bool AFNumber_Keystroke(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
   static bool AFPercent_Format(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError);
-  static bool AFPercent_Keystroke(CJS_Runtime* pRuntime,
-                                  const std::vector<CJS_Value>& params,
-                                  CJS_Value& vRet,
-                                  WideString& sError);
+  static bool AFPercent_Keystroke(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
   static bool AFDate_FormatEx(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
                               WideString& sError);
-  static bool AFDate_KeystrokeEx(CJS_Runtime* pRuntime,
-                                 const std::vector<CJS_Value>& params,
-                                 CJS_Value& vRet,
-                                 WideString& sError);
+  static bool AFDate_KeystrokeEx(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
   static bool AFDate_Format(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError);
   static bool AFDate_Keystroke(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError);
   static bool AFTime_FormatEx(CJS_Runtime* pRuntime,
-                              const std::vector<CJS_Value>& params,
+                              const std::vector<v8::Local<v8::Value>>& params,
                               CJS_Value& vRet,
-                              WideString& sError);  //
-  static bool AFTime_KeystrokeEx(CJS_Runtime* pRuntime,
-                                 const std::vector<CJS_Value>& params,
-                                 CJS_Value& vRet,
-                                 WideString& sError);
+                              WideString& sError);
+  static bool AFTime_KeystrokeEx(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
   static bool AFTime_Format(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError);
   static bool AFTime_Keystroke(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError);
   static bool AFSpecial_Format(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError);
-  static bool AFSpecial_Keystroke(CJS_Runtime* pRuntime,
-                                  const std::vector<CJS_Value>& params,
-                                  CJS_Value& vRet,
-                                  WideString& sError);
-  static bool AFSpecial_KeystrokeEx(CJS_Runtime* pRuntime,
-                                    const std::vector<CJS_Value>& params,
-                                    CJS_Value& vRet,
-                                    WideString& sError);  //
+  static bool AFSpecial_Keystroke(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
+  static bool AFSpecial_KeystrokeEx(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);  //
   static bool AFSimple(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError);
   static bool AFMakeNumber(CJS_Runtime* pRuntime,
-                           const std::vector<CJS_Value>& params,
+                           const std::vector<v8::Local<v8::Value>>& params,
                            CJS_Value& vRet,
                            WideString& sError);
-  static bool AFSimple_Calculate(CJS_Runtime* pRuntime,
-                                 const std::vector<CJS_Value>& params,
-                                 CJS_Value& vRet,
-                                 WideString& sError);
+  static bool AFSimple_Calculate(
+      CJS_Runtime* pRuntime,
+      const std::vector<v8::Local<v8::Value>>& params,
+      CJS_Value& vRet,
+      WideString& sError);
   static bool AFRange_Validate(CJS_Runtime* pRuntime,
-                               const std::vector<CJS_Value>& params,
+                               const std::vector<v8::Local<v8::Value>>& params,
                                CJS_Value& vRet,
                                WideString& sError);
   static bool AFMergeChange(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError);
   static bool AFParseDateEx(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError);
   static bool AFExtractNums(CJS_Runtime* pRuntime,
-                            const std::vector<CJS_Value>& params,
+                            const std::vector<v8::Local<v8::Value>>& params,
                             CJS_Value& vRet,
                             WideString& sError);
 
@@ -175,7 +182,8 @@
   static double AF_Simple(const wchar_t* sFuction,
                           double dValue1,
                           double dValue2);
-  static CJS_Array AF_MakeArrayFromList(CJS_Runtime* pRuntime, CJS_Value val);
+  static CJS_Array AF_MakeArrayFromList(CJS_Runtime* pRuntime,
+                                        v8::Local<v8::Value> val);
 };
 
 #endif  // FPDFSDK_JAVASCRIPT_PUBLICMETHODS_H_
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index cb07a0e..ca440f6 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -228,9 +228,9 @@
     pJSDocument = static_cast<CJS_Document*>(pRuntime->GetObjectPrivate(pObj));
 
   CJS_Array aDocs;
-  aDocs.SetElement(
-      pRuntime, 0,
-      pJSDocument ? CJS_Value(pJSDocument->ToV8Object()) : CJS_Value());
+  aDocs.SetElement(pRuntime, 0,
+                   pJSDocument ? v8::Local<v8::Value>(pJSDocument->ToV8Object())
+                               : v8::Local<v8::Value>());
   if (aDocs.GetLength(pRuntime) > 0) {
     if (aDocs.ToV8Value().IsEmpty())
       vp->Set(pRuntime->NewArray());
@@ -244,7 +244,7 @@
 }
 
 bool app::set_active_docs(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return false;
 }
@@ -257,9 +257,9 @@
 }
 
 bool app::set_calculate(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
-  m_bCalculate = pRuntime->ToBoolean(vp.ToV8Value());
+  m_bCalculate = pRuntime->ToBoolean(vp);
   pRuntime->GetFormFillEnv()->GetInterForm()->EnableCalculate(m_bCalculate);
   return true;
 }
@@ -272,7 +272,7 @@
 }
 
 bool app::set_forms_version(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return false;
 }
@@ -285,7 +285,7 @@
 }
 
 bool app::set_viewer_type(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return false;
 }
@@ -298,7 +298,7 @@
 }
 
 bool app::set_viewer_variation(CJS_Runtime* pRuntime,
-                               const CJS_Value& vp,
+                               v8::Local<v8::Value> vp,
                                WideString* sError) {
   return false;
 }
@@ -318,7 +318,7 @@
 }
 
 bool app::set_viewer_version(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError) {
   return false;
 }
@@ -342,7 +342,7 @@
 }
 
 bool app::set_platform(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   return false;
 }
@@ -366,7 +366,7 @@
 }
 
 bool app::set_language(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   return false;
 }
@@ -376,7 +376,7 @@
 // note:
 // CFDF_Document * CPDFSDK_FormFillEnvironment::NewFDF();
 bool app::newFDF(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError) {
   return true;
@@ -389,20 +389,20 @@
 // bUserConv);
 
 bool app::openFDF(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   return true;
 }
 
 bool app::alert(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError) {
-  std::vector<CJS_Value> newParams = ExpandKeywordParams(
+  std::vector<v8::Local<v8::Value>> newParams = ExpandKeywordParams(
       pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle");
 
-  if (!IsTypeKnown(newParams[0].ToV8Value())) {
+  if (!IsTypeKnown(newParams[0])) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
@@ -414,32 +414,31 @@
   }
 
   WideString swMsg;
-  if (newParams[0].ToV8Value()->IsArray()) {
-    CJS_Array carray(pRuntime->ToArray(newParams[0].ToV8Value()));
+  if (newParams[0]->IsArray()) {
+    CJS_Array carray(pRuntime->ToArray(newParams[0]));
     swMsg = L"[";
     for (int i = 0; i < carray.GetLength(pRuntime); ++i) {
       if (i)
         swMsg += L", ";
 
-      CJS_Value element(carray.GetElement(pRuntime, i));
-      swMsg += pRuntime->ToWideString(element.ToV8Value());
+      swMsg += pRuntime->ToWideString(carray.GetElement(pRuntime, i));
     }
     swMsg += L"]";
   } else {
-    swMsg = pRuntime->ToWideString(newParams[0].ToV8Value());
+    swMsg = pRuntime->ToWideString(newParams[0]);
   }
 
   int iIcon = 0;
-  if (IsTypeKnown(newParams[1].ToV8Value()))
-    iIcon = pRuntime->ToInt32(newParams[1].ToV8Value());
+  if (IsTypeKnown(newParams[1]))
+    iIcon = pRuntime->ToInt32(newParams[1]);
 
   int iType = 0;
-  if (IsTypeKnown(newParams[2].ToV8Value()))
-    iType = pRuntime->ToInt32(newParams[2].ToV8Value());
+  if (IsTypeKnown(newParams[2]))
+    iType = pRuntime->ToInt32(newParams[2]);
 
   WideString swTitle;
-  if (IsTypeKnown(newParams[3].ToV8Value()))
-    swTitle = pRuntime->ToWideString(newParams[3].ToV8Value());
+  if (IsTypeKnown(newParams[3]))
+    swTitle = pRuntime->ToWideString(newParams[3]);
   else
     swTitle = JSGetStringFromID(IDS_STRING_JSALERT);
 
@@ -453,12 +452,11 @@
 }
 
 bool app::beep(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError) {
   if (params.size() == 1) {
-    pRuntime->GetFormFillEnv()->JS_appBeep(
-        pRuntime->ToInt32(params[0].ToV8Value()));
+    pRuntime->GetFormFillEnv()->JS_appBeep(pRuntime->ToInt32(params[0]));
     return true;
   }
 
@@ -467,14 +465,14 @@
 }
 
 bool app::findComponent(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   return true;
 }
 
 bool app::popUpMenuEx(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   return false;
@@ -485,13 +483,13 @@
 }
 
 bool app::set_fs(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError) {
   return false;
 }
 
 bool app::setInterval(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   if (params.size() > 2 || params.size() == 0) {
@@ -500,14 +498,13 @@
   }
 
   WideString script =
-      params.size() > 0 ? pRuntime->ToWideString(params[0].ToV8Value()) : L"";
+      params.size() > 0 ? pRuntime->ToWideString(params[0]) : L"";
   if (script.IsEmpty()) {
     sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE);
     return true;
   }
 
-  uint32_t dwInterval =
-      params.size() > 1 ? pRuntime->ToInt32(params[1].ToV8Value()) : 1000;
+  uint32_t dwInterval = params.size() > 1 ? pRuntime->ToInt32(params[1]) : 1000;
 
   GlobalTimer* timerRef = new GlobalTimer(this, pRuntime->GetFormFillEnv(),
                                           pRuntime, 0, script, dwInterval, 0);
@@ -528,7 +525,7 @@
 }
 
 bool app::setTimeOut(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError) {
   if (params.size() > 2 || params.size() == 0) {
@@ -536,14 +533,13 @@
     return false;
   }
 
-  WideString script = pRuntime->ToWideString(params[0].ToV8Value());
+  WideString script = pRuntime->ToWideString(params[0]);
   if (script.IsEmpty()) {
     sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE);
     return true;
   }
 
-  uint32_t dwTimeOut =
-      params.size() > 1 ? pRuntime->ToInt32(params[1].ToV8Value()) : 1000;
+  uint32_t dwTimeOut = params.size() > 1 ? pRuntime->ToInt32(params[1]) : 1000;
   GlobalTimer* timerRef =
       new GlobalTimer(this, pRuntime->GetFormFillEnv(), pRuntime, 1, script,
                       dwTimeOut, dwTimeOut);
@@ -563,7 +559,7 @@
 }
 
 bool app::clearTimeOut(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   if (params.size() != 1) {
@@ -576,7 +572,7 @@
 }
 
 bool app::clearInterval(CJS_Runtime* pRuntime,
-                        const std::vector<CJS_Value>& params,
+                        const std::vector<v8::Local<v8::Value>>& params,
                         CJS_Value& vRet,
                         WideString& sError) {
   if (params.size() != 1) {
@@ -588,11 +584,11 @@
   return true;
 }
 
-void app::ClearTimerCommon(CJS_Runtime* pRuntime, const CJS_Value& param) {
-  if (!param.ToV8Value()->IsObject())
+void app::ClearTimerCommon(CJS_Runtime* pRuntime, v8::Local<v8::Value> param) {
+  if (!param->IsObject())
     return;
 
-  v8::Local<v8::Object> pObj = pRuntime->ToObject(param.ToV8Value());
+  v8::Local<v8::Object> pObj = pRuntime->ToObject(param);
   if (CFXJS_Engine::GetObjDefnID(pObj) != CJS_TimerObj::g_nObjDefnID)
     return;
 
@@ -609,7 +605,7 @@
 }
 
 bool app::execMenuItem(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   return false;
@@ -636,7 +632,7 @@
 }
 
 bool app::goBack(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError) {
   // Not supported.
@@ -644,7 +640,7 @@
 }
 
 bool app::goForward(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   // Not supported.
@@ -652,22 +648,22 @@
 }
 
 bool app::mailMsg(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
-  std::vector<CJS_Value> newParams =
+  std::vector<v8::Local<v8::Value>> newParams =
       ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc", L"cBcc",
                           L"cSubject", L"cMsg");
 
-  if (!IsTypeKnown(newParams[0].ToV8Value())) {
+  if (!IsTypeKnown(newParams[0])) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
-  bool bUI = pRuntime->ToBoolean(newParams[0].ToV8Value());
+  bool bUI = pRuntime->ToBoolean(newParams[0]);
 
   WideString cTo;
-  if (IsTypeKnown(newParams[1].ToV8Value())) {
-    cTo = pRuntime->ToWideString(newParams[1].ToV8Value());
+  if (IsTypeKnown(newParams[1])) {
+    cTo = pRuntime->ToWideString(newParams[1]);
   } else {
     if (!bUI) {
       // cTo parameter required when UI not invoked.
@@ -677,20 +673,20 @@
   }
 
   WideString cCc;
-  if (IsTypeKnown(newParams[2].ToV8Value()))
-    cCc = pRuntime->ToWideString(newParams[2].ToV8Value());
+  if (IsTypeKnown(newParams[2]))
+    cCc = pRuntime->ToWideString(newParams[2]);
 
   WideString cBcc;
-  if (IsTypeKnown(newParams[3].ToV8Value()))
-    cBcc = pRuntime->ToWideString(newParams[3].ToV8Value());
+  if (IsTypeKnown(newParams[3]))
+    cBcc = pRuntime->ToWideString(newParams[3]);
 
   WideString cSubject;
-  if (IsTypeKnown(newParams[4].ToV8Value()))
-    cSubject = pRuntime->ToWideString(newParams[4].ToV8Value());
+  if (IsTypeKnown(newParams[4]))
+    cSubject = pRuntime->ToWideString(newParams[4]);
 
   WideString cMsg;
-  if (IsTypeKnown(newParams[5].ToV8Value()))
-    cMsg = pRuntime->ToWideString(newParams[5].ToV8Value());
+  if (IsTypeKnown(newParams[5]))
+    cMsg = pRuntime->ToWideString(newParams[5]);
 
   pRuntime->BeginBlock();
   pRuntime->GetFormFillEnv()->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(),
@@ -701,7 +697,7 @@
 }
 
 bool app::launchURL(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   // Unsafe, not supported.
@@ -716,9 +712,9 @@
 }
 
 bool app::set_runtime_highlight(CJS_Runtime* pRuntime,
-                                const CJS_Value& vp,
+                                v8::Local<v8::Value> vp,
                                 WideString* sError) {
-  m_bRuntimeHighLight = pRuntime->ToBoolean(vp.ToV8Value());
+  m_bRuntimeHighLight = pRuntime->ToBoolean(vp);
   return true;
 }
 
@@ -729,20 +725,20 @@
 }
 
 bool app::set_fullscreen(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   return false;
 }
 
 bool app::popUpMenu(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   return false;
 }
 
 bool app::browseForDoc(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   // Unsafe, not supported.
@@ -759,48 +755,48 @@
 }
 
 bool app::newDoc(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError) {
   return false;
 }
 
 bool app::openDoc(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   return false;
 }
 
 bool app::response(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError) {
-  std::vector<CJS_Value> newParams =
+  std::vector<v8::Local<v8::Value>> newParams =
       ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle",
                           L"cDefault", L"bPassword", L"cLabel");
 
-  if (!IsTypeKnown(newParams[0].ToV8Value())) {
+  if (!IsTypeKnown(newParams[0])) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
-  WideString swQuestion = pRuntime->ToWideString(newParams[0].ToV8Value());
+  WideString swQuestion = pRuntime->ToWideString(newParams[0]);
 
   WideString swTitle = L"PDF";
-  if (IsTypeKnown(newParams[1].ToV8Value()))
-    swTitle = pRuntime->ToWideString(newParams[1].ToV8Value());
+  if (IsTypeKnown(newParams[1]))
+    swTitle = pRuntime->ToWideString(newParams[1]);
 
   WideString swDefault;
-  if (IsTypeKnown(newParams[2].ToV8Value()))
-    swDefault = pRuntime->ToWideString(newParams[2].ToV8Value());
+  if (IsTypeKnown(newParams[2]))
+    swDefault = pRuntime->ToWideString(newParams[2]);
 
   bool bPassword = false;
-  if (IsTypeKnown(newParams[3].ToV8Value()))
-    bPassword = pRuntime->ToBoolean(newParams[3].ToV8Value());
+  if (IsTypeKnown(newParams[3]))
+    bPassword = pRuntime->ToBoolean(newParams[3]);
 
   WideString swLabel;
-  if (IsTypeKnown(newParams[4].ToV8Value()))
-    swLabel = pRuntime->ToWideString(newParams[4].ToV8Value());
+  if (IsTypeKnown(newParams[4]))
+    swLabel = pRuntime->ToWideString(newParams[4]);
 
   const int MAX_INPUT_BYTES = 2048;
   std::vector<uint8_t> pBuff(MAX_INPUT_BYTES + 2);
@@ -826,13 +822,13 @@
 }
 
 bool app::set_media(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError) {
   return false;
 }
 
 bool app::execDialog(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError) {
   return true;
diff --git a/fpdfsdk/javascript/app.h b/fpdfsdk/javascript/app.h
index 666ee12..967e9d7 100644
--- a/fpdfsdk/javascript/app.h
+++ b/fpdfsdk/javascript/app.h
@@ -45,154 +45,156 @@
                        CJS_Value* vp,
                        WideString* sError);
   bool set_active_docs(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_calculate(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_calculate(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_forms_version(CJS_Runtime* pRuntime,
                          CJS_Value* vp,
                          WideString* sError);
   bool set_forms_version(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError);
 
   bool get_fs(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_fs(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_fs(CJS_Runtime* pRuntime,
+              v8::Local<v8::Value> vp,
+              WideString* sError);
 
   bool get_fullscreen(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_fullscreen(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_language(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_language(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_media(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_media(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_platform(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_platform(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_runtime_highlight(CJS_Runtime* pRuntime,
                              CJS_Value* vp,
                              WideString* sError);
   bool set_runtime_highlight(CJS_Runtime* pRuntime,
-                             const CJS_Value& vp,
+                             v8::Local<v8::Value> vp,
                              WideString* sError);
 
   bool get_viewer_type(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_viewer_type(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_viewer_variation(CJS_Runtime* pRuntime,
                             CJS_Value* vp,
                             WideString* sError);
   bool set_viewer_variation(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError);
 
   bool get_viewer_version(CJS_Runtime* pRuntime,
                           CJS_Value* vp,
                           WideString* sError);
   bool set_viewer_version(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError);
 
   bool alert(CJS_Runtime* pRuntime,
-             const std::vector<CJS_Value>& params,
+             const std::vector<v8::Local<v8::Value>>& params,
              CJS_Value& vRet,
              WideString& sError);
   bool beep(CJS_Runtime* pRuntime,
-            const std::vector<CJS_Value>& params,
+            const std::vector<v8::Local<v8::Value>>& params,
             CJS_Value& vRet,
             WideString& sError);
   bool browseForDoc(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool clearInterval(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool clearTimeOut(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool execDialog(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
   bool execMenuItem(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError);
   bool findComponent(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool goBack(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool goForward(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool launchURL(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool mailMsg(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool newFDF(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool newDoc(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool openDoc(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool openFDF(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool popUpMenuEx(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool popUpMenu(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
   bool response(CJS_Runtime* pRuntime,
-                const std::vector<CJS_Value>& params,
+                const std::vector<v8::Local<v8::Value>>& params,
                 CJS_Value& vRet,
                 WideString& sError);
   bool setInterval(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError);
   bool setTimeOut(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
 
@@ -205,7 +207,7 @@
   // CJS_EmbedObj
   void RunJsScript(CJS_Runtime* pRuntime, const WideString& wsScript);
 
-  void ClearTimerCommon(CJS_Runtime* pRuntime, const CJS_Value& param);
+  void ClearTimerCommon(CJS_Runtime* pRuntime, v8::Local<v8::Value> param);
 
   bool m_bCalculate;
   bool m_bRuntimeHighLight;
diff --git a/fpdfsdk/javascript/cjs_runtime.cpp b/fpdfsdk/javascript/cjs_runtime.cpp
index c1ec5fe..1d9adc8 100644
--- a/fpdfsdk/javascript/cjs_runtime.cpp
+++ b/fpdfsdk/javascript/cjs_runtime.cpp
@@ -256,7 +256,7 @@
 #endif
 
 v8::Local<v8::Value> CJS_Runtime::MaybeCoerceToNumber(
-    const v8::Local<v8::Value>& value) {
+    v8::Local<v8::Value> value) {
   bool bAllowNaN = false;
   if (value->IsString()) {
     ByteString bstr = ByteString::FromUnicode(ToWideString(value));
diff --git a/fpdfsdk/javascript/cjs_runtime.h b/fpdfsdk/javascript/cjs_runtime.h
index 90ec23e..69a3705 100644
--- a/fpdfsdk/javascript/cjs_runtime.h
+++ b/fpdfsdk/javascript/cjs_runtime.h
@@ -50,7 +50,7 @@
 
   // Attempt to convert the |value| into a number. If successful the number
   // value will be returned, otherwise |value| is returned.
-  v8::Local<v8::Value> MaybeCoerceToNumber(const v8::Local<v8::Value>& value);
+  v8::Local<v8::Value> MaybeCoerceToNumber(v8::Local<v8::Value> value);
 
 #ifdef PDF_ENABLE_XFA
   bool GetValueByName(const ByteStringView& utf8Name,
diff --git a/fpdfsdk/javascript/color.cpp b/fpdfsdk/javascript/color.cpp
index c095678..97d10b9 100644
--- a/fpdfsdk/javascript/color.cpp
+++ b/fpdfsdk/javascript/color.cpp
@@ -44,32 +44,24 @@
   CJS_Array array;
   switch (color.nColorType) {
     case CFX_Color::kTransparent:
-      array.SetElement(pRuntime, 0, CJS_Value(pRuntime->NewString(L"T")));
+      array.SetElement(pRuntime, 0, pRuntime->NewString(L"T"));
       break;
     case CFX_Color::kGray:
-      array.SetElement(pRuntime, 0, CJS_Value(pRuntime->NewString(L"G")));
-      array.SetElement(pRuntime, 1,
-                       CJS_Value(pRuntime->NewNumber(color.fColor1)));
+      array.SetElement(pRuntime, 0, pRuntime->NewString(L"G"));
+      array.SetElement(pRuntime, 1, pRuntime->NewNumber(color.fColor1));
       break;
     case CFX_Color::kRGB:
-      array.SetElement(pRuntime, 0, CJS_Value(pRuntime->NewString(L"RGB")));
-      array.SetElement(pRuntime, 1,
-                       CJS_Value(pRuntime->NewNumber(color.fColor1)));
-      array.SetElement(pRuntime, 2,
-                       CJS_Value(pRuntime->NewNumber(color.fColor2)));
-      array.SetElement(pRuntime, 3,
-                       CJS_Value(pRuntime->NewNumber(color.fColor3)));
+      array.SetElement(pRuntime, 0, pRuntime->NewString(L"RGB"));
+      array.SetElement(pRuntime, 1, pRuntime->NewNumber(color.fColor1));
+      array.SetElement(pRuntime, 2, pRuntime->NewNumber(color.fColor2));
+      array.SetElement(pRuntime, 3, pRuntime->NewNumber(color.fColor3));
       break;
     case CFX_Color::kCMYK:
-      array.SetElement(pRuntime, 0, CJS_Value(pRuntime->NewString(L"CMYK")));
-      array.SetElement(pRuntime, 1,
-                       CJS_Value(pRuntime->NewNumber(color.fColor1)));
-      array.SetElement(pRuntime, 2,
-                       CJS_Value(pRuntime->NewNumber(color.fColor2)));
-      array.SetElement(pRuntime, 3,
-                       CJS_Value(pRuntime->NewNumber(color.fColor3)));
-      array.SetElement(pRuntime, 4,
-                       CJS_Value(pRuntime->NewNumber(color.fColor4)));
+      array.SetElement(pRuntime, 0, pRuntime->NewString(L"CMYK"));
+      array.SetElement(pRuntime, 1, pRuntime->NewNumber(color.fColor1));
+      array.SetElement(pRuntime, 2, pRuntime->NewNumber(color.fColor2));
+      array.SetElement(pRuntime, 3, pRuntime->NewNumber(color.fColor3));
+      array.SetElement(pRuntime, 4, pRuntime->NewNumber(color.fColor4));
       break;
   }
   return array;
@@ -82,15 +74,13 @@
   if (nArrayLen < 1)
     return CFX_Color();
 
-  WideString sSpace =
-      pRuntime->ToWideString(array.GetElement(pRuntime, 0).ToV8Value());
+  WideString sSpace = pRuntime->ToWideString(array.GetElement(pRuntime, 0));
   if (sSpace == L"T")
     return CFX_Color(CFX_Color::kTransparent);
 
   float d1 = 0;
   if (nArrayLen > 1) {
-    d1 = static_cast<float>(
-        pRuntime->ToDouble(array.GetElement(pRuntime, 1).ToV8Value()));
+    d1 = static_cast<float>(pRuntime->ToDouble(array.GetElement(pRuntime, 1)));
   }
 
   if (sSpace == L"G")
@@ -98,24 +88,17 @@
 
   float d2 = 0;
   float d3 = 0;
-  if (nArrayLen > 2) {
-    d2 = static_cast<float>(
-        pRuntime->ToDouble(array.GetElement(pRuntime, 2).ToV8Value()));
-  }
-  if (nArrayLen > 3) {
-    d3 = static_cast<float>(
-        pRuntime->ToDouble(array.GetElement(pRuntime, 3).ToV8Value()));
-  }
+  if (nArrayLen > 2)
+    d2 = static_cast<float>(pRuntime->ToDouble(array.GetElement(pRuntime, 2)));
+  if (nArrayLen > 3)
+    d3 = static_cast<float>(pRuntime->ToDouble(array.GetElement(pRuntime, 3)));
 
   if (sSpace == L"RGB")
     return CFX_Color(CFX_Color::kRGB, d1, d2, d3);
 
   float d4 = 0;
-  if (nArrayLen > 4) {
-    d4 = static_cast<float>(
-        pRuntime->ToDouble(array.GetElement(pRuntime, 4).ToV8Value()));
-  }
-
+  if (nArrayLen > 4)
+    d4 = static_cast<float>(pRuntime->ToDouble(array.GetElement(pRuntime, 4)));
   if (sSpace == L"CMYK")
     return CFX_Color(CFX_Color::kCMYK, d1, d2, d3, d4);
 
@@ -146,7 +129,7 @@
 }
 
 bool color::set_transparent(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crTransparent);
 }
@@ -158,7 +141,7 @@
 }
 
 bool color::set_black(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crBlack);
 }
@@ -170,7 +153,7 @@
 }
 
 bool color::set_white(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crWhite);
 }
@@ -180,7 +163,7 @@
 }
 
 bool color::set_red(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crRed);
 }
@@ -192,7 +175,7 @@
 }
 
 bool color::set_green(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crGreen);
 }
@@ -202,7 +185,7 @@
 }
 
 bool color::set_blue(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crBlue);
 }
@@ -212,7 +195,7 @@
 }
 
 bool color::set_cyan(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crCyan);
 }
@@ -224,7 +207,7 @@
 }
 
 bool color::set_magenta(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crMagenta);
 }
@@ -236,7 +219,7 @@
 }
 
 bool color::set_yellow(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crYellow);
 }
@@ -248,7 +231,7 @@
 }
 
 bool color::set_dark_gray(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crDKGray);
 }
@@ -258,7 +241,7 @@
 }
 
 bool color::set_gray(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crGray);
 }
@@ -270,7 +253,7 @@
 }
 
 bool color::set_light_gray(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return SetPropertyHelper(pRuntime, vp, &m_crLTGray);
 }
@@ -287,27 +270,26 @@
 }
 
 bool color::SetPropertyHelper(CJS_Runtime* pRuntime,
-                              const CJS_Value& vp,
+                              v8::Local<v8::Value> vp,
                               CFX_Color* var) {
-  if (vp.ToV8Value().IsEmpty() || !vp.ToV8Value()->IsArray())
+  if (vp.IsEmpty() || !vp->IsArray())
     return false;
 
-  *var = ConvertArrayToPWLColor(pRuntime,
-                                CJS_Array(pRuntime->ToArray(vp.ToV8Value())));
+  *var = ConvertArrayToPWLColor(pRuntime, CJS_Array(pRuntime->ToArray(vp)));
   return true;
 }
 
 bool color::convert(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   int iSize = params.size();
   if (iSize < 2)
     return false;
-  if (params[0].ToV8Value().IsEmpty() || !params[0].ToV8Value()->IsArray())
+  if (params[0].IsEmpty() || !params[0]->IsArray())
     return false;
 
-  WideString sDestSpace = pRuntime->ToWideString(params[1].ToV8Value());
+  WideString sDestSpace = pRuntime->ToWideString(params[1]);
   int nColorType = CFX_Color::kTransparent;
   if (sDestSpace == L"T")
     nColorType = CFX_Color::kTransparent;
@@ -318,8 +300,8 @@
   else if (sDestSpace == L"CMYK")
     nColorType = CFX_Color::kCMYK;
 
-  CFX_Color color = ConvertArrayToPWLColor(
-      pRuntime, CJS_Array(pRuntime->ToArray(params[0].ToV8Value())));
+  CFX_Color color =
+      ConvertArrayToPWLColor(pRuntime, CJS_Array(pRuntime->ToArray(params[0])));
 
   CJS_Array array =
       ConvertPWLColorToArray(pRuntime, color.ConvertColorType(nColorType));
@@ -332,20 +314,20 @@
 }
 
 bool color::equal(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   if (params.size() < 2)
     return false;
-  if (params[0].ToV8Value().IsEmpty() || !params[0].ToV8Value()->IsArray() ||
-      params[1].ToV8Value().IsEmpty() || !params[1].ToV8Value()->IsArray()) {
+  if (params[0].IsEmpty() || !params[0]->IsArray() || params[1].IsEmpty() ||
+      !params[1]->IsArray()) {
     return false;
   }
 
-  CFX_Color color1 = ConvertArrayToPWLColor(
-      pRuntime, CJS_Array(pRuntime->ToArray(params[0].ToV8Value())));
-  CFX_Color color2 = ConvertArrayToPWLColor(
-      pRuntime, CJS_Array(pRuntime->ToArray(params[1].ToV8Value())));
+  CFX_Color color1 =
+      ConvertArrayToPWLColor(pRuntime, CJS_Array(pRuntime->ToArray(params[0])));
+  CFX_Color color2 =
+      ConvertArrayToPWLColor(pRuntime, CJS_Array(pRuntime->ToArray(params[1])));
 
   color1 = color1.ConvertColorType(color2.nColorType);
   vRet = CJS_Value(pRuntime->NewBoolean(color1 == color2));
diff --git a/fpdfsdk/javascript/color.h b/fpdfsdk/javascript/color.h
index 851f05b..de784e5 100644
--- a/fpdfsdk/javascript/color.h
+++ b/fpdfsdk/javascript/color.h
@@ -24,71 +24,79 @@
 
   bool get_black(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_black(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_blue(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_blue(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_blue(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_cyan(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_cyan(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_cyan(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_dark_gray(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_dark_gray(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_gray(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_gray(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_gray(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_green(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_green(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_light_gray(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_light_gray(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_magenta(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_magenta(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_red(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_red(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_red(CJS_Runtime* pRuntime,
+               v8::Local<v8::Value> vp,
+               WideString* sError);
 
   bool get_transparent(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_transparent(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_white(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_white(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_yellow(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_yellow(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool convert(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool equal(CJS_Runtime* pRuntime,
-             const std::vector<CJS_Value>& params,
+             const std::vector<v8::Local<v8::Value>>& params,
              CJS_Value& vRet,
              WideString& sError);
 
  private:
   bool GetPropertyHelper(CJS_Runtime* pRuntime, CJS_Value* vp, CFX_Color* val);
   bool SetPropertyHelper(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          CFX_Color* val);
 
   CFX_Color m_crTransparent;
diff --git a/fpdfsdk/javascript/console.cpp b/fpdfsdk/javascript/console.cpp
index 5e854bd..ba46fea 100644
--- a/fpdfsdk/javascript/console.cpp
+++ b/fpdfsdk/javascript/console.cpp
@@ -31,21 +31,21 @@
 console::~console() {}
 
 bool console::clear(CJS_Runtime* pRuntime,
-                    const std::vector<CJS_Value>& params,
+                    const std::vector<v8::Local<v8::Value>>& params,
                     CJS_Value& vRet,
                     WideString& sError) {
   return true;
 }
 
 bool console::hide(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError) {
   return true;
 }
 
 bool console::println(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   if (params.size() < 1) {
@@ -55,7 +55,7 @@
 }
 
 bool console::show(CJS_Runtime* pRuntime,
-                   const std::vector<CJS_Value>& params,
+                   const std::vector<v8::Local<v8::Value>>& params,
                    CJS_Value& vRet,
                    WideString& sError) {
   return true;
diff --git a/fpdfsdk/javascript/console.h b/fpdfsdk/javascript/console.h
index 4680220..d7d1793 100644
--- a/fpdfsdk/javascript/console.h
+++ b/fpdfsdk/javascript/console.h
@@ -18,19 +18,19 @@
 
  public:
   bool clear(CJS_Runtime* pRuntime,
-             const std::vector<CJS_Value>& params,
+             const std::vector<v8::Local<v8::Value>>& params,
              CJS_Value& vRet,
              WideString& sError);
   bool hide(CJS_Runtime* pRuntime,
-            const std::vector<CJS_Value>& params,
+            const std::vector<v8::Local<v8::Value>>& params,
             CJS_Value& vRet,
             WideString& sError);
   bool println(CJS_Runtime* pRuntime,
-               const std::vector<CJS_Value>& params,
+               const std::vector<v8::Local<v8::Value>>& params,
                CJS_Value& vRet,
                WideString& sError);
   bool show(CJS_Runtime* pRuntime,
-            const std::vector<CJS_Value>& params,
+            const std::vector<v8::Local<v8::Value>>& params,
             CJS_Value& vRet,
             WideString& sError);
 };
diff --git a/fpdfsdk/javascript/event.cpp b/fpdfsdk/javascript/event.cpp
index da81aac..eb9d644 100644
--- a/fpdfsdk/javascript/event.cpp
+++ b/fpdfsdk/javascript/event.cpp
@@ -56,14 +56,14 @@
 }
 
 bool event::set_change(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
 
-  if (vp.ToV8Value()->IsString()) {
+  if (vp->IsString()) {
     WideString& wChange = pEvent->Change();
-    wChange = pRuntime->ToWideString(vp.ToV8Value());
+    wChange = pRuntime->ToWideString(vp);
   }
   return true;
 }
@@ -79,7 +79,7 @@
 }
 
 bool event::set_change_ex(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   return false;
 }
@@ -95,7 +95,7 @@
 }
 
 bool event::set_commit_key(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return false;
 }
@@ -114,7 +114,7 @@
 }
 
 bool event::set_field_full(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return false;
 }
@@ -129,7 +129,7 @@
 }
 
 bool event::set_key_down(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   return false;
 }
@@ -144,7 +144,7 @@
 }
 
 bool event::set_modifier(CJS_Runtime* pRuntime,
-                         const CJS_Value& vp,
+                         v8::Local<v8::Value> vp,
                          WideString* sError) {
   return false;
 }
@@ -157,7 +157,7 @@
 }
 
 bool event::set_name(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return false;
 }
@@ -170,11 +170,11 @@
 }
 
 bool event::set_rc(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
-  pEvent->Rc() = pRuntime->ToBoolean(vp.ToV8Value());
+  pEvent->Rc() = pRuntime->ToBoolean(vp);
   return true;
 }
 
@@ -185,7 +185,7 @@
 }
 
 bool event::set_rich_change(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return true;
 }
@@ -197,7 +197,7 @@
 }
 
 bool event::set_rich_change_ex(CJS_Runtime* pRuntime,
-                               const CJS_Value& vp,
+                               v8::Local<v8::Value> vp,
                                WideString* sError) {
   return true;
 }
@@ -209,7 +209,7 @@
 }
 
 bool event::set_rich_value(CJS_Runtime* pRuntime,
-                           const CJS_Value& vp,
+                           v8::Local<v8::Value> vp,
                            WideString* sError) {
   return true;
 }
@@ -228,7 +228,7 @@
 }
 
 bool event::set_sel_end(CJS_Runtime* pRuntime,
-                        const CJS_Value& vp,
+                        v8::Local<v8::Value> vp,
                         WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
@@ -236,7 +236,7 @@
   if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
     return true;
 
-  pEvent->SelEnd() = pRuntime->ToInt32(vp.ToV8Value());
+  pEvent->SelEnd() = pRuntime->ToInt32(vp);
   return true;
 }
 
@@ -254,7 +254,7 @@
 }
 
 bool event::set_sel_start(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
@@ -262,7 +262,7 @@
   if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
     return true;
 
-  pEvent->SelStart() = pRuntime->ToInt32(vp.ToV8Value());
+  pEvent->SelStart() = pRuntime->ToInt32(vp);
   return true;
 }
 
@@ -276,7 +276,7 @@
 }
 
 bool event::set_shift(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   return false;
 }
@@ -291,7 +291,7 @@
 }
 
 bool event::set_source(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   return false;
 }
@@ -306,7 +306,7 @@
 }
 
 bool event::set_target(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError) {
   return false;
 }
@@ -321,7 +321,7 @@
 }
 
 bool event::set_target_name(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return false;
 }
@@ -334,7 +334,7 @@
 }
 
 bool event::set_type(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError) {
   return false;
 }
@@ -356,7 +356,7 @@
 }
 
 bool event::set_value(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError) {
   CJS_EventHandler* pEvent =
       pRuntime->GetCurrentEventContext()->GetEventHandler();
@@ -367,7 +367,7 @@
   if (!pEvent->m_pValue)
     return false;
 
-  pEvent->Value() = pRuntime->ToWideString(vp.ToV8Value());
+  pEvent->Value() = pRuntime->ToWideString(vp);
   return true;
 }
 
@@ -381,7 +381,7 @@
 }
 
 bool event::set_will_commit(CJS_Runtime* pRuntime,
-                            const CJS_Value& vp,
+                            v8::Local<v8::Value> vp,
                             WideString* sError) {
   return false;
 }
diff --git a/fpdfsdk/javascript/event.h b/fpdfsdk/javascript/event.h
index f622443..90b9126 100644
--- a/fpdfsdk/javascript/event.h
+++ b/fpdfsdk/javascript/event.h
@@ -17,104 +17,110 @@
  public:
   bool get_change(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_change(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_change_ex(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_change_ex(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_commit_key(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_commit_key(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_field_full(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_field_full(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_key_down(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_key_down(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_modifier(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_modifier(CJS_Runtime* pRuntime,
-                    const CJS_Value& vp,
+                    v8::Local<v8::Value> vp,
                     WideString* sError);
 
   bool get_name(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_name(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_name(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_rc(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_rc(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_rc(CJS_Runtime* pRuntime,
+              v8::Local<v8::Value> vp,
+              WideString* sError);
 
   bool get_rich_change(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_rich_change(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_rich_change_ex(CJS_Runtime* pRuntime,
                           CJS_Value* vp,
                           WideString* sError);
   bool set_rich_change_ex(CJS_Runtime* pRuntime,
-                          const CJS_Value& vp,
+                          v8::Local<v8::Value> vp,
                           WideString* sError);
 
   bool get_rich_value(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_rich_value(CJS_Runtime* pRuntime,
-                      const CJS_Value& vp,
+                      v8::Local<v8::Value> vp,
                       WideString* sError);
 
   bool get_sel_end(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_sel_end(CJS_Runtime* pRuntime,
-                   const CJS_Value& vp,
+                   v8::Local<v8::Value> vp,
                    WideString* sError);
 
   bool get_sel_start(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_sel_start(CJS_Runtime* pRuntime,
-                     const CJS_Value& vp,
+                     v8::Local<v8::Value> vp,
                      WideString* sError);
 
   bool get_shift(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_shift(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_source(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_source(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_target(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_target(CJS_Runtime* pRuntime,
-                  const CJS_Value& vp,
+                  v8::Local<v8::Value> vp,
                   WideString* sError);
 
   bool get_target_name(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_target_name(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 
   bool get_type(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
-  bool set_type(CJS_Runtime* pRuntime, const CJS_Value& vp, WideString* sError);
+  bool set_type(CJS_Runtime* pRuntime,
+                v8::Local<v8::Value> vp,
+                WideString* sError);
 
   bool get_value(CJS_Runtime* pRuntime, CJS_Value* vp, WideString* sError);
   bool set_value(CJS_Runtime* pRuntime,
-                 const CJS_Value& vp,
+                 v8::Local<v8::Value> vp,
                  WideString* sError);
 
   bool get_will_commit(CJS_Runtime* pRuntime,
                        CJS_Value* vp,
                        WideString* sError);
   bool set_will_commit(CJS_Runtime* pRuntime,
-                       const CJS_Value& vp,
+                       v8::Local<v8::Value> vp,
                        WideString* sError);
 };
 
diff --git a/fpdfsdk/javascript/global.cpp b/fpdfsdk/javascript/global.cpp
index aae7c93..040c6e6 100644
--- a/fpdfsdk/javascript/global.cpp
+++ b/fpdfsdk/javascript/global.cpp
@@ -131,10 +131,8 @@
   v8::String::Utf8Value utf8_value(property);
   WideString propname =
       WideString::FromUTF8(ByteStringView(*utf8_value, utf8_value.length()));
-  CJS_Value prop_value(value);
-  if (!pObj->SetProperty(pRuntime, propname.c_str(), prop_value)) {
+  if (!pObj->SetProperty(pRuntime, propname.c_str(), value))
     pRuntime->Error(JSFormatErrorString(class_name, "PutProperty", L""));
-  }
 }
 
 template <class Alt>
@@ -181,7 +179,7 @@
   ~JSGlobalAlternate() override;
 
   bool setPersistent(CJS_Runtime* pRuntime,
-                     const std::vector<CJS_Value>& params,
+                     const std::vector<v8::Local<v8::Value>>& params,
                      CJS_Value& vRet,
                      WideString& sError);
   bool QueryProperty(const wchar_t* propname);
@@ -190,7 +188,7 @@
                    CJS_Value* vp);
   bool SetProperty(CJS_Runtime* pRuntime,
                    const wchar_t* propname,
-                   const CJS_Value& vp);
+                   v8::Local<v8::Value> vp);
   bool DelProperty(CJS_Runtime* pRuntime, const wchar_t* propname);
   void Initial(CPDFSDK_FormFillEnvironment* pFormFillEnv);
 
@@ -323,54 +321,55 @@
 
 bool JSGlobalAlternate::SetProperty(CJS_Runtime* pRuntime,
                                     const wchar_t* propname,
-                                    const CJS_Value& vp) {
+                                    v8::Local<v8::Value> vp) {
   ByteString sPropName = ByteString::FromUnicode(propname);
-  if (vp.ToV8Value()->IsNumber()) {
+  if (vp->IsNumber()) {
     return SetGlobalVariables(sPropName, JS_GlobalDataType::NUMBER,
-                              pRuntime->ToDouble(vp.ToV8Value()), false, "",
+                              pRuntime->ToDouble(vp), false, "",
                               v8::Local<v8::Object>(), false);
   }
-  if (vp.ToV8Value()->IsBoolean()) {
+  if (vp->IsBoolean()) {
     return SetGlobalVariables(sPropName, JS_GlobalDataType::BOOLEAN, 0,
-                              pRuntime->ToBoolean(vp.ToV8Value()), "",
+                              pRuntime->ToBoolean(vp), "",
                               v8::Local<v8::Object>(), false);
   }
-  if (vp.ToV8Value()->IsString()) {
+  if (vp->IsString()) {
     return SetGlobalVariables(
         sPropName, JS_GlobalDataType::STRING, 0, false,
-        ByteString::FromUnicode(pRuntime->ToWideString(vp.ToV8Value())),
+        ByteString::FromUnicode(pRuntime->ToWideString(vp)),
         v8::Local<v8::Object>(), false);
   }
-  if (vp.ToV8Value()->IsObject()) {
+  if (vp->IsObject()) {
     return SetGlobalVariables(sPropName, JS_GlobalDataType::OBJECT, 0, false,
-                              "", pRuntime->ToObject(vp.ToV8Value()), false);
+                              "", pRuntime->ToObject(vp), false);
   }
-  if (vp.ToV8Value()->IsNull()) {
+  if (vp->IsNull()) {
     return SetGlobalVariables(sPropName, JS_GlobalDataType::NULLOBJ, 0, false,
                               "", v8::Local<v8::Object>(), false);
   }
-  if (vp.ToV8Value()->IsUndefined()) {
+  if (vp->IsUndefined()) {
     DelProperty(pRuntime, propname);
     return true;
   }
   return false;
 }
 
-bool JSGlobalAlternate::setPersistent(CJS_Runtime* pRuntime,
-                                      const std::vector<CJS_Value>& params,
-                                      CJS_Value& vRet,
-                                      WideString& sError) {
+bool JSGlobalAlternate::setPersistent(
+    CJS_Runtime* pRuntime,
+    const std::vector<v8::Local<v8::Value>>& params,
+    CJS_Value& vRet,
+    WideString& sError) {
   if (params.size() != 2) {
     sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return false;
   }
   auto it = m_MapGlobal.find(
-      ByteString::FromUnicode(pRuntime->ToWideString(params[0].ToV8Value())));
+      ByteString::FromUnicode(pRuntime->ToWideString(params[0])));
   if (it == m_MapGlobal.end() || it->second->bDeleted) {
     sError = JSGetStringFromID(IDS_STRING_JSNOGLOBAL);
     return false;
   }
-  it->second->bPersistent = pRuntime->ToBoolean(params[1].ToV8Value());
+  it->second->bPersistent = pRuntime->ToBoolean(params[1]);
   return true;
 }
 
diff --git a/fpdfsdk/javascript/report.cpp b/fpdfsdk/javascript/report.cpp
index 8f5d9ac..adbe7d8 100644
--- a/fpdfsdk/javascript/report.cpp
+++ b/fpdfsdk/javascript/report.cpp
@@ -27,7 +27,7 @@
 Report::~Report() {}
 
 bool Report::writeText(CJS_Runtime* pRuntime,
-                       const std::vector<CJS_Value>& params,
+                       const std::vector<v8::Local<v8::Value>>& params,
                        CJS_Value& vRet,
                        WideString& sError) {
   // Unsafe, not supported.
@@ -35,7 +35,7 @@
 }
 
 bool Report::save(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   // Unsafe, not supported.
diff --git a/fpdfsdk/javascript/report.h b/fpdfsdk/javascript/report.h
index 0f040c6..b5f8ef3 100644
--- a/fpdfsdk/javascript/report.h
+++ b/fpdfsdk/javascript/report.h
@@ -18,11 +18,11 @@
 
  public:
   bool save(CJS_Runtime* pRuntime,
-            const std::vector<CJS_Value>& params,
+            const std::vector<v8::Local<v8::Value>>& params,
             CJS_Value& vRet,
             WideString& sError);
   bool writeText(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError);
 };
diff --git a/fpdfsdk/javascript/util.cpp b/fpdfsdk/javascript/util.cpp
index 4a7e148..ecec8d1 100644
--- a/fpdfsdk/javascript/util.cpp
+++ b/fpdfsdk/javascript/util.cpp
@@ -74,15 +74,14 @@
 util::~util() {}
 
 bool util::printf(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   const size_t iSize = params.size();
   if (iSize < 1)
     return false;
 
-  std::wstring unsafe_fmt_string(
-      pRuntime->ToWideString(params[0].ToV8Value()).c_str());
+  std::wstring unsafe_fmt_string(pRuntime->ToWideString(params[0]).c_str());
   std::vector<std::wstring> unsafe_conversion_specifiers;
   int iOffset = 0;
   int iOffend = 0;
@@ -116,16 +115,15 @@
     switch (ParseDataType(&c_strFormat)) {
       case UTIL_INT:
         strSegment.Format(c_strFormat.c_str(),
-                          pRuntime->ToInt32(params[iIndex].ToV8Value()));
+                          pRuntime->ToInt32(params[iIndex]));
         break;
       case UTIL_DOUBLE:
         strSegment.Format(c_strFormat.c_str(),
-                          pRuntime->ToDouble(params[iIndex].ToV8Value()));
+                          pRuntime->ToDouble(params[iIndex]));
         break;
       case UTIL_STRING:
-        strSegment.Format(
-            c_strFormat.c_str(),
-            pRuntime->ToWideString(params[iIndex].ToV8Value()).c_str());
+        strSegment.Format(c_strFormat.c_str(),
+                          pRuntime->ToWideString(params[iIndex]).c_str());
         break;
       default:
         strSegment.Format(L"%ls", c_strFormat.c_str());
@@ -140,31 +138,27 @@
 }
 
 bool util::printd(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   const size_t iSize = params.size();
   if (iSize < 2)
     return false;
 
-  const CJS_Value& p1 = params[0];
-  const CJS_Value& p2 = params[1];
-  if (p2.ToV8Value().IsEmpty() || !p2.ToV8Value()->IsDate()) {
+  if (params[1].IsEmpty() || !params[1]->IsDate()) {
     sError = JSGetStringFromID(IDS_STRING_JSPRINT1);
     return false;
   }
 
-  ASSERT(!p2.ToV8Value().IsEmpty() && p2.ToV8Value()->IsDate());
-  v8::Local<v8::Value> mutable_value = p2.ToV8Value();
-  CJS_Date jsDate(mutable_value.As<v8::Date>());
+  CJS_Date jsDate(params[1].As<v8::Date>());
   if (!jsDate.IsValidDate(pRuntime)) {
     sError = JSGetStringFromID(IDS_STRING_JSPRINT2);
     return false;
   }
 
-  if (p1.ToV8Value()->IsNumber()) {
+  if (params[0]->IsNumber()) {
     WideString swResult;
-    switch (pRuntime->ToInt32(p1.ToV8Value())) {
+    switch (pRuntime->ToInt32(params[0])) {
       case 0:
         swResult.Format(L"D:%04d%02d%02d%02d%02d%02d", jsDate.GetYear(pRuntime),
                         jsDate.GetMonth(pRuntime) + 1, jsDate.GetDay(pRuntime),
@@ -194,8 +188,8 @@
     return true;
   }
 
-  if (p1.ToV8Value()->IsString()) {
-    if (iSize > 2 && pRuntime->ToBoolean(params[2].ToV8Value())) {
+  if (params[0]->IsString()) {
+    if (iSize > 2 && pRuntime->ToBoolean(params[2])) {
       sError = JSGetStringFromID(IDS_STRING_JSNOTSUPPORT);
       return false;  // currently, it doesn't support XFAPicture.
     }
@@ -203,7 +197,7 @@
     // Convert PDF-style format specifiers to wcsftime specifiers. Remove any
     // pre-existing %-directives before inserting our own.
     std::basic_string<wchar_t> cFormat =
-        pRuntime->ToWideString(p1.ToV8Value()).c_str();
+        pRuntime->ToWideString(params[0]).c_str();
     cFormat.erase(std::remove(cFormat.begin(), cFormat.end(), '%'),
                   cFormat.end());
 
@@ -274,7 +268,7 @@
 }
 
 bool util::printx(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError) {
   if (params.size() < 2) {
@@ -282,10 +276,9 @@
     return false;
   }
 
-  vRet = CJS_Value(
-      pRuntime->NewString(printx(pRuntime->ToWideString(params[0].ToV8Value()),
-                                 pRuntime->ToWideString(params[1].ToV8Value()))
-                              .c_str()));
+  vRet = CJS_Value(pRuntime->NewString(printx(pRuntime->ToWideString(params[0]),
+                                              pRuntime->ToWideString(params[1]))
+                                           .c_str()));
 
   return true;
 }
@@ -389,14 +382,14 @@
 }
 
 bool util::scand(CJS_Runtime* pRuntime,
-                 const std::vector<CJS_Value>& params,
+                 const std::vector<v8::Local<v8::Value>>& params,
                  CJS_Value& vRet,
                  WideString& sError) {
   if (params.size() < 2)
     return false;
 
-  WideString sFormat = pRuntime->ToWideString(params[0].ToV8Value());
-  WideString sDate = pRuntime->ToWideString(params[1].ToV8Value());
+  WideString sFormat = pRuntime->ToWideString(params[0]);
+  WideString sDate = pRuntime->ToWideString(params[1]);
   double dDate = JS_GetDateTime();
   if (sDate.GetLength() > 0) {
     dDate = CJS_PublicMethods::MakeRegularDate(sDate, sFormat, nullptr);
@@ -412,7 +405,7 @@
 }
 
 bool util::byteToChar(CJS_Runtime* pRuntime,
-                      const std::vector<CJS_Value>& params,
+                      const std::vector<v8::Local<v8::Value>>& params,
                       CJS_Value& vRet,
                       WideString& sError) {
   if (params.size() < 1) {
@@ -420,7 +413,7 @@
     return false;
   }
 
-  int arg = pRuntime->ToInt32(params[0].ToV8Value());
+  int arg = pRuntime->ToInt32(params[0]);
   if (arg < 0 || arg > 255) {
     sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
     return false;
diff --git a/fpdfsdk/javascript/util.h b/fpdfsdk/javascript/util.h
index ba46e4f..d40db96 100644
--- a/fpdfsdk/javascript/util.h
+++ b/fpdfsdk/javascript/util.h
@@ -23,23 +23,23 @@
   ~util() override;
 
   bool printd(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool printf(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool printx(CJS_Runtime* pRuntime,
-              const std::vector<CJS_Value>& params,
+              const std::vector<v8::Local<v8::Value>>& params,
               CJS_Value& vRet,
               WideString& sError);
   bool scand(CJS_Runtime* pRuntime,
-             const std::vector<CJS_Value>& params,
+             const std::vector<v8::Local<v8::Value>>& params,
              CJS_Value& vRet,
              WideString& sError);
   bool byteToChar(CJS_Runtime* pRuntime,
-                  const std::vector<CJS_Value>& params,
+                  const std::vector<v8::Local<v8::Value>>& params,
                   CJS_Value& vRet,
                   WideString& sError);
 
diff --git a/fxjs/cfxjse_context.cpp b/fxjs/cfxjse_context.cpp
index ad6dbac..0af2d36 100644
--- a/fxjs/cfxjse_context.cpp
+++ b/fxjs/cfxjse_context.cpp
@@ -74,7 +74,7 @@
 };
 
 v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
-    const v8::Local<v8::Context>& hContext) {
+    v8::Local<v8::Context> hContext) {
   return hContext->Global()->GetPrototype().As<v8::Object>();
 }
 
@@ -86,9 +86,8 @@
   hObject->SetAlignedPointerInInternalField(1, lpNewBinding);
 }
 
-CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(
-    const v8::Local<v8::Object>& hJSObject,
-    CFXJSE_Class* lpClass) {
+CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(v8::Local<v8::Object> hJSObject,
+                                               CFXJSE_Class* lpClass) {
   ASSERT(!hJSObject.IsEmpty());
   if (!hJSObject->IsObject())
     return nullptr;
diff --git a/fxjs/cfxjse_context.h b/fxjs/cfxjse_context.h
index 8ed8760..f93469b 100644
--- a/fxjs/cfxjse_context.h
+++ b/fxjs/cfxjse_context.h
@@ -53,13 +53,12 @@
                                               v8::TryCatch& trycatch);
 
 v8::Local<v8::Object> FXJSE_GetGlobalObjectFromContext(
-    const v8::Local<v8::Context>& hContext);
+    v8::Local<v8::Context> hContext);
 
 void FXJSE_UpdateObjectBinding(v8::Local<v8::Object>& hObject,
                                CFXJSE_HostObject* lpNewBinding = nullptr);
 
-CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(
-    const v8::Local<v8::Object>& hJSObject,
-    CFXJSE_Class* lpClass = nullptr);
+CFXJSE_HostObject* FXJSE_RetrieveObjectBinding(v8::Local<v8::Object> hJSObject,
+                                               CFXJSE_Class* lpClass = nullptr);
 
 #endif  // FXJS_CFXJSE_CONTEXT_H_
diff --git a/fxjs/fxjs_v8.h b/fxjs/fxjs_v8.h
index 457843f..f5e5241 100644
--- a/fxjs/fxjs_v8.h
+++ b/fxjs/fxjs_v8.h
@@ -54,10 +54,8 @@
   typedef v8::GlobalValueMap<void*, v8::Object, V8TemplateMapTraits> MapType;
   typedef void WeakCallbackDataType;
 
-  static WeakCallbackDataType* WeakCallbackParameter(
-      MapType* map,
-      void* key,
-      const v8::Local<v8::Object>& value) {
+  static WeakCallbackDataType*
+  WeakCallbackParameter(MapType* map, void* key, v8::Local<v8::Object> value) {
     return key;
   }
   static MapType* MapFromWeakCallbackInfo(
