Remove dead code from CPDF_InterForm.
Clean up related code.
Review-Url: https://codereview.chromium.org/2003853003
diff --git a/core/fpdfdoc/doc_form.cpp b/core/fpdfdoc/doc_form.cpp
index 7c81f0e..7357f0a 100644
--- a/core/fpdfdoc/doc_form.cpp
+++ b/core/fpdfdoc/doc_form.cpp
@@ -260,14 +260,13 @@
   }
   return pNode;
 }
-CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bGenerateAP)
+
+CPDF_InterForm::CPDF_InterForm(CPDF_Document* pDocument)
     : CFX_PrivateData(),
       m_pDocument(pDocument),
-      m_bGenerateAP(bGenerateAP),
       m_pFormDict(nullptr),
       m_pFieldTree(new CFieldTree),
-      m_pFormNotify(nullptr),
-      m_bUpdated(FALSE) {
+      m_pFormNotify(nullptr) {
   CPDF_Dictionary* pRoot = m_pDocument->GetRoot();
   if (!pRoot)
     return;
@@ -732,47 +731,38 @@
   return it != m_ControlMap.end() ? it->second : nullptr;
 }
 
-FX_BOOL CPDF_InterForm::NeedConstructAP() {
+FX_BOOL CPDF_InterForm::NeedConstructAP() const {
   return m_pFormDict && m_pFormDict->GetBooleanBy("NeedAppearances");
 }
-void CPDF_InterForm::NeedConstructAP(FX_BOOL bNeedAP) {
-  if (!m_pFormDict) {
-    InitInterFormDict(m_pFormDict, m_pDocument);
-  }
-  m_pFormDict->SetAtBoolean("NeedAppearances", bNeedAP);
-  m_bGenerateAP = bNeedAP;
-}
 
 int CPDF_InterForm::CountFieldsInCalculationOrder() {
-  if (!m_pFormDict) {
+  if (!m_pFormDict)
     return 0;
-  }
+
   CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO");
   return pArray ? pArray->GetCount() : 0;
 }
 
 CPDF_FormField* CPDF_InterForm::GetFieldInCalculationOrder(int index) {
-  if (!m_pFormDict || index < 0) {
-    return NULL;
-  }
+  if (!m_pFormDict || index < 0)
+    return nullptr;
+
   CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO");
-  if (!pArray) {
-    return NULL;
-  }
-  if (CPDF_Dictionary* pElement =
-          ToDictionary(pArray->GetDirectObjectAt(index))) {
-    return GetFieldByDict(pElement);
-  }
-  return NULL;
+  if (!pArray)
+    return nullptr;
+
+  CPDF_Dictionary* pElement = ToDictionary(pArray->GetDirectObjectAt(index));
+  return pElement ? GetFieldByDict(pElement) : nullptr;
 }
+
 int CPDF_InterForm::FindFieldInCalculationOrder(const CPDF_FormField* pField) {
-  if (!m_pFormDict || !pField) {
+  if (!m_pFormDict || !pField)
     return -1;
-  }
+
   CPDF_Array* pArray = m_pFormDict->GetArrayBy("CO");
-  if (!pArray) {
+  if (!pArray)
     return -1;
-  }
+
   for (size_t i = 0; i < pArray->GetCount(); i++) {
     CPDF_Object* pElement = pArray->GetDirectObjectAt(i);
     if (pElement == pField->m_pDict) {
@@ -781,9 +771,11 @@
   }
   return -1;
 }
+
 uint32_t CPDF_InterForm::CountFormFonts() {
   return CountInterFormFonts(m_pFormDict);
 }
+
 CPDF_Font* CPDF_InterForm::GetFormFont(uint32_t index,
                                        CFX_ByteString& csNameTag) {
   return GetInterFormFont(m_pFormDict, m_pDocument, index, csNameTag);
@@ -815,23 +807,22 @@
 void CPDF_InterForm::AddFormFont(const CPDF_Font* pFont,
                                  CFX_ByteString& csNameTag) {
   AddInterFormFont(m_pFormDict, m_pDocument, pFont, csNameTag);
-  m_bUpdated = TRUE;
 }
+
 CPDF_Font* CPDF_InterForm::AddNativeFormFont(uint8_t charSet,
                                              CFX_ByteString& csNameTag) {
-  m_bUpdated = TRUE;
   return AddNativeInterFormFont(m_pFormDict, m_pDocument, charSet, csNameTag);
 }
+
 CPDF_Font* CPDF_InterForm::AddNativeFormFont(CFX_ByteString& csNameTag) {
-  m_bUpdated = TRUE;
   return AddNativeInterFormFont(m_pFormDict, m_pDocument, csNameTag);
 }
+
 void CPDF_InterForm::RemoveFormFont(const CPDF_Font* pFont) {
-  m_bUpdated = TRUE;
   RemoveInterFormFont(m_pFormDict, pFont);
 }
+
 void CPDF_InterForm::RemoveFormFont(CFX_ByteString csNameTag) {
-  m_bUpdated = TRUE;
   RemoveInterFormFont(m_pFormDict, csNameTag);
 }
 
@@ -1171,42 +1162,37 @@
       m_pFormNotify->AfterValueChange(pField);
     }
   }
-  if (CPDF_InterForm::m_bUpdateAP) {
-    pField->UpdateAP(NULL);
-  }
 }
+
 FX_BOOL CPDF_InterForm::ImportFromFDF(const CFDF_Document* pFDF,
                                       FX_BOOL bNotify) {
-  if (!pFDF) {
+  if (!pFDF)
     return FALSE;
-  }
+
   CPDF_Dictionary* pMainDict = pFDF->GetRoot()->GetDictBy("FDF");
-  if (!pMainDict) {
+  if (!pMainDict)
     return FALSE;
-  }
+
   CPDF_Array* pFields = pMainDict->GetArrayBy("Fields");
-  if (!pFields) {
+  if (!pFields)
     return FALSE;
-  }
+
   m_bsEncoding = pMainDict->GetStringBy("Encoding");
-  if (bNotify && m_pFormNotify) {
-    int iRet = m_pFormNotify->BeforeFormImportData(this);
-    if (iRet < 0) {
-      return FALSE;
-    }
-  }
+  if (bNotify && m_pFormNotify && m_pFormNotify->BeforeFormImportData(this) < 0)
+    return FALSE;
+
   for (size_t i = 0; i < pFields->GetCount(); i++) {
     CPDF_Dictionary* pField = pFields->GetDictAt(i);
-    if (!pField) {
+    if (!pField)
       continue;
-    }
+
     FDF_ImportField(pField, L"", bNotify);
   }
-  if (bNotify && m_pFormNotify) {
+  if (bNotify && m_pFormNotify)
     m_pFormNotify->AfterFormImportData(this);
-  }
   return TRUE;
 }
-void CPDF_InterForm::SetFormNotify(const CPDF_FormNotify* pNotify) {
-  m_pFormNotify = (CPDF_FormNotify*)pNotify;
+
+void CPDF_InterForm::SetFormNotify(IPDF_FormNotify* pNotify) {
+  m_pFormNotify = pNotify;
 }
diff --git a/core/fpdfdoc/doc_formcontrol.cpp b/core/fpdfdoc/doc_formcontrol.cpp
index aa6cf98..9b3cf1e 100644
--- a/core/fpdfdoc/doc_formcontrol.cpp
+++ b/core/fpdfdoc/doc_formcontrol.cpp
@@ -13,34 +13,43 @@
 #include "core/fpdfapi/fpdf_render/include/cpdf_rendercontext.h"
 #include "core/fpdfdoc/include/fpdf_doc.h"
 
+namespace {
+
+const FX_CHAR* const g_sHighlightingMode[] = {
+    // Must match order of HighlightingMode enum.
+    "N", "I", "O", "P", "T"};
+
+}  // namespace
+
 CPDF_FormControl::CPDF_FormControl(CPDF_FormField* pField,
-                                   CPDF_Dictionary* pWidgetDict) {
-  m_pField = pField;
-  m_pWidgetDict = pWidgetDict;
-  m_pForm = m_pField->m_pForm;
-}
+                                   CPDF_Dictionary* pWidgetDict)
+    : m_pField(pField),
+      m_pWidgetDict(pWidgetDict),
+      m_pForm(m_pField->m_pForm) {}
+
 CFX_FloatRect CPDF_FormControl::GetRect() const {
   return m_pWidgetDict->GetRectBy("Rect");
 }
+
 CFX_ByteString CPDF_FormControl::GetOnStateName() const {
   ASSERT(GetType() == CPDF_FormField::CheckBox ||
          GetType() == CPDF_FormField::RadioButton);
   CFX_ByteString csOn;
   CPDF_Dictionary* pAP = m_pWidgetDict->GetDictBy("AP");
-  if (!pAP) {
+  if (!pAP)
     return csOn;
-  }
+
   CPDF_Dictionary* pN = pAP->GetDictBy("N");
-  if (!pN) {
+  if (!pN)
     return csOn;
-  }
+
   for (const auto& it : *pN) {
-    if (it.first != "Off") {
+    if (it.first != "Off")
       return it.first;
-    }
   }
   return CFX_ByteString();
 }
+
 void CPDF_FormControl::SetOnStateName(const CFX_ByteString& csOn) {
   ASSERT(GetType() == CPDF_FormField::CheckBox ||
          GetType() == CPDF_FormField::RadioButton);
@@ -99,7 +108,8 @@
     csOn = "Yes";
   return csOn;
 }
-CFX_WideString CPDF_FormControl::GetExportValue() {
+
+CFX_WideString CPDF_FormControl::GetExportValue() const {
   ASSERT(GetType() == CPDF_FormField::CheckBox ||
          GetType() == CPDF_FormField::RadioButton);
   CFX_ByteString csOn = GetOnStateName();
@@ -111,11 +121,9 @@
       csOn = pArray->GetStringAt(iIndex);
     }
   }
-  if (csOn.IsEmpty()) {
+  if (csOn.IsEmpty())
     csOn = "Yes";
-  }
-  CFX_WideString csWOn = PDF_DecodeText(csOn);
-  return csWOn;
+  return PDF_DecodeText(csOn);
 }
 
 bool CPDF_FormControl::IsChecked() const {
@@ -144,29 +152,25 @@
   CFX_ByteString csOn = GetOnStateName();
   CFX_ByteString csOldAS = m_pWidgetDict->GetStringBy("AS", "Off");
   CFX_ByteString csAS = "Off";
-  if (bChecked) {
+  if (bChecked)
     csAS = csOn;
-  }
-  if (csOldAS == csAS) {
+  if (csOldAS == csAS)
     return;
-  }
   m_pWidgetDict->SetAtName("AS", csAS);
-  m_pForm->m_bUpdated = TRUE;
 }
-CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict,
-                                CPDF_Annot::AppearanceMode mode);
+
 void CPDF_FormControl::DrawControl(CFX_RenderDevice* pDevice,
                                    CFX_Matrix* pMatrix,
                                    CPDF_Page* pPage,
                                    CPDF_Annot::AppearanceMode mode,
                                    const CPDF_RenderOptions* pOptions) {
-  if (m_pWidgetDict->GetIntegerBy("F") & ANNOTFLAG_HIDDEN) {
+  if (m_pWidgetDict->GetIntegerBy("F") & ANNOTFLAG_HIDDEN)
     return;
-  }
+
   CPDF_Stream* pStream = FPDFDOC_GetAnnotAP(m_pWidgetDict, mode);
-  if (!pStream) {
+  if (!pStream)
     return;
-  }
+
   CFX_FloatRect form_bbox = pStream->GetDict()->GetRectBy("BBox");
   CFX_Matrix form_matrix = pStream->GetDict()->GetMatrixBy("Matrix");
   form_matrix.TransformRect(form_bbox);
@@ -181,15 +185,13 @@
   context.AppendLayer(&form, &matrix);
   context.Render(pDevice, pOptions, nullptr);
 }
-static const FX_CHAR* const g_sHighlightingMode[] = {
-    // Must match order of HiglightingMode enum.
-    "N", "I", "O", "P", "T", nullptr};
+
 CPDF_FormControl::HighlightingMode CPDF_FormControl::GetHighlightingMode() {
-  if (!m_pWidgetDict) {
+  if (!m_pWidgetDict)
     return Invert;
-  }
+
   CFX_ByteString csH = m_pWidgetDict->GetStringBy("H", "I");
-  for (int i = 0; g_sHighlightingMode[i]; ++i) {
+  for (size_t i = 0; i < FX_ArraySize(g_sHighlightingMode); ++i) {
     if (csH == g_sHighlightingMode[i])
       return static_cast<HighlightingMode>(i);
   }
@@ -241,16 +243,16 @@
 }
 
 CPDF_Action CPDF_FormControl::GetAction() {
-  if (!m_pWidgetDict) {
+  if (!m_pWidgetDict)
     return CPDF_Action();
-  }
-  if (m_pWidgetDict->KeyExist("A")) {
+
+  if (m_pWidgetDict->KeyExist("A"))
     return CPDF_Action(m_pWidgetDict->GetDictBy("A"));
-  }
+
   CPDF_Object* pObj = FPDF_GetFieldAttr(m_pField->m_pDict, "A");
-  if (!pObj) {
+  if (!pObj)
     return CPDF_Action();
-  }
+
   return CPDF_Action(pObj->GetDict());
 }
 
diff --git a/core/fpdfdoc/doc_formfield.cpp b/core/fpdfdoc/doc_formfield.cpp
index 9849fa1..310f075 100644
--- a/core/fpdfdoc/doc_formfield.cpp
+++ b/core/fpdfdoc/doc_formfield.cpp
@@ -14,25 +14,28 @@
 #include "core/fpdfdoc/doc_utils.h"
 #include "core/fpdfdoc/include/fpdf_doc.h"
 
-FX_BOOL PDF_FormField_IsUnison(CPDF_FormField* pField) {
-  FX_BOOL bUnison = FALSE;
-  if (pField->GetType() == CPDF_FormField::CheckBox) {
-    bUnison = TRUE;
-  } else {
-    uint32_t dwFlags = pField->GetFieldFlags();
-    bUnison = ((dwFlags & 0x2000000) != 0);
-  }
-  return bUnison;
+namespace {
+
+bool PDF_FormField_IsUnison(CPDF_FormField* pField) {
+  if (pField->GetType() == CPDF_FormField::CheckBox)
+    return true;
+
+  return (pField->GetFieldFlags() & 0x2000000) != 0;
 }
-CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict) {
-  m_pDict = pDict;
-  m_Type = Unknown;
-  m_pForm = pForm;
-  m_pFont = NULL;
-  m_FontSize = 0;
+
+}  // namespace
+
+CPDF_FormField::CPDF_FormField(CPDF_InterForm* pForm, CPDF_Dictionary* pDict)
+    : m_Type(Unknown),
+      m_pForm(pForm),
+      m_pDict(pDict),
+      m_FontSize(0),
+      m_pFont(nullptr) {
   SyncFieldFlags();
 }
+
 CPDF_FormField::~CPDF_FormField() {}
+
 void CPDF_FormField::SyncFieldFlags() {
   CFX_ByteString type_name = FPDF_GetFieldAttr(m_pDict, "FT")
                                  ? FPDF_GetFieldAttr(m_pDict, "FT")->GetString()
@@ -105,6 +108,7 @@
 CFX_WideString CPDF_FormField::GetFullName() {
   return ::GetFullName(m_pDict);
 }
+
 FX_BOOL CPDF_FormField::ResetField(FX_BOOL bNotify) {
   switch (m_Type) {
     case CPDF_FormField::CheckBox:
@@ -127,41 +131,20 @@
         m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
       }
     } break;
-    case CPDF_FormField::ComboBox: {
-      CFX_WideString csValue;
-      ClearSelection();
-      int iIndex = GetDefaultSelectedItem();
-      if (iIndex >= 0) {
-        csValue = GetOptionLabel(iIndex);
-      }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-        if (iRet < 0) {
-          return FALSE;
-        }
-      }
-      SetItemSelection(iIndex, TRUE);
-      if (bNotify && m_pForm->m_pFormNotify) {
-        m_pForm->m_pFormNotify->AfterValueChange(this);
-      }
-    } break;
+    case CPDF_FormField::ComboBox:
     case CPDF_FormField::ListBox: {
       CFX_WideString csValue;
       ClearSelection();
       int iIndex = GetDefaultSelectedItem();
-      if (iIndex >= 0) {
+      if (iIndex >= 0)
         csValue = GetOptionLabel(iIndex);
-      }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-        if (iRet < 0) {
-          return FALSE;
-        }
-      }
+
+      if (bNotify && !NotifyListOrComboBoxBeforeChange(csValue))
+        return FALSE;
+
       SetItemSelection(iIndex, TRUE);
-      if (bNotify && m_pForm->m_pFormNotify) {
-        m_pForm->m_pFormNotify->AfterSelectionChange(this);
-      }
+      if (bNotify)
+        NotifyListOrComboBoxAfterChange();
     } break;
     case CPDF_FormField::Text:
     case CPDF_FormField::RichText:
@@ -169,29 +152,26 @@
     default: {
       CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict, "DV");
       CFX_WideString csDValue;
-      if (pDV) {
+      if (pDV)
         csDValue = pDV->GetUnicodeText();
-      }
+
       CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict, "V");
       CFX_WideString csValue;
