diff --git a/fpdfsdk/cpdfsdk_formfillenvironment.h b/fpdfsdk/cpdfsdk_formfillenvironment.h
index e92537e..e5a6932 100644
--- a/fpdfsdk/cpdfsdk_formfillenvironment.h
+++ b/fpdfsdk/cpdfsdk_formfillenvironment.h
@@ -25,7 +25,8 @@
 class CPDFSDK_Document;
 class IJS_Runtime;
 
-class CPDFSDK_FormFillEnvironment final {
+class CPDFSDK_FormFillEnvironment
+    : public CFX_Observable<CPDFSDK_FormFillEnvironment> {
  public:
   CPDFSDK_FormFillEnvironment(UnderlyingDocumentType* pDoc,
                               FPDF_FORMFILLINFO* pFFinfo);
diff --git a/fpdfsdk/javascript/Document.cpp b/fpdfsdk/javascript/Document.cpp
index f5779aa..bd9e540 100644
--- a/fpdfsdk/javascript/Document.cpp
+++ b/fpdfsdk/javascript/Document.cpp
@@ -887,8 +887,10 @@
     } else {
       std::list<std::unique_ptr<CJS_DelayData>> DelayDataToProcess;
       DelayDataToProcess.swap(m_DelayData);
-      for (const auto& pData : DelayDataToProcess)
-        Field::DoDelay(m_pDocument.Get(), pData.get());
+      for (const auto& pData : DelayDataToProcess) {
+        if (m_pDocument.Get())
+          Field::DoDelay(m_pDocument->GetEnv(), pData.get());
+      }
     }
   }
   return TRUE;
@@ -1721,8 +1723,10 @@
     }
   }
 
