Use fxgc::ContainerTrace<> in XFA.

-- Convert some deque to list, willing to give up a bit of
   performance for simplicity.

Change-Id: I2daa8bf8381cdad40db479a5381b79632dcbd838
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/73291
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 673c387..13abb3a 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "core/fxcrt/fx_extension.h"
+#include "fxjs/gc/container_trace.h"
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/stl_util.h"
@@ -66,21 +67,11 @@
   visitor->Trace(m_pDoc);
   visitor->Trace(m_pWidgetHandler);
   visitor->Trace(m_pFocusNode);
-
-  for (const auto& node : m_ValidateNodes)
-    visitor->Trace(node);
-
-  for (const auto& node : m_CalculateNodes)
-    visitor->Trace(node);
-
-  for (const auto& node : m_NewAddedNodes)
-    visitor->Trace(node);
-
-  for (const auto& node : m_BindItems)
-    visitor->Trace(node);
-
-  for (const auto& node : m_IndexChangedSubforms)
-    visitor->Trace(node);
+  ContainerTrace(visitor, m_ValidateNodes);
+  ContainerTrace(visitor, m_CalculateNodes);
+  ContainerTrace(visitor, m_NewAddedNodes);
+  ContainerTrace(visitor, m_BindItems);
+  ContainerTrace(visitor, m_IndexChangedSubforms);
 }
 
 void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) {
diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h
index fb39592..74bd34c 100644
--- a/xfa/fxfa/cxfa_ffdocview.h
+++ b/xfa/fxfa/cxfa_ffdocview.h
@@ -7,7 +7,7 @@
 #ifndef XFA_FXFA_CXFA_FFDOCVIEW_H_
 #define XFA_FXFA_CXFA_FFDOCVIEW_H_
 
-#include <deque>
+#include <list>
 #include <memory>
 #include <vector>
 
@@ -126,11 +126,11 @@
   cppgc::Member<CXFA_FFWidgetHandler> m_pWidgetHandler;
   cppgc::Member<CXFA_Node> m_pFocusNode;
   ObservedPtr<CXFA_FFWidget> m_pFocusWidget;
-  std::deque<cppgc::Member<CXFA_Node>> m_ValidateNodes;
+  std::list<cppgc::Member<CXFA_Node>> m_ValidateNodes;
   std::vector<cppgc::Member<CXFA_Node>> m_CalculateNodes;
-  std::deque<cppgc::Member<CXFA_BindItems>> m_BindItems;
-  std::deque<cppgc::Member<CXFA_Node>> m_NewAddedNodes;
-  std::deque<cppgc::Member<CXFA_Node>> m_IndexChangedSubforms;
+  std::list<cppgc::Member<CXFA_BindItems>> m_BindItems;
+  std::list<cppgc::Member<CXFA_Node>> m_NewAddedNodes;
+  std::list<cppgc::Member<CXFA_Node>> m_IndexChangedSubforms;
   XFA_DOCVIEW_LAYOUTSTATUS m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
   int32_t m_iLock = 0;
 };
diff --git a/xfa/fxfa/cxfa_ffpageview.cpp b/xfa/fxfa/cxfa_ffpageview.cpp
index 5db297a..367e5ec 100644
--- a/xfa/fxfa/cxfa_ffpageview.cpp
+++ b/xfa/fxfa/cxfa_ffpageview.cpp
@@ -10,6 +10,7 @@
 #include <memory>
 #include <vector>
 
+#include "fxjs/gc/container_trace.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/stl_util.h"
 #include "xfa/fxfa/cxfa_ffcheckbutton.h"
