diff --git a/fpdfsdk/include/javascript/IJavaScript.h b/fpdfsdk/include/javascript/IJavaScript.h
index 5692240..18ab34b 100644
--- a/fpdfsdk/include/javascript/IJavaScript.h
+++ b/fpdfsdk/include/javascript/IJavaScript.h
@@ -17,8 +17,6 @@
 
 class IFXJS_Context {
  public:
-  virtual FX_BOOL Compile(const CFX_WideString& script,
-                          CFX_WideString& info) = 0;
   virtual FX_BOOL RunScript(const CFX_WideString& script,
                             CFX_WideString& info) = 0;
 
diff --git a/fpdfsdk/include/javascript/JS_Context.h b/fpdfsdk/include/javascript/JS_Context.h
index 995d322..d5b1064 100644
--- a/fpdfsdk/include/javascript/JS_Context.h
+++ b/fpdfsdk/include/javascript/JS_Context.h
@@ -16,11 +16,10 @@
 
 class CJS_Context : public IFXJS_Context {
  public:
-  CJS_Context(CJS_Runtime* pRuntime);
+  explicit CJS_Context(CJS_Runtime* pRuntime);
   ~CJS_Context() override;
 
   // IFXJS_Context
-  FX_BOOL Compile(const CFX_WideString& script, CFX_WideString& info) override;
   FX_BOOL RunScript(const CFX_WideString& script,
                     CFX_WideString& info) override;
   void OnApp_Init() override;
@@ -124,11 +123,8 @@
   FX_BOOL IsMsgBoxEnabled() const { return m_bMsgBoxEnable; }
 
   CPDFDoc_Environment* GetReaderApp();
-  CJS_Runtime* GetJSRuntime() { return m_pRuntime; }
-
-  FX_BOOL DoJob(int nMode, const CFX_WideString& script, CFX_WideString& info);
-
-  CJS_EventHandler* GetEventHandler() { return m_pEventHandler; }
+  CJS_Runtime* GetJSRuntime() const { return m_pRuntime; }
+  CJS_EventHandler* GetEventHandler() const { return m_pEventHandler; }
   CPDFSDK_Document* GetReaderDocument();
 
  private:
diff --git a/fpdfsdk/include/jsapi/fxjs_v8.h b/fpdfsdk/include/jsapi/fxjs_v8.h
index 72f2a5d..f9d8f50 100644
--- a/fpdfsdk/include/jsapi/fxjs_v8.h
+++ b/fpdfsdk/include/jsapi/fxjs_v8.h
@@ -91,11 +91,6 @@
                        v8::Global<v8::Context>& v8PersistentContext);
 void JS_Initial(unsigned int embedderDataSlot);
 void JS_Release();
-int JS_Parse(IJS_Runtime* pJSRuntime,
-             IFXJS_Context* pJSContext,
-             const wchar_t* script,
-             long length,
-             FXJSErr* perror);
 int JS_Execute(IJS_Runtime* pJSRuntime,
                IFXJS_Context* pJSContext,
                const wchar_t* script,
diff --git a/fpdfsdk/src/javascript/JS_Context.cpp b/fpdfsdk/src/javascript/JS_Context.cpp
index 3fedd13..1e42b50 100644
--- a/fpdfsdk/src/javascript/JS_Context.cpp
+++ b/fpdfsdk/src/javascript/JS_Context.cpp
@@ -4,12 +4,11 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "../../include/javascript/JavaScript.h"
 #include "../../include/javascript/IJavaScript.h"
-//#include "../../include/javascript/JS_ResMgr.h"
 #include "../../include/javascript/JS_Context.h"
 #include "../../include/javascript/JS_EventHandler.h"
 #include "../../include/javascript/JS_Runtime.h"
+#include "../../include/javascript/JavaScript.h"
 #include "../../include/javascript/resource.h"
 
 /* -------------------------- CJS_Context -------------------------- */
@@ -24,8 +23,6 @@
 }
 
 CPDFSDK_Document* CJS_Context::GetReaderDocument() {
-  ASSERT(m_pRuntime != NULL);
-
   return m_pRuntime->GetReaderDocument();
 }
 
@@ -35,20 +32,20 @@
   return m_pRuntime->GetReaderApp();
 }
 
