Remove unused context parameter from JSGetStringFromID

Clean up before using IDS_STRING_JSBADOBJECT in nearly
all JS callbacks, which will happen in the next CL when we
watch C-side object destruction.

Add a "no permission" message as well.

Review-Url: https://codereview.chromium.org/2319543003
diff --git a/fpdfsdk/javascript/Annot.cpp b/fpdfsdk/javascript/Annot.cpp
index d45aa60..ec77000 100644
--- a/fpdfsdk/javascript/Annot.cpp
+++ b/fpdfsdk/javascript/Annot.cpp
@@ -91,8 +91,7 @@
                     CJS_PropValue& vp,
                     CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
 
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index d8e3622..cb79ab4 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -163,8 +163,7 @@
                             CJS_PropValue& vp,
                             CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
   CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
@@ -278,13 +277,12 @@
                            const std::vector<CJS_Value>& params,
                            CJS_Value& vRet,
                            CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-
   if (params.size() < 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = pContext->GetJSRuntime();
   CFX_WideString wideName = params[0].ToCFXWideString(pRuntime);
   CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
@@ -310,19 +308,17 @@
                                   const std::vector<CJS_Value>& params,
                                   CJS_Value& vRet,
                                   CFX_WideString& sError) {
+  if (params.size() != 1) {
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+    return FALSE;
+  }
   CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
-  if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
-    return FALSE;
-  }
   int nIndex = params[0].ToInt(pRuntime);
   if (nIndex < 0) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
     return FALSE;
   }
-
   CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
   CPDF_InterForm* pPDFForm = pInterForm->GetInterForm();
   CPDF_FormField* pField = pPDFForm->GetField(nIndex);
@@ -470,18 +466,16 @@
                               CJS_Value& vRet,
                               CFX_WideString& sError) {
   if (!(m_pDocument->GetPermissions(FPDFPERM_MODIFY) ||
-        m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM)))
-    return FALSE;
-
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-
-  if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+        m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM))) {
+    sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return FALSE;
   }
-
+  if (params.size() != 1) {
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
+    return FALSE;
+  }
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
   CFX_WideString sFieldName = params[0].ToCFXWideString(pRuntime);
   CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
   std::vector<CPDFSDK_Widget*> widgets;
@@ -586,21 +580,18 @@
                              const std::vector<CJS_Value>& params,
                              CJS_Value& vRet,
                              CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
 
   int nSize = params.size();
   if (nSize < 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
-
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
   CJS_Array aFields;
   CFX_WideString strURL;
   FX_BOOL bFDF = TRUE;
   FX_BOOL bEmpty = FALSE;
-
-  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
   CJS_Value v = params[0];
   if (v.GetType() == CJS_Value::VT_string) {
     strURL = params[0].ToCFXWideString(pRuntime);
@@ -746,8 +737,7 @@
                        CJS_PropValue& vp,
                        CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
 
@@ -889,8 +879,7 @@
                            CJS_PropValue& vp,
                            CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
   vp << m_pDocument->GetPageCount();
@@ -900,7 +889,7 @@
 FX_BOOL Document::external(IJS_Context* cc,
                            CJS_PropValue& vp,
                            CFX_WideString& sError) {
-  // In Chrome case,should always return true.
+  // In Chrome case, should always return true.
   if (vp.IsGetting()) {
     vp << true;
   }
@@ -911,8 +900,7 @@
                            CJS_PropValue& vp,
                            CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
   vp << 0;
@@ -935,8 +923,7 @@
                       CJS_PropValue& vp,
                       CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
   vp << m_pDocument->GetPath();
@@ -977,8 +964,7 @@
                                    CJS_PropValue& vp,
                                    CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
   CFX_WideString wsFilePath = m_pDocument->GetPath();
@@ -999,8 +985,7 @@
                        CJS_PropValue& vp,
                        CFX_WideString& sError) {
   if (vp.IsSetting()) {
-    CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
   vp << app::SysPathToPDFPath(m_pDocument->GetPath());
@@ -1044,16 +1029,14 @@
                            const std::vector<CJS_Value>& params,
                            CJS_Value& vRet,
                            CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   if (params.size() != 2) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
-
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = pContext->GetJSRuntime();
   int nPageNo = params[0].ToInt(pRuntime);
   CFX_WideString swAnnotName = params[1].ToCFXWideString(pRuntime);
-
   CPDFSDK_PageView* pPageView = m_pDocument->GetPageView(nPageNo);
   if (!pPageView)
     return FALSE;
@@ -1178,31 +1161,30 @@
                           const std::vector<CJS_Value>& params,
                           CJS_Value& vRet,
                           CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
 
   if (params.size() != 2) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
   CFX_WideString swIconName = params[0].ToCFXWideString(pRuntime);
 
   if (params[1].GetType() != CJS_Value::VT_object) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
     return FALSE;
   }
 
   v8::Local<v8::Object> pJSIcon = params[1].ToV8Object(pRuntime);
   if (pRuntime->GetObjDefnID(pJSIcon) != CJS_Icon::g_nObjDefnID) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
     return FALSE;
   }
 
   CJS_EmbedObj* pEmbedObj = params[1].ToCJSObject(pRuntime)->GetEmbedObject();
   if (!pEmbedObj) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSTYPEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
     return FALSE;
   }
 
@@ -1214,9 +1196,8 @@
 FX_BOOL Document::icons(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   if (vp.IsSetting()) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSREADONLY);
+    sError = JSGetStringFromID(IDS_STRING_JSREADONLY);
     return FALSE;
   }
 
