diff --git a/xfa/fde/cfde_txtedtbuf.cpp b/xfa/fde/cfde_txtedtbuf.cpp
index b01081e..94383c2 100644
--- a/xfa/fde/cfde_txtedtbuf.cpp
+++ b/xfa/fde/cfde_txtedtbuf.cpp
@@ -67,8 +67,8 @@
   m_bChanged = true;
 }
 
-void CFDE_TxtEdtBuf::GetText(CFX_WideString& wsText) const {
-  GetRange(wsText, 0, m_nTotal);
+CFX_WideString CFDE_TxtEdtBuf::GetText() const {
+  return GetRange(0, m_nTotal);
 }
 
 FX_WCHAR CFDE_TxtEdtBuf::GetCharByIndex(int32_t nIndex) const {
@@ -88,13 +88,13 @@
   return pChunkHeader->wChars[pChunkHeader->nUsed - (nTotal - nIndex)];
 }
 
-void CFDE_TxtEdtBuf::GetRange(CFX_WideString& wsText,
-                              int32_t nBegin,
-                              int32_t nLength) const {
+CFX_WideString CFDE_TxtEdtBuf::GetRange(int32_t nBegin, int32_t nLength) const {
   FDE_CHUNKPLACE cp;
   Index2CP(nBegin, cp);
   int32_t nLeave = nLength;
   int32_t nCount = m_Chunks.GetSize();
+
+  CFX_WideString wsText;
   FX_WCHAR* lpDstBuf = wsText.GetBuffer(nLength);
   int32_t nChunkIndex = cp.nChunkIndex;
   FDE_CHUNKHEADER* lpChunkHeader = m_Chunks[nChunkIndex];
@@ -116,6 +116,8 @@
     nCopyLength = lpChunkHeader->nUsed;
   }
   wsText.ReleaseBuffer();
+
+  return wsText;
 }
 
 void CFDE_TxtEdtBuf::Insert(int32_t nPos,
diff --git a/xfa/fde/cfde_txtedtbuf.h b/xfa/fde/cfde_txtedtbuf.h
index f85dcb3..ac25a08 100644
--- a/xfa/fde/cfde_txtedtbuf.h
+++ b/xfa/fde/cfde_txtedtbuf.h
@@ -23,11 +23,9 @@
   int32_t GetChunkSize() const;
   int32_t GetTextLength() const;
   void SetText(const CFX_WideString& wsText);
-  void GetText(CFX_WideString& wsText) const;
+  CFX_WideString GetText() const;
   FX_WCHAR GetCharByIndex(int32_t nIndex) const;
-  void GetRange(CFX_WideString& wsText,
-                int32_t nBegin,
-                int32_t nCount = -1) const;
+  CFX_WideString GetRange(int32_t nBegin, int32_t nCount = -1) const;
 
   void Insert(int32_t nPos, const FX_WCHAR* lpText, int32_t nLength = 1);
   void Delete(int32_t nIndex, int32_t nLength = 1);
diff --git a/xfa/fde/cfde_txtedtengine.cpp b/xfa/fde/cfde_txtedtengine.cpp
index 3b3caf6..63a0748 100644
--- a/xfa/fde/cfde_txtedtengine.cpp
+++ b/xfa/fde/cfde_txtedtengine.cpp
@@ -160,15 +160,15 @@
   return GetTextBufLength();
 }
 
-void CFDE_TxtEdtEngine::GetText(CFX_WideString& wsText,
-                                int32_t nStart,
-                                int32_t nCount) const {
+CFX_WideString CFDE_TxtEdtEngine::GetText(int32_t nStart,
+                                          int32_t nCount) const {
   int32_t nTextBufLength = GetTextBufLength();
   if (nCount == -1)
     nCount = nTextBufLength - nStart;
 
-  m_pTxtBuf->GetRange(wsText, nStart, nCount);
+  CFX_WideString wsText = m_pTxtBuf->GetRange(nStart, nCount);
   RecoverParagEnd(wsText);
+  return wsText;
 }
 
 void CFDE_TxtEdtEngine::ClearText() {
@@ -374,9 +374,8 @@
       (m_Param.dwMode & FDE_TEXTEDITMODE_LimitArea_Horz)) {
     int32_t nTemp = nLength;
     if (m_Param.dwMode & FDE_TEXTEDITMODE_Password) {
-      CFX_WideString wsText;
       while (nLength > 0) {
-        GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+        CFX_WideString wsText = GetPreInsertText(m_nCaret, lpBuffer, nLength);
         int32_t nTotal = wsText.GetLength();
         FX_WCHAR* lpBuf = wsText.GetBuffer(nTotal);
         for (int32_t i = 0; i < nTotal; i++) {
@@ -389,9 +388,8 @@
         nLength--;
       }
     } else {
-      CFX_WideString wsText;
       while (nLength > 0) {
-        GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+        CFX_WideString wsText = GetPreInsertText(m_nCaret, lpBuffer, nLength);
         if (IsFitArea(wsText)) {
           break;
         }
@@ -406,8 +404,7 @@
     }
   }
   if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreInsertText(wsText, m_nCaret, lpBuffer, nLength);
+    CFX_WideString wsText = GetPreInsertText(m_nCaret, lpBuffer, nLength);
     if (!m_Param.pEventSink->On_Validate(this, wsText)) {
       return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
     }
@@ -420,7 +417,7 @@
         this,
         new CFDE_TxtEdtDoRecord_Insert(this, m_nCaret, lpBuffer, nLength));
 
-  GetText(m_ChangeInfo.wsPrevText, 0);
+  m_ChangeInfo.wsPrevText = GetText(0);
   Inner_Insert(m_nCaret, lpBuffer, nLength);
   m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Insert;
   m_ChangeInfo.wsInsert = CFX_WideString(lpBuffer, nLength);
@@ -468,21 +465,19 @@
     }
   }
   if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreDeleteText(wsText, nStart, nCount);
+    CFX_WideString wsText = GetPreDeleteText(nStart, nCount);
     if (!m_Param.pEventSink->On_Validate(this, wsText)) {
       return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
     }
   }
   if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
