Use virtual function to retrieve interface pointer

Use virtual function to return the actual interface type instead
of the base interface type to avoid a lot of casts.

Also tidy up CFWL_Widget by encapsulating variables, and use
smart pointers for class owned member variables.

Review-Url: https://codereview.chromium.org/2209153002
diff --git a/xfa/fwl/lightwidget/cfwl_barcode.cpp b/xfa/fwl/lightwidget/cfwl_barcode.cpp
index 2e29d63..24dce17 100644
--- a/xfa/fwl/lightwidget/cfwl_barcode.cpp
+++ b/xfa/fwl/lightwidget/cfwl_barcode.cpp
@@ -8,6 +8,14 @@
 
 #include <memory>
 
+IFWL_Barcode* CFWL_Barcode::GetWidget() {
+  return static_cast<IFWL_Barcode*>(m_pIface.get());
+}
+
+const IFWL_Barcode* CFWL_Barcode::GetWidget() const {
+  return static_cast<IFWL_Barcode*>(m_pIface.get());
+}
+
 CFWL_Barcode* CFWL_Barcode::Create() {
   return new CFWL_Barcode;
 }
@@ -24,7 +32,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pBarcode.release();
+  m_pIface = std::move(pBarcode);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
@@ -34,15 +42,12 @@
 CFWL_Barcode::~CFWL_Barcode() {}
 
 void CFWL_Barcode::SetType(BC_TYPE type) {
-  if (!m_pIface)
-    return;
-  static_cast<IFWL_Barcode*>(m_pIface)->SetType(type);
+  if (GetWidget())
+    GetWidget()->SetType(type);
 }
 
 FX_BOOL CFWL_Barcode::IsProtectedType() {
-  if (!m_pIface)
-    return 0;
-  return static_cast<IFWL_Barcode*>(m_pIface)->IsProtectedType();
+  return GetWidget() ? GetWidget()->IsProtectedType() : FALSE;
 }
 
 CFWL_Barcode::CFWL_BarcodeDP::CFWL_BarcodeDP()
diff --git a/xfa/fwl/lightwidget/cfwl_barcode.h b/xfa/fwl/lightwidget/cfwl_barcode.h
index 466ff6e..cf394f6 100644
--- a/xfa/fwl/lightwidget/cfwl_barcode.h
+++ b/xfa/fwl/lightwidget/cfwl_barcode.h
@@ -17,6 +17,10 @@
 class CFWL_Barcode : public CFWL_Edit {
  public:
   static CFWL_Barcode* Create();
+
+  IFWL_Barcode* GetWidget() override;
+  const IFWL_Barcode* GetWidget() const override;
+
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
   void SetType(BC_TYPE type);
   FX_BOOL IsProtectedType();
@@ -36,7 +40,7 @@
   void SetDataLength(int32_t dataLength) {
     m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_DATALENGTH;
     m_barcodeData.m_nDataLength = dataLength;
-    static_cast<IFWL_Barcode*>(m_pIface)->SetLimit(dataLength);
+    GetWidget()->SetLimit(dataLength);
   }
   void SetCalChecksum(int32_t calChecksum) {
     m_barcodeData.m_dwAttributeMask |= FWL_BCDATTRIBUTE_CALCHECKSUM;
diff --git a/xfa/fwl/lightwidget/cfwl_checkbox.cpp b/xfa/fwl/lightwidget/cfwl_checkbox.cpp
index a93bc46..1f59ee1 100644
--- a/xfa/fwl/lightwidget/cfwl_checkbox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_checkbox.cpp
@@ -10,6 +10,14 @@
 
 #include "xfa/fwl/core/fwl_error.h"
 
+IFWL_CheckBox* CFWL_CheckBox::GetWidget() {
+  return static_cast<IFWL_CheckBox*>(m_pIface.get());
+}
+
+const IFWL_CheckBox* CFWL_CheckBox::GetWidget() const {
+  return static_cast<IFWL_CheckBox*>(m_pIface.get());
+}
+
 CFWL_CheckBox* CFWL_CheckBox::Create() {
   return new CFWL_CheckBox;
 }
@@ -26,7 +34,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pCheckBox.release();
+  m_pIface = std::move(pCheckBox);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
@@ -42,11 +50,11 @@
 }
 
 int32_t CFWL_CheckBox::GetCheckState() {
-  return static_cast<IFWL_CheckBox*>(m_pIface)->GetCheckState();
+  return GetWidget()->GetCheckState();
 }
 
 FWL_Error CFWL_CheckBox::SetCheckState(int32_t iCheck) {
-  return static_cast<IFWL_CheckBox*>(m_pIface)->SetCheckState(iCheck);
+  return GetWidget()->SetCheckState(iCheck);
 }
 
 CFWL_CheckBox::CFWL_CheckBox() {}
diff --git a/xfa/fwl/lightwidget/cfwl_checkbox.h b/xfa/fwl/lightwidget/cfwl_checkbox.h
index eb23536..51e6294 100644
--- a/xfa/fwl/lightwidget/cfwl_checkbox.h
+++ b/xfa/fwl/lightwidget/cfwl_checkbox.h
@@ -15,6 +15,9 @@
   CFWL_CheckBox();
   ~CFWL_CheckBox() override;
 
+  IFWL_CheckBox* GetWidget() override;
+  const IFWL_CheckBox* GetWidget() const override;
+
   static CFWL_CheckBox* Create();
 
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
diff --git a/xfa/fwl/lightwidget/cfwl_combobox.cpp b/xfa/fwl/lightwidget/cfwl_combobox.cpp
index 01b64dc..678edc4 100644
--- a/xfa/fwl/lightwidget/cfwl_combobox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_combobox.cpp
@@ -11,6 +11,14 @@
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 
+IFWL_ComboBox* CFWL_ComboBox::GetWidget() {
+  return static_cast<IFWL_ComboBox*>(m_pIface.get());
+}
+
+const IFWL_ComboBox* CFWL_ComboBox::GetWidget() const {
+  return static_cast<IFWL_ComboBox*>(m_pIface.get());
+}
+
 CFWL_ComboBox* CFWL_ComboBox::Create() {
   return new CFWL_ComboBox;
 }
@@ -27,7 +35,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pComboBox.release();
+  m_pIface = std::move(pComboBox);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
@@ -69,8 +77,8 @@
 
 FWL_Error CFWL_ComboBox::GetTextByIndex(int32_t iIndex,
                                         CFX_WideString& wsText) {
-  CFWL_ComboBoxItem* pItem =
-      static_cast<CFWL_ComboBoxItem*>(m_comboBoxData.GetItem(m_pIface, iIndex));
+  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
+      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
   if (!pItem)
     return FWL_Error::Indefinite;
   wsText = pItem->m_wsText;
@@ -78,78 +86,57 @@
 }
 
 int32_t CFWL_ComboBox::GetCurSel() {
-  if (!m_pIface)
-    return -1;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->GetCurSel();
+  return GetWidget() ? GetWidget()->GetCurSel() : -1;
 }
 
 FWL_Error CFWL_ComboBox::SetCurSel(int32_t iSel) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->SetCurSel(iSel);
+  return GetWidget() ? GetWidget()->SetCurSel(iSel) : FWL_Error::Indefinite;
 }
 
 FWL_Error CFWL_ComboBox::SetEditText(const CFX_WideString& wsText) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditText(wsText);