-      if (pV) {
+      if (pV)
         csValue = pV->GetUnicodeText();
-      }
+
       CPDF_Object* pRV = FPDF_GetFieldAttr(m_pDict, "RV");
-      if (!pRV && (csDValue == csValue)) {
+      if (!pRV && (csDValue == csValue))
         return FALSE;
-      }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csDValue);
-        if (iRet < 0) {
-          return FALSE;
-        }
-      }
+
+      if (bNotify && !NotifyBeforeValueChange(csDValue))
+        return FALSE;
+
       if (pDV) {
         CPDF_Object* pClone = pDV->Clone();
-        if (!pClone) {
+        if (!pClone)
           return FALSE;
-        }
+
         m_pDict->SetAt("V", pClone);
         if (pRV) {
           CPDF_Object* pCloneR = pDV->Clone();
@@ -201,18 +181,17 @@
         m_pDict->RemoveAt("V");
         m_pDict->RemoveAt("RV");
       }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        m_pForm->m_pFormNotify->AfterValueChange(this);
-      }
-      m_pForm->m_bUpdated = TRUE;
+      if (bNotify)
+        NotifyAfterValueChange();
     } break;
   }
   return TRUE;
 }
+
 int CPDF_FormField::GetControlIndex(const CPDF_FormControl* pControl) {
-  if (!pControl) {
+  if (!pControl)
     return -1;
-  }
+
   for (int i = 0; i < m_ControlList.GetSize(); i++) {
     if (m_ControlList.GetAt(i) == pControl)
       return i;
@@ -284,9 +263,9 @@
   return pObj->GetUnicodeText();
 }
 CFX_WideString CPDF_FormField::GetValue(FX_BOOL bDefault) {
-  if (GetType() == CheckBox || GetType() == RadioButton) {
+  if (GetType() == CheckBox || GetType() == RadioButton)
     return GetCheckValue(bDefault);
-  }
+
   CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, bDefault ? "DV" : "V");
   if (!pValue) {
     if (!bDefault) {
@@ -297,9 +276,8 @@
         pValue = FPDF_GetFieldAttr(m_pDict, "DV");
       }
     }
-    if (!pValue) {
+    if (!pValue)
       return CFX_WideString();
-    }
   }
   switch (pValue->GetType()) {
     case CPDF_Object::STRING:
@@ -315,12 +293,15 @@
   }
   return CFX_WideString();
 }
+
 CFX_WideString CPDF_FormField::GetValue() {
   return GetValue(FALSE);
 }
+
 CFX_WideString CPDF_FormField::GetDefaultValue() {
   return GetValue(TRUE);
 }
