diff --git a/fpdfsdk/cpdfsdk_interform.cpp b/fpdfsdk/cpdfsdk_interform.cpp
index 549caaf..2cc20f9 100644
--- a/fpdfsdk/cpdfsdk_interform.cpp
+++ b/fpdfsdk/cpdfsdk_interform.cpp
@@ -323,14 +323,11 @@
   }
 }
 
-WideString CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField,
-                                       bool& bFormatted) {
-  WideString sValue = pFormField->GetValue();
-  if (!m_pFormFillEnv->IsJSPlatformPresent()) {
-    bFormatted = false;
-    return sValue;
-  }
+Optional<WideString> CPDFSDK_InterForm::OnFormat(CPDF_FormField* pFormField) {
+  if (!m_pFormFillEnv->IsJSPlatformPresent())
+    return {};
 
+  WideString sValue = pFormField->GetValue();
   IJS_Runtime* pRuntime = m_pFormFillEnv->GetIJSRuntime();
   if (pFormField->GetFieldType() == FormFieldType::kComboBox &&
       pFormField->CountSelectedItems() > 0) {
@@ -339,30 +336,25 @@
       sValue = pFormField->GetOptionLabel(index);
   }
 
-  bFormatted = false;
-
   CPDF_AAction aAction = pFormField->GetAdditionalAction();
   if (aAction.GetDict() && aAction.ActionExist(CPDF_AAction::Format)) {
     CPDF_Action action = aAction.GetAction(CPDF_AAction::Format);
     if (action.GetDict()) {
       WideString script = action.GetJavaScript();
       if (!script.IsEmpty()) {
-        WideString Value = sValue;
         IJS_Runtime::ScopedEventContext pContext(pRuntime);
-        pContext->OnField_Format(pFormField, &Value, true);
+        pContext->OnField_Format(pFormField, &sValue, true);
         Optional<IJS_Runtime::JS_Error> err = pContext->RunScript(script);
-        if (!err) {
-          sValue = std::move(Value);
-          bFormatted = true;
-        }
+        if (!err)
+          return sValue;
       }
     }
   }
-  return sValue;
+  return {};
 }
 
 void CPDFSDK_InterForm::ResetFieldAppearance(CPDF_FormField* pFormField,
-                                             const WideString* sValue,
+                                             Optional<WideString> sValue,
                                              bool bValueChanged) {
   for (int i = 0, sz = pFormField->CountControls(); i < sz; i++) {
     CPDF_FormControl* pFormCtrl = pFormField->GetControl(i);
@@ -591,9 +583,7 @@
     return;
 
   OnCalculate(pField);
-  bool bFormatted = false;
-  WideString sValue = OnFormat(pField, bFormatted);
-  ResetFieldAppearance(pField, bFormatted ? &sValue : nullptr, true);
+  ResetFieldAppearance(pField, OnFormat(pField), true);
   UpdateField(pField);
 }
 
@@ -611,7 +601,7 @@
     return;
 
   OnCalculate(pField);
-  ResetFieldAppearance(pField, nullptr, true);
+  ResetFieldAppearance(pField, pdfium::nullopt, true);
   UpdateField(pField);
 }
 
diff --git a/fpdfsdk/cpdfsdk_interform.h b/fpdfsdk/cpdfsdk_interform.h
index 1862fdb..2a34c23 100644
--- a/fpdfsdk/cpdfsdk_interform.h
+++ b/fpdfsdk/cpdfsdk_interform.h
@@ -16,6 +16,7 @@
 #include "core/fxcrt/unowned_ptr.h"
 #include "core/fxge/fx_dib.h"
 #include "fpdfsdk/cpdfsdk_widget.h"
+#include "third_party/base/optional.h"
 
 class CPDF_Dictionary;
 class CPDF_FormControl;
@@ -66,10 +67,10 @@
   bool OnKeyStrokeCommit(CPDF_FormField* pFormField, const WideString& csValue);
   bool OnValidate(CPDF_FormField* pFormField, const WideString& csValue);
   void OnCalculate(CPDF_FormField* pFormField);
-  WideString OnFormat(CPDF_FormField* pFormField, bool& bFormatted);
+  Optional<WideString> OnFormat(CPDF_FormField* pFormField);
 
   void ResetFieldAppearance(CPDF_FormField* pFormField,
-                            const WideString* sValue,
+                            Optional<WideString> sValue,
                             bool bValueChanged);
   void UpdateField(CPDF_FormField* pFormField);
 
diff --git a/fpdfsdk/cpdfsdk_widget.cpp b/fpdfsdk/cpdfsdk_widget.cpp
index c2a4754..fc848d5 100644
--- a/fpdfsdk/cpdfsdk_widget.cpp
+++ b/fpdfsdk/cpdfsdk_widget.cpp
@@ -585,19 +585,17 @@
   switch (GetFieldType()) {
     case FormFieldType::kTextField:
     case FormFieldType::kComboBox: {
-      bool bFormatted = false;
-      WideString sValue = OnFormat(bFormatted);
-      ResetAppearance(bFormatted ? &sValue : nullptr, true);
+      ResetAppearance(OnFormat(), true);
       break;
     }
     default:
-      ResetAppearance(nullptr, false);
+      ResetAppearance(pdfium::nullopt, false);
       break;
   }
 }
 #endif  // PDF_ENABLE_XFA
 