@@ -1257,17 +1238,15 @@
                           const std::vector<CJS_Value>& params,
                           CJS_Value& vRet,
                           CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
   if (m_IconList.empty())
     return FALSE;
 
-  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString swIconName = params[0].ToCFXWideString(pRuntime);
 
   for (const auto& pIconElement : m_IconList) {
@@ -1344,15 +1323,12 @@
                                  const std::vector<CJS_Value>& params,
                                  CJS_Value& vRet,
                                  CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-
   // TODO(tsepez): check maximum allowable params.
-
-  if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
+  if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) {
+    sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return FALSE;
-
-  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
+  }
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   int nPageNo = params.size() > 0 ? params[0].ToInt(pRuntime) : 0;
   int nWordNo = params.size() > 1 ? params[1].ToInt(pRuntime) : 0;
   bool bStrip = params.size() > 2 ? params[2].ToBool(pRuntime) : true;
@@ -1362,7 +1338,7 @@
     return FALSE;
 
   if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
     return FALSE;
   }
 
@@ -1410,17 +1386,15 @@
                                   const std::vector<CJS_Value>& params,
                                   CJS_Value& vRet,
                                   CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-
-  if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS))
+  if (!m_pDocument->GetPermissions(FPDFPERM_EXTRACT_ACCESS)) {
+    sError = JSGetStringFromID(IDS_STRING_JSNOPERMISSION);
     return FALSE;
-
-  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
+  }
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   int nPageNo = params.size() > 0 ? params[0].ToInt(pRuntime) : 0;
   CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
   if (nPageNo < 0 || nPageNo >= pDocument->GetPageCount()) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
     return FALSE;
   }
 
@@ -1594,17 +1568,14 @@
                                 const std::vector<CJS_Value>& params,
                                 CJS_Value& vRet,
                                 CFX_WideString& sError) {
-  CJS_Context* context = (CJS_Context*)cc;
-
   if (params.size() != 1) {
-    sError = JSGetStringFromID(context, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  CJS_Runtime* pRuntime = context->GetJSRuntime();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString wideName = params[0].ToCFXWideString(pRuntime);
   CFX_ByteString utf8Name = wideName.UTF8Encode();
-
   CPDF_Document* pDocument = m_pDocument->GetPDFDocument();
   if (!pDocument)
     return FALSE;
diff --git a/fpdfsdk/javascript/PublicMethods.cpp b/fpdfsdk/javascript/PublicMethods.cpp
index 1dfac93..749c8d7 100644
--- a/fpdfsdk/javascript/PublicMethods.cpp
+++ b/fpdfsdk/javascript/PublicMethods.cpp
@@ -728,13 +728,13 @@
                                            CJS_Value& vRet,
                                            CFX_WideString& sError) {
 #if _FX_OS_ != _FX_ANDROID_
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 6) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
   if (!pEvent->m_pValue)
     return FALSE;
@@ -898,7 +898,7 @@
     const std::vector<CJS_Value>& params,
     CJS_Value& vRet,
     CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() < 2)
@@ -919,7 +919,7 @@
     swTemp.Replace(L",", L".");
     if (!IsNumber(swTemp.c_str())) {
       pEvent->Rc() = FALSE;
-      sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+      sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE);
       AlertIfPossible(pContext, sError.c_str());
     }
     return TRUE;  // it happens after the last keystroke and before validating,
