diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index e19d47b..21a6d41 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -237,12 +237,11 @@
   m_bXfaValidationsEnabled = bEnabled;
 }
 
-void CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField,
-                                         bool bSynchronizeElse) {
+void CPDFSDK_InterForm::SynchronizeField(CPDF_FormField* pFormField) {
   for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
     CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
     if (CPDFSDK_Widget* pWidget = GetWidget(pFormCtrl))
-      pWidget->Synchronize(bSynchronizeElse);
+      pWidget->Synchronize(false);
   }
 }
 #endif  // PDF_ENABLE_XFA
@@ -608,20 +607,17 @@
   return m_pInterForm->ResetForm(fields, !(dwFlags & 0x01), true);
 }
 
-bool CPDFSDK_InterForm::DoAction_ImportData(const CPDF_Action& action) {
-  return false;
-}
-
 std::vector<CPDF_FormField*> CPDFSDK_InterForm::GetFieldFromObjects(
     const std::vector<CPDF_Object*>& objects) const {
   std::vector<CPDF_FormField*> fields;
   for (CPDF_Object* pObject : objects) {
-    if (pObject && pObject->IsString()) {
-      WideString csName = pObject->GetUnicodeText();
-      CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
-      if (pField)
-        fields.push_back(pField);
-    }
+    if (!pObject || !pObject->IsString())
+      continue;
+
+    WideString csName = pObject->GetUnicodeText();
+    CPDF_FormField* pField = m_pInterForm->GetField(0, csName);
+    if (pField)
+      fields.push_back(pField);
   }
   return fields;
 }
@@ -631,41 +627,37 @@
   FormFieldType fieldType = pField->GetFieldType();
   if (!IsFormFieldTypeComboOrText(fieldType))
     return 0;
-
   if (!OnKeyStrokeCommit(pField, csValue))
     return -1;
-
   if (!OnValidate(pField, csValue))
     return -1;
-
   return 1;
 }
 
 void CPDFSDK_InterForm::AfterValueChange(CPDF_FormField* pField) {
 #ifdef PDF_ENABLE_XFA
-  SynchronizeField(pField, false);
+  SynchronizeField(pField);
 #endif  // PDF_ENABLE_XFA
+
   FormFieldType fieldType = pField->GetFieldType();
-  if (IsFormFieldTypeComboOrText(fieldType)) {
-    OnCalculate(pField);
-    bool bFormatted = false;
-    WideString sValue = OnFormat(pField, bFormatted);
-    ResetFieldAppearance(pField, bFormatted ? &sValue : nullptr, true);
-    UpdateField(pField);
-  }
+  if (!IsFormFieldTypeComboOrText(fieldType))
+    return;
+
+  OnCalculate(pField);
+  bool bFormatted = false;
+  WideString sValue = OnFormat(pField, bFormatted);
+  ResetFieldAppearance(pField, bFormatted ? &sValue : nullptr, true);
+  UpdateField(pField);
 }
 
 int CPDFSDK_InterForm::BeforeSelectionChange(CPDF_FormField* pField,
                                              const WideString& csValue) {
   if (pField->GetFieldType() != FormFieldType::kListBox)
     return 0;
-
   if (!OnKeyStrokeCommit(pField, csValue))
     return -1;
-
   if (!OnValidate(pField, csValue))
     return -1;
-
   return 1;
 }
 
diff --git a/fpdfsdk/cpdfsdk_interform.h b/fpdfsdk/cpdfsdk_interform.h
index ee960ff..a412f05 100644
--- a/fpdfsdk/cpdfsdk_interform.h
+++ b/fpdfsdk/cpdfsdk_interform.h
@@ -62,7 +62,7 @@
   bool IsXfaCalculateEnabled() const;
   bool IsXfaValidationsEnabled();
   void XfaSetValidationsEnabled(bool bEnabled);
-  void SynchronizeField(CPDF_FormField* pFormField, bool bSynchronizeElse);
+  void SynchronizeField(CPDF_FormField* pFormField);
 #endif  // PDF_ENABLE_XFA
 
   bool OnKeyStrokeCommit(CPDF_FormField* pFormField, const WideString& csValue);
@@ -78,7 +78,6 @@
   bool DoAction_Hide(const CPDF_Action& action);
   bool DoAction_SubmitForm(const CPDF_Action& action);
   bool DoAction_ResetForm(const CPDF_Action& action);
-  bool DoAction_ImportData(const CPDF_Action& action);
 
   std::vector<CPDF_FormField*> GetFieldFromObjects(
       const std::vector<CPDF_Object*>& objects) const;
