diff --git a/core/include/fpdfdoc/fpdf_doc.h b/core/include/fpdfdoc/fpdf_doc.h
index fee6c49..1d3cba2 100644
--- a/core/include/fpdfdoc/fpdf_doc.h
+++ b/core/include/fpdfdoc/fpdf_doc.h
@@ -997,23 +997,21 @@
  public:
   virtual ~CPDF_FormNotify() {}
 
-  virtual int BeforeValueChange(const CPDF_FormField* pField,
-                                CFX_WideString& csValue) {
+  virtual int BeforeValueChange(CPDF_FormField* pField,
+                                const CFX_WideString& csValue) {
     return 0;
   }
-  virtual int AfterValueChange(const CPDF_FormField* pField) { return 0; }
-
-  virtual int BeforeSelectionChange(const CPDF_FormField* pField,
-                                    CFX_WideString& csValue) {
+  virtual void AfterValueChange(CPDF_FormField* pField) {}
+  virtual int BeforeSelectionChange(CPDF_FormField* pField,
+                                    const CFX_WideString& csValue) {
     return 0;
   }
-  virtual int AfterSelectionChange(const CPDF_FormField* pField) { return 0; }
-
+  virtual void AfterSelectionChange(CPDF_FormField* pField) {}
   virtual void AfterCheckedStatusChange(CPDF_FormField* pField) {}
-  virtual int BeforeFormReset(const CPDF_InterForm* pForm) { return 0; }
-  virtual int AfterFormReset(const CPDF_InterForm* pForm) { return 0; }
-  virtual int BeforeFormImportData(const CPDF_InterForm* pForm) { return 0; }
-  virtual int AfterFormImportData(const CPDF_InterForm* pForm) { return 0; }
+  virtual int BeforeFormReset(CPDF_InterForm* pForm) { return 0; }
+  virtual void AfterFormReset(CPDF_InterForm* pForm) {}
+  virtual int BeforeFormImportData(CPDF_InterForm* pForm) { return 0; }
+  virtual void AfterFormImportData(CPDF_InterForm* pForm) {}
 };
 
 FX_BOOL FPDF_GenerateAP(CPDF_Document* pDoc, CPDF_Dictionary* pAnnotDict);
diff --git a/fpdfsdk/include/fsdk_baseform.h b/fpdfsdk/include/fsdk_baseform.h
index f81f576..cd4b311 100644
--- a/fpdfsdk/include/fsdk_baseform.h
+++ b/fpdfsdk/include/fsdk_baseform.h
@@ -197,12 +197,9 @@
   void EnableCalculate(FX_BOOL bEnabled);
   FX_BOOL IsCalculateEnabled() const;
 
-  void OnKeyStrokeCommit(CPDF_FormField* pFormField,
-                         CFX_WideString& csValue,
-                         FX_BOOL& bRC);
-  void OnValidate(CPDF_FormField* pFormField,
-                  CFX_WideString& csValue,
-                  FX_BOOL& bRC);
+  FX_BOOL OnKeyStrokeCommit(CPDF_FormField* pFormField,
+                            const CFX_WideString& csValue);
+  FX_BOOL OnValidate(CPDF_FormField* pFormField, const CFX_WideString& csValue);
   void OnCalculate(CPDF_FormField* pFormField = NULL);
   CFX_WideString OnFormat(CPDF_FormField* pFormField, FX_BOOL& bFormated);
 
@@ -231,18 +228,18 @@
   CFX_WideString GetTemporaryFileName(const CFX_WideString& sFileExt);
 
  private:
-  // CPDF_FormNotify
-  int BeforeValueChange(const CPDF_FormField* pField,
-                        CFX_WideString& csValue) override;
-  int AfterValueChange(const CPDF_FormField* pField) override;
-  int BeforeSelectionChange(const CPDF_FormField* pField,
-                            CFX_WideString& csValue) override;
-  int AfterSelectionChange(const CPDF_FormField* pField) override;
+  // CPDF_FormNotify:
+  int BeforeValueChange(CPDF_FormField* pField,
+                        const CFX_WideString& csValue) override;
+  void AfterValueChange(CPDF_FormField* pField) override;
+  int BeforeSelectionChange(CPDF_FormField* pField,
+                            const CFX_WideString& csValue) override;
+  void AfterSelectionChange(CPDF_FormField* pField) override;
   void AfterCheckedStatusChange(CPDF_FormField* pField) override;
-  int BeforeFormReset(const CPDF_InterForm* pForm) override;
-  int AfterFormReset(const CPDF_InterForm* pForm) override;
-  int BeforeFormImportData(const CPDF_InterForm* pForm) override;
-  int AfterFormImportData(const CPDF_InterForm* pForm) override;
+  int BeforeFormReset(CPDF_InterForm* pForm) override;
+  void AfterFormReset(CPDF_InterForm* pForm) override;
+  int BeforeFormImportData(CPDF_InterForm* pForm) override;
+  void AfterFormImportData(CPDF_InterForm* pForm) override;
 
   FX_BOOL FDFToURLEncodedData(CFX_WideString csFDFFile,
                               CFX_WideString csTxtFile);
diff --git a/fpdfsdk/src/fsdk_baseform.cpp b/fpdfsdk/src/fsdk_baseform.cpp
index f2eb397..86c41dc 100644
--- a/fpdfsdk/src/fsdk_baseform.cpp
+++ b/fpdfsdk/src/fsdk_baseform.cpp
@@ -1684,46 +1684,46 @@
   }
 }
 
