Convert CXFA_FFWidgetHandler to use CXFA_Node
This CL removes CXFA_WidgetAcc from CXFA_FFWidgetHandler and uses
CXFA_Node directly.
Change-Id: I88cf1edc53f4489aeac018a95e9d5936d85106db
Reviewed-on: https://pdfium-review.googlesource.com/23450
Commit-Queue: dsinclair <dsinclair@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index 184c223..ffb4dde 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -210,7 +210,7 @@
if (CXFA_FFWidget* hGroupWidget = GetGroupMixXFAWidget()) {
CXFA_Node* node = hGroupWidget->GetNode();
if (node->IsWidgetReady()) {
- if (pXFAWidgetHandler->HasEvent(node->GetWidgetAcc(), eEventType))
+ if (pXFAWidgetHandler->HasEvent(node, eEventType))
return true;
}
}
@@ -218,7 +218,7 @@
CXFA_Node* node = hWidget->GetNode();
if (!node->IsWidgetReady())
return false;
- return pXFAWidgetHandler->HasEvent(node->GetWidgetAcc(), eEventType);
+ return pXFAWidgetHandler->HasEvent(node, eEventType);
}
bool CPDFSDK_Widget::OnXFAAAction(PDFSDK_XFAAActionType eXFAAAT,
@@ -263,9 +263,8 @@
if (!node->IsWidgetReady())
return false;
- CXFA_WidgetAcc* pAcc = node->GetWidgetAcc();
- param.m_pTarget = pAcc;
- if (pXFAWidgetHandler->ProcessEvent(pAcc, ¶m) !=
+ param.m_pTarget = node->GetWidgetAcc();
+ if (pXFAWidgetHandler->ProcessEvent(node, ¶m) !=
XFA_EVENTERROR_Success) {
return false;
}
@@ -275,9 +274,8 @@
int32_t nRet = XFA_EVENTERROR_NotExist;
CXFA_Node* node = hWidget->GetNode();
if (node->IsWidgetReady()) {
- CXFA_WidgetAcc* pAcc = node->GetWidgetAcc();
- param.m_pTarget = pAcc;
- nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m);
+ param.m_pTarget = node->GetWidgetAcc();
+ nRet = pXFAWidgetHandler->ProcessEvent(node, ¶m);
}
if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
pDocView->UpdateDocView();
@@ -1018,9 +1016,8 @@
int32_t nRet = XFA_EVENTERROR_NotExist;
CXFA_Node* node = hWidget->GetNode();
if (node->IsWidgetReady()) {
- CXFA_WidgetAcc* pAcc = node->GetWidgetAcc();
- param.m_pTarget = pAcc;
- nRet = pXFAWidgetHandler->ProcessEvent(pAcc, ¶m);
+ param.m_pTarget = node->GetWidgetAcc();
+ nRet = pXFAWidgetHandler->ProcessEvent(node, ¶m);
}
if (CXFA_FFDocView* pDocView = pContext->GetXFADocView())
diff --git a/fpdfsdk/fpdfsave.cpp b/fpdfsdk/fpdfsave.cpp
index ddbc994..b4d4a41 100644
--- a/fpdfsdk/fpdfsave.cpp
+++ b/fpdfsdk/fpdfsave.cpp
@@ -31,6 +31,7 @@
#include "xfa/fxfa/cxfa_ffapp.h"
#include "xfa/fxfa/cxfa_ffdocview.h"
#include "xfa/fxfa/cxfa_ffwidgethandler.h"
+#include "xfa/fxfa/cxfa_widgetacc.h"
#include "xfa/fxfa/cxfa_widgetacciterator.h"
#include "xfa/fxfa/parser/cxfa_object.h"
#endif
@@ -209,7 +210,7 @@
while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext()) {
CXFA_EventParam preParam;
preParam.m_eType = XFA_EVENT_PostSave;
- pWidgetHandler->ProcessEvent(pWidgetAcc, &preParam);
+ pWidgetHandler->ProcessEvent(pWidgetAcc->GetNode(), &preParam);
}
pXFADocView->UpdateDocView();
pContext->ClearChangeMark();
@@ -231,7 +232,7 @@
while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext()) {
CXFA_EventParam preParam;
preParam.m_eType = XFA_EVENT_PreSave;
- pWidgetHandler->ProcessEvent(pWidgetAcc, &preParam);
+ pWidgetHandler->ProcessEvent(pWidgetAcc->GetNode(), &preParam);
}
pXFADocView->UpdateDocView();
return SaveXFADocumentData(pContext, fileList);
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index a1bea0d..9735584 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -626,7 +626,7 @@
CXFA_EventParam Param;
Param.m_eType = XFA_EVENT_PreSubmit;
while (CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext())
- pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
+ pWidgetHandler->ProcessEvent(pWidgetAcc->GetNode(), &Param);
}
pWidgetAccIterator = docView->CreateWidgetAccIterator();
@@ -678,7 +678,7 @@
Param.m_eType = XFA_EVENT_PostSubmit;
CXFA_WidgetAcc* pWidgetAcc = pWidgetAccIterator->MoveToNext();
while (pWidgetAcc) {
- pWidgetHandler->ProcessEvent(pWidgetAcc, &Param);
+ pWidgetHandler->ProcessEvent(pWidgetAcc->GetNode(), &Param);
pWidgetAcc = pWidgetAccIterator->MoveToNext();
}
m_pContext->GetXFADocView()->UpdateDocView();
diff --git a/fxjs/xfa/cjx_eventpseudomodel.cpp b/fxjs/xfa/cjx_eventpseudomodel.cpp
index 3b2d977..b021689 100644
--- a/fxjs/xfa/cjx_eventpseudomodel.cpp
+++ b/fxjs/xfa/cjx_eventpseudomodel.cpp
@@ -13,6 +13,7 @@
#include "xfa/fxfa/cxfa_eventparam.h"
#include "xfa/fxfa/cxfa_ffnotify.h"
#include "xfa/fxfa/cxfa_ffwidgethandler.h"
+#include "xfa/fxfa/cxfa_widgetacc.h"
#include "xfa/fxfa/parser/cscript_eventpseudomodel.h"
namespace {
@@ -169,7 +170,9 @@
if (!pWidgetHandler)
return CJS_Return(true);
- pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam);
+ CXFA_Node* pNode =
+ pEventParam->m_pTarget ? pEventParam->m_pTarget->GetNode() : nullptr;
+ pWidgetHandler->ProcessEvent(pNode, pEventParam);
return CJS_Return(true);
}
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.cpp b/xfa/fxfa/cxfa_ffwidgethandler.cpp
index 74ded4b..66885e0 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.cpp
+++ b/xfa/fxfa/cxfa_ffwidgethandler.cpp
@@ -14,7 +14,6 @@
#include "xfa/fxfa/cxfa_fffield.h"
#include "xfa/fxfa/cxfa_ffwidget.h"
#include "xfa/fxfa/cxfa_fwladapterwidgetmgr.h"
-#include "xfa/fxfa/cxfa_widgetacc.h"
#include "xfa/fxfa/parser/cxfa_calculate.h"
#include "xfa/fxfa/parser/cxfa_checkbutton.h"
#include "xfa/fxfa/parser/cxfa_layoutprocessor.h"
@@ -183,66 +182,59 @@
bHighlight ? XFA_WidgetStatus_Highlight : 0);
}
-bool CXFA_FFWidgetHandler::HasEvent(CXFA_WidgetAcc* pWidgetAcc,
+bool CXFA_FFWidgetHandler::HasEvent(CXFA_Node* pNode,
XFA_EVENTTYPE eEventType) {
if (eEventType == XFA_EVENT_Unknown)
return false;
- if (!pWidgetAcc)
- return false;
-
- CXFA_Node* node = pWidgetAcc->GetNode();
- if (!node || node->GetElementType() == XFA_Element::Draw)
+ if (!pNode || pNode->GetElementType() == XFA_Element::Draw)
return false;
switch (eEventType) {
case XFA_EVENT_Calculate: {
- CXFA_Calculate* calc = node->GetCalculateIfExists();
+ CXFA_Calculate* calc = pNode->GetCalculateIfExists();
return calc && calc->GetScriptIfExists();
}
case XFA_EVENT_Validate: {
- CXFA_Validate* validate = node->GetValidateIfExists();
+ CXFA_Validate* validate = pNode->GetValidateIfExists();
return validate && validate->GetScriptIfExists();
}
default:
break;
}
- return !pWidgetAcc->GetEventByActivity(gs_EventActivity[eEventType], false)
+ return !pNode->GetEventByActivity(gs_EventActivity[eEventType], false)
.empty();
}
-int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_WidgetAcc* pWidgetAcc,
+int32_t CXFA_FFWidgetHandler::ProcessEvent(CXFA_Node* pNode,
CXFA_EventParam* pParam) {
if (!pParam || pParam->m_eType == XFA_EVENT_Unknown)
return XFA_EVENTERROR_NotExist;
- if (!pWidgetAcc)
- return XFA_EVENTERROR_NotExist;
-
- CXFA_Node* node = pWidgetAcc->GetNode();
- if (!node || node->GetElementType() == XFA_Element::Draw)
+ if (!pNode || pNode->GetElementType() == XFA_Element::Draw)
return XFA_EVENTERROR_NotExist;
switch (pParam->m_eType) {
case XFA_EVENT_Calculate:
- return node->ProcessCalculate(m_pDocView);
+ return pNode->ProcessCalculate(m_pDocView);
case XFA_EVENT_Validate:
if (m_pDocView->GetDoc()->GetDocEnvironment()->IsValidationsEnabled(
m_pDocView->GetDoc())) {
- return node->ProcessValidate(m_pDocView, 0);
+ return pNode->ProcessValidate(m_pDocView, 0);
}
return XFA_EVENTERROR_Disabled;
case XFA_EVENT_InitCalculate: {
- CXFA_Calculate* calc = node->GetCalculateIfExists();
+ CXFA_Calculate* calc = pNode->GetCalculateIfExists();
if (!calc)
return XFA_EVENTERROR_NotExist;
- if (node->IsUserInteractive())
+ if (pNode->IsUserInteractive())
return XFA_EVENTERROR_Disabled;
- return node->ExecuteScript(m_pDocView, calc->GetScriptIfExists(), pParam);
+ return pNode->ExecuteScript(m_pDocView, calc->GetScriptIfExists(),
+ pParam);
}
default:
break;
}
- int32_t iRet =
- node->ProcessEvent(m_pDocView, gs_EventActivity[pParam->m_eType], pParam);
+ int32_t iRet = pNode->ProcessEvent(m_pDocView,
+ gs_EventActivity[pParam->m_eType], pParam);
return iRet;
}
diff --git a/xfa/fxfa/cxfa_ffwidgethandler.h b/xfa/fxfa/cxfa_ffwidgethandler.h
index 1ef8854..378a442 100644
--- a/xfa/fxfa/cxfa_ffwidgethandler.h
+++ b/xfa/fxfa/cxfa_ffwidgethandler.h
@@ -66,8 +66,8 @@
CXFA_Graphics* pGS,
const CFX_Matrix& matrix,
bool bHighlight);
- bool HasEvent(CXFA_WidgetAcc* pWidgetAcc, XFA_EVENTTYPE eEventType);
- int32_t ProcessEvent(CXFA_WidgetAcc* pWidgetAcc, CXFA_EventParam* pParam);
+ bool HasEvent(CXFA_Node* pNode, XFA_EVENTTYPE eEventType);
+ int32_t ProcessEvent(CXFA_Node* pNode, CXFA_EventParam* pParam);
private:
CXFA_Node* CreateWidgetFormItem(XFA_WIDGETTYPE eType,
diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp
index 9c61697..0e73dfb 100644
--- a/xfa/fxfa/cxfa_widgetacc.cpp
+++ b/xfa/fxfa/cxfa_widgetacc.cpp
@@ -1295,30 +1295,6 @@
return m_pNode && m_pNode->IsOpenAccess();
}
-std::vector<CXFA_Event*> CXFA_WidgetAcc::GetEventByActivity(
- XFA_AttributeEnum iActivity,
- bool bIsFormReady) {
- std::vector<CXFA_Event*> events;
- for (CXFA_Node* node : m_pNode->GetNodeList(0, XFA_Element::Event)) {
- auto* event = static_cast<CXFA_Event*>(node);
- if (event->GetActivity() == iActivity) {
- if (iActivity == XFA_AttributeEnum::Ready) {
- WideString wsRef = event->GetRef();
- if (bIsFormReady) {
- if (wsRef == WideStringView(L"$form"))
- events.push_back(event);
- } else {
- if (wsRef == WideStringView(L"$layout"))
- events.push_back(event);
- }
- } else {
- events.push_back(event);
- }
- }
- }
- return events;
-}
-
XFA_AttributeEnum CXFA_WidgetAcc::GetButtonHighlight() {
CXFA_Node* pUIChild = m_pNode->GetUIChild();
if (pUIChild)
diff --git a/xfa/fxfa/cxfa_widgetacc.h b/xfa/fxfa/cxfa_widgetacc.h
index ca018ed..8e03018 100644
--- a/xfa/fxfa/cxfa_widgetacc.h
+++ b/xfa/fxfa/cxfa_widgetacc.h
@@ -100,9 +100,6 @@
bool IsChoiceListAllowTextEntry();
bool IsMultiLine();
- std::vector<CXFA_Event*> GetEventByActivity(XFA_AttributeEnum iActivity,
- bool bIsFormReady);
-
XFA_AttributeEnum GetButtonHighlight();
bool HasButtonRollover() const;
bool HasButtonDown() const;
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 026e013..6d670c4 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -1840,8 +1840,8 @@
if (GetElementType() == XFA_Element::Draw)
return XFA_EVENTERROR_NotExist;
- std::vector<CXFA_Event*> eventArray = GetWidgetAcc()->GetEventByActivity(
- iActivity, pEventParam->m_bIsFormReady);
+ std::vector<CXFA_Event*> eventArray =
+ GetEventByActivity(iActivity, pEventParam->m_bIsFormReady);
bool first = true;
int32_t iRet = XFA_EVENTERROR_NotExist;
for (CXFA_Event* event : eventArray) {
@@ -2430,3 +2430,30 @@
return CFX_RectF(left.value_or(0.0), top.value_or(0.0), right.value_or(0.0),
bottom.value_or(0.0));
}
+
+std::vector<CXFA_Event*> CXFA_Node::GetEventByActivity(
+ XFA_AttributeEnum iActivity,
+ bool bIsFormReady) {
+ std::vector<CXFA_Event*> events;
+ for (CXFA_Node* node : GetNodeList(0, XFA_Element::Event)) {
+ auto* event = static_cast<CXFA_Event*>(node);
+ if (event->GetActivity() != iActivity)
+ continue;
+
+ if (iActivity != XFA_AttributeEnum::Ready) {
+ events.push_back(event);
+ continue;
+ }
+
+ WideString wsRef = event->GetRef();
+ if (bIsFormReady) {
+ if (wsRef == WideStringView(L"$form"))
+ events.push_back(event);
+ continue;
+ }
+
+ if (wsRef == WideStringView(L"$layout"))
+ events.push_back(event);
+ }
+ return events;
+}
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 9cda17c..0991a53 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -312,6 +312,9 @@
return acc_.get();
}
+ std::vector<CXFA_Event*> GetEventByActivity(XFA_AttributeEnum iActivity,
+ bool bIsFormReady);
+
protected:
CXFA_Node(CXFA_Document* pDoc,
XFA_PacketType ePacket,