diff --git a/xfa/fxfa/app/xfa_ffapp.cpp b/xfa/fxfa/app/xfa_ffapp.cpp
index f2a6ad5..5f2f1b9 100644
--- a/xfa/fxfa/app/xfa_ffapp.cpp
+++ b/xfa/fxfa/app/xfa_ffapp.cpp
@@ -25,6 +25,9 @@
     acc.LoadAllData(streams[i]);
   }
 }
+
+CXFA_FileRead::~CXFA_FileRead() {}
+
 FX_FILESIZE CXFA_FileRead::GetSize() {
   uint32_t dwSize = 0;
   int32_t iCount = m_Data.GetSize();
@@ -64,6 +67,10 @@
   return FALSE;
 }
 
+void CXFA_FileRead::Release() {
+  delete this;
+}
+
 CXFA_FFApp::CXFA_FFApp(IXFA_AppProvider* pProvider)
     : m_pDocHandler(nullptr),
       m_pFWLTheme(nullptr),
diff --git a/xfa/fxfa/app/xfa_ffbarcode.h b/xfa/fxfa/app/xfa_ffbarcode.h
index ffa7037..5a412a6 100644
--- a/xfa/fxfa/app/xfa_ffbarcode.h
+++ b/xfa/fxfa/app/xfa_ffbarcode.h
@@ -14,15 +14,17 @@
 class CXFA_FFBarcode : public CXFA_FFTextEdit {
  public:
   CXFA_FFBarcode(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFBarcode();
-  virtual FX_BOOL LoadWidget();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  ~CXFA_FFBarcode() override;
+
+  // CXFA_FFTextEdit
+  FX_BOOL LoadWidget() override;
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  void UpdateWidgetProperty() override;
+  FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
 };
 
 enum XFA_BARCODETYPEENUM {
diff --git a/xfa/fxfa/app/xfa_ffcheckbutton.h b/xfa/fxfa/app/xfa_ffcheckbutton.h
index c3323b4..fc219f9 100644
--- a/xfa/fxfa/app/xfa_ffcheckbutton.h
+++ b/xfa/fxfa/app/xfa_ffcheckbutton.h
@@ -13,26 +13,30 @@
 class CXFA_FFCheckButton : public CXFA_FFField {
  public:
   CXFA_FFCheckButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFCheckButton();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
+  ~CXFA_FFCheckButton() override;
 
-  virtual FX_BOOL LoadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual FX_BOOL UpdateFWLData();
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  // CXFA_FFField
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+
+  FX_BOOL LoadWidget() override;
+  FX_BOOL PerformLayout() override;
+  FX_BOOL UpdateFWLData() override;
+  void UpdateWidgetProperty() override;
+  FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = NULL) override;
+
   void SetFWLCheckState(XFA_CHECKSTATE eCheckState);
-  virtual void OnProcessMessage(CFWL_Message* pMessage);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
-  virtual void OnDrawWidget(CFX_Graphics* pGraphics,
-                            const CFX_Matrix* pMatrix = NULL);
 
  protected:
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL IsDataChanged();
+  FX_BOOL CommitData() override;
+  FX_BOOL IsDataChanged() override;
+
   void CapLeftRightPlacement(CXFA_Margin mgCap);
   void AddUIMargin(int32_t iCapPlacement);
   XFA_CHECKSTATE FWLState2XFAState();
diff --git a/xfa/fxfa/app/xfa_ffchoicelist.h b/xfa/fxfa/app/xfa_ffchoicelist.h
index c59ca64..8f87190 100644
--- a/xfa/fxfa/app/xfa_ffchoicelist.h
+++ b/xfa/fxfa/app/xfa_ffchoicelist.h
@@ -13,68 +13,68 @@
 class CXFA_FFListBox : public CXFA_FFField {
  public:
   CXFA_FFListBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFListBox();
-  virtual FX_BOOL LoadWidget();
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
+  ~CXFA_FFListBox() override;
 
- protected:
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL IsDataChanged();
-  uint32_t GetAlignment();
+  // CXFA_FFField
+  FX_BOOL LoadWidget() override;
+  FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = NULL) override;
 
- public:
   void OnSelectChanged(IFWL_Widget* pWidget, const CFX_Int32Array& arrSels);
   void SetItemState(int32_t nIndex, FX_BOOL bSelected);
   void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
   void DeleteItem(int32_t nIndex);
-  virtual void OnProcessMessage(CFWL_Message* pMessage);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
-  virtual void OnDrawWidget(CFX_Graphics* pGraphics,
-                            const CFX_Matrix* pMatrix = NULL);
 
  protected:
+  FX_BOOL CommitData() override;
+  FX_BOOL UpdateFWLData() override;
+  FX_BOOL IsDataChanged() override;
+
+  uint32_t GetAlignment();
+
   IFWL_WidgetDelegate* m_pOldDelegate;
 };
+
 class CXFA_FFComboBox : public CXFA_FFField {
  public:
   CXFA_FFComboBox(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFComboBox();
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          uint32_t dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
-  virtual FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
-  virtual FX_BOOL CanUndo();
-  virtual FX_BOOL CanRedo();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
+  ~CXFA_FFComboBox() override;
 
-  virtual FX_BOOL CanCopy();
-  virtual FX_BOOL CanCut();
-  virtual FX_BOOL CanPaste();
-  virtual FX_BOOL CanSelectAll();
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
-  virtual FX_BOOL Cut(CFX_WideString& wsCut);
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL SelectAll();
-  virtual FX_BOOL Delete();
-  virtual FX_BOOL DeSelect();
-  void OpenDropDownList();
+  // CXFA_FFField
+  FX_BOOL GetBBox(CFX_RectF& rtBox,
+                  uint32_t dwStatus,
+                  FX_BOOL bDrawFocus = FALSE) override;
+  FX_BOOL LoadWidget() override;
+  void UpdateWidgetProperty() override;
+  FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget) override;
+  FX_BOOL CanUndo() override;
+  FX_BOOL CanRedo() override;
+  FX_BOOL Undo() override;
+  FX_BOOL Redo() override;
 
- protected:
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL IsDataChanged();
-  uint32_t GetAlignment();
-  void FWLEventSelChange(CXFA_EventParam* pParam);
+  FX_BOOL CanCopy() override;
+  FX_BOOL CanCut() override;
+  FX_BOOL CanPaste() override;
+  FX_BOOL CanSelectAll() override;
+  FX_BOOL Copy(CFX_WideString& wsCopy) override;
+  FX_BOOL Cut(CFX_WideString& wsCut) override;
+  FX_BOOL Paste(const CFX_WideString& wsPaste) override;
+  FX_BOOL SelectAll() override;
+  FX_BOOL Delete() override;
+  FX_BOOL DeSelect() override;
 
-  CFX_WideString m_wsNewValue;
+  // IFWL_WidgetDelegate
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = NULL) override;
 
- public:
+  virtual void OpenDropDownList();
+
   void OnTextChanged(IFWL_Widget* pWidget, const CFX_WideString& wsChanged);
   void OnSelectChanged(IFWL_Widget* pWidget,
                        const CFX_Int32Array& arrSels,
@@ -84,12 +84,18 @@
   void SetItemState(int32_t nIndex, FX_BOOL bSelected);
   void InsertItem(const CFX_WideStringC& wsLabel, int32_t nIndex = -1);
   void DeleteItem(int32_t nIndex);
-  virtual void OnProcessMessage(CFWL_Message* pMessage);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
-  virtual void OnDrawWidget(CFX_Graphics* pGraphics,
-                            const CFX_Matrix* pMatrix = NULL);
 
  protected:
+  // CXFA_FFField
+  FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL CommitData() override;
+  FX_BOOL UpdateFWLData() override;
+  FX_BOOL IsDataChanged() override;
+
+  uint32_t GetAlignment();
+  void FWLEventSelChange(CXFA_EventParam* pParam);
+
+  CFX_WideString m_wsNewValue;
   IFWL_WidgetDelegate* m_pOldDelegate;
 };
 
diff --git a/xfa/fxfa/app/xfa_ffdraw.h b/xfa/fxfa/app/xfa_ffdraw.h
index c3c1c14..ee66871 100644
--- a/xfa/fxfa/app/xfa_ffdraw.h
+++ b/xfa/fxfa/app/xfa_ffdraw.h
@@ -13,7 +13,7 @@
 class CXFA_FFDraw : public CXFA_FFWidget {
  public:
   CXFA_FFDraw(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFDraw();
+  ~CXFA_FFDraw() override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFDRAW_H_
diff --git a/xfa/fxfa/app/xfa_ffexclgroup.h b/xfa/fxfa/app/xfa_ffexclgroup.h
index 6b59f05..52a8e56 100644
--- a/xfa/fxfa/app/xfa_ffexclgroup.h
+++ b/xfa/fxfa/app/xfa_ffexclgroup.h
@@ -13,12 +13,13 @@
 class CXFA_FFExclGroup : public CXFA_FFWidget {
  public:
   CXFA_FFExclGroup(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFExclGroup();
+  ~CXFA_FFExclGroup() override;
 
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
+  // CXFA_FFWidget
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFEXCLGROUP_H_
diff --git a/xfa/fxfa/app/xfa_fffield.h b/xfa/fxfa/app/xfa_fffield.h
index fd6661d..3aa3587 100644
--- a/xfa/fxfa/app/xfa_fffield.h
+++ b/xfa/fxfa/app/xfa_fffield.h
@@ -18,45 +18,54 @@
 class CXFA_FFField : public CXFA_FFWidget, public IFWL_WidgetDelegate {
  public:
   CXFA_FFField(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFField();
+  ~CXFA_FFField() override;
 
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          uint32_t dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual void UpdateFWL();
+  // CXFA_FFWidget
+  FX_BOOL GetBBox(CFX_RectF& rtBox,
+                  uint32_t dwStatus,
+                  FX_BOOL bDrawFocus = FALSE) override;
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  FX_BOOL IsLoaded() override;
+  FX_BOOL LoadWidget() override;
+  void UnloadWidget() override;
+  FX_BOOL PerformLayout() override;
+  FX_BOOL OnMouseEnter() override;
+  FX_BOOL OnMouseExit() override;
+  FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnLButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnMouseWheel(uint32_t dwFlags,
+                       int16_t zDelta,
+                       FX_FLOAT fx,
+                       FX_FLOAT fy) override;
+  FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+
+  FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget) override;
+  FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget) override;
+  FX_BOOL OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) override;
+  FX_BOOL OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags) override;
+  FX_BOOL OnChar(uint32_t dwChar, uint32_t dwFlags) override;
+  FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) override;
+
+  // IFWL_WidgetDelegate
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = NULL) override;
+
+  void UpdateFWL();
   uint32_t UpdateUIProperty();
-  virtual FX_BOOL OnMouseEnter();
-  virtual FX_BOOL OnMouseExit();
-  virtual FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseWheel(uint32_t dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-
-  virtual FX_BOOL OnSetFocus(CXFA_FFWidget* pOldWidget);
-  virtual FX_BOOL OnKillFocus(CXFA_FFWidget* pNewWidget);
-  virtual FX_BOOL OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags);
-  virtual FX_BOOL OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags);
-  virtual FX_BOOL OnChar(uint32_t dwChar, uint32_t dwFlags);
-  virtual FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
 
  protected:
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
+  FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) override;
+
   virtual void SetFWLRect();
   void SetFWLThemeProvider();
   CFWL_Widget* GetNormalWidget() { return m_pNormalWidget; }
@@ -84,13 +93,6 @@
                              int32_t iCapPlacement);
   void SetEditScrollOffset();
 
- public:
-  virtual void OnProcessMessage(CFWL_Message* pMessage);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
-  virtual void OnDrawWidget(CFX_Graphics* pGraphics,
-                            const CFX_Matrix* pMatrix = NULL);
-
- protected:
   CFWL_Widget* m_pNormalWidget;
   CFX_RectF m_rtUI;
   CFX_RectF m_rtCaption;
diff --git a/xfa/fxfa/app/xfa_ffimage.h b/xfa/fxfa/app/xfa_ffimage.h
index 7bbeafc..8771bde 100644
--- a/xfa/fxfa/app/xfa_ffimage.h
+++ b/xfa/fxfa/app/xfa_ffimage.h
@@ -12,14 +12,16 @@
 class CXFA_FFImage : public CXFA_FFDraw {
  public:
   CXFA_FFImage(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFImage();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
+  ~CXFA_FFImage() override;
+
+  // CXFA_FFWidget
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  FX_BOOL IsLoaded() override;
+  FX_BOOL LoadWidget() override;
+  void UnloadWidget() override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFIMAGE_H_
diff --git a/xfa/fxfa/app/xfa_ffimageedit.h b/xfa/fxfa/app/xfa_ffimageedit.h
index fb3e21e..5749d52 100644
--- a/xfa/fxfa/app/xfa_ffimageedit.h
+++ b/xfa/fxfa/app/xfa_ffimageedit.h
@@ -12,24 +12,26 @@
 class CXFA_FFImageEdit : public CXFA_FFField {
  public:
   CXFA_FFImageEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFImageEdit();
+  ~CXFA_FFImageEdit() override;
 
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual void OnProcessMessage(CFWL_Message* pMessage);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
-  virtual void OnDrawWidget(CFX_Graphics* pGraphics,
-                            const CFX_Matrix* pMatrix = NULL);
+  // CXFA_FFField
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  FX_BOOL LoadWidget() override;
+  void UnloadWidget() override;
+  FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = NULL) override;
 
  protected:
-  virtual void SetFWLRect();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL CommitData();
+  void SetFWLRect() override;
+  FX_BOOL UpdateFWLData() override;
+  FX_BOOL CommitData() override;
+
   IFWL_WidgetDelegate* m_pOldDelegate;
 };
 
diff --git a/xfa/fxfa/app/xfa_ffpageview.cpp b/xfa/fxfa/app/xfa_ffpageview.cpp
index ce30d19..aef7a30 100644
--- a/xfa/fxfa/app/xfa_ffpageview.cpp
+++ b/xfa/fxfa/app/xfa_ffpageview.cpp
@@ -432,3 +432,7 @@
   }
   return NULL;
 }
