diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index 27e8df2..7327010 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -390,7 +390,7 @@
   return false;
 }
 
-Optional<XFA_ItemLayoutProcessorStages> FindBreakNode(
+Optional<CXFA_ItemLayoutProcessor::Stage> FindBreakNode(
     CXFA_Node* pContainerNode,
     bool bBreakBefore,
     CXFA_Node** pCurActionNode) {
@@ -405,14 +405,14 @@
           break;
 
         *pCurActionNode = pBreakNode;
-        return XFA_ItemLayoutProcessorStages::BreakBefore;
+        return CXFA_ItemLayoutProcessor::Stage::kBreakBefore;
       }
       case XFA_Element::BreakAfter: {
         if (bBreakBefore)
           break;
 
         *pCurActionNode = pBreakNode;
-        return XFA_ItemLayoutProcessorStages::BreakAfter;
+        return CXFA_ItemLayoutProcessor::Stage::kBreakAfter;
       }
       case XFA_Element::Break:
         if (pBreakNode->JSObject()->GetEnum(eAttributeType) ==
@@ -421,8 +421,8 @@
         }
 
         *pCurActionNode = pBreakNode;
-        return bBreakBefore ? XFA_ItemLayoutProcessorStages::BreakBefore
-                            : XFA_ItemLayoutProcessorStages::BreakAfter;
+        return bBreakBefore ? CXFA_ItemLayoutProcessor::Stage::kBreakBefore
+                            : CXFA_ItemLayoutProcessor::Stage::kBreakAfter;
       default:
         break;
     }
@@ -801,7 +801,7 @@
     pLayoutItem->m_pNextSibling = nullptr;
   }
 
-  if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done ||
+  if (m_nCurChildNodeStage != Stage::kDone ||
       !ToContentLayoutItem(m_pOldLayoutItem)) {
     return pLayoutItem;
   }
@@ -829,20 +829,20 @@
       m_nCurChildNodeStage, bUsePageBreak, GetFormNode(), &m_pCurChildNode);
 }
 
