Remove CXFA_TraverseStrategy_ContentLayoutItem.

It makes illegal casts and requires its callers to double-check the
type validity of results before use. Instead, use the parent
class iterator and perform checked casts.

No functional difference, since it looks like the requisite checks
were being made in all places.

Make one "using" visible to other files to save some verbosity.

Change-Id: I894ca15b4bdddd4723b787663950a58bc58b7f06
Reviewed-on: https://pdfium-review.googlesource.com/39030
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/BUILD.gn b/BUILD.gn
index 09cf285..24dfd1d 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -2759,7 +2759,6 @@
       "xfa/fxfa/parser/cxfa_traverse.cpp",
       "xfa/fxfa/parser/cxfa_traverse.h",
       "xfa/fxfa/parser/cxfa_traversestrategy_contentareacontainerlayoutitem.h",
-      "xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h",
       "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h",
       "xfa/fxfa/parser/cxfa_traversestrategy_xfacontainernode.h",
       "xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h",
diff --git a/fxjs/xfa/cjx_layoutpseudomodel.cpp b/fxjs/xfa/cjx_layoutpseudomodel.cpp
index 4918349..ea842c7 100644
--- a/fxjs/xfa/cjx_layoutpseudomodel.cpp
+++ b/fxjs/xfa/cjx_layoutpseudomodel.cpp
@@ -24,7 +24,7 @@
 #include "xfa/fxfa/parser/cxfa_measurement.h"
 #include "xfa/fxfa/parser/cxfa_node.h"
 #include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
-#include "xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h"
+#include "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h"
 
 const CJX_MethodSpec CJX_LayoutPseudoModel::MethodSpecs[] = {
     {"absPage", absPage_static},
@@ -244,14 +244,13 @@
       if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea) {
         retArray.push_back(pItem->GetFormNode());
         if (!bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator(static_cast<CXFA_ContentLayoutItem*>(pItem->m_pFirstChild));
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem()) {
+          CXFA_LayoutItemIterator iterator(pItem->m_pFirstChild);
+          for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
+               pChild = iterator.MoveToNext()) {
+            CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
+            if (!pItemChild)
               continue;
-            }
+
             XFA_Element eType = pItemChild->GetFormNode()->GetElementType();
             if (eType != XFA_Element::Field && eType != XFA_Element::Draw &&
                 eType != XFA_Element::Subform && eType != XFA_Element::Area) {
@@ -266,14 +265,13 @@
         }
       } else {
         if (bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator(static_cast<CXFA_ContentLayoutItem*>(pItem));
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem()) {
+          CXFA_LayoutItemIterator iterator(pItem);
+          for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
+               pChild = iterator.MoveToNext()) {
+            CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
+            if (!pItemChild)
               continue;
-            }
+
             XFA_Element eType = pItemChild->GetFormNode()->GetElementType();
             if (eType != XFA_Element::Field && eType != XFA_Element::Draw &&
                 eType != XFA_Element::Subform && eType != XFA_Element::Area) {
@@ -281,6 +279,7 @@
             }
             if (pdfium::ContainsValue(formItems, pItemChild->GetFormNode()))
               continue;
+
             formItems.insert(pItemChild->GetFormNode());
             retArray.push_back(pItemChild->GetFormNode());
           }