diff --git a/fpdfsdk/fsdk_actionhandler.cpp b/fpdfsdk/fsdk_actionhandler.cpp
index de5c931..b0bc3f6 100644
--- a/fpdfsdk/fsdk_actionhandler.cpp
+++ b/fpdfsdk/fsdk_actionhandler.cpp
@@ -126,9 +126,8 @@
   if (action.GetType() == CPDF_Action::JavaScript) {
     if (pFormFillEnv->IsJSInitiated()) {
       WideString swJS = action.GetJavaScript();
-      if (!swJS.IsEmpty()) {
+      if (!swJS.IsEmpty())
         RunDocumentOpenJavaScript(pFormFillEnv, L"", swJS);
-      }
     }
   } else {
     DoAction_NoJs(action, pFormFillEnv);
@@ -163,11 +162,9 @@
         pContext->OnLink_MouseUp(pFormFillEnv);
 
         WideString csInfo;
-        bool bRet = pContext->RunScript(swJS, &csInfo);
+        pContext->RunScript(swJS, &csInfo);
         pRuntime->ReleaseEventContext(pContext);
-        if (!bRet) {
-          // FIXME: return error.
-        }
+        // TODO(dsinclair): Return error if RunScript returns false.
       }
     }
   } else {
@@ -198,16 +195,14 @@
   if (action.GetType() == CPDF_Action::JavaScript) {
     if (pFormFillEnv->IsJSInitiated()) {
       WideString swJS = action.GetJavaScript();
-      if (!swJS.IsEmpty()) {
+      if (!swJS.IsEmpty())
         RunDocumentPageJavaScript(pFormFillEnv, type, swJS);
-      }
     }
   } else {
     DoAction_NoJs(action, pFormFillEnv);
   }
 
-  if (!IsValidDocView(pFormFillEnv))
-    return false;
+  ASSERT(pFormFillEnv);
 
   for (int32_t i = 0, sz = action.GetSubActionsCount(); i < sz; i++) {
     CPDF_Action subaction = action.GetSubAction(i);
@@ -285,11 +280,9 @@
         IJS_Runtime* pRuntime = pFormFillEnv->GetJSRuntime();
         IJS_EventContext* pContext = pRuntime->NewEventContext();
         WideString csInfo;
-        bool bRet = pContext->RunScript(swJS, &csInfo);
+        pContext->RunScript(swJS, &csInfo);
         pRuntime->ReleaseEventContext(pContext);
-        if (!bRet) {
-          // FIXME: return error.
-        }
+        // TODO(dsinclair): Return error if RunScript returns false.
       }
     }
   } else {
@@ -326,11 +319,9 @@
         pContext->OnBookmark_MouseUp(pBookmark);
 
         WideString csInfo;
-        bool bRet = pContext->RunScript(swJS, &csInfo);
+        pContext->RunScript(swJS, &csInfo);
         pRuntime->ReleaseEventContext(pContext);
-        if (!bRet) {
-          // FIXME: return error.
-        }
+        // TODO(dsinclair): Return error if RunScript returns false.
       }
     }
   } else {
@@ -355,23 +346,9 @@
     case CPDF_Action::GoTo:
       DoAction_GoTo(pFormFillEnv, action);
       break;
-    case CPDF_Action::GoToR:
-      DoAction_GoToR(pFormFillEnv, action);
-      break;
-    case CPDF_Action::GoToE:
-      break;
-    case CPDF_Action::Launch:
-      DoAction_Launch(pFormFillEnv, action);
-      break;
-    case CPDF_Action::Thread:
-      break;
     case CPDF_Action::URI:
       DoAction_URI(pFormFillEnv, action);
       break;
-    case CPDF_Action::Sound:
-      break;
-    case CPDF_Action::Movie:
-      break;
     case CPDF_Action::Hide:
       DoAction_Hide(action, pFormFillEnv);
       break;
@@ -384,32 +361,27 @@
     case CPDF_Action::ResetForm:
       DoAction_ResetForm(action, pFormFillEnv);
       break;
-    case CPDF_Action::ImportData:
-      DoAction_ImportData(action, pFormFillEnv);
-      break;
     case CPDF_Action::JavaScript:
       NOTREACHED();
       break;
     case CPDF_Action::SetOCGState:
-      DoAction_SetOCGState(pFormFillEnv, action);
-      break;
+    case CPDF_Action::Thread:
+    case CPDF_Action::Sound:
+    case CPDF_Action::Movie:
     case CPDF_Action::Rendition:
-      break;
     case CPDF_Action::Trans:
-      break;
     case CPDF_Action::GoTo3DView:
+    case CPDF_Action::GoToR:
+    case CPDF_Action::GoToE:
+    case CPDF_Action::Launch:
+    case CPDF_Action::ImportData:
+      // Unimplemented
       break;
     default:
       break;
   }
 }
 
-bool CPDFSDK_ActionHandler::IsValidDocView(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  ASSERT(pFormFillEnv);
-  return true;
-}
-
 void CPDFSDK_ActionHandler::DoAction_GoTo(
     CPDFSDK_FormFillEnvironment* pFormFillEnv,
     const CPDF_Action& action) {
@@ -431,14 +403,6 @@
                              posArray.size());
 }
 