+  return GetWidget() ? GetWidget()->SetEditText(wsText) : FWL_Error::Indefinite;
 }
 
 int32_t CFWL_ComboBox::GetEditTextLength() const {
-  if (!m_pIface)
-    return 0;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditTextLength();
+  return GetWidget() ? GetWidget()->GetEditTextLength() : 0;
 }
 
 FWL_Error CFWL_ComboBox::GetEditText(CFX_WideString& wsText,
                                      int32_t nStart,
                                      int32_t nCount) const {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)
-      ->GetEditText(wsText, nStart, nCount);
+  return GetWidget() ? GetWidget()->GetEditText(wsText, nStart, nCount)
+                     : FWL_Error::Indefinite;
 }
 
 FWL_Error CFWL_ComboBox::SetEditSelRange(int32_t nStart, int32_t nCount) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditSelRange(nStart, nCount);
+  return GetWidget() ? GetWidget()->SetEditSelRange(nStart, nCount)
+                     : FWL_Error::Indefinite;
 }
 
 int32_t CFWL_ComboBox::GetEditSelRange(int32_t nIndex, int32_t& nStart) {
-  if (!m_pIface)
-    return 0;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditSelRange(nIndex, nStart);
+  return GetWidget() ? GetWidget()->GetEditSelRange(nIndex, nStart) : 0;
 }
 
 int32_t CFWL_ComboBox::GetEditLimit() {
-  if (!m_pIface)
-    return 0;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->GetEditLimit();
+  return GetWidget() ? GetWidget()->GetEditLimit() : 0;
 }
 
 FWL_Error CFWL_ComboBox::SetEditLimit(int32_t nLimit) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->SetEditLimit(nLimit);
+  return GetWidget() ? GetWidget()->SetEditLimit(nLimit)
+                     : FWL_Error::Indefinite;
 }
 
 FWL_Error CFWL_ComboBox::EditDoClipboard(int32_t iCmd) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditDoClipboard(iCmd);
+  return GetWidget() ? GetWidget()->EditDoClipboard(iCmd)
+                     : FWL_Error::Indefinite;
 }
 
 FX_BOOL CFWL_ComboBox::EditRedo(const IFDE_TxtEdtDoRecord* pRecord) {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditRedo(pRecord);
+  return GetWidget() ? GetWidget()->EditRedo(pRecord) : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditUndo(const IFDE_TxtEdtDoRecord* pRecord) {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditUndo(pRecord);
+  return GetWidget() ? GetWidget()->EditUndo(pRecord) : FALSE;
 }
 
 FWL_Error CFWL_ComboBox::SetMaxListHeight(FX_FLOAT fMaxHeight) {
@@ -158,8 +145,8 @@
 }
 
 FWL_Error CFWL_ComboBox::SetItemData(int32_t iIndex, void* pData) {
-  CFWL_ComboBoxItem* pItem =
-      static_cast<CFWL_ComboBoxItem*>(m_comboBoxData.GetItem(m_pIface, iIndex));
+  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
+      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
   if (!pItem)
     return FWL_Error::Indefinite;
   pItem->m_pData = pData;
@@ -167,114 +154,85 @@
 }
 
 void* CFWL_ComboBox::GetItemData(int32_t iIndex) {
-  CFWL_ComboBoxItem* pItem =
-      static_cast<CFWL_ComboBoxItem*>(m_comboBoxData.GetItem(m_pIface, iIndex));
+  CFWL_ComboBoxItem* pItem = static_cast<CFWL_ComboBoxItem*>(
+      m_comboBoxData.GetItem(m_pIface.get(), iIndex));
   return pItem ? pItem->m_pData : nullptr;
 }
 
 FWL_Error CFWL_ComboBox::SetListTheme(IFWL_ThemeProvider* pTheme) {
-  return static_cast<IFWL_ComboBox*>(m_pIface)->GetListBoxt()->SetThemeProvider(
-      pTheme);
+  return GetWidget()->GetListBoxt()->SetThemeProvider(pTheme);
 }
 
 FX_BOOL CFWL_ComboBox::AfterFocusShowDropList() {
-  return static_cast<IFWL_ComboBox*>(m_pIface)->AfterFocusShowDropList();
+  return GetWidget()->AfterFocusShowDropList();
 }
 
 FWL_Error CFWL_ComboBox::OpenDropDownList(FX_BOOL bActivate) {
-  return static_cast<IFWL_ComboBox*>(m_pIface)->OpenDropDownList(bActivate);
+  return GetWidget()->OpenDropDownList(bActivate);
 }
 
 FX_BOOL CFWL_ComboBox::EditCanUndo() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanUndo();
+  return GetWidget() ? GetWidget()->EditCanUndo() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditCanRedo() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanRedo();
+  return GetWidget() ? GetWidget()->EditCanRedo() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditUndo() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditUndo();
+  return GetWidget() ? GetWidget()->EditUndo() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditRedo() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditRedo();
+  return GetWidget() ? GetWidget()->EditRedo() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditCanCopy() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanCopy();
+  return GetWidget() ? GetWidget()->EditCanCopy() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditCanCut() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanCut();
+  return GetWidget() ? GetWidget()->EditCanCut() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditCanSelectAll() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCanSelectAll();
+  return GetWidget() ? GetWidget()->EditCanSelectAll() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditCopy(CFX_WideString& wsCopy) {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCopy(wsCopy);
+  return GetWidget() ? GetWidget()->EditCopy(wsCopy) : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditCut(CFX_WideString& wsCut) {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditCut(wsCut);
+  return GetWidget() ? GetWidget()->EditCut(wsCut) : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditPaste(const CFX_WideString& wsPaste) {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditPaste(wsPaste);
+  return GetWidget() ? GetWidget()->EditPaste(wsPaste) : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditSelectAll() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditSelectAll();
+  return GetWidget() ? GetWidget()->EditSelectAll() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditDelete() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditDelete();
+  return GetWidget() ? GetWidget()->EditDelete() : FALSE;
 }
 
 FX_BOOL CFWL_ComboBox::EditDeSelect() {
-  if (!m_pIface)
-    return FALSE;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->EditDeSelect();
+  return GetWidget() ? GetWidget()->EditDeSelect() : FALSE;
 }
 
 FWL_Error CFWL_ComboBox::GetBBox(CFX_RectF& rect) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)->GetBBox(rect);
+  return GetWidget() ? GetWidget()->GetBBox(rect) : FWL_Error::Indefinite;
 }
 
 FWL_Error CFWL_ComboBox::EditModifyStylesEx(uint32_t dwStylesExAdded,
                                             uint32_t dwStylesExRemoved) {
-  if (!m_pIface)
-    return FWL_Error::Indefinite;
-  return static_cast<IFWL_ComboBox*>(m_pIface)
-      ->EditModifyStylesEx(dwStylesExAdded, dwStylesExRemoved);
+  return GetWidget()
+             ? GetWidget()->EditModifyStylesEx(dwStylesExAdded,
+                                               dwStylesExRemoved)
+             : FWL_Error::Indefinite;
 }
 
 CFWL_ComboBox::CFWL_ComboBox() {}
diff --git a/xfa/fwl/lightwidget/cfwl_combobox.h b/xfa/fwl/lightwidget/cfwl_combobox.h
index ab703fe..186d4b7 100644
--- a/xfa/fwl/lightwidget/cfwl_combobox.h
+++ b/xfa/fwl/lightwidget/cfwl_combobox.h
@@ -23,6 +23,9 @@
   CFWL_ComboBox();
   ~CFWL_ComboBox() override;
 
+  IFWL_ComboBox* GetWidget() override;
+  const IFWL_ComboBox* GetWidget() const override;
+
   static CFWL_ComboBox* Create();
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
   int32_t AddString(const CFX_WideStringC& wsText);
diff --git a/xfa/fwl/lightwidget/cfwl_datetimepicker.cpp b/xfa/fwl/lightwidget/cfwl_datetimepicker.cpp
index dba1a52..1256e1a 100644
--- a/xfa/fwl/lightwidget/cfwl_datetimepicker.cpp
+++ b/xfa/fwl/lightwidget/cfwl_datetimepicker.cpp
@@ -12,6 +12,14 @@
 #include "xfa/fwl/core/fwl_error.h"
 #include "xfa/fwl/core/ifwl_widget.h"
 
+IFWL_DateTimePicker* CFWL_DateTimePicker::GetWidget() {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface.get());
+}
+
+const IFWL_DateTimePicker* CFWL_DateTimePicker::GetWidget() const {
+  return static_cast<IFWL_DateTimePicker*>(m_pIface.get());
+}
+
 CFWL_DateTimePicker* CFWL_DateTimePicker::Create() {
   return new CFWL_DateTimePicker;
 }