-void CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField,
-                                          CFX_WideString& csValue,
-                                          FX_BOOL& bRC) {
+FX_BOOL CPDFSDK_InterForm::OnKeyStrokeCommit(CPDF_FormField* pFormField,
+                                             const CFX_WideString& csValue) {
   CPDF_AAction aAction = pFormField->GetAdditionalAction();
-  if (aAction && aAction.ActionExist(CPDF_AAction::KeyStroke)) {
-    CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
-    if (action) {
-      CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-      CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
-      PDFSDK_FieldAction fa;
-      fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
-      fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
-      fa.sValue = csValue;
+  if (!aAction || !aAction.ActionExist(CPDF_AAction::KeyStroke))
+    return TRUE;
 
-      pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke,
-                                               m_pDocument, pFormField, fa);
-      bRC = fa.bRC;
-    }
-  }
+  CPDF_Action action = aAction.GetAction(CPDF_AAction::KeyStroke);
+  if (!action)
+    return TRUE;
+
+  CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+  CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+  PDFSDK_FieldAction fa;
+  fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
+  fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
+  fa.sValue = csValue;
+  pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::KeyStroke,
+                                           m_pDocument, pFormField, fa);
+  return fa.bRC;
 }
 
-void CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField,
-                                   CFX_WideString& csValue,
-                                   FX_BOOL& bRC) {
+FX_BOOL CPDFSDK_InterForm::OnValidate(CPDF_FormField* pFormField,
+                                      const CFX_WideString& csValue) {
   CPDF_AAction aAction = pFormField->GetAdditionalAction();
-  if (aAction && aAction.ActionExist(CPDF_AAction::Validate)) {
-    CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
-    if (action) {
-      CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
-      CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
-      PDFSDK_FieldAction fa;
-      fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
-      fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
-      fa.sValue = csValue;
+  if (!aAction || !aAction.ActionExist(CPDF_AAction::Validate))
+    return TRUE;
 
-      pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate,
-                                               m_pDocument, pFormField, fa);
-      bRC = fa.bRC;
-    }
-  }
+  CPDF_Action action = aAction.GetAction(CPDF_AAction::Validate);
+  if (!action)
+    return TRUE;
+
+  CPDFDoc_Environment* pEnv = m_pDocument->GetEnv();
+  CPDFSDK_ActionHandler* pActionHandler = pEnv->GetActionHander();
+  PDFSDK_FieldAction fa;
+  fa.bModifier = pEnv->FFI_IsCTRLKeyDown(0);
+  fa.bShift = pEnv->FFI_IsSHIFTKeyDown(0);
+  fa.sValue = csValue;
+  pActionHandler->DoAction_FieldJavaScript(action, CPDF_AAction::Validate,
+                                           m_pDocument, pFormField, fa);
+  return fa.bRC;
 }
 
 FX_BOOL CPDFSDK_InterForm::DoAction_Hide(const CPDF_Action& action) {
@@ -1949,64 +1949,52 @@
   return fields;
 }
 