-FX_BOOL CJS_Context::DoJob(int nMode,
-                           const CFX_WideString& script,
-                           CFX_WideString& info) {
+FX_BOOL CJS_Context::RunScript(const CFX_WideString& script,
+                               CFX_WideString& info) {
+  v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
+  v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
+  v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
+  v8::Context::Scope context_scope(context);
+
   if (m_bBusy) {
     info = JSGetStringFromID(this, IDS_STRING_JSBUSY);
     return FALSE;
   }
-
   m_bBusy = TRUE;
 
-  ASSERT(m_pRuntime != NULL);
-  ASSERT(m_pEventHandler != NULL);
   ASSERT(m_pEventHandler->IsValid());
-
   if (!m_pRuntime->AddEventToLoop(m_pEventHandler->TargetName(),
                                   m_pEventHandler->EventType())) {
     info = JSGetStringFromID(this, IDS_STRING_JSEVENT);
@@ -57,27 +54,15 @@
 
   FXJSErr error = {NULL, NULL, 0};
   int nRet = 0;
-
   if (script.GetLength() > 0) {
-    if (nMode == 0) {
-      nRet = JS_Execute(*m_pRuntime, this, script.c_str(), script.GetLength(),
-                        &error);
-    } else {
-      nRet = JS_Parse(*m_pRuntime, this, script.c_str(), script.GetLength(),
+    nRet = JS_Execute(*m_pRuntime, this, script.c_str(), script.GetLength(),
                       &error);
-    }
   }
 
   if (nRet < 0) {
     CFX_WideString sLine;
     sLine.Format(L"[ Line: %05d { %s } ] : %s", error.linnum - 1, error.srcline,
                  error.message);
-
-    //			TRACE(L"/* -------------- JS Error --------------
-    //*/\n");
-    //			TRACE(sLine);
-    //			TRACE(L"\n");
-    // CFX_ByteString sTemp = CFX_ByteString::FromUnicode(error.message);
     info += sLine;
   } else {
     info = JSGetStringFromID(this, IDS_STRING_RUN);
@@ -92,107 +77,72 @@
   return nRet >= 0;
 }
 
-FX_BOOL CJS_Context::RunScript(const CFX_WideString& script,
-                               CFX_WideString& info) {
-  v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
-  v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
-  v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
-  v8::Context::Scope context_scope(context);
-
-  return DoJob(0, script, info);
-}
-
-FX_BOOL CJS_Context::Compile(const CFX_WideString& script,
-                             CFX_WideString& info) {
-  v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
-  v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
-  v8::Local<v8::Context> context = m_pRuntime->NewJSContext();
-  v8::Context::Scope context_scope(context);
-
-  return DoJob(1, script, info);
-}
-
 void CJS_Context::OnApp_Init() {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnApp_Init();
 }
 
 void CJS_Context::OnDoc_Open(CPDFSDK_Document* pDoc,
                              const CFX_WideString& strTargetName) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnDoc_Open(pDoc, strTargetName);
 }
 
 void CJS_Context::OnDoc_WillPrint(CPDFSDK_Document* pDoc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnDoc_WillPrint(pDoc);
 }
 
 void CJS_Context::OnDoc_DidPrint(CPDFSDK_Document* pDoc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnDoc_DidPrint(pDoc);
 }
 
 void CJS_Context::OnDoc_WillSave(CPDFSDK_Document* pDoc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnDoc_WillSave(pDoc);
 }
 
 void CJS_Context::OnDoc_DidSave(CPDFSDK_Document* pDoc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnDoc_DidSave(pDoc);
 }
 
 void CJS_Context::OnDoc_WillClose(CPDFSDK_Document* pDoc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnDoc_WillClose(pDoc);
 }
 
 void CJS_Context::OnPage_Open(CPDFSDK_Document* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnPage_Open(pTarget);
 }
 
 void CJS_Context::OnPage_Close(CPDFSDK_Document* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnPage_Close(pTarget);
 }
 
 void CJS_Context::OnPage_InView(CPDFSDK_Document* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnPage_InView(pTarget);
 }
 
 void CJS_Context::OnPage_OutView(CPDFSDK_Document* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnPage_OutView(pTarget);
 }
 
 void CJS_Context::OnField_MouseDown(FX_BOOL bModifier,
                                     FX_BOOL bShift,
                                     CPDF_FormField* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_MouseDown(bModifier, bShift, pTarget);
 }
 
 void CJS_Context::OnField_MouseEnter(FX_BOOL bModifier,
                                      FX_BOOL bShift,
                                      CPDF_FormField* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_MouseEnter(bModifier, bShift, pTarget);
 }
 
 void CJS_Context::OnField_MouseExit(FX_BOOL bModifier,
                                     FX_BOOL bShift,
                                     CPDF_FormField* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_MouseExit(bModifier, bShift, pTarget);
 }
 
 void CJS_Context::OnField_MouseUp(FX_BOOL bModifier,
                                   FX_BOOL bShift,
                                   CPDF_FormField* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_MouseUp(bModifier, bShift, pTarget);
 }
 
@@ -200,7 +150,6 @@
                                 FX_BOOL bShift,
                                 CPDF_FormField* pTarget,
                                 const CFX_WideString& Value) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_Focus(bModifier, bShift, pTarget, Value);
 }
 
@@ -208,7 +157,6 @@
                                FX_BOOL bShift,
                                CPDF_FormField* pTarget,
                                const CFX_WideString& Value) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_Blur(bModifier, bShift, pTarget, Value);
 }
 