@@ -1001,12 +1001,12 @@
     CJS_Value& vRet,
     CFX_WideString& sError) {
 #if _FX_OS_ != _FX_ANDROID_
-  CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() != 2) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
   if (!pEvent->m_pValue)
@@ -1101,12 +1101,12 @@
                                            const std::vector<CJS_Value>& params,
                                            CJS_Value& vRet,
                                            CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
   if (!pEvent->m_pValue)
@@ -1130,7 +1130,7 @@
 
   if (JS_PortIsNan(dDate)) {
     CFX_WideString swMsg;
-    swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(),
+    swMsg.Format(JSGetStringFromID(IDS_STRING_JSPARSEDATE).c_str(),
                  sFormat.c_str());
     AlertIfPossible(pContext, swMsg.c_str());
     return FALSE;
@@ -1223,7 +1223,7 @@
     double dRet = MakeRegularDate(strValue, sFormat, &bWrongFormat);
     if (bWrongFormat || JS_PortIsNan(dRet)) {
       CFX_WideString swMsg;
-      swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(),
+      swMsg.Format(JSGetStringFromID(IDS_STRING_JSPARSEDATE).c_str(),
                    sFormat.c_str());
       AlertIfPossible(pContext, swMsg.c_str());
       pEvent->Rc() = FALSE;
@@ -1237,9 +1237,8 @@
                                          const std::vector<CJS_Value>& params,
                                          CJS_Value& vRet,
                                          CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
@@ -1275,9 +1274,8 @@
     const std::vector<CJS_Value>& params,
     CJS_Value& vRet,
     CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
@@ -1312,9 +1310,8 @@
                                          const std::vector<CJS_Value>& params,
                                          CJS_Value& vRet,
                                          CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
@@ -1337,9 +1334,8 @@
     const std::vector<CJS_Value>& params,
     CJS_Value& vRet,
     CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
@@ -1378,12 +1374,12 @@
     const std::vector<CJS_Value>& params,
     CJS_Value& vRet,
     CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
   if (!pEvent->m_pValue)
     return FALSE;
@@ -1424,14 +1420,14 @@
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
 
   if (params.size() < 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
   if (!pEvent->m_pValue)
     return FALSE;
-  CFX_WideString& valEvent = pEvent->Value();
 
+  CFX_WideString& valEvent = pEvent->Value();
   CFX_WideString wstrMask = params[0].ToCFXWideString(pRuntime);
   if (wstrMask.IsEmpty())
     return TRUE;
@@ -1449,8 +1445,7 @@
     if (iIndexMask != wstrMask.GetLength() ||
         (iIndexMask != valEvent.GetLength() && wstrMask.GetLength() != 0)) {
       AlertIfPossible(
-          pContext,
-          JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str());
+          pContext, JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE).c_str());
       pEvent->Rc() = FALSE;
     }
     return TRUE;
@@ -1465,26 +1460,23 @@
   FX_STRSIZE combined_len = valEvent.GetLength() + wChange.GetLength() +
                             pEvent->SelStart() - pEvent->SelEnd();
   if (combined_len > wstrMask.GetLength()) {
-    AlertIfPossible(
-        pContext,
-        JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
+    AlertIfPossible(pContext,
+                    JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG).c_str());
     pEvent->Rc() = FALSE;
     return TRUE;
   }
 
   if (iIndexMask >= wstrMask.GetLength() && !wChange.IsEmpty()) {
-    AlertIfPossible(
-        pContext,
-        JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
+    AlertIfPossible(pContext,
+                    JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG).c_str());
     pEvent->Rc() = FALSE;
     return TRUE;
   }
 
   for (FX_STRSIZE i = 0; i < wChange.GetLength(); ++i) {
     if (iIndexMask >= wstrMask.GetLength()) {
-      AlertIfPossible(
-          pContext,
-          JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG).c_str());
+      AlertIfPossible(pContext,
+                      JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG).c_str());
       pEvent->Rc() = FALSE;
       return TRUE;
     }
