diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index aa0efb1..f1e23db 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -163,10 +163,10 @@
                                                   CJS_Value val) {
   CJS_Array StrArray;
   if (val.IsArrayObject()) {
-    val.ConvertToArray(StrArray);
+    val.ConvertToArray(pRuntime->GetIsolate(), StrArray);
     return StrArray;
   }
-  CFX_WideString wsStr = val.ToCFXWideString();
+  CFX_WideString wsStr = val.ToCFXWideString(pRuntime->GetIsolate());
   CFX_ByteString t = CFX_ByteString::FromUnicode(wsStr);
   const char* p = t.c_str();
 
@@ -743,12 +743,13 @@
   if (strValue.IsEmpty())
     return TRUE;
 
-  int iDec = params[0].ToInt();
-  int iSepStyle = params[1].ToInt();
-  int iNegStyle = params[2].ToInt();
+  int iDec = params[0].ToInt(pRuntime->GetIsolate());
+  int iSepStyle = params[1].ToInt(pRuntime->GetIsolate());
+  int iNegStyle = params[2].ToInt(pRuntime->GetIsolate());
   // params[3] is iCurrStyle, it's not used.
-  CFX_WideString wstrCurrency = params[4].ToCFXWideString();
-  FX_BOOL bCurrencyPrepend = params[5].ToBool();
+  CFX_WideString wstrCurrency =
+      params[4].ToCFXWideString(pRuntime->GetIsolate());
+  FX_BOOL bCurrencyPrepend = params[5].ToBool(pRuntime->GetIsolate());
 
   if (iDec < 0)
     iDec = -iDec;
@@ -837,11 +838,11 @@
       if (Field* fTarget = pEvent->Target_Field()) {
         CJS_Array arColor;
         CJS_Value vColElm(pRuntime);
-        vColElm = L"RGB";
+        vColElm = CJS_Value(pRuntime, L"RGB");
         arColor.SetElement(pRuntime->GetIsolate(), 0, vColElm);
-        vColElm = 1;
+        vColElm = CJS_Value(pRuntime, 1);
         arColor.SetElement(pRuntime->GetIsolate(), 1, vColElm);
-        vColElm = 0;
+        vColElm = CJS_Value(pRuntime, 0);
         arColor.SetElement(pRuntime->GetIsolate(), 2, vColElm);
         arColor.SetElement(pRuntime->GetIsolate(), 3, vColElm);
 
@@ -857,9 +858,9 @@
       if (Field* fTarget = pEvent->Target_Field()) {
         CJS_Array arColor;
         CJS_Value vColElm(pRuntime);
-        vColElm = L"RGB";
+        vColElm = CJS_Value(pRuntime, L"RGB");
         arColor.SetElement(pRuntime->GetIsolate(), 0, vColElm);
-        vColElm = 0;
+        vColElm = CJS_Value(pRuntime, 0);
         arColor.SetElement(pRuntime->GetIsolate(), 1, vColElm);
         arColor.SetElement(pRuntime->GetIsolate(), 2, vColElm);
         arColor.SetElement(pRuntime->GetIsolate(), 3, vColElm);
@@ -869,7 +870,7 @@
         fTarget->textColor(cc, vProp, sError);
 
         CJS_Array aProp;
-        vProp.ConvertToArray(aProp);
+        vProp.GetJSValue()->ConvertToArray(pRuntime->GetIsolate(), aProp);
 
         CPWL_Color crProp;
         CPWL_Color crColor;
@@ -940,7 +941,8 @@
     }
   }
 
-  int iSepStyle = params[1].ToInt();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  int iSepStyle = params[1].ToInt(pRuntime->GetIsolate());
   if (iSepStyle < 0 || iSepStyle > 3)
     iSepStyle = 0;
   const FX_WCHAR cSep = iSepStyle < 2 ? L'.' : L',';
@@ -1000,6 +1002,7 @@
     CFX_WideString& sError) {
 #if _FX_OS_ != _FX_ANDROID_
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() != 2) {
@@ -1014,11 +1017,11 @@
   if (strValue.IsEmpty())
     return TRUE;
 
-  int iDec = params[0].ToInt();
+  int iDec = params[0].ToInt(pRuntime->GetIsolate());
   if (iDec < 0)
     iDec = -iDec;
 
-  int iSepStyle = params[1].ToInt();
+  int iSepStyle = params[1].ToInt(pRuntime->GetIsolate());
   if (iSepStyle < 0 || iSepStyle > 3)
     iSepStyle = 0;
 
@@ -1099,6 +1102,7 @@
                                            CJS_Value& vRet,
                                            CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() != 1) {
@@ -1113,7 +1117,7 @@
   if (strValue.IsEmpty())
     return TRUE;
 
-  CFX_WideString sFormat = params[0].ToCFXWideString();
+  CFX_WideString sFormat = params[0].ToCFXWideString(pRuntime->GetIsolate());
   double dDate = 0.0f;
 
   if (strValue.Find(L"GMT") != -1) {
@@ -1199,6 +1203,7 @@
     CJS_Value& vRet,
     CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() != 1) {
@@ -1213,7 +1218,7 @@
     if (strValue.IsEmpty())
       return TRUE;
 
-    CFX_WideString sFormat = params[0].ToCFXWideString();
+    CFX_WideString sFormat = params[0].ToCFXWideString(pRuntime->GetIsolate());
     bool bWrongFormat = FALSE;
     double dRet = MakeRegularDate(strValue, sFormat, &bWrongFormat);
     if (bWrongFormat || JS_PortIsNan(dRet)) {
@@ -1238,7 +1243,8 @@
     return FALSE;
   }
 
-  int iIndex = params[0].ToInt();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  int iIndex = params[0].ToInt(pRuntime->GetIsolate());
   const FX_WCHAR* cFormats[] = {L"m/d",
                                 L"m/d/yy",
                                 L"mm/dd/yy",
@@ -1275,7 +1281,8 @@
     return FALSE;
   }
 
-  int iIndex = params[0].ToInt();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  int iIndex = params[0].ToInt(pRuntime->GetIsolate());
   const FX_WCHAR* cFormats[] = {L"m/d",
                                 L"m/d/yy",
                                 L"mm/dd/yy",
@@ -1311,7 +1318,8 @@
     return FALSE;
   }
 
-  int iIndex = params[0].ToInt();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  int iIndex = params[0].ToInt(pRuntime->GetIsolate());
   const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss",
                                 L"h:MM:ss tt"};
 
@@ -1335,7 +1343,8 @@
     return FALSE;
   }
 