+
 FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value,
                                  FX_BOOL bDefault,
                                  FX_BOOL bNotify) {
@@ -335,70 +316,55 @@
     case Text:
     case ComboBox: {
       CFX_WideString csValue = value;
-      if (bNotify && m_pForm->m_pFormNotify) {
-        int iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-        if (iRet < 0) {
-          return FALSE;
-        }
-      }
+      if (bNotify && !NotifyBeforeValueChange(csValue))
+        return FALSE;
+
       int iIndex = FindOptionValue(csValue);
       if (iIndex < 0) {
         CFX_ByteString bsEncodeText = PDF_EncodeText(csValue);
         m_pDict->SetAtString(bDefault ? "DV" : "V", bsEncodeText);
-        if (m_Type == RichText && !bDefault) {
+        if (m_Type == RichText && !bDefault)
           m_pDict->SetAtString("RV", bsEncodeText);
-        }
         m_pDict->RemoveAt("I");
       } else {
         m_pDict->SetAtString(bDefault ? "DV" : "V", PDF_EncodeText(csValue));
-        if (bDefault) {
-        } else {
+        if (!bDefault) {
           ClearSelection();
           SetItemSelection(iIndex, TRUE);
         }
       }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        m_pForm->m_pFormNotify->AfterValueChange(this);
-      }
-      m_pForm->m_bUpdated = TRUE;
+      if (bNotify)
+        NotifyAfterValueChange();
     } break;
     case ListBox: {
       int iIndex = FindOptionValue(value);
-      if (iIndex < 0) {
+      if (iIndex < 0)
         return FALSE;
-      }
-      if (bDefault && iIndex == GetDefaultSelectedItem()) {
+
+      if (bDefault && iIndex == GetDefaultSelectedItem())
         return FALSE;
-      }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        CFX_WideString csValue = value;
-        int iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-        if (iRet < 0) {
-          return FALSE;
-        }
-      }
-      if (bDefault) {
-      } else {
+
+      if (bNotify && !NotifyBeforeSelectionChange(value))
+        return FALSE;
+
+      if (!bDefault) {
         ClearSelection();
         SetItemSelection(iIndex, TRUE);
       }
-      if (bNotify && m_pForm->m_pFormNotify) {
-        m_pForm->m_pFormNotify->AfterSelectionChange(this);
-      }
-      m_pForm->m_bUpdated = TRUE;
+      if (bNotify)
+        NotifyAfterSelectionChange();
       break;
     }
     default:
       break;
   }
-  if (CPDF_InterForm::m_bUpdateAP) {
-    UpdateAP(NULL);
-  }
   return TRUE;
 }
+
 FX_BOOL CPDF_FormField::SetValue(const CFX_WideString& value, FX_BOOL bNotify) {
   return SetValue(value, FALSE, bNotify);
 }
+
 int CPDF_FormField::GetMaxLen() {
   if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "MaxLen"))
     return pObj->GetInteger();
@@ -467,38 +433,21 @@
   }
   return -1;
 }
+
 FX_BOOL CPDF_FormField::ClearSelection(FX_BOOL bNotify) {
   if (bNotify && m_pForm->m_pFormNotify) {
-    int iRet = 0;
     CFX_WideString csValue;
     int iIndex = GetSelectedIndex(0);
-    if (iIndex >= 0) {
+    if (iIndex >= 0)
       csValue = GetOptionLabel(iIndex);
-    }
-    if (GetType() == ListBox) {
-      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-    }
-    if (GetType() == ComboBox) {
-      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-    }
-    if (iRet < 0) {
+
+    if (!NotifyListOrComboBoxBeforeChange(csValue))
       return FALSE;
-    }
   }
   m_pDict->RemoveAt("V");
   m_pDict->RemoveAt("I");
-  if (bNotify && m_pForm->m_pFormNotify) {
-    if (GetType() == ListBox) {
-      m_pForm->m_pFormNotify->AfterSelectionChange(this);
-    }
-    if (GetType() == ComboBox) {
-      m_pForm->m_pFormNotify->AfterValueChange(this);
-    }
-  }
-  if (CPDF_InterForm::m_bUpdateAP) {
-    UpdateAP(NULL);
-  }
-  m_pForm->m_bUpdated = TRUE;
+  if (bNotify)
+    NotifyListOrComboBoxAfterChange();
   return TRUE;
 }
 
@@ -551,51 +500,15 @@
                                          FX_BOOL bSelected,
                                          FX_BOOL bNotify) {
   ASSERT(GetType() == ComboBox || GetType() == ListBox);
-  if (index < 0 || index >= CountOptions()) {
+  if (index < 0 || index >= CountOptions())
     return FALSE;
-  }
+
   CFX_WideString opt_value = GetOptionValue(index);
-  if (bNotify && m_pForm->m_pFormNotify) {
-    int iRet = 0;
+  if (bNotify && !NotifyListOrComboBoxBeforeChange(opt_value))
+    return FALSE;
+
+  if (bSelected) {
     if (GetType() == ListBox) {
-      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, opt_value);
-    }
-    if (GetType() == ComboBox) {
-      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, opt_value);
-    }
-    if (iRet < 0) {
-      return FALSE;
-    }
-  }
-  if (!bSelected) {
-    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
-    if (pValue) {
-      if (m_Type == ListBox) {
-        SelectOption(index, FALSE);
-        if (pValue->IsString()) {
-          if (pValue->GetUnicodeText() == opt_value) {
-            m_pDict->RemoveAt("V");
-          }
-        } else if (pValue->IsArray()) {
-          CPDF_Array* pArray = new CPDF_Array;
-          for (int i = 0; i < CountOptions(); i++) {
-            if (i != index && IsItemSelected(i)) {
-              opt_value = GetOptionValue(i);
-              pArray->AddString(PDF_EncodeText(opt_value));
-            }
-          }
-          if (pArray->GetCount() < 1)
-            pArray->Release();
-          else
-            m_pDict->SetAt("V", pArray);
-        }
-      } else if (m_Type == ComboBox) {
-        m_pDict->RemoveAt("V");
-        m_pDict->RemoveAt("I");
-      }
-    }
-  } else {
-    if (m_Type == ListBox) {
       SelectOption(index, TRUE);
       if (!(m_Flags & FORMLIST_MULTISELECT)) {
         m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
@@ -609,25 +522,41 @@
         }
         m_pDict->SetAt("V", pArray);
       }
-    } else if (m_Type == ComboBox) {
+    } else {
       m_pDict->SetAtString("V", PDF_EncodeText(opt_value));
       CPDF_Array* pI = new CPDF_Array;
       pI->AddInteger(index);
       m_pDict->SetAt("I", pI);
     }
-  }
-  if (bNotify && m_pForm->m_pFormNotify) {
-    if (GetType() == ListBox) {
-      m_pForm->m_pFormNotify->AfterSelectionChange(this);
-    }
-    if (GetType() == ComboBox) {
-      m_pForm->m_pFormNotify->AfterValueChange(this);
+  } else {
+    CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict, "V");
+    if (pValue) {
+      if (GetType() == ListBox) {
+        SelectOption(index, FALSE);
+        if (pValue->IsString()) {
+          if (pValue->GetUnicodeText() == opt_value)
+            m_pDict->RemoveAt("V");
+        } else if (pValue->IsArray()) {
+          CPDF_Array* pArray = new CPDF_Array;
+          for (int i = 0; i < CountOptions(); i++) {
+            if (i != index && IsItemSelected(i)) {
+              opt_value = GetOptionValue(i);
+              pArray->AddString(PDF_EncodeText(opt_value));
+            }
+          }
+          if (pArray->GetCount() < 1)
+            pArray->Release();
+          else
+            m_pDict->SetAt("V", pArray);
+        }
+      } else {
+        m_pDict->RemoveAt("V");
+        m_pDict->RemoveAt("I");
+      }
     }
   }