-  for (const auto& pData : DelayDataForFieldAndControlIndex)
-    Field::DoDelay(m_pDocument.Get(), pData.get());
+  for (const auto& pData : DelayDataForFieldAndControlIndex) {
+    if (m_pDocument.Get())
+      Field::DoDelay(m_pDocument->GetEnv(), pData.get());
+  }
 }
 
 CJS_Document* Document::GetCJSDoc() const {
diff --git a/fpdfsdk/javascript/Field.cpp b/fpdfsdk/javascript/Field.cpp
index 14e0692..51724c4 100644
--- a/fpdfsdk/javascript/Field.cpp
+++ b/fpdfsdk/javascript/Field.cpp
@@ -175,7 +175,7 @@
 Field::Field(CJS_Object* pJSObject)
     : CJS_EmbedObj(pJSObject),
       m_pJSDoc(nullptr),
-      m_pDocument(nullptr),
+      m_pFormFillEnv(nullptr),
       m_nFormControlIndex(-1),
       m_bCanSet(FALSE),
       m_bDelay(FALSE) {}
@@ -212,12 +212,14 @@
 FX_BOOL Field::AttachField(Document* pDocument,
                            const CFX_WideString& csFieldName) {
   m_pJSDoc = pDocument;
-  m_pDocument.Reset(pDocument->GetReaderDoc());
-  m_bCanSet = m_pDocument->GetPermissions(FPDFPERM_FILL_FORM) ||
-              m_pDocument->GetPermissions(FPDFPERM_ANNOT_FORM) ||
-              m_pDocument->GetPermissions(FPDFPERM_MODIFY);
+  m_pFormFillEnv.Reset(pDocument->GetReaderDoc()->GetEnv());
+  m_bCanSet =
+      m_pFormFillEnv->GetSDKDocument()->GetPermissions(FPDFPERM_FILL_FORM) ||
+      m_pFormFillEnv->GetSDKDocument()->GetPermissions(FPDFPERM_ANNOT_FORM) ||
+      m_pFormFillEnv->GetSDKDocument()->GetPermissions(FPDFPERM_MODIFY);
 
-  CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+  CPDFSDK_InterForm* pRDInterForm =
+      m_pFormFillEnv->GetSDKDocument()->GetInterForm();
   CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
   CFX_WideString swFieldNameTemp = csFieldName;
   swFieldNameTemp.Replace(L"..", L".");
@@ -241,10 +243,11 @@
 }
 
 std::vector<CPDF_FormField*> Field::GetFormFields(
-    CPDFSDK_Document* pDocument,
+    CPDFSDK_FormFillEnvironment* pFormFillEnv,
     const CFX_WideString& csFieldName) {
   std::vector<CPDF_FormField*> fields;
-  CPDFSDK_InterForm* pReaderInterForm = pDocument->GetInterForm();
+  CPDFSDK_InterForm* pReaderInterForm =
+      pFormFillEnv->GetSDKDocument()->GetInterForm();
   CPDF_InterForm* pInterForm = pReaderInterForm->GetInterForm();
   for (int i = 0, sz = pInterForm->CountFields(csFieldName); i < sz; ++i) {
     if (CPDF_FormField* pFormField = pInterForm->GetField(i, csFieldName))
@@ -255,15 +258,16 @@
 
 std::vector<CPDF_FormField*> Field::GetFormFields(
     const CFX_WideString& csFieldName) const {
-  return Field::GetFormFields(m_pDocument.Get(), csFieldName);
+  return Field::GetFormFields(m_pFormFillEnv.Get(), csFieldName);
 }
 
-void Field::UpdateFormField(CPDFSDK_Document* pDocument,
+void Field::UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             CPDF_FormField* pFormField,
                             FX_BOOL bChangeMark,
                             FX_BOOL bResetAP,
                             FX_BOOL bRefresh) {
-  CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
+  CPDFSDK_InterForm* pInterForm =
+      pFormFillEnv->GetSDKDocument()->GetInterForm();
 
   if (bResetAP) {
     std::vector<CPDFSDK_Widget*> widgets;
@@ -307,17 +311,17 @@
   }
 
   if (bChangeMark)
-    pDocument->SetChangeMark();
+    pFormFillEnv->GetSDKDocument()->SetChangeMark();
 }
 
-void Field::UpdateFormControl(CPDFSDK_Document* pDocument,
+void Field::UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               CPDF_FormControl* pFormControl,
                               FX_BOOL bChangeMark,
                               FX_BOOL bResetAP,
                               FX_BOOL bRefresh) {
   ASSERT(pFormControl);
 
-  CPDFSDK_InterForm* pForm = pDocument->GetInterForm();
+  CPDFSDK_InterForm* pForm = pFormFillEnv->GetSDKDocument()->GetInterForm();
   CPDFSDK_Widget* pWidget = pForm->GetWidget(pFormControl, false);
 
   if (pWidget) {
@@ -341,14 +345,14 @@
   }
 
   if (bChangeMark)
-    pDocument->SetChangeMark();
+    pFormFillEnv->GetSDKDocument()->SetChangeMark();
 }
 
-CPDFSDK_Widget* Field::GetWidget(CPDFSDK_Document* pDocument,
+CPDFSDK_Widget* Field::GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                  CPDF_FormControl* pFormControl,
                                  bool createIfNeeded) {
-  CPDFSDK_InterForm* pInterForm =
-      static_cast<CPDFSDK_InterForm*>(pDocument->GetInterForm());
+  CPDFSDK_InterForm* pInterForm = static_cast<CPDFSDK_InterForm*>(
+      pFormFillEnv->GetSDKDocument()->GetInterForm());
   return pInterForm ? pInterForm->GetWidget(pFormControl, createIfNeeded)
                     : nullptr;
 }
@@ -377,7 +381,7 @@
 FX_BOOL Field::alignment(IJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -389,8 +393,8 @@
     if (m_bDelay) {
       AddDelay_String(FP_ALIGNMENT, alignStr);
     } else {
-      Field::SetAlignment(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          alignStr);
+      Field::SetAlignment(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, alignStr);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -423,7 +427,7 @@
   return TRUE;
 }
 
-void Field::SetAlignment(CPDFSDK_Document* pDocument,
+void Field::SetAlignment(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          const CFX_ByteString& string) {
@@ -433,7 +437,7 @@
 FX_BOOL Field::borderStyle(IJS_Context* cc,
                            CJS_PropValue& vp,
                            CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -445,8 +449,8 @@
     if (m_bDelay) {
       AddDelay_String(FP_BORDERSTYLE, strType);
     } else {
-      Field::SetBorderStyle(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                            strType);
+      Field::SetBorderStyle(m_pFormFillEnv.Get(), m_FieldName,
+                            m_nFormControlIndex, strType);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -457,8 +461,8 @@
     if (!pFormField)
       return FALSE;
 
-    CPDFSDK_Widget* pWidget =
-        GetWidget(m_pDocument.Get(), GetSmartFieldControl(pFormField), false);
+    CPDFSDK_Widget* pWidget = GetWidget(
+        m_pFormFillEnv.Get(), GetSmartFieldControl(pFormField), false);
     if (!pWidget)
       return FALSE;
 
@@ -487,11 +491,11 @@
   return TRUE;
 }
 
-void Field::SetBorderStyle(CPDFSDK_Document* pDocument,
+void Field::SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            const CFX_ByteString& string) {
-  ASSERT(pDocument);
+  ASSERT(pFormFillEnv);
 
   BorderStyle nBorderStyle = BorderStyle::SOLID;
   if (string == "solid")
@@ -508,13 +512,13 @@
     return;
 
   std::vector<CPDF_FormField*> FieldArray =
-      GetFormFields(pDocument, swFieldName);
+      GetFormFields(pFormFillEnv, swFieldName);
   for (CPDF_FormField* pFormField : FieldArray) {
     if (nControlIndex < 0) {
       FX_BOOL bSet = FALSE;
       for (int i = 0, sz = pFormField->CountControls(); i < sz; ++i) {
         if (CPDFSDK_Widget* pWidget =
-                GetWidget(pDocument, pFormField->GetControl(i), false)) {
+                GetWidget(pFormFillEnv, pFormField->GetControl(i), false)) {
           if (pWidget->GetBorderStyle() != nBorderStyle) {
             pWidget->SetBorderStyle(nBorderStyle);
             bSet = TRUE;
@@ -522,17 +526,17 @@
         }
       }
       if (bSet)
-        UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        UpdateFormField(pFormFillEnv, pFormField, TRUE, TRUE, TRUE);
     } else {
       if (nControlIndex >= pFormField->CountControls())
         return;
       if (CPDF_FormControl* pFormControl =
               pFormField->GetControl(nControlIndex)) {
         if (CPDFSDK_Widget* pWidget =
-                GetWidget(pDocument, pFormControl, false)) {
+                GetWidget(pFormFillEnv, pFormControl, false)) {
           if (pWidget->GetBorderStyle() != nBorderStyle) {
             pWidget->SetBorderStyle(nBorderStyle);
-            UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+            UpdateFormControl(pFormFillEnv, pFormControl, TRUE, TRUE, TRUE);
           }
         }
       }
@@ -543,7 +547,7 @@
 FX_BOOL Field::buttonAlignX(IJS_Context* cc,
                             CJS_PropValue& vp,
                             CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -555,7 +559,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_BUTTONALIGNX, nVP);
     } else {
-      Field::SetButtonAlignX(m_pDocument.Get(), m_FieldName,
+      Field::SetButtonAlignX(m_pFormFillEnv.Get(), m_FieldName,
                              m_nFormControlIndex, nVP);
     }
   } else {
@@ -582,7 +586,7 @@
   return TRUE;
 }
 
-void Field::SetButtonAlignX(CPDFSDK_Document* pDocument,
+void Field::SetButtonAlignX(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const CFX_WideString& swFieldName,
                             int nControlIndex,
                             int number) {
@@ -592,7 +596,7 @@
 FX_BOOL Field::buttonAlignY(IJS_Context* cc,
                             CJS_PropValue& vp,
                             CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -604,7 +608,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_BUTTONALIGNY, nVP);
     } else {
-      Field::SetButtonAlignY(m_pDocument.Get(), m_FieldName,
+      Field::SetButtonAlignY(m_pFormFillEnv.Get(), m_FieldName,
                              m_nFormControlIndex, nVP);
     }
   } else {
@@ -631,7 +635,7 @@
   return TRUE;
 }
 
-void Field::SetButtonAlignY(CPDFSDK_Document* pDocument,
+void Field::SetButtonAlignY(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const CFX_WideString& swFieldName,
                             int nControlIndex,
                             int number) {
@@ -641,7 +645,7 @@
 FX_BOOL Field::buttonFitBounds(IJS_Context* cc,
                                CJS_PropValue& vp,
                                CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -653,7 +657,7 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_BUTTONFITBOUNDS, bVP);
     } else {
-      Field::SetButtonFitBounds(m_pDocument.Get(), m_FieldName,
+      Field::SetButtonFitBounds(m_pFormFillEnv.Get(), m_FieldName,
                                 m_nFormControlIndex, bVP);
     }
   } else {
@@ -675,7 +679,7 @@
   return TRUE;
 }
 
-void Field::SetButtonFitBounds(CPDFSDK_Document* pDocument,
+void Field::SetButtonFitBounds(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                const CFX_WideString& swFieldName,
                                int nControlIndex,
                                bool b) {
@@ -685,7 +689,7 @@
 FX_BOOL Field::buttonPosition(IJS_Context* cc,
                               CJS_PropValue& vp,
                               CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -697,7 +701,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_BUTTONPOSITION, nVP);
     } else {
-      Field::SetButtonPosition(m_pDocument.Get(), m_FieldName,
+      Field::SetButtonPosition(m_pFormFillEnv.Get(), m_FieldName,
                                m_nFormControlIndex, nVP);
     }
   } else {
@@ -718,7 +722,7 @@
   return TRUE;
 }
 
-void Field::SetButtonPosition(CPDFSDK_Document* pDocument,
+void Field::SetButtonPosition(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex,
                               int number) {
@@ -728,7 +732,7 @@
 FX_BOOL Field::buttonScaleHow(IJS_Context* cc,
                               CJS_PropValue& vp,
                               CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -740,7 +744,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_BUTTONSCALEHOW, nVP);
     } else {
-      Field::SetButtonScaleHow(m_pDocument.Get(), m_FieldName,
+      Field::SetButtonScaleHow(m_pFormFillEnv.Get(), m_FieldName,
                                m_nFormControlIndex, nVP);
     }
   } else {
@@ -766,7 +770,7 @@
   return TRUE;
 }
 
-void Field::SetButtonScaleHow(CPDFSDK_Document* pDocument,
+void Field::SetButtonScaleHow(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex,
                               int number) {
@@ -776,7 +780,7 @@
 FX_BOOL Field::buttonScaleWhen(IJS_Context* cc,
                                CJS_PropValue& vp,
                                CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -788,7 +792,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_BUTTONSCALEWHEN, nVP);
     } else {
-      Field::SetButtonScaleWhen(m_pDocument.Get(), m_FieldName,
+      Field::SetButtonScaleWhen(m_pFormFillEnv.Get(), m_FieldName,
                                 m_nFormControlIndex, nVP);
     }
   } else {
@@ -825,7 +829,7 @@
   return TRUE;
 }
 
-void Field::SetButtonScaleWhen(CPDFSDK_Document* pDocument,
+void Field::SetButtonScaleWhen(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                const CFX_WideString& swFieldName,
                                int nControlIndex,
                                int number) {
@@ -835,7 +839,7 @@
 FX_BOOL Field::calcOrderIndex(IJS_Context* cc,
                               CJS_PropValue& vp,
                               CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -847,7 +851,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_CALCORDERINDEX, nVP);
     } else {
-      Field::SetCalcOrderIndex(m_pDocument.Get(), m_FieldName,
+      Field::SetCalcOrderIndex(m_pFormFillEnv.Get(), m_FieldName,
                                m_nFormControlIndex, nVP);
     }
   } else {
@@ -861,7 +865,8 @@
       return FALSE;
     }
 
-    CPDFSDK_InterForm* pRDInterForm = m_pDocument->GetInterForm();
+    CPDFSDK_InterForm* pRDInterForm =
+        m_pFormFillEnv->GetSDKDocument()->GetInterForm();
     CPDF_InterForm* pInterForm = pRDInterForm->GetInterForm();
     vp << (int32_t)pInterForm->FindFieldInCalculationOrder(pFormField);
   }
@@ -869,7 +874,7 @@
   return TRUE;
 }
 
-void Field::SetCalcOrderIndex(CPDFSDK_Document* pDocument,
+void Field::SetCalcOrderIndex(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex,
                               int number) {
@@ -879,7 +884,7 @@
 FX_BOOL Field::charLimit(IJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -891,8 +896,8 @@
     if (m_bDelay) {
       AddDelay_Int(FP_CHARLIMIT, nVP);
     } else {
-      Field::SetCharLimit(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          nVP);
+      Field::SetCharLimit(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, nVP);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -908,7 +913,7 @@
   return TRUE;
 }
 
-void Field::SetCharLimit(CPDFSDK_Document* pDocument,
+void Field::SetCharLimit(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          int number) {
@@ -918,7 +923,7 @@
 FX_BOOL Field::comb(IJS_Context* cc,
                     CJS_PropValue& vp,
                     CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -930,7 +935,8 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_COMB, bVP);
     } else {
-      Field::SetComb(m_pDocument.Get(), m_FieldName, m_nFormControlIndex, bVP);
+      Field::SetComb(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
+                     bVP);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -950,7 +956,7 @@
   return TRUE;
 }
 
-void Field::SetComb(CPDFSDK_Document* pDocument,
+void Field::SetComb(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                     const CFX_WideString& swFieldName,
                     int nControlIndex,
                     bool b) {
@@ -960,7 +966,7 @@
 FX_BOOL Field::commitOnSelChange(IJS_Context* cc,
                                  CJS_PropValue& vp,
                                  CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -972,7 +978,7 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_COMMITONSELCHANGE, bVP);
     } else {
-      Field::SetCommitOnSelChange(m_pDocument.Get(), m_FieldName,
+      Field::SetCommitOnSelChange(m_pFormFillEnv.Get(), m_FieldName,
                                   m_nFormControlIndex, bVP);
     }
   } else {
@@ -995,7 +1001,7 @@
   return TRUE;
 }
 
-void Field::SetCommitOnSelChange(CPDFSDK_Document* pDocument,
+void Field::SetCommitOnSelChange(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                  const CFX_WideString& swFieldName,
                                  int nControlIndex,
                                  bool b) {
@@ -1031,7 +1037,7 @@
     if (m_bDelay) {
       AddDelay_WordArray(FP_CURRENTVALUEINDICES, array);
     } else {
-      Field::SetCurrentValueIndices(m_pDocument.Get(), m_FieldName,
+      Field::SetCurrentValueIndices(m_pFormFillEnv.Get(), m_FieldName,
                                     m_nFormControlIndex, array);
     }
   } else {
@@ -1062,13 +1068,13 @@
   return TRUE;
 }
 
-void Field::SetCurrentValueIndices(CPDFSDK_Document* pDocument,
+void Field::SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                    const CFX_WideString& swFieldName,
                                    int nControlIndex,
                                    const std::vector<uint32_t>& array) {
-  ASSERT(pDocument);
+  ASSERT(pFormFillEnv);
   std::vector<CPDF_FormField*> FieldArray =
-      GetFormFields(pDocument, swFieldName);
+      GetFormFields(pFormFillEnv, swFieldName);
 
   for (CPDF_FormField* pFormField : FieldArray) {
     int nFieldType = pFormField->GetFieldType();
@@ -1083,7 +1089,7 @@
           pFormField->SetItemSelection(array[i], TRUE);
         }
       }
-      UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+      UpdateFormField(pFormFillEnv, pFormField, TRUE, TRUE, TRUE);
     }
   }
 }
@@ -1094,7 +1100,7 @@
   return FALSE;
 }
 
-void Field::SetDefaultStyle(CPDFSDK_Document* pDocument,
+void Field::SetDefaultStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const CFX_WideString& swFieldName,
                             int nControlIndex) {
   // Not supported.
@@ -1103,7 +1109,7 @@
 FX_BOOL Field::defaultValue(IJS_Context* cc,
                             CJS_PropValue& vp,
                             CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1115,7 +1121,7 @@
     if (m_bDelay) {
       AddDelay_WideString(FP_DEFAULTVALUE, WideStr);
     } else {
-      Field::SetDefaultValue(m_pDocument.Get(), m_FieldName,
+      Field::SetDefaultValue(m_pFormFillEnv.Get(), m_FieldName,
                              m_nFormControlIndex, WideStr);
     }
   } else {
@@ -1134,7 +1140,7 @@
   return TRUE;
 }
 
-void Field::SetDefaultValue(CPDFSDK_Document* pDocument,
+void Field::SetDefaultValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                             const CFX_WideString& swFieldName,
                             int nControlIndex,
                             const CFX_WideString& string) {
@@ -1144,7 +1150,7 @@
 FX_BOOL Field::doNotScroll(IJS_Context* cc,
                            CJS_PropValue& vp,
                            CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1156,8 +1162,8 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_DONOTSCROLL, bVP);
     } else {
-      Field::SetDoNotScroll(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                            bVP);
+      Field::SetDoNotScroll(m_pFormFillEnv.Get(), m_FieldName,
+                            m_nFormControlIndex, bVP);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1177,7 +1183,7 @@
   return TRUE;
 }
 
-void Field::SetDoNotScroll(CPDFSDK_Document* pDocument,
+void Field::SetDoNotScroll(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            bool b) {
@@ -1187,7 +1193,7 @@
 FX_BOOL Field::doNotSpellCheck(IJS_Context* cc,
                                CJS_PropValue& vp,
                                CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1254,7 +1260,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_DISPLAY, nVP);
     } else {
-      Field::SetDisplay(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetDisplay(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                         nVP);
     }
   } else {
@@ -1264,7 +1270,8 @@
 
     CPDF_FormField* pFormField = FieldArray[0];
     ASSERT(pFormField);
-    CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+    CPDFSDK_InterForm* pInterForm =
+        m_pFormFillEnv->GetSDKDocument()->GetInterForm();
     CPDFSDK_Widget* pWidget =
         pInterForm->GetWidget(GetSmartFieldControl(pFormField), true);
     if (!pWidget)
@@ -1290,13 +1297,14 @@
   return TRUE;
 }
 
-void Field::SetDisplay(CPDFSDK_Document* pDocument,
+void Field::SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                        const CFX_WideString& swFieldName,
                        int nControlIndex,
                        int number) {
-  CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
+  CPDFSDK_InterForm* pInterForm =
+      pFormFillEnv->GetSDKDocument()->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray =
-      GetFormFields(pDocument, swFieldName);
+      GetFormFields(pFormFillEnv, swFieldName);
   for (CPDF_FormField* pFormField : FieldArray) {
     if (nControlIndex < 0) {
       bool bAnySet = false;
@@ -1310,7 +1318,7 @@
       }
 
       if (bAnySet)
-        UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+        UpdateFormField(pFormFillEnv, pFormField, TRUE, FALSE, TRUE);
     } else {
       if (nControlIndex >= pFormField->CountControls())
         return;
@@ -1321,7 +1329,7 @@
 
       CPDFSDK_Widget* pWidget = pInterForm->GetWidget(pFormControl, true);
       if (SetWidgetDisplayStatus(pWidget, number))
-        UpdateFormControl(pDocument, pFormControl, TRUE, FALSE, TRUE);
+        UpdateFormControl(pFormFillEnv, pFormControl, TRUE, FALSE, TRUE);
     }
   }
 }
@@ -1457,8 +1465,8 @@
     if (m_bDelay) {
       AddDelay_Color(FP_FILLCOLOR, color);
     } else {
-      Field::SetFillColor(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          color);
+      Field::SetFillColor(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, color);
     }
   } else {
     CPDF_FormField* pFormField = FieldArray[0];
@@ -1498,7 +1506,7 @@
   return TRUE;
 }
 
-void Field::SetFillColor(CPDFSDK_Document* pDocument,
+void Field::SetFillColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          const CPWL_Color& color) {
@@ -1518,7 +1526,7 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_HIDDEN, bVP);
     } else {
-      Field::SetHidden(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetHidden(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                        bVP);
     }
   } else {
@@ -1528,7 +1536,8 @@
 
     CPDF_FormField* pFormField = FieldArray[0];
     ASSERT(pFormField);
-    CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+    CPDFSDK_InterForm* pInterForm =
+        m_pFormFillEnv->GetSDKDocument()->GetInterForm();
     CPDFSDK_Widget* pWidget =
         pInterForm->GetWidget(GetSmartFieldControl(pFormField), false);
     if (!pWidget)
@@ -1545,18 +1554,18 @@
   return TRUE;
 }
 
-void Field::SetHidden(CPDFSDK_Document* pDocument,
+void Field::SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       const CFX_WideString& swFieldName,
                       int nControlIndex,
                       bool b) {
   int display = b ? 1 /*Hidden*/ : 0 /*Visible*/;
-  SetDisplay(pDocument, swFieldName, nControlIndex, display);
+  SetDisplay(pFormFillEnv, swFieldName, nControlIndex, display);
 }
 
 FX_BOOL Field::highlight(IJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1568,8 +1577,8 @@
     if (m_bDelay) {
       AddDelay_String(FP_HIGHLIGHT, strMode);
     } else {
-      Field::SetHighlight(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          strMode);
+      Field::SetHighlight(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, strMode);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1607,7 +1616,7 @@
   return TRUE;
 }
 
-void Field::SetHighlight(CPDFSDK_Document* pDocument,
+void Field::SetHighlight(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          const CFX_ByteString& string) {
@@ -1627,8 +1636,8 @@
     if (m_bDelay) {
       AddDelay_Int(FP_LINEWIDTH, iWidth);
     } else {
-      Field::SetLineWidth(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          iWidth);
+      Field::SetLineWidth(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, iWidth);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1641,7 +1650,8 @@
     if (!pFormControl)
       return FALSE;
 
-    CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+    CPDFSDK_InterForm* pInterForm =
+        m_pFormFillEnv->GetSDKDocument()->GetInterForm();
     if (!pFormField->CountControls())
       return FALSE;
 
@@ -1656,13 +1666,14 @@
   return TRUE;
 }
 
-void Field::SetLineWidth(CPDFSDK_Document* pDocument,
+void Field::SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          int number) {
-  CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
+  CPDFSDK_InterForm* pInterForm =
+      pFormFillEnv->GetSDKDocument()->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray =
-      GetFormFields(pDocument, swFieldName);
+      GetFormFields(pFormFillEnv, swFieldName);
   for (CPDF_FormField* pFormField : FieldArray) {
     if (nControlIndex < 0) {
       FX_BOOL bSet = FALSE;
@@ -1679,7 +1690,7 @@
         }
       }
       if (bSet)
-        UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        UpdateFormField(pFormFillEnv, pFormField, TRUE, TRUE, TRUE);
     } else {
       if (nControlIndex >= pFormField->CountControls())
         return;
@@ -1689,7 +1700,7 @@
                 pInterForm->GetWidget(pFormControl, false)) {
           if (number != pWidget->GetBorderWidth()) {
             pWidget->SetBorderWidth(number);
-            UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+            UpdateFormControl(pFormFillEnv, pFormControl, TRUE, TRUE, TRUE);
           }
         }
       }
@@ -1700,7 +1711,7 @@
 FX_BOOL Field::multiline(IJS_Context* cc,
                          CJS_PropValue& vp,
                          CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1712,8 +1723,8 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_MULTILINE, bVP);
     } else {
-      Field::SetMultiline(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          bVP);
+      Field::SetMultiline(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, bVP);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -1733,7 +1744,7 @@
   return TRUE;
 }
 
-void Field::SetMultiline(CPDFSDK_Document* pDocument,
+void Field::SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          bool b) {
@@ -1743,7 +1754,7 @@
 FX_BOOL Field::multipleSelection(IJS_Context* cc,
                                  CJS_PropValue& vp,
                                  CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1755,7 +1766,7 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_MULTIPLESELECTION, bVP);
     } else {
-      Field::SetMultipleSelection(m_pDocument.Get(), m_FieldName,
+      Field::SetMultipleSelection(m_pFormFillEnv.Get(), m_FieldName,
                                   m_nFormControlIndex, bVP);
     }
   } else {
@@ -1776,7 +1787,7 @@
   return TRUE;
 }
 
-void Field::SetMultipleSelection(CPDFSDK_Document* pDocument,
+void Field::SetMultipleSelection(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                  const CFX_WideString& swFieldName,
                                  int nControlIndex,
                                  bool b) {
@@ -1833,7 +1844,8 @@
     return FALSE;
 
   std::vector<CPDFSDK_Widget*> widgets;
-  m_pDocument->GetInterForm()->GetWidgets(pFormField, &widgets);
+  m_pFormFillEnv->GetSDKDocument()->GetInterForm()->GetWidgets(pFormField,
+                                                               &widgets);
 
   if (widgets.empty()) {
     vp << (int32_t)-1;
@@ -1858,7 +1870,7 @@
 FX_BOOL Field::password(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -1870,7 +1882,7 @@
     if (m_bDelay) {
       AddDelay_Bool(FP_PASSWORD, bVP);
     } else {
-      Field::SetPassword(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetPassword(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                          bVP);
     }
   } else {
@@ -1891,7 +1903,7 @@
   return TRUE;
 }
 
-void Field::SetPassword(CPDFSDK_Document* pDocument,
+void Field::SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const CFX_WideString& swFieldName,
                         int nControlIndex,
                         bool b) {
@@ -1901,7 +1913,8 @@
 FX_BOOL Field::print(IJS_Context* cc,
                      CJS_PropValue& vp,
                      CFX_WideString& sError) {
-  CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+  CPDFSDK_InterForm* pInterForm =
+      m_pFormFillEnv->GetSDKDocument()->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
   if (FieldArray.empty())
     return FALSE;
@@ -1933,7 +1946,7 @@
         }
 
         if (bSet)
-          UpdateFormField(m_pDocument.Get(), pFormField, TRUE, FALSE, TRUE);
+          UpdateFormField(m_pFormFillEnv.Get(), pFormField, TRUE, FALSE, TRUE);
       } else {
         if (m_nFormControlIndex >= pFormField->CountControls())
           return FALSE;
@@ -1949,7 +1962,7 @@
 
             if (dwFlags != pWidget->GetFlags()) {
               pWidget->SetFlags(dwFlags);
-              UpdateFormControl(m_pDocument.Get(),
+              UpdateFormControl(m_pFormFillEnv.Get(),
                                 pFormField->GetControl(m_nFormControlIndex),
                                 TRUE, FALSE, TRUE);
             }
@@ -2058,7 +2071,7 @@
     if (m_bDelay) {
       AddDelay_Rect(FP_RECT, crRect);
     } else {
-      Field::SetRect(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetRect(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                      crRect);
     }
   } else {
@@ -2067,7 +2080,8 @@
       return FALSE;
 
     CPDF_FormField* pFormField = FieldArray[0];
-    CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+    CPDFSDK_InterForm* pInterForm =
+        m_pFormFillEnv->GetSDKDocument()->GetInterForm();
     CPDFSDK_Widget* pWidget =
         pInterForm->GetWidget(GetSmartFieldControl(pFormField), true);
     if (!pWidget)
@@ -2089,13 +2103,14 @@
   return TRUE;
 }
 
-void Field::SetRect(CPDFSDK_Document* pDocument,
+void Field::SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                     const CFX_WideString& swFieldName,
                     int nControlIndex,
                     const CFX_FloatRect& rect) {
-  CPDFSDK_InterForm* pInterForm = pDocument->GetInterForm();
+  CPDFSDK_InterForm* pInterForm =
+      pFormFillEnv->GetSDKDocument()->GetInterForm();
   std::vector<CPDF_FormField*> FieldArray =
-      GetFormFields(pDocument, swFieldName);
+      GetFormFields(pFormFillEnv, swFieldName);
   for (CPDF_FormField* pFormField : FieldArray) {
     if (nControlIndex < 0) {
       FX_BOOL bSet = FALSE;
@@ -2122,7 +2137,7 @@
       }
 
       if (bSet)
-        UpdateFormField(pDocument, pFormField, TRUE, TRUE, TRUE);
+        UpdateFormField(pFormFillEnv, pFormField, TRUE, TRUE, TRUE);
     } else {
       if (nControlIndex >= pFormField->CountControls())
         return;
@@ -2140,7 +2155,7 @@
             if (crRect.left != rcOld.left || crRect.right != rcOld.right ||
                 crRect.top != rcOld.top || crRect.bottom != rcOld.bottom) {
               pWidget->SetRect(crRect);
-              UpdateFormControl(pDocument, pFormControl, TRUE, TRUE, TRUE);
+              UpdateFormControl(pFormFillEnv, pFormControl, TRUE, TRUE, TRUE);
             }
           }
         }
@@ -2180,7 +2195,7 @@
 FX_BOOL Field::richText(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -2219,7 +2234,7 @@
 FX_BOOL Field::rotation(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -2231,7 +2246,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_ROTATION, nVP);
     } else {
-      Field::SetRotation(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetRotation(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                          nVP);
     }
   } else {
@@ -2250,7 +2265,7 @@
   return TRUE;
 }
 
-void Field::SetRotation(CPDFSDK_Document* pDocument,
+void Field::SetRotation(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const CFX_WideString& swFieldName,
                         int nControlIndex,
                         int number) {
@@ -2278,8 +2293,8 @@
     if (m_bDelay) {
       AddDelay_Color(FP_STROKECOLOR, color);
     } else {
-      Field::SetStrokeColor(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                            color);
+      Field::SetStrokeColor(m_pFormFillEnv.Get(), m_FieldName,
+                            m_nFormControlIndex, color);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -2320,7 +2335,7 @@
   return TRUE;
 }
 
-void Field::SetStrokeColor(CPDFSDK_Document* pDocument,
+void Field::SetStrokeColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            const CPWL_Color& color) {
@@ -2330,7 +2345,7 @@
 FX_BOOL Field::style(IJS_Context* cc,
                      CJS_PropValue& vp,
                      CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -2342,7 +2357,7 @@
     if (m_bDelay) {
       AddDelay_String(FP_STYLE, csBCaption);
     } else {
-      Field::SetStyle(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetStyle(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                       csBCaption);
     }
   } else {
@@ -2389,7 +2404,7 @@
   return TRUE;
 }
 
-void Field::SetStyle(CPDFSDK_Document* pDocument,
+void Field::SetStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      const CFX_WideString& swFieldName,
                      int nControlIndex,
                      const CFX_ByteString& string) {
@@ -2423,8 +2438,8 @@
     if (m_bDelay) {
       AddDelay_Color(FP_TEXTCOLOR, color);
     } else {
-      Field::SetTextColor(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
-                          color);
+      Field::SetTextColor(m_pFormFillEnv.Get(), m_FieldName,
+                          m_nFormControlIndex, color);
     }
   } else {
     std::vector<CPDF_FormField*> FieldArray = GetFormFields(m_FieldName);
@@ -2456,7 +2471,7 @@
   return TRUE;
 }
 
-void Field::SetTextColor(CPDFSDK_Document* pDocument,
+void Field::SetTextColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          const CPWL_Color& color) {
@@ -2466,7 +2481,7 @@
 FX_BOOL Field::textFont(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -2480,7 +2495,7 @@
     if (m_bDelay) {
       AddDelay_String(FP_TEXTFONT, csFontName);
     } else {
-      Field::SetTextFont(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetTextFont(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                          csFontName);
     }
   } else {
@@ -2512,7 +2527,7 @@
   return TRUE;
 }
 
-void Field::SetTextFont(CPDFSDK_Document* pDocument,
+void Field::SetTextFont(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const CFX_WideString& swFieldName,
                         int nControlIndex,
                         const CFX_ByteString& string) {
@@ -2522,7 +2537,7 @@
 FX_BOOL Field::textSize(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -2534,7 +2549,7 @@
     if (m_bDelay) {
       AddDelay_Int(FP_TEXTSIZE, nVP);
     } else {
-      Field::SetTextSize(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetTextSize(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                          nVP);
     }
   } else {
@@ -2561,7 +2576,7 @@
   return TRUE;
 }
 
-void Field::SetTextSize(CPDFSDK_Document* pDocument,
+void Field::SetTextSize(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const CFX_WideString& swFieldName,
                         int nControlIndex,
                         int number) {
@@ -2615,7 +2630,7 @@
 FX_BOOL Field::userName(IJS_Context* cc,
                         CJS_PropValue& vp,
                         CFX_WideString& sError) {
-  ASSERT(m_pDocument);
+  ASSERT(m_pFormFillEnv);
 
   if (vp.IsSetting()) {
     if (!m_bCanSet)
@@ -2627,7 +2642,7 @@
     if (m_bDelay) {
       AddDelay_WideString(FP_USERNAME, swName);
     } else {
-      Field::SetUserName(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetUserName(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                          swName);
     }
   } else {
@@ -2642,7 +2657,7 @@
   return TRUE;
 }
 
-void Field::SetUserName(CPDFSDK_Document* pDocument,
+void Field::SetUserName(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const CFX_WideString& swFieldName,
                         int nControlIndex,
                         const CFX_WideString& string) {
@@ -2676,7 +2691,7 @@
     if (m_bDelay) {
       AddDelay_WideStringArray(FP_VALUE, strArray);
     } else {
-      Field::SetValue(m_pDocument.Get(), m_FieldName, m_nFormControlIndex,
+      Field::SetValue(m_pFormFillEnv.Get(), m_FieldName, m_nFormControlIndex,
                       strArray);
     }
   } else {
@@ -2735,16 +2750,16 @@
   return TRUE;
 }
 
-void Field::SetValue(CPDFSDK_Document* pDocument,
+void Field::SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      const CFX_WideString& swFieldName,
                      int nControlIndex,
                      const std::vector<CFX_WideString>& strArray) {
-  ASSERT(pDocument);
+  ASSERT(pFormFillEnv);
   if (strArray.empty())
     return;
 
   std::vector<CPDF_FormField*> FieldArray =
-      GetFormFields(pDocument, swFieldName);
+      GetFormFields(pFormFillEnv, swFieldName);
 
   for (CPDF_FormField* pFormField : FieldArray) {
     if (pFormField->GetFullName().Compare(swFieldName) != 0)
@@ -2755,14 +2770,14 @@
       case FIELDTYPE_COMBOBOX:
         if (pFormField->GetValue() != strArray[0]) {
           pFormField->SetValue(strArray[0], TRUE);
-          UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+          UpdateFormField(pFormFillEnv, pFormField, TRUE, FALSE, TRUE);
         }
         break;
       case FIELDTYPE_CHECKBOX:
       case FIELDTYPE_RADIOBUTTON: {
         if (pFormField->GetValue() != strArray[0]) {
           pFormField->SetValue(strArray[0], TRUE);
-          UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+          UpdateFormField(pFormFillEnv, pFormField, TRUE, FALSE, TRUE);
         }
       } break;
       case FIELDTYPE_LISTBOX: {
@@ -2780,7 +2795,7 @@
             if (!pFormField->IsItemSelected(index))
               pFormField->SetItemSelection(index, TRUE, TRUE);
           }
-          UpdateFormField(pDocument, pFormField, TRUE, FALSE, TRUE);
+          UpdateFormField(pFormFillEnv, pFormField, TRUE, FALSE, TRUE);
         }
       } break;
       default:
@@ -2840,13 +2855,12 @@
     return FALSE;
 
   CPDF_FormField* pFormField = FieldArray[0];
-  CPDFSDK_FormFillEnvironment* pApp = m_pDocument->GetEnv();
   if ((pFormField->GetFieldFlags() & FIELDFLAG_FILESELECT) &&
       (pFormField->GetFieldType() == FIELDTYPE_TEXTFIELD)) {
-    CFX_WideString wsFileName = pApp->JS_fieldBrowse();
+    CFX_WideString wsFileName = m_pFormFillEnv->JS_fieldBrowse();
     if (!wsFileName.IsEmpty()) {
       pFormField->SetValue(wsFileName);
-      UpdateFormField(m_pDocument.Get(), pFormField, TRUE, TRUE, TRUE);
+      UpdateFormField(m_pFormFillEnv.Get(), pFormField, TRUE, TRUE, TRUE);
     }
     return TRUE;
   }
@@ -2990,7 +3004,7 @@
   else
     pFormField->CheckControl(nWidget, bCheckit, true);
 
-  UpdateFormField(m_pDocument.Get(), pFormField, TRUE, TRUE, TRUE);
+  UpdateFormField(m_pFormFillEnv.Get(), pFormField, TRUE, TRUE, TRUE);
   return TRUE;
 }
 
@@ -3202,18 +3216,19 @@
   if (nCount < 1)
     return FALSE;
 
-  CPDFSDK_InterForm* pInterForm = m_pDocument->GetInterForm();
+  CPDFSDK_InterForm* pInterForm =
+      m_pFormFillEnv->GetSDKDocument()->GetInterForm();
   CPDFSDK_Widget* pWidget = nullptr;
   if (nCount == 1) {
     pWidget = pInterForm->GetWidget(pFormField->GetControl(0), false);
   } else {
-    CPDFSDK_FormFillEnvironment* pEnv = m_pDocument->GetEnv();
-    UnderlyingPageType* pPage = UnderlyingFromFPDFPage(
-        pEnv->GetCurrentPage(m_pDocument->GetUnderlyingDocument()));
+    UnderlyingPageType* pPage =
+        UnderlyingFromFPDFPage(m_pFormFillEnv->GetCurrentPage(
+            m_pFormFillEnv->GetUnderlyingDocument()));
     if (!pPage)
       return FALSE;
     if (CPDFSDK_PageView* pCurPageView =
-            m_pDocument->GetPageView(pPage, true)) {
+            m_pFormFillEnv->GetSDKDocument()->GetPageView(pPage, true)) {
       for (int32_t i = 0; i < nCount; i++) {
         if (CPDFSDK_Widget* pTempWidget =
                 pInterForm->GetWidget(pFormField->GetControl(i), false)) {
@@ -3228,7 +3243,7 @@
 
   if (pWidget) {
     CPDFSDK_Annot::ObservedPtr pObserved(pWidget);
-    m_pDocument->SetFocusAnnot(&pObserved);
+    m_pFormFillEnv->GetSDKDocument()->SetFocusAnnot(&pObserved);
   }
 
   return TRUE;
@@ -3358,103 +3373,104 @@
   m_pJSDoc->AddDelayData(pNewData);
 }
 
-void Field::DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData) {
-  ASSERT(pDocument);
+void Field::DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                    CJS_DelayData* pData) {
+  ASSERT(pFormFillEnv);
   switch (pData->eProp) {
     case FP_ALIGNMENT:
-      Field::SetAlignment(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetAlignment(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->string);
       break;
     case FP_BORDERSTYLE:
-      Field::SetBorderStyle(pDocument, pData->sFieldName, pData->nControlIndex,
-                            pData->string);
+      Field::SetBorderStyle(pFormFillEnv, pData->sFieldName,
+                            pData->nControlIndex, pData->string);
       break;
     case FP_BUTTONALIGNX:
-      Field::SetButtonAlignX(pDocument, pData->sFieldName, pData->nControlIndex,
-                             pData->num);
+      Field::SetButtonAlignX(pFormFillEnv, pData->sFieldName,
+                             pData->nControlIndex, pData->num);
       break;
     case FP_BUTTONALIGNY:
-      Field::SetButtonAlignY(pDocument, pData->sFieldName, pData->nControlIndex,
-                             pData->num);
+      Field::SetButtonAlignY(pFormFillEnv, pData->sFieldName,
+                             pData->nControlIndex, pData->num);
       break;
     case FP_BUTTONFITBOUNDS:
-      Field::SetButtonFitBounds(pDocument, pData->sFieldName,
+      Field::SetButtonFitBounds(pFormFillEnv, pData->sFieldName,
                                 pData->nControlIndex, pData->b);
       break;
     case FP_BUTTONPOSITION:
-      Field::SetButtonPosition(pDocument, pData->sFieldName,
+      Field::SetButtonPosition(pFormFillEnv, pData->sFieldName,
                                pData->nControlIndex, pData->num);
       break;
     case FP_BUTTONSCALEHOW:
-      Field::SetButtonScaleHow(pDocument, pData->sFieldName,
+      Field::SetButtonScaleHow(pFormFillEnv, pData->sFieldName,
                                pData->nControlIndex, pData->num);
       break;
     case FP_BUTTONSCALEWHEN:
-      Field::SetButtonScaleWhen(pDocument, pData->sFieldName,
+      Field::SetButtonScaleWhen(pFormFillEnv, pData->sFieldName,
                                 pData->nControlIndex, pData->num);
       break;
     case FP_CALCORDERINDEX:
-      Field::SetCalcOrderIndex(pDocument, pData->sFieldName,
+      Field::SetCalcOrderIndex(pFormFillEnv, pData->sFieldName,
                                pData->nControlIndex, pData->num);
       break;
     case FP_CHARLIMIT:
-      Field::SetCharLimit(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetCharLimit(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->num);
       break;
     case FP_COMB:
-      Field::SetComb(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetComb(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                      pData->b);
       break;
     case FP_COMMITONSELCHANGE:
-      Field::SetCommitOnSelChange(pDocument, pData->sFieldName,
+      Field::SetCommitOnSelChange(pFormFillEnv, pData->sFieldName,
                                   pData->nControlIndex, pData->b);
       break;
     case FP_CURRENTVALUEINDICES:
-      Field::SetCurrentValueIndices(pDocument, pData->sFieldName,
+      Field::SetCurrentValueIndices(pFormFillEnv, pData->sFieldName,
                                     pData->nControlIndex, pData->wordarray);
       break;
     case FP_DEFAULTVALUE:
-      Field::SetDefaultValue(pDocument, pData->sFieldName, pData->nControlIndex,
-                             pData->widestring);
+      Field::SetDefaultValue(pFormFillEnv, pData->sFieldName,
+                             pData->nControlIndex, pData->widestring);
       break;
     case FP_DONOTSCROLL:
-      Field::SetDoNotScroll(pDocument, pData->sFieldName, pData->nControlIndex,
-                            pData->b);
+      Field::SetDoNotScroll(pFormFillEnv, pData->sFieldName,
+                            pData->nControlIndex, pData->b);
       break;
     case FP_DISPLAY:
-      Field::SetDisplay(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetDisplay(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                         pData->num);
       break;
     case FP_FILLCOLOR:
-      Field::SetFillColor(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetFillColor(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->color);
       break;
     case FP_HIDDEN:
-      Field::SetHidden(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetHidden(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                        pData->b);
       break;
     case FP_HIGHLIGHT:
-      Field::SetHighlight(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetHighlight(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->string);
       break;
     case FP_LINEWIDTH:
-      Field::SetLineWidth(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetLineWidth(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->num);
       break;
     case FP_MULTILINE:
-      Field::SetMultiline(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetMultiline(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->b);
       break;
     case FP_MULTIPLESELECTION:
-      Field::SetMultipleSelection(pDocument, pData->sFieldName,
+      Field::SetMultipleSelection(pFormFillEnv, pData->sFieldName,
                                   pData->nControlIndex, pData->b);
       break;
     case FP_PASSWORD:
-      Field::SetPassword(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetPassword(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                          pData->b);
       break;
     case FP_RECT:
-      Field::SetRect(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetRect(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                      pData->rect);
       break;
     case FP_RICHTEXT:
@@ -3463,41 +3479,41 @@
     case FP_RICHVALUE:
       break;
     case FP_ROTATION:
-      Field::SetRotation(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetRotation(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                          pData->num);
       break;
     case FP_STROKECOLOR:
-      Field::SetStrokeColor(pDocument, pData->sFieldName, pData->nControlIndex,
-                            pData->color);
+      Field::SetStrokeColor(pFormFillEnv, pData->sFieldName,
+                            pData->nControlIndex, pData->color);
       break;
     case FP_STYLE:
-      Field::SetStyle(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetStyle(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                       pData->string);
       break;
     case FP_TEXTCOLOR:
-      Field::SetTextColor(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetTextColor(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                           pData->color);
       break;
     case FP_TEXTFONT:
-      Field::SetTextFont(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetTextFont(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                          pData->string);
       break;
     case FP_TEXTSIZE:
-      Field::SetTextSize(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetTextSize(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                          pData->num);
       break;
     case FP_USERNAME:
-      Field::SetUserName(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetUserName(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                          pData->widestring);
       break;
     case FP_VALUE:
-      Field::SetValue(pDocument, pData->sFieldName, pData->nControlIndex,
+      Field::SetValue(pFormFillEnv, pData->sFieldName, pData->nControlIndex,
                       pData->widestringarray);
       break;
   }
 }
 
-void Field::AddField(CPDFSDK_Document* pDocument,
+void Field::AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                      int nPageIndex,
                      int nFieldType,
                      const CFX_WideString& sName,
diff --git a/fpdfsdk/javascript/Field.h b/fpdfsdk/javascript/Field.h
index 7d1867c..cdff091 100644
--- a/fpdfsdk/javascript/Field.h
+++ b/fpdfsdk/javascript/Field.h
@@ -11,7 +11,7 @@
 #include <vector>
 
 #include "core/fxcrt/cfx_observable.h"
-#include "fpdfsdk/cpdfsdk_document.h"
+#include "fpdfsdk/cpdfsdk_formfillenvironment.h"
 #include "fpdfsdk/javascript/JS_Define.h"
 #include "fpdfsdk/pdfwindow/PWL_Wnd.h"  // For CPWL_Color.
 
@@ -277,163 +277,164 @@
                             CJS_Value& vRet,
                             CFX_WideString& sError);
 
-  static void SetAlignment(CPDFSDK_Document* pDocument,
+  static void SetAlignment(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            const CFX_ByteString& string);
-  static void SetBorderStyle(CPDFSDK_Document* pDocument,
+  static void SetBorderStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const CFX_WideString& swFieldName,
                              int nControlIndex,
                              const CFX_ByteString& string);
-  static void SetButtonAlignX(CPDFSDK_Document* pDocument,
+  static void SetButtonAlignX(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex,
                               int number);
-  static void SetButtonAlignY(CPDFSDK_Document* pDocument,
+  static void SetButtonAlignY(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex,
                               int number);
-  static void SetButtonFitBounds(CPDFSDK_Document* pDocument,
+  static void SetButtonFitBounds(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                  const CFX_WideString& swFieldName,
                                  int nControlIndex,
                                  bool b);
-  static void SetButtonPosition(CPDFSDK_Document* pDocument,
+  static void SetButtonPosition(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                 const CFX_WideString& swFieldName,
                                 int nControlIndex,
                                 int number);
-  static void SetButtonScaleHow(CPDFSDK_Document* pDocument,
+  static void SetButtonScaleHow(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                 const CFX_WideString& swFieldName,
                                 int nControlIndex,
                                 int number);
-  static void SetButtonScaleWhen(CPDFSDK_Document* pDocument,
+  static void SetButtonScaleWhen(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                  const CFX_WideString& swFieldName,
                                  int nControlIndex,
                                  int number);
-  static void SetCalcOrderIndex(CPDFSDK_Document* pDocument,
+  static void SetCalcOrderIndex(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                 const CFX_WideString& swFieldName,
                                 int nControlIndex,
                                 int number);
-  static void SetCharLimit(CPDFSDK_Document* pDocument,
+  static void SetCharLimit(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            int number);
-  static void SetComb(CPDFSDK_Document* pDocument,
+  static void SetComb(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       const CFX_WideString& swFieldName,
                       int nControlIndex,
                       bool b);
-  static void SetCommitOnSelChange(CPDFSDK_Document* pDocument,
+  static void SetCommitOnSelChange(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                    const CFX_WideString& swFieldName,
                                    int nControlIndex,
                                    bool b);
-  static void SetCurrentValueIndices(CPDFSDK_Document* pDocument,
+  static void SetCurrentValueIndices(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                      const CFX_WideString& swFieldName,
                                      int nControlIndex,
                                      const std::vector<uint32_t>& array);
-  static void SetDefaultStyle(CPDFSDK_Document* pDocument,
+  static void SetDefaultStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex);
-  static void SetDefaultValue(CPDFSDK_Document* pDocument,
+  static void SetDefaultValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               const CFX_WideString& swFieldName,
                               int nControlIndex,
                               const CFX_WideString& string);
-  static void SetDoNotScroll(CPDFSDK_Document* pDocument,
+  static void SetDoNotScroll(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const CFX_WideString& swFieldName,
                              int nControlIndex,
                              bool b);
-  static void SetDisplay(CPDFSDK_Document* pDocument,
+  static void SetDisplay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                          const CFX_WideString& swFieldName,
                          int nControlIndex,
                          int number);
-  static void SetFillColor(CPDFSDK_Document* pDocument,
+  static void SetFillColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            const CPWL_Color& color);
-  static void SetHidden(CPDFSDK_Document* pDocument,
+  static void SetHidden(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                         const CFX_WideString& swFieldName,
                         int nControlIndex,
                         bool b);
-  static void SetHighlight(CPDFSDK_Document* pDocument,
+  static void SetHighlight(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            const CFX_ByteString& string);
-  static void SetLineWidth(CPDFSDK_Document* pDocument,
+  static void SetLineWidth(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            int number);
-  static void SetMultiline(CPDFSDK_Document* pDocument,
+  static void SetMultiline(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            bool b);
-  static void SetMultipleSelection(CPDFSDK_Document* pDocument,
+  static void SetMultipleSelection(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                    const CFX_WideString& swFieldName,
                                    int nControlIndex,
                                    bool b);
-  static void SetPassword(CPDFSDK_Document* pDocument,
+  static void SetPassword(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const CFX_WideString& swFieldName,
                           int nControlIndex,
                           bool b);
-  static void SetRect(CPDFSDK_Document* pDocument,
+  static void SetRect(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                       const CFX_WideString& swFieldName,
                       int nControlIndex,
                       const CFX_FloatRect& rect);
-  static void SetRotation(CPDFSDK_Document* pDocument,
+  static void SetRotation(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const CFX_WideString& swFieldName,
                           int nControlIndex,
                           int number);
-  static void SetStrokeColor(CPDFSDK_Document* pDocument,
+  static void SetStrokeColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                              const CFX_WideString& swFieldName,
                              int nControlIndex,
                              const CPWL_Color& color);
-  static void SetStyle(CPDFSDK_Document* pDocument,
+  static void SetStyle(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                        const CFX_WideString& swFieldName,
                        int nControlIndex,
                        const CFX_ByteString& string);
-  static void SetTextColor(CPDFSDK_Document* pDocument,
+  static void SetTextColor(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                            const CFX_WideString& swFieldName,
                            int nControlIndex,
                            const CPWL_Color& color);
-  static void SetTextFont(CPDFSDK_Document* pDocument,
+  static void SetTextFont(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const CFX_WideString& swFieldName,
                           int nControlIndex,
                           const CFX_ByteString& string);
-  static void SetTextSize(CPDFSDK_Document* pDocument,
+  static void SetTextSize(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const CFX_WideString& swFieldName,
                           int nControlIndex,
                           int number);
-  static void SetUserName(CPDFSDK_Document* pDocument,
+  static void SetUserName(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                           const CFX_WideString& swFieldName,
                           int nControlIndex,
                           const CFX_WideString& string);
-  static void SetValue(CPDFSDK_Document* pDocument,
+  static void SetValue(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                        const CFX_WideString& swFieldName,
                        int nControlIndex,
                        const std::vector<CFX_WideString>& strArray);
 
-  static void AddField(CPDFSDK_Document* pDocument,
+  static void AddField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                        int nPageIndex,
                        int nFieldType,
                        const CFX_WideString& sName,
                        const CFX_FloatRect& rcCoords);
 
-  static void UpdateFormField(CPDFSDK_Document* pDocument,
+  static void UpdateFormField(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                               CPDF_FormField* pFormField,
                               FX_BOOL bChangeMark,
                               FX_BOOL bResetAP,
                               FX_BOOL bRefresh);
-  static void UpdateFormControl(CPDFSDK_Document* pDocument,
+  static void UpdateFormControl(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                 CPDF_FormControl* pFormControl,
                                 FX_BOOL bChangeMark,
                                 FX_BOOL bResetAP,
                                 FX_BOOL bRefresh);
 
-  static CPDFSDK_Widget* GetWidget(CPDFSDK_Document* pDocument,
+  static CPDFSDK_Widget* GetWidget(CPDFSDK_FormFillEnvironment* pFormFillEnv,
                                    CPDF_FormControl* pFormControl,
                                    bool createIfNeeded);
   static std::vector<CPDF_FormField*> GetFormFields(
-      CPDFSDK_Document* pDocument,
+      CPDFSDK_FormFillEnvironment* pFormFillEnv,
       const CFX_WideString& csFieldName);
 
-  static void DoDelay(CPDFSDK_Document* pDocument, CJS_DelayData* pData);
+  static void DoDelay(CPDFSDK_FormFillEnvironment* pFormFillEnv,
+                      CJS_DelayData* pData);
 
   FX_BOOL AttachField(Document* pDocument, const CFX_WideString& csFieldName);
   void SetDelay(FX_BOOL bDelay);
@@ -461,7 +462,7 @@
 
  public:
   Document* m_pJSDoc;
-  CPDFSDK_Document::ObservedPtr m_pDocument;
+  CPDFSDK_FormFillEnvironment::ObservedPtr m_pFormFillEnv;
   CFX_WideString m_FieldName;
   int m_nFormControlIndex;
   FX_BOOL m_bCanSet;
