diff --git a/core/fpdftext/cpdf_textpage.cpp b/core/fpdftext/cpdf_textpage.cpp
index 489e7d4..cc901fa 100644
--- a/core/fpdftext/cpdf_textpage.cpp
+++ b/core/fpdftext/cpdf_textpage.cpp
@@ -892,19 +892,22 @@
     m_pPrevTextObj = pPrevCharInfo->m_pTextObj;
 }
 
-void CPDF_TextPage::SwapTempTextBuf(int32_t iCharListStartAppend,
-                                    int32_t iBufStartAppend) {
-  int32_t i = iCharListStartAppend;
-  int32_t j = pdfium::CollectionSize<int32_t>(m_TempCharList) - 1;
+void CPDF_TextPage::SwapTempTextBuf(int iCharListStartAppend,
+                                    int iBufStartAppend) {
+  ASSERT(!m_TempCharList.empty());
+  int i = iCharListStartAppend;
+  int j = pdfium::CollectionSize<int>(m_TempCharList) - 1;
   for (; i < j; ++i, --j) {
     std::swap(m_TempCharList[i], m_TempCharList[j]);
     std::swap(m_TempCharList[i].m_Index, m_TempCharList[j].m_Index);
   }
-  wchar_t* pTempBuffer = m_TempTextBuf.GetBuffer();
+
+  pdfium::span<wchar_t> temp_span = m_TempTextBuf.GetWideSpan();
+  ASSERT(!temp_span.empty());
   i = iBufStartAppend;
-  j = m_TempTextBuf.GetLength() - 1;
+  j = pdfium::CollectionSize<int>(temp_span) - 1;
   for (; i < j; ++i, --j)
-    std::swap(pTempBuffer[i], pTempBuffer[j]);
+    std::swap(temp_span[i], temp_span[j]);
 }
 
 void CPDF_TextPage::ProcessTextObject(const TransformedTextObject& obj) {
diff --git a/core/fpdftext/cpdf_textpage.h b/core/fpdftext/cpdf_textpage.h
index 37cb095..20da8f5 100644
--- a/core/fpdftext/cpdf_textpage.h
+++ b/core/fpdftext/cpdf_textpage.h
@@ -129,7 +129,7 @@
       const CPDF_TextObject* pTextObj) const;
   TextOrientation FindTextlineFlowOrientation() const;
   void AppendGeneratedCharacter(wchar_t unicode, const CFX_Matrix& formMatrix);
-  void SwapTempTextBuf(int32_t iCharListStartAppend, int32_t iBufStartAppend);
+  void SwapTempTextBuf(int iCharListStartAppend, int iBufStartAppend);
   WideString GetTextByPredicate(
       const std::function<bool(const CharInfo&)>& predicate) const;
 
diff --git a/core/fxcrt/cfx_widetextbuf.cpp b/core/fxcrt/cfx_widetextbuf.cpp
index 8e91d68..44b649d 100644
--- a/core/fxcrt/cfx_widetextbuf.cpp
+++ b/core/fxcrt/cfx_widetextbuf.cpp
@@ -10,22 +10,22 @@
   return m_DataSize / sizeof(wchar_t);
 }
 
-wchar_t* CFX_WideTextBuf::GetBuffer() const {
-  return reinterpret_cast<wchar_t*>(m_pBuffer.get());
+pdfium::span<wchar_t> CFX_WideTextBuf::GetWideSpan() {
+  return pdfium::make_span(reinterpret_cast<wchar_t*>(m_pBuffer.get()),
+                           GetLength());
+}
+
+pdfium::span<const wchar_t> CFX_WideTextBuf::GetWideSpan() const {
+  return pdfium::make_span(reinterpret_cast<wchar_t*>(m_pBuffer.get()),
+                           GetLength());
 }
 
 WideStringView CFX_WideTextBuf::AsStringView() const {
-  return WideStringView(reinterpret_cast<const wchar_t*>(m_pBuffer.get()),
-                        m_DataSize / sizeof(wchar_t));
+  return WideStringView(GetWideSpan());
 }
 
 WideString CFX_WideTextBuf::MakeString() const {
-  return WideString(reinterpret_cast<const wchar_t*>(m_pBuffer.get()),
-                    m_DataSize / sizeof(wchar_t));
-}
-
-void CFX_WideTextBuf::Delete(int start_index, int count) {
-  CFX_BinaryBuf::Delete(start_index * sizeof(wchar_t), count * sizeof(wchar_t));
+  return WideString(AsStringView());
 }
 
 void CFX_WideTextBuf::AppendChar(wchar_t ch) {
@@ -34,6 +34,10 @@
   m_DataSize += sizeof(wchar_t);
 }
 
+void CFX_WideTextBuf::Delete(int start_index, int count) {
+  CFX_BinaryBuf::Delete(start_index * sizeof(wchar_t), count * sizeof(wchar_t));
+}
+
 CFX_WideTextBuf& CFX_WideTextBuf::operator<<(ByteStringView ascii) {
   ExpandBuf(ascii.GetLength() * sizeof(wchar_t));
   for (uint8_t ch : ascii) {
diff --git a/core/fxcrt/cfx_widetextbuf.h b/core/fxcrt/cfx_widetextbuf.h
index 6739d73..2232799 100644
--- a/core/fxcrt/cfx_widetextbuf.h
+++ b/core/fxcrt/cfx_widetextbuf.h
@@ -10,13 +10,15 @@
 #include "core/fxcrt/cfx_binarybuf.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
+#include "third_party/base/span.h"
 
 class CFX_WideTextBuf final : public CFX_BinaryBuf {
  public:
   // CFX_BinaryBuf:
   size_t GetLength() const override;
 
-  wchar_t* GetBuffer() const;
+  pdfium::span<wchar_t> GetWideSpan();
+  pdfium::span<const wchar_t> GetWideSpan() const;
   WideStringView AsStringView() const;
   WideString MakeString() const;
 
diff --git a/core/fxcrt/cfx_widetextbuf_unittest.cpp b/core/fxcrt/cfx_widetextbuf_unittest.cpp
index ddca23f..c8160ee 100644
--- a/core/fxcrt/cfx_widetextbuf_unittest.cpp
+++ b/core/fxcrt/cfx_widetextbuf_unittest.cpp
@@ -10,7 +10,7 @@
 
 TEST(WideTextBuf, EmptyBuf) {
   CFX_WideTextBuf wtb;
-  EXPECT_EQ(nullptr, wtb.GetBuffer());
+  EXPECT_TRUE(wtb.GetWideSpan().empty());
   EXPECT_TRUE(wtb.AsStringView().IsEmpty());
   EXPECT_TRUE(wtb.MakeString().IsEmpty());
 }