@@ -31,7 +39,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pDateTimePicker.release();
+  m_pIface = std::move(pDateTimePicker);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
@@ -46,34 +54,31 @@
 }
 
 int32_t CFWL_DateTimePicker::CountSelRanges() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CountSelRanges();
+  return GetWidget()->CountSelRanges();
 }
 
 int32_t CFWL_DateTimePicker::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->GetSelRange(nIndex, nStart);
+  return GetWidget()->GetSelRange(nIndex, nStart);
 }
 
 FWL_Error CFWL_DateTimePicker::GetEditText(CFX_WideString& wsText) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetEditText(wsText);
+  return GetWidget()->GetEditText(wsText);
 }
 
 FWL_Error CFWL_DateTimePicker::SetEditText(const CFX_WideString& wsText) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditText(wsText);
+  return GetWidget()->SetEditText(wsText);
 }
 
 FWL_Error CFWL_DateTimePicker::GetCurSel(int32_t& iYear,
                                          int32_t& iMonth,
                                          int32_t& iDay) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->GetCurSel(iYear, iMonth, iDay);
+  return GetWidget()->GetCurSel(iYear, iMonth, iDay);
 }
 
 FWL_Error CFWL_DateTimePicker::SetCurSel(int32_t iYear,
                                          int32_t iMonth,
                                          int32_t iDay) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->SetCurSel(iYear, iMonth, iDay);
+  return GetWidget()->SetCurSel(iYear, iMonth, iDay);
 }
 
 CFWL_DateTimePicker::CFWL_DateTimePicker() {}
@@ -105,67 +110,66 @@
 }
 
 FX_BOOL CFWL_DateTimePicker::CanUndo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanUndo();
+  return GetWidget()->CanUndo();
 }
 
 FX_BOOL CFWL_DateTimePicker::CanRedo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanRedo();
+  return GetWidget()->CanRedo();
 }
 
 FX_BOOL CFWL_DateTimePicker::Undo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Undo();
+  return GetWidget()->Undo();
 }
 
 FX_BOOL CFWL_DateTimePicker::Redo() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Redo();
+  return GetWidget()->Redo();
 }
 
 FX_BOOL CFWL_DateTimePicker::CanCopy() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCopy();
+  return GetWidget()->CanCopy();
 }
 
 FX_BOOL CFWL_DateTimePicker::CanCut() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanCut();
+  return GetWidget()->CanCut();
 }
 
 FX_BOOL CFWL_DateTimePicker::CanSelectAll() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->CanSelectAll();
+  return GetWidget()->CanSelectAll();
 }
 
 FX_BOOL CFWL_DateTimePicker::Copy(CFX_WideString& wsCopy) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCopy);
+  return GetWidget()->Copy(wsCopy);
 }
 
 FX_BOOL CFWL_DateTimePicker::Cut(CFX_WideString& wsCut) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Copy(wsCut);
+  return GetWidget()->Copy(wsCut);
 }
 
 FX_BOOL CFWL_DateTimePicker::Paste(const CFX_WideString& wsPaste) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Paste(wsPaste);
+  return GetWidget()->Paste(wsPaste);
 }
 
 FX_BOOL CFWL_DateTimePicker::SelectAll() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SelectAll();
+  return GetWidget()->SelectAll();
 }
 
 FX_BOOL CFWL_DateTimePicker::Delete() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->Delete();
+  return GetWidget()->Delete();
 }
 
 FX_BOOL CFWL_DateTimePicker::DeSelect() {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->DeSelect();
+  return GetWidget()->DeSelect();
 }
 
 FWL_Error CFWL_DateTimePicker::GetBBox(CFX_RectF& rect) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->GetBBox(rect);
+  return GetWidget()->GetBBox(rect);
 }
 
 FWL_Error CFWL_DateTimePicker::SetEditLimit(int32_t nLimit) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)->SetEditLimit(nLimit);