@@ -216,7 +164,6 @@
                                     CPDF_FormField* pTarget,
                                     CFX_WideString& Value,
                                     FX_BOOL& bRc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_Calculate(pSource, pTarget, Value, bRc);
 }
 
@@ -251,7 +198,6 @@
                                    CPDF_FormField* pTarget,
                                    CFX_WideString& Value,
                                    FX_BOOL& bRc) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnField_Validate(strChange, strChangeEx, bKeyDown, bModifier,
                                     bShift, pTarget, Value, bRc);
 }
@@ -259,100 +205,84 @@
 void CJS_Context::OnScreen_Focus(FX_BOOL bModifier,
                                  FX_BOOL bShift,
                                  CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_Focus(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_Blur(FX_BOOL bModifier,
                                 FX_BOOL bShift,
                                 CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_Blur(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_Open(FX_BOOL bModifier,
                                 FX_BOOL bShift,
                                 CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_Open(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_Close(FX_BOOL bModifier,
                                  FX_BOOL bShift,
                                  CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_Close(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_MouseDown(FX_BOOL bModifier,
                                      FX_BOOL bShift,
                                      CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_MouseDown(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_MouseUp(FX_BOOL bModifier,
                                    FX_BOOL bShift,
                                    CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_MouseUp(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_MouseEnter(FX_BOOL bModifier,
                                       FX_BOOL bShift,
                                       CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_MouseEnter(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_MouseExit(FX_BOOL bModifier,
                                      FX_BOOL bShift,
                                      CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_MouseExit(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_InView(FX_BOOL bModifier,
                                   FX_BOOL bShift,
                                   CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_InView(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnScreen_OutView(FX_BOOL bModifier,
                                    FX_BOOL bShift,
                                    CPDFSDK_Annot* pScreen) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnScreen_OutView(bModifier, bShift, pScreen);
 }
 
 void CJS_Context::OnBookmark_MouseUp(CPDF_Bookmark* pBookMark) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnBookmark_MouseUp(pBookMark);
 }
 
 void CJS_Context::OnLink_MouseUp(CPDFSDK_Document* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnLink_MouseUp(pTarget);
 }
 
 void CJS_Context::OnConsole_Exec() {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnConsole_Exec();
 }
 
 void CJS_Context::OnExternal_Exec() {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnExternal_Exec();
 }
 
 void CJS_Context::OnBatchExec(CPDFSDK_Document* pTarget) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnBatchExec(pTarget);
 }
 
 void CJS_Context::OnMenu_Exec(CPDFSDK_Document* pTarget,
                               const CFX_WideString& strTargetName) {
-  ASSERT(m_pEventHandler != NULL);
   m_pEventHandler->OnMenu_Exec(pTarget, strTargetName);
 }
diff --git a/fpdfsdk/src/jsapi/fxjs_v8.cpp b/fpdfsdk/src/jsapi/fxjs_v8.cpp
index b71cee6..f2f2e55 100644
--- a/fpdfsdk/src/jsapi/fxjs_v8.cpp
+++ b/fpdfsdk/src/jsapi/fxjs_v8.cpp
@@ -368,31 +368,8 @@
 void JS_Initial(unsigned int embedderDataSlot) {
   g_embedderDataSlot = embedderDataSlot;
 }
-void JS_Release() {}
-int JS_Parse(IJS_Runtime* pJSRuntime,
-             IFXJS_Context* pJSContext,
-             const wchar_t* script,
-             long length,
-             FXJSErr* perror) {
-  v8::Isolate* isolate = (v8::Isolate*)pJSRuntime;
-  v8::Isolate::Scope isolate_scope(isolate);
-  v8::TryCatch try_catch(isolate);
 
-  CFX_WideString wsScript(script);
-  CFX_ByteString bsScript = wsScript.UTF8Encode();
-
-  v8::Local<v8::Context> context = isolate->GetCurrentContext();
-  v8::Local<v8::Script> compiled_script;
-  if (!v8::Script::Compile(context,
-                           v8::String::NewFromUtf8(isolate, bsScript.c_str(),
-                                                   v8::NewStringType::kNormal,
-                                                   bsScript.GetLength())
-                               .ToLocalChecked())
-           .ToLocal(&compiled_script)) {
-    v8::String::Utf8Value error(try_catch.Exception());
-    return -1;
-  }
-  return 0;
+void JS_Release() {
 }
 
 int JS_Execute(IJS_Runtime* pJSRuntime,
