Add CXFA_FFWidget::{Has,Process}EventUnderHandler().

Consolidate some code, and small step toward removing CXFA_Node
knowledge (xfa parser object) from fpdfsdk/ top-level.

Change-Id: I355671f54af6f986de86f7bcc7dbe843c61bc7fc
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/64451
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 6feb146..ece3741 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -188,26 +188,18 @@
     return false;
 
   XFA_EVENTTYPE eEventType = GetXFAEventType(eXFAAAT);
-
   if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) &&
       GetFieldType() == FormFieldType::kRadioButton) {
-    if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) {
-      CXFA_Node* node = hGroupWidget->GetNode();
-      if (node->IsWidgetReady()) {
-        if (pXFAWidgetHandler->HasEvent(node, eEventType))
-          return true;
-      }
+    CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget();
+    if (hGroupWidget &&
+        hGroupWidget->HasEventUnderHandler(eEventType, pXFAWidgetHandler)) {
+      return true;
     }
   }
 
   // Check |pWidget| again because JS may have destroyed it in the block above.
-  if (!pWidget)
-    return false;
-
-  CXFA_Node* node = pWidget->GetNode();
-  if (!node->IsWidgetReady())
-    return false;
-  return pXFAWidgetHandler->HasEvent(node, eEventType);
+  return pWidget &&
+         pWidget->HasEventUnderHandler(eEventType, pXFAWidgetHandler);
 }
 
 bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT,
@@ -241,16 +233,10 @@
   param.m_wsPrevText = data->sValue;
   if ((eEventType == XFA_EVENT_Click || eEventType == XFA_EVENT_Change) &&
       GetFieldType() == FormFieldType::kRadioButton) {
-    if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) {
-      CXFA_Node* node = hGroupWidget->GetNode();
-      if (!node->IsWidgetReady())
-        return false;
-
-      param.m_pTarget = node;
-      if (pXFAWidgetHandler->ProcessEvent(node, &param) !=
-          XFA_EventError::kSuccess) {
-        return false;
-      }
+    CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget();
+    if (hGroupWidget &&
+        !hGroupWidget->ProcessEventUnderHandler(&param, pXFAWidgetHandler)) {
+      return false;
     }
   }
 
@@ -258,16 +244,11 @@
   if (!pWidget)
     return false;
 
-  XFA_EventError nRet = XFA_EventError::kNotExist;
-  CXFA_Node* node = pWidget->GetNode();
-  if (node->IsWidgetReady()) {
-    param.m_pTarget = node;
-    nRet = pXFAWidgetHandler->ProcessEvent(node, &param);
-  }
+  bool ret = pWidget->ProcessEventUnderHandler(&param, pXFAWidgetHandler);
   if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
     pDocView->UpdateDocView();
 
-  return nRet == XFA_EventError::kSuccess;
+  return ret;
 }
 
 void CPDFSDK_Widget::Synchronize(bool bSynchronizeElse) {
@@ -826,18 +807,10 @@
         param.m_bKeyDown = data->bKeyDown;
         param.m_bModifier = data->bModifier;
         param.m_wsPrevText = data->sValue;
-
-        XFA_EventError nRet = XFA_EventError::kNotExist;
-        CXFA_Node* node = hWidget->GetNode();
-        if (node->IsWidgetReady()) {
-          param.m_pTarget = node;
-          nRet = pXFAWidgetHandler->ProcessEvent(node, &param);
-        }
-
+        bool ret = hWidget->ProcessEventUnderHandler(&param, pXFAWidgetHandler);
         if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
           pDocView->UpdateDocView();
-
-        if (nRet == XFA_EventError::kSuccess)
+        if (ret)
           return true;
       }
     }
diff --git a/xfa/fxfa/cxfa_ffwidget.cpp b/xfa/fxfa/cxfa_ffwidget.cpp
index 424e004..f6ea8ae 100644
--- a/xfa/fxfa/cxfa_ffwidget.cpp
+++ b/xfa/fxfa/cxfa_ffwidget.cpp
@@ -24,6 +24,7 @@
 #include "xfa/fxfa/cxfa_ffdoc.h"
 #include "xfa/fxfa/cxfa_ffdocview.h"
 #include "xfa/fxfa/cxfa_ffpageview.h"
+#include "xfa/fxfa/cxfa_ffwidgethandler.h"
 #include "xfa/fxfa/cxfa_imagerenderer.h"
 #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
 #include "xfa/fxfa/parser/cxfa_border.h"
@@ -330,6 +331,22 @@
 
 void CXFA_FFWidget::UpdateWidgetProperty() {}
 
+bool CXFA_FFWidget::HasEventUnderHandler(XFA_EVENTTYPE eEventType,
+                                         CXFA_FFWidgetHandler* pHandler) {
+  CXFA_Node* pNode = GetNode();
+  return pNode->IsWidgetReady() && pHandler->HasEvent(pNode, eEventType);
+}
+
+bool CXFA_FFWidget::ProcessEventUnderHandler(CXFA_EventParam* params,
+                                             CXFA_FFWidgetHandler* pHandler) {
+  CXFA_Node* pNode = GetNode();
+  if (!pNode->IsWidgetReady())
+    return false;
+
+  params->m_pTarget = pNode;
+  return pHandler->ProcessEvent(pNode, params) == XFA_EventError::kSuccess;
+}
+
 void CXFA_FFWidget::DrawBorder(CXFA_Graphics* pGS,
                                CXFA_Box* box,
                                const CFX_RectF& rtBorder,
diff --git a/xfa/fxfa/cxfa_ffwidget.h b/xfa/fxfa/cxfa_ffwidget.h
index 228c524..253e772 100644
--- a/xfa/fxfa/cxfa_ffwidget.h
+++ b/xfa/fxfa/cxfa_ffwidget.h
@@ -16,15 +16,17 @@
 #include "xfa/fwl/cfwl_app.h"
 #include "xfa/fwl/cfwl_messagemouse.h"
 #include "xfa/fwl/cfwl_widget.h"
+#include "xfa/fxfa/cxfa_eventparam.h"
 #include "xfa/fxfa/fxfa.h"
 #include "xfa/fxfa/layout/cxfa_contentlayoutitem.h"
 
 class CFX_DIBitmap;
 class CXFA_Box;
-class CXFA_FFPageView;
-class CXFA_FFDocView;
-class CXFA_FFDoc;
 class CXFA_FFApp;
+class CXFA_FFDoc;
+class CXFA_FFDocView;
+class CXFA_FFPageView;
+class CXFA_FFWidgetHandler;
 class CXFA_Graphics;
 class CXFA_Image;
 class CXFA_Margin;
@@ -155,6 +157,11 @@
   bool IsAncestorOf(CXFA_FFWidget* pWidget);
   const CFWL_App* GetFWLApp();
 
+  bool HasEventUnderHandler(XFA_EVENTTYPE eEventType,
+                            CXFA_FFWidgetHandler* pHandler);
+  bool ProcessEventUnderHandler(CXFA_EventParam* params,
+                                CXFA_FFWidgetHandler* pHandler);
+
  protected:
   virtual bool PtInActiveRect(const CFX_PointF& point);