+  return GetWidget()->SetEditLimit(nLimit);
 }
 
 FWL_Error CFWL_DateTimePicker::ModifyEditStylesEx(uint32_t dwStylesExAdded,
                                                   uint32_t dwStylesExRemoved) {
-  return static_cast<IFWL_DateTimePicker*>(m_pIface)
-      ->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved);
+  return GetWidget()->ModifyEditStylesEx(dwStylesExAdded, dwStylesExRemoved);
 }
diff --git a/xfa/fwl/lightwidget/cfwl_datetimepicker.h b/xfa/fwl/lightwidget/cfwl_datetimepicker.h
index 4348b6c..d727729 100644
--- a/xfa/fwl/lightwidget/cfwl_datetimepicker.h
+++ b/xfa/fwl/lightwidget/cfwl_datetimepicker.h
@@ -14,6 +14,9 @@
  public:
   static CFWL_DateTimePicker* Create();
 
+  IFWL_DateTimePicker* GetWidget() override;
+  const IFWL_DateTimePicker* GetWidget() const override;
+
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
   FWL_Error SetToday(int32_t iYear, int32_t iMonth, int32_t iDay);
   FWL_Error GetEditText(CFX_WideString& wsText);
diff --git a/xfa/fwl/lightwidget/cfwl_edit.cpp b/xfa/fwl/lightwidget/cfwl_edit.cpp
index f1471ea..b74cd05 100644
--- a/xfa/fwl/lightwidget/cfwl_edit.cpp
+++ b/xfa/fwl/lightwidget/cfwl_edit.cpp
@@ -9,7 +9,13 @@
 #include <memory>
 #include <vector>
 
-#include "xfa/fwl/basewidget/ifwl_edit.h"
+IFWL_Edit* CFWL_Edit::GetWidget() {
+  return static_cast<IFWL_Edit*>(m_pIface.get());
+}
+
+const IFWL_Edit* CFWL_Edit::GetWidget() const {
+  return static_cast<IFWL_Edit*>(m_pIface.get());
+}
 
 CFWL_Edit* CFWL_Edit::Create() {
   return new CFWL_Edit;
@@ -27,212 +33,210 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pEdit.release();
+  m_pIface = std::move(pEdit);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
 
 FWL_Error CFWL_Edit::SetText(const CFX_WideString& wsText) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->SetText(wsText);
+  return GetWidget()->SetText(wsText);
 }
 
 int32_t CFWL_Edit::GetTextLength() const {
-  if (!m_pIface)
+  if (!GetWidget())
     return 0;
-  return static_cast<IFWL_Edit*>(m_pIface)->GetTextLength();
+  return GetWidget()->GetTextLength();
 }
 
 FWL_Error CFWL_Edit::GetText(CFX_WideString& wsText,
                              int32_t nStart,
                              int32_t nCount) const {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->GetText(wsText, nStart, nCount);
+  return GetWidget()->GetText(wsText, nStart, nCount);
 }
 
 FWL_Error CFWL_Edit::ClearText() {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->ClearText();
+  return GetWidget()->ClearText();
 }
 
 int32_t CFWL_Edit::GetCaretPos() const {
-  if (!m_pIface)
+  if (!GetWidget())
     return -1;
-  return static_cast<IFWL_Edit*>(m_pIface)->GetCaretPos();
+  return GetWidget()->GetCaretPos();
 }
 
 int32_t CFWL_Edit::SetCaretPos(int32_t nIndex, FX_BOOL bBefore) {
-  if (!m_pIface)
+  if (!GetWidget())
     return -1;
-  return static_cast<IFWL_Edit*>(m_pIface)->SetCaretPos(nIndex, bBefore);
+  return GetWidget()->SetCaretPos(nIndex, bBefore);
 }
 
 int32_t CFWL_Edit::AddSelRange(int32_t nStart, int32_t nCount) {
-  if (!m_pIface)
+  if (!GetWidget())
     return -1;
-  static_cast<IFWL_Edit*>(m_pIface)->AddSelRange(nStart, nCount);
+  GetWidget()->AddSelRange(nStart, nCount);
   int32_t pos = 0;
-  int32_t sum = static_cast<IFWL_Edit*>(m_pIface)->GetTextLength();
+  int32_t sum = GetWidget()->GetTextLength();
   if (nCount == -1) {
     pos = sum;
   } else {
     pos = nStart + nCount;
   }
-  return static_cast<IFWL_Edit*>(m_pIface)->SetCaretPos(pos);
+  return GetWidget()->SetCaretPos(pos);
 }
 
 int32_t CFWL_Edit::CountSelRanges() {
-  if (!m_pIface)
+  if (!GetWidget())
     return 0;
-  return static_cast<IFWL_Edit*>(m_pIface)->CountSelRanges();
+  return GetWidget()->CountSelRanges();
 }
 
 int32_t CFWL_Edit::GetSelRange(int32_t nIndex, int32_t& nStart) {
-  if (!m_pIface)
+  if (!GetWidget())
     return 0;
-  return static_cast<IFWL_Edit*>(m_pIface)->GetSelRange(nIndex, nStart);
+  return GetWidget()->GetSelRange(nIndex, nStart);
 }
 
 FWL_Error CFWL_Edit::ClearSelections() {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->ClearSelections();
+  return GetWidget()->ClearSelections();
 }
 
 int32_t CFWL_Edit::GetLimit() {
-  if (!m_pIface)
+  if (!GetWidget())
     return -1;
-  return static_cast<IFWL_Edit*>(m_pIface)->GetLimit();
+  return GetWidget()->GetLimit();
 }
 
 FWL_Error CFWL_Edit::SetLimit(int32_t nLimit) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->SetLimit(nLimit);
+  return GetWidget()->SetLimit(nLimit);
 }
 
 FWL_Error CFWL_Edit::SetAliasChar(FX_WCHAR wAlias) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->SetAliasChar(wAlias);
+  return GetWidget()->SetAliasChar(wAlias);
 }
 
 FWL_Error CFWL_Edit::Insert(int32_t nStart,
                             const FX_WCHAR* lpText,
                             int32_t nLen) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->Insert(nStart, lpText, nLen);
+  return GetWidget()->Insert(nStart, lpText, nLen);
 }
 
 FWL_Error CFWL_Edit::DeleteSelections() {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->DeleteSelections();
+  return GetWidget()->DeleteSelections();
 }
 
 FWL_Error CFWL_Edit::DeleteRange(int32_t nStart, int32_t nCount) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->DeleteRange(nStart, nCount);
+  return GetWidget()->DeleteRange(nStart, nCount);
 }
 
 FWL_Error CFWL_Edit::Replace(int32_t nStart,
                              int32_t nLen,
                              const CFX_WideStringC& wsReplace) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->Replace(nStart, nLen, wsReplace);
