diff --git a/xfa/fwl/core/cfwl_combobox.cpp b/xfa/fwl/core/cfwl_combobox.cpp
index bd045f4..1a75927 100644
--- a/xfa/fwl/core/cfwl_combobox.cpp
+++ b/xfa/fwl/core/cfwl_combobox.cpp
@@ -127,11 +127,6 @@
                      : FWL_Error::Indefinite;
 }
 
-FWL_Error CFWL_ComboBox::EditDoClipboard(int32_t iCmd) {
-  return GetWidget() ? ToComboBox(GetWidget())->EditDoClipboard(iCmd)
-                     : FWL_Error::Indefinite;
-}
-
 bool CFWL_ComboBox::EditRedo(const IFDE_TxtEdtDoRecord* pRecord) {
   return GetWidget() ? ToComboBox(GetWidget())->EditRedo(pRecord) : false;
 }
diff --git a/xfa/fwl/core/cfwl_combobox.h b/xfa/fwl/core/cfwl_combobox.h
index 8486471..2467119 100644
--- a/xfa/fwl/core/cfwl_combobox.h
+++ b/xfa/fwl/core/cfwl_combobox.h
@@ -37,7 +37,6 @@
   int32_t GetEditSelRange(int32_t nIndex, int32_t& nStart);
   int32_t GetEditLimit();
   FWL_Error SetEditLimit(int32_t nLimit);
-  FWL_Error EditDoClipboard(int32_t iCmd);
   bool EditRedo(const IFDE_TxtEdtDoRecord* pRecord);
   bool EditUndo(const IFDE_TxtEdtDoRecord* pRecord);
   FWL_Error SetMaxListHeight(FX_FLOAT fMaxHeight);
diff --git a/xfa/fwl/core/cfwl_edit.cpp b/xfa/fwl/core/cfwl_edit.cpp
index 579442b..c7acf18 100644
--- a/xfa/fwl/core/cfwl_edit.cpp
+++ b/xfa/fwl/core/cfwl_edit.cpp
@@ -17,10 +17,6 @@
   return static_cast<IFWL_Edit*>(widget);
 }
 
-const IFWL_Edit* ToEdit(const IFWL_Widget* widget) {
-  return static_cast<const IFWL_Edit*>(widget);
-}
-
 }  // namespace
 
 CFWL_Edit::CFWL_Edit(const IFWL_App* app) : CFWL_Widget(app) {}
@@ -36,202 +32,41 @@
   CFWL_Widget::Initialize();
 }
 
-FWL_Error CFWL_Edit::SetText(const CFX_WideString& wsText) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->SetText(wsText);
+void CFWL_Edit::SetText(const CFX_WideString& wsText) {
+  if (GetWidget())
+    ToEdit(GetWidget())->SetText(wsText);
 }
 
-int32_t CFWL_Edit::GetTextLength() const {
-  if (!GetWidget())
-    return 0;
-  return ToEdit(GetWidget())->GetTextLength();
-}
-
-FWL_Error CFWL_Edit::GetText(CFX_WideString& wsText,
-                             int32_t nStart,
-                             int32_t nCount) const {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->GetText(wsText, nStart, nCount);
-}
-
-FWL_Error CFWL_Edit::ClearText() {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->ClearText();
-}
-
-int32_t CFWL_Edit::GetCaretPos() const {
-  if (!GetWidget())
-    return -1;
-  return ToEdit(GetWidget())->GetCaretPos();
-}
-
-int32_t CFWL_Edit::SetCaretPos(int32_t nIndex, bool bBefore) {
-  if (!GetWidget())
-    return -1;
-  return ToEdit(GetWidget())->SetCaretPos(nIndex, bBefore);
-}
-
-int32_t CFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
-  if (!GetWidget())
-    return -1;
-  ToEdit(GetWidget())->AddSelRange(nStart, nCount);
-  int32_t pos = 0;
-  int32_t sum = ToEdit(GetWidget())->GetTextLength();
-  if (nCount == -1) {
-    pos = sum;
-  } else {
-    pos = nStart + nCount;
-  }
-  return ToEdit(GetWidget())->SetCaretPos(pos);
+void CFWL_Edit::GetText(CFX_WideString& wsText,
+                        int32_t nStart,
+                        int32_t nCount) {
+  if (GetWidget())
+    ToEdit(GetWidget())->GetText(wsText, nStart, nCount);
 }
 
 int32_t CFWL_Edit::CountSelRanges() {
-  if (!GetWidget())
-    return 0;
-  return ToEdit(GetWidget())->CountSelRanges();
+  return GetWidget() ? ToEdit(GetWidget())->CountSelRanges() : 0;
 }
 
 int32_t CFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  if (!GetWidget())
-    return 0;
-  return ToEdit(GetWidget())->GetSelRange(nIndex, nStart);
-}
-
-FWL_Error CFWL_Edit::ClearSelections() {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->ClearSelections();
+  return GetWidget() ? ToEdit(GetWidget())->GetSelRange(nIndex, nStart) : 0;
 }
 
 int32_t CFWL_Edit::GetLimit() {
-  if (!GetWidget())
-    return -1;
-  return ToEdit(GetWidget())->GetLimit();
+  return GetWidget() ? ToEdit(GetWidget())->GetLimit() : -1;
 }
 
-FWL_Error CFWL_Edit::SetLimit(int32_t nLimit) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->SetLimit(nLimit);
+void CFWL_Edit::SetLimit(int32_t nLimit) {
+  if (GetWidget())
+    ToEdit(GetWidget())->SetLimit(nLimit);
 }
 
-FWL_Error CFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->SetAliasChar(wAlias);
-}
-
-FWL_Error CFWL_Edit::Insert(int32_t nStart,
-                            const FX_WCHAR* lpText,
-                            int32_t nLen) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->Insert(nStart, lpText, nLen);
-}
-
-FWL_Error CFWL_Edit::DeleteSelections() {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->DeleteSelections();
-}
-
-FWL_Error CFWL_Edit::DeleteRange(int32_t nStart, int32_t nCount) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->DeleteRange(nStart, nCount);
-}
-
-FWL_Error CFWL_Edit::Replace(int32_t nStart,
-                             int32_t nLen,
-                             const CFX_WideStringC& wsReplace) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->Replace(nStart, nLen, wsReplace);
-}
-
-FWL_Error CFWL_Edit::DoClipboard(int32_t iCmd) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->DoClipboard(iCmd);
-}
-
-bool CFWL_Edit::Redo(const IFDE_TxtEdtDoRecord* pRecord) {
-  return GetWidget() && ToEdit(GetWidget())->Redo(pRecord);
-}
-
-bool CFWL_Edit::Undo(const IFDE_TxtEdtDoRecord* pRecord) {
-  return GetWidget() && ToEdit(GetWidget())->Undo(pRecord);
-}
-
-FWL_Error CFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, bool bEquidistant) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->SetTabWidth(fTabWidth, bEquidistant);
-}
-
-FWL_Error CFWL_Edit::SetNumberRange(int32_t iMin, int32_t iMax) {
-  if (iMin > iMax)
-    return FWL_Error::ParameterInvalid;
-  return ToEdit(GetWidget())->SetNumberRange(iMin, iMax);
-}
-
-FWL_Error CFWL_Edit::SetBackColor(uint32_t dwColor) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->SetBackgroundColor(dwColor);
-}
-
-FWL_Error CFWL_Edit::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
-  if (!GetWidget())
-    return FWL_Error::Indefinite;
-  return ToEdit(GetWidget())->SetFont(wsFont, fSize);
-}
-
-bool CFWL_Edit::CanUndo() {
-  return ToEdit(GetWidget())->CanUndo();
-}
-
-bool CFWL_Edit::CanRedo() {
-  return ToEdit(GetWidget())->CanRedo();
-}
-
-bool CFWL_Edit::Undo() {
-  return ToEdit(GetWidget())->Undo();
-}
-
-bool CFWL_Edit::Redo() {
-  return ToEdit(GetWidget())->Undo();
-}
-
-bool CFWL_Edit::Copy(CFX_WideString& wsCopy) {
-  return ToEdit(GetWidget())->Copy(wsCopy);
-}
-
-bool CFWL_Edit::Cut(CFX_WideString& wsCut) {
-  return ToEdit(GetWidget())->Cut(wsCut);
-}
-
-bool CFWL_Edit::Paste(const CFX_WideString& wsPaste) {
-  return ToEdit(GetWidget())->Paste(wsPaste);
-}
-
-bool CFWL_Edit::Delete() {
-  return ToEdit(GetWidget())->Delete();
+void CFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
+  if (GetWidget())
+    ToEdit(GetWidget())->SetAliasChar(wAlias);
 }
 
 void CFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) {
-  return ToEdit(GetWidget())->SetScrollOffset(fScrollOffset);
-}
-
-bool CFWL_Edit::GetSuggestWords(CFX_PointF pointf,
-                                std::vector<CFX_ByteString>& sSuggest) {
-  return ToEdit(GetWidget())->GetSuggestWords(pointf, sSuggest);
-}
-
-bool CFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf,
-                                      const CFX_ByteStringC& bsReplace) {
-  return ToEdit(GetWidget())->ReplaceSpellCheckWord(pointf, bsReplace);
+  if (GetWidget())
+    ToEdit(GetWidget())->SetScrollOffset(fScrollOffset);
 }
diff --git a/xfa/fwl/core/cfwl_edit.h b/xfa/fwl/core/cfwl_edit.h
index 2f2983b..a3a77a7 100644
--- a/xfa/fwl/core/cfwl_edit.h
+++ b/xfa/fwl/core/cfwl_edit.h
@@ -21,48 +21,14 @@
 
   void Initialize();
 
-  FWL_Error SetText(const CFX_WideString& wsText);
-  int32_t GetTextLength() const;
-  FWL_Error GetText(CFX_WideString& wsText,
-                    int32_t nStart = 0,
-                    int32_t nCount = -1) const;
-  FWL_Error ClearText();
-  int32_t GetCaretPos() const;
-  int32_t SetCaretPos(int32_t nIndex, bool bBefore = true);
-  int32_t AddSelRange(int32_t nStart, int32_t nCount = -1);
+  void SetText(const CFX_WideString& wsText);
+  void GetText(CFX_WideString& wsText, int32_t nStart = 0, int32_t nCount = -1);
   int32_t CountSelRanges();
   int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
-  FWL_Error ClearSelections();
   int32_t GetLimit();
-  FWL_Error SetLimit(int32_t nLimit);
-  FWL_Error SetAliasChar(FX_WCHAR wAlias);
-  FWL_Error SetFormatString(const CFX_WideString& wsFormat);
-  FWL_Error Insert(int32_t nStart, const FX_WCHAR* lpText, int32_t nLen);
-  FWL_Error DeleteSelections();
-  FWL_Error DeleteRange(int32_t nStart, int32_t nCount = -1);
-  FWL_Error Replace(int32_t nStart,
-                    int32_t nLen,
-                    const CFX_WideStringC& wsReplace);
-  FWL_Error DoClipboard(int32_t iCmd);
-  bool Redo(const IFDE_TxtEdtDoRecord* pRecord);
-  bool Undo(const IFDE_TxtEdtDoRecord* pRecord);
-  FWL_Error SetTabWidth(FX_FLOAT fTabWidth, bool bEquidistant);
-  FWL_Error SetNumberRange(int32_t iMin, int32_t iMax);
-  FWL_Error SetBackColor(uint32_t dwColor);
-  FWL_Error SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize);
-  bool CanUndo();
-  bool CanRedo();
-  bool Undo();
-  bool Redo();
-  bool Copy(CFX_WideString& wsCopy);
-  bool Cut(CFX_WideString& wsCut);
-  bool Paste(const CFX_WideString& wsPaste);
-  bool Delete();
+  void SetLimit(int32_t nLimit);
+  void SetAliasChar(FX_WCHAR wAlias);
   void SetScrollOffset(FX_FLOAT fScrollOffset);