@@ -1508,12 +1500,12 @@
     const std::vector<CJS_Value>& params,
     CJS_Value& vRet,
     CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_EventHandler* pEvent = pContext->GetEventHandler();
   if (!pEvent->m_pValue)
     return FALSE;
@@ -1547,15 +1539,15 @@
                                          const std::vector<CJS_Value>& params,
                                          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) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  CJS_EventHandler* pEventHandler = pContext->GetEventHandler();
+
   CFX_WideString swValue;
   if (pEventHandler->m_pValue)
     swValue = pEventHandler->Value();
@@ -1588,14 +1580,12 @@
                                          const std::vector<CJS_Value>& params,
                                          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);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString sValue = params[0].ToCFXWideString(pRuntime);
   CFX_WideString sFormat = params[1].ToCFXWideString(pRuntime);
 
@@ -1603,7 +1593,7 @@
 
   if (JS_PortIsNan(dDate)) {
     CFX_WideString swMsg;
-    swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSPARSEDATE).c_str(),
+    swMsg.Format(JSGetStringFromID(IDS_STRING_JSPARSEDATE).c_str(),
                  sFormat.c_str());
     AlertIfPossible((CJS_Context*)cc, swMsg.c_str());
     return FALSE;
@@ -1617,14 +1607,12 @@
                                     const std::vector<CJS_Value>& params,
                                     CJS_Value& vRet,
                                     CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
-
   if (params.size() != 3) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   vRet = CJS_Value(pRuntime, static_cast<double>(AF_Simple(
                                  params[0].ToCFXWideString(pRuntime).c_str(),
                                  params[1].ToDouble(pRuntime),
@@ -1637,14 +1625,12 @@
                                         const std::vector<CJS_Value>& params,
                                         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);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString ws = params[0].ToCFXWideString(pRuntime);
   ws.Replace(L",", L".");
   vRet = CJS_Value(pRuntime, ws.c_str());
@@ -1659,20 +1645,19 @@
     const std::vector<CJS_Value>& params,
     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);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
   CJS_Value params1 = params[1];
   if (!params1.IsArrayObject() && params1.GetType() != CJS_Value::VT_string) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CPDFSDK_Document* pReaderDoc = pContext->GetReaderDocument();
   CPDFSDK_InterForm* pReaderInterForm = pReaderDoc->GetInterForm();
   CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
@@ -1760,19 +1745,19 @@
     const std::vector<CJS_Value>& params,
     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) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
-
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
+  CJS_EventHandler* pEvent = pContext->GetEventHandler();
   if (!pEvent->m_pValue)
     return FALSE;
+
   if (pEvent->Value().IsEmpty())
     return TRUE;
+
   double dEentValue =
       atof(CFX_ByteString::FromUnicode(pEvent->Value()).c_str());
   FX_BOOL bGreaterThan = params[0].ToBool(pRuntime);
@@ -1783,16 +1768,16 @@
 
   if (bGreaterThan && bLessThan) {
     if (dEentValue < dGreaterThan || dEentValue > dLessThan)
-      swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE1).c_str(),
+      swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE1).c_str(),
                    params[1].ToCFXWideString(pRuntime).c_str(),
                    params[3].ToCFXWideString(pRuntime).c_str());
   } else if (bGreaterThan) {
     if (dEentValue < dGreaterThan)
-      swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE2).c_str(),
+      swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE2).c_str(),
                    params[1].ToCFXWideString(pRuntime).c_str());
   } else if (bLessThan) {
     if (dEentValue > dLessThan)
-      swMsg.Format(JSGetStringFromID(pContext, IDS_STRING_JSRANGE3).c_str(),
+      swMsg.Format(JSGetStringFromID(IDS_STRING_JSRANGE3).c_str(),
                    params[3].ToCFXWideString(pRuntime).c_str());
   }
 
@@ -1807,17 +1792,15 @@
                                          const std::vector<CJS_Value>& params,
                                          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);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  CJS_Array nums;
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString str = params[0].ToCFXWideString(pRuntime);
   CFX_WideString sPart;
+  CJS_Array nums;
 
   if (str.GetAt(0) == L'.' || str.GetAt(0) == L',')
     str = L"0" + str;