-void CPDFSDK_Widget::ResetAppearance(const WideString* sValue,
+void CPDFSDK_Widget::ResetAppearance(Optional<WideString> sValue,
                                      bool bValueChanged) {
   SetAppModified();
 
@@ -632,16 +630,17 @@
   m_pAnnot->ClearCachedAP();
 }
 
-WideString CPDFSDK_Widget::OnFormat(bool& bFormatted) {
+Optional<WideString> CPDFSDK_Widget::OnFormat() {
   CPDF_FormField* pFormField = GetFormField();
   ASSERT(pFormField);
-  return m_pInterForm->OnFormat(pFormField, bFormatted);
+  return m_pInterForm->OnFormat(pFormField);
 }
 
 void CPDFSDK_Widget::ResetFieldAppearance(bool bValueChanged) {
   CPDF_FormField* pFormField = GetFormField();
   ASSERT(pFormField);
-  m_pInterForm->ResetFieldAppearance(pFormField, nullptr, bValueChanged);
+  m_pInterForm->ResetFieldAppearance(pFormField, pdfium::nullopt,
+                                     bValueChanged);
 }
 
 void CPDFSDK_Widget::DrawAppearance(CFX_RenderDevice* pDevice,
@@ -700,7 +699,7 @@
 
 CFX_FloatRect CPDFSDK_Widget::GetClientRect() const {
   CFX_FloatRect rcWindow = GetRotatedRect();
-  float fBorderWidth = (float)GetBorderWidth();
+  float fBorderWidth = GetBorderWidth();
   switch (GetBorderStyle()) {
     case BorderStyle::BEVELED:
     case BorderStyle::INSET:
diff --git a/fpdfsdk/cpdfsdk_widget.h b/fpdfsdk/cpdfsdk_widget.h
index fb83ceb..e3f9204 100644
--- a/fpdfsdk/cpdfsdk_widget.h
+++ b/fpdfsdk/cpdfsdk_widget.h
@@ -89,10 +89,10 @@
 #ifdef PDF_ENABLE_XFA
   void ResetAppearance(bool bValueChanged);
 #endif  // PDF_ENABLE_XFA
-  void ResetAppearance(const WideString* sValue, bool bValueChanged);
+  void ResetAppearance(Optional<WideString> sValue, bool bValueChanged);
   void ResetFieldAppearance(bool bValueChanged);
   void UpdateField();
-  WideString OnFormat(bool& bFormatted);
+  Optional<WideString> OnFormat();
 
   bool OnAAction(CPDF_AAction::AActionType type,
                  CPDFSDK_FieldAction* data,
diff --git a/fpdfsdk/cpdfsdk_widgethandler.cpp b/fpdfsdk/cpdfsdk_widgethandler.cpp
index b67a92d..c63d915 100644
--- a/fpdfsdk/cpdfsdk_widgethandler.cpp
+++ b/fpdfsdk/cpdfsdk_widgethandler.cpp
@@ -63,8 +63,7 @@
   pInterForm->AddMap(pCtrl, pWidget);
   CPDF_InterForm* pPDFInterForm = pInterForm->GetInterForm();
   if (pPDFInterForm->NeedConstructAP())
-    pWidget->ResetAppearance(nullptr, false);
-
+    pWidget->ResetAppearance(pdfium::nullopt, false);
   return pWidget;
 }
 
@@ -223,19 +222,18 @@
 
   CPDFSDK_Widget* pWidget = ToCPDFSDKWidget(pAnnot);
   if (!pWidget->IsAppearanceValid())
-    pWidget->ResetAppearance(nullptr, false);
+    pWidget->ResetAppearance(pdfium::nullopt, false);
 
   FormFieldType fieldType = pWidget->GetFieldType();
   if (fieldType == FormFieldType::kTextField ||
       fieldType == FormFieldType::kComboBox) {
-    bool bFormatted = false;
     CPDFSDK_Annot::ObservedPtr pObserved(pWidget);
-    WideString sValue = pWidget->OnFormat(bFormatted);
+    Optional<WideString> sValue = pWidget->OnFormat();
     if (!pObserved)
       return;
 
-    if (bFormatted && fieldType == FormFieldType::kComboBox)
-      pWidget->ResetAppearance(&sValue, false);
+    if (sValue.has_value() && fieldType == FormFieldType::kComboBox)
+      pWidget->ResetAppearance(sValue, false);
   }
 
 #ifdef PDF_ENABLE_XFA
diff --git a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
index 329224d..cb36de7 100644
--- a/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
+++ b/fpdfsdk/formfiller/cffl_interactiveformfiller.cpp
@@ -718,13 +718,12 @@
   ASSERT(pWidget);
   CPDFSDK_InterForm* pInterForm = pPageView->GetFormFillEnv()->GetInterForm();
 
-  bool bFormatted = false;
-  WideString sValue = pInterForm->OnFormat(pWidget->GetFormField(), bFormatted);
+  Optional<WideString> sValue = pInterForm->OnFormat(pWidget->GetFormField());
   if (!(*pAnnot))
     return;
 
-  if (bFormatted) {
-    pInterForm->ResetFieldAppearance(pWidget->GetFormField(), &sValue, true);
+  if (sValue.has_value()) {
+    pInterForm->ResetFieldAppearance(pWidget->GetFormField(), sValue, true);
     pInterForm->UpdateField(pWidget->GetFormField());
   }
 
diff --git a/fpdfsdk/pwl/cpwl_appstream.cpp b/fpdfsdk/pwl/cpwl_appstream.cpp
index 8ced563..d2ffd2a 100644
--- a/fpdfsdk/pwl/cpwl_appstream.cpp
+++ b/fpdfsdk/pwl/cpwl_appstream.cpp
@@ -1580,7 +1580,7 @@
     widget_->SetAppState("Off");
 }
 
-void CPWL_AppStream::SetAsComboBox(const WideString* sValue) {
+void CPWL_AppStream::SetAsComboBox(Optional<WideString> sValue) {
   CPDF_FormControl* pControl = widget_->GetFormControl();
   CPDF_FormField* pField = pControl->GetField();
   std::ostringstream sBody;
@@ -1614,8 +1614,8 @@
 
   pEdit->Initialize();
 
-  if (sValue) {
-    pEdit->SetText(*sValue);
+  if (sValue.has_value()) {
+    pEdit->SetText(sValue.value());
   } else {
     int32_t nCurSel = pField->GetSelectedIndex(0);
     if (nCurSel < 0)
@@ -1736,7 +1736,7 @@
         "");
 }
 
-void CPWL_AppStream::SetAsTextField(const WideString* sValue) {
+void CPWL_AppStream::SetAsTextField(Optional<WideString> sValue) {
   CPDF_FormControl* pControl = widget_->GetFormControl();
   CPDF_FormField* pField = pControl->GetField();
   std::ostringstream sBody;
@@ -1775,11 +1775,8 @@
   float fFontSize = widget_->GetFontSize();
 
 #ifdef PDF_ENABLE_XFA
-  WideString sValueTmp;
-  if (!sValue && widget_->GetMixXFAWidget()) {
-    sValueTmp = widget_->GetValue();
-    sValue = &sValueTmp;
-  }
+  if (!sValue.has_value() && widget_->GetMixXFAWidget())
+    sValue = widget_->GetValue();
 #endif  // PDF_ENABLE_XFA
 
   if (nMaxLen > 0) {
@@ -1791,8 +1788,8 @@
                                                         rcClient, nMaxLen);
       }
     } else {
-      if (sValue)
-        nMaxLen = sValue->GetLength();
+      if (sValue.has_value())
+        nMaxLen = sValue.value().GetLength();
       pEdit->SetLimitChar(nMaxLen);
     }
   }
@@ -1803,7 +1800,7 @@
     pEdit->SetFontSize(fFontSize);
 
   pEdit->Initialize();
-  pEdit->SetText(sValue ? *sValue : pField->GetValue());
+  pEdit->SetText(sValue.value_or(pField->GetValue()));
 
   CFX_FloatRect rcContent = pEdit->GetContentRect();
   ByteString sEdit =
diff --git a/fpdfsdk/pwl/cpwl_appstream.h b/fpdfsdk/pwl/cpwl_appstream.h
index 810e79c..1c3afab 100644
--- a/fpdfsdk/pwl/cpwl_appstream.h
+++ b/fpdfsdk/pwl/cpwl_appstream.h
@@ -9,6 +9,7 @@
 
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/unowned_ptr.h"
+#include "third_party/base/optional.h"
 
 class CPDFSDK_Widget;
 class CPDF_Dictionary;
@@ -22,9 +23,9 @@
   void SetAsPushButton();
   void SetAsCheckBox();
   void SetAsRadioButton();
-  void SetAsComboBox(const WideString* sValue);
+  void SetAsComboBox(Optional<WideString> sValue);
   void SetAsListBox();
-  void SetAsTextField(const WideString* sValue);
+  void SetAsTextField(Optional<WideString> sValue);
 
  private:
   void AddImage(const ByteString& sAPType, CPDF_Stream* pImage);
@@ -36,8 +37,8 @@
   ByteString GetBackgroundAppStream() const;
   ByteString GetBorderAppStream() const;
 
-  UnownedPtr<CPDFSDK_Widget> widget_;
-  UnownedPtr<CPDF_Dictionary> dict_;
+  UnownedPtr<CPDFSDK_Widget> const widget_;
+  UnownedPtr<CPDF_Dictionary> const dict_;
 };
 
 #endif  // FPDFSDK_PWL_CPWL_APPSTREAM_H_
diff --git a/fxjs/cjs_field.cpp b/fxjs/cjs_field.cpp
index 9c47e70..ef2a252 100644
--- a/fxjs/cjs_field.cpp
+++ b/fxjs/cjs_field.cpp
@@ -54,19 +54,17 @@
     if (IsComboBoxOrTextField(pFormField)) {
       for (auto& pObserved : widgets) {
         if (pObserved) {
-          bool bFormatted = false;
-          WideString sValue =
-              ToCPDFSDKWidget(pObserved.Get())->OnFormat(bFormatted);
+          Optional<WideString> sValue =
+              ToCPDFSDKWidget(pObserved.Get())->OnFormat();
           if (pObserved) {  // Not redundant, may be clobbered by OnFormat.
-            ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(
-                bFormatted ? &sValue : nullptr, false);
+            ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(sValue, false);
           }
         }
       }
     } else {
       for (auto& pObserved : widgets) {
         if (pObserved)
-          ToCPDFSDKWidget(pObserved.Get())->ResetAppearance(nullptr, false);
+          ToCPDFSDKWidget(pObserved.Get())->ResetAppearance({}, false);
       }
     }
   }
@@ -110,13 +108,12 @@
       FormFieldType fieldType = pWidget->GetFieldType();
       if (fieldType == FormFieldType::kComboBox ||
           fieldType == FormFieldType::kTextField) {
-        bool bFormatted = false;
-        WideString sValue = pWidget->OnFormat(bFormatted);
+        Optional<WideString> sValue = pWidget->OnFormat();
         if (!observed_widget)
           return;
-        pWidget->ResetAppearance(bFormatted ? &sValue : nullptr, false);
+        pWidget->ResetAppearance(sValue, false);
       } else {
-        pWidget->ResetAppearance(nullptr, false);
+        pWidget->ResetAppearance({}, false);
       }
       if (!observed_widget)
         return;