-    CFX_WideString wsRange;
-    m_pTxtBuf->GetRange(wsRange, nStart, nCount);
+    CFX_WideString wsRange = m_pTxtBuf->GetRange(nStart, nCount);
     m_Param.pEventSink->On_AddDoRecord(
         this,
         new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret, wsRange));
   }
   m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
-  GetText(m_ChangeInfo.wsDelete, nStart, nCount);
+  m_ChangeInfo.wsDelete = GetText(nStart, nCount);
   Inner_DeleteRange(nStart, nCount);
   SetCaretPos(nStart + ((!bBackspace && nStart > 0) ? -1 : 0),
               (bBackspace || nStart == 0));
@@ -501,8 +496,7 @@
     return FDE_TXTEDT_MODIFY_RET_S_Normal;
   }
   if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreDeleteText(wsText, nStart, nCount);
+    CFX_WideString wsText = GetPreDeleteText(nStart, nCount);
     if (!m_Param.pEventSink->On_Validate(this, wsText)) {
       return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
     }
@@ -523,9 +517,8 @@
     return FDE_TXTEDT_MODIFY_RET_F_Boundary;
   }
   if (m_Param.dwMode & FDE_TEXTEDITMODE_Validate) {
-    CFX_WideString wsText;
-    GetPreReplaceText(wsText, nStart, nLength, wsReplace.c_str(),
-                      wsReplace.GetLength());
+    CFX_WideString wsText = GetPreReplaceText(
+        nStart, nLength, wsReplace.c_str(), wsReplace.GetLength());
     if (!m_Param.pEventSink->On_Validate(this, wsText)) {
       return FDE_TXTEDT_MODIFY_RET_F_Invalidate;
     }
@@ -534,7 +527,7 @@
     ClearSelection();
   }
   m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Replace;
-  GetText(m_ChangeInfo.wsDelete, nStart, nLength);
+  m_ChangeInfo.wsDelete = GetText(nStart, nLength);
   if (nLength > 0) {
     Inner_DeleteRange(nStart, nLength);
   }
@@ -778,18 +771,17 @@
   return i;
 }
 