@@ -305,12 +304,11 @@
          pItem = pItem->m_pNextSibling) {
       if (pItem->GetFormNode()->GetElementType() == XFA_Element::ContentArea) {
         if (!bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator(static_cast<CXFA_ContentLayoutItem*>(pItem->m_pFirstChild));
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem())
+          CXFA_LayoutItemIterator iterator(pItem->m_pFirstChild);
+          for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
+               pChild = iterator.MoveToNext()) {
+            CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
+            if (!pItemChild)
               continue;
             if (pItemChild->GetFormNode()->GetElementType() != eType)
               continue;
@@ -323,12 +321,11 @@
         }
       } else {
         if (bOnPageArea) {
-          CXFA_NodeIteratorTemplate<CXFA_ContentLayoutItem,
-                                    CXFA_TraverseStrategy_ContentLayoutItem>
-          iterator(static_cast<CXFA_ContentLayoutItem*>(pItem));
-          for (CXFA_ContentLayoutItem* pItemChild = iterator.GetCurrent();
-               pItemChild; pItemChild = iterator.MoveToNext()) {
-            if (!pItemChild->IsContentLayoutItem())
+          CXFA_LayoutItemIterator iterator(pItem);
+          for (CXFA_LayoutItem* pChild = iterator.GetCurrent(); pChild;
+               pChild = iterator.MoveToNext()) {
+            CXFA_ContentLayoutItem* pItemChild = pChild->AsContentLayoutItem();
+            if (!pItemChild)
               continue;
             if (pItemChild->GetFormNode()->GetElementType() != eType)
               continue;
diff --git a/xfa/fxfa/cxfa_ffpageview.h b/xfa/fxfa/cxfa_ffpageview.h
index f3ae069..daf2b19 100644
--- a/xfa/fxfa/cxfa_ffpageview.h
+++ b/xfa/fxfa/cxfa_ffpageview.h
@@ -12,7 +12,6 @@
 
 #include "xfa/fxfa/parser/cxfa_containerlayoutitem.h"
 #include "xfa/fxfa/parser/cxfa_contentlayoutitem.h"
-#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
 #include "xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h"
 
 class CXFA_FFWidget;
@@ -34,10 +33,6 @@
   UnownedPtr<CXFA_FFDocView> const m_pDocView;
 };
 
-using CXFA_LayoutItemIterator =
-    CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
-                              CXFA_TraverseStrategy_LayoutItem>;
-
 class CXFA_FFPageWidgetIterator : public IXFA_WidgetIterator {
  public:
   CXFA_FFPageWidgetIterator(CXFA_FFPageView* pPageView, uint32_t dwFilter);
diff --git a/xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h b/xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h
deleted file mode 100644
index de0d52a..0000000
--- a/xfa/fxfa/parser/cxfa_traversestrategy_contentlayoutitem.h
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright 2016 PDFium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
-
-#ifndef XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_CONTENTLAYOUTITEM_H_
-#define XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_CONTENTLAYOUTITEM_H_
-
-#include "xfa/fxfa/parser/cxfa_contentlayoutitem.h"
-
-class CXFA_TraverseStrategy_ContentLayoutItem {
- public:
-  static CXFA_ContentLayoutItem* GetFirstChild(
-      CXFA_ContentLayoutItem* pLayoutItem) {
-    return static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pFirstChild);
-  }
-
-  static CXFA_ContentLayoutItem* GetNextSibling(
-      CXFA_ContentLayoutItem* pLayoutItem) {
-    return static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pNextSibling);
-  }
-
-  static CXFA_ContentLayoutItem* GetParent(
-      CXFA_ContentLayoutItem* pLayoutItem) {
-    return static_cast<CXFA_ContentLayoutItem*>(pLayoutItem->m_pParent);
-  }
-};
-
-#endif  // XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_CONTENTLAYOUTITEM_H_
diff --git a/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h b/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h
index 7b39826..0371eef 100644
--- a/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h
+++ b/xfa/fxfa/parser/cxfa_traversestrategy_layoutitem.h
@@ -8,6 +8,7 @@
 #define XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_LAYOUTITEM_H_
 
 #include "xfa/fxfa/parser/cxfa_layoutitem.h"
+#include "xfa/fxfa/parser/cxfa_nodeiteratortemplate.h"
 
 class CXFA_TraverseStrategy_LayoutItem {
  public:
@@ -22,4 +23,8 @@
   }
 };
 
+using CXFA_LayoutItemIterator =
+    CXFA_NodeIteratorTemplate<CXFA_LayoutItem,
+                              CXFA_TraverseStrategy_LayoutItem>;
+
 #endif  // XFA_FXFA_PARSER_CXFA_TRAVERSESTRATEGY_LAYOUTITEM_H_