diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
index dd5bf40..d0bfa10 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.cpp
@@ -171,6 +171,22 @@
   return componentSize;
 }
 
+CFX_FloatRect GetMarginInset(const CXFA_Margin* pMargin) {
+  CFX_FloatRect inset;
+  if (!pMargin)
+    return inset;
+
+  inset.left = pMargin->JSObject()->GetMeasureInUnit(XFA_Attribute::LeftInset,
+                                                     XFA_Unit::Pt);
+  inset.top = pMargin->JSObject()->GetMeasureInUnit(XFA_Attribute::TopInset,
+                                                    XFA_Unit::Pt);
+  inset.right = pMargin->JSObject()->GetMeasureInUnit(XFA_Attribute::RightInset,
+                                                      XFA_Unit::Pt);
+  inset.bottom = pMargin->JSObject()->GetMeasureInUnit(
+      XFA_Attribute::BottomInset, XFA_Unit::Pt);
+  return inset;
+}
+
 void RelocateTableRowCells(CXFA_ContentLayoutItem* pLayoutRow,
                            const std::vector<float>& rgSpecifiedColumnWidths,
                            XFA_AttributeValue eLayout) {
@@ -179,29 +195,15 @@
   CFX_SizeF containerSize = CalculateContainerSpecifiedSize(
       pLayoutRow->GetFormNode(), &bContainerWidthAutoSize,
       &bContainerHeightAutoSize);
-  CXFA_Margin* pMarginNode =
+  CXFA_Margin* pMargin =
       pLayoutRow->GetFormNode()->GetFirstChildByClass<CXFA_Margin>(
           XFA_Element::Margin);
-  float fLeftInset = 0;
-  float fTopInset = 0;
-  float fRightInset = 0;
-  float fBottomInset = 0;
-  if (pMarginNode) {
-    fLeftInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::LeftInset, XFA_Unit::Pt);
-    fTopInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::TopInset, XFA_Unit::Pt);
-    fRightInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::RightInset, XFA_Unit::Pt);
-    fBottomInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::BottomInset, XFA_Unit::Pt);
-  }
-
+  CFX_FloatRect inset = GetMarginInset(pMargin);
   float fContentWidthLimit =
       bContainerWidthAutoSize ? FLT_MAX
-                              : containerSize.width - fLeftInset - fRightInset;
+                              : containerSize.width - inset.left - inset.right;
   float fContentCurrentHeight =
-      pLayoutRow->m_sSize.height - fTopInset - fBottomInset;
+      pLayoutRow->m_sSize.height - inset.top - inset.bottom;
   float fContentCalculatedWidth = 0;
   float fContentCalculatedHeight = 0;
   float fCurrentColX = 0;