-int CPDFSDK_InterForm::BeforeValueChange(const CPDF_FormField* pField,
-                                         CFX_WideString& csValue) {
-  CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-  int nType = pFormField->GetFieldType();
-  if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) {
-    FX_BOOL bRC = TRUE;
-    OnKeyStrokeCommit(pFormField, csValue, bRC);
-    if (bRC) {
-      OnValidate(pFormField, csValue, bRC);
-      return bRC ? 1 : -1;
-    }
-    return -1;
-  }
-  return 0;
-}
-
-int CPDFSDK_InterForm::AfterValueChange(const CPDF_FormField* pField) {
-  CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-  int nType = pFormField->GetFieldType();
-  if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) {
-    OnCalculate(pFormField);
-    FX_BOOL bFormated = FALSE;
-    CFX_WideString sValue = OnFormat(pFormField, bFormated);
-    if (bFormated)
-      ResetFieldAppearance(pFormField, sValue.c_str(), TRUE);
-    else
-      ResetFieldAppearance(pFormField, NULL, TRUE);
-    UpdateField(pFormField);
-  }
-  return 0;
-}
-
-int CPDFSDK_InterForm::BeforeSelectionChange(const CPDF_FormField* pField,
-                                             CFX_WideString& csValue) {
-  CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-  if (pFormField->GetFieldType() != FIELDTYPE_LISTBOX)
+int CPDFSDK_InterForm::BeforeValueChange(CPDF_FormField* pField,
+                                         const CFX_WideString& csValue) {
+  int nType = pField->GetFieldType();
+  if (nType != FIELDTYPE_COMBOBOX && nType != FIELDTYPE_TEXTFIELD)
     return 0;
 
-  FX_BOOL bRC = TRUE;
-  OnKeyStrokeCommit(pFormField, csValue, bRC);
-  if (!bRC)
+  if (!OnKeyStrokeCommit(pField, csValue))
     return -1;
 
-  OnValidate(pFormField, csValue, bRC);
-  if (!bRC)
+  if (!OnValidate(pField, csValue))
     return -1;
 
   return 1;
 }
 
-int CPDFSDK_InterForm::AfterSelectionChange(const CPDF_FormField* pField) {
-  CPDF_FormField* pFormField = (CPDF_FormField*)pField;
-  if (pFormField->GetFieldType() == FIELDTYPE_LISTBOX) {
-    OnCalculate(pFormField);
-    ResetFieldAppearance(pFormField, NULL, TRUE);
-    UpdateField(pFormField);
+void CPDFSDK_InterForm::AfterValueChange(CPDF_FormField* pField) {
+  int nType = pField->GetFieldType();
+  if (nType == FIELDTYPE_COMBOBOX || nType == FIELDTYPE_TEXTFIELD) {
+    OnCalculate(pField);
+    FX_BOOL bFormated = FALSE;
+    CFX_WideString sValue = OnFormat(pField, bFormated);
+    ResetFieldAppearance(pField, bFormated ? sValue.c_str() : nullptr, TRUE);
+    UpdateField(pField);
   }
-  return 0;
+}
+
+int CPDFSDK_InterForm::BeforeSelectionChange(CPDF_FormField* pField,
+                                             const CFX_WideString& csValue) {
+  if (pField->GetFieldType() != FIELDTYPE_LISTBOX)
+    return 0;
+
+  if (!OnKeyStrokeCommit(pField, csValue))
+    return -1;
+
+  if (!OnValidate(pField, csValue))
+    return -1;
+
+  return 1;
+}
+
+void CPDFSDK_InterForm::AfterSelectionChange(CPDF_FormField* pField) {
+  if (pField->GetFieldType() == FIELDTYPE_LISTBOX) {
+    OnCalculate(pField);
+    ResetFieldAppearance(pField, NULL, TRUE);
+    UpdateField(pField);
+  }
 }
 
 void CPDFSDK_InterForm::AfterCheckedStatusChange(CPDF_FormField* pField) {
@@ -2017,22 +2005,20 @@
   }
 }
 
-int CPDFSDK_InterForm::BeforeFormReset(const CPDF_InterForm* pForm) {
+int CPDFSDK_InterForm::BeforeFormReset(CPDF_InterForm* pForm) {
   return 0;
 }
 
-int CPDFSDK_InterForm::AfterFormReset(const CPDF_InterForm* pForm) {
+void CPDFSDK_InterForm::AfterFormReset(CPDF_InterForm* pForm) {
   OnCalculate(nullptr);
+}
+
+int CPDFSDK_InterForm::BeforeFormImportData(CPDF_InterForm* pForm) {
   return 0;
 }
 
-int CPDFSDK_InterForm::BeforeFormImportData(const CPDF_InterForm* pForm) {
-  return 0;
-}
-
-int CPDFSDK_InterForm::AfterFormImportData(const CPDF_InterForm* pForm) {
+void CPDFSDK_InterForm::AfterFormImportData(CPDF_InterForm* pForm) {
   OnCalculate(nullptr);
-  return 0;
 }
 
 FX_BOOL CPDFSDK_InterForm::IsNeedHighLight(int nFieldType) {
