Make CXFA_FFPageWidgetIterator CPPGC_STACK_ALLOCATED

This is necessary because it contains the field m_sIterator which
has a CPPGC_STACK_ALLOCATED type.

Change-Id: I1accc7b0c736999f3a174774411ff3c56c8b700b
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/104450
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/fpdfsdk/cpdfsdk_pageview.cpp b/fpdfsdk/cpdfsdk_pageview.cpp
index 4c82e7f..1bbaeeb 100644
--- a/fpdfsdk/cpdfsdk_pageview.cpp
+++ b/fpdfsdk/cpdfsdk_pageview.cpp
@@ -543,11 +543,11 @@
   CPDF_Document::Extension* pContext = m_pFormFillEnv->GetDocExtension();
   if (pContext && pContext->ContainsExtensionFullForm()) {
     CXFA_FFPageView* pageView = protector->GetXFAPageView();
-    CXFA_FFWidget::IteratorIface* pWidgetHandler =
-        pageView->CreateGCedFormWidgetIterator(Mask<XFA_WidgetStatus>{
-            XFA_WidgetStatus::kVisible, XFA_WidgetStatus::kViewable});
+    CXFA_FFPageWidgetIterator pWidgetHandler(
+        pageView, Mask<XFA_WidgetStatus>{XFA_WidgetStatus::kVisible,
+                                         XFA_WidgetStatus::kViewable});
 
-    while (CXFA_FFWidget* pXFAAnnot = pWidgetHandler->MoveToNext()) {
+    while (CXFA_FFWidget* pXFAAnnot = pWidgetHandler.MoveToNext()) {
       m_SDKAnnotArray.push_back(
           std::make_unique<CPDFXFA_Widget>(pXFAAnnot, this));
       m_SDKAnnotArray.back()->OnLoad();
diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
index 93eae67..6f4f2b7 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_page.cpp
@@ -271,12 +271,11 @@
   CXFA_FFWidgetHandler* pWidgetHandler = pDocView->GetWidgetHandler();
   if (!pWidgetHandler)
     return -1;
-
-  CXFA_FFWidget::IteratorIface* pWidgetIterator =
-      pPageView->CreateGCedFormWidgetIterator(XFA_WidgetStatus::kViewable);
+  CXFA_FFPageWidgetIterator pWidgetIterator(pPageView,
+                                            XFA_WidgetStatus::kViewable);
 
   CXFA_FFWidget* pXFAAnnot;
-  while ((pXFAAnnot = pWidgetIterator->MoveToNext()) != nullptr) {
+  while ((pXFAAnnot = pWidgetIterator.MoveToNext()) != nullptr) {
     if (pXFAAnnot->GetFormFieldType() == FormFieldType::kXFA)
       continue;
 
@@ -298,12 +297,12 @@
   gs.SetClipRect(rectClip);
 
   CXFA_FFPageView* xfaView = GetXFAPageView();
-  CXFA_FFWidget::IteratorIface* pWidgetIterator =
-      xfaView->CreateGCedFormWidgetIterator(Mask<XFA_WidgetStatus>{
-          XFA_WidgetStatus::kVisible, XFA_WidgetStatus::kViewable});
+  CXFA_FFPageWidgetIterator pWidgetIterator(
+      xfaView, Mask<XFA_WidgetStatus>{XFA_WidgetStatus::kVisible,
+                                      XFA_WidgetStatus::kViewable});
 
   while (true) {
-    CXFA_FFWidget* pWidget = pWidgetIterator->MoveToNext();
+    CXFA_FFWidget* pWidget = pWidgetIterator.MoveToNext();
     if (!pWidget)
       break;
 
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 47d0a4c..5549bfb 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -261,13 +261,6 @@
   return GetPageMatrix(CFX_RectF(0, 0, pItem->GetPageSize()), rtDisp, iRotate);
 }
 
-CXFA_FFWidget::IteratorIface* CXFA_FFPageView::CreateGCedFormWidgetIterator(
-    Mask<XFA_WidgetStatus> dwWidgetFilter) {
-  return cppgc::MakeGarbageCollected<CXFA_FFPageWidgetIterator>(
-      GetDocView()->GetDoc()->GetHeap()->GetAllocationHandle(), this,
-      dwWidgetFilter);
-}
-
 CXFA_FFWidget::IteratorIface* CXFA_FFPageView::CreateGCedTraverseWidgetIterator(
     Mask<XFA_WidgetStatus> dwWidgetFilter) {
   return cppgc::MakeGarbageCollected<CXFA_FFTabOrderPageWidgetIterator>(
diff --git a/xfa/fxfa/cxfa_ffpageview.h b/xfa/fxfa/cxfa_ffpageview.h
index 214e1f2..9af01c0 100644
--- a/xfa/fxfa/cxfa_ffpageview.h
+++ b/xfa/fxfa/cxfa_ffpageview.h
@@ -37,9 +37,7 @@
   CFX_RectF GetPageViewRect() const;
   CFX_Matrix GetDisplayMatrix(const FX_RECT& rtDisp, int32_t iRotate) const;
 
-  // These always return a non-null iterator from the gc heap.
-  CXFA_FFWidget::IteratorIface* CreateGCedFormWidgetIterator(
-      Mask<XFA_WidgetStatus> dwWidgetFilter);
+  // This always returns a non-null iterator from the gc heap.
   CXFA_FFWidget::IteratorIface* CreateGCedTraverseWidgetIterator(
       Mask<XFA_WidgetStatus> dwWidgetFilter);
 
@@ -51,11 +49,12 @@
   cppgc::Member<CXFA_ViewLayoutItem> m_pLayoutItem;
 };
 
-class CXFA_FFPageWidgetIterator final
-    : public cppgc::GarbageCollected<CXFA_FFPageWidgetIterator>,
-      public CXFA_FFWidget::IteratorIface {
+class CXFA_FFPageWidgetIterator final : public CXFA_FFWidget::IteratorIface {
+  CPPGC_STACK_ALLOCATED();
+
  public:
-  CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
+  CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
+                            Mask<XFA_WidgetStatus> dwFilter);
   ~CXFA_FFPageWidgetIterator() override;
 
   void Trace(cppgc::Visitor* visitor) const {}
@@ -69,9 +68,6 @@
   bool SetCurrentWidget(CXFA_FFWidget* hWidget) override;
 
  private:
-  CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView,
-                            Mask<XFA_WidgetStatus> dwFilter);
-
   CXFA_LayoutItemIterator m_sIterator;
   const Mask<XFA_WidgetStatus> m_dwFilter;
   const bool m_bIgnoreRelevant;