@@ -308,7 +310,7 @@
     fContentCalculatedWidth =
         std::max(fContentCalculatedWidth, fChildSuppliedWidth);
   } else {
-    fContentCalculatedWidth = containerSize.width - fLeftInset - fRightInset;
+    fContentCalculatedWidth = containerSize.width - inset.left - inset.right;
   }
 
   if (pLayoutRow->GetFormNode()->JSObject()->GetEnum(XFA_Attribute::Layout) ==
@@ -1504,102 +1506,36 @@
     CXFA_LayoutContext* pContext,
     bool bRootForceTb) {
   m_bHasAvailHeight = true;
-  bool bBreakDone = false;
-  bool bContainerWidthAutoSize = true;
-  bool bContainerHeightAutoSize = true;
-  bool bForceEndPage = false;
-  bool bIsManualBreak = false;
   if (m_pCurChildPreprocessor)
     m_pCurChildPreprocessor->m_ePreProcessRs = Result::kDone;
 
-  CFX_SizeF containerSize = CalculateContainerSpecifiedSize(
+  bool bContainerWidthAutoSize = true;
+  bool bContainerHeightAutoSize = true;
+  CFX_SizeF container_size = CalculateContainerSpecifiedSize(
       GetFormNode(), &bContainerWidthAutoSize, &bContainerHeightAutoSize);
-  if (pContext && pContext->m_fCurColumnWidth.has_value()) {
-    containerSize.width = pContext->m_fCurColumnWidth.value();
-    bContainerWidthAutoSize = false;
-  }
-  if (!bContainerHeightAutoSize)
-    containerSize.height -= m_fUsedSize;
+  AdjustContainerSpecifiedSize(pContext, &container_size,
+                               &bContainerWidthAutoSize,
+                               &bContainerHeightAutoSize);
 
-  if (!bContainerHeightAutoSize) {
-    CXFA_Node* pParentNode = GetFormNode()->GetParent();
-    bool bFocrTb = false;
-    if (pParentNode &&
-        GetLayout(pParentNode, &bFocrTb) == XFA_AttributeValue::Row) {
-      CXFA_Node* pChildContainer = GetFormNode()->GetFirstContainerChild();
-      if (pChildContainer && pChildContainer->GetNextContainerSibling()) {
-        containerSize.height = 0;
-        bContainerHeightAutoSize = true;
-      }
-    }
-  }
-
-  CXFA_Margin* pMarginNode =
+  CXFA_Margin* pMargin =
       GetFormNode()->GetFirstChildByClass<CXFA_Margin>(XFA_Element::Margin);
-  float fLeftInset = 0;
-  float fTopInset = 0;
-  float fRightInset = 0;
-  float fBottomInset = 0;
-  if (pMarginNode) {
-    fLeftInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::LeftInset, XFA_Unit::Pt);
-    fTopInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::TopInset, XFA_Unit::Pt);
-    fRightInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::RightInset, XFA_Unit::Pt);
-    fBottomInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::BottomInset, XFA_Unit::Pt);
-  }
+  CFX_FloatRect inset = GetMarginInset(pMargin);
   float fContentWidthLimit =
       bContainerWidthAutoSize ? FLT_MAX
-                              : containerSize.width - fLeftInset - fRightInset;
-  float fContentCalculatedWidth = 0;
-  float fContentCalculatedHeight = 0;
-  float fAvailHeight = fHeightLimit - fTopInset - fBottomInset;
+                              : container_size.width - inset.left - inset.right;
+  float fAvailHeight = fHeightLimit - inset.top - inset.bottom;
   if (fAvailHeight < 0)
     m_bHasAvailHeight = false;
 
-  fRealHeight = fRealHeight - fTopInset - fBottomInset;
+  fRealHeight = fRealHeight - inset.top - inset.bottom;
+  CFX_SizeF calculated_size;
   float fContentCurRowY = 0;
-  CXFA_ContentLayoutItem* pLayoutChild = nullptr;
+  CXFA_ContentLayoutItem* pLastChild = nullptr;
   if (m_pLayoutItem) {
-    if (m_nCurChildNodeStage != Stage::kDone &&
-        eFlowStrategy != XFA_AttributeValue::Tb) {
-      pLayoutChild = ToContentLayoutItem(m_pLayoutItem->GetFirstChild());
-      for (CXFA_LayoutItem* pLayoutNext = pLayoutChild; pLayoutNext;
-           pLayoutNext = pLayoutNext->GetNextSibling()) {
-        CXFA_ContentLayoutItem* pContentNext =
-            pLayoutNext->AsContentLayoutItem();
-        if (!pContentNext)
-          continue;
-
-        if (pContentNext->m_sPos.y != pLayoutChild->m_sPos.y)
-          pLayoutChild = pContentNext;
-      }
-    }
-
-    for (CXFA_LayoutItem* pTempChild = m_pLayoutItem->GetFirstChild();
-         pTempChild != pLayoutChild;
-         pTempChild = pTempChild->GetNextSibling()) {
-      CXFA_ContentLayoutItem* pLayoutTempChild =
-          pTempChild->AsContentLayoutItem();
-      if (!pLayoutTempChild)
-        continue;
-      if (!pLayoutTempChild->GetFormNode()->PresenceRequiresSpace())
-        continue;
-
-      fContentCalculatedWidth = std::max(
-          fContentCalculatedWidth,
-          pLayoutTempChild->m_sPos.x + pLayoutTempChild->m_sSize.width);
-      fContentCalculatedHeight = std::max(
-          fContentCalculatedHeight,
-          pLayoutTempChild->m_sPos.y + pLayoutTempChild->m_sSize.height);
-    }
-
-    if (pLayoutChild)
-      fContentCurRowY = pLayoutChild->m_sPos.y;
-    else
-      fContentCurRowY = fContentCalculatedHeight;
+    pLastChild = FindLastContentLayoutItem(eFlowStrategy);
+    calculated_size = CalculateLayoutItemSize(pLastChild);
+    fContentCurRowY =
+        pLastChild ? pLastChild->m_sPos.y : calculated_size.height;
   }
 
   fContentCurRowY += InsertKeepLayoutItems();