-  bool GetSuggestWords(CFX_PointF pointf,
-                       std::vector<CFX_ByteString>& sSuggest);
-  bool ReplaceSpellCheckWord(CFX_PointF pointf,
-                             const CFX_ByteStringC& bsReplace);
 };
 
 #endif  // XFA_FWL_CORE_CFWL_EDIT_H_
diff --git a/xfa/fwl/core/cfwl_event.h b/xfa/fwl/core/cfwl_event.h
index ba8a4d6..0052c4e 100644
--- a/xfa/fwl/core/cfwl_event.h
+++ b/xfa/fwl/core/cfwl_event.h
@@ -41,7 +41,6 @@
   DrawItem,
   DropDown,
   EditChanged,
-  GetSuggestedWords,
   HoverChanged,
   Idle,
   Key,
diff --git a/xfa/fwl/core/ifwl_barcode.cpp b/xfa/fwl/core/ifwl_barcode.cpp
index 518ed4a..c918b3b 100644
--- a/xfa/fwl/core/ifwl_barcode.cpp
+++ b/xfa/fwl/core/ifwl_barcode.cpp
@@ -45,8 +45,8 @@
       return;
     }
     CFX_Matrix mt;
-    mt.e = m_rtClient.left;
-    mt.f = m_rtClient.top;
+    mt.e = GetRTClient().left;
+    mt.f = GetRTClient().top;
     if (pMatrix) {
       mt.Concat(*pMatrix);
     }
@@ -69,8 +69,8 @@
   if (!m_pBarcodeEngine)
     return;
   CFX_WideString wsText;
-  if (GetText(wsText) != FWL_Error::Succeeded)
-    return;
+  GetText(wsText);
+
   CFWL_ThemePart part;
   part.m_pWidget = this;
   IFWL_ThemeProvider* pTheme = GetAvailableTheme();
@@ -90,8 +90,8 @@
   if (pFontColor) {
     m_pBarcodeEngine->SetFontColor(*pFontColor);
   }
-  m_pBarcodeEngine->SetHeight(int32_t(m_rtClient.height));
-  m_pBarcodeEngine->SetWidth(int32_t(m_rtClient.width));
+  m_pBarcodeEngine->SetHeight(int32_t(GetRTClient().height));
+  m_pBarcodeEngine->SetWidth(int32_t(GetRTClient().width));
   uint32_t dwAttributeMask = pData->GetBarcodeAttributeMask();
   if (dwAttributeMask & FWL_BCDATTRIBUTE_CHARENCODING) {
     m_pBarcodeEngine->SetCharEncoding(pData->GetCharEncoding());
@@ -155,10 +155,10 @@
   m_type = type;
   m_dwStatus = XFA_BCS_NeedUpdate;
 }