-  if (CPDF_InterForm::m_bUpdateAP) {
-    UpdateAP(NULL);
-  }
-  m_pForm->m_bUpdated = TRUE;
+  if (bNotify)
+    NotifyListOrComboBoxAfterChange();
   return TRUE;
 }
 
@@ -654,17 +583,6 @@
   return -1;
 }
 
-void CPDF_FormField::UpdateAP(CPDF_FormControl* pControl) {
-  if (m_Type == PushButton || m_Type == RadioButton || m_Type == CheckBox)
-    return;
-  if (!m_pForm->m_bGenerateAP)
-    return;
-  for (int i = 0; i < CountControls(); i++) {
-    CPDF_FormControl* pControl = GetControl(i);
-    FPDF_GenerateAP(m_pForm->m_pDocument, pControl->m_pWidgetDict);
-  }
-}
-
 int CPDF_FormField::CountOptions() {
   CPDF_Array* pArray = ToArray(FPDF_GetFieldAttr(m_pDict, "Opt"));
   return pArray ? pArray->GetCount() : 0;
@@ -714,15 +632,8 @@
   if (csOptLabel.IsEmpty())
     return -1;
 
-  if (bNotify && m_pForm->m_pFormNotify) {
-    int iRet = 0;
-    if (GetType() == ListBox)
-      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csOptLabel);
-    if (GetType() == ComboBox)
-      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csOptLabel);
-    if (iRet < 0)
-      return -1;
-  }
+  if (bNotify && !NotifyListOrComboBoxBeforeChange(csOptLabel))
+    return -1;
 
   CFX_ByteString csStr =
       PDF_EncodeText(csOptLabel.c_str(), csOptLabel.GetLength());
@@ -742,27 +653,18 @@
     pOpt->InsertAt(index, pString);
   }
 
-  if (bNotify && m_pForm->m_pFormNotify) {
-    if (GetType() == ListBox)
-      m_pForm->m_pFormNotify->AfterSelectionChange(this);
-    if (GetType() == ComboBox)
-      m_pForm->m_pFormNotify->AfterValueChange(this);
-  }
-  m_pForm->m_bUpdated = TRUE;
+  if (bNotify)
+    NotifyListOrComboBoxAfterChange();
   return index;
 }
+
 FX_BOOL CPDF_FormField::ClearOptions(FX_BOOL bNotify) {
   if (bNotify && m_pForm->m_pFormNotify) {
-    int iRet = 0;
     CFX_WideString csValue;
     int iIndex = GetSelectedIndex(0);
     if (iIndex >= 0)
       csValue = GetOptionLabel(iIndex);
-    if (GetType() == ListBox)
-      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-    if (GetType() == ComboBox)
-      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-    if (iRet < 0)
+    if (!NotifyListOrComboBoxBeforeChange(csValue))
       return FALSE;
   }
 
@@ -772,17 +674,13 @@
   m_pDict->RemoveAt("I");
   m_pDict->RemoveAt("TI");
 
-  if (bNotify && m_pForm->m_pFormNotify) {
-    if (GetType() == ListBox)
-      m_pForm->m_pFormNotify->AfterSelectionChange(this);
-    if (GetType() == ComboBox)
-      m_pForm->m_pFormNotify->AfterValueChange(this);
-  }
+  if (bNotify)
+    NotifyListOrComboBoxAfterChange();
 
-  m_pForm->m_bUpdated = TRUE;
   return TRUE;
 }
 #endif  // PDF_ENABLE_XFA