@@ -273,8 +274,7 @@
 
 void CXFA_FFTabOrderPageWidgetIterator::Trace(cppgc::Visitor* visitor) const {
   visitor->Trace(m_pPageViewLayout);
-  for (const auto& item : m_TabOrderWidgetArray)
-    visitor->Trace(item);
+  ContainerTrace(visitor, m_TabOrderWidgetArray);
 }
 
 void CXFA_FFTabOrderPageWidgetIterator::Reset() {
diff --git a/xfa/fxfa/layout/cxfa_layoutprocessor.cpp b/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
index cb4f7c4..f299f2f 100644
--- a/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutprocessor.cpp
@@ -6,6 +6,7 @@
 
 #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
 
+#include "fxjs/gc/container_trace.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/stl_util.h"
 #include "v8/include/cppgc/heap.h"
@@ -35,8 +36,7 @@
   CXFA_Document::LayoutProcessorIface::Trace(visitor);
   visitor->Trace(m_pViewLayoutProcessor);
   visitor->Trace(m_pContentLayoutProcessor);
-  for (const auto& container : m_rgChangedContainers)
-    visitor->Trace(container);
+  ContainerTrace(visitor, m_rgChangedContainers);
 }
 
 void CXFA_LayoutProcessor::SetForceRelayout(bool bForceRestart) {
diff --git a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
index 349d486..c165ad9 100644
--- a/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_viewlayoutprocessor.cpp
@@ -8,6 +8,7 @@
 
 #include <utility>
 
+#include "fxjs/gc/container_trace.h"
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/stl_util.h"
@@ -369,8 +370,7 @@
   if (m_CurrentViewRecordIter != m_ProposedViewRecords.end())
     visitor->Trace(*m_CurrentViewRecordIter);
 
-  for (const auto& page : m_PageArray)
-    visitor->Trace(page);
+  ContainerTrace(visitor, m_PageArray);
 }
 
 bool CXFA_ViewLayoutProcessor::InitLayoutPage(CXFA_Node* pFormNode) {
diff --git a/xfa/fxfa/parser/cxfa_arraynodelist.cpp b/xfa/fxfa/parser/cxfa_arraynodelist.cpp
index 55c4123..1693732 100644
--- a/xfa/fxfa/parser/cxfa_arraynodelist.cpp
+++ b/xfa/fxfa/parser/cxfa_arraynodelist.cpp
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "fxjs/gc/container_trace.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 
 CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument)
@@ -18,8 +19,7 @@
 
 void CXFA_ArrayNodeList::Trace(cppgc::Visitor* visitor) const {
   CXFA_TreeList::Trace(visitor);
-  for (const auto& node : m_array)
-    visitor->Trace(node);
+  ContainerTrace(visitor, m_array);
 }
 
 void CXFA_ArrayNodeList::SetArrayNodeList(
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index 701a44d..bbdfb43 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -12,6 +12,7 @@
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/xml/cfx_xmldocument.h"
 #include "core/fxcrt/xml/cfx_xmlelement.h"
+#include "fxjs/gc/container_trace.h"
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/compiler_specific.h"
@@ -1298,10 +1299,8 @@
   visitor->Trace(m_pScriptLog);
   visitor->Trace(m_pScriptLayout);
   visitor->Trace(m_pScriptSignature);
-  for (const auto& binding : m_rgGlobalBinding)
-    visitor->Trace(binding.second);
-  for (const auto& pending : m_pPendingPageSet)
-    visitor->Trace(pending);
+  ContainerTrace(visitor, m_rgGlobalBinding);
+  ContainerTrace(visitor, m_pPendingPageSet);
 }
 
 void CXFA_Document::ClearLayoutData() {
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 6ea77d7..22fbc96 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -23,6 +23,7 @@
 #include "core/fxcrt/xml/cfx_xmltext.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
 #include "core/fxge/fx_font.h"
+#include "fxjs/gc/container_trace.h"
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cfxjse_value.h"
 #include "fxjs/xfa/cjx_node.h"
@@ -1003,8 +1004,7 @@
   CXFA_Object::Trace(visitor);
   GCedTreeNodeMixin<CXFA_Node>::Trace(visitor);
   visitor->Trace(m_pAuxNode);
-  for (const auto& node : binding_nodes_)
-    visitor->Trace(node);
+  ContainerTrace(visitor, binding_nodes_);
   visitor->Trace(m_pLayoutData);
   visitor->Trace(ui_);
 }
diff --git a/xfa/fxfa/parser/cxfa_nodeowner.cpp b/xfa/fxfa/parser/cxfa_nodeowner.cpp
index 1126db4..390bb65 100644
--- a/xfa/fxfa/parser/cxfa_nodeowner.cpp
+++ b/xfa/fxfa/parser/cxfa_nodeowner.cpp
@@ -8,6 +8,7 @@
 
 #include <utility>
 
+#include "fxjs/gc/container_trace.h"
 #include "xfa/fxfa/parser/cxfa_list.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 
@@ -16,8 +17,7 @@
 CXFA_NodeOwner::~CXFA_NodeOwner() = default;
 
 void CXFA_NodeOwner::Trace(cppgc::Visitor* visitor) const {
-  for (const auto& list : lists_)
-    visitor->Trace(list);
+  ContainerTrace(visitor, lists_);
 }
 
 void CXFA_NodeOwner::PersistList(CXFA_List* list) {