@@ -1615,6 +1551,9 @@
     }
   }
 
+  bool bForceEndPage = false;
+  bool bBreakDone = false;
+  bool bIsManualBreak = false;
   while (m_nCurChildNodeStage != Stage::kDone) {
     float fContentCurRowHeight = 0;
     float fContentCurRowAvailWidth = fContentWidthLimit;
@@ -1622,8 +1561,8 @@
     std::vector<CXFA_ContentLayoutItem*> rgCurLineLayoutItems[3];
     uint8_t uCurHAlignState =
         (eFlowStrategy != XFA_AttributeValue::Rl_tb ? 0 : 2);
-    if (pLayoutChild) {
-      for (CXFA_LayoutItem* pNext = pLayoutChild; pNext;
+    if (pLastChild) {
+      for (CXFA_LayoutItem* pNext = pLastChild; pNext;
            pNext = pNext->GetNextSibling()) {
         CXFA_ContentLayoutItem* pLayoutNext = pNext->AsContentLayoutItem();
         if (!pLayoutNext)
@@ -1653,21 +1592,20 @@
         }
       }
 
-      if (ToContentLayoutItem(m_pLayoutItem->GetFirstChild()) == pLayoutChild) {
+      if (ToContentLayoutItem(m_pLayoutItem->GetFirstChild()) == pLastChild) {
         m_pLayoutItem->SetFirstChild(nullptr);
       } else {
         for (CXFA_LayoutItem* pLayoutNext = m_pLayoutItem->GetFirstChild();
              pLayoutNext; pLayoutNext = pLayoutNext->GetNextSibling()) {
           if (ToContentLayoutItem(pLayoutNext->GetNextSibling()) ==
-              pLayoutChild) {
+              pLastChild) {
             pLayoutNext->SetNextSibling(nullptr);
             break;
           }
         }
       }
 
-      CXFA_ContentLayoutItem* pLayoutNextTemp =
-          ToContentLayoutItem(pLayoutChild);
+      CXFA_ContentLayoutItem* pLayoutNextTemp = ToContentLayoutItem(pLastChild);
       while (pLayoutNextTemp) {
         pLayoutNextTemp->SetParent(nullptr);
         CXFA_ContentLayoutItem* pSaveLayoutNext =
@@ -1675,7 +1613,7 @@
         pLayoutNextTemp->SetNextSibling(nullptr);
         pLayoutNextTemp = pSaveLayoutNext;
       }
-      pLayoutChild = nullptr;
+      pLastChild = nullptr;
     }
 
     while (m_pCurChildNode) {
@@ -1689,7 +1627,7 @@
         case Stage::kBreakBefore: {
           for (auto* item : m_arrayKeepItems) {
             m_pLayoutItem->RemoveChild(item);
-            fContentCalculatedHeight -= item->m_sSize.height;
+            calculated_size.height -= item->m_sSize.height;
           }
 
           if (!bUseBreakControl || !m_pPageMgr)
@@ -1718,9 +1656,9 @@
                                                                nullptr);
               InsertFlowedItem(
                   pTempProcessor.get(), bContainerWidthAutoSize,
-                  bContainerHeightAutoSize, containerSize.height, eFlowStrategy,
-                  &uCurHAlignState, rgCurLineLayoutItems, false, FLT_MAX,
-                  FLT_MAX, fContentWidthLimit, &fContentCurRowY,
+                  bContainerHeightAutoSize, container_size.height,
+                  eFlowStrategy, &uCurHAlignState, rgCurLineLayoutItems, false,
+                  FLT_MAX, FLT_MAX, fContentWidthLimit, &fContentCurRowY,
                   &fContentCurRowAvailWidth, &fContentCurRowHeight,
                   &bAddedItemInRow, &bForceEndPage, pContext, false);
             }
@@ -1748,7 +1686,7 @@
             auto pTempProcessor = pdfium::MakeUnique<CXFA_ItemLayoutProcessor>(
                 pTrailerNode, nullptr);
             InsertFlowedItem(pTempProcessor.get(), bContainerWidthAutoSize,
-                             bContainerHeightAutoSize, containerSize.height,
+                             bContainerHeightAutoSize, container_size.height,
                              eFlowStrategy, &uCurHAlignState,
                              rgCurLineLayoutItems, false, FLT_MAX, FLT_MAX,
                              fContentWidthLimit, &fContentCurRowY,
@@ -1759,8 +1697,8 @@
             if (JudgeLeaderOrTrailerForOccur(pLeaderNode)) {
               CalculateRowChildPosition(
                   rgCurLineLayoutItems, eFlowStrategy, bContainerHeightAutoSize,
-                  bContainerWidthAutoSize, &fContentCalculatedWidth,
-                  &fContentCalculatedHeight, &fContentCurRowY,
+                  bContainerWidthAutoSize, &calculated_size.width,
+                  &calculated_size.height, &fContentCurRowY,
                   fContentCurRowHeight, fContentWidthLimit, false);
               rgCurLineLayoutItems->clear();
               auto pTempProcessor =
@@ -1768,9 +1706,9 @@
                                                                nullptr);
               InsertFlowedItem(
                   pTempProcessor.get(), bContainerWidthAutoSize,
-                  bContainerHeightAutoSize, containerSize.height, eFlowStrategy,
-                  &uCurHAlignState, rgCurLineLayoutItems, false, FLT_MAX,
-                  FLT_MAX, fContentWidthLimit, &fContentCurRowY,
+                  bContainerHeightAutoSize, container_size.height,
+                  eFlowStrategy, &uCurHAlignState, rgCurLineLayoutItems, false,
+                  FLT_MAX, FLT_MAX, fContentWidthLimit, &fContentCurRowY,
                   &fContentCurRowAvailWidth, &fContentCurRowHeight,
                   &bAddedItemInRow, &bForceEndPage, pContext, false);
             }
@@ -1801,15 +1739,15 @@
           }
 
           if (pProcessor) {
-            if (InsertFlowedItem(pProcessor.get(), bContainerWidthAutoSize,
-                                 bContainerHeightAutoSize, containerSize.height,
-                                 eFlowStrategy, &uCurHAlignState,
-                                 rgCurLineLayoutItems, bUseBreakControl,
-                                 fAvailHeight, fRealHeight, fContentWidthLimit,
-                                 &fContentCurRowY, &fContentCurRowAvailWidth,
-                                 &fContentCurRowHeight, &bAddedItemInRow,
-                                 &bForceEndPage, pContext,
-                                 false) != Result::kDone) {
+            if (InsertFlowedItem(
+                    pProcessor.get(), bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, container_size.height,
+                    eFlowStrategy, &uCurHAlignState, rgCurLineLayoutItems,
+                    bUseBreakControl, fAvailHeight, fRealHeight,
+                    fContentWidthLimit, &fContentCurRowY,
+                    &fContentCurRowAvailWidth, &fContentCurRowHeight,
+                    &bAddedItemInRow, &bForceEndPage, pContext,
+                    false) != Result::kDone) {
               goto SuspendAndCreateNewRow;
             }
             pProcessor.reset();
@@ -1828,15 +1766,15 @@
             }
           }
           if (pProcessor) {
-            if (InsertFlowedItem(pProcessor.get(), bContainerWidthAutoSize,
-                                 bContainerHeightAutoSize, containerSize.height,
-                                 eFlowStrategy, &uCurHAlignState,
-                                 rgCurLineLayoutItems, bUseBreakControl,
-                                 fAvailHeight, fRealHeight, fContentWidthLimit,
-                                 &fContentCurRowY, &fContentCurRowAvailWidth,
-                                 &fContentCurRowHeight, &bAddedItemInRow,
-                                 &bForceEndPage, pContext,
-                                 false) != Result::kDone) {
+            if (InsertFlowedItem(
+                    pProcessor.get(), bContainerWidthAutoSize,
+                    bContainerHeightAutoSize, container_size.height,
+                    eFlowStrategy, &uCurHAlignState, rgCurLineLayoutItems,
+                    bUseBreakControl, fAvailHeight, fRealHeight,
+                    fContentWidthLimit, &fContentCurRowY,
+                    &fContentCurRowAvailWidth, &fContentCurRowHeight,
+                    &bAddedItemInRow, &bForceEndPage, pContext,
+                    false) != Result::kDone) {
               goto SuspendAndCreateNewRow;
             }
             pProcessor.reset();
@@ -1867,7 +1805,7 @@
           pProcessor->InsertPendingItems(m_pCurChildNode);
           Result rs = InsertFlowedItem(
               pProcessor.get(), bContainerWidthAutoSize,
-              bContainerHeightAutoSize, containerSize.height, eFlowStrategy,
+              bContainerHeightAutoSize, container_size.height, eFlowStrategy,
               &uCurHAlignState, rgCurLineLayoutItems, bUseBreakControl,
               fAvailHeight, fRealHeight, fContentWidthLimit, &fContentCurRowY,
               &fContentCurRowAvailWidth, &fContentCurRowHeight,
@@ -1905,11 +1843,11 @@
       break;
     }
 
-    CalculateRowChildPosition(
-        rgCurLineLayoutItems, eFlowStrategy, bContainerHeightAutoSize,
-        bContainerWidthAutoSize, &fContentCalculatedWidth,
-        &fContentCalculatedHeight, &fContentCurRowY, fContentCurRowHeight,
-        fContentWidthLimit, bRootForceTb);
+    CalculateRowChildPosition(rgCurLineLayoutItems, eFlowStrategy,
+                              bContainerHeightAutoSize, bContainerWidthAutoSize,
+                              &calculated_size.width, &calculated_size.height,
+                              &fContentCurRowY, fContentCurRowHeight,
+                              fContentWidthLimit, bRootForceTb);
     m_fWidthLimit = fContentCurRowAvailWidth;
     if (bForceEndPage)
       break;
@@ -1920,26 +1858,26 @@
   if (bBreakDone)
     bRetValue = false;
 
-  containerSize = CalculateContainerComponentSizeFromContentSize(
-      GetFormNode(), bContainerWidthAutoSize, fContentCalculatedWidth,
-      bContainerHeightAutoSize, fContentCalculatedHeight, containerSize);
+  container_size = CalculateContainerComponentSizeFromContentSize(
+      GetFormNode(), bContainerWidthAutoSize, calculated_size.width,
+      bContainerHeightAutoSize, calculated_size.height, container_size);
 
-  if (containerSize.height >= kXFALayoutPrecision || m_pLayoutItem ||
+  if (container_size.height >= kXFALayoutPrecision || m_pLayoutItem ||
       bRetValue) {
     if (!m_pLayoutItem)
       m_pLayoutItem = CreateContentLayoutItem(GetFormNode());
-    containerSize.height = std::max(containerSize.height, 0.f);
+    container_size.height = std::max(container_size.height, 0.f);
 
-    SetCurrentComponentSize(containerSize);
+    SetCurrentComponentSize(container_size);
     if (bForceEndPage)
       m_fUsedSize = 0;
     else
       m_fUsedSize += m_pLayoutItem->m_sSize.height;
   }
 
-  return bRetValue
-             ? Result::kDone
-             : (bIsManualBreak ? Result::kManualBreak : Result::kPageFullBreak);
+  if (bRetValue)
+    return Result::kDone;
+  return bIsManualBreak ? Result::kManualBreak : Result::kPageFullBreak;
 }
 
 bool CXFA_ItemLayoutProcessor::CalculateRowChildPosition(
@@ -2226,23 +2164,9 @@
   }
 
   UpdatePendingItemLayout(pTrailerLayoutItem);
-  CXFA_Margin* pMarginNode =
+  CXFA_Margin* pMargin =
       GetFormNode()->GetFirstChildByClass<CXFA_Margin>(XFA_Element::Margin);
-  float fLeftInset = 0;
-  float fTopInset = 0;
-  float fRightInset = 0;
-  float fBottomInset = 0;
-  if (pMarginNode) {
-    fLeftInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::LeftInset, XFA_Unit::Pt);
-    fTopInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::TopInset, XFA_Unit::Pt);
-    fRightInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::RightInset, XFA_Unit::Pt);
-    fBottomInset = pMarginNode->JSObject()->GetMeasureInUnit(
-        XFA_Attribute::BottomInset, XFA_Unit::Pt);
-  }
-
+  CFX_FloatRect inset = GetMarginInset(pMargin);
   if (!IsAddNewRowForTrailer(pTrailerLayoutItem)) {
     pTrailerLayoutItem->m_sPos.y = m_fLastRowY;
     pTrailerLayoutItem->m_sPos.x = m_fLastRowWidth;
@@ -2257,27 +2181,27 @@
 
   if (fNewSplitPos > kXFALayoutPrecision) {
     SplitLayoutItem(fNewSplitPos);
-    pTrailerLayoutItem->m_sPos.y = fNewSplitPos - fTopInset - fBottomInset;
+    pTrailerLayoutItem->m_sPos.y = fNewSplitPos - inset.top - inset.bottom;
   } else {
-    pTrailerLayoutItem->m_sPos.y = fSplitPos - fTopInset - fBottomInset;
+    pTrailerLayoutItem->m_sPos.y = fSplitPos - inset.top - inset.bottom;
   }
 
   switch (pTrailerLayoutItem->GetFormNode()->JSObject()->GetEnum(
       XFA_Attribute::HAlign)) {
     case XFA_AttributeValue::Right:
       pTrailerLayoutItem->m_sPos.x = m_pLayoutItem->m_sSize.width -
-                                     fRightInset -
+                                     inset.right -
                                      pTrailerLayoutItem->m_sSize.width;
       break;
     case XFA_AttributeValue::Center:
       pTrailerLayoutItem->m_sPos.x =
-          (m_pLayoutItem->m_sSize.width - fLeftInset - fRightInset -
+          (m_pLayoutItem->m_sSize.width - inset.left - inset.right -
            pTrailerLayoutItem->m_sSize.width) /
           2;
       break;
     case XFA_AttributeValue::Left:
     default:
-      pTrailerLayoutItem->m_sPos.x = fLeftInset;
+      pTrailerLayoutItem->m_sPos.x = inset.left;
       break;
   }
   m_pLayoutItem->m_sSize.height += fHeight;
@@ -2815,3 +2739,66 @@
   m_pKeepTailNode = nullptr;
   m_bIsProcessKeep = false;
 }
+
+void CXFA_ItemLayoutProcessor::AdjustContainerSpecifiedSize(
+    CXFA_LayoutContext* pContext,
+    CFX_SizeF* pSize,
+    bool* pContainerWidthAutoSize,
+    bool* pContainerHeightAutoSize) {
+  if (pContext && pContext->m_fCurColumnWidth.has_value()) {
+    pSize->width = pContext->m_fCurColumnWidth.value();
+    *pContainerWidthAutoSize = false;
+  }
+  if (*pContainerHeightAutoSize)
+    return;
+
+  pSize->height -= m_fUsedSize;
+  CXFA_Node* pParentNode = GetFormNode()->GetParent();
+  bool bFocrTb = false;
+  if (!pParentNode ||
+      GetLayout(pParentNode, &bFocrTb) != XFA_AttributeValue::Row) {
+    return;
+  }
+
+  CXFA_Node* pChildContainer = GetFormNode()->GetFirstContainerChild();
+  if (!pChildContainer || !pChildContainer->GetNextContainerSibling())
+    return;
+
+  pSize->height = 0;
+  *pContainerHeightAutoSize = true;
+}
+
+CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::FindLastContentLayoutItem(
+    XFA_AttributeValue eFlowStrategy) {
+  if (m_nCurChildNodeStage == Stage::kDone ||
+      eFlowStrategy == XFA_AttributeValue::Tb) {
+    return nullptr;
+  }
+
+  CXFA_ContentLayoutItem* pLastChild =
+      ToContentLayoutItem(m_pLayoutItem->GetFirstChild());
+  for (CXFA_LayoutItem* pNext = pLastChild; pNext;
+       pNext = pNext->GetNextSibling()) {
+    CXFA_ContentLayoutItem* pContentNext = pNext->AsContentLayoutItem();
+    if (pContentNext && pContentNext->m_sPos.y != pLastChild->m_sPos.y)
+      pLastChild = pContentNext;
+  }
+  return pLastChild;
+}
+
+CFX_SizeF CXFA_ItemLayoutProcessor::CalculateLayoutItemSize(
+    const CXFA_ContentLayoutItem* pLastChild) {
+  CFX_SizeF size;
+  for (CXFA_LayoutItem* pChild = m_pLayoutItem->GetFirstChild();
+       pChild != pLastChild; pChild = pChild->GetNextSibling()) {
+    CXFA_ContentLayoutItem* pLayout = pChild->AsContentLayoutItem();
+    if (!pLayout || !pLayout->GetFormNode()->PresenceRequiresSpace())
+      continue;
+
+    float fWidth = pLayout->m_sPos.x + pLayout->m_sSize.width;
+    float fHeight = pLayout->m_sPos.y + pLayout->m_sSize.height;
+    size.width = std::max(size.width, fWidth);
+    size.height = std::max(size.height, fHeight);
+  }
+  return size;
+}
diff --git a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
index 5cfd8a2..6fdf25b 100644
--- a/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
+++ b/xfa/fxfa/layout/cxfa_itemlayoutprocessor.h
@@ -176,6 +176,13 @@
   Optional<Stage> HandleBookendTrailer(CXFA_Node* pParentContainer,
                                        CXFA_Node** pCurActionNode);
   void ProcessKeepNodesEnd();
+  void AdjustContainerSpecifiedSize(CXFA_LayoutContext* pContext,
+                                    CFX_SizeF* pSize,
+                                    bool* pContainerWidthAutoSize,
+                                    bool* pContainerHeightAutoSize);
+  CXFA_ContentLayoutItem* FindLastContentLayoutItem(
+      XFA_AttributeValue eFlowStrategy);
+  CFX_SizeF CalculateLayoutItemSize(const CXFA_ContentLayoutItem* pLayoutChild);
 
   Stage m_nCurChildNodeStage = Stage::kNone;
   Result m_ePreProcessRs = Result::kDone;
