Break off parts of CXFA_ItemLayoutProcessor::GotoNextContainerNode().

Put them into their own methods. Also reorder the parameters for
GotoNextContainerNode() so in-params are first.

Change-Id: Ibda8879314f304a27f6e6701bc74ac0ed3b35e60
Reviewed-on: https://pdfium-review.googlesource.com/c/47278
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index 092f802..007481a 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -833,15 +833,15 @@
 }
 
 void CXFA_ItemLayoutProcessor::GotoNextContainerNodeSimple(bool bUsePageBreak) {
-  GotoNextContainerNode(&m_pCurChildNode, &m_nCurChildNodeStage, GetFormNode(),
-                        bUsePageBreak);
+  GotoNextContainerNode(bUsePageBreak, GetFormNode(), &m_pCurChildNode,
+                        &m_nCurChildNodeStage);
 }
 
 void CXFA_ItemLayoutProcessor::GotoNextContainerNode(
-    CXFA_Node** pCurActionNode,
-    XFA_ItemLayoutProcessorStages* nCurStage,
+    bool bUsePageBreak,
     CXFA_Node* pParentContainer,
-    bool bUsePageBreak) {
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
   CXFA_Node* pChildContainer = nullptr;
   switch (*nCurStage) {
     case XFA_ItemLayoutProcessorStages::BreakBefore:
@@ -859,77 +859,51 @@
   }
 
   switch (*nCurStage) {
-    case XFA_ItemLayoutProcessorStages::Keep: {
-      CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
-      if (!m_bKeepBreakFinish &&
-          FindBreakNode(pBreakAfterNode, false, pCurActionNode, nCurStage)) {
+    case XFA_ItemLayoutProcessorStages::Keep:
+      if (HandleKeep(pChildContainer->GetFirstChild(), pCurActionNode,
+                     nCurStage)) {
         return;
       }
       goto CheckNextChildContainer;
-    }
-    case XFA_ItemLayoutProcessorStages::None: {
+
+    case XFA_ItemLayoutProcessorStages::None:
       *pCurActionNode = nullptr;
       FALLTHROUGH;
-      case XFA_ItemLayoutProcessorStages::BookendLeader:
-        for (CXFA_Node* pBookendNode = *pCurActionNode
-                                           ? (*pCurActionNode)->GetNextSibling()
-                                           : pParentContainer->GetFirstChild();
-             pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
-          switch (pBookendNode->GetElementType()) {
-            case XFA_Element::Bookend:
-            case XFA_Element::Break:
-              *pCurActionNode = pBookendNode;
-              *nCurStage = XFA_ItemLayoutProcessorStages::BookendLeader;
-              return;
-            default:
-              break;
-          }
+
+    case XFA_ItemLayoutProcessorStages::BookendLeader:
+      if (HandleBookendLeader(pParentContainer, pCurActionNode, nCurStage))
+        return;
+
+      *pCurActionNode = nullptr;
+      FALLTHROUGH;
+
+    case XFA_ItemLayoutProcessorStages::BreakBefore:
+      if (*pCurActionNode) {
+        CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
+        if (!m_bKeepBreakFinish &&
+            FindBreakNode(pBreakBeforeNode, true, pCurActionNode, nCurStage)) {
+          return;
         }
-    }
-      {
-        *pCurActionNode = nullptr;
-        FALLTHROUGH;
-        case XFA_ItemLayoutProcessorStages::BreakBefore:
-          if (*pCurActionNode) {
-            CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
-            if (!m_bKeepBreakFinish &&
-                FindBreakNode(pBreakBeforeNode, true, pCurActionNode,
-                              nCurStage)) {
-              return;
-            }
-            if (m_bIsProcessKeep) {
-              if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage,
-                                                 pChildContainer)) {
-                return;
-              }
-              goto CheckNextChildContainer;
-            }
-            *pCurActionNode = pChildContainer;
-            *nCurStage = XFA_ItemLayoutProcessorStages::Container;
+        if (m_bIsProcessKeep) {
+          if (ProcessKeepNodesForBreakBefore(pCurActionNode, nCurStage,
+                                             pChildContainer)) {
             return;
           }
           goto CheckNextChildContainer;
+        }
+        *pCurActionNode = pChildContainer;
+        *nCurStage = XFA_ItemLayoutProcessorStages::Container;
+        return;
       }
-    case XFA_ItemLayoutProcessorStages::Container: {
+      goto CheckNextChildContainer;
+
+    case XFA_ItemLayoutProcessorStages::Container:
       *pCurActionNode = nullptr;
       FALLTHROUGH;
-      case XFA_ItemLayoutProcessorStages::BreakAfter: {
-        if (*pCurActionNode) {
-          CXFA_Node* pBreakAfterNode = (*pCurActionNode)->GetNextSibling();
-          if (FindBreakNode(pBreakAfterNode, false, pCurActionNode,
-                            nCurStage)) {
-            return;
-          }
-        } else {
-          CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
-          if (!m_bKeepBreakFinish && FindBreakNode(pBreakAfterNode, false,
-                                                   pCurActionNode, nCurStage)) {
-            return;
-          }
-        }
-        goto CheckNextChildContainer;
-      }
-    }
+
+    case XFA_ItemLayoutProcessorStages::BreakAfter:
+      if (HandleBreakAfter(pChildContainer, pCurActionNode, nCurStage))
+        return;
 
     CheckNextChildContainer : {
       CXFA_Node* pNextChildContainer =
@@ -965,25 +939,14 @@
       *pCurActionNode = nullptr;
       FALLTHROUGH;
       case XFA_ItemLayoutProcessorStages::BookendTrailer:
-        for (CXFA_Node* pBookendNode = *pCurActionNode
-                                           ? (*pCurActionNode)->GetNextSibling()
-                                           : pParentContainer->GetFirstChild();
-             pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
-          switch (pBookendNode->GetElementType()) {
-            case XFA_Element::Bookend:
-            case XFA_Element::Break:
-              *pCurActionNode = pBookendNode;
-              *nCurStage = XFA_ItemLayoutProcessorStages::BookendTrailer;
-              return;
-            default:
-              break;
-          }
-        }
+        if (HandleBookendTrailer(pParentContainer, pCurActionNode, nCurStage))
+          return;
     }
       FALLTHROUGH;
     default:
       *pCurActionNode = nullptr;
       *nCurStage = XFA_ItemLayoutProcessorStages::Done;
+      break;
   }
 }
 
@@ -1050,10 +1013,10 @@
   XFA_ItemLayoutProcessorStages nCurChildNodeStage =
       XFA_ItemLayoutProcessorStages::None;
   CXFA_LayoutItem* pBeforeItem = nullptr;
-  for (GotoNextContainerNode(&pCurChildNode, &nCurChildNodeStage, pFormNode,
-                             false);
-       pCurChildNode; GotoNextContainerNode(&pCurChildNode, &nCurChildNodeStage,
-                                            pFormNode, false)) {
+  for (GotoNextContainerNode(false, pFormNode, &pCurChildNode,
+                             &nCurChildNodeStage);
+       pCurChildNode; GotoNextContainerNode(false, pFormNode, &pCurChildNode,
+                                            &nCurChildNodeStage)) {
     if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
       continue;
     if (pCurChildNode->GetElementType() == XFA_Element::Variables)
@@ -2790,3 +2753,66 @@
   }
   return XFA_ItemLayoutProcessorResult::PageFullBreak;
 }
+
+bool CXFA_ItemLayoutProcessor::HandleKeep(
+    CXFA_Node* pBreakAfterNode,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  return !m_bKeepBreakFinish &&
+         FindBreakNode(pBreakAfterNode, false, pCurActionNode, nCurStage);
+}
+
+bool CXFA_ItemLayoutProcessor::HandleBookendLeader(
+    CXFA_Node* pParentContainer,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  for (CXFA_Node* pBookendNode = *pCurActionNode
+                                     ? (*pCurActionNode)->GetNextSibling()
+                                     : pParentContainer->GetFirstChild();
+       pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
+    switch (pBookendNode->GetElementType()) {
+      case XFA_Element::Bookend:
+      case XFA_Element::Break:
+        *pCurActionNode = pBookendNode;
+        *nCurStage = XFA_ItemLayoutProcessorStages::BookendLeader;
+        return true;
+      default:
+        break;
+    }
+  }
+  return false;
+}
+
+bool CXFA_ItemLayoutProcessor::HandleBreakAfter(
+    CXFA_Node* pChildContainer,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  if (*pCurActionNode) {
+    CXFA_Node* pBreakAfterNode = (*pCurActionNode)->GetNextSibling();
+    return FindBreakNode(pBreakAfterNode, false, pCurActionNode, nCurStage);
+  }
+
+  CXFA_Node* pBreakAfterNode = pChildContainer->GetFirstChild();
+  return HandleKeep(pBreakAfterNode, pCurActionNode, nCurStage);
+}
+
+bool CXFA_ItemLayoutProcessor::HandleBookendTrailer(
+    CXFA_Node* pParentContainer,
+    CXFA_Node** pCurActionNode,
+    XFA_ItemLayoutProcessorStages* nCurStage) {
+  for (CXFA_Node* pBookendNode = *pCurActionNode
+                                     ? (*pCurActionNode)->GetNextSibling()
+                                     : pParentContainer->GetFirstChild();
+       pBookendNode; pBookendNode = pBookendNode->GetNextSibling()) {
+    switch (pBookendNode->GetElementType()) {
+      case XFA_Element::Bookend:
+      case XFA_Element::Break:
+        *pCurActionNode = pBookendNode;
+        *nCurStage = XFA_ItemLayoutProcessorStages::BookendTrailer;
+        return true;
+      default:
+        break;
+    }
+  }
+  return false;
+}
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
index 272e93a..571a55e 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
@@ -120,10 +120,10 @@
   void DoLayoutField();
 
   void GotoNextContainerNodeSimple(bool bUsePageBreak);
-  void GotoNextContainerNode(CXFA_Node** pCurActionNode,
-                             XFA_ItemLayoutProcessorStages* nCurStage,
+  void GotoNextContainerNode(bool bUsePageBreak,
                              CXFA_Node* pParentContainer,
-                             bool bUsePageBreak);
+                             CXFA_Node** pCurActionNode,
+                             XFA_ItemLayoutProcessorStages* nCurStage);
 
   bool ProcessKeepNodesForCheckNext(CXFA_Node** pCurActionNode,
                                     XFA_ItemLayoutProcessorStages* nCurStage,
@@ -163,6 +163,19 @@
       CXFA_LayoutContext* pLayoutContext,
       bool bNewRow);
 
+  bool HandleKeep(CXFA_Node* pBreakAfterNode,
+                  CXFA_Node** pCurActionNode,
+                  XFA_ItemLayoutProcessorStages* nCurStage);
+  bool HandleBookendLeader(CXFA_Node* pParentContainer,
+                           CXFA_Node** pCurActionNode,
+                           XFA_ItemLayoutProcessorStages* nCurStage);
+  bool HandleBreakAfter(CXFA_Node* pChildContainer,
+                        CXFA_Node** pCurActionNode,
+                        XFA_ItemLayoutProcessorStages* nCurStage);
+  bool HandleBookendTrailer(CXFA_Node* pParentContainer,
+                            CXFA_Node** pCurActionNode,
+                            XFA_ItemLayoutProcessorStages* nCurStage);
+
   CXFA_Node* m_pFormNode;
   CXFA_ContentLayoutItem* m_pLayoutItem = nullptr;
   CXFA_Node* m_pCurChildNode = nullptr;