+  return GetWidget()->Replace(nStart, nLen, wsReplace);
 }
 
 FWL_Error CFWL_Edit::DoClipboard(int32_t iCmd) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->DoClipboard(iCmd);
+  return GetWidget()->DoClipboard(iCmd);
 }
 
 FX_BOOL CFWL_Edit::Redo(const IFDE_TxtEdtDoRecord* pRecord) {
-  return m_pIface && static_cast<IFWL_Edit*>(m_pIface)->Redo(pRecord);
+  return GetWidget() && GetWidget()->Redo(pRecord);
 }
 
 FX_BOOL CFWL_Edit::Undo(const IFDE_TxtEdtDoRecord* pRecord) {
-  return m_pIface && static_cast<IFWL_Edit*>(m_pIface)->Undo(pRecord);
+  return GetWidget() && GetWidget()->Undo(pRecord);
 }
 
 FWL_Error CFWL_Edit::SetTabWidth(FX_FLOAT fTabWidth, FX_BOOL bEquidistant) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)
-      ->SetTabWidth(fTabWidth, bEquidistant);
+  return GetWidget()->SetTabWidth(fTabWidth, bEquidistant);
 }
 
 FWL_Error CFWL_Edit::SetNumberRange(int32_t iMin, int32_t iMax) {
   if (iMin > iMax) {
     return FWL_Error::ParameterInvalid;
   }
-  return static_cast<IFWL_Edit*>(m_pIface)->SetNumberRange(iMin, iMax);
+  return GetWidget()->SetNumberRange(iMin, iMax);
 }
 
 FWL_Error CFWL_Edit::SetBackColor(uint32_t dwColor) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->SetBackColor(dwColor);
+  return GetWidget()->SetBackColor(dwColor);
 }
 
 FWL_Error CFWL_Edit::SetFont(const CFX_WideString& wsFont, FX_FLOAT fSize) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_Edit*>(m_pIface)->SetFont(wsFont, fSize);
+  return GetWidget()->SetFont(wsFont, fSize);
 }
 
 FX_BOOL CFWL_Edit::CanUndo() {
-  return static_cast<IFWL_Edit*>(m_pIface)->CanUndo();
+  return GetWidget()->CanUndo();
 }
 
 FX_BOOL CFWL_Edit::CanRedo() {
-  return static_cast<IFWL_Edit*>(m_pIface)->CanRedo();
+  return GetWidget()->CanRedo();
 }
 
 FX_BOOL CFWL_Edit::Undo() {
-  return static_cast<IFWL_Edit*>(m_pIface)->Undo();
+  return GetWidget()->Undo();
 }
 
 FX_BOOL CFWL_Edit::Redo() {
-  return static_cast<IFWL_Edit*>(m_pIface)->Undo();
+  return GetWidget()->Undo();
 }
 
 FX_BOOL CFWL_Edit::Copy(CFX_WideString& wsCopy) {
-  return static_cast<IFWL_Edit*>(m_pIface)->Copy(wsCopy);
+  return GetWidget()->Copy(wsCopy);
 }
 
 FX_BOOL CFWL_Edit::Cut(CFX_WideString& wsCut) {
-  return static_cast<IFWL_Edit*>(m_pIface)->Cut(wsCut);
+  return GetWidget()->Cut(wsCut);
 }
 
 FX_BOOL CFWL_Edit::Paste(const CFX_WideString& wsPaste) {
-  return static_cast<IFWL_Edit*>(m_pIface)->Paste(wsPaste);
+  return GetWidget()->Paste(wsPaste);
 }
 
 FX_BOOL CFWL_Edit::Delete() {
-  return static_cast<IFWL_Edit*>(m_pIface)->Delete();
+  return GetWidget()->Delete();
 }
 
 void CFWL_Edit::SetScrollOffset(FX_FLOAT fScrollOffset) {
-  return static_cast<IFWL_Edit*>(m_pIface)->SetScrollOffset(fScrollOffset);
+  return GetWidget()->SetScrollOffset(fScrollOffset);
 }
 
 FX_BOOL CFWL_Edit::GetSuggestWords(CFX_PointF pointf,
                                    std::vector<CFX_ByteString>& sSuggest) {
-  return static_cast<IFWL_Edit*>(m_pIface)->GetSuggestWords(pointf, sSuggest);
+  return GetWidget()->GetSuggestWords(pointf, sSuggest);
 }
 
 FX_BOOL CFWL_Edit::ReplaceSpellCheckWord(CFX_PointF pointf,
                                          const CFX_ByteStringC& bsReplace) {
-  return static_cast<IFWL_Edit*>(m_pIface)
-      ->ReplaceSpellCheckWord(pointf, bsReplace);
+  return GetWidget()->ReplaceSpellCheckWord(pointf, bsReplace);
 }
 
 CFWL_Edit::CFWL_Edit() {}
diff --git a/xfa/fwl/lightwidget/cfwl_edit.h b/xfa/fwl/lightwidget/cfwl_edit.h
index a6db961..a9a466a 100644
--- a/xfa/fwl/lightwidget/cfwl_edit.h
+++ b/xfa/fwl/lightwidget/cfwl_edit.h
@@ -9,6 +9,7 @@
 
 #include <vector>
 
+#include "xfa/fwl/basewidget/ifwl_edit.h"
 #include "xfa/fwl/lightwidget/cfwl_widget.h"
 
 class CFWL_WidgetProperties;
@@ -19,6 +20,9 @@
   CFWL_Edit();
   ~CFWL_Edit() override;
 
+  IFWL_Edit* GetWidget() override;
+  const IFWL_Edit* GetWidget() const override;
+
   static CFWL_Edit* Create();
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
   FWL_Error SetText(const CFX_WideString& wsText);
diff --git a/xfa/fwl/lightwidget/cfwl_listbox.cpp b/xfa/fwl/lightwidget/cfwl_listbox.cpp
index e85e773..d5ea879 100644
--- a/xfa/fwl/lightwidget/cfwl_listbox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_listbox.cpp
@@ -10,6 +10,14 @@
 
 #include "third_party/base/stl_util.h"
 
+IFWL_ListBox* CFWL_ListBox::GetWidget() {
+  return static_cast<IFWL_ListBox*>(m_pIface.get());
+}
+
+const IFWL_ListBox* CFWL_ListBox::GetWidget() const {
+  return static_cast<IFWL_ListBox*>(m_pIface.get());
+}
+
 CFWL_ListBox* CFWL_ListBox::Create() {
   return new CFWL_ListBox;
 }
@@ -26,7 +34,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pListBox.release();
+  m_pIface = std::move(pListBox);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
@@ -52,7 +60,7 @@
       static_cast<size_t>(nIndex) >= m_ListBoxDP.m_ItemArray.size()) {
     return FALSE;
   }