-  int iIndex = params[0].ToInt();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  int iIndex = params[0].ToInt(pRuntime->GetIsolate());
   const FX_WCHAR* cFormats[] = {L"HH:MM", L"h:MM tt", L"HH:MM:ss",
                                 L"h:MM:ss tt"};
 
@@ -1370,7 +1379,6 @@
     CJS_Value& vRet,
     CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
-
   if (params.size() != 1) {
     sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
     return FALSE;
@@ -1380,9 +1388,10 @@
   if (!pEvent->m_pValue)
     return FALSE;
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString wsSource = pEvent->Value();
   CFX_WideString wsFormat;
-  switch (params[0].ToInt()) {
+  switch (params[0].ToInt(pRuntime->GetIsolate())) {
     case 0:
       wsFormat = L"99999";
       break;
@@ -1411,6 +1420,7 @@
     CJS_Value& vRet,
     CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() < 1) {
@@ -1422,7 +1432,7 @@
     return FALSE;
   CFX_WideString& valEvent = pEvent->Value();
 
-  CFX_WideString wstrMask = params[0].ToCFXWideString();
+  CFX_WideString wstrMask = params[0].ToCFXWideString(pRuntime->GetIsolate());
   if (wstrMask.IsEmpty())
     return TRUE;
 
@@ -1509,7 +1519,8 @@
     return FALSE;
 
   const char* cFormat = "";
-  switch (params[0].ToInt()) {
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  switch (params[0].ToInt(pRuntime->GetIsolate())) {
     case 0:
       cFormat = "99999";
       break;
@@ -1537,6 +1548,7 @@
                                          CJS_Value& vRet,
                                          CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
 
   if (params.size() != 1) {
@@ -1549,7 +1561,7 @@
     swValue = pEventHandler->Value();
 
   if (pEventHandler->WillCommit()) {
-    vRet = swValue.c_str();
+    vRet = CJS_Value(pRuntime, swValue.c_str());
     return TRUE;
   }
 
@@ -1567,8 +1579,8 @@
   else
     postfix = L"";
 
-  vRet = (prefix + pEventHandler->Change() + postfix).c_str();
-
+  vRet =
+      CJS_Value(pRuntime, (prefix + pEventHandler->Change() + postfix).c_str());
   return TRUE;
 }
 
@@ -1577,15 +1589,15 @@
                                          CJS_Value& vRet,
                                          CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
-  ASSERT(pContext);
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
 
   if (params.size() != 2) {
     sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  CFX_WideString sValue = params[0].ToCFXWideString();
-  CFX_WideString sFormat = params[1].ToCFXWideString();
+  CFX_WideString sValue = params[0].ToCFXWideString(pRuntime->GetIsolate());
+  CFX_WideString sFormat = params[1].ToCFXWideString(pRuntime->GetIsolate());
 
   double dDate = MakeRegularDate(sValue, sFormat, nullptr);
 
@@ -1597,7 +1609,7 @@
     return FALSE;
   }
 
-  vRet = dDate;
+  vRet = CJS_Value(pRuntime, dDate);
   return TRUE;
 }
 
@@ -1605,16 +1617,20 @@
                                     const std::vector<CJS_Value>& params,
                                     CJS_Value& vRet,
                                     CFX_WideString& sError) {
-  if (params.size() != 3) {
-    CJS_Context* pContext = (CJS_Context*)cc;
-    ASSERT(pContext);
+  CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
 
+  if (params.size() != 3) {
     sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  vRet = (double)AF_Simple(params[0].ToCFXWideString().c_str(),
-                           params[1].ToDouble(), params[2].ToDouble());
+  vRet = CJS_Value(
+      pRuntime, static_cast<double>(AF_Simple(
+                    params[0].ToCFXWideString(pRuntime->GetIsolate()).c_str(),
+                    params[1].ToDouble(pRuntime->GetIsolate()),
+                    params[2].ToDouble(pRuntime->GetIsolate()))));
+
   return TRUE;
 }
 
@@ -1623,16 +1639,19 @@
                                         CJS_Value& vRet,
                                         CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+
   if (params.size() != 1) {
     sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
-  CFX_WideString ws = params[0].ToCFXWideString();
+
+  CFX_WideString ws = params[0].ToCFXWideString(pRuntime->GetIsolate());
   ws.Replace(L",", L".");
-  vRet = ws.c_str();
-  vRet.MaybeCoerceToNumber();
+  vRet = CJS_Value(pRuntime, ws.c_str());
+  vRet.MaybeCoerceToNumber(pRuntime->GetIsolate());
   if (vRet.GetType() != CJS_Value::VT_number)
-    vRet = 0;
+    vRet = CJS_Value(pRuntime, 0);
   return TRUE;
 }
 
@@ -1642,6 +1661,8 @@
     CJS_Value& vRet,
     CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+
   if (params.size() != 2) {
     sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
     return FALSE;
@@ -1657,17 +1678,17 @@
   CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
   CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
 
-  CFX_WideString sFunction = params[0].ToCFXWideString();
+  CFX_WideString sFunction = params[0].ToCFXWideString(pRuntime->GetIsolate());
   double dValue = wcscmp(sFunction.c_str(), L"PRD") == 0 ? 1.0 : 0.0;
 
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_Array FieldNameArray = AF_MakeArrayFromList(pRuntime, params1);
   int nFieldsCount = 0;
 
   for (int i = 0, isz = FieldNameArray.GetLength(); i < isz; i++) {
     CJS_Value jsValue(pRuntime);
     FieldNameArray.GetElement(pRuntime->GetIsolate(), i, jsValue);
-    CFX_WideString wsFieldName = jsValue.ToCFXWideString();
+    CFX_WideString wsFieldName =
+        jsValue.ToCFXWideString(pRuntime->GetIsolate());
 
     for (int j = 0, jsz = pInterForm->CountFields(wsFieldName); j < jsz; j++) {
       if (CPDF_FormField* pFormField = pInterForm->GetField(j, wsFieldName)) {
@@ -1728,7 +1749,8 @@
            FXSYS_pow((double)10, (double)6);
   CJS_Value jsValue(pRuntime, dValue);
   if (pContext->GetEventHandler()->m_pValue)
-    pContext->GetEventHandler()->Value() = jsValue.ToCFXWideString();
+    pContext->GetEventHandler()->Value() =
+        jsValue.ToCFXWideString(pRuntime->GetIsolate());
 
   return TRUE;
 }
@@ -1742,6 +1764,7 @@
     CJS_Value& vRet,
     CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() != 4) {
@@ -1755,25 +1778,25 @@
     return TRUE;
   double dEentValue =
       atof(CFX_ByteString::FromUnicode(pEvent->Value()).c_str());
-  FX_BOOL bGreaterThan = params[0].ToBool();
-  double dGreaterThan = params[1].ToDouble();
-  FX_BOOL bLessThan = params[2].ToBool();
-  double dLessThan = params[3].ToDouble();
+  FX_BOOL bGreaterThan = params[0].ToBool(pRuntime->GetIsolate());
+  double dGreaterThan = params[1].ToDouble(pRuntime->GetIsolate());
+  FX_BOOL bLessThan = params[2].ToBool(pRuntime->GetIsolate());
+  double dLessThan = params[3].ToDouble(pRuntime->GetIsolate());
   CFX_WideString swMsg;
 
   if (bGreaterThan && bLessThan) {
     if (dEentValue < dGreaterThan || dEentValue > dLessThan)
       swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1).c_str(),
-                   params[1].ToCFXWideString().c_str(),
-                   params[3].ToCFXWideString().c_str());
+                   params[1].ToCFXWideString(pRuntime->GetIsolate()).c_str(),
+                   params[3].ToCFXWideString(pRuntime->GetIsolate()).c_str());
   } else if (bGreaterThan) {
     if (dEentValue < dGreaterThan)
       swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2).c_str(),
-                   params[1].ToCFXWideString().c_str());
+                   params[1].ToCFXWideString(pRuntime->GetIsolate()).c_str());
   } else if (bLessThan) {
     if (dEentValue > dLessThan)
       swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3).c_str(),
-                   params[3].ToCFXWideString().c_str());
+                   params[3].ToCFXWideString(pRuntime->GetIsolate()).c_str());
   }
 
   if (!swMsg.IsEmpty()) {
@@ -1788,15 +1811,15 @@
                                          CJS_Value& vRet,
                                          CFX_WideString& sError) {
   CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+
   if (params.size() != 1) {
     sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_Array nums;
-
-  CFX_WideString str = params[0].ToCFXWideString();
+  CFX_WideString str = params[0].ToCFXWideString(pRuntime->GetIsolate());
   CFX_WideString sPart;
 
   if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
@@ -1825,7 +1848,7 @@
   if (nums.GetLength() > 0)
     vRet = CJS_Value(pRuntime, nums);
   else
-    vRet.SetNull();
+    vRet.SetNull(pRuntime);
 
   return TRUE;
 }