-void CFDE_TxtEdtEngine::GetPreDeleteText(CFX_WideString& wsText,
-                                         int32_t nIndex,
-                                         int32_t nLength) {
-  GetText(wsText, 0, GetTextBufLength());
+CFX_WideString CFDE_TxtEdtEngine::GetPreDeleteText(int32_t nIndex,
+                                                   int32_t nLength) {
+  CFX_WideString wsText = GetText(0, GetTextBufLength());
   wsText.Delete(nIndex, nLength);
+  return wsText;
 }
 
-void CFDE_TxtEdtEngine::GetPreInsertText(CFX_WideString& wsText,
-                                         int32_t nIndex,
-                                         const FX_WCHAR* lpText,
-                                         int32_t nLength) {
-  GetText(wsText, 0, GetTextBufLength());
+CFX_WideString CFDE_TxtEdtEngine::GetPreInsertText(int32_t nIndex,
+                                                   const FX_WCHAR* lpText,
+                                                   int32_t nLength) {
+  CFX_WideString wsText = GetText(0, GetTextBufLength());
   int32_t nSelIndex = 0;
   int32_t nSelLength = 0;
   int32_t nSelCount = CountSelRanges();
@@ -808,14 +800,14 @@
                (nOldLength - nIndex) * sizeof(FX_WCHAR));
   wsTemp.ReleaseBuffer(nOldLength + nLength);
   wsText = wsTemp;
+  return wsText;
 }
 
-void CFDE_TxtEdtEngine::GetPreReplaceText(CFX_WideString& wsText,
-                                          int32_t nIndex,
-                                          int32_t nOriginLength,
-                                          const FX_WCHAR* lpText,
-                                          int32_t nLength) {
-  GetText(wsText, 0, GetTextBufLength());
+CFX_WideString CFDE_TxtEdtEngine::GetPreReplaceText(int32_t nIndex,
+                                                    int32_t nOriginLength,
+                                                    const FX_WCHAR* lpText,
+                                                    int32_t nLength) {
+  CFX_WideString wsText = GetText(0, GetTextBufLength());
   int32_t nSelIndex = 0;
   int32_t nSelLength = 0;
   int32_t nSelCount = CountSelRanges();
@@ -825,9 +817,10 @@
   }
   wsText.Delete(nIndex, nOriginLength);
   int32_t i = 0;
-  for (i = 0; i < nLength; i++) {
+  for (i = 0; i < nLength; i++)
     wsText.Insert(nIndex++, lpText[i]);
-  }
+
+  return wsText;
 }
 
 void CFDE_TxtEdtEngine::Inner_Insert(int32_t nStart,
@@ -959,14 +952,13 @@
   ASSERT((nStart + nCount) <= m_pTxtBuf->GetTextLength());
 
   if (!(m_Param.dwMode & FDE_TEXTEDITMODE_NoRedoUndo)) {
-    CFX_WideString wsRange;
-    m_pTxtBuf->GetRange(wsRange, nStart, nCount);
+    CFX_WideString wsRange = m_pTxtBuf->GetRange(nStart, nCount);
     m_Param.pEventSink->On_AddDoRecord(
         this, new CFDE_TxtEdtDoRecord_DeleteRange(this, nStart, m_nCaret,
                                                   wsRange, bSel));
   }
   m_ChangeInfo.nChangeType = FDE_TXTEDT_TEXTCHANGE_TYPE_Delete;
-  GetText(m_ChangeInfo.wsDelete, nStart, nCount);
+  m_ChangeInfo.wsDelete = GetText(nStart, nCount);
   Inner_DeleteRange(nStart, nCount);
 }
 
diff --git a/xfa/fde/cfde_txtedtengine.h b/xfa/fde/cfde_txtedtengine.h
index 587402d..6b4c34a 100644
--- a/xfa/fde/cfde_txtedtengine.h
+++ b/xfa/fde/cfde_txtedtengine.h
@@ -31,9 +31,7 @@
   void SetTextByStream(IFX_Stream* pStream);
   void SetText(const CFX_WideString& wsText);
   int32_t GetTextLength() const;
-  void GetText(CFX_WideString& wsText,
-               int32_t nStart,
-               int32_t nCount = -1) const;
+  CFX_WideString GetText(int32_t nStart, int32_t nCount = -1) const;
   void ClearText();
 
   int32_t GetCaretRect(CFX_RectF& rtCaret) const;
@@ -102,18 +100,14 @@
   };
 
   void Inner_Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLength);
-  void GetPreDeleteText(CFX_WideString& wsText,
-                        int32_t nIndex,
-                        int32_t nLength);
-  void GetPreInsertText(CFX_WideString& wsText,
-                        int32_t nIndex,
-                        const FX_WCHAR* lpText,
-                        int32_t nLength);
-  void GetPreReplaceText(CFX_WideString& wsText,
-                         int32_t nIndex,
-                         int32_t nOriginLength,
-                         const FX_WCHAR* lpText,
-                         int32_t nLength);
+  CFX_WideString GetPreDeleteText(int32_t nIndex, int32_t nLength);
+  CFX_WideString GetPreInsertText(int32_t nIndex,
+                                  const FX_WCHAR* lpText,
+                                  int32_t nLength);
+  CFX_WideString GetPreReplaceText(int32_t nIndex,
+                                   int32_t nOriginLength,
+                                   const FX_WCHAR* lpText,
+                                   int32_t nLength);
 
   void Inner_DeleteRange(int32_t nStart, int32_t nCount = -1);
   void DeleteRange_DoRecord(int32_t nStart, int32_t nCount, bool bSel = false);