-  int32_t iCount = m_ListBoxDP.CountItems(m_pIface);
+  int32_t iCount = m_ListBoxDP.CountItems(m_pIface.get());
   int32_t iSel = nIndex + 1;
   if (iSel >= iCount) {
     iSel = nIndex - 1;
@@ -62,7 +70,7 @@
   }
   if (iSel >= 0) {
     CFWL_ListItem* pSel =
-        static_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface, iSel));
+        static_cast<CFWL_ListItem*>(m_ListBoxDP.GetItem(m_pIface.get(), iSel));
     pSel->m_dwStates |= FWL_ITEMSTATE_LTB_Selected;
   }
   m_ListBoxDP.m_ItemArray.erase(m_ListBoxDP.m_ItemArray.begin() + nIndex);
@@ -74,40 +82,40 @@
 }
 
 int32_t CFWL_ListBox::CountSelItems() {
-  if (!m_pIface)
+  if (!GetWidget())
     return 0;
-  return static_cast<IFWL_ListBox*>(m_pIface)->CountSelItems();
+  return GetWidget()->CountSelItems();
 }
 
 IFWL_ListItem* CFWL_ListBox::GetSelItem(int32_t nIndexSel) {
-  if (!m_pIface)
+  if (!GetWidget())
     return nullptr;
-  return static_cast<IFWL_ListBox*>(m_pIface)->GetSelItem(nIndexSel);
+  return GetWidget()->GetSelItem(nIndexSel);
 }
 
 int32_t CFWL_ListBox::GetSelIndex(int32_t nIndex) {
-  if (!m_pIface)
+  if (!GetWidget())
     return 0;
-  return static_cast<IFWL_ListBox*>(m_pIface)->GetSelIndex(nIndex);
+  return GetWidget()->GetSelIndex(nIndex);
 }
 
 FWL_Error CFWL_ListBox::SetSelItem(IFWL_ListItem* pItem, FX_BOOL bSelect) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_ListBox*>(m_pIface)->SetSelItem(pItem, bSelect);
+  return GetWidget()->SetSelItem(pItem, bSelect);
 }
 
 FWL_Error CFWL_ListBox::GetItemText(IFWL_ListItem* pItem,
                                     CFX_WideString& wsText) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_ListBox*>(m_pIface)->GetItemText(pItem, wsText);
