diff --git a/fpdfsdk/BUILD.gn b/fpdfsdk/BUILD.gn
index 67eb7fa..1f75bef 100644
--- a/fpdfsdk/BUILD.gn
+++ b/fpdfsdk/BUILD.gn
@@ -7,8 +7,6 @@
 
 source_set("fpdfsdk") {
   sources = [
-    "cpdfsdk_actionhandler.cpp",
-    "cpdfsdk_actionhandler.h",
     "cpdfsdk_annot.cpp",
     "cpdfsdk_annot.h",
     "cpdfsdk_annotiteration.cpp",
diff --git a/fpdfsdk/cpdfsdk_actionhandler.cpp b/fpdfsdk/cpdfsdk_actionhandler.cpp
deleted file mode 100644
index 3ed76ff..0000000
--- a/fpdfsdk/cpdfsdk_actionhandler.cpp
+++ /dev/null
@@ -1,457 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#include "fpdfsdk/cpdfsdk_actionhandler.h"
-
-#include <set>
-#include <vector>
-
-#include "core/fpdfapi/parser/cpdf_array.h"
-#include "core/fpdfdoc/cpdf_formfield.h"
-#include "core/fpdfdoc/cpdf_interactiveform.h"
-#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
-#include "fpdfsdk/cpdfsdk_interactiveform.h"
-#include "fxjs/ijs_event_context.h"
-#include "fxjs/ijs_runtime.h"
-#include "third_party/base/check.h"
-#include "third_party/base/containers/contains.h"
-#include "third_party/base/notreached.h"
-
-bool CPDFSDK_ActionHandler::DoAction_DocOpen(
-    const CPDF_Action& action,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  std::set<const CPDF_Dictionary*> visited;
-  return ExecuteDocumentOpenAction(action, pFormFillEnv, &visited);
-}
-
-bool CPDFSDK_ActionHandler::DoAction_JavaScript(
-    const CPDF_Action& JsAction,
-    WideString csJSName,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  if (JsAction.GetType() == CPDF_Action::Type::kJavaScript) {
-    WideString swJS = JsAction.GetJavaScript();
-    if (!swJS.IsEmpty()) {
-      RunDocumentOpenJavaScript(pFormFillEnv, csJSName, swJS);
-      return true;
-    }
-  }
-
-  return false;
-}
-
-bool CPDFSDK_ActionHandler::DoAction_FieldJavaScript(
-    const CPDF_Action& JsAction,
-    CPDF_AAction::AActionType type,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    CPDF_FormField* pFormField,
-    CFFL_FieldAction* data) {
-  DCHECK(pFormFillEnv);
-  if (pFormFillEnv->IsJSPlatformPresent() &&
-      JsAction.GetType() == CPDF_Action::Type::kJavaScript) {
-    WideString swJS = JsAction.GetJavaScript();
-    if (!swJS.IsEmpty()) {
-      RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
-      return true;
-    }
-  }
-  return false;
-}
-
-bool CPDFSDK_ActionHandler::DoAction_Link(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType type,
-    CPDFSDK_FormFillEnvironment* form_fill_env,
-    Mask<FWL_EVENTFLAG> modifiers) {
-  DCHECK(form_fill_env);
-
-  if (!CPDF_AAction::IsUserInput(type))
-    return false;
-
-  switch (action.GetType()) {
-    case CPDF_Action::Type::kGoTo:
-      DoAction_GoTo(form_fill_env, action);
-      return true;
-    case CPDF_Action::Type::kURI:
-      DoAction_URI(form_fill_env, action, modifiers);
-      return true;
-    default:
-      return false;
-  }
-}
-
-bool CPDFSDK_ActionHandler::DoAction_Destination(
-    const CPDF_Dest& dest,
-    CPDFSDK_FormFillEnvironment* form_fill_env) {
-  DCHECK(form_fill_env);
-  CPDF_Document* document = form_fill_env->GetPDFDocument();
-  DCHECK(document);
-
-  const CPDF_Array* dest_array = dest.GetArray();
-  std::vector<float> dest_positions;
-  // |dest_array| index 0 contains destination page details and index 1 contains
-  // parameter that explains about the rest of |dest_array|.
-  if (dest_array) {
-    for (size_t i = 2; i < dest_array->size(); i++)
-      dest_positions.push_back(dest_array->GetNumberAt(i));
-  }
-
-  form_fill_env->DoGoToAction(dest.GetDestPageIndex(document),
-                              dest.GetZoomMode(), dest_positions);
-  return true;
-}
-
-bool CPDFSDK_ActionHandler::DoAction_Page(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType eType,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  std::set<const CPDF_Dictionary*> visited;
-  return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
-}
-
-bool CPDFSDK_ActionHandler::DoAction_Document(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType eType,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  std::set<const CPDF_Dictionary*> visited;
-  return ExecuteDocumentPageAction(action, eType, pFormFillEnv, &visited);
-}
-
-bool CPDFSDK_ActionHandler::DoAction_Field(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType type,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    CPDF_FormField* pFormField,
-    CFFL_FieldAction* data) {
-  std::set<const CPDF_Dictionary*> visited;
-  return ExecuteFieldAction(action, type, pFormFillEnv, pFormField, data,
-                            &visited);
-}
-
-bool CPDFSDK_ActionHandler::ExecuteDocumentOpenAction(
-    const CPDF_Action& action,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    std::set<const CPDF_Dictionary*>* visited) {
-  const CPDF_Dictionary* pDict = action.GetDict();
-  if (pdfium::Contains(*visited, pDict))
-    return false;
-
-  visited->insert(pDict);
-
-  DCHECK(pFormFillEnv);
-  if (action.GetType() == CPDF_Action::Type::kJavaScript) {
-    if (pFormFillEnv->IsJSPlatformPresent()) {
-      WideString swJS = action.GetJavaScript();
-      if (!swJS.IsEmpty())
-        RunDocumentOpenJavaScript(pFormFillEnv, WideString(), swJS);
-    }
-  } else {
-    DoAction_NoJs(action, CPDF_AAction::AActionType::kDocumentOpen,
-                  pFormFillEnv);
-  }
-
-  for (size_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
-    CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteDocumentOpenAction(subaction, pFormFillEnv, visited))
-      return false;
-  }
-
-  return true;
-}
-
-bool CPDFSDK_ActionHandler::ExecuteDocumentPageAction(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType type,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    std::set<const CPDF_Dictionary*>* visited) {
-  const CPDF_Dictionary* pDict = action.GetDict();
-  if (pdfium::Contains(*visited, pDict))
-    return false;
-
-  visited->insert(pDict);
-
-  DCHECK(pFormFillEnv);
-  if (action.GetType() == CPDF_Action::Type::kJavaScript) {
-    if (pFormFillEnv->IsJSPlatformPresent()) {
-      WideString swJS = action.GetJavaScript();
-      if (!swJS.IsEmpty())
-        RunDocumentPageJavaScript(pFormFillEnv, type, swJS);
-    }
-  } else {
-    DoAction_NoJs(action, type, pFormFillEnv);
-  }
-
-  DCHECK(pFormFillEnv);
-
-  for (size_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
-    CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteDocumentPageAction(subaction, type, pFormFillEnv, visited))
-      return false;
-  }
-
-  return true;
-}
-
-bool CPDFSDK_ActionHandler::IsValidField(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    CPDF_Dictionary* pFieldDict) {
-  DCHECK(pFieldDict);
-
-  CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
-  CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
-  return !!pPDFForm->GetFieldByDict(pFieldDict);
-}
-
-bool CPDFSDK_ActionHandler::ExecuteFieldAction(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType type,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    CPDF_FormField* pFormField,
-    CFFL_FieldAction* data,
-    std::set<const CPDF_Dictionary*>* visited) {
-  const CPDF_Dictionary* pDict = action.GetDict();
-  if (pdfium::Contains(*visited, pDict))
-    return false;
-
-  visited->insert(pDict);
-
-  DCHECK(pFormFillEnv);
-  if (action.GetType() == CPDF_Action::Type::kJavaScript) {
-    if (pFormFillEnv->IsJSPlatformPresent()) {
-      WideString swJS = action.GetJavaScript();
-      if (!swJS.IsEmpty()) {
-        RunFieldJavaScript(pFormFillEnv, pFormField, type, data, swJS);
-        if (!IsValidField(pFormFillEnv, pFormField->GetFieldDict()))
-          return false;
-      }
-    }
-  } else {
-    DoAction_NoJs(action, type, pFormFillEnv);
-  }
-
-  for (size_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
-    CPDF_Action subaction = action.GetSubAction(i);
-    if (!ExecuteFieldAction(subaction, type, pFormFillEnv, pFormField, data,
-                            visited))
-      return false;
-  }
-
-  return true;
-}
-
-void CPDFSDK_ActionHandler::DoAction_NoJs(
-    const CPDF_Action& action,
-    CPDF_AAction::AActionType type,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  DCHECK(pFormFillEnv);
-
-  switch (action.GetType()) {
-    case CPDF_Action::Type::kGoTo:
-      DoAction_GoTo(pFormFillEnv, action);
-      break;
-    case CPDF_Action::Type::kURI:
-      if (CPDF_AAction::IsUserInput(type))
-        DoAction_URI(pFormFillEnv, action, Mask<FWL_EVENTFLAG>{});
-      break;
-    case CPDF_Action::Type::kHide:
-      DoAction_Hide(action, pFormFillEnv);
-      break;
-    case CPDF_Action::Type::kNamed:
-      DoAction_Named(pFormFillEnv, action);
-      break;
-    case CPDF_Action::Type::kSubmitForm:
-      if (CPDF_AAction::IsUserInput(type))
-        DoAction_SubmitForm(action, pFormFillEnv);
-      break;
-    case CPDF_Action::Type::kResetForm:
-      DoAction_ResetForm(action, pFormFillEnv);
-      break;
-    case CPDF_Action::Type::kJavaScript:
-      NOTREACHED();
-      break;
-    case CPDF_Action::Type::kSetOCGState:
-    case CPDF_Action::Type::kThread:
-    case CPDF_Action::Type::kSound:
-    case CPDF_Action::Type::kMovie:
-    case CPDF_Action::Type::kRendition:
-    case CPDF_Action::Type::kTrans:
-    case CPDF_Action::Type::kGoTo3DView:
-    case CPDF_Action::Type::kGoToR:
-    case CPDF_Action::Type::kGoToE:
-    case CPDF_Action::Type::kLaunch:
-    case CPDF_Action::Type::kImportData:
-      // Unimplemented
-      break;
-    default:
-      break;
-  }
-}
-
-void CPDFSDK_ActionHandler::DoAction_GoTo(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const CPDF_Action& action) {
-  DCHECK(action.GetDict());
-
-  CPDF_Document* pPDFDocument = pFormFillEnv->GetPDFDocument();
-  DCHECK(pPDFDocument);
-
-  CPDF_Dest MyDest = action.GetDest(pPDFDocument);
-  DoAction_Destination(MyDest, pFormFillEnv);
-}
-
-void CPDFSDK_ActionHandler::DoAction_URI(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const CPDF_Action& action,
-    Mask<FWL_EVENTFLAG> modifiers) {
-  DCHECK(action.GetDict());
-  pFormFillEnv->DoURIAction(action.GetURI(pFormFillEnv->GetPDFDocument()),
-                            modifiers);
-}
-
-void CPDFSDK_ActionHandler::DoAction_Named(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const CPDF_Action& action) {
-  DCHECK(action.GetDict());
-  pFormFillEnv->ExecuteNamedAction(action.GetNamedAction());
-}
-
-void CPDFSDK_ActionHandler::RunFieldJavaScript(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    CPDF_FormField* pFormField,
-    CPDF_AAction::AActionType type,
-    CFFL_FieldAction* data,
-    const WideString& script) {
-  DCHECK(type != CPDF_AAction::kCalculate);
-  DCHECK(type != CPDF_AAction::kFormat);
-
-  RunScript(pFormFillEnv, script,
-            [type, data, pFormField](IJS_EventContext* context) {
-              switch (type) {
-                case CPDF_AAction::kCursorEnter:
-                  context->OnField_MouseEnter(data->bModifier, data->bShift,
-                                              pFormField);
-                  break;
-                case CPDF_AAction::kCursorExit:
-                  context->OnField_MouseExit(data->bModifier, data->bShift,
-                                             pFormField);
-                  break;
-                case CPDF_AAction::kButtonDown:
-                  context->OnField_MouseDown(data->bModifier, data->bShift,
-                                             pFormField);
-                  break;
-                case CPDF_AAction::kButtonUp:
-                  context->OnField_MouseUp(data->bModifier, data->bShift,
-                                           pFormField);
-                  break;
-                case CPDF_AAction::kGetFocus:
-                  context->OnField_Focus(data->bModifier, data->bShift,
-                                         pFormField, &data->sValue);
-                  break;
-                case CPDF_AAction::kLoseFocus:
-                  context->OnField_Blur(data->bModifier, data->bShift,
-                                        pFormField, &data->sValue);
-                  break;
-                case CPDF_AAction::kKeyStroke:
-                  context->OnField_Keystroke(
-                      &data->sChange, data->sChangeEx, data->bKeyDown,
-                      data->bModifier, &data->nSelEnd, &data->nSelStart,
-                      data->bShift, pFormField, &data->sValue,
-                      data->bWillCommit, data->bFieldFull, &data->bRC);
-                  break;
-                case CPDF_AAction::kValidate:
-                  context->OnField_Validate(&data->sChange, data->sChangeEx,
-                                            data->bKeyDown, data->bModifier,
-                                            data->bShift, pFormField,
-                                            &data->sValue, &data->bRC);
-                  break;
-                default:
-                  NOTREACHED();
-                  break;
-              }
-            });
-}
-
-void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const WideString& sScriptName,
-    const WideString& script) {
-  RunScript(pFormFillEnv, script, [sScriptName](IJS_EventContext* context) {
-    context->OnDoc_Open(sScriptName);
-  });
-}
-
-void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    CPDF_AAction::AActionType type,
-    const WideString& script) {
-  RunScript(pFormFillEnv, script, [type](IJS_EventContext* context) {
-    switch (type) {
-      case CPDF_AAction::kOpenPage:
-        context->OnPage_Open();
-        break;
-      case CPDF_AAction::kClosePage:
-        context->OnPage_Close();
-        break;
-      case CPDF_AAction::kCloseDocument:
-        context->OnDoc_WillClose();
-        break;
-      case CPDF_AAction::kSaveDocument:
-        context->OnDoc_WillSave();
-        break;
-      case CPDF_AAction::kDocumentSaved:
-        context->OnDoc_DidSave();
-        break;
-      case CPDF_AAction::kPrintDocument:
-        context->OnDoc_WillPrint();
-        break;
-      case CPDF_AAction::kDocumentPrinted:
-        context->OnDoc_DidPrint();
-        break;
-      case CPDF_AAction::kPageVisible:
-        context->OnPage_InView();
-        break;
-      case CPDF_AAction::kPageInvisible:
-        context->OnPage_OutView();
-        break;
-      default:
-        NOTREACHED();
-        break;
-    }
-  });
-}
-
-bool CPDFSDK_ActionHandler::DoAction_Hide(
-    const CPDF_Action& action,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
-  if (pForm->DoAction_Hide(action)) {
-    pFormFillEnv->SetChangeMark();
-    return true;
-  }
-  return false;
-}
-
-bool CPDFSDK_ActionHandler::DoAction_SubmitForm(
-    const CPDF_Action& action,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
-  return pForm->DoAction_SubmitForm(action);
-}
-
-void CPDFSDK_ActionHandler::DoAction_ResetForm(
-    const CPDF_Action& action,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  CPDFSDK_InteractiveForm* pForm = pFormFillEnv->GetInteractiveForm();
-  pForm->DoAction_ResetForm(action);
-}
-
-void CPDFSDK_ActionHandler::RunScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                      const WideString& script,
-                                      const RunScriptCallback& cb) {
-  IJS_Runtime::ScopedEventContext pContext(pFormFillEnv->GetIJSRuntime());
-  cb(pContext.Get());
-  pContext->RunScript(script);
-  // TODO(dsinclair): Return error if RunScript returns a IJS_Runtime::JS_Error.
-}
diff --git a/fpdfsdk/cpdfsdk_actionhandler.h b/fpdfsdk/cpdfsdk_actionhandler.h
deleted file mode 100644
index 2482104..0000000
--- a/fpdfsdk/cpdfsdk_actionhandler.h
+++ /dev/null
@@ -1,112 +0,0 @@
-// Copyright 2014 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef FPDFSDK_CPDFSDK_ACTIONHANDLER_H_
-#define FPDFSDK_CPDFSDK_ACTIONHANDLER_H_
-
-#include <set>
-#include <utility>
-
-#include "core/fpdfdoc/cpdf_aaction.h"
-#include "core/fpdfdoc/cpdf_action.h"
-#include "core/fxcrt/mask.h"
-#include "core/fxcrt/widestring.h"
-#include "fpdfsdk/formfiller/cffl_fieldaction.h"
-#include "public/fpdf_fwlevent.h"
-
-class CPDFSDK_FormFillEnvironment;
-class CPDF_Dictionary;
-class CPDF_FormField;
-class IJS_EventContext;
-
-class CPDFSDK_ActionHandler {
- public:
-  bool DoAction_DocOpen(const CPDF_Action& action,
-                        CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  bool DoAction_JavaScript(const CPDF_Action& JsAction,
-                           WideString csJSName,
-                           CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  bool DoAction_Page(const CPDF_Action& action,
-                     CPDF_AAction::AActionType eType,
-                     CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  bool DoAction_Document(const CPDF_Action& action,
-                         CPDF_AAction::AActionType eType,
-                         CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  bool DoAction_Field(const CPDF_Action& action,
-                      CPDF_AAction::AActionType type,
-                      CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                      CPDF_FormField* pFormField,
-                      CFFL_FieldAction* data);
-  bool DoAction_FieldJavaScript(const CPDF_Action& JsAction,
-                                CPDF_AAction::AActionType type,
-                                CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                CPDF_FormField* pFormField,
-                                CFFL_FieldAction* data);
-  bool DoAction_Link(const CPDF_Action& action,
-                     CPDF_AAction::AActionType type,
-                     CPDFSDK_FormFillEnvironment* form_fill_env,
-                     Mask<FWL_EVENTFLAG> modifiers);
-  bool DoAction_Destination(const CPDF_Dest& dest,
-                            CPDFSDK_FormFillEnvironment* form_fill_env);
-
- private:
-  using RunScriptCallback = std::function<void(IJS_EventContext* context)>;
-
-  void RunScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                 const WideString& script,
-                 const RunScriptCallback& cb);
-
-  bool ExecuteDocumentOpenAction(const CPDF_Action& action,
-                                 CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                 std::set<const CPDF_Dictionary*>* visited);
-  bool ExecuteDocumentPageAction(const CPDF_Action& action,
-                                 CPDF_AAction::AActionType type,
-                                 CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                 std::set<const CPDF_Dictionary*>* visited);
-  bool ExecuteFieldAction(const CPDF_Action& action,
-                          CPDF_AAction::AActionType type,
-                          CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                          CPDF_FormField* pFormField,
-                          CFFL_FieldAction* data,
-                          std::set<const CPDF_Dictionary*>* visited);
-
-  void DoAction_NoJs(const CPDF_Action& action,
-                     CPDF_AAction::AActionType type,
-                     CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  void RunDocumentPageJavaScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                 CPDF_AAction::AActionType type,
-                                 const WideString& script);
-  void RunDocumentOpenJavaScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                                 const WideString& sScriptName,
-                                 const WideString& script);
-  void RunFieldJavaScript(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                          CPDF_FormField* pFormField,
-                          CPDF_AAction::AActionType type,
-                          CFFL_FieldAction* data,
-                          const WideString& script);
-
-  bool IsValidField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                    CPDF_Dictionary* pFieldDict);
-
-  void DoAction_GoTo(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                     const CPDF_Action& action);
-  void DoAction_Launch(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                       const CPDF_Action& action);
-  void DoAction_URI(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                    const CPDF_Action& action,
-                    Mask<FWL_EVENTFLAG> modifiers);
-  void DoAction_Named(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                      const CPDF_Action& action);
-
-  bool DoAction_Hide(const CPDF_Action& action,
-                     CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  bool DoAction_SubmitForm(const CPDF_Action& action,
-                           CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  void DoAction_ResetForm(const CPDF_Action& action,
-                          CPDFSDK_FormFillEnvironment* pFormFillEnv);
-};
-
-#endif  // FPDFSDK_CPDFSDK_ACTIONHANDLER_H_
diff --git a/fpdfsdk/cpdfsdk_baannot.cpp b/fpdfsdk/cpdfsdk_baannot.cpp
index c94fc60..c660a08 100644
--- a/fpdfsdk/cpdfsdk_baannot.cpp
+++ b/fpdfsdk/cpdfsdk_baannot.cpp
@@ -21,7 +21,6 @@
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
 #include "core/fxge/cfx_drawutils.h"
-#include "fpdfsdk/cpdfsdk_actionhandler.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 #include "fpdfsdk/cpdfsdk_pageview.h"
 #include "third_party/base/check.h"
@@ -352,13 +351,11 @@
 
   CPDF_Action action = GetAAction(CPDF_AAction::kKeyStroke);
   CPDFSDK_FormFillEnvironment* env = m_pPageView->GetFormFillEnv();
-  CPDFSDK_ActionHandler* action_handler = env->GetActionHandler();
   if (action.GetDict()) {
-    return action_handler->DoAction_Link(action, CPDF_AAction::kKeyStroke, env,
-                                         nFlags);
+    return env->DoActionLink(action, CPDF_AAction::kKeyStroke, nFlags);
   }
 
-  return action_handler->DoAction_Destination(GetDestination(), env);
+  return env->DoActionDestination(GetDestination());
 }
 
 bool CPDFSDK_BAAnnot::OnSetFocus(Mask<FWL_EVENTFLAG> nFlags) {
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.cpp b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
index c2f980d..d707ef5 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.cpp
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.cpp
@@ -16,7 +16,6 @@
 #include "core/fpdfdoc/cpdf_nametree.h"
 #include "core/fxcrt/fx_memory_wrappers.h"
 #include "core/fxcrt/stl_util.h"
-#include "fpdfsdk/cpdfsdk_actionhandler.h"
 #include "fpdfsdk/cpdfsdk_helpers.h"
 #include "fpdfsdk/cpdfsdk_interactiveform.h"
 #include "fpdfsdk/cpdfsdk_pageview.h"
@@ -24,8 +23,11 @@
 #include "fpdfsdk/formfiller/cffl_formfield.h"
 #include "fpdfsdk/formfiller/cffl_interactiveformfiller.h"
 #include "fpdfsdk/formfiller/cffl_perwindowdata.h"
+#include "fxjs/ijs_event_context.h"
 #include "fxjs/ijs_runtime.h"
 #include "third_party/base/check.h"
+#include "third_party/base/containers/contains.h"
+#include "third_party/base/notreached.h"
 #include "third_party/base/numerics/safe_conversions.h"
 
 #ifdef PDF_ENABLE_XFA
@@ -347,12 +349,6 @@
   return m_pIJSRuntime.get();
 }
 
-CPDFSDK_ActionHandler* CPDFSDK_FormFillEnvironment::GetActionHandler() {
-  if (!m_pActionHandler)
-    m_pActionHandler = std::make_unique<CPDFSDK_ActionHandler>();
-  return m_pActionHandler.get();
-}
-
 void CPDFSDK_FormFillEnvironment::Invalidate(IPDF_Page* page,
                                              const FX_RECT& rect) {
   if (m_pInfo && m_pInfo->FFI_Invalidate) {
@@ -659,7 +655,7 @@
   for (size_t i = 0; i < count; ++i) {
     WideString name;
     CPDF_Action action(ToDictionary(name_tree->LookupValueAndName(i, &name)));
-    GetActionHandler()->DoAction_JavaScript(action, name, this);
+    DoActionJavaScript(action, name);
   }
 }
 
@@ -681,8 +677,7 @@
   if (!pDict)
     return false;
 
-  CPDF_Action action(pDict);
-  GetActionHandler()->DoAction_DocOpen(action, this);
+  DoActionDocOpen(CPDF_Action(pDict));
   return true;
 }
 
@@ -836,3 +831,383 @@
 
   m_pInfo->FFI_OnFocusChange(m_pInfo, fpdf_annot, pPageView->GetPageIndex());
 }
+
+bool CPDFSDK_FormFillEnvironment::DoActionDocOpen(const CPDF_Action& action) {
+  std::set<const CPDF_Dictionary*> visited;
+  return ExecuteDocumentOpenAction(action, &visited);
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionJavaScript(
+    const CPDF_Action& JsAction,
+    WideString csJSName) {
+  if (JsAction.GetType() == CPDF_Action::Type::kJavaScript) {
+    WideString swJS = JsAction.GetJavaScript();
+    if (!swJS.IsEmpty()) {
+      RunDocumentOpenJavaScript(csJSName, swJS);
+      return true;
+    }
+  }
+
+  return false;
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionFieldJavaScript(
+    const CPDF_Action& JsAction,
+    CPDF_AAction::AActionType type,
+    CPDF_FormField* pFormField,
+    CFFL_FieldAction* data) {
+  if (IsJSPlatformPresent() &&
+      JsAction.GetType() == CPDF_Action::Type::kJavaScript) {
+    WideString swJS = JsAction.GetJavaScript();
+    if (!swJS.IsEmpty()) {
+      RunFieldJavaScript(pFormField, type, data, swJS);
+      return true;
+    }
+  }
+  return false;
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionLink(const CPDF_Action& action,
+                                               CPDF_AAction::AActionType type,
+                                               Mask<FWL_EVENTFLAG> modifiers) {
+  if (!CPDF_AAction::IsUserInput(type))
+    return false;
+
+  switch (action.GetType()) {
+    case CPDF_Action::Type::kGoTo:
+      DoActionGoTo(action);
+      return true;
+    case CPDF_Action::Type::kURI:
+      DoActionURI(action, modifiers);
+      return true;
+    default:
+      return false;
+  }
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionDestination(const CPDF_Dest& dest) {
+  CPDF_Document* document = GetPDFDocument();
+  DCHECK(document);
+
+  const CPDF_Array* dest_array = dest.GetArray();
+  std::vector<float> dest_positions;
+  // |dest_array| index 0 contains destination page details and index 1 contains
+  // parameter that explains about the rest of |dest_array|.
+  if (dest_array) {
+    for (size_t i = 2; i < dest_array->size(); i++)
+      dest_positions.push_back(dest_array->GetNumberAt(i));
+  }
+
+  DoGoToAction(dest.GetDestPageIndex(document), dest.GetZoomMode(),
+               dest_positions);
+  return true;
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionPage(
+    const CPDF_Action& action,
+    CPDF_AAction::AActionType eType) {
+  std::set<const CPDF_Dictionary*> visited;
+  return ExecuteDocumentPageAction(action, eType, &visited);
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionDocument(
+    const CPDF_Action& action,
+    CPDF_AAction::AActionType eType) {
+  std::set<const CPDF_Dictionary*> visited;
+  return ExecuteDocumentPageAction(action, eType, &visited);
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionField(const CPDF_Action& action,
+                                                CPDF_AAction::AActionType type,
+                                                CPDF_FormField* pFormField,
+                                                CFFL_FieldAction* data) {
+  std::set<const CPDF_Dictionary*> visited;
+  return ExecuteFieldAction(action, type, pFormField, data, &visited);
+}
+
+bool CPDFSDK_FormFillEnvironment::ExecuteDocumentOpenAction(
+    const CPDF_Action& action,
+    std::set<const CPDF_Dictionary*>* visited) {
+  const CPDF_Dictionary* pDict = action.GetDict();
+  if (pdfium::Contains(*visited, pDict))
+    return false;
+
+  visited->insert(pDict);
+
+  if (action.GetType() == CPDF_Action::Type::kJavaScript) {
+    if (IsJSPlatformPresent()) {
+      WideString swJS = action.GetJavaScript();
+      if (!swJS.IsEmpty())
+        RunDocumentOpenJavaScript(WideString(), swJS);
+    }
+  } else {
+    DoActionNoJs(action, CPDF_AAction::AActionType::kDocumentOpen);
+  }
+
+  for (size_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
+    CPDF_Action subaction = action.GetSubAction(i);
+    if (!ExecuteDocumentOpenAction(subaction, visited))
+      return false;
+  }
+
+  return true;
+}
+
+bool CPDFSDK_FormFillEnvironment::ExecuteDocumentPageAction(
+    const CPDF_Action& action,
+    CPDF_AAction::AActionType type,
+    std::set<const CPDF_Dictionary*>* visited) {
+  const CPDF_Dictionary* pDict = action.GetDict();
+  if (pdfium::Contains(*visited, pDict))
+    return false;
+
+  visited->insert(pDict);
+
+  if (action.GetType() == CPDF_Action::Type::kJavaScript) {
+    if (IsJSPlatformPresent()) {
+      WideString swJS = action.GetJavaScript();
+      if (!swJS.IsEmpty())
+        RunDocumentPageJavaScript(type, swJS);
+    }
+  } else {
+    DoActionNoJs(action, type);
+  }
+
+  for (size_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
+    CPDF_Action subaction = action.GetSubAction(i);
+    if (!ExecuteDocumentPageAction(subaction, type, visited))
+      return false;
+  }
+
+  return true;
+}
+
+bool CPDFSDK_FormFillEnvironment::IsValidField(CPDF_Dictionary* pFieldDict) {
+  DCHECK(pFieldDict);
+
+  CPDFSDK_InteractiveForm* pForm = GetInteractiveForm();
+  CPDF_InteractiveForm* pPDFForm = pForm->GetInteractiveForm();
+  return !!pPDFForm->GetFieldByDict(pFieldDict);
+}
+
+bool CPDFSDK_FormFillEnvironment::ExecuteFieldAction(
+    const CPDF_Action& action,
+    CPDF_AAction::AActionType type,
+    CPDF_FormField* pFormField,
+    CFFL_FieldAction* data,
+    std::set<const CPDF_Dictionary*>* visited) {
+  const CPDF_Dictionary* pDict = action.GetDict();
+  if (pdfium::Contains(*visited, pDict))
+    return false;
+
+  visited->insert(pDict);
+
+  if (action.GetType() == CPDF_Action::Type::kJavaScript) {
+    if (IsJSPlatformPresent()) {
+      WideString swJS = action.GetJavaScript();
+      if (!swJS.IsEmpty()) {
+        RunFieldJavaScript(pFormField, type, data, swJS);
+        if (!IsValidField(pFormField->GetFieldDict()))
+          return false;
+      }
+    }
+  } else {
+    DoActionNoJs(action, type);
+  }
+
+  for (size_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
+    CPDF_Action subaction = action.GetSubAction(i);
+    if (!ExecuteFieldAction(subaction, type, pFormField, data, visited))
+      return false;
+  }
+
+  return true;
+}
+
+void CPDFSDK_FormFillEnvironment::DoActionNoJs(const CPDF_Action& action,
+                                               CPDF_AAction::AActionType type) {
+  switch (action.GetType()) {
+    case CPDF_Action::Type::kGoTo:
+      DoActionGoTo(action);
+      break;
+    case CPDF_Action::Type::kURI:
+      if (CPDF_AAction::IsUserInput(type))
+        DoActionURI(action, Mask<FWL_EVENTFLAG>{});
+      break;
+    case CPDF_Action::Type::kHide:
+      DoActionHide(action);
+      break;
+    case CPDF_Action::Type::kNamed:
+      DoActionNamed(action);
+      break;
+    case CPDF_Action::Type::kSubmitForm:
+      if (CPDF_AAction::IsUserInput(type))
+        DoActionSubmitForm(action);
+      break;
+    case CPDF_Action::Type::kResetForm:
+      DoActionResetForm(action);
+      break;
+    case CPDF_Action::Type::kJavaScript:
+      NOTREACHED();
+      break;
+    case CPDF_Action::Type::kSetOCGState:
+    case CPDF_Action::Type::kThread:
+    case CPDF_Action::Type::kSound:
+    case CPDF_Action::Type::kMovie:
+    case CPDF_Action::Type::kRendition:
+    case CPDF_Action::Type::kTrans:
+    case CPDF_Action::Type::kGoTo3DView:
+    case CPDF_Action::Type::kGoToR:
+    case CPDF_Action::Type::kGoToE:
+    case CPDF_Action::Type::kLaunch:
+    case CPDF_Action::Type::kImportData:
+      // Unimplemented
+      break;
+    default:
+      break;
+  }
+}
+
+void CPDFSDK_FormFillEnvironment::DoActionGoTo(const CPDF_Action& action) {
+  DCHECK(action.GetDict());
+
+  CPDF_Document* pPDFDocument = GetPDFDocument();
+  DCHECK(pPDFDocument);
+
+  CPDF_Dest MyDest = action.GetDest(pPDFDocument);
+  DoActionDestination(MyDest);
+}
+
+void CPDFSDK_FormFillEnvironment::DoActionURI(const CPDF_Action& action,
+                                              Mask<FWL_EVENTFLAG> modifiers) {
+  DCHECK(action.GetDict());
+  DoURIAction(action.GetURI(GetPDFDocument()), modifiers);
+}
+
+void CPDFSDK_FormFillEnvironment::DoActionNamed(const CPDF_Action& action) {
+  DCHECK(action.GetDict());
+  ExecuteNamedAction(action.GetNamedAction());
+}
+
+void CPDFSDK_FormFillEnvironment::RunFieldJavaScript(
+    CPDF_FormField* pFormField,
+    CPDF_AAction::AActionType type,
+    CFFL_FieldAction* data,
+    const WideString& script) {
+  DCHECK(type != CPDF_AAction::kCalculate);
+  DCHECK(type != CPDF_AAction::kFormat);
+
+  RunScript(script, [type, data, pFormField](IJS_EventContext* context) {
+    switch (type) {
+      case CPDF_AAction::kCursorEnter:
+        context->OnField_MouseEnter(data->bModifier, data->bShift, pFormField);
+        break;
+      case CPDF_AAction::kCursorExit:
+        context->OnField_MouseExit(data->bModifier, data->bShift, pFormField);
+        break;
+      case CPDF_AAction::kButtonDown:
+        context->OnField_MouseDown(data->bModifier, data->bShift, pFormField);
+        break;
+      case CPDF_AAction::kButtonUp:
+        context->OnField_MouseUp(data->bModifier, data->bShift, pFormField);
+        break;
+      case CPDF_AAction::kGetFocus:
+        context->OnField_Focus(data->bModifier, data->bShift, pFormField,
+                               &data->sValue);
+        break;
+      case CPDF_AAction::kLoseFocus:
+        context->OnField_Blur(data->bModifier, data->bShift, pFormField,
+                              &data->sValue);
+        break;
+      case CPDF_AAction::kKeyStroke:
+        context->OnField_Keystroke(
+            &data->sChange, data->sChangeEx, data->bKeyDown, data->bModifier,
+            &data->nSelEnd, &data->nSelStart, data->bShift, pFormField,
+            &data->sValue, data->bWillCommit, data->bFieldFull, &data->bRC);
+        break;
+      case CPDF_AAction::kValidate:
+        context->OnField_Validate(&data->sChange, data->sChangeEx,
+                                  data->bKeyDown, data->bModifier, data->bShift,
+                                  pFormField, &data->sValue, &data->bRC);
+        break;
+      default:
+        NOTREACHED();
+        break;
+    }
+  });
+}
+
+void CPDFSDK_FormFillEnvironment::RunDocumentOpenJavaScript(
+    const WideString& sScriptName,
+    const WideString& script) {
+  RunScript(script, [sScriptName](IJS_EventContext* context) {
+    context->OnDoc_Open(sScriptName);
+  });
+}
+
+void CPDFSDK_FormFillEnvironment::RunDocumentPageJavaScript(
+    CPDF_AAction::AActionType type,
+    const WideString& script) {
+  RunScript(script, [type](IJS_EventContext* context) {
+    switch (type) {
+      case CPDF_AAction::kOpenPage:
+        context->OnPage_Open();
+        break;
+      case CPDF_AAction::kClosePage:
+        context->OnPage_Close();
+        break;
+      case CPDF_AAction::kCloseDocument:
+        context->OnDoc_WillClose();
+        break;
+      case CPDF_AAction::kSaveDocument:
+        context->OnDoc_WillSave();
+        break;
+      case CPDF_AAction::kDocumentSaved:
+        context->OnDoc_DidSave();
+        break;
+      case CPDF_AAction::kPrintDocument:
+        context->OnDoc_WillPrint();
+        break;
+      case CPDF_AAction::kDocumentPrinted:
+        context->OnDoc_DidPrint();
+        break;
+      case CPDF_AAction::kPageVisible:
+        context->OnPage_InView();
+        break;
+      case CPDF_AAction::kPageInvisible:
+        context->OnPage_OutView();
+        break;
+      default:
+        NOTREACHED();
+        break;
+    }
+  });
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionHide(const CPDF_Action& action) {
+  CPDFSDK_InteractiveForm* pForm = GetInteractiveForm();
+  if (pForm->DoAction_Hide(action)) {
+    SetChangeMark();
+    return true;
+  }
+  return false;
+}
+
+bool CPDFSDK_FormFillEnvironment::DoActionSubmitForm(
+    const CPDF_Action& action) {
+  CPDFSDK_InteractiveForm* pForm = GetInteractiveForm();
+  return pForm->DoAction_SubmitForm(action);
+}
+
+void CPDFSDK_FormFillEnvironment::DoActionResetForm(const CPDF_Action& action) {
+  CPDFSDK_InteractiveForm* pForm = GetInteractiveForm();
+  pForm->DoAction_ResetForm(action);
+}
+
+void CPDFSDK_FormFillEnvironment::RunScript(const WideString& script,
+                                            const RunScriptCallback& cb) {
+  IJS_Runtime::ScopedEventContext pContext(GetIJSRuntime());
+  cb(pContext.Get());
+  pContext->RunScript(script);
+  // TODO(dsinclair): Return error if RunScript returns a IJS_Runtime::JS_Error.
+}
diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.h b/fpdfsdk/cpdfsdk_formfillenvironment.h
index d3135da..6c3b750 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.h
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.h
@@ -11,10 +11,13 @@
 
 #include <map>
 #include <memory>
+#include <set>
+#include <utility>
 #include <vector>
 
 #include "core/fpdfapi/page/cpdf_occontext.h"
 #include "core/fpdfapi/parser/cpdf_document.h"
+#include "core/fpdfdoc/cpdf_aaction.h"
 #include "core/fxcrt/cfx_timer.h"
 #include "core/fxcrt/mask.h"
 #include "core/fxcrt/observed_ptr.h"
@@ -27,11 +30,14 @@
 #include "public/fpdf_formfill.h"
 #include "third_party/base/span.h"
 
-class CPDFSDK_ActionHandler;
+class CPDF_Action;
+class CPDF_FormField;
 class CPDFSDK_InteractiveForm;
 class CPDFSDK_PageView;
+class IJS_EventContext;
 class IJS_Runtime;
 class IPDF_Page;
+struct CFFL_FieldAction;
 
 // NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
 // since modifying the result would impact |bsUTF16LE|.
@@ -115,6 +121,33 @@
     return m_pInfo ? m_pInfo->m_pJsPlatform : nullptr;
   }
 
+  // Actions.
+  bool DoActionDocOpen(const CPDF_Action& action);
+  bool DoActionJavaScript(const CPDF_Action& JsAction, WideString csJSName);
+  bool DoActionPage(const CPDF_Action& action, CPDF_AAction::AActionType eType);
+  bool DoActionDocument(const CPDF_Action& action,
+                        CPDF_AAction::AActionType eType);
+  bool DoActionField(const CPDF_Action& action,
+                     CPDF_AAction::AActionType type,
+                     CPDF_FormField* pFormField,
+                     CFFL_FieldAction* data);
+  bool DoActionFieldJavaScript(const CPDF_Action& JsAction,
+                               CPDF_AAction::AActionType type,
+                               CPDF_FormField* pFormField,
+                               CFFL_FieldAction* data);
+  bool DoActionLink(const CPDF_Action& action,
+                    CPDF_AAction::AActionType type,
+                    Mask<FWL_EVENTFLAG> modifiers);
+  bool DoActionDestination(const CPDF_Dest& dest);
+  void DoActionNoJs(const CPDF_Action& action, CPDF_AAction::AActionType type);
+  void DoActionGoTo(const CPDF_Action& action);
+  void DoActionLaunch(const CPDF_Action& action);
+  void DoActionURI(const CPDF_Action& action, Mask<FWL_EVENTFLAG> modifiers);
+  void DoActionNamed(const CPDF_Action& action);
+  bool DoActionHide(const CPDF_Action& action);
+  bool DoActionSubmitForm(const CPDF_Action& action);
+  void DoActionResetForm(const CPDF_Action& action);
+
 #ifdef PDF_ENABLE_V8
   CPDFSDK_PageView* GetCurrentView();
   FPDF_PAGE GetCurrentPage() const;
@@ -214,16 +247,38 @@
   }
 
   IJS_Runtime* GetIJSRuntime();                   // Creates if not present.
-  CPDFSDK_ActionHandler* GetActionHandler();      // Creates if not present.
   CPDFSDK_InteractiveForm* GetInteractiveForm();  // Creates if not present.
 
  private:
+  using RunScriptCallback = std::function<void(IJS_EventContext* context)>;
+
   IPDF_Page* GetPage(int nIndex) const;
   void OnSetFieldInputFocusInternal(const WideString& text, bool bFocus);
   void SendOnFocusChange(ObservedPtr<CPDFSDK_Annot>& pAnnot);
 
+  // Support methods for Actions.
+  void RunScript(const WideString& script, const RunScriptCallback& cb);
+  bool ExecuteDocumentOpenAction(const CPDF_Action& action,
+                                 std::set<const CPDF_Dictionary*>* visited);
+  bool ExecuteDocumentPageAction(const CPDF_Action& action,
+                                 CPDF_AAction::AActionType type,
+                                 std::set<const CPDF_Dictionary*>* visited);
+  bool ExecuteFieldAction(const CPDF_Action& action,
+                          CPDF_AAction::AActionType type,
+                          CPDF_FormField* pFormField,
+                          CFFL_FieldAction* data,
+                          std::set<const CPDF_Dictionary*>* visited);
+  void RunDocumentPageJavaScript(CPDF_AAction::AActionType type,
+                                 const WideString& script);
+  void RunDocumentOpenJavaScript(const WideString& sScriptName,
+                                 const WideString& script);
+  void RunFieldJavaScript(CPDF_FormField* pFormField,
+                          CPDF_AAction::AActionType type,
+                          CFFL_FieldAction* data,
+                          const WideString& script);
+  bool IsValidField(CPDF_Dictionary* pFieldDict);
+
   UnownedPtr<FPDF_FORMFILLINFO> const m_pInfo;
-  std::unique_ptr<CPDFSDK_ActionHandler> m_pActionHandler;
   std::unique_ptr<IJS_Runtime> m_pIJSRuntime;
   std::map<IPDF_Page*, std::unique_ptr<CPDFSDK_PageView>> m_PageMap;
   std::unique_ptr<CPDFSDK_InteractiveForm> m_pInteractiveForm;
diff --git a/fpdfsdk/cpdfsdk_interactiveform.cpp b/fpdfsdk/cpdfsdk_interactiveform.cpp
index 0c617e0..602fe39 100644
--- a/fpdfsdk/cpdfsdk_interactiveform.cpp
+++ b/fpdfsdk/cpdfsdk_interactiveform.cpp
@@ -27,7 +27,6 @@
 #include "core/fxcrt/stl_util.h"
 #include "core/fxge/cfx_graphstatedata.h"
 #include "core/fxge/cfx_path.h"
-#include "fpdfsdk/cpdfsdk_actionhandler.h"
 #include "fpdfsdk/cpdfsdk_annot.h"
 #include "fpdfsdk/cpdfsdk_annotiterator.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
@@ -362,8 +361,8 @@
   fa.bModifier = false;
   fa.bShift = false;
   fa.sValue = csValue;
-  m_pFormFillEnv->GetActionHandler()->DoAction_FieldJavaScript(
-      action, CPDF_AAction::kKeyStroke, m_pFormFillEnv.Get(), pFormField, &fa);
+  m_pFormFillEnv->DoActionFieldJavaScript(action, CPDF_AAction::kKeyStroke,
+                                          pFormField, &fa);
   return fa.bRC;
 }
 
@@ -381,8 +380,8 @@
   fa.bModifier = false;
   fa.bShift = false;
   fa.sValue = csValue;
-  m_pFormFillEnv->GetActionHandler()->DoAction_FieldJavaScript(
-      action, CPDF_AAction::kValidate, m_pFormFillEnv.Get(), pFormField, &fa);
+  m_pFormFillEnv->DoActionFieldJavaScript(action, CPDF_AAction::kValidate,
+                                          pFormField, &fa);
   return fa.bRC;
 }
 
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 2346cbf..0112f72 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -26,7 +26,6 @@
 #include "core/fxge/cfx_graphstatedata.h"
 #include "core/fxge/cfx_path.h"
 #include "core/fxge/cfx_renderdevice.h"
-#include "fpdfsdk/cpdfsdk_actionhandler.h"
 #include "fpdfsdk/cpdfsdk_appstream.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 #include "fpdfsdk/cpdfsdk_interactiveform.h"
@@ -1024,8 +1023,7 @@
 
   CPDF_Action action = GetAAction(type);
   if (action.GetType() != CPDF_Action::Type::kUnknown) {
-    pFormFillEnv->GetActionHandler()->DoAction_Field(action, type, pFormFillEnv,
-                                                     GetFormField(), data);
+    pFormFillEnv->DoActionField(action, type, GetFormField(), data);
   }
   return false;
 }
diff --git a/fpdfsdk/fpdf_formfill.cpp b/fpdfsdk/fpdf_formfill.cpp
index 135e56d..7fb9733 100644
--- a/fpdfsdk/fpdf_formfill.cpp
+++ b/fpdfsdk/fpdf_formfill.cpp
@@ -20,7 +20,6 @@
 #include "core/fpdfdoc/cpdf_formfield.h"
 #include "core/fpdfdoc/cpdf_interactiveform.h"
 #include "core/fxge/cfx_defaultrenderdevice.h"
-#include "fpdfsdk/cpdfsdk_actionhandler.h"
 #include "fpdfsdk/cpdfsdk_annot.h"
 #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 #include "fpdfsdk/cpdfsdk_helpers.h"
@@ -775,11 +774,8 @@
 
   CPDF_AAction aa(pDict->GetDictFor(pdfium::form_fields::kAA));
   auto type = static_cast<CPDF_AAction::AActionType>(aaType);
-  if (aa.ActionExist(type)) {
-    CPDF_Action action = aa.GetAction(type);
-    pFormFillEnv->GetActionHandler()->DoAction_Document(action, type,
-                                                        pFormFillEnv);
-  }
+  if (aa.ActionExist(type))
+    pFormFillEnv->DoActionDocument(aa.GetAction(type), type);
 }
 
 FPDF_EXPORT void FPDF_CALLCONV FORM_DoPageAAction(FPDF_PAGE page,
@@ -798,16 +794,13 @@
   if (!pFormFillEnv->GetPageView(pPage))
     return;
 
-  CPDFSDK_ActionHandler* pActionHandler = pFormFillEnv->GetActionHandler();
   CPDF_Dictionary* pPageDict = pPDFPage->GetDict();
   CPDF_AAction aa(pPageDict->GetDictFor(pdfium::form_fields::kAA));
   CPDF_AAction::AActionType type = aaType == FPDFPAGE_AACTION_OPEN
                                        ? CPDF_AAction::kOpenPage
                                        : CPDF_AAction::kClosePage;
-  if (aa.ActionExist(type)) {
-    CPDF_Action action = aa.GetAction(type);
-    pActionHandler->DoAction_Page(action, type, pFormFillEnv);
-  }
+  if (aa.ActionExist(type))
+    pFormFillEnv->DoActionPage(aa.GetAction(type), type);
 }
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
@@ -816,15 +809,11 @@
                       int index,
                       FPDF_BOOL selected) {
   CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
-  if (!pPageView)
-    return false;
-  return pPageView->SetIndexSelected(index, selected);
+  return pPageView && pPageView->SetIndexSelected(index, selected);
 }
 
 FPDF_EXPORT FPDF_BOOL FPDF_CALLCONV
 FORM_IsIndexSelected(FPDF_FORMHANDLE hHandle, FPDF_PAGE page, int index) {
   CPDFSDK_PageView* pPageView = FormHandleToPageView(hHandle, page);
-  if (!pPageView)
-    return false;
-  return pPageView->IsIndexSelected(index);
+  return pPageView && pPageView->IsIndexSelected(index);
 }