-XFA_ItemLayoutProcessorStages CXFA_ItemLayoutProcessor::GotoNextContainerNode(
-    XFA_ItemLayoutProcessorStages nCurStage,
+CXFA_ItemLayoutProcessor::Stage CXFA_ItemLayoutProcessor::GotoNextContainerNode(
+    Stage nCurStage,
     bool bUsePageBreak,
     CXFA_Node* pParentContainer,
     CXFA_Node** pCurActionNode) {
   CXFA_Node* pChildContainer = nullptr;
   switch (nCurStage) {
-    case XFA_ItemLayoutProcessorStages::BreakBefore:
-    case XFA_ItemLayoutProcessorStages::BreakAfter: {
+    case Stage::kBreakBefore:
+    case Stage::kBreakAfter: {
       pChildContainer = (*pCurActionNode)->GetParent();
       break;
     }
-    case XFA_ItemLayoutProcessorStages::Keep:
-    case XFA_ItemLayoutProcessorStages::Container:
+    case Stage::kKeep:
+    case Stage::kContainer:
       pChildContainer = *pCurActionNode;
       break;
     default:
@@ -850,19 +850,19 @@
       break;
   }
 
-  Optional<XFA_ItemLayoutProcessorStages> ret;
+  Optional<Stage> ret;
   switch (nCurStage) {
-    case XFA_ItemLayoutProcessorStages::Keep:
+    case Stage::kKeep:
       ret = HandleKeep(pChildContainer->GetFirstChild(), pCurActionNode);
       if (ret.has_value())
         return ret.value();
       goto CheckNextChildContainer;
 
-    case XFA_ItemLayoutProcessorStages::None:
+    case Stage::kNone:
       *pCurActionNode = nullptr;
       FALLTHROUGH;
 
-    case XFA_ItemLayoutProcessorStages::BookendLeader:
+    case Stage::kBookendLeader:
       ret = HandleBookendLeader(pParentContainer, pCurActionNode);
       if (ret.has_value())
         return ret.value();
@@ -870,7 +870,7 @@
       *pCurActionNode = nullptr;
       FALLTHROUGH;
 
-    case XFA_ItemLayoutProcessorStages::BreakBefore:
+    case Stage::kBreakBefore:
       if (*pCurActionNode) {
         CXFA_Node* pBreakBeforeNode = (*pCurActionNode)->GetNextSibling();
         if (!m_bKeepBreakFinish) {
@@ -885,15 +885,15 @@
           goto CheckNextChildContainer;
         }
         *pCurActionNode = pChildContainer;
-        return XFA_ItemLayoutProcessorStages::Container;
+        return Stage::kContainer;
       }
       goto CheckNextChildContainer;
 
-    case XFA_ItemLayoutProcessorStages::Container:
+    case Stage::kContainer:
       *pCurActionNode = nullptr;
       FALLTHROUGH;
 
-    case XFA_ItemLayoutProcessorStages::BreakAfter:
+    case Stage::kBreakAfter:
       ret = HandleBreakAfter(pChildContainer, pCurActionNode);
       if (ret.has_value())
         return ret.value();
@@ -924,14 +924,13 @@
           return ret.value();
       }
       *pCurActionNode = pNextChildContainer;
-      return m_bIsProcessKeep ? XFA_ItemLayoutProcessorStages::Keep
-                              : XFA_ItemLayoutProcessorStages::Container;
+      return m_bIsProcessKeep ? Stage::kKeep : Stage::kContainer;
     }
 
     NoMoreChildContainer : {
       *pCurActionNode = nullptr;
       FALLTHROUGH;
-      case XFA_ItemLayoutProcessorStages::BookendTrailer:
+      case Stage::kBookendTrailer:
         ret = HandleBookendTrailer(pParentContainer, pCurActionNode);
         if (ret.has_value())
           return ret.value();
@@ -939,11 +938,11 @@
       FALLTHROUGH;
     default:
       *pCurActionNode = nullptr;
-      return XFA_ItemLayoutProcessorStages::Done;
+      return Stage::kDone;
   }
 }
 
-Optional<XFA_ItemLayoutProcessorStages>
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::ProcessKeepNodesForCheckNext(
     CXFA_Node** pCurActionNode,
     CXFA_Node** pNextContainer,
@@ -974,7 +973,7 @@
     return {};
   }
 
-  Optional<XFA_ItemLayoutProcessorStages> ret =
+  Optional<Stage> ret =
       FindBreakNode((*pNextContainer)->GetFirstChild(), true, pCurActionNode);
   if (!ret.has_value()) {
     *pNextContainer = m_pKeepHeadNode;
@@ -985,14 +984,14 @@
   return ret;
 }
 
-Optional<XFA_ItemLayoutProcessorStages>
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::ProcessKeepNodesForBreakBefore(
     CXFA_Node** pCurActionNode,
     CXFA_Node* pContainerNode) {
   if (m_pKeepTailNode == pContainerNode) {
     *pCurActionNode = m_pKeepHeadNode;
     ProcessKeepNodesEnd();
-    return XFA_ItemLayoutProcessorStages::Container;
+    return Stage::kContainer;
   }
 
   CXFA_Node* pBreakAfterNode = pContainerNode->GetFirstChild();
@@ -1004,13 +1003,12 @@
   CXFA_Node* pFormNode = pPageAreaLayoutItem->GetFormNode();
   CXFA_Node* pCurChildNode = nullptr;
   CXFA_LayoutItem* pBeforeItem = nullptr;
-  for (XFA_ItemLayoutProcessorStages nCurChildNodeStage =
-           GotoNextContainerNode(XFA_ItemLayoutProcessorStages::None, false,
-                                 pFormNode, &pCurChildNode);
+  for (Stage nCurChildNodeStage = GotoNextContainerNode(
+           Stage::kNone, false, pFormNode, &pCurChildNode);
        pCurChildNode;
        nCurChildNodeStage = GotoNextContainerNode(nCurChildNodeStage, false,
                                                   pFormNode, &pCurChildNode)) {
-    if (nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
+    if (nCurChildNodeStage != Stage::kContainer)
       continue;
     if (pCurChildNode->GetElementType() == XFA_Element::Variables)
       continue;
@@ -1078,7 +1076,7 @@
 
   int32_t iColIndex = 0;
   for (; m_pCurChildNode; GotoNextContainerNodeSimple(false)) {
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
+    if (m_nCurChildNodeStage != Stage::kContainer)
       continue;
     if (m_pCurChildNode->GetElementType() == XFA_Element::Variables)
       continue;
@@ -1216,7 +1214,7 @@
 
   for (; m_pCurChildNode; GotoNextContainerNodeSimple(false)) {
     layoutContext.m_fCurColumnWidth.reset();
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Container)
+    if (m_nCurChildNodeStage != Stage::kContainer)
       continue;
 
     auto pProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
@@ -1600,7 +1598,7 @@
   float fContentCurRowY = 0;
   CXFA_ContentLayoutItem* pLayoutChild = nullptr;
   if (m_pLayoutItem) {
-    if (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done &&
+    if (m_nCurChildNodeStage != Stage::kDone &&
         eFlowStrategy != XFA_AttributeValue::Tb) {
       pLayoutChild = ToContentLayoutItem(m_pLayoutItem->m_pFirstChild);
       for (CXFA_LayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
@@ -1639,20 +1637,19 @@
   }
 
   fContentCurRowY += InsertKeepLayoutItems();
-  if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::None)
+  if (m_nCurChildNodeStage == Stage::kNone)
     GotoNextContainerNodeSimple(true);
 
   fContentCurRowY += InsertPendingItems(GetFormNode());
-  if (m_pCurChildPreprocessor &&
-      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::Container) {
+  if (m_pCurChildPreprocessor && m_nCurChildNodeStage == Stage::kContainer) {
     if (ExistContainerKeep(m_pCurChildPreprocessor->GetFormNode(), false)) {
       m_pKeepHeadNode = m_pCurChildNode;
       m_bIsProcessKeep = true;
-      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Keep;
+      m_nCurChildNodeStage = Stage::kKeep;
     }
   }
 
-  while (m_nCurChildNodeStage != XFA_ItemLayoutProcessorStages::Done) {
+  while (m_nCurChildNodeStage != Stage::kDone) {
     float fContentCurRowHeight = 0;
     float fContentCurRowAvailWidth = fContentWidthLimit;
     m_fWidthLimite = fContentCurRowAvailWidth;
@@ -1720,10 +1717,10 @@
       bool bAddedItemInRow = false;
       fContentCurRowY += InsertPendingItems(GetFormNode());
       switch (m_nCurChildNodeStage) {
-        case XFA_ItemLayoutProcessorStages::Keep:
-        case XFA_ItemLayoutProcessorStages::None:
+        case Stage::kKeep:
+        case Stage::kNone:
           break;
-        case XFA_ItemLayoutProcessorStages::BreakBefore: {
+        case Stage::kBreakBefore: {
           for (auto* item : m_arrayKeepItems) {
             m_pLayoutItem->RemoveChild(item);
             fContentCalculatedHeight -= item->m_sSize.height;
@@ -1767,7 +1764,7 @@
           bIsManualBreak = true;
           goto SuspendAndCreateNewRow;
         }
-        case XFA_ItemLayoutProcessorStages::BreakAfter: {
+        case Stage::kBreakAfter: {
           CXFA_Node* pLeaderNode = nullptr;
           CXFA_Node* pTrailerNode = nullptr;
           bool bCreatePage = false;
@@ -1818,12 +1815,12 @@
           if (bCreatePage) {
             bForceEndPage = true;
             bIsManualBreak = true;
-            if (m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::Done)
+            if (m_nCurChildNodeStage == Stage::kDone)
               bBreakDone = true;
           }
           goto SuspendAndCreateNewRow;
         }
-        case XFA_ItemLayoutProcessorStages::BookendLeader: {
+        case Stage::kBookendLeader: {
           CXFA_Node* pLeaderNode = nullptr;
           if (m_pCurChildPreprocessor) {
             pProcessor.reset(m_pCurChildPreprocessor);
@@ -1851,7 +1848,7 @@
           }
           break;
         }
-        case XFA_ItemLayoutProcessorStages::BookendTrailer: {
+        case Stage::kBookendTrailer: {
           CXFA_Node* pTrailerNode = nullptr;
           if (m_pCurChildPreprocessor) {
             pProcessor.reset(m_pCurChildPreprocessor);
@@ -1878,7 +1875,7 @@
           }
           break;
         }
-        case XFA_ItemLayoutProcessorStages::Container: {
+        case Stage::kContainer: {
           ASSERT(m_pCurChildNode->IsContainerNode());
           if (m_pCurChildNode->GetElementType() == XFA_Element::Variables)
             break;
@@ -1926,7 +1923,7 @@
           }
           break;
         }
-        case XFA_ItemLayoutProcessorStages::Done:
+        case Stage::kDone:
           break;
         default:
           break;
@@ -1952,8 +1949,7 @@
   }
 
   bool bRetValue =
-      m_nCurChildNodeStage == XFA_ItemLayoutProcessorStages::Done &&
-      m_PendingNodes.empty();
+      m_nCurChildNodeStage == Stage::kDone && m_PendingNodes.empty();
   if (bBreakDone)
     bRetValue = false;
 
@@ -2175,18 +2171,18 @@
         case XFA_AttributeValue::Rl_row:
         default:
           DoLayoutPositionedContainer(pContext);
-          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Done;
+          m_nCurChildNodeStage = Stage::kDone;
           return XFA_ItemLayoutProcessorResult::Done;
         case XFA_AttributeValue::Table:
           DoLayoutTableContainer(pLayoutNode);
-          m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Done;
+          m_nCurChildNodeStage = Stage::kDone;
           return XFA_ItemLayoutProcessorResult::Done;
       }
     }
     case XFA_Element::Draw:
     case XFA_Element::Field:
       DoLayoutField();
-      m_nCurChildNodeStage = XFA_ItemLayoutProcessorStages::Done;
+      m_nCurChildNodeStage = Stage::kDone;
       return XFA_ItemLayoutProcessorResult::Done;
     case XFA_Element::ContentArea:
       return XFA_ItemLayoutProcessorResult::Done;
@@ -2735,7 +2731,7 @@
   return XFA_ItemLayoutProcessorResult::PageFullBreak;
 }
 
-Optional<XFA_ItemLayoutProcessorStages> CXFA_ItemLayoutProcessor::HandleKeep(
+Optional<CXFA_ItemLayoutProcessor::Stage> CXFA_ItemLayoutProcessor::HandleKeep(
     CXFA_Node* pBreakAfterNode,
     CXFA_Node** pCurActionNode) {
   if (m_bKeepBreakFinish)
@@ -2743,7 +2739,7 @@
   return FindBreakNode(pBreakAfterNode, false, pCurActionNode);
 }
 
-Optional<XFA_ItemLayoutProcessorStages>
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::HandleBookendLeader(CXFA_Node* pParentContainer,
                                               CXFA_Node** pCurActionNode) {
   for (CXFA_Node* pBookendNode = *pCurActionNode
@@ -2754,7 +2750,7 @@
       case XFA_Element::Bookend:
       case XFA_Element::Break:
         *pCurActionNode = pBookendNode;
-        return XFA_ItemLayoutProcessorStages::BookendLeader;
+        return Stage::kBookendLeader;
       default:
         break;
     }
@@ -2762,7 +2758,7 @@
   return {};
 }
 
-Optional<XFA_ItemLayoutProcessorStages>
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::HandleBreakAfter(CXFA_Node* pChildContainer,
                                            CXFA_Node** pCurActionNode) {
   if (*pCurActionNode) {
@@ -2774,7 +2770,7 @@
   return HandleKeep(pBreakAfterNode, pCurActionNode);
 }
 
-Optional<XFA_ItemLayoutProcessorStages>
+Optional<CXFA_ItemLayoutProcessor::Stage>
 CXFA_ItemLayoutProcessor::HandleBookendTrailer(CXFA_Node* pParentContainer,
                                                CXFA_Node** pCurActionNode) {
   for (CXFA_Node* pBookendNode = *pCurActionNode
@@ -2785,7 +2781,7 @@
       case XFA_Element::Bookend:
       case XFA_Element::Break:
         *pCurActionNode = pBookendNode;
-        return XFA_ItemLayoutProcessorStages::BookendTrailer;
+        return Stage::kBookendTrailer;
       default:
         break;
     }
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
index 019d1b1..53cd71d 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
@@ -35,19 +35,19 @@
   ManualBreak,
 };
 
-enum class XFA_ItemLayoutProcessorStages {
-  None,
-  BookendLeader,
-  BreakBefore,
-  Keep,
-  Container,
-  BreakAfter,
-  BookendTrailer,
-  Done,
-};
-
 class CXFA_ItemLayoutProcessor {
  public:
+  enum class Stage {
+    kNone,
+    kBookendLeader,
+    kBreakBefore,
+    kKeep,
+    kContainer,
+    kBreakAfter,
+    kBookendTrailer,
+    kDone,
+  };
+
   CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr);
   ~CXFA_ItemLayoutProcessor();
 
@@ -121,20 +121,17 @@
   void DoLayoutField();
 
   void GotoNextContainerNodeSimple(bool bUsePageBreak);
-  XFA_ItemLayoutProcessorStages GotoNextContainerNode(
-      XFA_ItemLayoutProcessorStages nCurStage,
-      bool bUsePageBreak,
-      CXFA_Node* pParentContainer,
-      CXFA_Node** pCurActionNode);
+  Stage GotoNextContainerNode(Stage nCurStage,
+                              bool bUsePageBreak,
+                              CXFA_Node* pParentContainer,
+                              CXFA_Node** pCurActionNode);
 
-  Optional<XFA_ItemLayoutProcessorStages> ProcessKeepNodesForCheckNext(
-      CXFA_Node** pCurActionNode,
-      CXFA_Node** pNextContainer,
-      bool* pLastKeepNode);
+  Optional<Stage> ProcessKeepNodesForCheckNext(CXFA_Node** pCurActionNode,
+                                               CXFA_Node** pNextContainer,
+                                               bool* pLastKeepNode);
 
-  Optional<XFA_ItemLayoutProcessorStages> ProcessKeepNodesForBreakBefore(
-      CXFA_Node** pCurActionNode,
-      CXFA_Node* pContainerNode);
+  Optional<Stage> ProcessKeepNodesForBreakBefore(CXFA_Node** pCurActionNode,
+                                                 CXFA_Node* pContainerNode);
 
   CXFA_Node* GetSubformSetParent(CXFA_Node* pSubformSet);
 
@@ -165,18 +162,14 @@
       CXFA_LayoutContext* pLayoutContext,
       bool bNewRow);
 
-  Optional<XFA_ItemLayoutProcessorStages> HandleKeep(
-      CXFA_Node* pBreakAfterNode,
-      CXFA_Node** pCurActionNode);
-  Optional<XFA_ItemLayoutProcessorStages> HandleBookendLeader(
-      CXFA_Node* pParentContainer,
-      CXFA_Node** pCurActionNode);
-  Optional<XFA_ItemLayoutProcessorStages> HandleBreakAfter(
-      CXFA_Node* pChildContainer,
-      CXFA_Node** pCurActionNode);
-  Optional<XFA_ItemLayoutProcessorStages> HandleBookendTrailer(
-      CXFA_Node* pParentContainer,
-      CXFA_Node** pCurActionNode);
+  Optional<Stage> HandleKeep(CXFA_Node* pBreakAfterNode,
+                             CXFA_Node** pCurActionNode);
+  Optional<Stage> HandleBookendLeader(CXFA_Node* pParentContainer,
+                                      CXFA_Node** pCurActionNode);
+  Optional<Stage> HandleBreakAfter(CXFA_Node* pChildContainer,
+                                   CXFA_Node** pCurActionNode);
+  Optional<Stage> HandleBookendTrailer(CXFA_Node* pParentContainer,
+                                       CXFA_Node** pCurActionNode);
   void ProcessKeepNodesEnd();
 
   CXFA_Node* m_pFormNode;
@@ -199,8 +192,7 @@
   CXFA_Node* m_pKeepTailNode = nullptr;
   CXFA_ContentLayoutItem* m_pOldLayoutItem = nullptr;
   CXFA_ItemLayoutProcessor* m_pCurChildPreprocessor = nullptr;
-  XFA_ItemLayoutProcessorStages m_nCurChildNodeStage =
-      XFA_ItemLayoutProcessorStages::None;
+  Stage m_nCurChildNodeStage = Stage::kNone;
   std::map<CXFA_Node*, int32_t> m_PendingNodesCount;
   float m_fWidthLimite = 0;
   bool m_bHasAvailHeight = true;
