Make CXFA_ReadyNodeIterator a stack-only type.
Move its creation slightly higher up to avoid make_unique<>.
Change-Id: Ibbc51e2215b96a4793ff98023207a74ca57a4cb9
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73211
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
index 8eeba7d..a659d6b 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_context.cpp
@@ -391,8 +391,8 @@
return;
CXFA_FFWidgetHandler* pWidgetHandler = pXFADocView->GetWidgetHandler();
- auto it = pXFADocView->CreateReadyNodeIterator();
- while (CXFA_Node* pNode = it->MoveToNext()) {
+ CXFA_ReadyNodeIterator it(pXFADocView->GetRootSubform());
+ while (CXFA_Node* pNode = it.MoveToNext()) {
CXFA_EventParam preParam;
preParam.m_eType = XFA_EVENT_PostSave;
pWidgetHandler->ProcessEvent(pNode, &preParam);
@@ -411,8 +411,8 @@
return;
CXFA_FFWidgetHandler* pWidgetHandler = pXFADocView->GetWidgetHandler();
- auto it = pXFADocView->CreateReadyNodeIterator();
- while (CXFA_Node* pNode = it->MoveToNext()) {
+ CXFA_ReadyNodeIterator it(pXFADocView->GetRootSubform());
+ while (CXFA_Node* pNode = it.MoveToNext()) {
CXFA_EventParam preParam;
preParam.m_eType = XFA_EVENT_PreSave;
pWidgetHandler->ProcessEvent(pNode, &preParam);
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 94cdb86..673c387 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -305,13 +305,6 @@
return m_pWidgetHandler;
}
-std::unique_ptr<CXFA_ReadyNodeIterator>
-CXFA_FFDocView::CreateReadyNodeIterator() {
- CXFA_Subform* pFormRoot = GetRootSubform();
- return pFormRoot ? std::make_unique<CXFA_ReadyNodeIterator>(pFormRoot)
- : nullptr;
-}
-
bool CXFA_FFDocView::SetFocus(CXFA_FFWidget* pNewFocus) {
if (pNewFocus == m_pFocusWidget)
return false;
@@ -711,7 +704,7 @@
m_pDoc->SetChangeMark();
}
-CXFA_Subform* CXFA_FFDocView::GetRootSubform() {
+CXFA_Node* CXFA_FFDocView::GetRootSubform() {
CXFA_Node* pFormPacketNode =
ToNode(m_pDoc->GetXFADoc()->GetXFAObject(XFA_HASHCODE_Form));
if (!pFormPacketNode)
diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h
index fe23f29..f2ec668 100644
--- a/xfa/fxfa/cxfa_ffdocview.h
+++ b/xfa/fxfa/cxfa_ffdocview.h
@@ -26,7 +26,6 @@
class CXFA_FFDoc;
class CXFA_FFWidgetHandler;
class CXFA_Node;
-class CXFA_ReadyNodeIterator;
class CXFA_Subform;
class CXFA_ViewLayoutItem;
@@ -68,8 +67,8 @@
CXFA_FFPageView* GetPageView(int32_t nIndex) const;
void ResetNode(CXFA_Node* pNode);
+ CXFA_Node* GetRootSubform();
CXFA_FFWidgetHandler* GetWidgetHandler();
- std::unique_ptr<CXFA_ReadyNodeIterator> CreateReadyNodeIterator();
CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget.Get(); }
bool SetFocus(CXFA_FFWidget* pNewFocus);
CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node);
@@ -117,7 +116,6 @@
size_t RunCalculateRecursive(size_t index);
void ShowNullTestMsg();
bool ResetSingleNodeData(CXFA_Node* pNode);
- CXFA_Subform* GetRootSubform();
bool IsUpdateLocked() const { return m_iLock > 0; }
bool InitValidate(CXFA_Node* pNode);
diff --git a/xfa/fxfa/cxfa_readynodeiterator.h b/xfa/fxfa/cxfa_readynodeiterator.h
index 000c0e6..36abe47 100644
--- a/xfa/fxfa/cxfa_readynodeiterator.h
+++ b/xfa/fxfa/cxfa_readynodeiterator.h
@@ -8,12 +8,14 @@
#define XFA_FXFA_CXFA_READYNODEITERATOR_H_
#include "core/fxcrt/unowned_ptr.h"
-#include "v8/include/cppgc/persistent.h"
+#include "v8/include/cppgc/macros.h"
#include "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h"
class CXFA_Node;
class CXFA_ReadyNodeIterator {
+ CPPGC_STACK_ALLOCATED(); // Allow Raw/Unowned pointers.
+
public:
explicit CXFA_ReadyNodeIterator(CXFA_Node* pTravelRoot);
~CXFA_ReadyNodeIterator();
@@ -23,7 +25,7 @@
private:
CXFA_ContainerIterator m_ContentIterator;
- cppgc::Persistent<CXFA_Node> m_pCurNode;
+ UnownedPtr<CXFA_Node> m_pCurNode;
};
#endif // XFA_FXFA_CXFA_READYNODEITERATOR_H_