diff --git a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
index 761d0ae..8188544 100644
--- a/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/layout/cxfa_layoutpagemgr.cpp
@@ -6,6 +6,8 @@
 
 #include "xfa/fxfa/layout/cxfa_layoutpagemgr.h"
 
+#include <utility>
+
 #include "fxjs/xfa/cfxjse_engine.h"
 #include "fxjs/xfa/cjx_object.h"
 #include "third_party/base/stl_util.h"
@@ -272,6 +274,44 @@
   return heights;
 }
 
+std::pair<size_t, CXFA_LayoutItem*> GetPageAreaCountAndLastPageAreaFromPageSet(
+    CXFA_ContainerLayoutItem* pPageSetLayoutItem) {
+  size_t nCount = 0;
+  CXFA_LayoutItem* pLast = nullptr;
+  for (CXFA_LayoutItem* pPageAreaLayoutItem =
+           pPageSetLayoutItem->GetFirstChild();
+       pPageAreaLayoutItem;
+       pPageAreaLayoutItem = pPageAreaLayoutItem->GetNextSibling()) {
+    if (pPageAreaLayoutItem->GetFormNode()->GetElementType() !=
+        XFA_Element::PageArea) {
+      continue;
+    }
+    ++nCount;
+    pLast = pPageAreaLayoutItem;
+  }
+  return {nCount, pLast};
+}
+
+bool ContentAreasFitInPageAreas(const CXFA_Node* pNode,
+                                const std::vector<float>& rgUsedHeights) {
+  size_t iCurContentAreaIndex = 0;
+  for (const CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
+       pContentAreaNode;
+       pContentAreaNode = pContentAreaNode->GetNextSibling()) {
+    if (pContentAreaNode->GetElementType() != XFA_Element::ContentArea)
+      continue;
+
+    const float fHeight = pContentAreaNode->JSObject()->GetMeasureInUnit(
+                              XFA_Attribute::H, XFA_Unit::Pt) +
+                          kXFALayoutPrecision;
+    if (rgUsedHeights[iCurContentAreaIndex] > fHeight)
+      return false;
+
+    ++iCurContentAreaIndex;
+  }
+  return true;
+}
+
 }  // namespace
 
 class CXFA_ContainerRecord {
@@ -1957,19 +1997,10 @@
 void CXFA_LayoutPageMgr::ProcessSimplexOrDuplexPageSets(
     CXFA_ContainerLayoutItem* pPageSetLayoutItem,
     bool bIsSimplex) {
-  CXFA_LayoutItem* pLastPageAreaLayoutItem = nullptr;
-  int32_t nPageAreaCount = 0;
-  for (CXFA_LayoutItem* pPageAreaLayoutItem =
-           pPageSetLayoutItem->GetFirstChild();
-       pPageAreaLayoutItem;
-       pPageAreaLayoutItem = pPageAreaLayoutItem->GetNextSibling()) {
-    if (pPageAreaLayoutItem->GetFormNode()->GetElementType() !=
-        XFA_Element::PageArea) {
-      continue;
-    }
-    nPageAreaCount++;
-    pLastPageAreaLayoutItem = pPageAreaLayoutItem;
-  }
+  size_t nPageAreaCount;
+  CXFA_LayoutItem* pLastPageAreaLayoutItem;
+  std::tie(nPageAreaCount, pLastPageAreaLayoutItem) =
+      GetPageAreaCountAndLastPageAreaFromPageSet(pPageSetLayoutItem);
   if (!pLastPageAreaLayoutItem)
     return;
 
@@ -1984,6 +2015,7 @@
            true, XFA_AttributeValue::Last))) {
     return;
   }
+
   CXFA_Node* pNode = m_pCurPageArea;
   XFA_AttributeValue eCurChoice =
       pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition);
@@ -2000,25 +2032,10 @@
       return;
     }
   }
-  bool bUsable = true;
+
   std::vector<float> rgUsedHeights =
       GetHeightsForContentAreas(pLastPageAreaLayoutItem);
-  int32_t iCurContentAreaIndex = -1;
-  for (CXFA_Node* pContentAreaNode = pNode->GetFirstChild(); pContentAreaNode;
-       pContentAreaNode = pContentAreaNode->GetNextSibling()) {
-    if (pContentAreaNode->GetElementType() != XFA_Element::ContentArea) {
-      continue;
-    }
-    iCurContentAreaIndex++;
-    const float fHeight = pContentAreaNode->JSObject()->GetMeasureInUnit(
-                              XFA_Attribute::H, XFA_Unit::Pt) +
-                          kXFALayoutPrecision;
-    if (rgUsedHeights[iCurContentAreaIndex] > fHeight) {
-      bUsable = false;
-      break;
-    }
-  }
-  if (bUsable) {
+  if (ContentAreasFitInPageAreas(pNode, rgUsedHeights)) {
     CXFA_LayoutItem* pChildLayoutItem =
         pLastPageAreaLayoutItem->GetFirstChild();
     CXFA_Node* pContentAreaNode = pNode->GetFirstChild();
@@ -2037,8 +2054,11 @@
       pChildLayoutItem = pChildLayoutItem->GetNextSibling();
       pContentAreaNode = pContentAreaNode->GetNextSibling();
     }
-  } else if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
-             XFA_AttributeValue::Last) {
+    return;
+  }
+
+  if (pNode->JSObject()->GetEnum(XFA_Attribute::PagePosition) ==
+      XFA_AttributeValue::Last) {
     CXFA_ContainerRecord* pRecord = CreateContainerRecord(nullptr, false);
     AddPageAreaLayoutItem(pRecord, pNode);
   }