+
 FX_BOOL CPDF_FormField::CheckControl(int iControlIndex,
                                      bool bChecked,
                                      bool bNotify) {
@@ -797,7 +695,7 @@
   CFX_WideString csWExport = pControl->GetExportValue();
   CFX_ByteString csBExport = PDF_EncodeText(csWExport);
   int iCount = CountControls();
-  FX_BOOL bUnison = PDF_FormField_IsUnison(this);
+  bool bUnison = PDF_FormField_IsUnison(this);
   for (int i = 0; i < iCount; i++) {
     CPDF_FormControl* pCtrl = GetControl(i);
     if (bUnison) {
@@ -838,24 +736,19 @@
     csIndex.Format("%d", iControlIndex);
     m_pDict->SetAtName("V", csIndex);
   }
-  if (bNotify && m_pForm->m_pFormNotify) {
+  if (bNotify && m_pForm->m_pFormNotify)
     m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
-  }
-  m_pForm->m_bUpdated = TRUE;
   return TRUE;
 }
+
 CFX_WideString CPDF_FormField::GetCheckValue(FX_BOOL bDefault) {
   ASSERT(GetType() == CheckBox || GetType() == RadioButton);
   CFX_WideString csExport = L"Off";
-  FX_BOOL bChecked;
   int iCount = CountControls();
   for (int i = 0; i < iCount; i++) {
     CPDF_FormControl* pControl = GetControl(i);
-    if (bDefault) {
-      bChecked = pControl->IsDefaultChecked();
-    } else {
-      bChecked = pControl->IsChecked();
-    }
+    FX_BOOL bChecked =
+        bDefault ? pControl->IsDefaultChecked() : pControl->IsChecked();
     if (bChecked) {
       csExport = pControl->GetExportValue();
       break;
@@ -863,6 +756,7 @@
   }
   return csExport;
 }
+
 FX_BOOL CPDF_FormField::SetCheckValue(const CFX_WideString& value,
                                       FX_BOOL bDefault,
                                       FX_BOOL bNotify) {
@@ -871,23 +765,14 @@
   for (int i = 0; i < iCount; i++) {
     CPDF_FormControl* pControl = GetControl(i);
     CFX_WideString csExport = pControl->GetExportValue();
-    if (csExport == value) {
-      if (bDefault) {
-      } else {
-        CheckControl(GetControlIndex(pControl), TRUE);
-      }
+    bool val = csExport == value;
+    if (!bDefault)
+      CheckControl(GetControlIndex(pControl), val);
+    if (val)
       break;
-    } else {
-      if (bDefault) {
-      } else {
-        CheckControl(GetControlIndex(pControl), FALSE);
-      }
-    }
   }
-  if (bNotify && m_pForm->m_pFormNotify) {
+  if (bNotify && m_pForm->m_pFormNotify)
     m_pForm->m_pFormNotify->AfterCheckedStatusChange(this);
-  }
-  m_pForm->m_bUpdated = TRUE;
   return TRUE;
 }
 
@@ -929,131 +814,153 @@
                                      FX_BOOL bNotify) {
   CPDF_Array* pArray = m_pDict->GetArrayBy("I");
   if (!pArray) {
-    if (!bSelected) {
+    if (!bSelected)
       return TRUE;
-    }
+
     pArray = new CPDF_Array;
     m_pDict->SetAt("I", pArray);
   }
+
   FX_BOOL bReturn = FALSE;
   for (size_t i = 0; i < pArray->GetCount(); i++) {
     int iFind = pArray->GetIntegerAt(i);
     if (iFind == iOptIndex) {
-      if (bSelected) {
+      if (bSelected)
         return TRUE;
-      }
+
       if (bNotify && m_pForm->m_pFormNotify) {
-        int iRet = 0;
         CFX_WideString csValue = GetOptionLabel(iOptIndex);
-        if (GetType() == ListBox) {
-          iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-        }
-        if (GetType() == ComboBox) {
-          iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-        }
-        if (iRet < 0) {
+        if (!NotifyListOrComboBoxBeforeChange(csValue))
           return FALSE;
-        }
       }
       pArray->RemoveAt(i);
       bReturn = TRUE;
       break;
-    } else if (iFind > iOptIndex) {
-      if (!bSelected) {
+    }
+
+    if (iFind > iOptIndex) {
+      if (!bSelected)
         continue;
-      }
+
       if (bNotify && m_pForm->m_pFormNotify) {
-        int iRet = 0;
         CFX_WideString csValue = GetOptionLabel(iOptIndex);
-        if (GetType() == ListBox) {
-          iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-        }
-        if (GetType() == ComboBox) {
-          iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-        }
-        if (iRet < 0) {
+        if (!NotifyListOrComboBoxBeforeChange(csValue))
           return FALSE;
-        }
       }
-      CPDF_Number* pNum = new CPDF_Number(iOptIndex);
-      pArray->InsertAt(i, pNum);
+      pArray->InsertAt(i, new CPDF_Number(iOptIndex));
       bReturn = TRUE;
       break;
     }
   }
   if (!bReturn) {
-    if (bSelected) {
+    if (bSelected)
       pArray->AddInteger(iOptIndex);
-    }
-    if (pArray->GetCount() == 0) {
+
+    if (pArray->GetCount() == 0)
       m_pDict->RemoveAt("I");
-    }
   }
-  if (bNotify && m_pForm->m_pFormNotify) {
-    if (GetType() == ListBox) {
-      m_pForm->m_pFormNotify->AfterSelectionChange(this);
-    }
-    if (GetType() == ComboBox) {
-      m_pForm->m_pFormNotify->AfterValueChange(this);
-    }
-  }
-  m_pForm->m_bUpdated = TRUE;
+  if (bNotify)
+    NotifyListOrComboBoxAfterChange();
+
   return TRUE;
 }
+
 FX_BOOL CPDF_FormField::ClearSelectedOptions(FX_BOOL bNotify) {
   if (bNotify && m_pForm->m_pFormNotify) {
-    int iRet = 0;
     CFX_WideString csValue;
     int iIndex = GetSelectedIndex(0);
-    if (iIndex >= 0) {
+    if (iIndex >= 0)
       csValue = GetOptionLabel(iIndex);
-    }
-    if (GetType() == ListBox) {
-      iRet = m_pForm->m_pFormNotify->BeforeSelectionChange(this, csValue);
-    }
-    if (GetType() == ComboBox) {
-      iRet = m_pForm->m_pFormNotify->BeforeValueChange(this, csValue);
-    }
-    if (iRet < 0) {
+
+    if (!NotifyListOrComboBoxBeforeChange(csValue))
       return FALSE;
-    }
   }
   m_pDict->RemoveAt("I");
-  if (bNotify && m_pForm->m_pFormNotify) {
-    if (GetType() == ListBox) {
-      m_pForm->m_pFormNotify->AfterSelectionChange(this);
-    }
-    if (GetType() == ComboBox) {
-      m_pForm->m_pFormNotify->AfterValueChange(this);
-    }
-  }
-  m_pForm->m_bUpdated = TRUE;
+  if (bNotify)
+    NotifyListOrComboBoxAfterChange();
+
   return TRUE;
 }
+
 void CPDF_FormField::LoadDA() {
-  CFX_ByteString DA;
-  if (CPDF_Object* pObj_t = FPDF_GetFieldAttr(m_pDict, "DA")) {
-    DA = pObj_t->GetString();
-  }
-  if (DA.IsEmpty() && m_pForm->m_pFormDict) {
-    DA = m_pForm->m_pFormDict->GetStringBy("DA");
-  }
-  if (DA.IsEmpty()) {
+  CPDF_Dictionary* pFormDict = m_pForm->m_pFormDict;
+  if (!pFormDict)
     return;
-  }
+
+  CFX_ByteString DA;
+  if (CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict, "DA"))
+    DA = pObj->GetString();
+
+  if (DA.IsEmpty())
+    DA = pFormDict->GetStringBy("DA");
+
+  if (DA.IsEmpty())
+    return;
+
+  CPDF_Dictionary* pDR = pFormDict->GetDictBy("DR");
+  if (!pDR)
+    return;
+
+  CPDF_Dictionary* pFont = pDR->GetDictBy("Font");
+  if (!pFont)
+    return;
+
   CPDF_SimpleParser syntax(DA.AsStringC());
   syntax.FindTagParamFromStart("Tf", 2);
   CFX_ByteString font_name(syntax.GetWord());
-  CPDF_Dictionary* pFontDict = NULL;
-  if (m_pForm->m_pFormDict && m_pForm->m_pFormDict->GetDictBy("DR") &&
-      m_pForm->m_pFormDict->GetDictBy("DR")->GetDictBy("Font")) {
-    pFontDict = m_pForm->m_pFormDict->GetDictBy("DR")
-                    ->GetDictBy("Font")
-                    ->GetDictBy(font_name);
-  }
-  if (!pFontDict) {
+  CPDF_Dictionary* pFontDict = pFont->GetDictBy(font_name);
+  if (!pFontDict)
     return;
-  }
+
   m_pFont = m_pForm->m_pDocument->LoadFont(pFontDict);
   m_FontSize = FX_atof(syntax.GetWord());
 }
