diff --git a/BUILD.gn b/BUILD.gn
index 7f7ea5b..c4919cc 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -1886,10 +1886,10 @@
       "xfa/fxfa/parser/cxfa_traversestrategy_xfanode.h",
       "xfa/fxfa/parser/cxfa_validatedata.cpp",
       "xfa/fxfa/parser/cxfa_validatedata.h",
-      "xfa/fxfa/parser/cxfa_value.cpp",
-      "xfa/fxfa/parser/cxfa_value.h",
       "xfa/fxfa/parser/cxfa_valuearray.cpp",
       "xfa/fxfa/parser/cxfa_valuearray.h",
+      "xfa/fxfa/parser/cxfa_valuedata.cpp",
+      "xfa/fxfa/parser/cxfa_valuedata.h",
       "xfa/fxfa/parser/cxfa_widgetdata.cpp",
       "xfa/fxfa/parser/cxfa_widgetdata.h",
       "xfa/fxfa/parser/cxfa_xmllocale.cpp",
diff --git a/fxjs/cjx_node.cpp b/fxjs/cjx_node.cpp
index 1e76790..8bc54a7 100644
--- a/fxjs/cjx_node.cpp
+++ b/fxjs/cjx_node.cpp
@@ -1691,8 +1691,8 @@
       pValue->SetNull();
     } else {
       CXFA_Node* pUIChild = pWidgetData->GetUIChild();
-      CXFA_Value defVal = pWidgetData->GetFormValue();
-      CXFA_Node* pNode = defVal.GetNode()->GetNodeItem(XFA_NODEITEM_FirstChild);
+      CXFA_Node* pNode = pWidgetData->GetFormValueData().GetNode()->GetNodeItem(
+          XFA_NODEITEM_FirstChild);
       if (pNode && pNode->GetElementType() == XFA_Element::Decimal) {
         if (pUIChild->GetElementType() == XFA_Element::NumericEdit &&
             (pNode->JSNode()->GetInteger(XFA_ATTRIBUTE_FracDigits) == -1)) {
diff --git a/xfa/fxfa/cxfa_ffarc.cpp b/xfa/fxfa/cxfa_ffarc.cpp
index 8802feb..e117400 100644
--- a/xfa/fxfa/cxfa_ffarc.cpp
+++ b/xfa/fxfa/cxfa_ffarc.cpp
@@ -16,8 +16,8 @@
   if (!IsMatchVisibleStatus(dwStatus))
     return;
 
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  if (!value)
+  CXFA_ValueData valueData = m_pDataAcc->GetFormValueData();
+  if (!valueData)
     return;
 
   CFX_RectF rtArc = GetRectWithoutRotate();
@@ -27,5 +27,5 @@
   CFX_Matrix mtRotate = GetRotateMatrix();
   mtRotate.Concat(matrix);
 
-  DrawBorder(pGS, value.GetArcData(), rtArc, mtRotate);
+  DrawBorder(pGS, valueData.GetArcData(), rtArc, mtRotate);
 }
diff --git a/xfa/fxfa/cxfa_ffdatetimeedit.cpp b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
index c2ebb91..65c32d5 100644
--- a/xfa/fxfa/cxfa_ffdatetimeedit.cpp
+++ b/xfa/fxfa/cxfa_ffdatetimeedit.cpp
@@ -49,8 +49,8 @@
   WideString wsText;
   m_pDataAcc->GetValue(wsText, XFA_VALUEPICTURE_Display);
   pWidget->SetEditText(wsText);
-  if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
-    switch (value.GetChildValueClassID()) {
+  if (CXFA_ValueData valueData = m_pDataAcc->GetFormValueData()) {
+    switch (valueData.GetChildValueClassID()) {
       case XFA_Element::Date: {
         if (!wsText.IsEmpty()) {
           CXFA_LocaleValue lcValue = XFA_GetLocaleValue(m_pDataAcc.Get());
diff --git a/xfa/fxfa/cxfa_ffimage.cpp b/xfa/fxfa/cxfa_ffimage.cpp
index f148ea1..61f50be 100644
--- a/xfa/fxfa/cxfa_ffimage.cpp
+++ b/xfa/fxfa/cxfa_ffimage.cpp
@@ -59,8 +59,7 @@
     iVertAlign = paraData.GetVerticalAlign();
   }
 
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  int32_t iAspect = value.GetImageData().GetAspect();
+  int32_t iAspect = m_pDataAcc->GetFormValueData().GetImageData().GetAspect();
   int32_t iImageXDpi = 0;
   int32_t iImageYDpi = 0;
   m_pDataAcc->GetImageDpi(iImageXDpi, iImageYDpi);
diff --git a/xfa/fxfa/cxfa_ffimageedit.cpp b/xfa/fxfa/cxfa_ffimageedit.cpp
index 5140393..41f659e 100644
--- a/xfa/fxfa/cxfa_ffimageedit.cpp
+++ b/xfa/fxfa/cxfa_ffimageedit.cpp
@@ -76,8 +76,8 @@
   }
 
   int32_t iAspect = XFA_ATTRIBUTEENUM_Fit;
-  if (CXFA_Value value = m_pDataAcc->GetFormValue()) {
-    if (CXFA_ImageData imageData = value.GetImageData())
+  if (CXFA_ValueData valueData = m_pDataAcc->GetFormValueData()) {
+    if (CXFA_ImageData imageData = valueData.GetImageData())
       iAspect = imageData.GetAspect();
   }
 
diff --git a/xfa/fxfa/cxfa_ffline.cpp b/xfa/fxfa/cxfa_ffline.cpp
index 97afaea..de37e50 100644
--- a/xfa/fxfa/cxfa_ffline.cpp
+++ b/xfa/fxfa/cxfa_ffline.cpp
@@ -53,11 +53,11 @@
   if (!IsMatchVisibleStatus(dwStatus))
     return;
 
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  if (!value)
+  CXFA_ValueData valueData = m_pDataAcc->GetFormValueData();
+  if (!valueData)
     return;
 
-  CXFA_LineData lineData = value.GetLineData();
+  CXFA_LineData lineData = valueData.GetLineData();
   FX_ARGB lineColor = 0xFF000000;
   int32_t iStrokeType = 0;
   float fLineWidth = 1.0f;
diff --git a/xfa/fxfa/cxfa_ffrectangle.cpp b/xfa/fxfa/cxfa_ffrectangle.cpp
index 5305d17..855520e 100644
--- a/xfa/fxfa/cxfa_ffrectangle.cpp
+++ b/xfa/fxfa/cxfa_ffrectangle.cpp
@@ -17,8 +17,8 @@
   if (!IsMatchVisibleStatus(dwStatus))
     return;
 
-  CXFA_Value value = m_pDataAcc->GetFormValue();
-  if (!value)
+  CXFA_ValueData valueData = m_pDataAcc->GetFormValueData();
+  if (!valueData)
     return;
 
   CFX_RectF rect = GetRectWithoutRotate();
@@ -28,5 +28,5 @@
   CFX_Matrix mtRotate = GetRotateMatrix();
   mtRotate.Concat(matrix);
 
-  DrawBorder(pGS, value.GetRectangleData(), rect, mtRotate);
+  DrawBorder(pGS, valueData.GetRectangleData(), rect, mtRotate);
 }
diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp
index 1e00579..07745ea 100644
--- a/xfa/fxfa/cxfa_widgetacc.cpp
+++ b/xfa/fxfa/cxfa_widgetacc.cpp
@@ -77,11 +77,11 @@
     if (m_pDIBitmap)
       return true;
 
-    CXFA_Value value = pAcc->GetFormValue();
-    if (!value)
+    CXFA_ValueData valueData = pAcc->GetFormValueData();
+    if (!valueData)
       return false;
 
-    CXFA_ImageData imageData = value.GetImageData();
+    CXFA_ImageData imageData = valueData.GetImageData();
     if (!imageData)
       return false;
 
@@ -137,11 +137,11 @@
     if (m_pDIBitmap)
       return true;
 
-    CXFA_Value value = pAcc->GetFormValue();
-    if (!value)
+    CXFA_ValueData valueData = pAcc->GetFormValueData();
+    if (!valueData)
       return false;
 
-    CXFA_ImageData imageData = value.GetImageData();
+    CXFA_ImageData imageData = valueData.GetImageData();
     CXFA_FFDoc* pFFDoc = pAcc->GetDoc();
     pAcc->SetImageEditImage(XFA_LoadImageData(pFFDoc, &imageData, m_bNamedImage,
                                               m_iImageXDpi, m_iImageYDpi));
@@ -178,8 +178,8 @@
   XFA_Element eUIType = GetUIType();
   switch (eUIType) {
     case XFA_Element::ImageEdit: {
-      CXFA_Value imageValue = GetDefaultValue();
-      CXFA_ImageData imageData = imageValue.GetImageData();
+      CXFA_ValueData imageValueData = GetDefaultValueData();
+      CXFA_ImageData imageData = imageValueData.GetImageData();
       WideString wsContentType, wsHref;
       if (imageData) {
         imageData.GetContent(wsValue);
@@ -199,9 +199,9 @@
         if (!pAcc)
           continue;
 
-        CXFA_Value defValue(nullptr);
-        if (wsValue.IsEmpty() && (defValue = pAcc->GetDefaultValue())) {
-          defValue.GetChildValueContent(wsValue);
+        CXFA_ValueData defValueData(nullptr);
+        if (wsValue.IsEmpty() && (defValueData = pAcc->GetDefaultValueData())) {
+          defValueData.GetChildValueContent(wsValue);
           SetValue(wsValue, XFA_VALUEPICTURE_Raw);
           pAcc->SetValue(wsValue, XFA_VALUEPICTURE_Raw);
         } else {
@@ -226,8 +226,8 @@
     case XFA_Element::ChoiceList:
       ClearAllSelections();
     default:
-      if (CXFA_Value defValue = GetDefaultValue())
-        defValue.GetChildValueContent(wsValue);
+      if (CXFA_ValueData defValueData = GetDefaultValueData())
+        defValueData.GetChildValueContent(wsValue);
 
       SetValue(wsValue, XFA_VALUEPICTURE_Raw);
       break;
@@ -237,7 +237,7 @@
 void CXFA_WidgetAcc::SetImageEdit(const WideString& wsContentType,
                                   const WideString& wsHref,
                                   const WideString& wsData) {
-  CXFA_ImageData imageData = GetFormValue().GetImageData();
+  CXFA_ImageData imageData = GetFormValueData().GetImageData();
   if (imageData) {
     imageData.SetContentType(WideString(wsContentType));
     imageData.SetHref(wsHref);
@@ -505,7 +505,7 @@
 
   if (!bVersionFlag) {
     if (CXFA_CaptionData captionData = GetCaptionData()) {
-      if (CXFA_Value capValue = captionData.GetValue()) {
+      if (CXFA_ValueData capValue = captionData.GetValueData()) {
         if (CXFA_TextData captionTextData = capValue.GetTextData())
           captionTextData.GetContent(wsCaptionName);
       }
diff --git a/xfa/fxfa/cxfa_widgetacc.h b/xfa/fxfa/cxfa_widgetacc.h
index 036a673..7c54f3d 100644
--- a/xfa/fxfa/cxfa_widgetacc.h
+++ b/xfa/fxfa/cxfa_widgetacc.h
@@ -19,7 +19,7 @@
 #include "xfa/fxfa/parser/cxfa_imagedata.h"
 #include "xfa/fxfa/parser/cxfa_margindata.h"
 #include "xfa/fxfa/parser/cxfa_scriptdata.h"
-#include "xfa/fxfa/parser/cxfa_value.h"
+#include "xfa/fxfa/parser/cxfa_valuedata.h"
 #include "xfa/fxfa/parser/cxfa_widgetdata.h"
 
 class CFGAS_GEFont;
diff --git a/xfa/fxfa/parser/cxfa_captiondata.cpp b/xfa/fxfa/parser/cxfa_captiondata.cpp
index dfaba57..b82fb98 100644
--- a/xfa/fxfa/parser/cxfa_captiondata.cpp
+++ b/xfa/fxfa/parser/cxfa_captiondata.cpp
@@ -39,7 +39,7 @@
                                : nullptr);
 }
 
-CXFA_Value CXFA_CaptionData::GetValue() {
-  return CXFA_Value(m_pNode ? m_pNode->GetChild(0, XFA_Element::Value, false)
-                            : nullptr);
+CXFA_ValueData CXFA_CaptionData::GetValueData() {
+  return CXFA_ValueData(
+      m_pNode ? m_pNode->GetChild(0, XFA_Element::Value, false) : nullptr);
 }
diff --git a/xfa/fxfa/parser/cxfa_captiondata.h b/xfa/fxfa/parser/cxfa_captiondata.h
index 6c4837f..d7fe0ba 100644
--- a/xfa/fxfa/parser/cxfa_captiondata.h
+++ b/xfa/fxfa/parser/cxfa_captiondata.h
@@ -10,7 +10,7 @@
 #include "xfa/fxfa/parser/cxfa_data.h"
 #include "xfa/fxfa/parser/cxfa_fontdata.h"
 #include "xfa/fxfa/parser/cxfa_margindata.h"
-#include "xfa/fxfa/parser/cxfa_value.h"
+#include "xfa/fxfa/parser/cxfa_valuedata.h"
 
 class CXFA_Node;
 
@@ -23,7 +23,7 @@
   float GetReserve();
   CXFA_MarginData GetMarginData();
   CXFA_FontData GetFontData();
-  CXFA_Value GetValue();
+  CXFA_ValueData GetValueData();
 };
 
 #endif  // XFA_FXFA_PARSER_CXFA_CAPTIONDATA_H_
diff --git a/xfa/fxfa/parser/cxfa_value.cpp b/xfa/fxfa/parser/cxfa_valuedata.cpp
similarity index 75%
rename from xfa/fxfa/parser/cxfa_value.cpp
rename to xfa/fxfa/parser/cxfa_valuedata.cpp
index ca3f4fd..f996897 100644
--- a/xfa/fxfa/parser/cxfa_value.cpp
+++ b/xfa/fxfa/parser/cxfa_valuedata.cpp
@@ -4,11 +4,11 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "xfa/fxfa/parser/cxfa_value.h"
+#include "xfa/fxfa/parser/cxfa_valuedata.h"
 
 #include "xfa/fxfa/parser/cxfa_node.h"
 
-XFA_Element CXFA_Value::GetChildValueClassID() {
+XFA_Element CXFA_ValueData::GetChildValueClassID() {
   if (!m_pNode)
     return XFA_Element::Unknown;
   if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
@@ -16,7 +16,7 @@
   return XFA_Element::Unknown;
 }
 
-bool CXFA_Value::GetChildValueContent(WideString& wsContent) {
+bool CXFA_ValueData::GetChildValueContent(WideString& wsContent) {
   if (!m_pNode)
     return false;
   if (CXFA_Node* pNode = m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild))
@@ -24,32 +24,32 @@
   return false;
 }
 
-CXFA_ArcData CXFA_Value::GetArcData() {
+CXFA_ArcData CXFA_ValueData::GetArcData() {
   return CXFA_ArcData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                               : nullptr);
 }
 
-CXFA_LineData CXFA_Value::GetLineData() {
+CXFA_LineData CXFA_ValueData::GetLineData() {
   return CXFA_LineData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                                : nullptr);
 }
 
-CXFA_RectangleData CXFA_Value::GetRectangleData() {
+CXFA_RectangleData CXFA_ValueData::GetRectangleData() {
   return CXFA_RectangleData(
       m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild) : nullptr);
 }
 
-CXFA_TextData CXFA_Value::GetTextData() {
+CXFA_TextData CXFA_ValueData::GetTextData() {
   return CXFA_TextData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                                : nullptr);
 }
 
-CXFA_ExData CXFA_Value::GetExData() {
+CXFA_ExData CXFA_ValueData::GetExData() {
   return CXFA_ExData(m_pNode ? m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)
                              : nullptr);
 }
 
-CXFA_ImageData CXFA_Value::GetImageData() {
+CXFA_ImageData CXFA_ValueData::GetImageData() {
   return CXFA_ImageData(
       m_pNode ? (m_pNode->GetNodeItem(XFA_NODEITEM_FirstChild)) : nullptr,
       true);
diff --git a/xfa/fxfa/parser/cxfa_value.h b/xfa/fxfa/parser/cxfa_valuedata.h
similarity index 78%
rename from xfa/fxfa/parser/cxfa_value.h
rename to xfa/fxfa/parser/cxfa_valuedata.h
index 193cc09..a1f1e41 100644
--- a/xfa/fxfa/parser/cxfa_value.h
+++ b/xfa/fxfa/parser/cxfa_valuedata.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef XFA_FXFA_PARSER_CXFA_VALUE_H_
-#define XFA_FXFA_PARSER_CXFA_VALUE_H_
+#ifndef XFA_FXFA_PARSER_CXFA_VALUEDATA_H_
+#define XFA_FXFA_PARSER_CXFA_VALUEDATA_H_
 
 #include "core/fxcrt/fx_string.h"
 #include "xfa/fxfa/parser/cxfa_arcdata.h"
@@ -18,9 +18,9 @@
 
 class CXFA_Node;
 
-class CXFA_Value : public CXFA_Data {
+class CXFA_ValueData : public CXFA_Data {
  public:
-  explicit CXFA_Value(CXFA_Node* pNode) : CXFA_Data(pNode) {}
+  explicit CXFA_ValueData(CXFA_Node* pNode) : CXFA_Data(pNode) {}
 
   XFA_Element GetChildValueClassID();
   bool GetChildValueContent(WideString& wsContent);
@@ -32,4 +32,4 @@
   CXFA_ImageData GetImageData();
 };
 
-#endif  // XFA_FXFA_PARSER_CXFA_VALUE_H_
+#endif  // XFA_FXFA_PARSER_CXFA_VALUEDATA_H_
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index d5b1609..5633530 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -69,9 +69,9 @@
 
   eWidgetType = XFA_Element::Unknown;
   XFA_Element eUIType = XFA_Element::Unknown;
-  CXFA_Value defValue(
+  CXFA_ValueData defValueData(
       pNode->JSNode()->GetProperty(0, XFA_Element::Value, true));
-  XFA_Element eValueType = defValue.GetChildValueClassID();
+  XFA_Element eValueType = defValueData.GetChildValueClassID();
   switch (eValueType) {
     case XFA_Element::Boolean:
       eUIType = XFA_Element::CheckButton;
@@ -151,7 +151,7 @@
   if (!pUIChild) {
     if (eUIType == XFA_Element::Unknown) {
       eUIType = XFA_Element::TextEdit;
-      defValue.GetNode()->JSNode()->GetProperty(0, XFA_Element::Text, true);
+      defValueData.GetNode()->JSNode()->GetProperty(0, XFA_Element::Text, true);
     }
     return pUI->JSNode()->GetProperty(0, eUIType, true);
   }
@@ -193,7 +193,7 @@
       eValueType = XFA_Element::Text;
       break;
   }
-  defValue.GetNode()->JSNode()->GetProperty(0, eValueType, true);
+  defValueData.GetNode()->JSNode()->GetProperty(0, eValueType, true);
 
   return pUIChild;
 }
@@ -332,15 +332,15 @@
   return events;
 }
 
-CXFA_Value CXFA_WidgetData::GetDefaultValue() {
+CXFA_ValueData CXFA_WidgetData::GetDefaultValueData() {
   CXFA_Node* pTemNode = m_pNode->GetTemplateNode();
-  return CXFA_Value(
+  return CXFA_ValueData(
       pTemNode ? pTemNode->JSNode()->GetProperty(0, XFA_Element::Value, false)
                : nullptr);
 }
 
-CXFA_Value CXFA_WidgetData::GetFormValue() {
-  return CXFA_Value(
+CXFA_ValueData CXFA_WidgetData::GetFormValueData() {
+  return CXFA_ValueData(
       m_pNode->JSNode()->GetProperty(0, XFA_Element::Value, false));
 }
 
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
index 40ee92d..6de00ed 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.h
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -58,8 +58,8 @@
   std::vector<CXFA_Node*> GetEventList();
   std::vector<CXFA_Node*> GetEventByActivity(int32_t iActivity,
                                              bool bIsFormReady);
-  CXFA_Value GetDefaultValue();
-  CXFA_Value GetFormValue();
+  CXFA_ValueData GetDefaultValueData();
+  CXFA_ValueData GetFormValueData();
   CXFA_CalculateData GetCalculateData();
   CXFA_ValidateData GetValidateData(bool bModified);
 
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
index 64d38bf..58ce530 100644
--- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
@@ -128,14 +128,14 @@
   CXFA_WidgetData* pWidgetData = pFormNode->GetWidgetData();
   ASSERT(pWidgetData);
   XFA_Element eUIType = pWidgetData->GetUIType();
-  CXFA_Value defValue(
+  CXFA_ValueData defValueData(
       pFormNode->JSNode()->GetProperty(0, XFA_Element::Value, true));
   if (!bDataToForm) {
     WideString wsValue;
     WideString wsFormattedValue;
     switch (eUIType) {
       case XFA_Element::ImageEdit: {
-        CXFA_ImageData imageData = defValue.GetImageData();
+        CXFA_ImageData imageData = defValueData.GetImageData();
         WideString wsContentType;
         WideString wsHref;
         if (imageData) {
@@ -157,7 +157,7 @@
         break;
       }
       case XFA_Element::ChoiceList:
-        defValue.GetChildValueContent(wsValue);
+        defValueData.GetChildValueContent(wsValue);
         if (pWidgetData->GetChoiceListOpen() == XFA_ATTRIBUTEENUM_MultiSelect) {
           std::vector<WideString> wsSelTextArray =
               pWidgetData->GetSelectedItemsValue();
@@ -185,7 +185,7 @@
         }
         break;
       case XFA_Element::CheckButton:
-        defValue.GetChildValueContent(wsValue);
+        defValueData.GetChildValueContent(wsValue);
         if (wsValue.IsEmpty())
           break;
 
@@ -204,8 +204,7 @@
           if (!pValue)
             continue;
 
-          CXFA_Value valueChild(pValue);
-          valueChild.GetChildValueContent(wsValue);
+          CXFA_ValueData(pValue).GetChildValueContent(wsValue);
           if (wsValue.IsEmpty())
             continue;
 
@@ -256,7 +255,7 @@
         break;
       }
       case XFA_Element::NumericEdit: {
-        defValue.GetChildValueContent(wsValue);
+        defValueData.GetChildValueContent(wsValue);
         if (wsValue.IsEmpty())
           break;
 
@@ -272,7 +271,7 @@
         break;
       }
       default:
-        defValue.GetChildValueContent(wsValue);
+        defValueData.GetChildValueContent(wsValue);
         if (wsValue.IsEmpty())
           break;
 
@@ -292,9 +291,9 @@
                                          false);
   switch (eUIType) {
     case XFA_Element::ImageEdit: {
-      FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+      FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                     XFA_Element::Image);
-      CXFA_ImageData imageData = defValue.GetImageData();
+      CXFA_ImageData imageData = defValueData.GetImageData();
       if (imageData) {
         CFX_XMLElement* pXMLDataElement =
             static_cast<CFX_XMLElement*>(pDataNode->GetXMLMappingNode());
@@ -328,19 +327,19 @@
             wsItem = single ? wsItem : wsItem + L"\n";
             wsNormalizeValue += wsItem;
           }
-          CXFA_ExData exData = defValue.GetExData();
+          CXFA_ExData exData = defValueData.GetExData();
           ASSERT(exData);
           exData.SetContentType(single ? L"text/plain" : L"text/xml");
         }
-        FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+        FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                       XFA_Element::ExData);
       } else {
-        FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+        FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                       XFA_Element::Text);
       }
       break;
     case XFA_Element::CheckButton:
-      FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+      FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                     XFA_Element::Text);
       break;
     case XFA_Element::ExclGroup: {
@@ -349,7 +348,7 @@
       break;
     }
     case XFA_Element::DateTimeEdit:
-      FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+      FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                     XFA_Element::DateTime);
       break;
     case XFA_Element::NumericEdit: {
@@ -360,7 +359,7 @@
         pWidgetData->NormalizeNumStr(wsNormalizeValue, wsOutput);
         wsNormalizeValue = wsOutput;
       }
-      FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+      FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                     XFA_Element::Float);
       break;
     }
@@ -370,7 +369,7 @@
     case XFA_Element::Signature:
     case XFA_Element::TextEdit:
     default:
-      FormValueNode_SetChildContent(defValue.GetNode(), wsNormalizeValue,
+      FormValueNode_SetChildContent(defValueData.GetNode(), wsNormalizeValue,
                                     XFA_Element::Text);
       break;
   }