-void CPDFSDK_ActionHandler::DoAction_GoToR(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const CPDF_Action& action) {}
-
-void CPDFSDK_ActionHandler::DoAction_Launch(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const CPDF_Action& action) {}
-
 void CPDFSDK_ActionHandler::DoAction_URI(
     CPDFSDK_FormFillEnvironment* pFormFillEnv,
     const CPDF_Action& action) {
@@ -457,10 +421,6 @@
   pFormFillEnv->ExecuteNamedAction(csName.c_str());
 }
 
-void CPDFSDK_ActionHandler::DoAction_SetOCGState(
-    CPDFSDK_FormFillEnvironment* pFormFillEnv,
-    const CPDF_Action& action) {}
-
 void CPDFSDK_ActionHandler::RunFieldJavaScript(
     CPDFSDK_FormFillEnvironment* pFormFillEnv,
     CPDF_FormField* pFormField,
@@ -510,11 +470,9 @@
   }
 
   WideString csInfo;
-  bool bRet = pContext->RunScript(script, &csInfo);
+  pContext->RunScript(script, &csInfo);
   pRuntime->ReleaseEventContext(pContext);
-  if (!bRet) {
-    // FIXME: return error.
-  }
+  // TODO(dsinclair): Return error if RunScript returns false.
 }
 
 void CPDFSDK_ActionHandler::RunDocumentOpenJavaScript(
@@ -526,11 +484,9 @@
   pContext->OnDoc_Open(pFormFillEnv, sScriptName);
 
   WideString csInfo;
-  bool bRet = pContext->RunScript(script, &csInfo);
+  pContext->RunScript(script, &csInfo);
   pRuntime->ReleaseEventContext(pContext);
-  if (!bRet) {
-    // FIXME: return error.
-  }
+  // TODO(dsinclair): Return error if RunScript returns false.
 }
 
 void CPDFSDK_ActionHandler::RunDocumentPageJavaScript(
@@ -573,11 +529,9 @@
   }
 
   WideString csInfo;
-  bool bRet = pContext->RunScript(script, &csInfo);
+  pContext->RunScript(script, &csInfo);
   pRuntime->ReleaseEventContext(pContext);
-  if (!bRet) {
-    // FIXME: return error.
-  }
+  // TODO(dsinclair): Return error if RunScript returns false.
 }
 
 bool CPDFSDK_ActionHandler::DoAction_Hide(
@@ -588,7 +542,6 @@
     pFormFillEnv->SetChangeMark();
     return true;
   }
-
   return false;
 }
 
@@ -606,14 +559,3 @@
   return pInterForm->DoAction_ResetForm(action);
 }
 
-bool CPDFSDK_ActionHandler::DoAction_ImportData(
-    const CPDF_Action& action,
-    CPDFSDK_FormFillEnvironment* pFormFillEnv) {
-  CPDFSDK_InterForm* pInterForm = pFormFillEnv->GetInterForm();
-  if (pInterForm->DoAction_ImportData(action)) {
-    pFormFillEnv->SetChangeMark();
-    return true;
-  }
-
-  return false;
-}
diff --git a/fpdfsdk/fsdk_actionhandler.h b/fpdfsdk/fsdk_actionhandler.h
index 7457b4e..006aff3 100644
--- a/fpdfsdk/fsdk_actionhandler.h
+++ b/fpdfsdk/fsdk_actionhandler.h
@@ -98,20 +98,15 @@
 
   bool IsValidField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                     CPDF_Dictionary* pFieldDict);
-  bool IsValidDocView(CPDFSDK_FormFillEnvironment* pFormFillEnv);
 
   void DoAction_GoTo(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      const CPDF_Action& action);
-  void DoAction_GoToR(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                      const CPDF_Action& action);
   void DoAction_Launch(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                        const CPDF_Action& action);
   void DoAction_URI(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                     const CPDF_Action& action);
   void DoAction_Named(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       const CPDF_Action& action);
-  void DoAction_SetOCGState(CPDFSDK_FormFillEnvironment* pFormFillEnv,
-                            const CPDF_Action& action);
 
   bool DoAction_Hide(const CPDF_Action& action,
                      CPDFSDK_FormFillEnvironment* pFormFillEnv);
@@ -119,8 +114,6 @@
                            CPDFSDK_FormFillEnvironment* pFormFillEnv);
   bool DoAction_ResetForm(const CPDF_Action& action,
                           CPDFSDK_FormFillEnvironment* pFormFillEnv);
-  bool DoAction_ImportData(const CPDF_Action& action,
-                           CPDFSDK_FormFillEnvironment* pFormFillEnv);
 };
 
 #endif  // FPDFSDK_FSDK_ACTIONHANDLER_H_