diff --git a/fpdfsdk/javascript/app.cpp b/fpdfsdk/javascript/app.cpp
index 89e8b56..d7086d2 100644
--- a/fpdfsdk/javascript/app.cpp
+++ b/fpdfsdk/javascript/app.cpp
@@ -382,13 +382,12 @@
                    const std::vector<CJS_Value>& params,
                    CJS_Value& vRet,
                    CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   std::vector<CJS_Value> newParams = JS_ExpandKeywordParams(
       pRuntime, params, 4, L"cMsg", L"nIcon", L"nType", L"cTitle");
 
   if (newParams[0].GetType() == CJS_Value::VT_unknown) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
@@ -430,7 +429,7 @@
   if (newParams[3].GetType() != CJS_Value::VT_unknown)
     swTitle = newParams[3].ToCFXWideString(pRuntime);
   else
-    swTitle = JSGetStringFromID(pContext, IDS_STRING_JSALERT);
+    swTitle = JSGetStringFromID(IDS_STRING_JSALERT);
 
   pRuntime->BeginBlock();
   if (CPDFSDK_Document* pDoc = pApp->GetSDKDocument())
@@ -447,14 +446,13 @@
                   CJS_Value& vRet,
                   CFX_WideString& sError) {
   if (params.size() == 1) {
-    CJS_Context* pContext = (CJS_Context*)cc;
-    CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+    CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
     CPDFDoc_Environment* pEnv = pRuntime->GetReaderApp();
     pEnv->JS_appBeep(params[0].ToInt(pRuntime));
     return TRUE;
   }
 
-  sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+  sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
   return FALSE;
 }
 
@@ -480,18 +478,16 @@
                          const std::vector<CJS_Value>& params,
                          CJS_Value& vRet,
                          CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
-
   if (params.size() > 2 || params.size() == 0) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString script =
       params.size() > 0 ? params[0].ToCFXWideString(pRuntime) : L"";
   if (script.IsEmpty()) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+    sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE);
     return TRUE;
   }
 
@@ -517,17 +513,15 @@
                         const std::vector<CJS_Value>& params,
                         CJS_Value& vRet,
                         CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
-
   if (params.size() > 2 || params.size() == 0) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   CFX_WideString script = params[0].ToCFXWideString(pRuntime);
   if (script.IsEmpty()) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSAFNUMBER_KEYSTROKE);
+    sError = JSGetStringFromID(IDS_STRING_JSAFNUMBER_KEYSTROKE);
     return TRUE;
   }
 
@@ -555,13 +549,12 @@
                           const std::vector<CJS_Value>& params,
                           CJS_Value& vRet,
                           CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  app::ClearTimerCommon(pContext->GetJSRuntime(), params[0]);
+  app::ClearTimerCommon(CJS_Runtime::FromContext(cc), params[0]);
   return TRUE;
 }
 
@@ -569,13 +562,12 @@
                            const std::vector<CJS_Value>& params,
                            CJS_Value& vRet,
                            CFX_WideString& sError) {
-  CJS_Context* pContext = (CJS_Context*)cc;
   if (params.size() != 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
-  app::ClearTimerCommon(pContext->GetJSRuntime(), params[0]);
+  app::ClearTimerCommon(CJS_Runtime::FromContext(cc), params[0]);
   return TRUE;
 }
 
@@ -645,14 +637,13 @@
                      const std::vector<CJS_Value>& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-  CJS_Runtime* pRuntime = pContext->GetJSRuntime();
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   std::vector<CJS_Value> newParams =
       JS_ExpandKeywordParams(pRuntime, params, 6, L"bUI", L"cTo", L"cCc",
                              L"cBcc", L"cSubject", L"cMsg");
 
   if (newParams[0].GetType() == CJS_Value::VT_unknown) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
   bool bUI = newParams[0].ToBool(pRuntime);
@@ -663,7 +654,7 @@
   } else {
     if (!bUI) {
       // cTo parameter required when UI not invoked.
-      sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+      sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
       return FALSE;
     }
   }
@@ -685,6 +676,7 @@
     cMsg = newParams[5].ToCFXWideString(pRuntime);
 
   pRuntime->BeginBlock();
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   pContext->GetReaderApp()->JS_docmailForm(nullptr, 0, bUI, cTo.c_str(),
                                            cSubject.c_str(), cCc.c_str(),
                                            cBcc.c_str(), cMsg.c_str());