-FWL_Error IFWL_Barcode::SetText(const CFX_WideString& wsText) {
+void IFWL_Barcode::SetText(const CFX_WideString& wsText) {
   m_pBarcodeEngine.reset();
   m_dwStatus = XFA_BCS_NeedUpdate;
-  return IFWL_Edit::SetText(wsText);
+  IFWL_Edit::SetText(wsText);
 }
 bool IFWL_Barcode::IsProtectedType() {
   if (!m_pBarcodeEngine) {
diff --git a/xfa/fwl/core/ifwl_barcode.h b/xfa/fwl/core/ifwl_barcode.h
index 28025fc..1d88c32 100644
--- a/xfa/fwl/core/ifwl_barcode.h
+++ b/xfa/fwl/core/ifwl_barcode.h
@@ -9,6 +9,7 @@
 
 #include <memory>
 
+#include "xfa/fwl/core/ifwl_dataprovider.h"
 #include "xfa/fwl/core/ifwl_edit.h"
 #include "xfa/fwl/core/ifwl_scrollbar.h"
 #include "xfa/fxbarcode/BC_Library.h"
@@ -37,7 +38,7 @@
   FWL_BCDATTRIBUTE_TRUNCATED = 1 << 12
 };
 
-class IFWL_BarcodeDP : public IFWL_EditDP {
+class IFWL_BarcodeDP : public IFWL_DataProvider {
  public:
   virtual BC_CHAR_ENCODING GetCharEncoding() const = 0;
   virtual int32_t GetModuleHeight() const = 0;
@@ -66,9 +67,11 @@
   void Update() override;
   void DrawWidget(CFX_Graphics* pGraphics,
                   const CFX_Matrix* pMatrix = nullptr) override;
-  FWL_Error SetText(const CFX_WideString& wsText) override;
   void OnProcessEvent(CFWL_Event* pEvent) override;
 
+  // IFWL_Edit
+  void SetText(const CFX_WideString& wsText) override;
+
   void SetType(BC_TYPE type);
   bool IsProtectedType();
 
diff --git a/xfa/fwl/core/ifwl_combobox.cpp b/xfa/fwl/core/ifwl_combobox.cpp
index b0fc9a3..e8534a4 100644
--- a/xfa/fwl/core/ifwl_combobox.cpp
+++ b/xfa/fwl/core/ifwl_combobox.cpp
@@ -286,8 +286,10 @@
                                      int32_t nStart,
                                      int32_t nCount) const {
   if (m_pEdit) {
-    return m_pEdit->GetText(wsText, nStart, nCount);
-  } else if (m_pListBox) {
+    m_pEdit->GetText(wsText, nStart, nCount);
+    return FWL_Error::Succeeded;
+  }
+  if (m_pListBox) {
     IFWL_ComboBoxDP* pData =
         static_cast<IFWL_ComboBoxDP*>(m_pProperties->m_pDataProvider);
     CFWL_ListItem* hItem = pData->GetItem(this, m_iCurSel);
@@ -320,13 +322,8 @@
 FWL_Error IFWL_ComboBox::SetEditLimit(int32_t nLimit) {
   if (!m_pEdit)
     return FWL_Error::Indefinite;
-  return m_pEdit->SetLimit(nLimit);
-}
-
-FWL_Error IFWL_ComboBox::EditDoClipboard(int32_t iCmd) {
-  if (!m_pEdit)
-    return FWL_Error::Indefinite;
-  return m_pEdit->DoClipboard(iCmd);
+  m_pEdit->SetLimit(nLimit);
+  return FWL_Error::Succeeded;
 }
 
 bool IFWL_ComboBox::EditRedo(const IFDE_TxtEdtDoRecord* pRecord) {
@@ -402,15 +399,18 @@
 }
 
 bool IFWL_ComboBox::EditSelectAll() {
-  return m_pEdit->AddSelRange(0) == FWL_Error::Succeeded;
+  m_pEdit->AddSelRange(0);
+  return true;
 }
 
 bool IFWL_ComboBox::EditDelete() {
-  return m_pEdit->ClearText() == FWL_Error::Succeeded;
+  m_pEdit->ClearText();
+  return true;
 }
 
 bool IFWL_ComboBox::EditDeSelect() {
-  return m_pEdit->ClearSelections() == FWL_Error::Succeeded;
+  m_pEdit->ClearSelections();
+  return true;
 }
 
 FWL_Error IFWL_ComboBox::GetBBox(CFX_RectF& rect) {
diff --git a/xfa/fwl/core/ifwl_combobox.h b/xfa/fwl/core/ifwl_combobox.h
index e5065db..0b586b4 100644
--- a/xfa/fwl/core/ifwl_combobox.h
+++ b/xfa/fwl/core/ifwl_combobox.h
@@ -110,7 +110,6 @@
   int32_t GetEditSelRange(int32_t nIndex, int32_t& nStart);
   int32_t GetEditLimit();
   FWL_Error SetEditLimit(int32_t nLimit);
-  FWL_Error EditDoClipboard(int32_t iCmd);
   bool EditRedo(const IFDE_TxtEdtDoRecord* pRecord);
   bool EditUndo(const IFDE_TxtEdtDoRecord* pRecord);
   IFWL_ListBox* GetListBoxt();
diff --git a/xfa/fwl/core/ifwl_comboedit.cpp b/xfa/fwl/core/ifwl_comboedit.cpp
index a8b04fd..2a7ac90 100644
--- a/xfa/fwl/core/ifwl_comboedit.cpp
+++ b/xfa/fwl/core/ifwl_comboedit.cpp
@@ -19,7 +19,7 @@
 
 void IFWL_ComboEdit::ClearSelected() {
   ClearSelections();
-  Repaint(&m_rtClient);
+  Repaint(&GetRTClient());
 }
 
 void IFWL_ComboEdit::SetSelected() {
@@ -29,7 +29,7 @@
 }
 
 void IFWL_ComboEdit::EndCaret() {
-  m_pEdtEngine->MoveCaretPos(MC_End);
+  GetTxtEdtEngine()->MoveCaretPos(MC_End);
 }
 
 void IFWL_ComboEdit::FlagFocus(bool bSet) {
diff --git a/xfa/fwl/core/ifwl_datetimepicker.cpp b/xfa/fwl/core/ifwl_datetimepicker.cpp
index 31e5b65..ff2dbfb 100644
--- a/xfa/fwl/core/ifwl_datetimepicker.cpp
+++ b/xfa/fwl/core/ifwl_datetimepicker.cpp
@@ -204,19 +204,20 @@
   if (!m_pEdit)
     return FWL_Error::Indefinite;
 
-  FWL_Error iRet = m_pEdit->SetText(wsText);
+  m_pEdit->SetText(wsText);
   Repaint(&m_rtClient);
   CFWL_Event_DtpEditChanged ev;
   ev.m_wsText = wsText;
   DispatchEvent(&ev);
-  return iRet;
+  return FWL_Error::Succeeded;
 }
 
 FWL_Error IFWL_DateTimePicker::GetEditText(CFX_WideString& wsText,
                                            int32_t nStart,
                                            int32_t nCount) const {
   if (m_pEdit) {
-    return m_pEdit->GetText(wsText, nStart, nCount);
+    m_pEdit->GetText(wsText, nStart, nCount);
+    return FWL_Error::Succeeded;
   }
   return FWL_Error::Indefinite;
 }
@@ -267,15 +268,18 @@
 }
 
 bool IFWL_DateTimePicker::SelectAll() {
-  return m_pEdit->AddSelRange(0) == FWL_Error::Succeeded;
+  m_pEdit->AddSelRange(0);
+  return true;
 }
 
 bool IFWL_DateTimePicker::Delete() {
-  return m_pEdit->ClearText() == FWL_Error::Succeeded;
+  m_pEdit->ClearText();
+  return true;
 }
 
 bool IFWL_DateTimePicker::DeSelect() {
-  return m_pEdit->ClearSelections() == FWL_Error::Succeeded;
+  m_pEdit->ClearSelections();
+  return true;
 }
 
 FWL_Error IFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
@@ -294,7 +298,8 @@
 }
 
 FWL_Error IFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
-  return m_pEdit->SetLimit(nLimit);
+  m_pEdit->SetLimit(nLimit);
+  return FWL_Error::Succeeded;
 }
 
 void IFWL_DateTimePicker::ModifyEditStylesEx(uint32_t dwStylesExAdded,
diff --git a/xfa/fwl/core/ifwl_edit.cpp b/xfa/fwl/core/ifwl_edit.cpp
index 1679a5b..aa3fdce 100644
--- a/xfa/fwl/core/ifwl_edit.cpp
+++ b/xfa/fwl/core/ifwl_edit.cpp
@@ -62,14 +62,9 @@
       m_bLButtonDown(false),
       m_nSelStart(0),
       m_nLimit(-1),
-      m_fSpaceAbove(0),
-      m_fSpaceBelow(0),
       m_fFontSize(0),
       m_bSetRange(false),
-      m_iMin(-1),
       m_iMax(0xFFFFFFF),
-      m_backColor(0),
-      m_updateBackColor(false),
       m_iCurRecord(-1),
       m_iMaxRecord(128) {
   m_rtClient.Reset();
@@ -77,8 +72,6 @@
   m_rtStatic.Reset();
 
   InitCaret();
-  if (!m_pEdtEngine)
-    InitEngine();
 }
 
 IFWL_Edit::~IFWL_Edit() {
@@ -95,16 +88,15 @@
 void IFWL_Edit::GetWidgetRect(CFX_RectF& rect, bool bAutoSize) {
   if (bAutoSize) {
     rect.Set(0, 0, 0, 0);
-    if (m_pEdtEngine) {
-      int32_t iTextLen = m_pEdtEngine->GetTextLength();
-      if (iTextLen > 0) {
-        CFX_WideString wsText;
-        m_pEdtEngine->GetText(wsText, 0);
-        CFX_SizeF sz = CalcTextSize(
-            wsText, m_pProperties->m_pThemeProvider,
-            !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine));
-        rect.Set(0, 0, sz.x, sz.y);
-      }
+
+    int32_t iTextLen = m_EdtEngine.GetTextLength();
+    if (iTextLen > 0) {
+      CFX_WideString wsText;
+      m_EdtEngine.GetText(wsText, 0);
+      CFX_SizeF sz = CalcTextSize(
+          wsText, m_pProperties->m_pThemeProvider,
+          !!(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine));
+      rect.Set(0, 0, sz.x, sz.y);
     }
     IFWL_Widget::GetWidgetRect(rect, true);
   } else {
@@ -180,10 +172,10 @@
   FX_FLOAT fEndX = 0.0f;
   FX_FLOAT fY = 0.0f;
   FX_FLOAT fStep = 0.0f;
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   CFX_RectFArray rectArray;
   CFX_RectF rectText;
-  const FDE_TXTEDTPARAMS* txtEdtParams = m_pEdtEngine->GetEditParams();
+  const FDE_TXTEDTPARAMS* txtEdtParams = m_EdtEngine.GetEditParams();
   FX_FLOAT fAsent = (FX_FLOAT)txtEdtParams->pFont->GetAscent() *
                     txtEdtParams->fFontSize / 1000;
   pPage->CalcRangeRectArray(nStart, nCount, rectArray);
@@ -196,69 +188,6 @@
     AddSquigglyPath(&PathData, fStartX, fEndX, fY, fStep);
   }
 }
-int32_t IFWL_Edit::GetWordAtPoint(CFX_PointF pointf, int32_t& nCount) {
-  return 0;
-}
-bool IFWL_Edit::GetSuggestWords(CFX_PointF pointf,
-                                std::vector<CFX_ByteString>& sSuggest) {
-  int32_t nWordCount = 0;
-  int32_t nWordStart = GetWordAtPoint(pointf, nWordCount);
-  if (nWordCount < 1) {
-    return false;
-  }
-  CFX_WideString wsSpell;
-  GetText(wsSpell, nWordStart, nWordCount);
-  CFX_ByteString sLatinWord;
-  for (int i = 0; i < nWordCount; i++) {
-    if (!FX_EDIT_ISLATINWORD(wsSpell[i])) {
-      break;
-    }
-    sLatinWord += (FX_CHAR)wsSpell[i];
-  }
-  if (sLatinWord.IsEmpty()) {
-    return false;
-  }
-  CFWL_EvtEdtCheckWord checkWordEvent;
-  checkWordEvent.m_pSrcTarget = this;
-  checkWordEvent.bsWord = sLatinWord;
-  checkWordEvent.bCheckWord = true;
-  DispatchEvent(&checkWordEvent);
-  if (checkWordEvent.bCheckWord) {
-    return false;
-  }
-  CFWL_EvtEdtGetSuggestWords suggestWordsEvent;
-  suggestWordsEvent.m_pSrcTarget = this;
-  suggestWordsEvent.bsWord = sLatinWord;
-  suggestWordsEvent.bsArraySuggestWords = sSuggest;
-  suggestWordsEvent.bSuggestWords = false;
-  DispatchEvent(&checkWordEvent);
-  return suggestWordsEvent.bSuggestWords;
-}
-bool IFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf,
-                                      const CFX_ByteStringC& bsReplace) {
-  int32_t nWordCount = 0;
-  int32_t nWordStart = GetWordAtPoint(pointf, nWordCount);
-  if (nWordCount < 1) {
-    return false;
-  }
-  CFX_WideString wsSpell;
-  GetText(wsSpell, nWordStart, nWordCount);
-  for (int i = 0; i < nWordCount; i++) {
-    if (!FX_EDIT_ISLATINWORD(wsSpell[i])) {
-      nWordCount = i;
-      break;
-    }
-  }
-  int32_t nDestLen = bsReplace.GetLength();
-  CFX_WideString wsDest;
-  FX_WCHAR* pBuffer = wsDest.GetBuffer(nDestLen);
-  for (int32_t i = 0; i < nDestLen; i++) {
-    pBuffer[i] = bsReplace[i];
-  }
-  wsDest.ReleaseBuffer(nDestLen);
-  Replace(nWordStart, nWordCount, wsDest.AsStringC());
-  return true;
-}
 void IFWL_Edit::DrawSpellCheck(CFX_Graphics* pGraphics,
                                const CFX_Matrix* pMatrix) {
   pGraphics->SaveGraphState();
@@ -329,9 +258,9 @@
   if (!m_pWidgetMgr->IsFormDisabled()) {
     DrawTextBk(pGraphics, pTheme, pMatrix);
   }
-  if (m_pEdtEngine) {
-    DrawContent(pGraphics, pTheme, pMatrix);
-  }
+
+  DrawContent(pGraphics, pTheme, pMatrix);
+
   if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) &&
       !(m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly)) {
     DrawSpellCheck(pGraphics, pMatrix);
@@ -358,154 +287,55 @@
   m_pProperties->m_pThemeProvider = pThemeProvider;
 }
 
-FWL_Error IFWL_Edit::SetText(const CFX_WideString& wsText) {
-  m_pEdtEngine->SetText(wsText);
-  return FWL_Error::Succeeded;
+void IFWL_Edit::SetText(const CFX_WideString& wsText) {
+  m_EdtEngine.SetText(wsText);
 }
 
 int32_t IFWL_Edit::GetTextLength() const {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->GetTextLength();
+  return m_EdtEngine.GetTextLength();
 }
 
-FWL_Error IFWL_Edit::GetText(CFX_WideString& wsText,
-                             int32_t nStart,
-                             int32_t nCount) const {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->GetText(wsText, nStart, nCount);
-  return FWL_Error::Succeeded;
+void IFWL_Edit::GetText(CFX_WideString& wsText,
+                        int32_t nStart,
+                        int32_t nCount) {
+  m_EdtEngine.GetText(wsText, nStart, nCount);
 }
 
-FWL_Error IFWL_Edit::ClearText() {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->ClearText();
-  return FWL_Error::Succeeded;
+void IFWL_Edit::ClearText() {
+  m_EdtEngine.ClearText();
 }
 
-int32_t IFWL_Edit::GetCaretPos() const {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->GetCaretPos();
-}
-
-int32_t IFWL_Edit::SetCaretPos(int32_t nIndex, bool bBefore) {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->SetCaretPos(nIndex, bBefore);
-}
-
-FWL_Error IFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->AddSelRange(nStart, nCount);
-  return FWL_Error::Succeeded;
+void IFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
+  m_EdtEngine.AddSelRange(nStart, nCount);
 }
 
 int32_t IFWL_Edit::CountSelRanges() {
-  if (!m_pEdtEngine)
-    return 0;
-  return m_pEdtEngine->CountSelRanges();
+  return m_EdtEngine.CountSelRanges();
 }
 
 int32_t IFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  if (!m_pEdtEngine)
-    return -1;
-  return m_pEdtEngine->GetSelRange(nIndex, nStart);
+  return m_EdtEngine.GetSelRange(nIndex, nStart);
 }
 
-FWL_Error IFWL_Edit::ClearSelections() {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->ClearSelection();
-  return FWL_Error::Succeeded;
+void IFWL_Edit::ClearSelections() {
+  m_EdtEngine.ClearSelection();
 }
 
 int32_t IFWL_Edit::GetLimit() {
   return m_nLimit;
 }
 
-FWL_Error IFWL_Edit::SetLimit(int32_t nLimit) {
+void IFWL_Edit::SetLimit(int32_t nLimit) {
   m_nLimit = nLimit;
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->SetLimit(nLimit);
-  return FWL_Error::Succeeded;
+  m_EdtEngine.SetLimit(nLimit);
 }
 
-FWL_Error IFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->SetAliasChar(wAlias);
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::Insert(int32_t nStart,
-                            const FX_WCHAR* lpText,
-                            int32_t nLen) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    return FWL_Error::Indefinite;
-  }
-  m_pEdtEngine->Insert(nStart, lpText, nLen);
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::DeleteSelections() {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  int32_t iCount = m_pEdtEngine->CountSelRanges();
-  if (iCount > 0)
-    m_pEdtEngine->Delete(-1);
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::DeleteRange(int32_t nStart, int32_t nCount) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->DeleteRange(nStart, nCount);
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::Replace(int32_t nStart,
-                             int32_t nLen,
-                             const CFX_WideStringC& wsReplace) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  m_pEdtEngine->Replace(nStart, nLen, CFX_WideString(wsReplace));
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::DoClipboard(int32_t iCmd) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  if ((m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_ReadOnly) ||
-      (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
-    return FWL_Error::Succeeded;
-  }
-  return FWL_Error::Indefinite;
+void IFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
+  m_EdtEngine.SetAliasChar(wAlias);
 }
 
 bool IFWL_Edit::Copy(CFX_WideString& wsCopy) {
-  if (!m_pEdtEngine)
-    return false;
-
-  int32_t nCount = m_pEdtEngine->CountSelRanges();
+  int32_t nCount = m_EdtEngine.CountSelRanges();
   if (nCount == 0)
     return false;
 
@@ -513,8 +343,8 @@
   CFX_WideString wsTemp;
   int32_t nStart, nLength;
   for (int32_t i = 0; i < nCount; i++) {
-    nLength = m_pEdtEngine->GetSelRange(i, nStart);
-    m_pEdtEngine->GetText(wsTemp, nStart, nLength);
+    nLength = m_EdtEngine.GetSelRange(i, nStart);
+    m_EdtEngine.GetText(wsTemp, nStart, nLength);
     wsCopy += wsTemp;
     wsTemp.clear();
   }
@@ -522,10 +352,7 @@
 }
 
 bool IFWL_Edit::Cut(CFX_WideString& wsCut) {
-  if (!m_pEdtEngine)
-    return false;
-
-  int32_t nCount = m_pEdtEngine->CountSelRanges();
+  int32_t nCount = m_EdtEngine.CountSelRanges();
   if (nCount == 0)
     return false;
 
@@ -533,22 +360,19 @@
   CFX_WideString wsTemp;
   int32_t nStart, nLength;
   for (int32_t i = 0; i < nCount; i++) {
-    nLength = m_pEdtEngine->GetSelRange(i, nStart);
-    m_pEdtEngine->GetText(wsTemp, nStart, nLength);
+    nLength = m_EdtEngine.GetSelRange(i, nStart);
+    m_EdtEngine.GetText(wsTemp, nStart, nLength);
     wsCut += wsTemp;
     wsTemp.clear();
   }
-  m_pEdtEngine->Delete(0);
+  m_EdtEngine.Delete(0);
   return true;
 }
 
 bool IFWL_Edit::Paste(const CFX_WideString& wsPaste) {
-  if (!m_pEdtEngine)
-    return false;
-
-  int32_t nCaret = m_pEdtEngine->GetCaretPos();
+  int32_t nCaret = m_EdtEngine.GetCaretPos();
   int32_t iError =
-      m_pEdtEngine->Insert(nCaret, wsPaste.c_str(), wsPaste.GetLength());
+      m_EdtEngine.Insert(nCaret, wsPaste.c_str(), wsPaste.GetLength());
   if (iError < 0) {
     ProcessInsertError(iError);
     return false;
@@ -556,32 +380,16 @@
   return true;
 }
 
-bool IFWL_Edit::Delete() {
-  if (!m_pEdtEngine)
-    return false;
-
-  int32_t nCount = m_pEdtEngine->CountSelRanges();
-  if (nCount < 1)
-    return false;
-
-  m_pEdtEngine->Delete(0);
-  return true;
-}
-
 bool IFWL_Edit::Redo(const IFDE_TxtEdtDoRecord* pRecord) {
-  if (!m_pEdtEngine)
-    return false;
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo)
     return true;
-  return m_pEdtEngine->Redo(pRecord);
+  return m_EdtEngine.Redo(pRecord);
 }
 
 bool IFWL_Edit::Undo(const IFDE_TxtEdtDoRecord* pRecord) {
-  if (!m_pEdtEngine)
-    return false;
   if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_NoRedoUndo)
     return true;
-  return m_pEdtEngine->Undo(pRecord);
+  return m_EdtEngine.Undo(pRecord);
 }
 
 bool IFWL_Edit::Undo() {
@@ -604,26 +412,8 @@
   return m_iCurRecord < pdfium::CollectionSize<int32_t>(m_DoRecords) - 1;
 }
 
-FWL_Error IFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, bool bEquidistant) {
-  if (!m_pEdtEngine)
-    return FWL_Error::Indefinite;
-
-  FDE_TXTEDTPARAMS* pParams = m_pEdtEngine->GetEditParams();
-  pParams->fTabWidth = fTabWidth;
-  pParams->bTabEquidistant = bEquidistant;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::SetOuter(IFWL_Widget* pOuter) {
+void IFWL_Edit::SetOuter(IFWL_Widget* pOuter) {
   m_pOuter = pOuter;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::SetNumberRange(int32_t iMin, int32_t iMax) {
-  m_iMin = iMin;
-  m_iMax = iMax;
-  m_bSetRange = true;
-  return FWL_Error::Succeeded;
 }
 
 void IFWL_Edit::On_CaretChanged(CFDE_TxtEdtEngine* pEdit,
@@ -660,7 +450,7 @@
   if (dwStyleEx & FWL_STYLEEXT_EDT_VAlignMask)
     UpdateVAlignment();
 
-  IFDE_TxtEdtPage* page = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* page = m_EdtEngine.GetPage(0);
   FX_FLOAT fContentWidth = page->GetContentsBox().width;
   FX_FLOAT fContentHeight = page->GetContentsBox().height;
   CFX_RectF rtTemp;
@@ -697,7 +487,7 @@
   if (bNeedUpdate) {
     UpdateEditParams();
     UpdateEditLayout();
-    IFDE_TxtEdtPage* page1 = m_pEdtEngine->GetPage(0);
+    IFDE_TxtEdtPage* page1 = m_EdtEngine.GetPage(0);
     fContentWidth1 = page1->GetContentsBox().width;
     fContentHeight1 = page1->GetContentsBox().height;
   }
@@ -729,7 +519,7 @@
 bool IFWL_Edit::On_PageLoad(CFDE_TxtEdtEngine* pEdit,
                             int32_t nPageIndex,
                             int32_t nPurpose) {
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(nPageIndex);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(nPageIndex);
   if (!pPage)
     return false;
   pPage->LoadPage(nullptr, nullptr);
@@ -739,7 +529,7 @@
 bool IFWL_Edit::On_PageUnload(CFDE_TxtEdtEngine* pEdit,
                               int32_t nPageIndex,
                               int32_t nPurpose) {
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(nPageIndex);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(nPageIndex);
   if (!pPage)
     return false;
   pPage->UnloadPage(nullptr);
@@ -765,18 +555,6 @@
   return event.bValidate;
 }
 
-FWL_Error IFWL_Edit::SetBackgroundColor(uint32_t color) {
-  m_backColor = color;
-  m_updateBackColor = true;
-  return FWL_Error::Succeeded;
-}
-
-FWL_Error IFWL_Edit::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
-  m_wsFont = wsFont;
-  m_fFontSize = fSize;
-  return FWL_Error::Succeeded;
-}
-
 void IFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) {
   m_fScrollOffsetY = fScrollOffset;
 }
@@ -816,9 +594,7 @@
 void IFWL_Edit::DrawContent(CFX_Graphics* pGraphics,
                             IFWL_ThemeProvider* pTheme,
                             const CFX_Matrix* pMatrix) {
-  if (!m_pEdtEngine)
-    return;
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
   pGraphics->SaveGraphState();
@@ -843,7 +619,7 @@
                  FWL_WGTSTATE_Deactivated;
     }
   }
-  int32_t nSelCount = m_pEdtEngine->CountSelRanges();
+  int32_t nSelCount = m_EdtEngine.CountSelRanges();
   if (bShowSel && nSelCount > 0) {
     int32_t nPageCharStart = pPage->GetCharStart();
     int32_t nPageCharCount = pPage->GetCharCount();
@@ -853,7 +629,7 @@
     CFX_RectFArray rectArr;
     int32_t i = 0;
     for (i = 0; i < nSelCount; i++) {
-      nCharCount = m_pEdtEngine->GetSelRange(i, nCharStart);
+      nCharCount = m_EdtEngine.GetSelRange(i, nCharStart);
       int32_t nCharEnd = nCharStart + nCharCount - 1;
       if (nCharEnd < nPageCharStart || nCharStart > nPageCharEnd) {
         continue;
@@ -917,7 +693,7 @@
   UpdateEditParams();
   UpdateEditLayout();
   if (m_nLimit > -1) {
-    m_pEdtEngine->SetLimit(m_nLimit);
+    m_EdtEngine.SetLimit(m_nLimit);
   }
 }
 void IFWL_Edit::UpdateEditParams() {
@@ -1033,34 +809,34 @@
   params.wLineBreakChar = L'\n';
   params.nCharRotation = 0;
   params.pEventSink = this;
-  m_pEdtEngine->SetEditParams(params);
+  m_EdtEngine.SetEditParams(params);
 }
 
 void IFWL_Edit::UpdateEditLayout() {
-  if (m_pEdtEngine->GetTextLength() <= 0)
-    m_pEdtEngine->SetTextByStream(nullptr);
+  if (m_EdtEngine.GetTextLength() <= 0)
+    m_EdtEngine.SetTextByStream(nullptr);
 
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (pPage)
     pPage->UnloadPage(nullptr);
 
-  m_pEdtEngine->StartLayout();
-  m_pEdtEngine->DoLayout(nullptr);
-  m_pEdtEngine->EndLayout();
-  pPage = m_pEdtEngine->GetPage(0);
+  m_EdtEngine.StartLayout();
+  m_EdtEngine.DoLayout(nullptr);
+  m_EdtEngine.EndLayout();
+  pPage = m_EdtEngine.GetPage(0);
   if (pPage)
     pPage->LoadPage(nullptr, nullptr);
 }
 
 bool IFWL_Edit::UpdateOffset() {
   CFX_RectF rtCaret;
-  m_pEdtEngine->GetCaretRect(rtCaret);
+  m_EdtEngine.GetCaretRect(rtCaret);
   FX_FLOAT fOffSetX = m_rtEngine.left - m_fScrollOffsetX;
   FX_FLOAT fOffSetY = m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset;
   rtCaret.Offset(fOffSetX, fOffSetY);
   const CFX_RectF& rtEidt = m_rtEngine;
   if (rtEidt.Contains(rtCaret)) {
-    IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+    IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
     if (!pPage)
       return false;
 
@@ -1105,7 +881,7 @@
 }
 
 void IFWL_Edit::UpdateVAlignment() {
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
   const CFX_RectF& rtFDE = pPage->GetContentsBox();
@@ -1144,7 +920,7 @@
 }
 void IFWL_Edit::UpdateCaret() {
   CFX_RectF rtFDE;
-  m_pEdtEngine->GetCaretRect(rtFDE);
+  m_EdtEngine.GetCaretRect(rtFDE);
   rtFDE.Offset(m_rtEngine.left - m_fScrollOffsetX,
                m_rtEngine.top - m_fScrollOffsetY + m_fVAlignOffset);
   CFX_RectF rtCaret;
@@ -1189,7 +965,7 @@
   if (!bShowHorz && !bShowVert) {
     return nullptr;
   }
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return nullptr;
   const CFX_RectF& rtFDE = pPage->GetContentsBox();
@@ -1230,7 +1006,7 @@
     m_pVertScrollBar->GetWidgetRect(rtScroll);
     if (rtScroll.height < rtFDE.height) {
       m_pVertScrollBar->LockUpdate();
-      FX_FLOAT fStep = m_pEdtEngine->GetEditParams()->fLineSpace;
+      FX_FLOAT fStep = m_EdtEngine.GetEditParams()->fLineSpace;
       FX_FLOAT fRange = rtFDE.height - m_rtEngine.height;
       if (fRange < fStep) {
         fRange = fStep;
@@ -1277,9 +1053,7 @@
          (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_MultiLine);
 }
 bool IFWL_Edit::IsContentHeightOverflow() {
-  if (!m_pEdtEngine)
-    return false;
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return false;
   return pPage->GetContentsBox().height > m_rtEngine.height + 1.0f;
@@ -1455,11 +1229,6 @@
     m_pHorzScrollBar.reset(sb);
 }
 
-void IFWL_Edit::InitEngine() {
-  if (!m_pEdtEngine)
-    m_pEdtEngine.reset(new CFDE_TxtEdtEngine);
-}
-
 bool FWL_ShowCaret(IFWL_Widget* pWidget,
                    bool bVisible,
                    const CFX_RectF* pRtAnchor) {
@@ -1510,21 +1279,18 @@
   }
 }
 bool IFWL_Edit::ValidateNumberChar(FX_WCHAR cNum) {
-  if (!m_pEdtEngine) {
-    return false;
-  }
   if (!m_bSetRange) {
     return true;
   }
   CFX_WideString wsOld, wsText;
-  m_pEdtEngine->GetText(wsText, 0);
+  m_EdtEngine.GetText(wsText, 0);
   if (wsText.IsEmpty()) {
     if (cNum == L'0') {
       return false;
     }
     return true;
   }
-  int32_t caretPos = m_pEdtEngine->GetCaretPos();
+  int32_t caretPos = m_EdtEngine.GetCaretPos();
   int32_t iSel = CountSelRanges();
   if (iSel == 0) {
     if (cNum == L'0' && caretPos == 0) {
@@ -1571,7 +1337,8 @@
       DispatchEvent(&textFullEvent);
       break;
     }
-    default: {}
+    default:
+      break;
   }
 }
 
@@ -1661,10 +1428,8 @@
 void IFWL_Edit::DoButtonDown(CFWL_MsgMouse* pMsg) {
   if ((m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) == 0)
     SetFocus(true);
-  if (!m_pEdtEngine)
-    UpdateEditEngine();
 
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
   CFX_PointF pt(pMsg->m_fx, pMsg->m_fy);
@@ -1674,7 +1439,7 @@
   if (nIndex < 0)
     nIndex = 0;
 
-  m_pEdtEngine->SetCaretPos(nIndex, bBefore);
+  m_EdtEngine.SetCaretPos(nIndex, bBefore);
 }
 
 void IFWL_Edit::OnFocusChanged(CFWL_Message* pMsg, bool bSet) {
@@ -1682,8 +1447,6 @@
   bool bRepaint = !!(dwStyleEx & FWL_STYLEEXT_EDT_InnerCaret);
   if (bSet) {
     m_pProperties->m_dwStates |= FWL_WGTSTATE_Focused;
-    if (!m_pEdtEngine)
-      UpdateEditEngine();
 
     UpdateVAlignment();
     UpdateOffset();
@@ -1691,13 +1454,13 @@
   } else if (m_pProperties->m_dwStates & FWL_WGTSTATE_Focused) {
     m_pProperties->m_dwStates &= ~FWL_WGTSTATE_Focused;
     ShowCaret(false);
-    if (m_pEdtEngine && (dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) {
+    if ((dwStyleEx & FWL_STYLEEXT_EDT_NoHideSel) == 0) {
       int32_t nSel = CountSelRanges();
       if (nSel > 0) {
         ClearSelections();
         bRepaint = true;
       }
-      SetCaretPos(0);
+      m_EdtEngine.SetCaretPos(0, true);
       UpdateOffset();
     }
     ClearRecord();
@@ -1718,11 +1481,11 @@
   m_bLButtonDown = true;
   SetGrab(true);
   DoButtonDown(pMsg);
-  int32_t nIndex = m_pEdtEngine->GetCaretPos();
+  int32_t nIndex = m_EdtEngine.GetCaretPos();
   bool bRepaint = false;
-  int32_t iCount = m_pEdtEngine->CountSelRanges();
+  int32_t iCount = m_EdtEngine.CountSelRanges();
   if (iCount > 0) {
-    m_pEdtEngine->ClearSelection();
+    m_EdtEngine.ClearSelection();
     bRepaint = true;
   }
 
@@ -1730,7 +1493,7 @@
   if (bShift && m_nSelStart != nIndex) {
     int32_t iStart = std::min(m_nSelStart, nIndex);
     int32_t iEnd = std::max(m_nSelStart, nIndex);
-    m_pEdtEngine->AddSelRange(iStart, iEnd - iStart);
+    m_EdtEngine.AddSelRange(iStart, iEnd - iStart);
     bRepaint = true;
   } else {
     m_nSelStart = nIndex;
@@ -1745,10 +1508,7 @@
 }
 
 void IFWL_Edit::OnButtonDblClk(CFWL_MsgMouse* pMsg) {
-  if (!m_pEdtEngine)
-    return;
-
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
 
@@ -1759,18 +1519,16 @@
   if (nIndex < 0)
     return;
 
-  m_pEdtEngine->AddSelRange(nIndex, nCount);
-  m_pEdtEngine->SetCaretPos(nIndex + nCount - 1, false);
+  m_EdtEngine.AddSelRange(nIndex, nCount);
+  m_EdtEngine.SetCaretPos(nIndex + nCount - 1, false);
   Repaint(&m_rtEngine);
 }
 
 void IFWL_Edit::OnMouseMove(CFWL_MsgMouse* pMsg) {
-  if (!m_pEdtEngine)
-    return;
   if (m_nSelStart == -1 || !m_bLButtonDown)
     return;
 
-  IFDE_TxtEdtPage* pPage = m_pEdtEngine->GetPage(0);
+  IFDE_TxtEdtPage* pPage = m_EdtEngine.GetPage(0);
   if (!pPage)
     return;
 
@@ -1778,23 +1536,20 @@
   DeviceToEngine(pt);
   bool bBefore = true;
   int32_t nIndex = pPage->GetCharIndex(pt, bBefore);
-  m_pEdtEngine->SetCaretPos(nIndex, bBefore);
-  nIndex = m_pEdtEngine->GetCaretPos();
-  m_pEdtEngine->ClearSelection();
+  m_EdtEngine.SetCaretPos(nIndex, bBefore);
+  nIndex = m_EdtEngine.GetCaretPos();
+  m_EdtEngine.ClearSelection();
   if (nIndex != m_nSelStart) {
-    int32_t nLen = m_pEdtEngine->GetTextLength();
+    int32_t nLen = m_EdtEngine.GetTextLength();
     if (m_nSelStart >= nLen)
       m_nSelStart = nLen;
 
-    m_pEdtEngine->AddSelRange(std::min(m_nSelStart, nIndex),
-                              FXSYS_abs(nIndex - m_nSelStart));
+    m_EdtEngine.AddSelRange(std::min(m_nSelStart, nIndex),
+                            FXSYS_abs(nIndex - m_nSelStart));
   }
 }
 
 void IFWL_Edit::OnKeyDown(CFWL_MsgKey* pMsg) {
-  if (!m_pEdtEngine)
-    return;
-
   FDE_TXTEDTMOVECARET MoveCaret = MC_MoveNone;
   bool bShift = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Shift);
   bool bCtrl = !!(pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl);
@@ -1831,11 +1586,11 @@
           (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
         break;
       }
-      int32_t nCaret = m_pEdtEngine->GetCaretPos();
+      int32_t nCaret = m_EdtEngine.GetCaretPos();
 #if (_FX_OS_ == _FX_MACOSX_)
-      m_pEdtEngine->Delete(nCaret, true);
+      m_EdtEngine.Delete(nCaret, true);
 #else
-      m_pEdtEngine->Delete(nCaret);
+      m_EdtEngine.Delete(nCaret);
 #endif
       break;
     }
@@ -1845,29 +1600,11 @@
       DispatchKeyEvent(pMsg);
       break;
     }
-    default: {
-#if (_FX_OS_ == _FX_MACOSX_)
-      if (pMsg->m_dwFlags & FWL_KEYFLAG_Command) {
-#else
-      if (pMsg->m_dwFlags & FWL_KEYFLAG_Ctrl) {
-#endif
-        if (dwKeyCode == 0x43 || dwKeyCode == 0x63) {
-          DoClipboard(1);
-          return;
-        }
-        if (dwKeyCode == 0x58 || dwKeyCode == 0x78) {
-          DoClipboard(2);
-          return;
-        }
-        if (dwKeyCode == 0x56 || dwKeyCode == 0x76) {
-          DoClipboard(3);
-          return;
-        }
-      }
-    }
+    default:
+      break;
   }
   if (MoveCaret != MC_MoveNone)
-    m_pEdtEngine->MoveCaretPos(MoveCaret, bShift, bCtrl);
+    m_EdtEngine.MoveCaretPos(MoveCaret, bShift, bCtrl);
 }
 
 void IFWL_Edit::OnChar(CFWL_MsgKey* pMsg) {
@@ -1875,27 +1612,25 @@
       (m_pProperties->m_dwStates & FWL_WGTSTATE_Disabled)) {
     return;
   }
-  if (!m_pEdtEngine)
-    return;
 
   int32_t iError = 0;
   FX_WCHAR c = (FX_WCHAR)pMsg->m_dwKeyCode;
-  int32_t nCaret = m_pEdtEngine->GetCaretPos();
+  int32_t nCaret = m_EdtEngine.GetCaretPos();
   switch (c) {
     case FWL_VKEY_Back:
-      m_pEdtEngine->Delete(nCaret, true);
+      m_EdtEngine.Delete(nCaret, true);
       break;
     case 0x0A:
       break;
     case FWL_VKEY_Escape:
       break;
     case FWL_VKEY_Tab: {
-      iError = m_pEdtEngine->Insert(nCaret, L"\t", 1);
+      iError = m_EdtEngine.Insert(nCaret, L"\t", 1);
       break;
     }
     case FWL_VKEY_Return: {
       if (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_EDT_WantReturn) {
-        iError = m_pEdtEngine->Insert(nCaret, L"\n", 1);
+        iError = m_EdtEngine.Insert(nCaret, L"\n", 1);
       }
       break;
     }
@@ -1919,7 +1654,7 @@
       {
         break;
       }
-      iError = m_pEdtEngine->Insert(nCaret, &c, 1);
+      iError = m_EdtEngine.Insert(nCaret, &c, 1);
       break;
     }
   }
@@ -1982,9 +1717,8 @@
     pScrollBar->SetPos(fPos);
     pScrollBar->SetTrackPos(fPos);
     UpdateOffset(pScrollBar, fPos - iCurPos);
-    if (m_pEdtEngine) {
-      UpdateCaret();
-    }
+    UpdateCaret();
+
     CFX_RectF rect;
     GetWidgetRect(rect);
     CFX_RectF rtInvalidate;
diff --git a/xfa/fwl/core/ifwl_edit.h b/xfa/fwl/core/ifwl_edit.h
index d436a4f..65c6603 100644
--- a/xfa/fwl/core/ifwl_edit.h
+++ b/xfa/fwl/core/ifwl_edit.h
@@ -8,11 +8,10 @@
 #define XFA_FWL_CORE_IFWL_EDIT_H_
 
 #include <deque>
-#include <memory>
 #include <vector>
 
+#include "xfa/fde/cfde_txtedtengine.h"
 #include "xfa/fde/ifde_txtedtdorecord.h"
-#include "xfa/fde/ifde_txtedtengine.h"
 #include "xfa/fwl/core/cfwl_event.h"
 #include "xfa/fwl/core/cfwl_widget.h"
 #include "xfa/fwl/core/ifwl_dataprovider.h"
@@ -85,12 +84,6 @@
               CFX_ByteString bsWord;
               bool bCheckWord;)
 
-FWL_EVENT_DEF(CFWL_EvtEdtGetSuggestWords,
-              CFWL_EventType::GetSuggestedWords,
-              bool bSuggestWords;
-              CFX_ByteString bsWord;
-              std::vector<CFX_ByteString> bsArraySuggestWords;)
-
 class IFDE_TxtEdtDoRecord;
 class IFWL_Edit;
 class CFWL_MsgActivate;
@@ -99,8 +92,6 @@
 class CFWL_WidgetProperties;
 class IFWL_Caret;
 
-class IFWL_EditDP : public IFWL_DataProvider {};
-
 class IFWL_Edit : public IFWL_Widget {
  public:
   IFWL_Edit(const IFWL_App* app,
@@ -122,45 +113,30 @@
   void OnDrawWidget(CFX_Graphics* pGraphics,
                     const CFX_Matrix* pMatrix) override;
 
-  virtual FWL_Error SetText(const CFX_WideString& wsText);
-  virtual int32_t GetTextLength() const;
-  virtual FWL_Error GetText(CFX_WideString& wsText,
-                            int32_t nStart = 0,
-                            int32_t nCount = -1) const;
-  virtual FWL_Error ClearText();
-  virtual int32_t GetCaretPos() const;
-  virtual int32_t SetCaretPos(int32_t nIndex, bool bBefore = true);
-  virtual FWL_Error AddSelRange(int32_t nStart, int32_t nCount = -1);
-  virtual int32_t CountSelRanges();
-  virtual int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
-  virtual FWL_Error ClearSelections();
-  virtual int32_t GetLimit();
-  virtual FWL_Error SetLimit(int32_t nLimit);
-  virtual FWL_Error SetAliasChar(FX_WCHAR wAlias);
-  virtual FWL_Error Insert(int32_t nStart,
-                           const FX_WCHAR* lpText,
-                           int32_t nLen);
-  virtual FWL_Error DeleteSelections();
-  virtual FWL_Error DeleteRange(int32_t nStart, int32_t nCount = -1);
-  virtual FWL_Error Replace(int32_t nStart,
-                            int32_t nLen,
-                            const CFX_WideStringC& wsReplace);
-  virtual FWL_Error DoClipboard(int32_t iCmd);
-  virtual bool Copy(CFX_WideString& wsCopy);
-  virtual bool Cut(CFX_WideString& wsCut);
-  virtual bool Paste(const CFX_WideString& wsPaste);
-  virtual bool Delete();
-  virtual bool Redo(const IFDE_TxtEdtDoRecord* pRecord);
-  virtual bool Undo(const IFDE_TxtEdtDoRecord* pRecord);
-  virtual bool Undo();
-  virtual bool Redo();
-  virtual bool CanUndo();
-  virtual bool CanRedo();
-  virtual FWL_Error SetTabWidth(FX_FLOAT fTabWidth, bool bEquidistant);
-  virtual FWL_Error SetOuter(IFWL_Widget* pOuter);
-  virtual FWL_Error SetNumberRange(int32_t iMin, int32_t iMax);
-  virtual FWL_Error SetBackgroundColor(uint32_t color);
-  virtual FWL_Error SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize);
+  virtual void SetText(const CFX_WideString& wsText);
+
+  int32_t GetTextLength() const;
+  void GetText(CFX_WideString& wsText, int32_t nStart = 0, int32_t nCount = -1);
+  void ClearText();
+
+  void AddSelRange(int32_t nStart, int32_t nCount = -1);
+  int32_t CountSelRanges();
+  int32_t GetSelRange(int32_t nIndex, int32_t& nStart);
+  void ClearSelections();
+  int32_t GetLimit();
+  void SetLimit(int32_t nLimit);
+  void SetAliasChar(FX_WCHAR wAlias);
+  bool Copy(CFX_WideString& wsCopy);
+  bool Cut(CFX_WideString& wsCut);
+  bool Paste(const CFX_WideString& wsPaste);
+  bool Redo(const IFDE_TxtEdtDoRecord* pRecord);
+  bool Undo(const IFDE_TxtEdtDoRecord* pRecord);
+  bool Undo();
+  bool Redo();
+  bool CanUndo();
+  bool CanRedo();
+
+  void SetOuter(IFWL_Widget* pOuter);
 
   void On_CaretChanged(CFDE_TxtEdtEngine* pEdit,
                        int32_t nPage,
@@ -177,14 +153,13 @@
   void On_AddDoRecord(CFDE_TxtEdtEngine* pEdit, IFDE_TxtEdtDoRecord* pRecord);
   bool On_Validate(CFDE_TxtEdtEngine* pEdit, CFX_WideString& wsText);
   void SetScrollOffset(FX_FLOAT fScrollOffset);
-  bool GetSuggestWords(CFX_PointF pointf,
-                       std::vector<CFX_ByteString>& sSuggest);
-  bool ReplaceSpellCheckWord(CFX_PointF pointf,
-                             const CFX_ByteStringC& bsReplace);
 
  protected:
-  friend class CFWL_TxtEdtEventSink;
+  void ShowCaret(bool bVisible, CFX_RectF* pRect = nullptr);
+  const CFX_RectF& GetRTClient() const { return m_rtClient; }
+  CFDE_TxtEdtEngine* GetTxtEdtEngine() { return &m_EdtEngine; }
 
+ private:
   void DrawTextBk(CFX_Graphics* pGraphics,
                   IFWL_ThemeProvider* pTheme,
                   const CFX_Matrix* pMatrix = nullptr);
@@ -204,7 +179,6 @@
   void DeviceToEngine(CFX_PointF& pt);
   void InitScrollBar(bool bVert = true);
   void InitEngine();
-  virtual void ShowCaret(bool bVisible, CFX_RectF* pRect = nullptr);
   bool ValidateNumberChar(FX_WCHAR cNum);
   void InitCaret();
   void ClearRecord();
@@ -220,37 +194,6 @@
                         int32_t nCount,
                         FX_FLOAT fOffSetX,
                         FX_FLOAT fOffSetY);
-  int32_t GetWordAtPoint(CFX_PointF pointf, int32_t& nCount);
-
-  CFX_RectF m_rtClient;
-  CFX_RectF m_rtEngine;
-  CFX_RectF m_rtStatic;
-  FX_FLOAT m_fVAlignOffset;
-  FX_FLOAT m_fScrollOffsetX;
-  FX_FLOAT m_fScrollOffsetY;
-  std::unique_ptr<CFDE_TxtEdtEngine> m_pEdtEngine;
-  bool m_bLButtonDown;
-  int32_t m_nSelStart;
-  int32_t m_nLimit;
-  FX_FLOAT m_fSpaceAbove;
-  FX_FLOAT m_fSpaceBelow;
-  FX_FLOAT m_fFontSize;
-  FX_ARGB m_argbSel;
-  bool m_bSetRange;
-  int32_t m_iMin;
-  int32_t m_iMax;
-  std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar;
-  std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar;
-  std::unique_ptr<IFWL_Caret> m_pCaret;
-  CFX_WideString m_wsCache;
-  uint32_t m_backColor;
-  bool m_updateBackColor;
-  CFX_WideString m_wsFont;
-  std::deque<std::unique_ptr<IFDE_TxtEdtDoRecord>> m_DoRecords;
-  int32_t m_iCurRecord;
-  int32_t m_iMaxRecord;
-
- private:
   void DoActivate(CFWL_MsgActivate* pMsg);
   void DoDeactivate(CFWL_MsgDeactivate* pMsg);
   void DoButtonDown(CFWL_MsgMouse* pMsg);
@@ -262,6 +205,28 @@
   void OnKeyDown(CFWL_MsgKey* pMsg);
   void OnChar(CFWL_MsgKey* pMsg);
   bool OnScroll(IFWL_ScrollBar* pScrollBar, FWL_SCBCODE dwCode, FX_FLOAT fPos);
+
+  CFX_RectF m_rtClient;
+  CFX_RectF m_rtEngine;
+  CFX_RectF m_rtStatic;
+  FX_FLOAT m_fVAlignOffset;
+  FX_FLOAT m_fScrollOffsetX;
+  FX_FLOAT m_fScrollOffsetY;
+  CFDE_TxtEdtEngine m_EdtEngine;
+  bool m_bLButtonDown;
+  int32_t m_nSelStart;
+  int32_t m_nLimit;
+  FX_FLOAT m_fFontSize;
+  bool m_bSetRange;
+  int32_t m_iMax;
+  std::unique_ptr<IFWL_ScrollBar> m_pVertScrollBar;
+  std::unique_ptr<IFWL_ScrollBar> m_pHorzScrollBar;
+  std::unique_ptr<IFWL_Caret> m_pCaret;
+  CFX_WideString m_wsCache;
+  CFX_WideString m_wsFont;
+  std::deque<std::unique_ptr<IFDE_TxtEdtDoRecord>> m_DoRecords;
+  int32_t m_iCurRecord;
+  int32_t m_iMaxRecord;
 };
 
 #endif  // XFA_FWL_CORE_IFWL_EDIT_H_
diff --git a/xfa/fwl/core/ifwl_form.cpp b/xfa/fwl/core/ifwl_form.cpp
index e256a13..4a8d911 100644
--- a/xfa/fwl/core/ifwl_form.cpp
+++ b/xfa/fwl/core/ifwl_form.cpp
@@ -41,6 +41,9 @@
                      std::unique_ptr<CFWL_WidgetProperties> properties,
                      IFWL_Widget* pOuter)
     : IFWL_Widget(app, std::move(properties), pOuter),
+#if (_FX_OS_ == _FX_MACOSX_)
+      m_bMouseIn(false),
+#endif
       m_pCloseBox(nullptr),
       m_pMinBox(nullptr),
       m_pMaxBox(nullptr),
@@ -55,11 +58,9 @@
       m_bMaximized(false),
       m_bSetMaximize(false),
       m_bCustomizeLayout(false),
-      m_eFormSize(FWL_FORMSIZE_Manual),
       m_bDoModalFlag(false),
       m_pBigIcon(nullptr),
-      m_pSmallIcon(nullptr),
-      m_bMouseIn(false) {
+      m_pSmallIcon(nullptr) {
   m_rtRelative.Reset();
   m_rtCaption.Reset();
   m_rtRestore.Reset();
@@ -319,15 +320,6 @@
 #endif
 }
 
-FWL_FORMSIZE IFWL_Form::GetFormSize() {
-  return m_eFormSize;
-}
-
-FWL_Error IFWL_Form::SetFormSize(FWL_FORMSIZE eFormSize) {
-  m_eFormSize = eFormSize;
-  return FWL_Error::Succeeded;
-}
-
 IFWL_Widget* IFWL_Form::DoModal() {
   const IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
@@ -350,37 +342,29 @@
   return nullptr;
 }
 
-IFWL_Widget* IFWL_Form::DoModal(uint32_t& dwCommandID) {
-  return DoModal();
-}
-
-FWL_Error IFWL_Form::EndDoModal() {
+void IFWL_Form::EndDoModal() {
   if (!m_pNoteLoop)
-    return FWL_Error::Indefinite;
+    return;
   m_bDoModalFlag = false;
 #if (_FX_OS_ == _FX_MACOSX_)
   m_pNoteLoop->EndModalLoop();
   const IFWL_App* pApp = GetOwnerApp();
   if (!pApp)
-    return FWL_Error::Indefinite;
+    return;
 
   CFWL_NoteDriver* pDriver =
       static_cast<CFWL_NoteDriver*>(pApp->GetNoteDriver());
   if (!pDriver)
-    return FWL_Error::Indefinite;
+    return;
 
   pDriver->PopNoteLoop();
   SetStates(FWL_WGTSTATE_Invisible, true);
-  return FWL_Error::Succeeded;
 #else
   SetStates(FWL_WGTSTATE_Invisible, true);
-  return m_pNoteLoop->EndModalLoop();
+  m_pNoteLoop->EndModalLoop();
 #endif
 }
 
-FWL_Error IFWL_Form::SetBorderRegion(CFX_Path* pPath) {
-  return FWL_Error::Succeeded;
-}
 void IFWL_Form::DrawBackground(CFX_Graphics* pGraphics,
                                IFWL_ThemeProvider* pTheme) {
   CFWL_ThemeBackground param;
@@ -392,28 +376,6 @@
                          m_fCXBorder);
   pTheme->DrawBackground(&param);
 }
-IFWL_Widget* IFWL_Form::GetSubFocus() {
-  return m_pSubFocus;
-}
-void IFWL_Form::SetSubFocus(IFWL_Widget* pWidget) {
-  m_pSubFocus = pWidget;
-}
-
-void IFWL_Form::ShowChildWidget(IFWL_Widget* pParent) {
-  const IFWL_App* pApp = pParent->GetOwnerApp();
-  if (!pApp)
-    return;
-
-  CFWL_WidgetMgr* pWidgetMgr = pApp->GetWidgetMgr();
-  if (!pWidgetMgr)
-    return;
-
-  IFWL_Widget* pChild = pWidgetMgr->GetFirstChildWidget(pParent);
-  while (pChild) {
-    ShowChildWidget(pChild);
-    pChild = pWidgetMgr->GetNextSiblingWidget(pChild);
-  }
-}
 
 void IFWL_Form::RemoveSysButtons() {
   m_rtCaption.Reset();
@@ -427,17 +389,6 @@
   m_pCaptionBox = nullptr;
 }
 
-void IFWL_Form::CalcContentRect(CFX_RectF& rtContent) {
-#ifdef FWL_UseMacSystemBorder
-  rtContent = m_rtRelative;
-#else
-  GetEdgeRect(rtContent);
-  if (HasEdge()) {
-    FX_FLOAT fEdge = GetEdgeWidth();
-    rtContent.Deflate(fEdge, fEdge);
-  }
-#endif
-}
 CFWL_SysBtn* IFWL_Form::GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
   if (m_pCloseBox && m_pCloseBox->m_rtBtn.Contains(fx, fy)) {
     return m_pCloseBox;
@@ -578,14 +529,14 @@
   m_bSetMaximize = true;
   Repaint(&m_rtRelative);
 }
-void IFWL_Form::SetCursor(FX_FLOAT fx, FX_FLOAT fy) {}
+
 void IFWL_Form::Layout() {
   GetRelativeRect(m_rtRelative);
 #ifndef FWL_UseMacSystemBorder
-  ReSetSysBtn();
+  ResetSysBtn();
 #endif
 }
-void IFWL_Form::ReSetSysBtn() {
+void IFWL_Form::ResetSysBtn() {
   m_fCXBorder =
       *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::CXBorder));
   m_fCYBorder =
@@ -676,9 +627,7 @@
 
   pDriver->UnRegisterForm(this);
 }
-bool IFWL_Form::IsDoModal() {
-  return m_bDoModalFlag;
-}
+
 void IFWL_Form::SetThemeData() {
   m_fSmallIconSz =
       *static_cast<FX_FLOAT*>(GetThemeCapacity(CFWL_WidgetCapacity::SmallIcon));
@@ -713,55 +662,6 @@
   CFX_WideString text;
   pData->GetCaption(this, text);
 }
-void IFWL_Form::DoWidthLimit(FX_FLOAT& fLeft,
-                             FX_FLOAT& fWidth,
-                             FX_FLOAT fCurX,
-                             FX_FLOAT fSpace,
-                             FX_FLOAT fLimitMin,
-                             FX_FLOAT fLimitMax,
-                             bool bLeft) {
-  FX_FLOAT fx = fCurX;
-  FX_FLOAT fy = 0;
-  TransformTo(nullptr, fx, fy);
-  FX_FLOAT fTemp =
-      bLeft ? (fWidth - fx + fLeft + fSpace) : (fx - fLeft + fSpace);
-  if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
-    fWidth = fTemp;
-    fLeft += bLeft ? (fx - fLeft - fSpace) : 0;
-  } else {
-    if (fTemp < fLimitMin && fWidth > fLimitMin) {
-      fLeft += bLeft ? (fWidth - fLimitMin) : 0;
-      fWidth = fLimitMin;
-    } else if (fTemp > fLimitMax && fWidth < fLimitMax) {
-      fLeft -= bLeft ? (fLimitMax - fWidth) : 0;
-      fWidth = fLimitMax;
-    }
-  }
-}
-void IFWL_Form::DoHeightLimit(FX_FLOAT& fTop,
-                              FX_FLOAT& fHeight,
-                              FX_FLOAT fCurY,
-                              FX_FLOAT fSpace,
-                              FX_FLOAT fLimitMin,
-                              FX_FLOAT fLimitMax,
-                              bool bTop) {
-  FX_FLOAT fx = 0;
-  FX_FLOAT fy = fCurY;
-  TransformTo(nullptr, fx, fy);
-  FX_FLOAT fTemp = bTop ? (fHeight - fy + fTop + fSpace) : (fy - fTop + fSpace);
-  if (fTemp >= fLimitMin && fTemp <= fLimitMax) {
-    fHeight = fTemp;
-    fTop += bTop ? (fy - fTop - fSpace) : 0;
-  } else {
-    if (fTemp < fLimitMin && fHeight > fLimitMin) {
-      fTop += bTop ? (fHeight - fLimitMin) : 0;
-      fHeight = fLimitMin;
-    } else if (fTemp > fLimitMax && fHeight < fLimitMax) {
-      fTop -= bTop ? (fLimitMax - fHeight) : 0;
-      fHeight = fLimitMax;
-    }
-  }
-}
 
 #ifdef FWL_UseMacSystemBorder
 void IFWL_Form::OnProcessMessage(CFWL_Message* pMessage) {
@@ -832,9 +732,6 @@
         case FWL_MouseCommand::Move:
           OnMouseMove(pMsg);
           break;
-        case FWL_MouseCommand::Hover:
-          OnMouseHover(pMsg);
-          break;
         case FWL_MouseCommand::Leave:
           OnMouseLeave(pMsg);
           break;
@@ -897,10 +794,6 @@
     Repaint(&pPressBtn->m_rtBtn);
   } else if (rtCap.Contains(pMsg->m_fx, pMsg->m_fy)) {
     m_eResizeType = FORM_RESIZETYPE_Cap;
-  } else if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-             (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
-             !m_bMaximized) {
-    SetCursor(pMsg->m_fx, pMsg->m_fy);
   }
   m_InfoStart.m_ptStart = CFX_PointF(pMsg->m_fx, pMsg->m_fy);
   m_InfoStart.m_szStart = CFX_SizeF(m_pProperties->m_rtWidget.width,
@@ -937,11 +830,6 @@
   if (m_bLButtonDown)
     return;
 
-  if ((m_pProperties->m_dwStyles & FWL_WGTSTYLE_Border) &&
-      (m_pProperties->m_dwStyleExes & FWL_STYLEEXT_FRM_Resize) &&
-      !m_bMaximized) {
-    SetCursor(pMsg->m_fx, pMsg->m_fy);
-  }
   CFX_RectF rtInvalidate;
   rtInvalidate.Reset();
   CFWL_SysBtn* pPointBtn = GetSysBtnAtPoint(pMsg->m_fx, pMsg->m_fy);
@@ -990,18 +878,12 @@
     Repaint(&rtInvalidate);
 }
 
-void IFWL_Form::OnMouseHover(CFWL_MsgMouse* pMsg) {
-  SetCursor(pMsg->m_fx, pMsg->m_fy);
-}
-
 void IFWL_Form::OnMouseLeave(CFWL_MsgMouse* pMsg) {
   CFWL_SysBtn* pHover = GetSysBtnByState(FWL_SYSBUTTONSTATE_Hover);
   if (pHover) {
     pHover->SetNormal();
     Repaint(&pHover->m_rtBtn);
   }
-  if (pMsg->m_dwCmd == FWL_MouseCommand::Leave && !m_bLButtonDown)
-    SetCursor(pMsg->m_fx, pMsg->m_fy);
 }
 
 void IFWL_Form::OnLButtonDblClk(CFWL_MsgMouse* pMsg) {
diff --git a/xfa/fwl/core/ifwl_form.h b/xfa/fwl/core/ifwl_form.h
index 08211fe..77acbd8 100644
--- a/xfa/fwl/core/ifwl_form.h
+++ b/xfa/fwl/core/ifwl_form.h
@@ -101,22 +101,15 @@
   void OnDrawWidget(CFX_Graphics* pGraphics,
                     const CFX_Matrix* pMatrix) override;
 
-  FWL_FORMSIZE GetFormSize();
-  FWL_Error SetFormSize(FWL_FORMSIZE eFormSize);
   IFWL_Widget* DoModal();
-  IFWL_Widget* DoModal(uint32_t& dwCommandID);
-  FWL_Error EndDoModal();
-  FWL_Error SetBorderRegion(CFX_Path* pPath);
+  void EndDoModal();
+
+  IFWL_Widget* GetSubFocus() const { return m_pSubFocus; }
+  void SetSubFocus(IFWL_Widget* pWidget) { m_pSubFocus = pWidget; }
+
+ private:
   void DrawBackground(CFX_Graphics* pGraphics, IFWL_ThemeProvider* pTheme);
-  IFWL_Widget* GetSubFocus();
-  void SetSubFocus(IFWL_Widget* pWidget);
-
- protected:
-  friend class CFWL_FormImpDelegate;
-
-  void ShowChildWidget(IFWL_Widget* pParent);
   void RemoveSysButtons();
-  void CalcContentRect(CFX_RectF& rtContent);
   CFWL_SysBtn* GetSysBtnAtPoint(FX_FLOAT fx, FX_FLOAT fy);
   CFWL_SysBtn* GetSysBtnByState(uint32_t dwState);
   CFWL_SysBtn* GetSysBtnByIndex(int32_t nIndex);
@@ -130,31 +123,25 @@
                      const CFX_Matrix* pMatrix = nullptr);
   void GetEdgeRect(CFX_RectF& rtEdge);
   void SetWorkAreaRect();
-  void SetCursor(FX_FLOAT fx, FX_FLOAT fy);
   void Layout();
-  void ReSetSysBtn();
+  void ResetSysBtn();
   void RegisterForm();
   void UnRegisterForm();
-  bool IsDoModal();
   void SetThemeData();
   bool HasIcon();
   void UpdateIcon();
   void UpdateCaption();
-  void DoWidthLimit(FX_FLOAT& fLeft,
-                    FX_FLOAT& fWidth,
-                    FX_FLOAT fCurX,
-                    FX_FLOAT fSpace,
-                    FX_FLOAT fLimitMin,
-                    FX_FLOAT fLimitMax,
-                    bool bLeft);
-  void DoHeightLimit(FX_FLOAT& fTop,
-                     FX_FLOAT& fHeight,
-                     FX_FLOAT fCurY,
-                     FX_FLOAT fSpace,
-                     FX_FLOAT fLimitMin,
-                     FX_FLOAT fLimitMax,
-                     bool bTop);
+  void OnLButtonDown(CFWL_MsgMouse* pMsg);
+  void OnLButtonUp(CFWL_MsgMouse* pMsg);
+  void OnMouseMove(CFWL_MsgMouse* pMsg);
+  void OnMouseLeave(CFWL_MsgMouse* pMsg);
+  void OnLButtonDblClk(CFWL_MsgMouse* pMsg);
+  void OnWindowMove(CFWL_MsgWindowMove* pMsg);
+  void OnClose(CFWL_MsgClose* pMsg);
 
+#if (_FX_OS_ == _FX_MACOSX_)
+  bool m_bMouseIn;
+#endif
   CFX_RectF m_rtRestore;
   CFX_RectF m_rtCaptionText;
   CFX_RectF m_rtRelative;
@@ -176,23 +163,11 @@
   bool m_bMaximized;
   bool m_bSetMaximize;
   bool m_bCustomizeLayout;
-  FWL_FORMSIZE m_eFormSize;
   bool m_bDoModalFlag;
   FX_FLOAT m_fSmallIconSz;
   FX_FLOAT m_fBigIconSz;
   CFX_DIBitmap* m_pBigIcon;
   CFX_DIBitmap* m_pSmallIcon;
-  bool m_bMouseIn;
-
- private:
-  void OnLButtonDown(CFWL_MsgMouse* pMsg);
-  void OnLButtonUp(CFWL_MsgMouse* pMsg);
-  void OnMouseMove(CFWL_MsgMouse* pMsg);
-  void OnMouseHover(CFWL_MsgMouse* pMsg);
-  void OnMouseLeave(CFWL_MsgMouse* pMsg);
-  void OnLButtonDblClk(CFWL_MsgMouse* pMsg);
-  void OnWindowMove(CFWL_MsgWindowMove* pMsg);
-  void OnClose(CFWL_MsgClose* pMsg);
 };
 
 #endif  // XFA_FWL_CORE_IFWL_FORM_H_
diff --git a/xfa/fxfa/app/xfa_fftextedit.cpp b/xfa/fxfa/app/xfa_fftextedit.cpp
index 2b47ae2..e851cb2 100644
--- a/xfa/fxfa/app/xfa_fftextedit.cpp
+++ b/xfa/fxfa/app/xfa_fftextedit.cpp
@@ -289,72 +289,6 @@
   }
   return true;
 }
-bool CXFA_FFTextEdit::CanUndo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->CanUndo();
-}
-bool CXFA_FFTextEdit::CanRedo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->CanRedo();
-}
-bool CXFA_FFTextEdit::Undo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->Undo();
-}
-bool CXFA_FFTextEdit::Redo() {
-  return ((CFWL_Edit*)m_pNormalWidget)->Redo();
-}
-bool CXFA_FFTextEdit::CanCopy() {
-  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
-  return nCount > 0;
-}
-bool CXFA_FFTextEdit::CanCut() {
-  if (m_pNormalWidget->GetStylesEx() & FWL_STYLEEXT_EDT_ReadOnly) {
-    return false;
-  }
-  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->CountSelRanges();
-  return nCount > 0;
-}
-bool CXFA_FFTextEdit::CanPaste() {
-  return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
-}
-bool CXFA_FFTextEdit::CanSelectAll() {
-  return ((CFWL_Edit*)m_pNormalWidget)->GetTextLength() > 0;
-}
-bool CXFA_FFTextEdit::Copy(CFX_WideString& wsCopy) {
-  return ((CFWL_Edit*)m_pNormalWidget)->Copy(wsCopy);
-}
-bool CXFA_FFTextEdit::Cut(CFX_WideString& wsCut) {
-  return ((CFWL_Edit*)m_pNormalWidget)->Cut(wsCut);
-}
-bool CXFA_FFTextEdit::Paste(const CFX_WideString& wsPaste) {
-  return ((CFWL_Edit*)m_pNormalWidget)->Paste(wsPaste);
-}
-bool CXFA_FFTextEdit::SelectAll() {
-  int32_t nCount = ((CFWL_Edit*)m_pNormalWidget)->GetTextLength();
-  return ((CFWL_Edit*)m_pNormalWidget)->AddSelRange(0, nCount) >= 0;
-}
-bool CXFA_FFTextEdit::Delete() {
-  return ((CFWL_Edit*)m_pNormalWidget)->Delete();
-}
-bool CXFA_FFTextEdit::DeSelect() {
-  return ((CFWL_Edit*)m_pNormalWidget)->ClearSelections() ==
-         FWL_Error::Succeeded;
-}
-bool CXFA_FFTextEdit::GetSuggestWords(CFX_PointF pointf,
-                                      std::vector<CFX_ByteString>& sSuggest) {
-  if (m_pDataAcc->GetUIType() != XFA_Element::TextEdit) {
-    return false;
-  }
-  FWLToClient(pointf.x, pointf.y);
-  return ((CFWL_Edit*)m_pNormalWidget)->GetSuggestWords(pointf, sSuggest);
-}
-bool CXFA_FFTextEdit::ReplaceSpellCheckWord(CFX_PointF pointf,
-                                            const CFX_ByteStringC& bsReplace) {
-  if (m_pDataAcc->GetUIType() != XFA_Element::TextEdit) {
-    return false;
-  }
-  FWLToClient(pointf.x, pointf.y);
-  return ((CFWL_Edit*)m_pNormalWidget)
-      ->ReplaceSpellCheckWord(pointf, bsReplace);
-}
 void CXFA_FFTextEdit::OnTextChanged(IFWL_Widget* pWidget,
                                     const CFX_WideString& wsChanged,
                                     const CFX_WideString& wsPrevText) {
@@ -417,11 +351,6 @@
       event->bCheckWord = CheckWord(event->bsWord.AsStringC());
       break;
     }
-    case CFWL_EventType::GetSuggestedWords: {
-      CFWL_EvtEdtGetSuggestWords* event = (CFWL_EvtEdtGetSuggestWords*)pEvent;
-      event->bSuggestWords = false;
-      break;
-    }
     default:
       break;
   }
