Remove CPDFSDK_ActionHandler.

It adds nothing beyond CPDFSDK_FormFillEnvironment.

Bug: pdfium:1795
Change-Id: I38b282dc768661b51f985c1b1fdeea0fb4096eb8
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/92391
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
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);
 }