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, ¶m) !=
- XFA_EventError::kSuccess) {
- return false;
- }
+ CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget();
+ if (hGroupWidget &&
+ !hGroupWidget->ProcessEventUnderHandler(¶m, 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, ¶m);
- }
+ bool ret = pWidget->ProcessEventUnderHandler(¶m, 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, ¶m);
- }
-
+ bool ret = hWidget->ProcessEventUnderHandler(¶m, 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);