diff --git a/xfa/fwl/core/cfwl_barcode.cpp b/xfa/fwl/core/cfwl_barcode.cpp
index 18cf71e..6ddcdf3 100644
--- a/xfa/fwl/core/cfwl_barcode.cpp
+++ b/xfa/fwl/core/cfwl_barcode.cpp
@@ -165,8 +165,7 @@
   if (!m_pBarcodeEngine)
     return;
 
-  CFX_WideString wsText;
-  GetText(wsText);
+  CFX_WideString wsText = GetText();
 
   CFWL_ThemePart part;
   part.m_pWidget = this;
diff --git a/xfa/fwl/core/cfwl_combobox.cpp b/xfa/fwl/core/cfwl_combobox.cpp
index b7be67d..5996af9 100644
--- a/xfa/fwl/core/cfwl_combobox.cpp
+++ b/xfa/fwl/core/cfwl_combobox.cpp
@@ -211,9 +211,8 @@
       if (!m_pListBox)
         return;
 
-      CFX_WideString wsText;
       CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
-      m_pListBox->GetDataProviderItemText(hItem, wsText);
+      CFX_WideString wsText = m_pListBox->GetDataProviderItemText(hItem);
 
       CFWL_ThemeText theme_text;
       theme_text.m_pWidget = this;
@@ -270,9 +269,8 @@
     if (bClearSel) {
       m_pEdit->SetText(CFX_WideString());
     } else {
-      CFX_WideString wsText;
       CFWL_ListItem* hItem = m_pListBox->GetItem(this, iSel);
-      m_pListBox->GetDataProviderItemText(hItem, wsText);
+      CFX_WideString wsText = m_pListBox->GetDataProviderItemText(hItem);
       m_pEdit->SetText(wsText);
     }
     m_pEdit->Update();
@@ -296,18 +294,16 @@
   m_pEdit->Update();
 }
 