+
+bool CPDF_FormField::NotifyBeforeSelectionChange(const CFX_WideString& value) {
+  if (!m_pForm->m_pFormNotify)
+    return true;
+  return m_pForm->m_pFormNotify->BeforeSelectionChange(this, value) >= 0;
+}
+
+void CPDF_FormField::NotifyAfterSelectionChange() {
+  if (!m_pForm->m_pFormNotify)
+    return;
+  m_pForm->m_pFormNotify->AfterSelectionChange(this);
+}
+
+bool CPDF_FormField::NotifyBeforeValueChange(const CFX_WideString& value) {
+  if (!m_pForm->m_pFormNotify)
+    return true;
+  return m_pForm->m_pFormNotify->BeforeValueChange(this, value) >= 0;
+}
+
+void CPDF_FormField::NotifyAfterValueChange() {
+  if (!m_pForm->m_pFormNotify)
+    return;
+  m_pForm->m_pFormNotify->AfterValueChange(this);
+}
+
+bool CPDF_FormField::NotifyListOrComboBoxBeforeChange(
+    const CFX_WideString& value) {
+  switch (GetType()) {
+    case ListBox:
+      return NotifyBeforeSelectionChange(value);
+    case ComboBox:
+      return NotifyBeforeValueChange(value);
+    default:
+      return true;
+  }
+}
+
+void CPDF_FormField::NotifyListOrComboBoxAfterChange() {
+  switch (GetType()) {
+    case ListBox:
+      NotifyAfterSelectionChange();
+      break;
+    case ComboBox:
+      NotifyAfterValueChange();
+      break;
+    default:
+      break;
+  }
+}
diff --git a/core/fpdfdoc/include/fpdf_doc.h b/core/fpdfdoc/include/fpdf_doc.h
index cb75191..4fc5b52 100644
--- a/core/fpdfdoc/include/fpdf_doc.h
+++ b/core/fpdfdoc/include/fpdf_doc.h
@@ -18,6 +18,7 @@
 
 class CFDF_Document;
 class CFieldTree;
+class CFX_RenderDevice;
 class CPDF_AAction;
 class CPDF_Action;
 class CPDF_ActionFields;
@@ -28,26 +29,24 @@
 class CPDF_BookmarkTree;
 class CPDF_DefaultAppearance;
 class CPDF_Dest;
-class CPDF_Document;
 class CPDF_DocJSActions;
+class CPDF_Document;
 class CPDF_FileSpec;
+class CPDF_Font;
+class CPDF_Form;
 class CPDF_FormControl;
 class CPDF_FormField;
-class CPDF_FormNotify;
 class CPDF_IconFit;
-class CPDF_InterForm;
 class CPDF_Link;
 class CPDF_Metadata;
 class CPDF_OCContext;
 class CPDF_Page;
 class CPDF_PageObject;
-class CPDF_Font;
-class CPDF_Form;
-class CPDF_RenderOptions;
 class CPDF_RenderContext;
+class CPDF_RenderOptions;
 class CPDF_ViewerPreferences;
 class CXML_Element;
-class CFX_RenderDevice;
+class IPDF_FormNotify;
 
 enum class BorderStyle { SOLID, DASH, BEVELED, INSET, UNDERLINE };
 
@@ -445,9 +444,10 @@
 #define FIELDTYPE_LISTBOX 5
 #define FIELDTYPE_TEXTFIELD 6
 #define FIELDTYPE_SIGNATURE 7
+
 class CPDF_InterForm : public CFX_PrivateData {
  public:
-  CPDF_InterForm(CPDF_Document* pDocument, FX_BOOL bUpdateAP);
+  explicit CPDF_InterForm(CPDF_Document* pDocument);
   ~CPDF_InterForm();
 
   static void EnableUpdateAP(FX_BOOL bUpdateAP);
@@ -499,9 +499,7 @@
 
   CPDF_Dictionary* GetFormDict() const { return m_pFormDict; }
 
-  FX_BOOL NeedConstructAP();
-
-  void NeedConstructAP(FX_BOOL bNeedAP);
+  FX_BOOL NeedConstructAP() const;
 
   int CountFieldsInCalculationOrder();
 
@@ -569,13 +567,7 @@
 
   bool ResetForm(bool bNotify = false);
 
-  CPDF_FormNotify* GetFormNotify() const { return m_pFormNotify; }
-
-  void SetFormNotify(const CPDF_FormNotify* pNotify);
-
-  FX_BOOL IsUpdated() { return m_bUpdated; }
-
-  void ClearUpdatedFlag() { m_bUpdated = FALSE; }
+  void SetFormNotify(IPDF_FormNotify* pNotify);
 
   FX_BOOL HasXFAForm() const;
 
@@ -611,8 +603,6 @@
 
   CPDF_Document* const m_pDocument;
 
-  FX_BOOL m_bGenerateAP;
-
   CPDF_Dictionary* m_pFormDict;
 
   std::map<const CPDF_Dictionary*, CPDF_FormControl*> m_ControlMap;
@@ -621,9 +611,8 @@
 
   CFX_ByteString m_bsEncoding;
 
-  CPDF_FormNotify* m_pFormNotify;
+  IPDF_FormNotify* m_pFormNotify;
 
-  FX_BOOL m_bUpdated;
   friend class CPDF_FormControl;
   friend class CPDF_FormField;
 };
@@ -664,9 +653,11 @@
 
   FX_BOOL ResetField(FX_BOOL bNotify = FALSE);
 
-  int CountControls() { return m_ControlList.GetSize(); }
+  int CountControls() const { return m_ControlList.GetSize(); }
 
-  CPDF_FormControl* GetControl(int index) { return m_ControlList.GetAt(index); }
+  CPDF_FormControl* GetControl(int index) const {
+    return m_ControlList.GetAt(index);
+  }
 
   int GetControlIndex(const CPDF_FormControl* pControl);
 
@@ -764,14 +755,21 @@
 
   void LoadDA();
 
-  void UpdateAP(CPDF_FormControl* pControl);
-
   CFX_WideString GetCheckValue(FX_BOOL bDefault);
 
   FX_BOOL SetCheckValue(const CFX_WideString& value,
                         FX_BOOL bDefault,
                         FX_BOOL bNotify);
 
+  bool NotifyBeforeSelectionChange(const CFX_WideString& value);
+  void NotifyAfterSelectionChange();
+
+  bool NotifyBeforeValueChange(const CFX_WideString& value);
+  void NotifyAfterValueChange();
+
+  bool NotifyListOrComboBoxBeforeChange(const CFX_WideString& value);
+  void NotifyListOrComboBoxAfterChange();
+
   CPDF_FormField::Type m_Type;
   uint32_t m_Flags;
   CPDF_InterForm* m_pForm;
@@ -828,7 +826,7 @@
                    const CPDF_RenderOptions* pOptions = nullptr);
 
   CFX_ByteString GetCheckedAPState();
-  CFX_WideString GetExportValue();
+  CFX_WideString GetExportValue() const;
 
   bool IsChecked() const;
   bool IsDefaultChecked() const;
@@ -894,17 +892,17 @@
   CPDF_Stream* GetIcon(const CFX_ByteString& csEntry);
   CPDF_ApSettings GetMK() const;
 
-  CPDF_InterForm* m_pForm;
-  CPDF_FormField* m_pField;
-  CPDF_Dictionary* m_pWidgetDict;
+  CPDF_FormField* const m_pField;
+  CPDF_Dictionary* const m_pWidgetDict;
+  CPDF_InterForm* const m_pForm;
 
   friend class CPDF_InterForm;
   friend class CPDF_FormField;
 };
 
