diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 375a319..50fa503 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -57,18 +57,9 @@
     XFA_AttributeEnum::Unknown,
 };
 
-CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc)
-    : m_bLayoutEvent(false),
-      m_pListFocusWidget(nullptr),
-      m_bInLayoutStatus(false),
-      m_pDoc(pDoc),
-      m_pXFADocLayout(nullptr),
-      m_iStatus(XFA_DOCVIEW_LAYOUTSTATUS_None),
-      m_iLock(0) {}
+CXFA_FFDocView::CXFA_FFDocView(CXFA_FFDoc* pDoc) : m_pDoc(pDoc) {}
 
-CXFA_FFDocView::~CXFA_FFDocView() {
-  DestroyDocView();
-}
+CXFA_FFDocView::~CXFA_FFDocView() {}
 
 void CXFA_FFDocView::InitLayout(CXFA_Node* pNode) {
   RunBindItems();
@@ -76,7 +67,7 @@
   ExecEventActivityByDeepFirst(pNode, XFA_EVENT_IndexChange, false, true);
 }
 
-int32_t CXFA_FFDocView::StartLayout(int32_t iStartPage) {
+int32_t CXFA_FFDocView::StartLayout() {
   m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_Start;
   m_pDoc->GetXFADoc()->DoProtoMerge();
   m_pDoc->GetXFADoc()->DoDataMerge();
@@ -273,16 +264,6 @@
                    : nullptr;
 }
 
-void CXFA_FFDocView::KillFocus() {
-  if (m_pFocusWidget &&
-      (m_pFocusWidget->GetStatus() & XFA_WidgetStatus_Focused)) {
-    m_pFocusWidget->OnKillFocus(nullptr);
-  }
-  m_pFocusAcc = nullptr;
-  m_pFocusWidget = nullptr;
-  m_pOldFocusWidget = nullptr;
-}
-
 bool CXFA_FFDocView::SetFocus(CXFA_FFWidget* hWidget) {
   CXFA_FFWidget* pNewFocus = hWidget;
   if (m_pOldFocusWidget == pNewFocus)
@@ -308,13 +289,6 @@
     return false;
 
   pNewFocus = m_pOldFocusWidget.Get();
-  if (m_pListFocusWidget && pNewFocus == m_pListFocusWidget) {
-    m_pFocusAcc = nullptr;
-    m_pFocusWidget = nullptr;
-    m_pListFocusWidget = nullptr;
-    m_pOldFocusWidget = nullptr;
-    return false;
-  }
   if (pNewFocus && (pNewFocus->GetStatus() & XFA_WidgetStatus_Visible)) {
     if (!pNewFocus->IsLoaded())
       pNewFocus->LoadWidget();
@@ -471,11 +445,6 @@
 }
 
 
-void CXFA_FFDocView::AddInvalidateRect(CXFA_FFWidget* pWidget,
-                                       const CFX_RectF& rtInvalidate) {
-  AddInvalidateRect(pWidget->GetPageView(), rtInvalidate);
-}
-
 void CXFA_FFDocView::AddInvalidateRect(CXFA_FFPageView* pPageView,
                                        const CFX_RectF& rtInvalidate) {
   if (m_mapPageInvalidate[pPageView]) {
@@ -545,15 +514,6 @@
   ExecEventActivityByDeepFirst(pRootItem, XFA_EVENT_DocClose, false, true);
 }
 
-void CXFA_FFDocView::DestroyDocView() {
-  ClearInvalidateList();
-  m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
-  m_iLock = 0;
-  m_ValidateAccs.clear();
-  m_BindItems.clear();
-  m_CalculateAccs.clear();
-}
-
 void CXFA_FFDocView::AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc) {
   CXFA_WidgetAcc* pCurrentAcc =
       !m_CalculateAccs.empty() ? m_CalculateAccs.back() : nullptr;
diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h
index 72563dd..d21d64c 100644
--- a/xfa/fxfa/cxfa_ffdocview.h
+++ b/xfa/fxfa/cxfa_ffdocview.h
@@ -47,7 +47,7 @@
   ~CXFA_FFDocView();
 
   CXFA_FFDoc* GetDoc() { return m_pDoc.Get(); }
-  int32_t StartLayout(int32_t iStartPage = 0);
+  int32_t StartLayout();
   int32_t DoLayout();
   void StopLayout();
   int32_t GetLayoutStatus() const { return m_iStatus; }
@@ -59,7 +59,6 @@
   CXFA_FFWidgetHandler* GetWidgetHandler();
   std::unique_ptr<CXFA_ReadyNodeIterator> CreateReadyNodeIterator();
   CXFA_FFWidget* GetFocusWidget() const { return m_pFocusWidget.Get(); }
-  void KillFocus();
   bool SetFocus(CXFA_FFWidget* hWidget);
   CXFA_FFWidget* GetWidgetForNode(CXFA_Node* node);
   CXFA_FFWidget* GetWidgetByName(const WideString& wsName,
@@ -68,31 +67,20 @@
   void OnPageEvent(CXFA_ContainerLayoutItem* pSender, uint32_t dwEvent);
   void LockUpdate() { m_iLock++; }
   void UnlockUpdate() { m_iLock--; }
-  bool IsUpdateLocked() { return m_iLock > 0; }
-  void ClearInvalidateList() { m_mapPageInvalidate.clear(); }
-  void AddInvalidateRect(CXFA_FFWidget* pWidget, const CFX_RectF& rtInvalidate);
   void AddInvalidateRect(CXFA_FFPageView* pPageView,
                          const CFX_RectF& rtInvalidate);
   void RunInvalidate();
   void RunDocClose();
-  void DestroyDocView();
 
   void ProcessValueChanged(CXFA_WidgetAcc* widgetAcc);
 
-  bool InitValidate(CXFA_Node* pNode);
-  bool RunValidate();
-
   void SetChangeMark();
 
   void AddValidateWidget(CXFA_WidgetAcc* pWidget);
   void AddCalculateNodeNotify(CXFA_Node* pNodeChange);
   void AddCalculateWidgetAcc(CXFA_WidgetAcc* pWidgetAcc);
-  int32_t RunCalculateWidgets();
-  bool IsStaticNotify() {
-    return m_pDoc->GetFormType() == FormType::kXFAForeground;
-  }
+
   bool RunLayout();
-  void RunSubformIndexChange();
   void AddNewFormNode(CXFA_Node* pNode);
   void AddIndexChangedSubform(CXFA_Node* pNode);
   CXFA_WidgetAcc* GetFocusWidgetAcc() const { return m_pFocusAcc.Get(); }
@@ -105,10 +93,9 @@
 
   void AddBindItem(CXFA_BindItems* item) { m_BindItems.push_back(item); }
 
-  bool m_bLayoutEvent;
+  bool m_bLayoutEvent = false;
+  bool m_bInLayoutStatus = false;
   std::vector<WideString> m_arrNullTestMsg;
-  CXFA_FFWidget* m_pListFocusWidget;
-  bool m_bInLayoutStatus;
 
  private:
   bool RunEventLayoutReady();
@@ -120,9 +107,15 @@
   bool ResetSingleNodeData(CXFA_Node* pNode);
   CXFA_Subform* GetRootSubform();
 
+  bool IsUpdateLocked() { return m_iLock > 0; }
+  bool InitValidate(CXFA_Node* pNode);
+  bool RunValidate();
+  int32_t RunCalculateWidgets();
+  void RunSubformIndexChange();
+
   UnownedPtr<CXFA_FFDoc> const m_pDoc;
   std::unique_ptr<CXFA_FFWidgetHandler> m_pWidgetHandler;
-  CXFA_LayoutProcessor* m_pXFADocLayout;  // Not owned.
+  CXFA_LayoutProcessor* m_pXFADocLayout = nullptr;  // Not owned.
   UnownedPtr<CXFA_WidgetAcc> m_pFocusAcc;
   UnownedPtr<CXFA_FFWidget> m_pFocusWidget;
   UnownedPtr<CXFA_FFWidget> m_pOldFocusWidget;
@@ -132,8 +125,8 @@
   std::vector<CXFA_BindItems*> m_BindItems;
   std::vector<CXFA_Node*> m_NewAddedNodes;
   std::vector<CXFA_Node*> m_IndexChangedSubforms;
-  XFA_DOCVIEW_LAYOUTSTATUS m_iStatus;
-  int32_t m_iLock;
+  XFA_DOCVIEW_LAYOUTSTATUS m_iStatus = XFA_DOCVIEW_LAYOUTSTATUS_None;
+  int32_t m_iLock = 0;
 };
 
 #endif  // XFA_FXFA_CXFA_FFDOCVIEW_H_