+  return GetWidget()->GetItemText(pItem, wsText);
 }
 
 FWL_Error CFWL_ListBox::GetScrollPos(FX_FLOAT& fPos, FX_BOOL bVert) {
-  if (!m_pIface)
+  if (!GetWidget())
     return FWL_Error::Indefinite;
-  return static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fPos, bVert);
+  return GetWidget()->GetScrollPos(fPos, bVert);
 }
 
 FWL_Error CFWL_ListBox::SetItemHeight(FX_FLOAT fItemHeight) {
@@ -169,13 +177,13 @@
 
 IFWL_ListItem* CFWL_ListBox::GetItemAtPoint(FX_FLOAT fx, FX_FLOAT fy) {
   CFX_RectF rtClient;
-  m_pIface->GetClientRect(rtClient);
+  GetWidget()->GetClientRect(rtClient);
   fx -= rtClient.left;
   fy -= rtClient.top;
   FX_FLOAT fPosX = 0;
   FX_FLOAT fPosY = 0;
-  static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fx);
-  static_cast<IFWL_ListBox*>(m_pIface)->GetScrollPos(fy, FALSE);
+  GetWidget()->GetScrollPos(fx);
+  GetWidget()->GetScrollPos(fy, FALSE);
   int32_t nCount = m_ListBoxDP.CountItems(nullptr);
   for (int32_t i = 0; i < nCount; i++) {
     IFWL_ListItem* pItem = m_ListBoxDP.GetItem(nullptr, i);
diff --git a/xfa/fwl/lightwidget/cfwl_listbox.h b/xfa/fwl/lightwidget/cfwl_listbox.h
index 725a724..f647ae8 100644
--- a/xfa/fwl/lightwidget/cfwl_listbox.h
+++ b/xfa/fwl/lightwidget/cfwl_listbox.h
@@ -22,6 +22,9 @@
   CFWL_ListBox();
   ~CFWL_ListBox() override;
 
+  IFWL_ListBox* GetWidget() override;
+  const IFWL_ListBox* GetWidget() const override;
+
   static CFWL_ListBox* Create();
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
   FWL_Error AddDIBitmap(CFX_DIBitmap* pDIB, IFWL_ListItem* pItem);
diff --git a/xfa/fwl/lightwidget/cfwl_picturebox.cpp b/xfa/fwl/lightwidget/cfwl_picturebox.cpp
index 33b11cd..8e0cc60 100644
--- a/xfa/fwl/lightwidget/cfwl_picturebox.cpp
+++ b/xfa/fwl/lightwidget/cfwl_picturebox.cpp
@@ -8,6 +8,14 @@
 
 #include <memory>
 
+IFWL_PictureBox* CFWL_PictureBox::GetWidget() {
+  return static_cast<IFWL_PictureBox*>(m_pIface.get());
+}
+
+const IFWL_PictureBox* CFWL_PictureBox::GetWidget() const {
+  return static_cast<IFWL_PictureBox*>(m_pIface.get());
+}
+
 CFWL_PictureBox* CFWL_PictureBox::Create() {
   return new CFWL_PictureBox;
 }
@@ -25,7 +33,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pPictureBox.release();
+  m_pIface = std::move(pPictureBox);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
@@ -49,7 +57,7 @@
 }
 
 int32_t CFWL_PictureBox::GetFlipMode() {
-  return m_PictureBoxDP.GetFlipMode(m_pIface);
+  return m_PictureBoxDP.GetFlipMode(m_pIface.get());
 }
 
 FWL_Error CFWL_PictureBox::SetFlipMode(int32_t iFlipMode) {
@@ -58,7 +66,7 @@
 }
 
 int32_t CFWL_PictureBox::GetOpacity() {
-  return m_PictureBoxDP.GetOpacity(m_pIface);
+  return m_PictureBoxDP.GetOpacity(m_pIface.get());
 }
 
 FWL_Error CFWL_PictureBox::SetOpacity(int32_t iOpacity) {
@@ -68,7 +76,7 @@
 
 FWL_Error CFWL_PictureBox::GetScale(FX_FLOAT& fScaleX, FX_FLOAT& fScaleY) {
   CFX_Matrix matrix;
-  m_PictureBoxDP.GetMatrix(m_pIface, matrix);
+  m_PictureBoxDP.GetMatrix(m_pIface.get(), matrix);
   matrix.Scale(fScaleX, fScaleY);
   return FWL_Error::Succeeded;
 }
@@ -81,7 +89,7 @@
 
 FWL_Error CFWL_PictureBox::GetOffset(FX_FLOAT& fx, FX_FLOAT& fy) {
   CFX_Matrix matrix;
-  m_PictureBoxDP.GetMatrix(m_pIface, matrix);
+  m_PictureBoxDP.GetMatrix(m_pIface.get(), matrix);
   fx = matrix.e;
   fy = matrix.f;
   return FWL_Error::Succeeded;
diff --git a/xfa/fwl/lightwidget/cfwl_picturebox.h b/xfa/fwl/lightwidget/cfwl_picturebox.h
index ffc67f4..612ff1d 100644
--- a/xfa/fwl/lightwidget/cfwl_picturebox.h
+++ b/xfa/fwl/lightwidget/cfwl_picturebox.h
@@ -16,6 +16,9 @@
   CFWL_PictureBox();
   ~CFWL_PictureBox() override;
 
+  IFWL_PictureBox* GetWidget() override;
+  const IFWL_PictureBox* GetWidget() const override;
+
   static CFWL_PictureBox* Create();
 
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
diff --git a/xfa/fwl/lightwidget/cfwl_pushbutton.cpp b/xfa/fwl/lightwidget/cfwl_pushbutton.cpp
index 7c8a9fa..b103169 100644
--- a/xfa/fwl/lightwidget/cfwl_pushbutton.cpp
+++ b/xfa/fwl/lightwidget/cfwl_pushbutton.cpp
@@ -8,6 +8,14 @@
 
 #include <memory>
 
+IFWL_PushButton* CFWL_PushButton::GetWidget() {
+  return static_cast<IFWL_PushButton*>(m_pIface.get());
+}
+
+const IFWL_PushButton* CFWL_PushButton::GetWidget() const {
+  return static_cast<IFWL_PushButton*>(m_pIface.get());
+}
+
 CFWL_PushButton* CFWL_PushButton::Create() {
   return new CFWL_PushButton;
 }
@@ -25,7 +33,7 @@
   if (ret != FWL_Error::Succeeded) {
     return ret;
   }
-  m_pIface = pPushButton.release();
+  m_pIface = std::move(pPushButton);
   CFWL_Widget::Initialize();
   return FWL_Error::Succeeded;
 }
diff --git a/xfa/fwl/lightwidget/cfwl_pushbutton.h b/xfa/fwl/lightwidget/cfwl_pushbutton.h
index c2b7168..ce26a54 100644
--- a/xfa/fwl/lightwidget/cfwl_pushbutton.h
+++ b/xfa/fwl/lightwidget/cfwl_pushbutton.h
@@ -15,6 +15,9 @@
   CFWL_PushButton();
   ~CFWL_PushButton() override;
 
+  IFWL_PushButton* GetWidget() override;
+  const IFWL_PushButton* GetWidget() const override;
+
   static CFWL_PushButton* Create();
 
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
diff --git a/xfa/fwl/lightwidget/cfwl_widget.cpp b/xfa/fwl/lightwidget/cfwl_widget.cpp
index 8022f0a..3a5478a 100644
--- a/xfa/fwl/lightwidget/cfwl_widget.cpp
+++ b/xfa/fwl/lightwidget/cfwl_widget.cpp
@@ -20,7 +20,11 @@
 #define FWL_WGT_CalcMultiLineDefWidth 120.0f
 
 IFWL_Widget* CFWL_Widget::GetWidget() {
-  return m_pIface;
+  return m_pIface.get();
+}
+
+const IFWL_Widget* CFWL_Widget::GetWidget() const {
+  return m_pIface.get();
 }
 
 FWL_Error CFWL_Widget::GetClassName(CFX_WideString& wsClass) const {
@@ -208,18 +212,15 @@
 }
 
 CFWL_Widget::CFWL_Widget()
-    : m_pIface(nullptr), m_pDelegate(nullptr), m_pProperties(nullptr) {
-  m_pProperties = new CFWL_WidgetProperties;
-  m_pWidgetMgr = CFWL_WidgetMgr::GetInstance();
+    : m_pDelegate(nullptr),
+      m_pWidgetMgr(CFWL_WidgetMgr::GetInstance()),
+      m_pProperties(new CFWL_WidgetProperties) {
   ASSERT(m_pWidgetMgr);
 }
 
 CFWL_Widget::~CFWL_Widget() {
-  delete m_pProperties;
-  if (m_pIface) {
+  if (m_pIface)
     m_pIface->Finalize();
-    delete m_pIface;
-  }
 }
 
 FWL_Error CFWL_Widget::Repaint(const CFX_RectF* pRect) {
@@ -233,7 +234,7 @@
     m_pIface->GetWidgetRect(rect);
     rect.left = rect.top = 0;
   }
-  return m_pWidgetMgr->RepaintWidget(m_pIface, &rect);
+  return m_pWidgetMgr->RepaintWidget(m_pIface.get(), &rect);
 }
 
 FWL_Error CFWL_Widget::SetFocus(FX_BOOL bFocus) {
@@ -249,9 +250,9 @@
     return FWL_Error::Indefinite;
 
   if (bFocus) {
-    pDriver->SetFocus(m_pIface);
+    pDriver->SetFocus(m_pIface.get());
   } else {
-    if (pDriver->GetFocus() == m_pIface) {
+    if (pDriver->GetFocus() == m_pIface.get()) {
       pDriver->SetFocus(nullptr);
     }
   }
@@ -270,7 +271,7 @@
   if (!pDriver)
     return FWL_Error::Indefinite;
 
-  pDriver->SetGrab(m_pIface, bSet);
+  pDriver->SetGrab(m_pIface.get(), bSet);
   return FWL_Error::Succeeded;
 }
 
@@ -320,7 +321,7 @@
     return CFX_SizeF();
 
   CFWL_ThemeText calPart;
-  calPart.m_pWidget = m_pIface;
+  calPart.m_pWidget = m_pIface.get();
   calPart.m_wsText = wsText;
   calPart.m_dwTTOStyles =
       bMultiLine ? FDE_TTOSTYLE_LineWrap : FDE_TTOSTYLE_SingleLine;
diff --git a/xfa/fwl/lightwidget/cfwl_widget.h b/xfa/fwl/lightwidget/cfwl_widget.h
index 2c180ba..80e278e 100644
--- a/xfa/fwl/lightwidget/cfwl_widget.h
+++ b/xfa/fwl/lightwidget/cfwl_widget.h
@@ -7,6 +7,8 @@
 #ifndef XFA_FWL_LIGHTWIDGET_CFWL_WIDGET_H_
 #define XFA_FWL_LIGHTWIDGET_CFWL_WIDGET_H_
 
+#include <memory>
+
 #include "xfa/fwl/core/cfwl_event.h"
 #include "xfa/fwl/lightwidget/cfwl_widgetproperties.h"
 #include "xfa/fwl/core/ifwl_widget.h"
@@ -21,7 +23,9 @@
  public:
   virtual ~CFWL_Widget();
 
-  IFWL_Widget* GetWidget();
+  virtual IFWL_Widget* GetWidget();
+  virtual const IFWL_Widget* GetWidget() const;
+
   FWL_Error GetClassName(CFX_WideString& wsClass) const;
   FWL_Type GetClassID() const;
   virtual FX_BOOL IsInstance(const CFX_WideStringC& wsClass) const;
@@ -70,13 +74,14 @@
   CFX_SizeF CalcTextSize(const CFX_WideString& wsText,
                          FX_BOOL bMultiLine = FALSE,
                          int32_t iLineWidth = -1);
-  IFWL_Widget* m_pIface;
-  IFWL_WidgetDelegate* m_pDelegate;
-  CFWL_WidgetMgr* m_pWidgetMgr;
-  CFWL_WidgetProperties* m_pProperties;
 
  protected:
   FWL_Error Initialize(const CFWL_WidgetProperties* pProperties = nullptr);
+
+  std::unique_ptr<IFWL_Widget> m_pIface;
+  IFWL_WidgetDelegate* m_pDelegate;
+  CFWL_WidgetMgr* const m_pWidgetMgr;
+  std::unique_ptr<CFWL_WidgetProperties> m_pProperties;
 };
 
 #endif  // XFA_FWL_LIGHTWIDGET_CFWL_WIDGET_H_
diff --git a/xfa/fxfa/app/xfa_ffcheckbutton.cpp b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
index 253cbd0..5b651b6 100644
--- a/xfa/fxfa/app/xfa_ffcheckbutton.cpp
+++ b/xfa/fxfa/app/xfa_ffcheckbutton.cpp
@@ -248,7 +248,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
diff --git a/xfa/fxfa/app/xfa_fffield.cpp b/xfa/fxfa/app/xfa_fffield.cpp
index 66520b2..3274477 100644
--- a/xfa/fxfa/app/xfa_fffield.cpp
+++ b/xfa/fxfa/app/xfa_fffield.cpp
@@ -110,7 +110,7 @@
 }
 void CXFA_FFField::SetFWLThemeProvider() {
   if (m_pNormalWidget) {
-    m_pNormalWidget->m_pIface->SetThemeProvider(GetApp()->GetFWLTheme());
+    m_pNormalWidget->GetWidget()->SetThemeProvider(GetApp()->GetFWLTheme());
   }
 }
 FX_BOOL CXFA_FFField::IsLoaded() {
@@ -349,7 +349,7 @@
   }
   CFWL_MsgMouse ms;
   ms.m_dwCmd = FWL_MouseCommand::Enter;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   return TRUE;
@@ -360,7 +360,7 @@
   }
   CFWL_MsgMouse ms;
   ms.m_dwCmd = FWL_MouseCommand::Leave;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -393,7 +393,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -411,7 +411,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -427,7 +427,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -441,7 +441,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -459,7 +459,7 @@
   FWLToClient(ms.m_fx, ms.m_fy);
   ms.m_fDeltaX = zDelta;
   ms.m_fDeltaY = 0;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -483,7 +483,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -501,7 +501,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -517,7 +517,7 @@
   ms.m_fx = fx;
   ms.m_fy = fy;
   FWLToClient(ms.m_fx, ms.m_fy);
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   TranslateFWLMessage(&ms);
   return TRUE;
 }
