diff --git a/xfa/fxfa/cxfa_textlayout.cpp b/xfa/fxfa/cxfa_textlayout.cpp
index 037a2cf..610da73 100644
--- a/xfa/fxfa/cxfa_textlayout.cpp
+++ b/xfa/fxfa/cxfa_textlayout.cpp
@@ -321,11 +321,9 @@
   return fTextHeight;
 }
 
-float CXFA_TextLayout::DoSplitLayout(int32_t iBlockIndex,
+float CXFA_TextLayout::DoSplitLayout(size_t szBlockIndex,
                                      float fCalcHeight,
                                      float fTextHeight) {
-  ASSERT(iBlockIndex >= 0);
-
   if (!m_pLoader)
     return fCalcHeight;
 
@@ -334,7 +332,6 @@
   if (fCalcHeight < 0)
     return fCalcHeight;
 
-  size_t szBlockIndex = static_cast<size_t>(iBlockIndex);
   m_bHasBlock = true;
   if (m_Blocks.empty() && m_pLoader->fHeight > 0) {
     float fHeight = fTextHeight - GetLayoutHeight();
@@ -535,7 +532,7 @@
   return true;
 }
 
-void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex) {
+void CXFA_TextLayout::ItemBlocks(const CFX_RectF& rtText, size_t szBlockIndex) {
   if (!m_pLoader)
     return;
 
@@ -544,12 +541,9 @@
 
   float fLinePos = m_pLoader->fStartLineOffset;
   size_t szLineIndex = 0;
-  if (iBlockIndex > 0) {
-    // TODO(thestig): Check this code for correctness, and convert to size_t.
-    int32_t iBlockHeightCount =
-        pdfium::CollectionSize<int32_t>(m_pLoader->blockHeights);
-    if (iBlockIndex <= iBlockHeightCount) {
-      for (int32_t i = 0; i < iBlockIndex; i++)
+  if (szBlockIndex > 0) {
+    if (szBlockIndex <= m_pLoader->blockHeights.size()) {
+      for (size_t i = 0; i < szBlockIndex; ++i)
         fLinePos -= m_pLoader->blockHeights[i].fHeight;
     } else {
       fLinePos = 0;
@@ -573,7 +567,7 @@
 bool CXFA_TextLayout::DrawString(CFX_RenderDevice* pFxDevice,
                                  const CFX_Matrix& tmDoc2Device,
                                  const CFX_RectF& rtClip,
-                                 int32_t iBlock) {
+                                 size_t szBlockIndex) {
   if (!pFxDevice)
     return false;
 
@@ -592,9 +586,9 @@
   int32_t iLineStart = 0;
   int32_t iPieceLines = pdfium::CollectionSize<int32_t>(m_pieceLines);
   if (!m_Blocks.empty()) {
-    if (iBlock < pdfium::CollectionSize<int32_t>(m_Blocks)) {
-      iLineStart = m_Blocks[iBlock].szIndex;
-      iPieceLines = m_Blocks[iBlock].szLength;
+    if (szBlockIndex < m_Blocks.size()) {
+      iLineStart = m_Blocks[szBlockIndex].szIndex;
+      iPieceLines = m_Blocks[szBlockIndex].szLength;
     } else {
       iPieceLines = 0;
     }
diff --git a/xfa/fxfa/cxfa_textlayout.h b/xfa/fxfa/cxfa_textlayout.h
index 3a3f658..a55b757 100644
--- a/xfa/fxfa/cxfa_textlayout.h
+++ b/xfa/fxfa/cxfa_textlayout.h
@@ -33,23 +33,23 @@
 
 class CXFA_TextLayout {
  public:
-  explicit CXFA_TextLayout(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider);
+  CXFA_TextLayout(CXFA_FFDoc* doc, CXFA_TextProvider* pTextProvider);
   ~CXFA_TextLayout();
 
   float GetLayoutHeight();
   float StartLayout(float fWidth);
   float DoLayout(float fTextHeight);
-  float DoSplitLayout(int32_t iBlockIndex,
+  float DoSplitLayout(size_t szBlockIndex,
                       float fCalcHeight,
                       float fTextHeight);
   float Layout(const CFX_SizeF& size);
 
   CFX_SizeF CalcSize(const CFX_SizeF& minSize, const CFX_SizeF& maxSize);
-  void ItemBlocks(const CFX_RectF& rtText, int32_t iBlockIndex);
+  void ItemBlocks(const CFX_RectF& rtText, size_t szBlockIndex);
   bool DrawString(CFX_RenderDevice* pFxDevice,
                   const CFX_Matrix& tmDoc2Device,
                   const CFX_RectF& rtClip,
-                  int32_t iBlock);
+                  size_t szBlockIndex);
   bool IsLoaded() const { return !m_pieceLines.empty(); }
   void Unload();
 
diff --git a/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp b/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp
index 79b3cb7..58e65e0 100644
--- a/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp
+++ b/xfa/fxfa/parser/cxfa_contentlayoutitem.cpp
@@ -97,22 +97,12 @@
   return CFX_RectF(sPos, sSize);
 }
 
-int32_t CXFA_ContentLayoutItem::GetIndex() const {
-  int32_t iIndex = 0;
+size_t CXFA_ContentLayoutItem::GetIndex() const {
+  size_t szIndex = 0;
   const CXFA_ContentLayoutItem* pCurNode = this;
   while (auto* pPrev = pCurNode->GetPrev()) {
     pCurNode = pPrev;
-    ++iIndex;
+    ++szIndex;
   }
-  return iIndex;
-}
-
-int32_t CXFA_ContentLayoutItem::GetCount() const {
-  int32_t iCount = GetIndex() + 1;
-  const CXFA_ContentLayoutItem* pCurNode = this;
-  while (auto* pNext = pCurNode->GetNext()) {
-    pCurNode = pNext;
-    iCount++;
-  }
-  return iCount;
+  return szIndex;
 }
diff --git a/xfa/fxfa/parser/cxfa_contentlayoutitem.h b/xfa/fxfa/parser/cxfa_contentlayoutitem.h
index 7313a1e..b002e88 100644
--- a/xfa/fxfa/parser/cxfa_contentlayoutitem.h
+++ b/xfa/fxfa/parser/cxfa_contentlayoutitem.h
@@ -26,8 +26,7 @@
   void InsertAfter(CXFA_ContentLayoutItem* pNext);
 
   CFX_RectF GetRect(bool bRelative) const;
-  int32_t GetIndex() const;
-  int32_t GetCount() const;
+  size_t GetIndex() const;
 
   CFX_PointF m_sPos;
   CFX_SizeF m_sSize;
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index c32fd48..08fe391 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -3438,7 +3438,7 @@
 }
 
 bool CXFA_Node::FindSplitPos(CXFA_FFDocView* docView,
-                             int32_t iBlockIndex,
+                             size_t szBlockIndex,
                              float* pCalcHeight) {
   if (GetFFWidgetType() == XFA_FFWidgetType::kSubform)
     return false;
@@ -3456,7 +3456,7 @@
 
   float fTopInset = 0;
   float fBottomInset = 0;
-  if (iBlockIndex == 0) {
+  if (szBlockIndex == 0) {
     CXFA_Margin* margin = GetMarginIfExists();
     if (margin) {
       fTopInset = margin->GetTopInset();
@@ -3469,16 +3469,16 @@
   }
   if (GetFFWidgetType() == XFA_FFWidgetType::kText) {
     float fHeight = *pCalcHeight;
-    if (iBlockIndex == 0) {
+    if (szBlockIndex == 0) {
       *pCalcHeight -= fTopInset;
       *pCalcHeight = std::max(*pCalcHeight, 0.0f);
     }
     CXFA_TextLayout* pTextLayout =
         m_pLayoutData->AsTextLayoutData()->GetTextLayout();
     *pCalcHeight = pTextLayout->DoSplitLayout(
-        iBlockIndex, *pCalcHeight, m_pLayoutData->m_fWidgetHeight - fTopInset);
+        szBlockIndex, *pCalcHeight, m_pLayoutData->m_fWidgetHeight - fTopInset);
     if (*pCalcHeight != 0) {
-      if (iBlockIndex == 0)
+      if (szBlockIndex == 0)
         *pCalcHeight += fTopInset;
       if (fabs(fHeight - *pCalcHeight) < kXFAWidgetPrecision)
         return false;
@@ -3488,7 +3488,7 @@
 
   XFA_AttributeValue iCapPlacement = XFA_AttributeValue::Unknown;
   float fCapReserve = 0;
-  if (iBlockIndex == 0) {
+  if (szBlockIndex == 0) {
     CXFA_Caption* caption = GetCaptionIfExists();
     if (caption && !caption->IsHidden()) {
       iCapPlacement = caption->GetPlacementType();
@@ -3522,11 +3522,11 @@
     iLinesCount = pFieldData->m_pTextOut->GetTotalLines();
   }
   std::vector<float>* pFieldArray = &pFieldData->m_FieldSplitArray;
-  int32_t iFieldSplitCount = pdfium::CollectionSize<int32_t>(*pFieldArray);
-  if (iFieldSplitCount < (iBlockIndex * 3))
+  size_t szFieldSplitCount = pFieldArray->size();
+  if (szFieldSplitCount < szBlockIndex * 3)
     return false;
 
-  for (int32_t i = 0; i < iBlockIndex * 3; i += 3) {
+  for (size_t i = 0; i < szBlockIndex * 3; i += 3) {
     iLinesCount -= (int32_t)(*pFieldArray)[i + 1];
     fHeight -= (*pFieldArray)[i + 2];
   }
@@ -3538,7 +3538,7 @@
   float fTextHeight = iLinesCount * fLineHeight - fLineHeight + fFontSize;
   float fSpaceAbove = 0;
   float fStartOffset = 0;
-  if (fHeight > 0.1f && iBlockIndex == 0) {
+  if (fHeight > 0.1f && szBlockIndex == 0) {
     fStartOffset = fTopInset;
     fHeight -= (fTopInset + fBottomInset);
     CXFA_Para* para = GetParaIfExists();
@@ -3564,12 +3564,13 @@
     if (fStartOffset < 0.1f)
       fStartOffset = 0;
   }
-  for (int32_t i = iBlockIndex - 1; iBlockIndex > 0 && i < iBlockIndex; i++) {
+  if (szBlockIndex > 0) {
+    size_t i = szBlockIndex - 1;
     fStartOffset = (*pFieldArray)[i * 3] - (*pFieldArray)[i * 3 + 2];
     if (fStartOffset < 0.1f)
       fStartOffset = 0;
   }
-  if (iFieldSplitCount / 3 == (iBlockIndex + 1))
+  if (szFieldSplitCount / 3 == (szBlockIndex + 1))
     (*pFieldArray)[0] = fStartOffset;
   else
     pFieldArray->push_back(fStartOffset);
@@ -3602,9 +3603,9 @@
       return true;
     }
     if (fStartOffset + kXFAWidgetPrecision >= *pCalcHeight) {
-      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-        (*pFieldArray)[iBlockIndex * 3 + 1] = 0;
-        (*pFieldArray)[iBlockIndex * 3 + 2] = *pCalcHeight;
+      if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
+        (*pFieldArray)[szBlockIndex * 3 + 1] = 0;
+        (*pFieldArray)[szBlockIndex * 3 + 2] = *pCalcHeight;
       } else {
         pFieldArray->push_back(0);
         pFieldArray->push_back(*pCalcHeight);
@@ -3613,9 +3614,9 @@
     }
     if (*pCalcHeight - fStartOffset < fLineHeight) {
       *pCalcHeight = fStartOffset;
-      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-        (*pFieldArray)[iBlockIndex * 3 + 1] = 0;
-        (*pFieldArray)[iBlockIndex * 3 + 2] = *pCalcHeight;
+      if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
+        (*pFieldArray)[szBlockIndex * 3 + 1] = 0;
+        (*pFieldArray)[szBlockIndex * 3 + 2] = *pCalcHeight;
       } else {
         pFieldArray->push_back(0);
         pFieldArray->push_back(*pCalcHeight);
@@ -3628,9 +3629,9 @@
         (int32_t)((fTextNum + (fLineHeight - fFontSize)) / fLineHeight);
     if (iLineNum >= iLinesCount) {
       if (*pCalcHeight - fStartOffset - fTextHeight >= fFontSize) {
-        if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-          (*pFieldArray)[iBlockIndex * 3 + 1] = iLinesCount;
-          (*pFieldArray)[iBlockIndex * 3 + 2] = *pCalcHeight;
+        if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
+          (*pFieldArray)[szBlockIndex * 3 + 1] = iLinesCount;
+          (*pFieldArray)[szBlockIndex * 3 + 2] = *pCalcHeight;
         } else {
           pFieldArray->push_back(iLinesCount);
           pFieldArray->push_back(*pCalcHeight);
@@ -3649,9 +3650,9 @@
     }
     if (iLineNum > 0) {
       float fSplitHeight = iLineNum * fLineHeight + fCapReserve + fStartOffset;
-      if (iFieldSplitCount / 3 == (iBlockIndex + 1)) {
-        (*pFieldArray)[iBlockIndex * 3 + 1] = iLineNum;
-        (*pFieldArray)[iBlockIndex * 3 + 2] = fSplitHeight;
+      if (szFieldSplitCount / 3 == (szBlockIndex + 1)) {
+        (*pFieldArray)[szBlockIndex * 3 + 1] = iLineNum;
+        (*pFieldArray)[szBlockIndex * 3 + 2] = fSplitHeight;
       } else {
         pFieldArray->push_back(iLineNum);
         pFieldArray->push_back(fSplitHeight);
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 0bd1bde..941d5fc 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -283,7 +283,7 @@
                          float* pCalcWidth,
                          float* pCalcHeight);
   bool FindSplitPos(CXFA_FFDocView* docView,
-                    int32_t iBlockIndex,
+                    size_t szBlockIndex,
                     float* pCalcHeight);
 
   bool LoadCaption(CXFA_FFDoc* doc);