@@ -768,14 +760,13 @@
                       const std::vector<CJS_Value>& params,
                       CJS_Value& vRet,
                       CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   std::vector<CJS_Value> newParams =
       JS_ExpandKeywordParams(pRuntime, params, 5, L"cQuestion", L"cTitle",
                              L"cDefault", L"bPassword", L"cLabel");
 
   if (newParams[0].GetType() == CJS_Value::VT_unknown) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
   CFX_WideString swQuestion = newParams[0].ToCFXWideString(pRuntime);
@@ -800,12 +791,13 @@
   std::unique_ptr<char[]> pBuff(new char[MAX_INPUT_BYTES + 2]);
   memset(pBuff.get(), 0, MAX_INPUT_BYTES + 2);
 
+  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
   int nLengthBytes = pContext->GetReaderApp()->JS_appResponse(
       swQuestion.c_str(), swTitle.c_str(), swDefault.c_str(), swLabel.c_str(),
       bPassword, pBuff.get(), MAX_INPUT_BYTES);
 
   if (nLengthBytes < 0 || nLengthBytes > MAX_INPUT_BYTES) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAM_TOOLONG);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAM_TOOLONG);
     return FALSE;
   }
 
diff --git a/fpdfsdk/javascript/cjs_context.cpp b/fpdfsdk/javascript/cjs_context.cpp
index c37fdab..87b8b43 100644
--- a/fpdfsdk/javascript/cjs_context.cpp
+++ b/fpdfsdk/javascript/cjs_context.cpp
@@ -33,7 +33,7 @@
   v8::Context::Scope context_scope(context);
 
   if (m_bBusy) {
-    *info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
+    *info = JSGetStringFromID(IDS_STRING_JSBUSY);
     return FALSE;
   }
   m_bBusy = TRUE;
@@ -42,7 +42,7 @@
   CJS_Runtime::FieldEvent event(m_pEventHandler->TargetName(),
                                 m_pEventHandler->EventType());
   if (!m_pRuntime->AddEventToSet(event)) {
-    *info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
+    *info = JSGetStringFromID(IDS_STRING_JSEVENT);
     return FALSE;
   }
 
@@ -55,7 +55,7 @@
   if (nRet < 0) {
     *info += sErrorMessage;
   } else {
-    *info = JSGetStringFromID(this, IDS_STRING_RUN);
+    *info = JSGetStringFromID(IDS_STRING_RUN);
   }
 
   m_pRuntime->RemoveEventFromSet(event);
diff --git a/fpdfsdk/javascript/global.cpp b/fpdfsdk/javascript/global.cpp
index 27c156e..c0330f3 100644
--- a/fpdfsdk/javascript/global.cpp
+++ b/fpdfsdk/javascript/global.cpp
@@ -161,13 +161,12 @@
                                          const std::vector<CJS_Value>& params,
                                          CJS_Value& vRet,
                                          CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   if (params.size() != 2) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   auto it = m_mapGlobal.find(params[0].ToCFXByteString(pRuntime));
   if (it != m_mapGlobal.end()) {
     JSGlobalData* pData = it->second;
@@ -177,7 +176,7 @@
     }
   }
 
-  sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL);
+  sError = JSGetStringFromID(IDS_STRING_JSNOGLOBAL);
   return FALSE;
 }
 
diff --git a/fpdfsdk/javascript/resource.cpp b/fpdfsdk/javascript/resource.cpp
index 88721ef..c4edeae 100644
--- a/fpdfsdk/javascript/resource.cpp
+++ b/fpdfsdk/javascript/resource.cpp
@@ -6,7 +6,7 @@
 
 #include "fpdfsdk/javascript/resource.h"
 
-CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT id) {
+CFX_WideString JSGetStringFromID(FX_UINT id) {
   switch (id) {
     case IDS_STRING_JSALERT:
       return L"Alert";
@@ -25,7 +25,7 @@
       return L"The input value must be greater than or equal to %s.";
     case IDS_STRING_JSRANGE3:
       return L"The input value must be less than or equal to %s.";
-    case IDS_STRING_NOTSUPPORT:
+    case IDS_STRING_JSNOTSUPPORT:
       return L"Operation not supported.";
     case IDS_STRING_JSBUSY:
       return L"System is busy.";
@@ -45,6 +45,10 @@
       return L"Incorrect parameter type.";
     case IDS_STRING_JSVALUEERROR:
       return L"Incorrect parameter value.";
+    case IDS_STRING_JSNOPERMISSION:
+      return L"Permission denied.";
+    case IDS_STRING_JSBADOBJECT:
+      return L"Object no longer exists.";
     default:
       return L"";
   }
diff --git a/fpdfsdk/javascript/resource.h b/fpdfsdk/javascript/resource.h
index a6bfaed..d775e94 100644
--- a/fpdfsdk/javascript/resource.h
+++ b/fpdfsdk/javascript/resource.h
@@ -20,7 +20,7 @@
 #define IDS_STRING_JSRANGE1 25619
 #define IDS_STRING_JSRANGE2 25620
 #define IDS_STRING_JSRANGE3 25621
-#define IDS_STRING_NOTSUPPORT 25627
+#define IDS_STRING_JSNOTSUPPORT 25627
 #define IDS_STRING_JSBUSY 25628
 #define IDS_STRING_JSEVENT 25629
 #define IDS_STRING_RUN 25630
@@ -30,8 +30,10 @@
 #define IDS_STRING_JSREADONLY 25636
 #define IDS_STRING_JSTYPEERROR 25637
 #define IDS_STRING_JSVALUEERROR 25638
+#define IDS_STRING_JSNOPERMISSION 25639
+#define IDS_STRING_JSBADOBJECT 25640
 
-CFX_WideString JSGetStringFromID(CJS_Context* pContext, FX_UINT id);
+CFX_WideString JSGetStringFromID(FX_UINT id);
 CFX_WideString JSFormatErrorString(const char* class_name,
                                    const char* property_name,
                                    const CFX_WideString& details);
diff --git a/fpdfsdk/javascript/util.cpp b/fpdfsdk/javascript/util.cpp
index fa53a9e..44511f5 100644
--- a/fpdfsdk/javascript/util.cpp
+++ b/fpdfsdk/javascript/util.cpp
@@ -190,12 +190,12 @@
   CJS_Value p2 = params[1];
   CJS_Date jsDate;
   if (!p2.ConvertToDate(pRuntime, jsDate)) {
-    sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT1);
+    sError = JSGetStringFromID(IDS_STRING_JSPRINT1);
     return FALSE;
   }
 
   if (!jsDate.IsValidDate(pRuntime)) {
-    sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPRINT2);
+    sError = JSGetStringFromID(IDS_STRING_JSPRINT2);
     return FALSE;
   }
 
@@ -223,7 +223,7 @@
                         jsDate.GetSeconds(pRuntime));
         break;
       default:
-        sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSVALUEERROR);
+        sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
         return FALSE;
     }
 
@@ -233,7 +233,7 @@
 
   if (p1.GetType() == CJS_Value::VT_string) {
     if (iSize > 2 && params[2].ToBool(pRuntime)) {
-      sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_NOTSUPPORT);
+      sError = JSGetStringFromID(IDS_STRING_JSNOTSUPPORT);
       return FALSE;  // currently, it doesn't support XFAPicture.
     }
 
@@ -303,7 +303,7 @@
     return TRUE;
   }
 
-  sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSTYPEERROR);
+  sError = JSGetStringFromID(IDS_STRING_JSTYPEERROR);
   return FALSE;
 }
 
@@ -312,13 +312,12 @@
                      const std::vector<CJS_Value>& params,
                      CJS_Value& vRet,
                      CFX_WideString& sError) {
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
-
   if (params.size() < 2) {
-    sError = JSGetStringFromID((CJS_Context*)cc, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   vRet = CJS_Value(pRuntime, printx(params[0].ToCFXWideString(pRuntime),
                                     params[1].ToCFXWideString(pRuntime))
                                  .c_str());
@@ -456,17 +455,15 @@
                          const std::vector<CJS_Value>& params,
                          CJS_Value& vRet,
                          CFX_WideString& sError) {
-  CJS_Context* pContext = static_cast<CJS_Context*>(cc);
-  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
-
   if (params.size() < 1) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSPARAMERROR);
     return FALSE;
   }
 
+  CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc);
   int arg = params[0].ToInt(pRuntime);
   if (arg < 0 || arg > 255) {
-    sError = JSGetStringFromID(pContext, IDS_STRING_JSVALUEERROR);
+    sError = JSGetStringFromID(IDS_STRING_JSVALUEERROR);
     return FALSE;
   }