@@ -528,7 +528,7 @@
     return FALSE;
   }
   CFWL_MsgSetFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   m_dwStatus |= XFA_WidgetStatus_Focused;
@@ -540,7 +540,7 @@
     return CXFA_FFWidget::OnKillFocus(pNewWidget);
   }
   CFWL_MsgKillFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   m_dwStatus &= ~XFA_WidgetStatus_Focused;
@@ -556,7 +556,7 @@
   ms.m_dwCmd = FWL_KeyCommand::KeyDown;
   ms.m_dwFlags = dwFlags;
   ms.m_dwKeyCode = dwKeyCode;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   return TRUE;
@@ -569,7 +569,7 @@
   ms.m_dwCmd = FWL_KeyCommand::KeyUp;
   ms.m_dwFlags = dwFlags;
   ms.m_dwKeyCode = dwKeyCode;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   return TRUE;
@@ -591,7 +591,7 @@
   ms.m_dwCmd = FWL_KeyCommand::Char;
   ms.m_dwFlags = dwFlags;
   ms.m_dwKeyCode = dwChar;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   return TRUE;
diff --git a/xfa/fxfa/app/xfa_ffimageedit.cpp b/xfa/fxfa/app/xfa_ffimageedit.cpp
index 85e464d..77de970 100644
--- a/xfa/fxfa/app/xfa_ffimageedit.cpp
+++ b/xfa/fxfa/app/xfa_ffimageedit.cpp
@@ -97,7 +97,7 @@
   ms.m_dwFlags = dwFlags;
   ms.m_fx = fx;
   ms.m_fy = fy;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   FWLToClient(ms.m_fx, ms.m_fy);
   TranslateFWLMessage(&ms);
   return TRUE;
diff --git a/xfa/fxfa/app/xfa_fftextedit.cpp b/xfa/fxfa/app/xfa_fftextedit.cpp
index 398cf87..6df4507 100644
--- a/xfa/fxfa/app/xfa_fftextedit.cpp
+++ b/xfa/fxfa/app/xfa_fftextedit.cpp
@@ -111,7 +111,7 @@
   ms.m_dwFlags = dwFlags;
   ms.m_fx = fx;
   ms.m_fy = fy;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   FWLToClient(ms.m_fx, ms.m_fy);
   TranslateFWLMessage(&ms);
   return TRUE;
@@ -158,14 +158,14 @@
   }
   CXFA_FFWidget::OnSetFocus(pOldWidget);
   CFWL_MsgSetFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   return TRUE;
 }
 FX_BOOL CXFA_FFTextEdit::OnKillFocus(CXFA_FFWidget* pNewWidget) {
   CFWL_MsgKillFocus ms;
-  ms.m_pDstTarget = m_pNormalWidget->m_pIface;
+  ms.m_pDstTarget = m_pNormalWidget->GetWidget();
   ms.m_pSrcTarget = nullptr;
   TranslateFWLMessage(&ms);
   m_dwStatus &= ~XFA_WidgetStatus_Focused;