+
+CXFA_TabParam::CXFA_TabParam() : m_pWidget(NULL) {}
+
+CXFA_TabParam::~CXFA_TabParam() {}
diff --git a/xfa/fxfa/app/xfa_ffpath.h b/xfa/fxfa/app/xfa_ffpath.h
index 8152810..a56843d 100644
--- a/xfa/fxfa/app/xfa_ffpath.h
+++ b/xfa/fxfa/app/xfa_ffpath.h
@@ -12,11 +12,13 @@
 class CXFA_FFLine : public CXFA_FFDraw {
  public:
   CXFA_FFLine(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFLine();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
+  ~CXFA_FFLine() override;
+
+  // CXFA_FFWidget
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
 
  private:
   void GetRectFromHand(CFX_RectF& rect, int32_t iHand, FX_FLOAT fLineWidth);
@@ -24,20 +26,25 @@
 class CXFA_FFArc : public CXFA_FFDraw {
  public:
   CXFA_FFArc(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFArc();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
+  ~CXFA_FFArc() override;
+
+  // CXFA_FFWidget
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
 };
+
 class CXFA_FFRectangle : public CXFA_FFDraw {
  public:
   CXFA_FFRectangle(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFRectangle();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
+  ~CXFA_FFRectangle() override;
+
+  // CXFA_FFWidget
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFPATH_H_
diff --git a/xfa/fxfa/app/xfa_ffpushbutton.h b/xfa/fxfa/app/xfa_ffpushbutton.h
index 96cf785..3bd37df 100644
--- a/xfa/fxfa/app/xfa_ffpushbutton.h
+++ b/xfa/fxfa/app/xfa_ffpushbutton.h
@@ -19,19 +19,21 @@
 class CXFA_FFPushButton : public CXFA_FFField {
  public:
   CXFA_FFPushButton(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFPushButton();
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL LoadWidget();
-  virtual void UnloadWidget();
-  virtual FX_BOOL PerformLayout();
-  virtual void UpdateWidgetProperty();
-  virtual void OnProcessMessage(CFWL_Message* pMessage);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
-  virtual void OnDrawWidget(CFX_Graphics* pGraphics,
-                            const CFX_Matrix* pMatrix = NULL);
+  ~CXFA_FFPushButton() override;
+
+  // CXFA_FFField
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  FX_BOOL LoadWidget() override;
+  void UnloadWidget() override;
+  FX_BOOL PerformLayout() override;
+  void UpdateWidgetProperty() override;
+  void OnProcessMessage(CFWL_Message* pMessage) override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
+  void OnDrawWidget(CFX_Graphics* pGraphics,
+                    const CFX_Matrix* pMatrix = NULL) override;
 
  protected:
   void LoadHighlightCaption();
@@ -40,6 +42,7 @@
   FX_FLOAT GetLineWidth();
   FX_ARGB GetLineColor();
   FX_ARGB GetFillColor();
+
   CXFA_TextLayout* m_pRolloverTextLayout;
   CXFA_TextLayout* m_pDownTextLayout;
   CXFA_TextProvider* m_pDownProvider;
diff --git a/xfa/fxfa/app/xfa_ffsignature.h b/xfa/fxfa/app/xfa_ffsignature.h
index 01ece76..7291b42 100644
--- a/xfa/fxfa/app/xfa_ffsignature.h
+++ b/xfa/fxfa/app/xfa_ffsignature.h
@@ -12,32 +12,33 @@
 class CXFA_FFSignature final : public CXFA_FFField {
  public:
   CXFA_FFSignature(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFSignature();
+  ~CXFA_FFSignature() override;
 
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL LoadWidget();
-  virtual FX_BOOL OnMouseEnter();
-  virtual FX_BOOL OnMouseExit();
-  virtual FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseWheel(uint32_t dwFlags,
-                               int16_t zDelta,
-                               FX_FLOAT fx,
-                               FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnRButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
+  // CXFA_FFField
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  FX_BOOL LoadWidget() override;
+  FX_BOOL OnMouseEnter() override;
+  FX_BOOL OnMouseExit() override;
+  FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnLButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnMouseWheel(uint32_t dwFlags,
+                       int16_t zDelta,
+                       FX_FLOAT fx,
+                       FX_FLOAT fy) override;
+  FX_BOOL OnRButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnRButtonDblClk(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
 
-  virtual FX_BOOL OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags);
-  virtual FX_BOOL OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags);
-  virtual FX_BOOL OnChar(uint32_t dwChar, uint32_t dwFlags);
-  virtual FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
+  FX_BOOL OnKeyDown(uint32_t dwKeyCode, uint32_t dwFlags) override;
+  FX_BOOL OnKeyUp(uint32_t dwKeyCode, uint32_t dwFlags) override;
+  FX_BOOL OnChar(uint32_t dwChar, uint32_t dwFlags) override;
+  FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFSIGNATURE_H_
diff --git a/xfa/fxfa/app/xfa_ffsubform.h b/xfa/fxfa/app/xfa_ffsubform.h
index fd3da98..6607edf 100644
--- a/xfa/fxfa/app/xfa_ffsubform.h
+++ b/xfa/fxfa/app/xfa_ffsubform.h
@@ -13,7 +13,7 @@
 class CXFA_FFSubForm : public CXFA_FFWidget {
  public:
   CXFA_FFSubForm(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFSubForm();
+  ~CXFA_FFSubForm() override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFSUBFORM_H_
diff --git a/xfa/fxfa/app/xfa_fftext.h b/xfa/fxfa/app/xfa_fftext.h
index f505ddb..f48840f 100644
--- a/xfa/fxfa/app/xfa_fftext.h
+++ b/xfa/fxfa/app/xfa_fftext.h
@@ -12,20 +12,22 @@
 class CXFA_FFText : public CXFA_FFDraw {
  public:
   CXFA_FFText(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFText();
-  virtual FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy);
-  virtual FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
-  virtual void RenderWidget(CFX_Graphics* pGS,
-                            CFX_Matrix* pMatrix = NULL,
-                            uint32_t dwStatus = 0,
-                            int32_t iRotate = 0);
-  virtual FX_BOOL IsLoaded();
-  virtual FX_BOOL PerformLayout();
+  ~CXFA_FFText() override;
+
+  // CXFA_FFWidget
+  FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnLButtonUp(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL OnMouseMove(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
+  FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy) override;
+  void RenderWidget(CFX_Graphics* pGS,
+                    CFX_Matrix* pMatrix = NULL,
+                    uint32_t dwStatus = 0,
+                    int32_t iRotate = 0) override;
+  FX_BOOL IsLoaded() override;
+  FX_BOOL PerformLayout() override;
 
  private:
-  virtual const FX_WCHAR* GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy);
+  const FX_WCHAR* GetLinkURLAtPoint(FX_FLOAT fx, FX_FLOAT fy);
   void FWLToClient(FX_FLOAT& fx, FX_FLOAT& fy);
 };
 
diff --git a/xfa/fxfa/app/xfa_fftextedit.cpp b/xfa/fxfa/app/xfa_fftextedit.cpp
index 171fe8d..fd2abe7 100644
--- a/xfa/fxfa/app/xfa_fftextedit.cpp
+++ b/xfa/fxfa/app/xfa_fftextedit.cpp
@@ -8,7 +8,6 @@
 
 #include <vector>
 
-#include "xfa/fwl/basewidget/ifwl_datetimepicker.h"
 #include "xfa/fwl/basewidget/ifwl_edit.h"
 #include "xfa/fwl/core/cfwl_message.h"
 #include "xfa/fwl/core/fwl_noteimp.h"
diff --git a/xfa/fxfa/app/xfa_fftextedit.h b/xfa/fxfa/app/xfa_fftextedit.h
index 9b73577..d7c6667 100644
--- a/xfa/fxfa/app/xfa_fftextedit.h
+++ b/xfa/fxfa/app/xfa_fftextedit.h
@@ -16,7 +16,7 @@
   CXFA_FFTextEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
   ~CXFA_FFTextEdit() override;
 
-  // CXFA_FFField:
+  // CXFA_FFField
   FX_BOOL LoadWidget() override;
   void UpdateWidgetProperty() override;
   FX_BOOL OnLButtonDown(uint32_t dwFlags, FX_FLOAT fx, FX_FLOAT fy) override;
@@ -42,8 +42,6 @@
                           std::vector<CFX_ByteString>& sSuggest) override;
   FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
                                 const CFX_ByteStringC& bsReplace) override;
-
-  // IFWL_WidgetDelegate:
   void OnProcessMessage(CFWL_Message* pMessage) override;
   void OnProcessEvent(CFWL_Event* pEvent) override;
   void OnDrawWidget(CFX_Graphics* pGraphics,
@@ -58,10 +56,11 @@
                           std::vector<CFX_ByteString>& sSuggest);
 
  protected:
-  uint32_t GetAlignment();
   FX_BOOL CommitData() override;
   FX_BOOL UpdateFWLData() override;
   FX_BOOL IsDataChanged() override;
+
+  uint32_t GetAlignment();
   void ValidateNumberField(const CFX_WideString& wsText);
 
   IFWL_WidgetDelegate* m_pOldDelegate;
@@ -70,69 +69,75 @@
 class CXFA_FFNumericEdit : public CXFA_FFTextEdit {
  public:
   CXFA_FFNumericEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFNumericEdit();
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
+  ~CXFA_FFNumericEdit() override;
+
+  // CXFA_FFTextEdit
+  FX_BOOL LoadWidget() override;
+  void UpdateWidgetProperty() override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
 
  public:
   FX_BOOL OnValidate(IFWL_Widget* pWidget, CFX_WideString& wsText);
 };
+
 class CXFA_FFPasswordEdit : public CXFA_FFTextEdit {
  public:
   CXFA_FFPasswordEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFPasswordEdit();
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
+  ~CXFA_FFPasswordEdit() override;
+
+  // CXFA_FFTextEdit
+  FX_BOOL LoadWidget() override;
+  void UpdateWidgetProperty() override;
 
  protected:
 };
+
 enum XFA_DATETIMETYPE {
   XFA_DATETIMETYPE_Date = 0,
   XFA_DATETIMETYPE_Time,
   XFA_DATETIMETYPE_DateAndTime
 };
+
 class CXFA_FFDateTimeEdit : public CXFA_FFTextEdit {
  public:
   CXFA_FFDateTimeEdit(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFDateTimeEdit();
+  ~CXFA_FFDateTimeEdit() override;
 
-  virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
-                          uint32_t dwStatus,
-                          FX_BOOL bDrawFocus = FALSE);
-  virtual FX_BOOL LoadWidget();
-  virtual void UpdateWidgetProperty();
+  // CXFA_FFTextEdit
+  FX_BOOL GetBBox(CFX_RectF& rtBox,
+                  uint32_t dwStatus,
+                  FX_BOOL bDrawFocus = FALSE) override;
+  FX_BOOL LoadWidget() override;
+  void UpdateWidgetProperty() override;
 
-  virtual FX_BOOL CanUndo();
-  virtual FX_BOOL CanRedo();
-  virtual FX_BOOL Undo();
-  virtual FX_BOOL Redo();
+  FX_BOOL CanUndo() override;
+  FX_BOOL CanRedo() override;
+  FX_BOOL Undo() override;
+  FX_BOOL Redo() override;
+  FX_BOOL CanCopy() override;
+  FX_BOOL CanCut() override;
+  FX_BOOL CanPaste() override;
+  FX_BOOL CanSelectAll() override;
+  FX_BOOL Copy(CFX_WideString& wsCopy) override;
+  FX_BOOL Cut(CFX_WideString& wsCut) override;
+  FX_BOOL Paste(const CFX_WideString& wsPaste) override;
+  FX_BOOL SelectAll() override;
+  FX_BOOL Delete() override;
+  FX_BOOL DeSelect() override;
+  void OnProcessEvent(CFWL_Event* pEvent) override;
 
-  virtual FX_BOOL CanCopy();
-  virtual FX_BOOL CanCut();
-  virtual FX_BOOL CanPaste();
-  virtual FX_BOOL CanSelectAll();
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
-  virtual FX_BOOL Cut(CFX_WideString& wsCut);
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
-  virtual FX_BOOL SelectAll();
-  virtual FX_BOOL Delete();
-  virtual FX_BOOL DeSelect();
-
- protected:
-  uint32_t GetAlignment();
-
-  virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL CommitData();
-  virtual FX_BOOL UpdateFWLData();
-  virtual FX_BOOL IsDataChanged();
-
- public:
   void OnSelectChanged(IFWL_Widget* pWidget,
                        int32_t iYear,
                        int32_t iMonth,
                        int32_t iDay);
-  virtual void OnProcessEvent(CFWL_Event* pEvent);
+
+ protected:
+  FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy) override;
+  FX_BOOL CommitData() override;
+  FX_BOOL UpdateFWLData() override;
+  FX_BOOL IsDataChanged() override;
+
+  uint32_t GetAlignment();
 };
 
 #endif  // XFA_FXFA_APP_XFA_FFTEXTEDIT_H_
diff --git a/xfa/fxfa/app/xfa_ffwidget.cpp b/xfa/fxfa/app/xfa_ffwidget.cpp
index fb4dc8e..7d41169 100644
--- a/xfa/fxfa/app/xfa_ffwidget.cpp
+++ b/xfa/fxfa/app/xfa_ffwidget.cpp
@@ -95,6 +95,7 @@
 CXFA_WidgetAcc* CXFA_FFWidget::GetDataAcc() {
   return m_pDataAcc;
 }
+
 FX_BOOL CXFA_FFWidget::GetToolTip(CFX_WideString& wsToolTip) {
   if (CXFA_Assist assist = m_pDataAcc->GetAssist()) {
     if (CXFA_ToolTip toolTip = assist.GetToolTip()) {
@@ -260,6 +261,62 @@
 FX_BOOL CXFA_FFWidget::OnSetCursor(FX_FLOAT fx, FX_FLOAT fy) {
   return FALSE;
 }
+FX_BOOL CXFA_FFWidget::CanUndo() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::CanRedo() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::Undo() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::Redo() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::CanCopy() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::CanCut() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::CanPaste() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::CanSelectAll() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::CanDelete() {
+  return CanCut();
+}
+FX_BOOL CXFA_FFWidget::CanDeSelect() {
+  return CanCopy();
+}
+FX_BOOL CXFA_FFWidget::Copy(CFX_WideString& wsCopy) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::Cut(CFX_WideString& wsCut) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::Paste(const CFX_WideString& wsPaste) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::SelectAll() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::Delete() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::DeSelect() {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::GetSuggestWords(CFX_PointF pointf,
+                                       std::vector<CFX_ByteString>& sSuggest) {
+  return FALSE;
+}
+FX_BOOL CXFA_FFWidget::ReplaceSpellCheckWord(CFX_PointF pointf,
+                                             const CFX_ByteStringC& bsReplace) {
+  return FALSE;
+}
 void CXFA_FFWidget::Rotate2Normal(FX_FLOAT& fx, FX_FLOAT& fy) {
   CFX_Matrix mt;
   GetRotateMatrix(mt);
@@ -379,6 +436,9 @@
 CXFA_FFDocView* CXFA_FFWidget::GetDocView() {
   return m_pDocView;
 }
+void CXFA_FFWidget::SetDocView(CXFA_FFDocView* pDocView) {
+  m_pDocView = pDocView;
+}
 CXFA_FFDoc* CXFA_FFWidget::GetDoc() {
   return m_pDocView->GetDoc();
 }
@@ -1986,3 +2046,9 @@
   XFA_BOX_Fill(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
   XFA_BOX_Stroke(box, strokes, pGS, rtWidget, pMatrix, dwFlags);
 }
+
+CXFA_CalcData::CXFA_CalcData() : m_iRefCount(0) {}
+
+CXFA_CalcData::~CXFA_CalcData() {
+  m_Globals.RemoveAll();
+}
diff --git a/xfa/fxfa/app/xfa_ffwidgetacc.h b/xfa/fxfa/app/xfa_ffwidgetacc.h
index 97514b7..5f7aec7 100644
--- a/xfa/fxfa/app/xfa_ffwidgetacc.h
+++ b/xfa/fxfa/app/xfa_ffwidgetacc.h
@@ -16,6 +16,7 @@
   XFA_TEXTPROVIDERTYPE_Rollover,
   XFA_TEXTPROVIDERTYPE_Down,
 };
+
 class CXFA_TextProvider {
  public:
   CXFA_TextProvider(CXFA_WidgetAcc* pWidgetAcc,
diff --git a/xfa/fxfa/app/xfa_fontmgr.cpp b/xfa/fxfa/app/xfa_fontmgr.cpp
index f50bf5bf..67f96c4 100644
--- a/xfa/fxfa/app/xfa_fontmgr.cpp
+++ b/xfa/fxfa/app/xfa_fontmgr.cpp
@@ -1738,6 +1738,8 @@
   return pFontInfo;
 }
 
+CXFA_DefFontMgr::CXFA_DefFontMgr() {}
+
 CXFA_DefFontMgr::~CXFA_DefFontMgr() {
   for (int32_t i = 0; i < m_CacheFonts.GetSize(); i++)
     m_CacheFonts[i]->Release();
diff --git a/xfa/fxfa/app/xfa_fwltheme.cpp b/xfa/fxfa/app/xfa_fwltheme.cpp
index e2e1b29..0706988 100644
--- a/xfa/fxfa/app/xfa_fwltheme.cpp
+++ b/xfa/fxfa/app/xfa_fwltheme.cpp
@@ -120,6 +120,16 @@
   return 0;
 }
 
+FWL_Error CXFA_FWLTheme::GetThemeMatrix(IFWL_Widget* pWidget,
+                                        CFX_Matrix& matrix) {
+  return FWL_Error::Succeeded;
+}
+
+FWL_Error CXFA_FWLTheme::SetThemeMatrix(IFWL_Widget* pWidget,
+                                        const CFX_Matrix& matrix) {
+  return FWL_Error::Succeeded;
+}
+
 FX_BOOL CXFA_FWLTheme::DrawBackground(CFWL_ThemeBackground* pParams) {
   return GetTheme(pParams->m_pWidget)->DrawBackground(pParams);
 }
@@ -345,6 +355,11 @@
 FX_BOOL CXFA_FWLTheme::IsCustomizedLayout(IFWL_Widget* pWidget) {
   return GetTheme(pWidget)->IsCustomizedLayout(pWidget);
 }
+
+FWL_Error CXFA_FWLTheme::GetPartRect(CFWL_ThemePart* pThemePart,
+                                     CFX_RectF& rtPart) {
+  return FWL_Error::Succeeded;
+}
 FWL_Error CXFA_FWLTheme::GetPartRect(CFWL_ThemePart* pThemePart) {
   CFX_RectF rect;
   return GetTheme(pThemePart->m_pWidget)->GetPartRect(pThemePart, rect);
diff --git a/xfa/fxfa/app/xfa_fwltheme.h b/xfa/fxfa/app/xfa_fwltheme.h
index fdd12c3..63a4247 100644
--- a/xfa/fxfa/app/xfa_fwltheme.h
+++ b/xfa/fxfa/app/xfa_fwltheme.h
@@ -42,22 +42,15 @@
   uint32_t SetThemeID(IFWL_Widget* pWidget,
                       uint32_t dwThemeID,
                       FX_BOOL bChildren = TRUE) override;
-  FWL_Error GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override {
-    return FWL_Error::Succeeded;
-  }
+  FWL_Error GetThemeMatrix(IFWL_Widget* pWidget, CFX_Matrix& matrix) override;
   FWL_Error SetThemeMatrix(IFWL_Widget* pWidget,
-                           const CFX_Matrix& matrix) override {
-    return FWL_Error::Succeeded;
-  }
+                           const CFX_Matrix& matrix) override;
   FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
   FX_BOOL DrawText(CFWL_ThemeText* pParams) override;
   void* GetCapacity(CFWL_ThemePart* pThemePart,
                     CFWL_WidgetCapacity dwCapacity) override;
   FX_BOOL IsCustomizedLayout(IFWL_Widget* pWidget) override;
-  FWL_Error GetPartRect(CFWL_ThemePart* pThemePart,
-                        CFX_RectF& rtPart) override {
-    return FWL_Error::Succeeded;
-  }
+  FWL_Error GetPartRect(CFWL_ThemePart* pThemePart, CFX_RectF& rtPart) override;
   FX_BOOL IsInPart(CFWL_ThemePart* pThemePart,
                    FX_FLOAT fx,
                    FX_FLOAT fy) override;
@@ -90,7 +83,9 @@
 class CXFA_FWLCheckBoxTP : public CFWL_CheckBoxTP {
  public:
   CXFA_FWLCheckBoxTP();
-  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
+
+  // CFWL_CheckBoxTP
+  FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
 
  protected:
   void DrawCheckSign(IFWL_Widget* pWidget,
@@ -102,10 +97,10 @@
 class CXFA_FWLEditTP : public CFWL_EditTP {
  public:
   CXFA_FWLEditTP();
-  virtual ~CXFA_FWLEditTP();
+  ~CXFA_FWLEditTP() override;
 
- public:
-  virtual FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams);
+  // CFWL_EditTP
+  FX_BOOL DrawBackground(CFWL_ThemeBackground* pParams) override;
 };
 
 #endif  // XFA_FXFA_APP_XFA_FWLTHEME_H_
diff --git a/xfa/fxfa/app/xfa_textlayout.cpp b/xfa/fxfa/app/xfa_textlayout.cpp
index 4e23fc3..8b2871e 100644
--- a/xfa/fxfa/app/xfa_textlayout.cpp
+++ b/xfa/fxfa/app/xfa_textlayout.cpp
@@ -21,6 +21,31 @@
 #include "xfa/fxfa/include/xfa_ffdoc.h"
 #include "xfa/fxfa/include/xfa_fontmgr.h"
 
+CXFA_CSSTagProvider::CXFA_CSSTagProvider()
+    : m_bTagAvailable(FALSE), m_bContent(FALSE) {}
+
+CXFA_CSSTagProvider::~CXFA_CSSTagProvider() {}
+
+XFA_TextPiece::XFA_TextPiece()
+    : pszText(nullptr), pFont(nullptr), pLinkData(nullptr) {}
+
+XFA_TextPiece::~XFA_TextPiece() {
+  if (pLinkData)
+    pLinkData->Release();
+}
+
+CXFA_TextParseContext::CXFA_TextParseContext()
+    : m_pParentStyle(nullptr),
+      m_ppMatchedDecls(nullptr),
+      m_dwMatchedDecls(0),
+      m_eDisplay(FDE_CSSDISPLAY_None) {}
+
+CXFA_TextParseContext::~CXFA_TextParseContext() {
+  if (m_pParentStyle)
+    m_pParentStyle->Release();
+  FX_Free(m_ppMatchedDecls);
+}
+
 void CXFA_TextParseContext::SetDecls(const CFDE_CSSDeclaration** ppDeclArray,
                                      int32_t iDeclCount) {
   if (iDeclCount <= 0 || !ppDeclArray)
@@ -85,6 +110,22 @@
     m_pSelector->UpdateStyleIndex(FDE_CSSMEDIATYPE_ALL);
   }
 }
+
+CXFA_LoaderContext::CXFA_LoaderContext()
+    : m_bSaveLineHeight(FALSE),
+      m_fWidth(0),
+      m_fHeight(0),
+      m_fLastPos(0),
+      m_fStartLineOffset(0),
+      m_iChar(0),
+      m_iTotalLines(-1),
+      m_pXMLNode(NULL),
+      m_pNode(NULL),
+      m_pParentStyle(NULL),
+      m_dwFlags(0) {}
+
+CXFA_LoaderContext::~CXFA_LoaderContext() {}
+
 IFDE_CSSStyleSheet* CXFA_TextParser::LoadDefaultSheetStyle() {
   static const FX_WCHAR s_pStyle[] =
       L"html,body,ol,p,ul{display:block}"
@@ -1945,3 +1986,106 @@
   tr.iHorizontalScale = pPiece->iHorScale;
   return TRUE;
 }
+
+CXFA_LinkUserData::CXFA_LinkUserData(IFX_MemoryAllocator* pAllocator,
+                                     FX_WCHAR* pszText)
+    : m_pAllocator(pAllocator), m_dwRefCount(1), m_wsURLContent(pszText) {}
+
+CXFA_LinkUserData::~CXFA_LinkUserData() {}
+
+uint32_t CXFA_LinkUserData::Retain() {
+  return ++m_dwRefCount;
+}
+
+uint32_t CXFA_LinkUserData::Release() {
+  uint32_t dwRefCount = --m_dwRefCount;
+  if (dwRefCount <= 0)
+    FXTARGET_DeleteWith(CXFA_LinkUserData, m_pAllocator, this);
+  return dwRefCount;
+}
+
+const FX_WCHAR* CXFA_LinkUserData::GetLinkURL() {
+  return m_wsURLContent.c_str();
+}
+
+CXFA_TextUserData::CXFA_TextUserData(IFX_MemoryAllocator* pAllocator,
+                                     IFDE_CSSComputedStyle* pStyle)
+    : m_pStyle(pStyle),
+      m_pLinkData(nullptr),
+      m_pAllocator(pAllocator),
+      m_dwRefCount(0) {
+  ASSERT(m_pAllocator);
+  if (m_pStyle)
+    m_pStyle->Retain();
+}
+
+CXFA_TextUserData::CXFA_TextUserData(IFX_MemoryAllocator* pAllocator,
+                                     IFDE_CSSComputedStyle* pStyle,
+                                     CXFA_LinkUserData* pLinkData)
+    : m_pStyle(pStyle),
+      m_pLinkData(pLinkData),
+      m_pAllocator(pAllocator),
+      m_dwRefCount(0) {
+  ASSERT(m_pAllocator);
+  if (m_pStyle)
+    m_pStyle->Retain();
+}
+
+CXFA_TextUserData::~CXFA_TextUserData() {
+  if (m_pStyle)
+    m_pStyle->Release();
+  if (m_pLinkData)
+    m_pLinkData->Release();
+}
+
+uint32_t CXFA_TextUserData::Retain() {
+  return ++m_dwRefCount;
+}
+
+uint32_t CXFA_TextUserData::Release() {
+  uint32_t dwRefCount = --m_dwRefCount;
+  if (dwRefCount == 0)
+    FXTARGET_DeleteWith(CXFA_TextUserData, m_pAllocator, this);
+  return dwRefCount;
+}
+
+CXFA_PieceLine::CXFA_PieceLine() {}
+
+CXFA_PieceLine::~CXFA_PieceLine() {}
+
+CXFA_TextTabstopsContext::CXFA_TextTabstopsContext()
+    : m_iTabCount(0),
+      m_iTabIndex(-1),
+      m_bTabstops(FALSE),
+      m_fTabWidth(0),
+      m_fLeft(0) {}
+
+CXFA_TextTabstopsContext::~CXFA_TextTabstopsContext() {}
+
+void CXFA_TextTabstopsContext::Append(uint32_t dwAlign, FX_FLOAT fTabstops) {
+  int32_t i = 0;
+  for (i = 0; i < m_iTabCount; i++) {
+    XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
+    if (fTabstops < pTabstop->fTabstops) {
+      break;
+    }
+  }
+  m_tabstops.InsertSpaceAt(i, 1);
+  XFA_TABSTOPS tabstop;
+  tabstop.dwAlign = dwAlign;
+  tabstop.fTabstops = fTabstops;
+  m_tabstops.SetAt(i, tabstop);
+  m_iTabCount++;
+}
+
+void CXFA_TextTabstopsContext::RemoveAll() {
+  m_tabstops.RemoveAll();
+  m_iTabCount = 0;
+}
+
+void CXFA_TextTabstopsContext::Reset() {
+  m_iTabIndex = -1;
+  m_bTabstops = FALSE;
+  m_fTabWidth = 0;
+  m_fLeft = 0;
+}
diff --git a/xfa/fxfa/app/xfa_textlayout.h b/xfa/fxfa/app/xfa_textlayout.h
index 842c6ec..00e7209 100644
--- a/xfa/fxfa/app/xfa_textlayout.h
+++ b/xfa/fxfa/app/xfa_textlayout.h
@@ -12,8 +12,8 @@
 
 #include "xfa/fde/css/fde_css.h"
 #include "xfa/fde/fde_gedevice.h"
-#include "xfa/fgas/layout/fgas_rtfbreak.h"
 #include "xfa/fxfa/include/xfa_ffdoc.h"
+#include "xfa/fgas/layout/fgas_rtfbreak.h"
 #include "xfa/fxfa/parser/xfa_object.h"
 
 #define XFA_LOADERCNTXTFLG_FILTERSPACE 0x001
@@ -26,12 +26,13 @@
 
 class CXFA_CSSTagProvider {
  public:
-  CXFA_CSSTagProvider() : m_bTagAvailable(FALSE), m_bContent(FALSE) {}
-  ~CXFA_CSSTagProvider() {}
+  using AttributeMap = std::map<CFX_WideString, CFX_WideString>;
+
+  CXFA_CSSTagProvider();
+  ~CXFA_CSSTagProvider();
 
   CFX_WideString GetTagName() { return m_wsTagName; }
 
-  using AttributeMap = std::map<CFX_WideString, CFX_WideString>;
   AttributeMap::iterator begin() { return m_Attributes.begin(); }
   AttributeMap::iterator end() { return m_Attributes.end(); }
 
@@ -53,16 +54,9 @@
 
 class CXFA_TextParseContext : public CFX_Target {
  public:
-  CXFA_TextParseContext()
-      : m_pParentStyle(nullptr),
-        m_ppMatchedDecls(nullptr),
-        m_dwMatchedDecls(0),
-        m_eDisplay(FDE_CSSDISPLAY_None) {}
-  ~CXFA_TextParseContext() {
-    if (m_pParentStyle)
-      m_pParentStyle->Release();
-    FX_Free(m_ppMatchedDecls);
-  }
+  CXFA_TextParseContext();
+  ~CXFA_TextParseContext() override;
+
   void SetDisplay(FDE_CSSDISPLAY eDisplay) { m_eDisplay = eDisplay; }
   FDE_CSSDISPLAY GetDisplay() const { return m_eDisplay; }
   void SetDecls(const CFDE_CSSDeclaration** ppDeclArray, int32_t iDeclCount);
@@ -70,6 +64,7 @@
     return const_cast<const CFDE_CSSDeclaration**>(m_ppMatchedDecls);
   }
   uint32_t CountDecls() const { return m_dwMatchedDecls; }
+
   IFDE_CSSComputedStyle* m_pParentStyle;
 
  protected:
@@ -82,6 +77,7 @@
  public:
   CXFA_TextParser();
   virtual ~CXFA_TextParser();
+
   void Reset();
   void DoParse(CFDE_XMLNode* pXMLContainer, CXFA_TextProvider* pTextProvider);
   IFDE_CSSComputedStyle* CreateRootStyle(CXFA_TextProvider* pTextProvider);
@@ -143,18 +139,9 @@
 
 class CXFA_LoaderContext {
  public:
-  CXFA_LoaderContext()
-      : m_bSaveLineHeight(FALSE),
-        m_fWidth(0),
-        m_fHeight(0),
-        m_fLastPos(0),
-        m_fStartLineOffset(0),
-        m_iChar(0),
-        m_iTotalLines(-1),
-        m_pXMLNode(NULL),
-        m_pNode(NULL),
-        m_pParentStyle(NULL),
-        m_dwFlags(0) {}
+  CXFA_LoaderContext();
+  ~CXFA_LoaderContext();
+
   FX_BOOL m_bSaveLineHeight;
   FX_FLOAT m_fWidth;
   FX_FLOAT m_fHeight;
@@ -173,21 +160,14 @@
 
 class CXFA_LinkUserData : public IFX_Retainable, public CFX_Target {
  public:
-  CXFA_LinkUserData(IFX_MemoryAllocator* pAllocator, FX_WCHAR* pszText)
-      : m_pAllocator(pAllocator), m_dwRefCount(1), m_wsURLContent(pszText) {}
-
-  ~CXFA_LinkUserData() override {}
+  CXFA_LinkUserData(IFX_MemoryAllocator* pAllocator, FX_WCHAR* pszText);
+  ~CXFA_LinkUserData() override;
 
   // IFX_Retainable:
-  uint32_t Retain() override { return ++m_dwRefCount; }
-  uint32_t Release() override {
-    uint32_t dwRefCount = --m_dwRefCount;
-    if (dwRefCount <= 0)
-      FXTARGET_DeleteWith(CXFA_LinkUserData, m_pAllocator, this);
-    return dwRefCount;
-  }
+  uint32_t Retain() override;
+  uint32_t Release() override;
 
-  const FX_WCHAR* GetLinkURL() { return m_wsURLContent.c_str(); }
+  const FX_WCHAR* GetLinkURL();
 
  protected:
   IFX_MemoryAllocator* m_pAllocator;
@@ -198,41 +178,15 @@
 class CXFA_TextUserData : public IFX_Retainable, public CFX_Target {
  public:
   CXFA_TextUserData(IFX_MemoryAllocator* pAllocator,
-                    IFDE_CSSComputedStyle* pStyle)
-      : m_pStyle(pStyle),
-        m_pLinkData(nullptr),
-        m_pAllocator(pAllocator),
-        m_dwRefCount(0) {
-    ASSERT(m_pAllocator);
-    if (m_pStyle)
-      m_pStyle->Retain();
-  }
+                    IFDE_CSSComputedStyle* pStyle);
   CXFA_TextUserData(IFX_MemoryAllocator* pAllocator,
                     IFDE_CSSComputedStyle* pStyle,
-                    CXFA_LinkUserData* pLinkData)
-      : m_pStyle(pStyle),
-        m_pLinkData(pLinkData),
-        m_pAllocator(pAllocator),
-        m_dwRefCount(0) {
-    ASSERT(m_pAllocator);
-    if (m_pStyle)
-      m_pStyle->Retain();
-  }
-  ~CXFA_TextUserData() override {
-    if (m_pStyle)
-      m_pStyle->Release();
-    if (m_pLinkData)
-      m_pLinkData->Release();
-  }
+                    CXFA_LinkUserData* pLinkData);
+  ~CXFA_TextUserData() override;
 
   // IFX_Retainable:
-  uint32_t Retain() override { return ++m_dwRefCount; }
-  uint32_t Release() override {
-    uint32_t dwRefCount = --m_dwRefCount;
-    if (dwRefCount == 0)
-      FXTARGET_DeleteWith(CXFA_TextUserData, m_pAllocator, this);
-    return dwRefCount;
-  }
+  uint32_t Retain() override;
+  uint32_t Release() override;
 
   IFDE_CSSComputedStyle* m_pStyle;
   CXFA_LinkUserData* m_pLinkData;
@@ -244,11 +198,8 @@
 
 class XFA_TextPiece : public CFX_Target {
  public:
-  XFA_TextPiece() : pszText(nullptr), pFont(nullptr), pLinkData(nullptr) {}
-  ~XFA_TextPiece() override {
-    if (pLinkData)
-      pLinkData->Release();
-  }
+  XFA_TextPiece();
+  ~XFA_TextPiece() override;
 
   FX_WCHAR* pszText;
   int32_t iChars;
@@ -269,7 +220,9 @@
 
 class CXFA_PieceLine : public CFX_Target {
  public:
-  CXFA_PieceLine() {}
+  CXFA_PieceLine();
+  ~CXFA_PieceLine() override;
+
   CXFA_PieceArray m_textPieces;
   CFX_Int32Array m_charCounts;
 };
@@ -282,37 +235,13 @@
 
 class CXFA_TextTabstopsContext {
  public:
-  CXFA_TextTabstopsContext()
-      : m_iTabCount(0),
-        m_iTabIndex(-1),
-        m_bTabstops(FALSE),
-        m_fTabWidth(0),
-        m_fLeft(0) {}
-  void Append(uint32_t dwAlign, FX_FLOAT fTabstops) {
-    int32_t i = 0;
-    for (i = 0; i < m_iTabCount; i++) {
-      XFA_TABSTOPS* pTabstop = m_tabstops.GetDataPtr(i);
-      if (fTabstops < pTabstop->fTabstops) {
-        break;
-      }
-    }
-    m_tabstops.InsertSpaceAt(i, 1);
-    XFA_TABSTOPS tabstop;
-    tabstop.dwAlign = dwAlign;
-    tabstop.fTabstops = fTabstops;
-    m_tabstops.SetAt(i, tabstop);
-    m_iTabCount++;
-  }
-  void RemoveAll() {
-    m_tabstops.RemoveAll();
-    m_iTabCount = 0;
-  }
-  void Reset() {
-    m_iTabIndex = -1;
-    m_bTabstops = FALSE;
-    m_fTabWidth = 0;
-    m_fLeft = 0;
-  }
+  CXFA_TextTabstopsContext();
+  ~CXFA_TextTabstopsContext();
+
+  void Append(uint32_t dwAlign, FX_FLOAT fTabstops);
+  void RemoveAll();
+  void Reset();
+
   CFX_ArrayTemplate<XFA_TABSTOPS> m_tabstops;
   int32_t m_iTabCount;
   int32_t m_iTabIndex;
diff --git a/xfa/fxfa/fm2js/xfa_expression.cpp b/xfa/fxfa/fm2js/xfa_expression.cpp
index 72020c3..ad6acaf 100644
--- a/xfa/fxfa/fm2js/xfa_expression.cpp
+++ b/xfa/fxfa/fm2js/xfa_expression.cpp
@@ -120,6 +120,8 @@
       m_wsName(wsName),
       m_pInit(pInit) {}
 
+CXFA_FMVarExpression::~CXFA_FMVarExpression() {}
+
 void CXFA_FMVarExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << FX_WSTRC(L"var ");
   CFX_WideString tempName(m_wsName);
@@ -170,6 +172,8 @@
                                            CXFA_FMSimpleExpression* pExpression)
     : CXFA_FMExpression(line, XFA_FM_EXPTYPE_EXP), m_pExpression(pExpression) {}
 
+CXFA_FMExpExpression::~CXFA_FMExpExpression() {}
+
 void CXFA_FMExpExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   if (m_pExpression->GetOperatorToken() == TOKassign) {
     m_pExpression->ToJavaScript(javascript);
@@ -246,6 +250,8 @@
                                          CXFA_FMExpression* pList)
     : CXFA_FMExpression(line), m_pList(pList) {}
 
+CXFA_FMDoExpression::~CXFA_FMDoExpression() {}
+
 void CXFA_FMDoExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   m_pList->ToJavaScript(javascript);
 }
@@ -263,6 +269,8 @@
       m_pIfExpression(pIfExpression),
       m_pElseExpression(pElseExpression) {}
 
+CXFA_FMIfExpression::~CXFA_FMIfExpression() {}
+
 void CXFA_FMIfExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << FX_WSTRC(L"if (");
   if (m_pExpression) {
@@ -329,6 +337,8 @@
       m_pCondition(pCondition),
       m_pExpression(pExpression) {}
 
+CXFA_FMWhileExpression::~CXFA_FMWhileExpression() {}
+
 void CXFA_FMWhileExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << FX_WSTRC(L"while (");
   m_pCondition->ToJavaScript(javascript);
@@ -394,6 +404,8 @@
       m_pStep(pStep),
       m_pList(pList) {}
 
+CXFA_FMForExpression::~CXFA_FMForExpression() {}
+
 void CXFA_FMForExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << FX_WSTRC(L"{\nvar ");
   CFX_WideString tempVariant;
diff --git a/xfa/fxfa/fm2js/xfa_expression.h b/xfa/fxfa/fm2js/xfa_expression.h
index ff898a9..8134988 100644
--- a/xfa/fxfa/fm2js/xfa_expression.h
+++ b/xfa/fxfa/fm2js/xfa_expression.h
@@ -63,6 +63,8 @@
   CXFA_FMVarExpression(uint32_t line,
                        const CFX_WideStringC& wsName,
                        CXFA_FMExpression* pInit);
+  ~CXFA_FMVarExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf&) override;
 
@@ -74,6 +76,8 @@
 class CXFA_FMExpExpression : public CXFA_FMExpression {
  public:
   CXFA_FMExpExpression(uint32_t line, CXFA_FMSimpleExpression* pExpression);
+  ~CXFA_FMExpExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf&) override;
 
@@ -99,6 +103,8 @@
 class CXFA_FMDoExpression : public CXFA_FMExpression {
  public:
   CXFA_FMDoExpression(uint32_t line, CXFA_FMExpression* pList);
+  ~CXFA_FMDoExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf&) override;
 
@@ -112,6 +118,8 @@
                       CXFA_FMSimpleExpression* pExpression,
                       CXFA_FMExpression* pIfExpression,
                       CXFA_FMExpression* pElseExpression);
+  ~CXFA_FMIfExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf&) override;
 
@@ -134,6 +142,8 @@
   CXFA_FMWhileExpression(uint32_t line,
                          CXFA_FMSimpleExpression* pCodition,
                          CXFA_FMExpression* pExpression);
+  ~CXFA_FMWhileExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf&) override;
 
@@ -167,6 +177,8 @@
                        int32_t iDirection,
                        CXFA_FMSimpleExpression* pStep,
                        CXFA_FMExpression* pList);
+  ~CXFA_FMForExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
   void ToImpliedReturnJS(CFX_WideTextBuf&) override;
 
diff --git a/xfa/fxfa/fm2js/xfa_fm2jscontext.h b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
index eb16435..344c4bc 100644
--- a/xfa/fxfa/fm2js/xfa_fm2jscontext.h
+++ b/xfa/fxfa/fm2js/xfa_fm2jscontext.h
@@ -12,6 +12,11 @@
 
 class CXFA_FM2JSContext : public CFXJSE_HostObject {
  public:
+  CXFA_FM2JSContext(v8::Isolate* pScriptIsolate,
+                    CFXJSE_Context* pScriptContext,
+                    CXFA_Document* pDoc);
+  ~CXFA_FM2JSContext() override;
+
   static void Abs(CFXJSE_Value* pThis,
                   const CFX_ByteStringC& szFuncName,
                   CFXJSE_Arguments& args);
@@ -439,11 +444,6 @@
                            CFX_WideTextBuf& wsJavascript,
                            CFX_WideString& wsError);
 
-  CXFA_FM2JSContext(v8::Isolate* pScriptIsolate,
-                    CFXJSE_Context* pScriptContext,
-                    CXFA_Document* pDoc);
-  ~CXFA_FM2JSContext();
-
   void GlobalPropertyGetter(CFXJSE_Value* pValue);
 
  private:
diff --git a/xfa/fxfa/fm2js/xfa_fmparse.cpp b/xfa/fxfa/fm2js/xfa_fmparse.cpp
index 5fd6c066..ebe68b9 100644
--- a/xfa/fxfa/fm2js/xfa_fmparse.cpp
+++ b/xfa/fxfa/fm2js/xfa_fmparse.cpp
@@ -10,6 +10,8 @@
 
 CXFA_FMParse::CXFA_FMParse() : m_pToken(nullptr), m_pErrorInfo(0) {}
 
+CXFA_FMParse::~CXFA_FMParse() {}
+
 int32_t CXFA_FMParse::Init(const CFX_WideStringC& wsFormcalc,
                            CXFA_FMErrorInfo* pErrorInfo) {
   m_pErrorInfo = pErrorInfo;
diff --git a/xfa/fxfa/fm2js/xfa_fmparse.h b/xfa/fxfa/fm2js/xfa_fmparse.h
index 3c11a73..0283eda 100644
--- a/xfa/fxfa/fm2js/xfa_fmparse.h
+++ b/xfa/fxfa/fm2js/xfa_fmparse.h
@@ -15,6 +15,8 @@
 class CXFA_FMParse {
  public:
   CXFA_FMParse();
+  ~CXFA_FMParse();
+
   int32_t Init(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
   void NextToken();
   void Check(XFA_FM_TOKEN op);
diff --git a/xfa/fxfa/fm2js/xfa_lexer.cpp b/xfa/fxfa/fm2js/xfa_lexer.cpp
index f048f42..e480b37 100644
--- a/xfa/fxfa/fm2js/xfa_lexer.cpp
+++ b/xfa/fxfa/fm2js/xfa_lexer.cpp
@@ -167,6 +167,8 @@
                            CXFA_FMErrorInfo* pErrorInfo)
     : m_ptr(wsFormCalc.c_str()), m_uCurrentLine(1), m_pErrorInfo(pErrorInfo) {}
 
+CXFA_FMLexer::~CXFA_FMLexer() {}
+
 CXFA_FMToken* CXFA_FMLexer::NextToken() {
   m_pToken.reset(Scan());
   return m_pToken.get();
diff --git a/xfa/fxfa/fm2js/xfa_lexer.h b/xfa/fxfa/fm2js/xfa_lexer.h
index c21c002..a910d17 100644
--- a/xfa/fxfa/fm2js/xfa_lexer.h
+++ b/xfa/fxfa/fm2js/xfa_lexer.h
@@ -104,6 +104,8 @@
 class CXFA_FMLexer {
  public:
   CXFA_FMLexer(const CFX_WideStringC& wsFormcalc, CXFA_FMErrorInfo* pErrorInfo);
+  ~CXFA_FMLexer();
+
   CXFA_FMToken* NextToken();
   uint32_t Number(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
   uint32_t String(CXFA_FMToken* t, const FX_WCHAR* p, const FX_WCHAR*& pEnd);
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
index e77623d..47bb9df 100644
--- a/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.cpp
@@ -137,6 +137,8 @@
                                                  CFX_WideStringC wsNumber)
     : CXFA_FMSimpleExpression(line, TOKnumber), m_wsNumber(wsNumber) {}
 
+CXFA_FMNumberExpression::~CXFA_FMNumberExpression() {}
+
 void CXFA_FMNumberExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << m_wsNumber;
 }
@@ -145,6 +147,8 @@
                                                  CFX_WideStringC wsString)
     : CXFA_FMSimpleExpression(line, TOKstring), m_wsString(wsString) {}
 
+CXFA_FMStringExpression::~CXFA_FMStringExpression() {}
+
 void CXFA_FMStringExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   CFX_WideString tempStr(m_wsString);
   if (tempStr.GetLength() > 2) {
@@ -177,6 +181,8 @@
     : CXFA_FMSimpleExpression(line, TOKidentifier),
       m_wsIdentifier(wsIdentifier) {}
 
+CXFA_FMIdentifierExpressionn::~CXFA_FMIdentifierExpressionn() {}
+
 void CXFA_FMIdentifierExpressionn::ToJavaScript(CFX_WideTextBuf& javascript) {
   CFX_WideString tempStr(m_wsIdentifier);
   if (tempStr == FX_WSTRC(L"$")) {
@@ -206,6 +212,8 @@
                                                CXFA_FMSimpleExpression* pExp)
     : CXFA_FMSimpleExpression(line, op), m_pExp(pExp) {}
 
+CXFA_FMUnaryExpression::~CXFA_FMUnaryExpression() {}
+
 void CXFA_FMUnaryExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
 
 CXFA_FMBinExpression::CXFA_FMBinExpression(uint32_t line,
@@ -214,6 +222,8 @@
                                            CXFA_FMSimpleExpression* pExp2)
     : CXFA_FMSimpleExpression(line, op), m_pExp1(pExp1), m_pExp2(pExp2) {}
 
+CXFA_FMBinExpression::~CXFA_FMBinExpression() {}
+
 void CXFA_FMBinExpression::ToJavaScript(CFX_WideTextBuf& javascript) {}
 
 CXFA_FMAssignExpression::CXFA_FMAssignExpression(uint32_t line,
@@ -616,6 +626,8 @@
     : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
       m_wsIdentifier(wsIdentifier) {}
 
+CXFA_FMDotAccessorExpression::~CXFA_FMDotAccessorExpression() {}
+
 void CXFA_FMDotAccessorExpression::ToJavaScript(CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[DOT];
   javascript << FX_WSTRC(L"(");
@@ -692,6 +704,8 @@
     : CXFA_FMBinExpression(line, op, pAccessor, pIndexExp),
       m_wsIdentifier(wsIdentifier) {}
 
+CXFA_FMDotDotAccessorExpression::~CXFA_FMDotDotAccessorExpression() {}
+
 void CXFA_FMDotDotAccessorExpression::ToJavaScript(
     CFX_WideTextBuf& javascript) {
   javascript << gs_lpStrExpFuncName[DOTDOT];
diff --git a/xfa/fxfa/fm2js/xfa_simpleexpression.h b/xfa/fxfa/fm2js/xfa_simpleexpression.h
index 2530128..27086f4 100644
--- a/xfa/fxfa/fm2js/xfa_simpleexpression.h
+++ b/xfa/fxfa/fm2js/xfa_simpleexpression.h
@@ -79,7 +79,7 @@
 class CXFA_FMNumberExpression : public CXFA_FMSimpleExpression {
  public:
   CXFA_FMNumberExpression(uint32_t line, CFX_WideStringC wsNumber);
-  ~CXFA_FMNumberExpression() override {}
+  ~CXFA_FMNumberExpression() override;
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  private:
@@ -89,7 +89,7 @@
 class CXFA_FMStringExpression : public CXFA_FMSimpleExpression {
  public:
   CXFA_FMStringExpression(uint32_t line, CFX_WideStringC wsString);
-  ~CXFA_FMStringExpression() override {}
+  ~CXFA_FMStringExpression() override;
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  private:
@@ -99,7 +99,7 @@
 class CXFA_FMIdentifierExpressionn : public CXFA_FMSimpleExpression {
  public:
   CXFA_FMIdentifierExpressionn(uint32_t line, CFX_WideStringC wsIdentifier);
-  ~CXFA_FMIdentifierExpressionn() override {}
+  ~CXFA_FMIdentifierExpressionn() override;
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  private:
@@ -111,6 +111,8 @@
   CXFA_FMUnaryExpression(uint32_t line,
                          XFA_FM_TOKEN op,
                          CXFA_FMSimpleExpression* pExp);
+  ~CXFA_FMUnaryExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  protected:
@@ -123,6 +125,8 @@
                        XFA_FM_TOKEN op,
                        CXFA_FMSimpleExpression* pExp1,
                        CXFA_FMSimpleExpression* pExp2);
+  ~CXFA_FMBinExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  protected:
@@ -246,7 +250,7 @@
                                XFA_FM_TOKEN op,
                                CFX_WideStringC wsIdentifier,
                                CXFA_FMSimpleExpression* pIndexExp);
-  ~CXFA_FMDotAccessorExpression() override {}
+  ~CXFA_FMDotAccessorExpression() override;
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  private:
@@ -274,7 +278,8 @@
                                   XFA_FM_TOKEN op,
                                   CFX_WideStringC wsIdentifier,
                                   CXFA_FMSimpleExpression* pIndexExp);
-  ~CXFA_FMDotDotAccessorExpression() override {}
+  ~CXFA_FMDotDotAccessorExpression() override;
+
   void ToJavaScript(CFX_WideTextBuf& javascript) override;
 
  private:
diff --git a/xfa/fxfa/include/fxfa.h b/xfa/fxfa/include/fxfa.h
index c62e916..4541cba 100644
--- a/xfa/fxfa/include/fxfa.h
+++ b/xfa/fxfa/include/fxfa.h
@@ -182,10 +182,8 @@
    */
   virtual void SetAppType(const CFX_WideStringC& wsAppType) = 0;
   virtual void GetAppType(CFX_WideString& wsAppType) = 0;
-  virtual void SetFoxitAppType(const CFX_WideStringC& wsFoxitAppType) {}
-  virtual void GetFoxitAppType(CFX_WideString& wsFoxitAppType) {
-    wsFoxitAppType.clear();
-  }
+  virtual void SetFoxitAppType(const CFX_WideStringC& wsFoxitAppType) = 0;
+  virtual void GetFoxitAppType(CFX_WideString& wsFoxitAppType) = 0;
 
   /**
    * Returns the language of the running host application. Such as zh_CN
@@ -207,17 +205,13 @@
    * Indicates the version number of the current application. Such as 9
    */
   virtual void GetVersion(CFX_WideString& wsVersion) = 0;
-  virtual void GetFoxitVersion(CFX_WideString& wsFoxitVersion) {
-    wsFoxitVersion.clear();
-  }
+  virtual void GetFoxitVersion(CFX_WideString& wsFoxitVersion) = 0;
 
   /**
    * Get application name, such as Phantom.
    */
   virtual void GetAppName(CFX_WideString& wsName) = 0;
-  virtual void GetFoxitAppName(CFX_WideString& wsFoxitName) {
-    wsFoxitName.clear();
-  }
+  virtual void GetFoxitAppName(CFX_WideString& wsFoxitName) = 0;
 
   /**
    * Causes the system to play a sound.
@@ -328,9 +322,8 @@
   virtual FX_BOOL RenderCustomWidget(CXFA_FFWidget* hWidget,
                                      CFX_Graphics* pGS,
                                      CFX_Matrix* pMatrix,
-                                     const CFX_RectF& rtUI) {
-    return FALSE;
-  }
+                                     const CFX_RectF& rtUI) = 0;
+
   virtual int32_t CountPages(CXFA_FFDoc* hDoc) = 0;
   virtual int32_t GetCurrentPage(CXFA_FFDoc* hDoc) = 0;
   virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0;
@@ -359,23 +352,17 @@
   virtual int32_t SheetInBatch(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
   virtual int32_t Verify(CXFA_FFDoc* hDoc,
                          CXFA_Node* pSigNode,
-                         FX_BOOL bUsed = TRUE) {
-    return 0;
-  }
+                         FX_BOOL bUsed = TRUE) = 0;
   virtual FX_BOOL Sign(CXFA_FFDoc* hDoc,
                        CXFA_NodeList* pNodeList,
                        const CFX_WideStringC& wsExpression,
                        const CFX_WideStringC& wsXMLIdent,
                        const CFX_WideStringC& wsValue = FX_WSTRC(L"open"),
-                       FX_BOOL bUsed = TRUE) {
-    return 0;
-  }
-  virtual CXFA_NodeList* Enumerate(CXFA_FFDoc* hDoc) { return 0; }
+                       FX_BOOL bUsed = TRUE) = 0;
+  virtual CXFA_NodeList* Enumerate(CXFA_FFDoc* hDoc) = 0;
   virtual FX_BOOL Clear(CXFA_FFDoc* hDoc,
                         CXFA_Node* pSigNode,
-                        FX_BOOL bCleared = TRUE) {
-    return 0;
-  }
+                        FX_BOOL bCleared = TRUE) = 0;
   virtual void GetURL(CXFA_FFDoc* hDoc, CFX_WideString& wsDocURL) = 0;
   virtual FX_ARGB GetHighlightColor(CXFA_FFDoc* hDoc) = 0;
 
@@ -400,13 +387,6 @@
                                        const CFX_WideString& wsLink) = 0;
 };
 
-class CXFA_RenderOptions {
- public:
-  CXFA_RenderOptions() : m_bPrint(FALSE), m_bHighlight(TRUE) {}
-  FX_BOOL m_bPrint;
-  FX_BOOL m_bHighlight;
-};
-
 class IXFA_WidgetIterator {
  public:
   virtual ~IXFA_WidgetIterator() {}
diff --git a/xfa/fxfa/include/xfa_ffapp.h b/xfa/fxfa/include/xfa_ffapp.h
index 1e8bf5b..5780859 100644
--- a/xfa/fxfa/include/xfa_ffapp.h
+++ b/xfa/fxfa/include/xfa_ffapp.h
@@ -24,11 +24,12 @@
 class CXFA_FileRead : public IFX_FileRead {
  public:
   explicit CXFA_FileRead(const CFX_ArrayTemplate<CPDF_Stream*>& streams);
+  ~CXFA_FileRead() override;
 
-  virtual FX_FILESIZE GetSize();
-  virtual FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size);
-
-  virtual void Release() { delete this; }
+  // IFX_FileRead
+  FX_FILESIZE GetSize() override;
+  FX_BOOL ReadBlock(void* buffer, FX_FILESIZE offset, size_t size) override;
+  void Release() override;
 
  protected:
   CFX_ObjectArray<CPDF_StreamAcc> m_Data;
diff --git a/xfa/fxfa/include/xfa_ffpageview.h b/xfa/fxfa/include/xfa_ffpageview.h
index ab98d54..2c703b0 100644
--- a/xfa/fxfa/include/xfa_ffpageview.h
+++ b/xfa/fxfa/include/xfa_ffpageview.h
@@ -58,14 +58,16 @@
   CXFA_LayoutItemIterator m_sIterator;
 };
 typedef CFX_ArrayTemplate<CXFA_FFWidget*> CXFA_WidgetArray;
+
 class CXFA_TabParam {
  public:
-  CXFA_TabParam() : m_pWidget(NULL) {}
-  ~CXFA_TabParam() {}
+  CXFA_TabParam();
+  ~CXFA_TabParam();
 
   CXFA_FFWidget* m_pWidget;
   CXFA_WidgetArray m_Children;
 };
+
 class CXFA_FFTabOrderPageWidgetIterator : public IXFA_WidgetIterator {
  public:
   CXFA_FFTabOrderPageWidgetIterator(CXFA_FFPageView* pPageView,
diff --git a/xfa/fxfa/include/xfa_ffwidget.h b/xfa/fxfa/include/xfa_ffwidget.h
index 0e58a34..2dc3b94 100644
--- a/xfa/fxfa/include/xfa_ffwidget.h
+++ b/xfa/fxfa/include/xfa_ffwidget.h
@@ -33,8 +33,8 @@
 
 class CXFA_CalcData {
  public:
-  CXFA_CalcData() : m_iRefCount(0) {}
-  ~CXFA_CalcData() { m_Globals.RemoveAll(); }
+  CXFA_CalcData();
+  ~CXFA_CalcData();
 
   CFX_ArrayTemplate<CXFA_WidgetAcc*> m_Globals;
   int32_t m_iRefCount;
@@ -43,23 +43,15 @@
 class CXFA_FFWidget : public CXFA_ContentLayoutItem {
  public:
   CXFA_FFWidget(CXFA_FFPageView* pPageView, CXFA_WidgetAcc* pDataAcc);
-  virtual ~CXFA_FFWidget();
-  CXFA_FFPageView* GetPageView();
-  void SetPageView(CXFA_FFPageView* pPageView);
-  void GetWidgetRect(CFX_RectF& rtWidget);
-  CFX_RectF ReCacheWidgetRect();
-  uint32_t GetStatus();
-  void ModifyStatus(uint32_t dwAdded, uint32_t dwRemoved);
+  ~CXFA_FFWidget() override;
+
   virtual FX_BOOL GetBBox(CFX_RectF& rtBox,
                           uint32_t dwStatus,
                           FX_BOOL bDrawFocus = FALSE);
-  CXFA_WidgetAcc* GetDataAcc();
-  FX_BOOL GetToolTip(CFX_WideString& wsToolTip);
   virtual void RenderWidget(CFX_Graphics* pGS,
                             CFX_Matrix* pMatrix = NULL,
                             uint32_t dwStatus = 0,
                             int32_t iRotate = 0);
-
   virtual FX_BOOL IsLoaded();
   virtual FX_BOOL LoadWidget();
   virtual void UnloadWidget();
@@ -87,32 +79,39 @@
   virtual FX_BOOL OnChar(uint32_t dwChar, uint32_t dwFlags);
   virtual FWL_WidgetHit OnHitTest(FX_FLOAT fx, FX_FLOAT fy);
   virtual FX_BOOL OnSetCursor(FX_FLOAT fx, FX_FLOAT fy);
-  virtual FX_BOOL CanUndo() { return FALSE; }
-  virtual FX_BOOL CanRedo() { return FALSE; }
-  virtual FX_BOOL Undo() { return FALSE; }
-  virtual FX_BOOL Redo() { return FALSE; }
-  virtual FX_BOOL CanCopy() { return FALSE; }
-  virtual FX_BOOL CanCut() { return FALSE; }
-  virtual FX_BOOL CanPaste() { return FALSE; }
-  virtual FX_BOOL CanSelectAll() { return FALSE; }
-  virtual FX_BOOL CanDelete() { return CanCut(); }
-  virtual FX_BOOL CanDeSelect() { return CanCopy(); }
-  virtual FX_BOOL Copy(CFX_WideString& wsCopy) { return FALSE; }
-  virtual FX_BOOL Cut(CFX_WideString& wsCut) { return FALSE; }
-  virtual FX_BOOL Paste(const CFX_WideString& wsPaste) { return FALSE; }
-  virtual FX_BOOL SelectAll() { return FALSE; }
-  virtual FX_BOOL Delete() { return FALSE; }
-  virtual FX_BOOL DeSelect() { return FALSE; }
+  virtual FX_BOOL CanUndo();
+  virtual FX_BOOL CanRedo();
+  virtual FX_BOOL Undo();
+  virtual FX_BOOL Redo();
+  virtual FX_BOOL CanCopy();
+  virtual FX_BOOL CanCut();
+  virtual FX_BOOL CanPaste();
+  virtual FX_BOOL CanSelectAll();
+  virtual FX_BOOL CanDelete();
+  virtual FX_BOOL CanDeSelect();
+  virtual FX_BOOL Copy(CFX_WideString& wsCopy);
+  virtual FX_BOOL Cut(CFX_WideString& wsCut);
+  virtual FX_BOOL Paste(const CFX_WideString& wsPaste);
+  virtual FX_BOOL SelectAll();
+  virtual FX_BOOL Delete();
+  virtual FX_BOOL DeSelect();
   virtual FX_BOOL GetSuggestWords(CFX_PointF pointf,
-                                  std::vector<CFX_ByteString>& sSuggest) {
-    return FALSE;
-  }
+                                  std::vector<CFX_ByteString>& sSuggest);
   virtual FX_BOOL ReplaceSpellCheckWord(CFX_PointF pointf,
-                                        const CFX_ByteStringC& bsReplace) {
-    return FALSE;
-  }
+                                        const CFX_ByteStringC& bsReplace);
+
+  CXFA_FFPageView* GetPageView();
+  void SetPageView(CXFA_FFPageView* pPageView);
+  void GetWidgetRect(CFX_RectF& rtWidget);
+  CFX_RectF ReCacheWidgetRect();
+  uint32_t GetStatus();
+  void ModifyStatus(uint32_t dwAdded, uint32_t dwRemoved);
+
+  CXFA_WidgetAcc* GetDataAcc();
+  FX_BOOL GetToolTip(CFX_WideString& wsToolTip);
+
   CXFA_FFDocView* GetDocView();
-  void SetDocView(CXFA_FFDocView* pDocView) { m_pDocView = pDocView; }
+  void SetDocView(CXFA_FFDocView* pDocView);
   CXFA_FFDoc* GetDoc();
   CXFA_FFApp* GetApp();
   IXFA_AppProvider* GetAppProvider();
@@ -128,6 +127,7 @@
 
  protected:
   virtual FX_BOOL PtInActiveRect(FX_FLOAT fx, FX_FLOAT fy);
+
   void DrawBorder(CFX_Graphics* pGS,
                   CXFA_Box box,
                   const CFX_RectF& rtBorder,
@@ -137,15 +137,16 @@
   void GetMinMaxHeight(FX_FLOAT fMinHeight, FX_FLOAT fMaxHeight);
   void GetRectWithoutRotate(CFX_RectF& rtWidget);
   bool IsMatchVisibleStatus(uint32_t dwStatus);
-
   void EventKillFocus();
   FX_BOOL IsButtonDown();
   void SetButtonDown(FX_BOOL bSet);
+
   CXFA_FFDocView* m_pDocView;
   CXFA_FFPageView* m_pPageView;
   CXFA_WidgetAcc* m_pDataAcc;
   CFX_RectF m_rtWidget;
 };
+
 int32_t XFA_StrokeTypeSetLineDash(CFX_Graphics* pGraphics,
                                   int32_t iStrokeType,
                                   int32_t iCapType);
diff --git a/xfa/fxfa/include/xfa_fontmgr.h b/xfa/fxfa/include/xfa_fontmgr.h
index 121df58..2d2a74f 100644
--- a/xfa/fxfa/include/xfa_fontmgr.h
+++ b/xfa/fxfa/include/xfa_fontmgr.h
@@ -27,7 +27,7 @@
 
 class CXFA_DefFontMgr {
  public:
-  CXFA_DefFontMgr() {}
+  CXFA_DefFontMgr();
   ~CXFA_DefFontMgr();
 
   CFGAS_GEFont* GetFont(CXFA_FFDoc* hDoc,
diff --git a/xfa/fxfa/include/xfa_rendercontext.h b/xfa/fxfa/include/xfa_rendercontext.h
index 1154b8c..7716c71 100644
--- a/xfa/fxfa/include/xfa_rendercontext.h
+++ b/xfa/fxfa/include/xfa_rendercontext.h
@@ -11,6 +11,14 @@
 
 #include "xfa/fxfa/include/fxfa.h"
 
+class CXFA_RenderOptions {
+ public:
+  CXFA_RenderOptions() : m_bPrint(FALSE), m_bHighlight(TRUE) {}
+
+  FX_BOOL m_bPrint;
+  FX_BOOL m_bHighlight;
+};
+
 class CXFA_RenderContext {
  public:
   CXFA_RenderContext();
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
index d2054cf..26f397c 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.h
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -61,7 +61,6 @@
   CXFA_Validate GetValidate(FX_BOOL bModified = FALSE);
   CXFA_Bind GetBind(FX_BOOL bModified = FALSE);
   CXFA_Assist GetAssist(FX_BOOL bModified = FALSE);
-  uint32_t GetRelevantStatus();
   FX_BOOL GetWidth(FX_FLOAT& fWidth);
   FX_BOOL GetHeight(FX_FLOAT& fHeight);
   FX_BOOL GetMinWidth(FX_FLOAT& fMinWidth);
diff --git a/xfa/fxfa/parser/xfa_basic_imp.cpp b/xfa/fxfa/parser/xfa_basic_imp.cpp
index f7c2606..8367462 100644
--- a/xfa/fxfa/parser/xfa_basic_imp.cpp
+++ b/xfa/fxfa/parser/xfa_basic_imp.cpp
@@ -553,6 +553,9 @@
 FX_BOOL CXFA_WideTextRead::IsEOF() const {
   return m_iPosition >= m_wsBuffer.GetLength();
 }
+int32_t CXFA_WideTextRead::ReadData(uint8_t* pBuffer, int32_t iBufferSize) {
+  return 0;
+}
 int32_t CXFA_WideTextRead::ReadString(FX_WCHAR* pStr,
                                       int32_t iMaxLength,
                                       FX_BOOL& bEOS,
@@ -566,9 +569,36 @@
   bEOS = IsEOF();
   return iMaxLength;
 }
+int32_t CXFA_WideTextRead::WriteData(const uint8_t* pBuffer,
+                                     int32_t iBufferSize) {
+  return 0;
+}
+int32_t CXFA_WideTextRead::WriteString(const FX_WCHAR* pStr, int32_t iLength) {
+  return 0;
+}
+FX_BOOL CXFA_WideTextRead::SetLength(int32_t iLength) {
+  return FALSE;
+}
+int32_t CXFA_WideTextRead::GetBOM(uint8_t bom[4]) const {
+  return 0;
+}
 uint16_t CXFA_WideTextRead::GetCodePage() const {
   return (sizeof(FX_WCHAR) == 2) ? FX_CODEPAGE_UTF16LE : FX_CODEPAGE_UTF32LE;
 }
 uint16_t CXFA_WideTextRead::SetCodePage(uint16_t wCodePage) {
   return GetCodePage();
 }
+
+IFX_Stream* CXFA_WideTextRead::CreateSharedStream(uint32_t dwAccess,
+                                                  int32_t iOffset,
+                                                  int32_t iLength) {
+  return NULL;
+}
+
+void CXFA_WideTextRead::Lock() {}
+
+void CXFA_WideTextRead::Unlock() {}
+
+CFX_WideString CXFA_WideTextRead::GetSrcText() const {
+  return m_wsBuffer;
+}
diff --git a/xfa/fxfa/parser/xfa_basic_imp.h b/xfa/fxfa/parser/xfa_basic_imp.h
index 108b00d..fdb77a9 100644
--- a/xfa/fxfa/parser/xfa_basic_imp.h
+++ b/xfa/fxfa/parser/xfa_basic_imp.h
@@ -24,43 +24,35 @@
 class CXFA_WideTextRead : public IFX_Stream {
  public:
   CXFA_WideTextRead(const CFX_WideString& wsBuffer);
-  virtual void Release();
-  virtual IFX_Stream* Retain();
 
-  virtual uint32_t GetAccessModes() const;
-  virtual int32_t GetLength() const;
-  virtual int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset);
-  virtual int32_t GetPosition();
-  virtual FX_BOOL IsEOF() const;
+  // IFX_Stream
+  void Release() override;
+  IFX_Stream* Retain() override;
+  uint32_t GetAccessModes() const override;
+  int32_t GetLength() const override;
+  int32_t Seek(FX_STREAMSEEK eSeek, int32_t iOffset) override;
+  int32_t GetPosition() override;
+  FX_BOOL IsEOF() const override;
+  int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) override;
+  int32_t ReadString(FX_WCHAR* pStr,
+                     int32_t iMaxLength,
+                     FX_BOOL& bEOS,
+                     int32_t const* pByteSize = NULL) override;
+  int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) override;
+  int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) override;
+  void Flush() override {}
+  FX_BOOL SetLength(int32_t iLength) override;
+  int32_t GetBOM(uint8_t bom[4]) const override;
+  uint16_t GetCodePage() const override;
+  uint16_t SetCodePage(uint16_t wCodePage) override;
+  IFX_Stream* CreateSharedStream(uint32_t dwAccess,
+                                 int32_t iOffset,
+                                 int32_t iLength) override;
 
-  virtual int32_t ReadData(uint8_t* pBuffer, int32_t iBufferSize) { return 0; }
-  virtual int32_t ReadString(FX_WCHAR* pStr,
-                             int32_t iMaxLength,
-                             FX_BOOL& bEOS,
-                             int32_t const* pByteSize = NULL);
-  virtual int32_t WriteData(const uint8_t* pBuffer, int32_t iBufferSize) {
-    return 0;
-  }
-  virtual int32_t WriteString(const FX_WCHAR* pStr, int32_t iLength) {
-    return 0;
-  }
-  virtual void Flush() {}
-  virtual FX_BOOL SetLength(int32_t iLength) { return FALSE; }
+  virtual void Lock();
+  virtual void Unlock();
 
-  virtual int32_t GetBOM(uint8_t bom[4]) const { return 0; }
-  virtual uint16_t GetCodePage() const;
-  virtual uint16_t SetCodePage(uint16_t wCodePage);
-
-  virtual void Lock() {}
-  virtual void Unlock() {}
-
-  virtual IFX_Stream* CreateSharedStream(uint32_t dwAccess,
-                                         int32_t iOffset,
-                                         int32_t iLength) {
-    return NULL;
-  }
-
-  CFX_WideString GetSrcText() const { return m_wsBuffer; }
+  CFX_WideString GetSrcText() const;
 
  protected:
   CFX_WideString m_wsBuffer;
diff --git a/xfa/fxfa/parser/xfa_doclayout.h b/xfa/fxfa/parser/xfa_doclayout.h
index a0b29e5..cc0cf82 100644
--- a/xfa/fxfa/parser/xfa_doclayout.h
+++ b/xfa/fxfa/parser/xfa_doclayout.h
@@ -66,7 +66,7 @@
 class CXFA_ContentLayoutItem : public CXFA_LayoutItem {
  public:
   CXFA_ContentLayoutItem(CXFA_Node* pNode);
-  virtual ~CXFA_ContentLayoutItem();
+  ~CXFA_ContentLayoutItem() override;
 
   CXFA_ContentLayoutItem* m_pPrev;
   CXFA_ContentLayoutItem* m_pNext;
diff --git a/xfa/fxfa/parser/xfa_document.h b/xfa/fxfa/parser/xfa_document.h
index 2890a66..39068c7 100644
--- a/xfa/fxfa/parser/xfa_document.h
+++ b/xfa/fxfa/parser/xfa_document.h
@@ -57,10 +57,12 @@
 class CScript_LogPseudoModel;
 class CScript_LayoutPseudoModel;
 class CScript_SignaturePseudoModel;
+
 class CXFA_Document {
  public:
   CXFA_Document(CXFA_DocumentParser* pParser);
   ~CXFA_Document();
+
   CXFA_Node* GetRoot() const { return m_pRootNode; }
   CXFA_DocumentParser* GetParser() const { return m_pParser; }
   CXFA_FFNotify* GetNotify() const;
diff --git a/xfa/fxfa/parser/xfa_layout_appadapter.h b/xfa/fxfa/parser/xfa_layout_appadapter.h
index 1bae22e..d41b90a 100644
--- a/xfa/fxfa/parser/xfa_layout_appadapter.h
+++ b/xfa/fxfa/parser/xfa_layout_appadapter.h
@@ -27,6 +27,7 @@
     return static_cast<CXFA_ContainerLayoutItem*>(pLayoutItem->m_pParent);
   }
 };
+
 class CXFA_TraverseStrategy_ContentAreaContainerLayoutItem {
  public:
   static inline CXFA_ContainerLayoutItem* GetFirstChild(
@@ -56,6 +57,7 @@
     return static_cast<CXFA_ContainerLayoutItem*>(pLayoutItem->m_pParent);
   }
 };
+
 class CXFA_TraverseStrategy_ContentLayoutItem {
  public:
   static inline CXFA_ContentLayoutItem* GetFirstChild(
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
index 509bf63..f44435a 100644
--- a/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.cpp
@@ -77,6 +77,9 @@
   m_pOldLayoutItem =
       (CXFA_ContentLayoutItem*)m_pFormNode->GetUserData(XFA_LAYOUTITEMKEY);
 }
+
+CXFA_ItemLayoutProcessor::~CXFA_ItemLayoutProcessor() {}
+
 CXFA_ContentLayoutItem* CXFA_ItemLayoutProcessor::CreateContentLayoutItem(
     CXFA_Node* pFormNode) {
   if (!pFormNode) {
diff --git a/xfa/fxfa/parser/xfa_layout_itemlayout.h b/xfa/fxfa/parser/xfa_layout_itemlayout.h
index f7376d2..fc27989 100644
--- a/xfa/fxfa/parser/xfa_layout_itemlayout.h
+++ b/xfa/fxfa/parser/xfa_layout_itemlayout.h
@@ -63,6 +63,7 @@
 class CXFA_ItemLayoutProcessor {
  public:
   CXFA_ItemLayoutProcessor(CXFA_Node* pNode, CXFA_LayoutPageMgr* pPageMgr);
+  ~CXFA_ItemLayoutProcessor();
 
   XFA_ItemLayoutProcessorResult DoLayout(
       FX_BOOL bUseBreakControl,
diff --git a/xfa/fxfa/parser/xfa_layout_pagemgr_new.h b/xfa/fxfa/parser/xfa_layout_pagemgr_new.h
index a82c152..b992a22 100644
--- a/xfa/fxfa/parser/xfa_layout_pagemgr_new.h
+++ b/xfa/fxfa/parser/xfa_layout_pagemgr_new.h
@@ -22,10 +22,12 @@
   CXFA_ContainerLayoutItem* pCurPageArea;
   CXFA_ContainerLayoutItem* pCurContentArea;
 };
+
 class CXFA_LayoutPageMgr {
  public:
   CXFA_LayoutPageMgr(CXFA_LayoutProcessor* pLayoutProcessor);
   ~CXFA_LayoutPageMgr();
+
   FX_BOOL InitLayoutPage(CXFA_Node* pFormNode);
   FX_BOOL PrepareFirstPage(CXFA_Node* pRootSubform);
   FX_FLOAT GetAvailHeight();
diff --git a/xfa/fxfa/parser/xfa_locale.h b/xfa/fxfa/parser/xfa_locale.h
index 522df19..5a79e20 100644
--- a/xfa/fxfa/parser/xfa_locale.h
+++ b/xfa/fxfa/parser/xfa_locale.h
@@ -13,32 +13,35 @@
 class CXFA_XMLLocale : public IFX_Locale {
  public:
   CXFA_XMLLocale(CXML_Element* pLocaleData);
-  virtual void Release();
-  virtual CFX_WideString GetName();
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const;
 
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            FX_BOOL bAbbr = TRUE) const;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          FX_BOOL bAbbr = TRUE) const;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               FX_BOOL bAM = TRUE) const;
-  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
-  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
+  // IFX_Locale
+  void Release() override;
+  CFX_WideString GetName() override;
+  void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                         CFX_WideString& wsNumSymbol) const override;
 
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const;
+  void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const override;
+  void GetMonthName(int32_t nMonth,
+                    CFX_WideString& wsMonthName,
+                    FX_BOOL bAbbr = TRUE) const override;
+  void GetDayName(int32_t nWeek,
+                  CFX_WideString& wsDayName,
+                  FX_BOOL bAbbr = TRUE) const override;
+  void GetMeridiemName(CFX_WideString& wsMeridiemName,
+                       FX_BOOL bAM = TRUE) const override;
+  void GetTimeZone(FX_TIMEZONE& tz) const override;
+  void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const override;
+
+  void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                      CFX_WideString& wsPattern) const override;
+  void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                      CFX_WideString& wsPattern) const override;
+  void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                     CFX_WideString& wsPattern) const override;
 
  protected:
-  ~CXFA_XMLLocale();
+  ~CXFA_XMLLocale() override;
+
   void GetPattern(CXML_Element* pElement,
                   const CFX_ByteStringC& bsTag,
                   const CFX_WideStringC& wsName,
@@ -50,35 +53,39 @@
  private:
   CXML_Element* m_pLocaleData;
 };
+
 class CXFA_NodeLocale : public IFX_Locale {
  public:
   CXFA_NodeLocale(CXFA_Node* pLocale);
-  virtual void Release();
-  virtual CFX_WideString GetName();
-  virtual void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
-                                 CFX_WideString& wsNumSymbol) const;
 
-  virtual void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const;
-  virtual void GetMonthName(int32_t nMonth,
-                            CFX_WideString& wsMonthName,
-                            FX_BOOL bAbbr = TRUE) const;
-  virtual void GetDayName(int32_t nWeek,
-                          CFX_WideString& wsDayName,
-                          FX_BOOL bAbbr = TRUE) const;
-  virtual void GetMeridiemName(CFX_WideString& wsMeridiemName,
-                               FX_BOOL bAM = TRUE) const;
-  virtual void GetTimeZone(FX_TIMEZONE& tz) const;
-  virtual void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const;
+  // IFX_Locale
+  void Release() override;
+  CFX_WideString GetName() override;
+  void GetNumbericSymbol(FX_LOCALENUMSYMBOL eType,
+                         CFX_WideString& wsNumSymbol) const override;
 
-  virtual void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
-                              CFX_WideString& wsPattern) const;
-  virtual void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
-                             CFX_WideString& wsPattern) const;
+  void GetDateTimeSymbols(CFX_WideString& wsDtSymbol) const override;
+  void GetMonthName(int32_t nMonth,
+                    CFX_WideString& wsMonthName,
+                    FX_BOOL bAbbr = TRUE) const override;
+  void GetDayName(int32_t nWeek,
+                  CFX_WideString& wsDayName,
+                  FX_BOOL bAbbr = TRUE) const override;
+  void GetMeridiemName(CFX_WideString& wsMeridiemName,
+                       FX_BOOL bAM = TRUE) const override;
+  void GetTimeZone(FX_TIMEZONE& tz) const override;
+  void GetEraName(CFX_WideString& wsEraName, FX_BOOL bAD = TRUE) const override;
+
+  void GetDatePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                      CFX_WideString& wsPattern) const override;
+  void GetTimePattern(FX_LOCALEDATETIMESUBCATEGORY eType,
+                      CFX_WideString& wsPattern) const override;
+  void GetNumPattern(FX_LOCALENUMSUBCATEGORY eType,
+                     CFX_WideString& wsPattern) const override;
 
  protected:
-  ~CXFA_NodeLocale();
+  ~CXFA_NodeLocale() override;
+
   CXFA_Node* GetNodeByName(CXFA_Node* pParent,
                            const CFX_WideStringC& wsName) const;
   CFX_WideString GetSymbol(XFA_ELEMENT eElement,
diff --git a/xfa/fxfa/parser/xfa_localemgr.h b/xfa/fxfa/parser/xfa_localemgr.h
index a3a1d4c..7051fc9 100644
--- a/xfa/fxfa/parser/xfa_localemgr.h
+++ b/xfa/fxfa/parser/xfa_localemgr.h
@@ -33,14 +33,15 @@
 class CXFA_LocaleMgr : public IFX_LocaleMgr {
  public:
   CXFA_LocaleMgr(CXFA_Node* pLocaleSet, CFX_WideString wsDeflcid);
+  ~CXFA_LocaleMgr() override;
 
+  // IFX_LocaleMgr
   void Release() override;
   uint16_t GetDefLocaleID() override;
   IFX_Locale* GetDefLocale() override;
   IFX_Locale* GetLocale(uint16_t lcid) override;
   IFX_Locale* GetLocaleByName(const CFX_WideString& wsLocaleName) override;
 
-  ~CXFA_LocaleMgr();
   void SetDefLocale(IFX_Locale* pLocale);
   CFX_WideStringC GetConfigLocaleName(CXFA_Node* pConfig);
 
diff --git a/xfa/fxfa/parser/xfa_object.h b/xfa/fxfa/parser/xfa_object.h
index 2cd09df..b5c31cf 100644
--- a/xfa/fxfa/parser/xfa_object.h
+++ b/xfa/fxfa/parser/xfa_object.h
@@ -45,7 +45,7 @@
 class CXFA_Object : public CFXJSE_HostObject {
  public:
   CXFA_Object(CXFA_Document* pDocument, uint32_t uFlags);
-  virtual ~CXFA_Object() {}
+  ~CXFA_Object() override;
 
   CXFA_Document* GetDocument() const { return m_pDocument; }
   uint32_t GetFlag() const { return m_uFlags; }
@@ -127,6 +127,9 @@
 };
 
 struct XFA_MAPMODULEDATA {
+  XFA_MAPMODULEDATA();
+  ~XFA_MAPMODULEDATA();
+
   CFX_MapPtrToPtr m_ValueMap;
   CFX_MapPtrTemplate<void*, XFA_MAPDATABLOCK*> m_BufferMap;
 };
@@ -134,6 +137,7 @@
 #define XFA_CalcRefCount (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'R')
 #define XFA_CalcData (void*)(uintptr_t) FXBSTR_ID('X', 'F', 'A', 'C')
 #define XFA_LAYOUTITEMKEY (void*)(uintptr_t) FXBSTR_ID('L', 'Y', 'I', 'M')
+
 class CXFA_Node : public CXFA_Object {
  public:
   XFA_ELEMENT GetClassID() const { return (XFA_ELEMENT)m_eNodeClass; }
@@ -649,42 +653,39 @@
   CXFA_Node* m_pAuxNode;
   XFA_MAPMODULEDATA* m_pMapModuleData;
 };
+
 class CXFA_OrdinaryObject : public CXFA_Object {
  public:
-  CXFA_OrdinaryObject(CXFA_Document* pDocument, XFA_ELEMENT eElement)
-      : CXFA_Object(pDocument, XFA_OBJECTTYPE_OrdinaryObject),
-        m_uScriptHash(0) {
-    m_eNodeClass = eElement;
-  }
-  XFA_ELEMENT GetClassID() const { return (XFA_ELEMENT)m_eNodeClass; }
-  uint32_t GetScriptObjHash() { return m_uScriptHash; }
+  CXFA_OrdinaryObject(CXFA_Document* pDocument, XFA_ELEMENT eElement);
+  ~CXFA_OrdinaryObject() override;
+
+  XFA_ELEMENT GetClassID() const;
+  uint32_t GetScriptObjHash() const;
 
  protected:
   XFA_ELEMENT m_eNodeClass;
   uint32_t m_uScriptHash;
 };
+
 class CXFA_ThisProxy : public CXFA_Object {
  public:
-  CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode)
-      : CXFA_Object(pThisNode->GetDocument(), XFA_OBJECTTYPE_VariablesThis),
-        m_pThisNode(NULL),
-        m_pScriptNode(NULL) {
-    m_pThisNode = pThisNode;
-    m_pScriptNode = pScriptNode;
-  }
-  ~CXFA_ThisProxy() override {}
-  CXFA_Node* GetThisNode() { return m_pThisNode; }
-  CXFA_Node* GetScriptNode() { return m_pScriptNode; }
+  CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode);
+  ~CXFA_ThisProxy() override;
+
+  CXFA_Node* GetThisNode() const;
+  CXFA_Node* GetScriptNode() const;
 
  private:
   CXFA_Node* m_pThisNode;
   CXFA_Node* m_pScriptNode;
 };
+
 class CXFA_NodeList : public CXFA_Object {
  public:
   explicit CXFA_NodeList(CXFA_Document* pDocument);
-  virtual ~CXFA_NodeList() {}
-  XFA_ELEMENT GetClassID() const { return XFA_ELEMENT_NodeList; }
+  ~CXFA_NodeList() override;
+
+  XFA_ELEMENT GetClassID() const;
   CXFA_Node* NamedItem(const CFX_WideStringC& wsName);
   virtual int32_t GetLength() = 0;
   virtual FX_BOOL Append(CXFA_Node* pNode) = 0;
@@ -702,28 +703,35 @@
                                FX_BOOL bSetting,
                                XFA_ATTRIBUTE eAttribute);
 };
+
 class CXFA_ArrayNodeList : public CXFA_NodeList {
  public:
   explicit CXFA_ArrayNodeList(CXFA_Document* pDocument);
+  ~CXFA_ArrayNodeList() override;
+
+  // From CXFA_NodeList.
+  int32_t GetLength() override;
+  FX_BOOL Append(CXFA_Node* pNode) override;
+  FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) override;
+  FX_BOOL Remove(CXFA_Node* pNode) override;
+  CXFA_Node* Item(int32_t iIndex) override;
+
   void SetArrayNodeList(const CXFA_NodeArray& srcArray);
-  virtual int32_t GetLength();
-  virtual FX_BOOL Append(CXFA_Node* pNode);
-  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode);
-  virtual FX_BOOL Remove(CXFA_Node* pNode);
-  virtual CXFA_Node* Item(int32_t iIndex);
 
  protected:
   CXFA_NodeArray m_array;
 };
+
 class CXFA_AttachNodeList : public CXFA_NodeList {
  public:
   CXFA_AttachNodeList(CXFA_Document* pDocument, CXFA_Node* pAttachNode);
 
-  virtual int32_t GetLength();
-  virtual FX_BOOL Append(CXFA_Node* pNode);
-  virtual FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode);
-  virtual FX_BOOL Remove(CXFA_Node* pNode);
-  virtual CXFA_Node* Item(int32_t iIndex);
+  // From CXFA_NodeList.
+  int32_t GetLength() override;
+  FX_BOOL Append(CXFA_Node* pNode) override;
+  FX_BOOL Insert(CXFA_Node* pNewNode, CXFA_Node* pBeforeNode) override;
+  FX_BOOL Remove(CXFA_Node* pNode) override;
+  CXFA_Node* Item(int32_t iIndex) override;
 
  protected:
   CXFA_Node* m_pAttachNode;
diff --git a/xfa/fxfa/parser/xfa_object_imp.cpp b/xfa/fxfa/parser/xfa_object_imp.cpp
index 0f36d68..02617f1 100644
--- a/xfa/fxfa/parser/xfa_object_imp.cpp
+++ b/xfa/fxfa/parser/xfa_object_imp.cpp
@@ -59,6 +59,8 @@
 CXFA_Object::CXFA_Object(CXFA_Document* pDocument, uint32_t uFlags)
     : m_pDocument(pDocument), m_uFlags(uFlags) {}
 
+CXFA_Object::~CXFA_Object() {}
+
 void CXFA_Object::GetClassName(CFX_WideStringC& wsName) const {
   wsName = XFA_GetElementByID(GetClassID())->pName;
 }
@@ -107,6 +109,10 @@
       FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
 }
 
+XFA_MAPMODULEDATA::XFA_MAPMODULEDATA() {}
+
+XFA_MAPMODULEDATA::~XFA_MAPMODULEDATA() {}
+
 CXFA_Node::CXFA_Node(CXFA_Document* pDoc,
                      uint16_t ePacket,
                      XFA_ELEMENT eElement)
@@ -5084,11 +5090,50 @@
   }
   pSrcModule->MoveBufferMapData(pDstModule, pKey);
 }
+
+CXFA_OrdinaryObject::CXFA_OrdinaryObject(CXFA_Document* pDocument,
+                                         XFA_ELEMENT eElement)
+    : CXFA_Object(pDocument, XFA_OBJECTTYPE_OrdinaryObject), m_uScriptHash(0) {
+  m_eNodeClass = eElement;
+}
+
+CXFA_OrdinaryObject::~CXFA_OrdinaryObject() {}
+
+XFA_ELEMENT CXFA_OrdinaryObject::GetClassID() const {
+  return m_eNodeClass;
+}
+
+uint32_t CXFA_OrdinaryObject::GetScriptObjHash() const {
+  return m_uScriptHash;
+}
+
+CXFA_ThisProxy::CXFA_ThisProxy(CXFA_Node* pThisNode, CXFA_Node* pScriptNode)
+    : CXFA_Object(pThisNode->GetDocument(), XFA_OBJECTTYPE_VariablesThis),
+      m_pThisNode(NULL),
+      m_pScriptNode(NULL) {
+  m_pThisNode = pThisNode;
+  m_pScriptNode = pScriptNode;
+}
+
+CXFA_ThisProxy::~CXFA_ThisProxy() {}
+
+CXFA_Node* CXFA_ThisProxy::GetThisNode() const {
+  return m_pThisNode;
+}
+
+CXFA_Node* CXFA_ThisProxy::GetScriptNode() const {
+  return m_pScriptNode;
+}
+
 CXFA_NodeList::CXFA_NodeList(CXFA_Document* pDocument)
     : CXFA_Object(pDocument, XFA_OBJECTTYPE_NodeList) {
   m_pDocument->GetScriptContext()->AddToCacheList(
       std::unique_ptr<CXFA_NodeList>(this));
 }
+CXFA_NodeList::~CXFA_NodeList() {}
+XFA_ELEMENT CXFA_NodeList::GetClassID() const {
+  return XFA_ELEMENT_NodeList;
+}
 CXFA_Node* CXFA_NodeList::NamedItem(const CFX_WideStringC& wsName) {
   uint32_t dwHashCode = FX_HashCode_GetW(wsName, false);
   int32_t iCount = GetLength();
@@ -5180,6 +5225,9 @@
 }
 CXFA_ArrayNodeList::CXFA_ArrayNodeList(CXFA_Document* pDocument)
     : CXFA_NodeList(pDocument) {}
+
+CXFA_ArrayNodeList::~CXFA_ArrayNodeList() {}
+
 void CXFA_ArrayNodeList::SetArrayNodeList(const CXFA_NodeArray& srcArray) {
   if (srcArray.GetSize() > 0) {
     m_array.Copy(srcArray);
diff --git a/xfa/fxfa/parser/xfa_parser_imp.cpp b/xfa/fxfa/parser/xfa_parser_imp.cpp
index 748cca5..9cc324a 100644
--- a/xfa/fxfa/parser/xfa_parser_imp.cpp
+++ b/xfa/fxfa/parser/xfa_parser_imp.cpp
@@ -37,6 +37,9 @@
 CXFA_SimpleParser::~CXFA_SimpleParser() {
   CloseParser();
 }
+void CXFA_SimpleParser::Release() {
+  delete this;
+}
 void CXFA_SimpleParser::SetFactory(CXFA_Document* pFactory) {
   m_pFactory = pFactory;
 }
@@ -191,6 +194,18 @@
   }
 }
 
+CXFA_Document* CXFA_SimpleParser::GetFactory() const {
+  return m_pFactory;
+}
+
+CXFA_Node* CXFA_SimpleParser::GetRootNode() const {
+  return m_pRootNode;
+}
+
+CFDE_XMLDoc* CXFA_SimpleParser::GetXMLDoc() const {
+  return m_pXMLDoc;
+}
+
 FX_BOOL XFA_FDEExtension_ResolveNamespaceQualifier(
     CFDE_XMLElement* pNode,
     const CFX_WideStringC& wsQualifier,
@@ -1347,6 +1362,10 @@
 CXFA_DocumentParser::~CXFA_DocumentParser() {
   CloseParser();
 }
+
+void CXFA_DocumentParser::Release() {
+  delete this;
+}
 int32_t CXFA_DocumentParser::StartParse(IFX_FileRead* pStream,
                                         XFA_XDPPACKET ePacketID) {
   CloseParser();
@@ -1388,6 +1407,26 @@
   }
 }
 
+CXFA_Document* CXFA_DocumentParser::GetFactory() const {
+  return m_nodeParser.GetFactory();
+}
+
+CXFA_Node* CXFA_DocumentParser::GetRootNode() const {
+  return m_nodeParser.GetRootNode();
+}
+
+CFDE_XMLDoc* CXFA_DocumentParser::GetXMLDoc() const {
+  return m_nodeParser.GetXMLDoc();
+}
+
+CXFA_FFNotify* CXFA_DocumentParser::GetNotify() const {
+  return m_pNotify;
+}
+
+CXFA_Document* CXFA_DocumentParser::GetDocument() const {
+  return m_pDocument;
+}
+
 void CXFA_DocumentParser::CloseParser() {
   delete m_pDocument;
   m_pDocument = nullptr;
@@ -1410,6 +1449,7 @@
   m_pParser = new CFDE_XMLSyntaxParser;
   m_pParser->Init(m_pStream, 32 * 1024, 1024 * 1024);
 }
+
 CXFA_XMLParser::~CXFA_XMLParser() {
   if (m_pParser) {
     m_pParser->Release();
@@ -1418,6 +1458,11 @@
   m_ws1.clear();
   m_ws2.clear();
 }
+
+void CXFA_XMLParser::Release() {
+  delete this;
+}
+
 int32_t CXFA_XMLParser::DoParser(IFX_Pause* pPause) {
   if (m_syntaxParserResult == FDE_XmlSyntaxResult::Error)
     return -1;
diff --git a/xfa/fxfa/parser/xfa_parser_imp.h b/xfa/fxfa/parser/xfa_parser_imp.h
index 1f117be..3a56cc0 100644
--- a/xfa/fxfa/parser/xfa_parser_imp.h
+++ b/xfa/fxfa/parser/xfa_parser_imp.h
@@ -17,8 +17,8 @@
   CXFA_SimpleParser(CXFA_Document* pFactory, FX_BOOL bDocumentParser = FALSE);
   ~CXFA_SimpleParser() override;
 
-  void Release() override { delete this; }
-
+  // IXFA_Parser
+  void Release() override;
   int32_t StartParse(IFX_FileRead* pStream,
                      XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP) override;
   int32_t DoParse(IFX_Pause* pPause = NULL) override;
@@ -26,9 +26,9 @@
                        CFDE_XMLNode*& pXMLNode,
                        IFX_Pause* pPause = NULL) override;
   void ConstructXFANode(CXFA_Node* pXFANode, CFDE_XMLNode* pXMLNode) override;
-  CXFA_Document* GetFactory() const override { return m_pFactory; }
-  CXFA_Node* GetRootNode() const override { return m_pRootNode; }
-  CFDE_XMLDoc* GetXMLDoc() const override { return m_pXMLDoc; }
+  CXFA_Document* GetFactory() const override;
+  CXFA_Node* GetRootNode() const override;
+  CFDE_XMLDoc* GetXMLDoc() const override;
   void CloseParser() override;
 
  protected:
@@ -87,7 +87,8 @@
   CXFA_DocumentParser(CXFA_FFNotify* pNotify);
   ~CXFA_DocumentParser() override;
 
-  void Release() override { delete this; }
+  // IXFA_Parser
+  void Release() override;
   int32_t StartParse(IFX_FileRead* pStream,
                      XFA_XDPPACKET ePacketID = XFA_XDPPACKET_XDP) override;
   int32_t DoParse(IFX_Pause* pPause = NULL) override;
@@ -95,13 +96,11 @@
                        CFDE_XMLNode*& pXMLNode,
                        IFX_Pause* pPause = NULL) override;
   void ConstructXFANode(CXFA_Node* pXFANode, CFDE_XMLNode* pXMLNode) override;
-  CXFA_Document* GetFactory() const override {
-    return m_nodeParser.GetFactory();
-  }
-  CXFA_Node* GetRootNode() const override { return m_nodeParser.GetRootNode(); }
-  CFDE_XMLDoc* GetXMLDoc() const override { return m_nodeParser.GetXMLDoc(); }
-  CXFA_FFNotify* GetNotify() const { return m_pNotify; }
-  CXFA_Document* GetDocument() const { return m_pDocument; }
+  CXFA_Document* GetFactory() const override;
+  CXFA_Node* GetRootNode() const override;
+  CFDE_XMLDoc* GetXMLDoc() const override;
+  CXFA_FFNotify* GetNotify() const;
+  CXFA_Document* GetDocument() const;
   void CloseParser() override;
 
  protected:
@@ -113,10 +112,11 @@
 class CXFA_XMLParser : public CFDE_XMLParser {
  public:
   CXFA_XMLParser(CFDE_XMLNode* pRoot, IFX_Stream* pStream);
-  ~CXFA_XMLParser();
+  ~CXFA_XMLParser() override;
 
-  virtual void Release() { delete this; }
-  virtual int32_t DoParser(IFX_Pause* pPause);
+  // CFDE_XMLParser
+  void Release() override;
+  int32_t DoParser(IFX_Pause* pPause) override;
 
   FX_FILESIZE m_nStart[2];
   size_t m_nSize[2];
diff --git a/xfa/fxfa/parser/xfa_script.h b/xfa/fxfa/parser/xfa_script.h
index 646193d..faaacee 100644
--- a/xfa/fxfa/parser/xfa_script.h
+++ b/xfa/fxfa/parser/xfa_script.h
@@ -38,10 +38,8 @@
 };
 
 struct XFA_RESOLVENODE_RS {
-  XFA_RESOLVENODE_RS()
-      : dwFlags(XFA_RESOVENODE_RSTYPE_Nodes), pScriptAttribute(NULL) {}
-
-  ~XFA_RESOLVENODE_RS() { nodes.RemoveAll(); }
+  XFA_RESOLVENODE_RS();
+  ~XFA_RESOLVENODE_RS();
 
   int32_t GetAttributeResult(CXFA_ValueArray& valueArray) const {
     if (pScriptAttribute && pScriptAttribute->eValueType == XFA_SCRIPT_Object) {
@@ -61,4 +59,10 @@
   const XFA_SCRIPTATTRIBUTEINFO* pScriptAttribute;
 };
 
+inline XFA_RESOLVENODE_RS::XFA_RESOLVENODE_RS()
+    : dwFlags(XFA_RESOVENODE_RSTYPE_Nodes), pScriptAttribute(NULL) {}
+
+inline XFA_RESOLVENODE_RS::~XFA_RESOLVENODE_RS() {
+  nodes.RemoveAll();
+}
 #endif  // XFA_FXFA_PARSER_XFA_SCRIPT_H_
diff --git a/xfa/fxfa/parser/xfa_script_datawindow.h b/xfa/fxfa/parser/xfa_script_datawindow.h
index 7754f04..d896a71 100644
--- a/xfa/fxfa/parser/xfa_script_datawindow.h
+++ b/xfa/fxfa/parser/xfa_script_datawindow.h
@@ -13,7 +13,8 @@
 class CScript_DataWindow : public CXFA_OrdinaryObject {
  public:
   CScript_DataWindow(CXFA_Document* pDocument);
-  virtual ~CScript_DataWindow();
+  ~CScript_DataWindow() override;
+
   void Script_DataWindow_MoveCurrentRecord(CFXJSE_Arguments* pArguments);
   void Script_DataWindow_Record(CFXJSE_Arguments* pArguments);
   void Script_DataWindow_GotoRecord(CFXJSE_Arguments* pArguments);
diff --git a/xfa/fxfa/parser/xfa_script_eventpseudomodel.h b/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
index 378f56f..3a53b0b 100644
--- a/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_eventpseudomodel.h
@@ -33,7 +33,7 @@
 class CScript_EventPseudoModel : public CXFA_OrdinaryObject {
  public:
   explicit CScript_EventPseudoModel(CXFA_Document* pDocument);
-  virtual ~CScript_EventPseudoModel();
+  ~CScript_EventPseudoModel() override;
 
   void Script_EventPseudoModel_Change(CFXJSE_Value* pValue,
                                       FX_BOOL bSetting,
diff --git a/xfa/fxfa/parser/xfa_script_hostpseudomodel.h b/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
index 8a186fb..0cbe04a 100644
--- a/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_hostpseudomodel.h
@@ -14,7 +14,7 @@
 class CScript_HostPseudoModel : public CXFA_OrdinaryObject {
  public:
   CScript_HostPseudoModel(CXFA_Document* pDocument);
-  virtual ~CScript_HostPseudoModel();
+  ~CScript_HostPseudoModel() override;
 
   void Script_HostPseudoModel_AppType(CFXJSE_Value* pValue,
                                       FX_BOOL bSetting,
diff --git a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
index 2fb0dba..02e25b4 100644
--- a/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_layoutpseudomodel.h
@@ -21,7 +21,7 @@
 class CScript_LayoutPseudoModel : public CXFA_OrdinaryObject {
  public:
   explicit CScript_LayoutPseudoModel(CXFA_Document* pDocument);
-  ~CScript_LayoutPseudoModel();
+  ~CScript_LayoutPseudoModel() override;
 
   void Script_LayoutPseudoModel_Ready(CFXJSE_Value* pValue,
                                       FX_BOOL bSetting,
diff --git a/xfa/fxfa/parser/xfa_script_logpseudomodel.h b/xfa/fxfa/parser/xfa_script_logpseudomodel.h
index 1e13cd0..9e30641 100644
--- a/xfa/fxfa/parser/xfa_script_logpseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_logpseudomodel.h
@@ -13,7 +13,7 @@
 class CScript_LogPseudoModel : public CXFA_OrdinaryObject {
  public:
   explicit CScript_LogPseudoModel(CXFA_Document* pDocument);
-  virtual ~CScript_LogPseudoModel();
+  ~CScript_LogPseudoModel() override;
 
   void Script_LogPseudoModel_Message(CFXJSE_Arguments* pArguments);
   void Script_LogPseudoModel_TraceEnabled(CFXJSE_Arguments* pArguments);
diff --git a/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp b/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp
index c2101f7..2e61a06 100644
--- a/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp
+++ b/xfa/fxfa/parser/xfa_script_resolveprocessor.cpp
@@ -822,3 +822,19 @@
     iIndex = iCount - 1;
   }
 }
+
+CXFA_ResolveNodesData::CXFA_ResolveNodesData(CXFA_ScriptContext* pSC)
+    : m_pSC(pSC),
+      m_CurNode(NULL),
+      m_wsName(),
+      m_uHashName(XFA_HASHCODE_None),
+      m_wsCondition(),
+      m_nLevel(0),
+      m_Nodes(),
+      m_dwStyles(XFA_RESOLVENODE_Children),
+      m_pScriptAttribute(NULL),
+      m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) {}
+
+CXFA_ResolveNodesData::~CXFA_ResolveNodesData() {
+  m_Nodes.RemoveAll();
+}
diff --git a/xfa/fxfa/parser/xfa_script_resolveprocessor.h b/xfa/fxfa/parser/xfa_script_resolveprocessor.h
index 9789ffd..0d932ef 100644
--- a/xfa/fxfa/parser/xfa_script_resolveprocessor.h
+++ b/xfa/fxfa/parser/xfa_script_resolveprocessor.h
@@ -15,18 +15,9 @@
 
 class CXFA_ResolveNodesData {
  public:
-  CXFA_ResolveNodesData(CXFA_ScriptContext* pSC = NULL)
-      : m_pSC(pSC),
-        m_CurNode(NULL),
-        m_wsName(),
-        m_uHashName(XFA_HASHCODE_None),
-        m_wsCondition(),
-        m_nLevel(0),
-        m_Nodes(),
-        m_dwStyles(XFA_RESOLVENODE_Children),
-        m_pScriptAttribute(NULL),
-        m_dwFlag(XFA_RESOVENODE_RSTYPE_Nodes) {}
-  ~CXFA_ResolveNodesData() { m_Nodes.RemoveAll(); }
+  CXFA_ResolveNodesData(CXFA_ScriptContext* pSC = NULL);
+  ~CXFA_ResolveNodesData();
+
   CXFA_ScriptContext* m_pSC;
   CXFA_Object* m_CurNode;
   CFX_WideString m_wsName;
diff --git a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
index bba0fd5..3339ff0 100644
--- a/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
+++ b/xfa/fxfa/parser/xfa_script_signaturepseudomodel.h
@@ -13,7 +13,8 @@
 class CScript_SignaturePseudoModel : public CXFA_OrdinaryObject {
  public:
   CScript_SignaturePseudoModel(CXFA_Document* pDocument);
-  ~CScript_SignaturePseudoModel();
+  ~CScript_SignaturePseudoModel() override;
+
   void Script_SignaturePseudoModel_Verify(CFXJSE_Arguments* pArguments);
   void Script_SignaturePseudoModel_Sign(CFXJSE_Arguments* pArguments);
   void Script_SignaturePseudoModel_Enumerate(CFXJSE_Arguments* pArguments);