@@ -726,51 +655,7 @@
   m_pDataAcc->GetValue(wsOldValue, XFA_VALUEPICTURE_Edit);
   return wsOldValue != wsText;
 }
-bool CXFA_FFDateTimeEdit::CanUndo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanUndo();
-}
-bool CXFA_FFDateTimeEdit::CanRedo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanRedo();
-}
-bool CXFA_FFDateTimeEdit::Undo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Undo();
-}
-bool CXFA_FFDateTimeEdit::Redo() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Redo();
-}
-bool CXFA_FFDateTimeEdit::CanCopy() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCopy();
-}
-bool CXFA_FFDateTimeEdit::CanCut() {
-  if (m_pDataAcc->GetAccess() != XFA_ATTRIBUTEENUM_Open) {
-    return false;
-  }
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanCut();
-}
-bool CXFA_FFDateTimeEdit::CanPaste() {
-  return m_pDataAcc->GetAccess() == XFA_ATTRIBUTEENUM_Open;
-}
-bool CXFA_FFDateTimeEdit::CanSelectAll() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->CanSelectAll();
-}
-bool CXFA_FFDateTimeEdit::Copy(CFX_WideString& wsCopy) {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Copy(wsCopy);
-}
-bool CXFA_FFDateTimeEdit::Cut(CFX_WideString& wsCut) {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Cut(wsCut);
-}
-bool CXFA_FFDateTimeEdit::Paste(const CFX_WideString& wsPaste) {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Paste(wsPaste);
-}
-bool CXFA_FFDateTimeEdit::SelectAll() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->SelectAll();
-}
-bool CXFA_FFDateTimeEdit::Delete() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->Delete();
-}
-bool CXFA_FFDateTimeEdit::DeSelect() {
-  return ((CFWL_DateTimePicker*)m_pNormalWidget)->DeSelect();
-}
+
 void CXFA_FFDateTimeEdit::OnSelectChanged(IFWL_Widget* pWidget,
                                           int32_t iYear,
                                           int32_t iMonth,
diff --git a/xfa/fxfa/app/xfa_fftextedit.h b/xfa/fxfa/app/xfa_fftextedit.h
index 917d6cf..115b370 100644
--- a/xfa/fxfa/app/xfa_fftextedit.h
+++ b/xfa/fxfa/app/xfa_fftextedit.h
@@ -24,24 +24,6 @@
   bool OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
   bool OnSetFocus(CXFA_FFWidget* pOldWidget) override;
   bool OnKillFocus(CXFA_FFWidget* pNewWidget) override;
-  bool CanUndo() override;
-  bool CanRedo() override;
-  bool Undo() override;
-  bool Redo() override;
-  bool CanCopy() override;
-  bool CanCut() override;
-  bool CanPaste() override;
-  bool CanSelectAll() override;
-  bool Copy(CFX_WideString& wsCopy) override;
-  bool Cut(CFX_WideString& wsCut) override;
-  bool Paste(const CFX_WideString& wsPaste) override;
-  bool SelectAll() override;
-  bool Delete() override;
-  bool DeSelect() override;
-  bool GetSuggestWords(CFX_PointF pointf,
-                       std::vector<CFX_ByteString>& sSuggest) override;
-  bool ReplaceSpellCheckWord(CFX_PointF pointf,
-                             const CFX_ByteStringC& bsReplace) override;
   void OnProcessMessage(CFWL_Message* pMessage) override;
   void OnProcessEvent(CFWL_Event* pEvent) override;
   void OnDrawWidget(CFX_Graphics* pGraphics,
@@ -107,21 +89,6 @@
                bool bDrawFocus = false) override;
   bool LoadWidget() override;
   void UpdateWidgetProperty() override;
-
-  bool CanUndo() override;
-  bool CanRedo() override;
-  bool Undo() override;
-  bool Redo() override;
-  bool CanCopy() override;
-  bool CanCut() override;
-  bool CanPaste() override;
-  bool CanSelectAll() override;
-  bool Copy(CFX_WideString& wsCopy) override;
-  bool Cut(CFX_WideString& wsCut) override;
-  bool Paste(const CFX_WideString& wsPaste) override;
-  bool SelectAll() override;
-  bool Delete() override;
-  bool DeSelect() override;
   void OnProcessEvent(CFWL_Event* pEvent) override;
 
   void OnSelectChanged(IFWL_Widget* pWidget,