-void CFWL_ComboBox::GetEditText(CFX_WideString& wsText,
-                                int32_t nStart,
-                                int32_t nCount) const {
+CFX_WideString CFWL_ComboBox::GetEditText(int32_t nStart,
+                                          int32_t nCount) const {
   if (m_pEdit) {
-    m_pEdit->GetText(wsText, nStart, nCount);
-    return;
+    return m_pEdit->GetText(nStart, nCount);
   }
   if (!m_pListBox)
-    return;
+    return L"";
 
   CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
-  m_pListBox->GetDataProviderItemText(hItem, wsText);
+  return m_pListBox->GetDataProviderItemText(hItem);
 }
 
 void CFWL_ComboBox::OpenDropDownList(bool bActivate) {
@@ -414,8 +410,7 @@
 }
 
 void CFWL_ComboBox::MatchEditText() {
-  CFX_WideString wsText;
-  m_pEdit->GetText(wsText);
+  CFX_WideString wsText = m_pEdit->GetText();
   int32_t iMatch = m_pListBox->MatchItem(wsText);
   if (iMatch != m_iCurSel) {
     m_pListBox->ChangeSelected(iMatch);
@@ -428,9 +423,8 @@
 }
 
 void CFWL_ComboBox::SyncEditText(int32_t iListItem) {
-  CFX_WideString wsText;
   CFWL_ListItem* hItem = m_pListBox->GetItem(this, iListItem);
-  m_pListBox->GetDataProviderItemText(hItem, wsText);
+  CFX_WideString wsText = m_pListBox->GetDataProviderItemText(hItem);
   m_pEdit->SetText(wsText);
   m_pEdit->Update();
   m_pEdit->SetSelected();
@@ -458,9 +452,8 @@
   m_pEdit->SetWidgetRect(rtEdit);
 
   if (m_iCurSel >= 0) {
-    CFX_WideString wsText;
     CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
-    m_pListBox->GetDataProviderItemText(hItem, wsText);
+    CFX_WideString wsText = m_pListBox->GetDataProviderItemText(hItem);
     m_pEdit->LockUpdate();
     m_pEdit->SetText(wsText);
     m_pEdit->UnlockUpdate();
@@ -553,8 +546,7 @@
   if (!hItem)
     return;
 
-  CFX_WideString wsText;
-  m_pListBox->GetItemText(this, hItem, wsText);
+  CFX_WideString wsText = m_pListBox->GetItemText(this, hItem);
   if (m_pEdit) {
     m_pEdit->SetText(wsText);
     m_pEdit->Update();
@@ -785,9 +777,8 @@
   m_pEdit->SetWidgetRect(rtEdit);
 
   if (m_iCurSel >= 0) {
-    CFX_WideString wsText;
     CFWL_ListItem* hItem = m_pListBox->GetItem(this, m_iCurSel);
-    m_pListBox->GetDataProviderItemText(hItem, wsText);
+    CFX_WideString wsText = m_pListBox->GetDataProviderItemText(hItem);
     m_pEdit->LockUpdate();
     m_pEdit->SetText(wsText);
     m_pEdit->UnlockUpdate();
@@ -964,13 +955,11 @@
     int32_t iCurSel = m_iCurSel;
     bool bDropDown = IsDropDownStyle();
     if (bDropDown && m_pEdit) {
-      CFX_WideString wsText;
-      m_pEdit->GetText(wsText);
+      CFX_WideString wsText = m_pEdit->GetText();
       iCurSel = m_pListBox->MatchItem(wsText);
       if (iCurSel >= 0) {
-        CFX_WideString wsTemp;
         CFWL_ListItem* hItem = m_pListBox->GetItem(this, iCurSel);
-        m_pListBox->GetDataProviderItemText(hItem, wsTemp);
+        CFX_WideString wsTemp = m_pListBox->GetDataProviderItemText(hItem);
         bMatchEqual = wsText == wsTemp;
       }
     }
@@ -1100,13 +1089,11 @@
     bool bMatchEqual = false;
     int32_t iCurSel = m_iCurSel;
     if (m_pEdit) {
-      CFX_WideString wsText;
-      m_pEdit->GetText(wsText);
+      CFX_WideString wsText = m_pEdit->GetText();
       iCurSel = pComboList->MatchItem(wsText);
       if (iCurSel >= 0) {
-        CFX_WideString wsTemp;
         CFWL_ListItem* item = m_pListBox->GetSelItem(iCurSel);
-        m_pListBox->GetDataProviderItemText(item, wsTemp);
+        CFX_WideString wsTemp = m_pListBox->GetDataProviderItemText(item);
         bMatchEqual = wsText == wsTemp;
       }
     }
diff --git a/xfa/fwl/core/cfwl_combobox.h b/xfa/fwl/core/cfwl_combobox.h
index a454519..b9f4897 100644
--- a/xfa/fwl/core/cfwl_combobox.h
+++ b/xfa/fwl/core/cfwl_combobox.h
@@ -77,9 +77,7 @@
   void RemoveAll();
 
   void SetEditText(const CFX_WideString& wsText);
-  void GetEditText(CFX_WideString& wsText,
-                   int32_t nStart = 0,
-                   int32_t nCount = -1) const;
+  CFX_WideString GetEditText(int32_t nStart = 0, int32_t nCount = -1) const;
 
   void OpenDropDownList(bool bActivate);
 
diff --git a/xfa/fwl/core/cfwl_combolist.cpp b/xfa/fwl/core/cfwl_combolist.cpp
index 0476498..e333cda 100644
--- a/xfa/fwl/core/cfwl_combolist.cpp
+++ b/xfa/fwl/core/cfwl_combolist.cpp
@@ -32,8 +32,7 @@
   int32_t iCount = CountItems(this);
   for (int32_t i = 0; i < iCount; i++) {
     CFWL_ListItem* hItem = GetItem(this, i);
-    CFX_WideString wsText;
-    GetItemText(this, hItem, wsText);
+    CFX_WideString wsText = GetItemText(this, hItem);
     FX_STRSIZE pos = wsText.Find(wsMatch.c_str());
     if (!pos)
       return i;
diff --git a/xfa/fwl/core/cfwl_datetimepicker.cpp b/xfa/fwl/core/cfwl_datetimepicker.cpp
index 142daf5..35b038d 100644
--- a/xfa/fwl/core/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/core/cfwl_datetimepicker.cpp
@@ -196,11 +196,9 @@
   DispatchEvent(&ev);
 }
 
-void CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText,
-                                      int32_t nStart,
-                                      int32_t nCount) const {
-  if (m_pEdit)
-    m_pEdit->GetText(wsText, nStart, nCount);
+CFX_WideString CFWL_DateTimePicker::GetEditText(int32_t nStart,
+                                                int32_t nCount) const {
+  return m_pEdit ? m_pEdit->GetText(nStart, nCount) : L"";
 }
 
 void CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) const {
diff --git a/xfa/fwl/core/cfwl_datetimepicker.h b/xfa/fwl/core/cfwl_datetimepicker.h
index c5dd0ae..69e4ef3 100644
--- a/xfa/fwl/core/cfwl_datetimepicker.h
+++ b/xfa/fwl/core/cfwl_datetimepicker.h
@@ -56,9 +56,7 @@
   void SetCurSel(int32_t iYear, int32_t iMonth, int32_t iDay);
 
   void SetEditText(const CFX_WideString& wsText);
-  void GetEditText(CFX_WideString& wsText,
-                   int32_t nStart = 0,
-                   int32_t nCount = -1) const;
+  CFX_WideString GetEditText(int32_t nStart = 0, int32_t nCount = -1) const;
 
   int32_t CountSelRanges() const { return m_pEdit->CountSelRanges(); }
   int32_t GetSelRange(int32_t nIndex, int32_t& nStart) const {
diff --git a/xfa/fwl/core/cfwl_edit.cpp b/xfa/fwl/core/cfwl_edit.cpp
index 99cac68..4544ebc 100644
--- a/xfa/fwl/core/cfwl_edit.cpp
+++ b/xfa/fwl/core/cfwl_edit.cpp
@@ -113,8 +113,7 @@
 
   int32_t iTextLen = m_EdtEngine.GetTextLength();
   if (iTextLen > 0) {
-    CFX_WideString wsText;
-    m_EdtEngine.GetText(wsText, 0);
+    CFX_WideString wsText = m_EdtEngine.GetText(0);
     CFX_SizeF sz = CalcTextSize(
         wsText, m_pProperties->m_pThemeProvider,
         !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine));
@@ -212,8 +211,7 @@
   FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
   FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
 
-  CFX_WideString wsSpell;
-  GetText(wsSpell);
+  CFX_WideString wsSpell = GetText();
   int32_t nContentLen = wsSpell.GetLength();
   for (int i = 0; i < nContentLen; i++) {
     if (FX_EDIT_ISLATINWORD(wsSpell[i])) {
@@ -300,10 +298,8 @@
   return m_EdtEngine.GetTextLength();
 }
 
-void CFWL_Edit::GetText(CFX_WideString& wsText,
-                        int32_t nStart,
-                        int32_t nCount) const {
-  m_EdtEngine.GetText(wsText, nStart, nCount);
+CFX_WideString CFWL_Edit::GetText(int32_t nStart, int32_t nCount) const {
+  return m_EdtEngine.GetText(nStart, nCount);
 }
 
 void CFWL_Edit::ClearText() {
@@ -349,7 +345,7 @@
   int32_t nStart, nLength;
   for (int32_t i = 0; i < nCount; i++) {
     nLength = m_EdtEngine.GetSelRange(i, nStart);
-    m_EdtEngine.GetText(wsTemp, nStart, nLength);
+    wsTemp = m_EdtEngine.GetText(nStart, nLength);
     wsCopy += wsTemp;
     wsTemp.clear();
   }
@@ -366,7 +362,7 @@
   int32_t nStart, nLength;
   for (int32_t i = 0; i < nCount; i++) {
     nLength = m_EdtEngine.GetSelRange(i, nStart);
-    m_EdtEngine.GetText(wsTemp, nStart, nLength);
+    wsTemp = m_EdtEngine.GetText(nStart, nLength);
     wsCut += wsTemp;
     wsTemp.clear();
   }
@@ -1232,8 +1228,7 @@
   if (!m_bSetRange)
     return true;
 
-  CFX_WideString wsOld, wsText;
-  m_EdtEngine.GetText(wsText, 0);
+  CFX_WideString wsText = m_EdtEngine.GetText(0);
   if (wsText.IsEmpty()) {
     if (cNum == L'0')
       return false;
diff --git a/xfa/fwl/core/cfwl_edit.h b/xfa/fwl/core/cfwl_edit.h
index 3c4c807..342c6dd 100644
--- a/xfa/fwl/core/cfwl_edit.h
+++ b/xfa/fwl/core/cfwl_edit.h
@@ -80,9 +80,7 @@
   virtual void SetText(const CFX_WideString& wsText);
 
   int32_t GetTextLength() const;
-  void GetText(CFX_WideString& wsText,
-               int32_t nStart = 0,
-               int32_t nCount = -1) const;
+  CFX_WideString GetText(int32_t nStart = 0, int32_t nCount = -1) const;
   void ClearText();
 
   void AddSelRange(int32_t nStart, int32_t nCount = -1);
diff --git a/xfa/fwl/core/cfwl_listbox.cpp b/xfa/fwl/core/cfwl_listbox.cpp
index 1208ab3..dff981f 100644
--- a/xfa/fwl/core/cfwl_listbox.cpp
+++ b/xfa/fwl/core/cfwl_listbox.cpp
@@ -202,11 +202,10 @@
     SetSelection(pItem, pItem, bSelect);
 }
 
-void CFWL_ListBox::GetDataProviderItemText(CFWL_ListItem* pItem,
-                                           CFX_WideString& wsText) {
+CFX_WideString CFWL_ListBox::GetDataProviderItemText(CFWL_ListItem* pItem) {
   if (!pItem)
-    return;
-  GetItemText(this, pItem, wsText);
+    return L"";
+  return GetItemText(this, pItem);
 }
 
 CFWL_ListItem* CFWL_ListBox::GetListItem(CFWL_ListItem* pItem,
@@ -544,8 +543,7 @@
     pTheme->DrawBackground(&param);
   }
 
-  CFX_WideString wsText;
-  GetItemText(this, pItem, wsText);
+  CFX_WideString wsText = GetItemText(this, pItem);
   if (wsText.GetLength() <= 0)
     return;
 
@@ -719,8 +717,7 @@
     if (!pItem)
       continue;
 
-    CFX_WideString wsText;
-    GetItemText(this, pItem, wsText);
+    CFX_WideString wsText = GetItemText(this, pItem);
     CFX_SizeF sz = CalcTextSize(wsText, m_pProperties->m_pThemeProvider);
     fRet = std::max(fRet, sz.x);
   }
@@ -1006,11 +1003,9 @@
   return true;
 }
 
-void CFWL_ListBox::GetItemText(CFWL_Widget* pWidget,
-                               CFWL_ListItem* pItem,
-                               CFX_WideString& wsText) {
-  if (pItem)
-    wsText = static_cast<CFWL_ListItem*>(pItem)->m_wsText;
+CFX_WideString CFWL_ListBox::GetItemText(CFWL_Widget* pWidget,
+                                         CFWL_ListItem* pItem) {
+  return pItem ? static_cast<CFWL_ListItem*>(pItem)->m_wsText : L"";
 }
 
 int32_t CFWL_ListBox::CountItems(const CFWL_Widget* pWidget) const {
diff --git a/xfa/fwl/core/cfwl_listbox.h b/xfa/fwl/core/cfwl_listbox.h
index a2dcdba..e30068b 100644
--- a/xfa/fwl/core/cfwl_listbox.h
+++ b/xfa/fwl/core/cfwl_listbox.h
@@ -63,9 +63,7 @@
   int32_t GetItemIndex(CFWL_Widget* pWidget, CFWL_ListItem* pItem);
   uint32_t GetItemStyles(CFWL_Widget* pWidget, CFWL_ListItem* pItem);
   uint32_t GetItemStates(CFWL_ListItem* pItem);
-  void GetItemText(CFWL_Widget* pWidget,
-                   CFWL_ListItem* pItem,
-                   CFX_WideString& wsText);
+  CFX_WideString GetItemText(CFWL_Widget* pWidget, CFWL_ListItem* pItem);
   void GetItemRect(CFWL_Widget* pWidget,
                    CFWL_ListItem* pItem,
                    CFX_RectF& rtItem);
@@ -96,7 +94,7 @@
   CFWL_ListItem* GetSelItem(int32_t nIndexSel);
   int32_t GetSelIndex(int32_t nIndex);
   void SetSelItem(CFWL_ListItem* hItem, bool bSelect = true);
-  void GetDataProviderItemText(CFWL_ListItem* hItem, CFX_WideString& wsText);
+  CFX_WideString GetDataProviderItemText(CFWL_ListItem* hItem);
 
   FX_FLOAT GetItemHeight() const { return m_fItemHeight; }
   FX_FLOAT CalcItemHeight();
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.cpp b/xfa/fxfa/app/xfa_ffchoicelist.cpp
index b289a39..c9a5136 100644
--- a/xfa/fxfa/app/xfa_ffchoicelist.cpp
+++ b/xfa/fxfa/app/xfa_ffchoicelist.cpp
@@ -160,8 +160,10 @@
   CFWL_ListBox* pListBox = (CFWL_ListBox*)m_pNormalWidget;
   int32_t iSels = pListBox->CountSelItems();
   if (iSels > 0) {
-    pListBox->GetItemText(nullptr, pListBox->GetSelItem(0), eParam.m_wsNewText);
+    eParam.m_wsNewText =
+        pListBox->GetItemText(nullptr, pListBox->GetSelItem(0));
   }
+
   m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, &eParam);
 }
 void CXFA_FFListBox::SetItemState(int32_t nIndex, bool bSelected) {
@@ -316,8 +318,7 @@
 }
 bool CXFA_FFComboBox::IsDataChanged() {
   CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
-  CFX_WideString wsText;
-  pFWLcombobox->GetEditText(wsText);
+  CFX_WideString wsText = pFWLcombobox->GetEditText();
   int32_t iCursel = pFWLcombobox->GetCurSel();
   if (iCursel >= 0) {
     CFX_WideString wsSel;
@@ -338,7 +339,7 @@
   pParam->m_eType = XFA_EVENT_Change;
   pParam->m_pTarget = m_pDataAcc;
   CFWL_ComboBox* pFWLcombobox = ((CFWL_ComboBox*)m_pNormalWidget);
-  pFWLcombobox->GetEditText(pParam->m_wsNewText);
+  pParam->m_wsNewText = pFWLcombobox->GetEditText();
   m_pDataAcc->ProcessEvent(XFA_ATTRIBUTEENUM_Change, pParam);
 }
 uint32_t CXFA_FFComboBox::GetAlignment() {
diff --git a/xfa/fxfa/app/xfa_fftextedit.cpp b/xfa/fxfa/app/xfa_fftextedit.cpp
index 77ca7a6..a070f90 100644
--- a/xfa/fxfa/app/xfa_fftextedit.cpp
+++ b/xfa/fxfa/app/xfa_fftextedit.cpp
@@ -187,8 +187,7 @@
   return true;
 }
 bool CXFA_FFTextEdit::CommitData() {
-  CFX_WideString wsText;
-  ((CFWL_Edit*)m_pNormalWidget)->GetText(wsText);
+  CFX_WideString wsText = static_cast<CFWL_Edit*>(m_pNormalWidget)->GetText();
   if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
     m_pDataAcc->UpdateUIDisplay(this);
     return true;
@@ -283,8 +282,8 @@
   }
   CFX_WideString wsText;
   m_pDataAcc->GetValue(wsText, eType);
-  CFX_WideString wsOldText;
-  ((CFWL_Edit*)m_pNormalWidget)->GetText(wsOldText);
+  CFX_WideString wsOldText =
+      static_cast<CFWL_Edit*>(m_pNormalWidget)->GetText();
   if (wsText != wsOldText || (eType == XFA_VALUEPICTURE_Edit && bUpdate)) {
     ((CFWL_Edit*)m_pNormalWidget)->SetText(wsText);
     bUpdate = true;
@@ -306,13 +305,13 @@
   CFWL_Edit* pEdit = ((CFWL_Edit*)m_pNormalWidget);
   if (m_pDataAcc->GetUIType() == XFA_Element::DateTimeEdit) {
     CFWL_DateTimePicker* pDateTime = (CFWL_DateTimePicker*)pEdit;
-    pDateTime->GetEditText(eParam.m_wsNewText);
+    eParam.m_wsNewText = pDateTime->GetEditText();
     int32_t iSels = pDateTime->CountSelRanges();
     if (iSels) {
       eParam.m_iSelEnd = pDateTime->GetSelRange(0, eParam.m_iSelStart);
     }
   } else {
-    pEdit->GetText(eParam.m_wsNewText);
+    eParam.m_wsNewText = pEdit->GetText();
     int32_t iSels = pEdit->CountSelRanges();
     if (iSels) {
       eParam.m_iSelEnd = pEdit->GetSelRange(0, eParam.m_iSelStart);
@@ -616,8 +615,8 @@
   return dwExtendedStyle;
 }
 bool CXFA_FFDateTimeEdit::CommitData() {
-  CFX_WideString wsText;
-  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
+  CFX_WideString wsText =
+      static_cast<CFWL_DateTimePicker*>(m_pNormalWidget)->GetEditText();
   if (m_pDataAcc->SetValue(wsText, XFA_VALUEPICTURE_Edit)) {
     m_pDataAcc->UpdateUIDisplay(this);
     return true;
@@ -652,8 +651,8 @@
   if (m_dwStatus & XFA_WidgetStatus_TextEditValueChanged) {
     return true;
   }
-  CFX_WideString wsText;
-  ((CFWL_DateTimePicker*)m_pNormalWidget)->GetEditText(wsText);
+  CFX_WideString wsText =
+      static_cast<CFWL_DateTimePicker*>(m_pNormalWidget)->GetEditText();
   CFX_WideString wsOldValue;
   m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Edit);
   return wsOldValue != wsText;