-class CPDF_FormNotify {
+class IPDF_FormNotify {
  public:
-  virtual ~CPDF_FormNotify() {}
+  virtual ~IPDF_FormNotify() {}
 
   virtual int BeforeValueChange(CPDF_FormField* pField,
                                 const CFX_WideString& csValue) {
@@ -1016,4 +1014,7 @@
   CPDF_Dictionary* const m_pDict;
 };
 
+CPDF_Stream* FPDFDOC_GetAnnotAP(CPDF_Dictionary* pAnnotDict,
+                                CPDF_Annot::AppearanceMode mode);
+
 #endif  // CORE_FPDFDOC_INCLUDE_FPDF_DOC_H_
diff --git a/fpdfsdk/fpdf_ext.cpp b/fpdfsdk/fpdf_ext.cpp
index 9bb54da..350945e 100644
--- a/fpdfsdk/fpdf_ext.cpp
+++ b/fpdfsdk/fpdf_ext.cpp
@@ -6,6 +6,8 @@
 
 #include "public/fpdf_ext.h"
 
+#include <memory>
+
 #include "core/fpdfapi/fpdf_parser/include/cpdf_array.h"
 #include "core/fpdfapi/fpdf_parser/include/cpdf_document.h"
 #include "core/fpdfapi/include/cpdf_modulemgr.h"
@@ -20,13 +22,13 @@
 
 class CFSDK_UnsupportInfo_Adapter {
  public:
-  CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info) {
-    m_unsp_info = unsp_info;
-  }
+  explicit CFSDK_UnsupportInfo_Adapter(UNSUPPORT_INFO* unsp_info)
+      : m_unsp_info(unsp_info) {}
+
   void ReportError(int nErrorType);
 
  private:
-  UNSUPPORT_INFO* m_unsp_info;
+  UNSUPPORT_INFO* const m_unsp_info;
 };
 
 void CFSDK_UnsupportInfo_Adapter::ReportError(int nErrorType) {
@@ -183,11 +185,9 @@
 
 #ifndef PDF_ENABLE_XFA
   // XFA Forms
-  CPDF_InterForm* pInterForm = new CPDF_InterForm(pDoc, FALSE);
-  if (pInterForm->HasXFAForm()) {
+  CPDF_InterForm interform(pDoc);
+  if (interform.HasXFAForm())
     FPDF_UnSupportError(FPDF_UNSP_DOC_XFAFORM);
-  }
-  delete pInterForm;
 #endif  // PDF_ENABLE_XFA
 }
 
diff --git a/fpdfsdk/fpdfformfill.cpp b/fpdfsdk/fpdfformfill.cpp
index 4381509..81c5dd7 100644
--- a/fpdfsdk/fpdfformfill.cpp
+++ b/fpdfsdk/fpdfformfill.cpp
@@ -64,7 +64,7 @@
     return -1;
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (pPage) {
-    CPDF_InterForm interform(pPage->m_pDocument, FALSE);
+    CPDF_InterForm interform(pPage->m_pDocument);
     CPDF_FormControl* pFormCtrl =
         interform.GetControlAtPoint(pPage, static_cast<FX_FLOAT>(page_x),
                                     static_cast<FX_FLOAT>(page_y), nullptr);
@@ -134,7 +134,7 @@
   CPDF_Page* pPage = CPDFPageFromFPDFPage(page);
   if (!pPage)
     return -1;
-  CPDF_InterForm interform(pPage->m_pDocument, FALSE);
+  CPDF_InterForm interform(pPage->m_pDocument);
   int z_order = -1;
   (void)interform.GetControlAtPoint(pPage, (FX_FLOAT)page_x, (FX_FLOAT)page_y,
                                     &z_order);
diff --git a/fpdfsdk/fsdk_baseform.cpp b/fpdfsdk/fsdk_baseform.cpp
index 4e5c9f0..dbef4a9 100644
--- a/fpdfsdk/fsdk_baseform.cpp
+++ b/fpdfsdk/fsdk_baseform.cpp
@@ -1967,24 +1967,20 @@
 
 CPDFSDK_InterForm::CPDFSDK_InterForm(CPDFSDK_Document* pDocument)
     : m_pDocument(pDocument),
-      m_pInterForm(NULL),
+      m_pInterForm(new CPDF_InterForm(m_pDocument->GetPDFDocument())),
 #ifdef PDF_ENABLE_XFA
       m_bXfaCalculate(TRUE),
       m_bXfaValidationsEnabled(TRUE),
 #endif  // PDF_ENABLE_XFA
       m_bCalculate(TRUE),
       m_bBusy(FALSE) {
-  m_pInterForm = new CPDF_InterForm(m_pDocument->GetPDFDocument(), FALSE);
   m_pInterForm->SetFormNotify(this);
-
   for (int i = 0; i < kNumFieldTypes; ++i)
     m_bNeedHightlight[i] = FALSE;
   m_iHighlightAlpha = 0;
 }
 
 CPDFSDK_InterForm::~CPDFSDK_InterForm() {
-  delete m_pInterForm;
-  m_pInterForm = nullptr;
   m_Map.clear();
 #ifdef PDF_ENABLE_XFA
   m_XFAMap.clear();
diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h
index fa19c75..5e00e16 100644
--- a/fpdfsdk/include/fsdk_baseform.h
+++ b/fpdfsdk/include/fsdk_baseform.h
@@ -212,7 +212,7 @@
   FX_BOOL HitTest(FX_FLOAT pageX, FX_FLOAT pageY);
 
  private:
-  CPDFSDK_InterForm* m_pInterForm;
+  CPDFSDK_InterForm* const m_pInterForm;
   FX_BOOL m_bAppModified;
   int32_t m_nAppAge;
   int32_t m_nValueAge;
@@ -245,12 +245,12 @@
 };
 #endif  // PDF_ENABLE_XFA
 
-class CPDFSDK_InterForm : public CPDF_FormNotify {
+class CPDFSDK_InterForm : public IPDF_FormNotify {
  public:
   explicit CPDFSDK_InterForm(CPDFSDK_Document* pDocument);
   ~CPDFSDK_InterForm() override;
 
-  CPDF_InterForm* GetInterForm() const { return m_pInterForm; }
+  CPDF_InterForm* GetInterForm() const { return m_pInterForm.get(); }
   CPDFSDK_Document* GetDocument() const { return m_pDocument; }
 
   FX_BOOL HighlightWidgets();
@@ -313,7 +313,7 @@
 #endif  // PDF_ENABLE_XFA
 
  private:
-  // CPDF_FormNotify:
+  // IPDF_FormNotify:
   int BeforeValueChange(CPDF_FormField* pField,
                         const CFX_WideString& csValue) override;
   void AfterValueChange(CPDF_FormField* pField) override;
@@ -335,7 +335,7 @@
   using CPDFSDK_WidgetMap = std::map<CPDF_FormControl*, CPDFSDK_Widget*>;
 
   CPDFSDK_Document* m_pDocument;
-  CPDF_InterForm* m_pInterForm;
+  std::unique_ptr<CPDF_InterForm> m_pInterForm;
   CPDFSDK_WidgetMap m_Map;
 #ifdef PDF_ENABLE_XFA
   std::map<CXFA_FFWidget*, CPDFSDK_XFAWidget*> m_XFAMap;