diff --git a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
index 72b8970..374fe56 100644
--- a/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
+++ b/fpdfsdk/fpdfxfa/cpdfxfa_docenvironment.cpp
@@ -904,16 +904,15 @@
   if (!pFormFillEnv)
     return false;
 
-  WideStringView csURLC;
-  submitData.GetSubmitTarget(csURLC);
-  WideString csURL(csURLC);
+  WideString csURL;
+  submitData.GetSubmitTarget(csURL);
   if (csURL.IsEmpty()) {
     WideString ws;
     ws.FromLocal("Submit cancelled.");
     ByteString bs = ws.UTF16LE_Encode();
     int len = bs.GetLength();
-    pFormFillEnv->Alert((FPDF_WIDESTRING)bs.GetBuffer(len),
-                        (FPDF_WIDESTRING)L"", 0, 4);
+    pFormFillEnv->Alert(reinterpret_cast<FPDF_WIDESTRING>(bs.GetBuffer(len)),
+                        reinterpret_cast<FPDF_WIDESTRING>(L""), 0, 4);
     bs.ReleaseBuffer(len);
     return false;
   }
@@ -922,10 +921,8 @@
   int fileFlag = -1;
   switch (submitData.GetSubmitFormat()) {
     case XFA_ATTRIBUTEENUM_Xdp: {
-      WideStringView csContentC;
-      submitData.GetSubmitXDPContent(csContentC);
       WideString csContent;
-      csContent = csContentC;
+      submitData.GetSubmitXDPContent(csContent);
       csContent.TrimLeft();
       csContent.TrimRight();
       WideString space;
diff --git a/fxjs/cfxjse_engine.cpp b/fxjs/cfxjse_engine.cpp
index 6339661..eb76ef1 100644
--- a/fxjs/cfxjse_engine.cpp
+++ b/fxjs/cfxjse_engine.cpp
@@ -501,11 +501,11 @@
   if (!pTextNode)
     return false;
 
-  WideStringView wsScript;
+  WideString wsScript;
   if (!pTextNode->JSNode()->TryCData(XFA_Attribute::Value, wsScript, true))
     return false;
 
-  ByteString btScript = FX_UTF8Encode(wsScript);
+  ByteString btScript = wsScript.UTF8Encode();
   auto hRetValue = pdfium::MakeUnique<CFXJSE_Value>(m_pIsolate);
   CXFA_Node* pThisObject = pParent->GetNodeItem(XFA_NODEITEM_Parent);
   CFXJSE_Context* pVariablesContext =
diff --git a/fxjs/cjx_node.cpp b/fxjs/cjx_node.cpp
index bde131a..0af6546 100644
--- a/fxjs/cjx_node.cpp
+++ b/fxjs/cjx_node.cpp
@@ -278,12 +278,7 @@
       return true;
     }
     case XFA_AttributeType::CData: {
-      WideStringView wsValueC;
-      if (!TryCData(pAttr->eName, wsValueC, bUseDefault))
-        return false;
-
-      wsValue = wsValueC;
-      return true;
+      return TryCData(pAttr->eName, wsValue, bUseDefault);
     }
     case XFA_AttributeType::Boolean: {
       bool bValue;
@@ -365,7 +360,7 @@
     return 0;
 
   if (iDesired < iCount) {
-    WideStringView wsInstManagerName = GetCData(XFA_Attribute::Name);
+    WideString wsInstManagerName = GetCData(XFA_Attribute::Name);
     WideString wsInstanceName = WideString(
         wsInstManagerName.IsEmpty()
             ? wsInstManagerName
@@ -761,7 +756,7 @@
   }
 
   CXFA_Node* pFakeRoot = GetXFANode()->Clone(false);
-  WideStringView wsContentType = GetCData(XFA_Attribute::ContentType);
+  WideString wsContentType = GetCData(XFA_Attribute::ContentType);
   if (!wsContentType.IsEmpty()) {
     pFakeRoot->JSNode()->SetCData(XFA_Attribute::ContentType,
                                   WideString(wsContentType), false, false);
@@ -2265,13 +2260,12 @@
     return;
   }
 
-  WideStringView wsName = GetCData(XFA_Attribute::Name);
+  WideString wsName = GetCData(XFA_Attribute::Name);
   CXFA_Node* pInstanceMgr = nullptr;
   for (CXFA_Node* pNode = GetXFANode()->GetNodeItem(XFA_NODEITEM_PrevSibling);
        pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
     if (pNode->GetElementType() == XFA_Element::InstanceManager) {
-      WideStringView wsInstMgrName =
-          pNode->JSNode()->GetCData(XFA_Attribute::Name);
+      WideString wsInstMgrName = pNode->JSNode()->GetCData(XFA_Attribute::Name);
       if (wsInstMgrName.GetLength() >= 1 && wsInstMgrName[0] == '_' &&
           wsInstMgrName.Right(wsInstMgrName.GetLength() - 1) == wsName) {
         pInstanceMgr = pNode;
@@ -3009,10 +3003,19 @@
 
 bool CJX_Node::TryBoolean(XFA_Attribute eAttr, bool& bValue, bool bUseDefault) {
   void* pValue = nullptr;
-  if (!GetValue(eAttr, XFA_AttributeType::Boolean, bUseDefault, pValue))
+  void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr);
+  if (GetMapModuleValue(pKey, pValue)) {
+    bValue = !!pValue;
+    return true;
+  }
+  if (!bUseDefault)
     return false;
 
-  bValue = !!pValue;
+  pdfium::Optional<bool> ret = GetXFANode()->GetDefaultBoolean(eAttr);
+  if (!ret)
+    return false;
+
+  bValue = *ret;
   return true;
 }
 
@@ -3039,22 +3042,40 @@
 bool CJX_Node::TryInteger(XFA_Attribute eAttr,
                           int32_t& iValue,
                           bool bUseDefault) {
+  void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr);
   void* pValue = nullptr;
-  if (!GetValue(eAttr, XFA_AttributeType::Integer, bUseDefault, pValue))
+  if (GetMapModuleValue(pKey, pValue)) {
+    iValue = (int32_t)(uintptr_t)pValue;
+    return true;
+  }
+  if (!bUseDefault)
     return false;
 
-  iValue = (int32_t)(uintptr_t)pValue;
+  pdfium::Optional<int32_t> ret = GetXFANode()->GetDefaultInteger(eAttr);
+  if (!ret)
+    return false;
+
+  iValue = *ret;
   return true;
 }
 
 bool CJX_Node::TryEnum(XFA_Attribute eAttr,
                        XFA_ATTRIBUTEENUM& eValue,
                        bool bUseDefault) {
+  void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr);
   void* pValue = nullptr;
-  if (!GetValue(eAttr, XFA_AttributeType::Enum, bUseDefault, pValue))
+  if (GetMapModuleValue(pKey, pValue)) {
+    eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
+    return true;
+  }
+  if (!bUseDefault)
     return false;
 
-  eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
+  pdfium::Optional<XFA_ATTRIBUTEENUM> ret = GetXFANode()->GetDefaultEnum(eAttr);
+  if (!ret)
+    return false;
+
+  eValue = *ret;
   return true;
 }
 
@@ -3091,14 +3112,14 @@
     memcpy(&mValue, pValue, sizeof(mValue));
     return true;
   }
-  if (bUseDefault &&
-      XFA_GetAttributeDefaultValue(pValue, GetXFANode()->GetElementType(),
-                                   eAttr, XFA_AttributeType::Measure,
-                                   GetXFANode()->GetPacketID())) {
-    memcpy(&mValue, pValue, sizeof(mValue));
-    return true;
-  }
-  return false;
+  if (!bUseDefault)
+    return false;
+
+  pdfium::Optional<CXFA_Measurement> measure =
+      GetXFANode()->GetDefaultMeasurement(eAttr);
+  if (measure)
+    mValue = *measure;
+  return !!measure;
 }
 
 CXFA_Measurement CJX_Node::GetMeasure(XFA_Attribute eAttr) const {
@@ -3106,9 +3127,9 @@
   return TryMeasure(eAttr, mValue, true) ? mValue : CXFA_Measurement();
 }
 
-WideStringView CJX_Node::GetCData(XFA_Attribute eAttr) {
-  WideStringView wsValue;
-  return TryCData(eAttr, wsValue, true) ? wsValue : WideStringView();
+WideString CJX_Node::GetCData(XFA_Attribute eAttr) {
+  WideString wsValue;
+  return TryCData(eAttr, wsValue, true) ? wsValue : WideString();
 }
 
 bool CJX_Node::SetCData(XFA_Attribute eAttr,
@@ -3258,41 +3279,10 @@
   if (!bUseDefault)
     return false;
 
-  void* pValue = nullptr;
-  if (XFA_GetAttributeDefaultValue(pValue, GetXFANode()->GetElementType(),
-                                   eAttr, XFA_AttributeType::CData,
-                                   GetXFANode()->GetPacketID())) {
-    wsValue = (const wchar_t*)pValue;
-    return true;
-  }
-  return false;
-}
-
-bool CJX_Node::TryCData(XFA_Attribute eAttr,
-                        WideStringView& wsValue,
-                        bool bUseDefault) {
-  void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr);
-  if (eAttr == XFA_Attribute::Value) {
-    WideString* pStr = (WideString*)GetUserData(pKey, true);
-    if (pStr) {
-      wsValue = pStr->AsStringView();
-      return true;
-    }
-  } else {
-    if (GetMapModuleString(pKey, wsValue))
-      return true;
-  }
-  if (!bUseDefault)
-    return false;
-
-  void* pValue = nullptr;
-  if (XFA_GetAttributeDefaultValue(pValue, GetXFANode()->GetElementType(),
-                                   eAttr, XFA_AttributeType::CData,
-                                   GetXFANode()->GetPacketID())) {
-    wsValue = (WideStringView)(const wchar_t*)pValue;
-    return true;
-  }
-  return false;
+  pdfium::Optional<WideString> str = GetXFANode()->GetDefaultCData(eAttr);
+  if (str)
+    wsValue = *str;
+  return !!str;
 }
 
 bool CJX_Node::SetObject(XFA_Attribute eAttr,
@@ -3352,21 +3342,6 @@
   return true;
 }
 
-bool CJX_Node::GetValue(XFA_Attribute eAttr,
-                        XFA_AttributeType eType,
-                        bool bUseDefault,
-                        void*& pValue) {
-  void* pKey = GetMapKey_Element(GetXFANode()->GetElementType(), eAttr);
-  if (GetMapModuleValue(pKey, pValue))
-    return true;
-  if (!bUseDefault)
-    return false;
-
-  return XFA_GetAttributeDefaultValue(pValue, GetXFANode()->GetElementType(),
-                                      eAttr, eType,
-                                      GetXFANode()->GetPacketID());
-}
-
 void* CJX_Node::GetUserData(void* pKey, bool bProtoAlso) {
   void* pData;
   return TryUserData(pKey, pData, bProtoAlso) ? pData : nullptr;
diff --git a/fxjs/cjx_node.h b/fxjs/cjx_node.h
index 73023e5..fa2b28e 100644
--- a/fxjs/cjx_node.h
+++ b/fxjs/cjx_node.h
@@ -72,13 +72,12 @@
   bool SetInteger(XFA_Attribute eAttr, int32_t iValue, bool bNotify);
   int32_t GetInteger(XFA_Attribute eAttr);
 
-  bool TryCData(XFA_Attribute eAttr, WideStringView& wsValue, bool bUseDefault);
   bool TryCData(XFA_Attribute eAttr, WideString& wsValue, bool bUseDefault);
   bool SetCData(XFA_Attribute eAttr,
                 const WideString& wsValue,
                 bool bNotify,
                 bool bScriptModify);
-  WideStringView GetCData(XFA_Attribute eAttr);
+  WideString GetCData(XFA_Attribute eAttr);
 
   bool TryContent(WideString& wsContent, bool bScriptModify, bool bProto);
 
@@ -409,10 +408,6 @@
                 XFA_AttributeType eType,
                 void* pValue,
                 bool bNotify);
-  bool GetValue(XFA_Attribute eAttr,
-                XFA_AttributeType eType,
-                bool bUseDefault,
-                void*& pValue);
 
   bool TryUserData(void* pKey, void*& pData, bool bProtoAlso);
 
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 57cd7d2..d076fde 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -720,18 +720,20 @@
     CXFA_BindItemsData bindItemsData(item);
     CFXJSE_Engine* pScriptContext =
         pWidgetNode->GetDocument()->GetScriptContext();
-    WideStringView wsRef;
+    WideString wsRef;
     bindItemsData.GetRef(wsRef);
     uint32_t dwStyle = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Properties |
                        XFA_RESOLVENODE_Siblings | XFA_RESOLVENODE_Parent |
                        XFA_RESOLVENODE_ALL;
     XFA_RESOLVENODE_RS rs;
-    pScriptContext->ResolveObjects(pWidgetNode, wsRef, rs, dwStyle);
+    pScriptContext->ResolveObjects(pWidgetNode, wsRef.AsStringView(), rs,
+                                   dwStyle);
     pAcc->DeleteItem(-1, false, false);
     if (rs.dwFlags != XFA_RESOLVENODE_RSTYPE_Nodes || rs.objects.empty())
       continue;
 
-    WideStringView wsValueRef, wsLabelRef;
+    WideString wsValueRef;
+    WideString wsLabelRef;
     bindItemsData.GetValueRef(wsValueRef);
     bindItemsData.GetLabelRef(wsLabelRef);
     const bool bUseValue = wsLabelRef.IsEmpty() || wsLabelRef == wsValueRef;
@@ -739,7 +741,7 @@
     const bool bValueUseContent = wsValueRef.IsEmpty() || wsValueRef == L"$";
     WideString wsValue;
     WideString wsLabel;
-    uint32_t uValueHash = FX_HashCode_GetW(wsValueRef, false);
+    uint32_t uValueHash = FX_HashCode_GetW(wsValueRef.AsStringView(), false);
     for (CXFA_Object* refObject : rs.objects) {
       CXFA_Node* refNode = refObject->AsNode();
       if (!refNode)
@@ -757,7 +759,8 @@
         if (bLabelUseContent) {
           wsLabel = refNode->JSNode()->GetContent(false);
         } else {
-          CXFA_Node* nodeLabel = refNode->GetFirstChildByName(wsLabelRef);
+          CXFA_Node* nodeLabel =
+              refNode->GetFirstChildByName(wsLabelRef.AsStringView());
           if (nodeLabel)
             wsLabel = nodeLabel->JSNode()->GetContent(false);
         }
diff --git a/xfa/fxfa/cxfa_textparser.cpp b/xfa/fxfa/cxfa_textparser.cpp
index db03ec4..0877d21 100644
--- a/xfa/fxfa/cxfa_textparser.cpp
+++ b/xfa/fxfa/cxfa_textparser.cpp
@@ -321,7 +321,7 @@
 RetainPtr<CFGAS_GEFont> CXFA_TextParser::GetFont(
     CXFA_TextProvider* pTextProvider,
     CFX_CSSComputedStyle* pStyle) const {
-  WideStringView wsFamily = L"Courier";
+  WideString wsFamily = L"Courier";
   uint32_t dwStyle = 0;
   CXFA_FontData fontData = pTextProvider->GetFontData();
   if (fontData) {
@@ -346,7 +346,7 @@
 
   CXFA_FFDoc* pDoc = pTextProvider->GetDocNode();
   CXFA_FontMgr* pFontMgr = pDoc->GetApp()->GetXFAFontMgr();
-  return pFontMgr->GetFont(pDoc, wsFamily, dwStyle);
+  return pFontMgr->GetFont(pDoc, wsFamily.AsStringView(), dwStyle);
 }
 
 float CXFA_TextParser::GetFontSize(CXFA_TextProvider* pTextProvider,
diff --git a/xfa/fxfa/cxfa_textprovider.cpp b/xfa/fxfa/cxfa_textprovider.cpp
index 279a78e..165bc09 100644
--- a/xfa/fxfa/cxfa_textprovider.cpp
+++ b/xfa/fxfa/cxfa_textprovider.cpp
@@ -99,7 +99,7 @@
 
   CXFA_Node* pNode = pItemNode->GetNodeItem(XFA_NODEITEM_FirstChild);
   while (pNode) {
-    WideStringView wsName;
+    WideString wsName;
     pNode->JSNode()->TryCData(XFA_Attribute::Name, wsName, true);
     if (m_eType == XFA_TEXTPROVIDERTYPE_Rollover && wsName == L"rollover")
       return pNode;
diff --git a/xfa/fxfa/cxfa_widgetacc.cpp b/xfa/fxfa/cxfa_widgetacc.cpp
index 7dab159..0aa91fb 100644
--- a/xfa/fxfa/cxfa_widgetacc.cpp
+++ b/xfa/fxfa/cxfa_widgetacc.cpp
@@ -1489,7 +1489,7 @@
 }
 
 RetainPtr<CFGAS_GEFont> CXFA_WidgetAcc::GetFDEFont() {
-  WideStringView wsFontName = L"Courier";
+  WideString wsFontName = L"Courier";
   uint32_t dwFontStyle = 0;
   if (CXFA_FontData fontData = GetFontData(false)) {
     if (fontData.IsBold())
@@ -1500,8 +1500,8 @@
   }
 
   auto* pDoc = GetDoc();
-  return pDoc->GetApp()->GetXFAFontMgr()->GetFont(pDoc, wsFontName,
-                                                  dwFontStyle);
+  return pDoc->GetApp()->GetXFAFontMgr()->GetFont(
+      pDoc, wsFontName.AsStringView(), dwFontStyle);
 }
 
 float CXFA_WidgetAcc::GetFontSize() {
diff --git a/xfa/fxfa/parser/cxfa_binditemsdata.cpp b/xfa/fxfa/parser/cxfa_binditemsdata.cpp
index 644b532..ac6b765 100644
--- a/xfa/fxfa/parser/cxfa_binditemsdata.cpp
+++ b/xfa/fxfa/parser/cxfa_binditemsdata.cpp
@@ -11,15 +11,15 @@
 CXFA_BindItemsData::CXFA_BindItemsData(CXFA_Node* pNode)
     : CXFA_DataData(pNode) {}
 
-void CXFA_BindItemsData::GetLabelRef(WideStringView& wsLabelRef) {
+void CXFA_BindItemsData::GetLabelRef(WideString& wsLabelRef) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::LabelRef, wsLabelRef, true);
 }
 
-void CXFA_BindItemsData::GetValueRef(WideStringView& wsValueRef) {
+void CXFA_BindItemsData::GetValueRef(WideString& wsValueRef) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::ValueRef, wsValueRef, true);
 }
 
-void CXFA_BindItemsData::GetRef(WideStringView& wsRef) {
+void CXFA_BindItemsData::GetRef(WideString& wsRef) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::Ref, wsRef, true);
 }
 
diff --git a/xfa/fxfa/parser/cxfa_binditemsdata.h b/xfa/fxfa/parser/cxfa_binditemsdata.h
index 7c7eefa..f9b506a 100644
--- a/xfa/fxfa/parser/cxfa_binditemsdata.h
+++ b/xfa/fxfa/parser/cxfa_binditemsdata.h
@@ -16,9 +16,9 @@
  public:
   explicit CXFA_BindItemsData(CXFA_Node* pNode);
 
-  void GetLabelRef(WideStringView& wsLabelRef);
-  void GetValueRef(WideStringView& wsValueRef);
-  void GetRef(WideStringView& wsRef);
+  void GetLabelRef(WideString& wsLabelRef);
+  void GetValueRef(WideString& wsValueRef);
+  void GetRef(WideString& wsRef);
   bool SetConnection(const WideString& wsConnection);
 };
 
diff --git a/xfa/fxfa/parser/cxfa_dataexporter.cpp b/xfa/fxfa/parser/cxfa_dataexporter.cpp
index 8b16ae7..c8b518c 100644
--- a/xfa/fxfa/parser/cxfa_dataexporter.cpp
+++ b/xfa/fxfa/parser/cxfa_dataexporter.cpp
@@ -54,7 +54,7 @@
          (ch >= 0x20 && ch <= 0xD7FF) || (ch >= 0xE000 && ch <= 0xFFFD);
 }
 
-WideString ExportEncodeContent(const WideStringView& str) {
+WideString ExportEncodeContent(const WideString& str) {
   CFX_WideTextBuf textBuf;
   int32_t iLen = str.GetLength();
   for (int32_t i = 0; i < iLen; i++) {
@@ -253,7 +253,7 @@
         for (int32_t i = 0; i < pdfium::CollectionSize<int32_t>(wsSelTextArray);
              i++) {
           buf << L"<value\n>";
-          buf << ExportEncodeContent(wsSelTextArray[i].AsStringView());
+          buf << ExportEncodeContent(wsSelTextArray[i]);
           buf << L"</value\n>";
         }
         buf << L"</";
@@ -262,7 +262,7 @@
         wsChildren += buf.AsStringView();
         buf.Clear();
       } else {
-        WideStringView wsValue =
+        WideString wsValue =
             pRawValueNode->JSNode()->GetCData(XFA_Attribute::Value);
         wsChildren += ExportEncodeContent(wsValue);
       }
@@ -271,7 +271,7 @@
     case XFA_ObjectType::TextNode:
     case XFA_ObjectType::NodeC:
     case XFA_ObjectType::NodeV: {
-      WideStringView wsValue = pNode->JSNode()->GetCData(XFA_Attribute::Value);
+      WideString wsValue = pNode->JSNode()->GetCData(XFA_Attribute::Value);
       wsChildren += ExportEncodeContent(wsValue);
       break;
     }
diff --git a/xfa/fxfa/parser/cxfa_document.cpp b/xfa/fxfa/parser/cxfa_document.cpp
index c374b76..f5a72bd 100644
--- a/xfa/fxfa/parser/cxfa_document.cpp
+++ b/xfa/fxfa/parser/cxfa_document.cpp
@@ -333,7 +333,7 @@
   CXFA_NodeIterator sIterator(pRoot);
   for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
        pNode = sIterator.MoveToNext()) {
-    WideStringView wsIDVal;
+    WideString wsIDVal;
     if (pNode->JSNode()->TryCData(XFA_Attribute::Id, wsIDVal, true) &&
         !wsIDVal.IsEmpty()) {
       if (wsIDVal == wsID)
@@ -353,12 +353,12 @@
   CXFA_NodeIterator sIterator(pTemplateRoot);
   for (CXFA_Node* pNode = sIterator.GetCurrent(); pNode;
        pNode = sIterator.MoveToNext()) {
-    WideStringView wsIDVal;
+    WideString wsIDVal;
     if (pNode->JSNode()->TryCData(XFA_Attribute::Id, wsIDVal, true) &&
         !wsIDVal.IsEmpty()) {
-      mIDMap[FX_HashCode_GetW(wsIDVal, false)] = pNode;
+      mIDMap[FX_HashCode_GetW(wsIDVal.AsStringView(), false)] = pNode;
     }
-    WideStringView wsUseVal;
+    WideString wsUseVal;
     if (pNode->JSNode()->TryCData(XFA_Attribute::Use, wsUseVal, true) &&
         !wsUseVal.IsEmpty()) {
       sUseNodes.insert(pNode);
diff --git a/xfa/fxfa/parser/cxfa_eventdata.cpp b/xfa/fxfa/parser/cxfa_eventdata.cpp
index 0210fdc..387b732 100644
--- a/xfa/fxfa/parser/cxfa_eventdata.cpp
+++ b/xfa/fxfa/parser/cxfa_eventdata.cpp
@@ -26,7 +26,7 @@
   return XFA_Element::Unknown;
 }
 
-void CXFA_EventData::GetRef(WideStringView& wsRef) {
+void CXFA_EventData::GetRef(WideString& wsRef) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::Ref, wsRef, true);
 }
 
@@ -44,7 +44,5 @@
   if (!pNode)
     return;
 
-  WideStringView wsCData;
-  pNode->JSNode()->TryCData(XFA_Attribute::Target, wsCData, true);
-  wsTarget = wsCData;
+  pNode->JSNode()->TryCData(XFA_Attribute::Target, wsTarget, true);
 }
diff --git a/xfa/fxfa/parser/cxfa_eventdata.h b/xfa/fxfa/parser/cxfa_eventdata.h
index 90b1b87..98b85e6 100644
--- a/xfa/fxfa/parser/cxfa_eventdata.h
+++ b/xfa/fxfa/parser/cxfa_eventdata.h
@@ -24,7 +24,7 @@
   XFA_Element GetEventType() const;
   CXFA_ScriptData GetScriptData() const;
   CXFA_SubmitData GetSubmitData() const;
-  void GetRef(WideStringView& wsRef);
+  void GetRef(WideString& wsRef);
   void GetSignDataTarget(WideString& wsTarget);
 };
 
diff --git a/xfa/fxfa/parser/cxfa_filldata.cpp b/xfa/fxfa/parser/cxfa_filldata.cpp
index 65ad396..fbc79ad 100644
--- a/xfa/fxfa/parser/cxfa_filldata.cpp
+++ b/xfa/fxfa/parser/cxfa_filldata.cpp
@@ -31,9 +31,9 @@
 
 FX_ARGB CXFA_FillData::GetColor(bool bText) {
   if (CXFA_Node* pNode = m_pNode->GetChild(0, XFA_Element::Color, false)) {
-    WideStringView wsColor;
+    WideString wsColor;
     if (pNode->JSNode()->TryCData(XFA_Attribute::Value, wsColor, false))
-      return CXFA_DataData::ToColor(wsColor);
+      return CXFA_DataData::ToColor(wsColor.AsStringView());
   }
   if (bText)
     return 0xFF000000;
@@ -56,9 +56,9 @@
   CXFA_Node* pNode =
       m_pNode->JSNode()->GetProperty(0, XFA_Element::Pattern, true);
   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_Element::Color, false)) {
-    WideStringView wsColor;
+    WideString wsColor;
     pColor->JSNode()->TryCData(XFA_Attribute::Value, wsColor, false);
-    foreColor = CXFA_DataData::ToColor(wsColor);
+    foreColor = CXFA_DataData::ToColor(wsColor.AsStringView());
   } else {
     foreColor = 0xFF000000;
   }
@@ -71,9 +71,9 @@
   int32_t eAttr = 50;
   pNode->JSNode()->TryInteger(XFA_Attribute::Rate, eAttr, true);
   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_Element::Color, false)) {
-    WideStringView wsColor;
+    WideString wsColor;
     pColor->JSNode()->TryCData(XFA_Attribute::Value, wsColor, false);
-    stippleColor = CXFA_DataData::ToColor(wsColor);
+    stippleColor = CXFA_DataData::ToColor(wsColor.AsStringView());
   } else {
     stippleColor = 0xFF000000;
   }
@@ -86,9 +86,9 @@
   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToRight;
   pNode->JSNode()->TryEnum(XFA_Attribute::Type, eAttr, true);
   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_Element::Color, false)) {
-    WideStringView wsColor;
+    WideString wsColor;
     pColor->JSNode()->TryCData(XFA_Attribute::Value, wsColor, false);
-    endColor = CXFA_DataData::ToColor(wsColor);
+    endColor = CXFA_DataData::ToColor(wsColor.AsStringView());
   } else {
     endColor = 0xFF000000;
   }
@@ -101,9 +101,9 @@
   XFA_ATTRIBUTEENUM eAttr = XFA_ATTRIBUTEENUM_ToEdge;
   pNode->JSNode()->TryEnum(XFA_Attribute::Type, eAttr, true);
   if (CXFA_Node* pColor = pNode->GetChild(0, XFA_Element::Color, false)) {
-    WideStringView wsColor;
+    WideString wsColor;
     pColor->JSNode()->TryCData(XFA_Attribute::Value, wsColor, false);
-    endColor = CXFA_DataData::ToColor(wsColor);
+    endColor = CXFA_DataData::ToColor(wsColor.AsStringView());
   } else {
     endColor = 0xFF000000;
   }
diff --git a/xfa/fxfa/parser/cxfa_fontdata.cpp b/xfa/fxfa/parser/cxfa_fontdata.cpp
index f5fe270..87bea17 100644
--- a/xfa/fxfa/parser/cxfa_fontdata.cpp
+++ b/xfa/fxfa/parser/cxfa_fontdata.cpp
@@ -35,11 +35,11 @@
 }
 
 float CXFA_FontData::GetLetterSpacing() {
-  WideStringView wsValue;
+  WideString wsValue;
   if (!m_pNode->JSNode()->TryCData(XFA_Attribute::LetterSpacing, wsValue, true))
     return 0;
 
-  CXFA_Measurement ms(wsValue);
+  CXFA_Measurement ms(wsValue.AsStringView());
   if (ms.GetUnit() == XFA_Unit::Em)
     return ms.GetValue() * GetFontSize();
   return ms.ToUnit(XFA_Unit::Pt);
@@ -69,7 +69,7 @@
   return ms.ToUnit(XFA_Unit::Pt);
 }
 
-void CXFA_FontData::GetTypeface(WideStringView& wsTypeFace) {
+void CXFA_FontData::GetTypeface(WideString& wsTypeFace) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::Typeface, wsTypeFace, true);
 }
 
diff --git a/xfa/fxfa/parser/cxfa_fontdata.h b/xfa/fxfa/parser/cxfa_fontdata.h
index d926fd3..ae5e4ac 100644
--- a/xfa/fxfa/parser/cxfa_fontdata.h
+++ b/xfa/fxfa/parser/cxfa_fontdata.h
@@ -24,7 +24,7 @@
   int32_t GetUnderline();
   int32_t GetUnderlinePeriod();
   float GetFontSize();
-  void GetTypeface(WideStringView& wsTypeFace);
+  void GetTypeface(WideString& wsTypeFace);
 
   bool IsBold();
   bool IsItalic();
diff --git a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
index 752d374..189a466 100644
--- a/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
+++ b/xfa/fxfa/parser/cxfa_itemlayoutprocessor.cpp
@@ -1779,10 +1779,10 @@
   float fContentWidthLimit =
       bContainerWidthAutoSize ? FLT_MAX
                               : containerSize.width - fLeftInset - fRightInset;
-  WideStringView wsColumnWidths;
+  WideString wsColumnWidths;
   if (pLayoutNode->JSNode()->TryCData(XFA_Attribute::ColumnWidths,
                                       wsColumnWidths, true)) {
-    auto widths = SeparateStringW(wsColumnWidths.unterminated_c_str(),
+    auto widths = SeparateStringW(wsColumnWidths.c_str(),
                                   wsColumnWidths.GetLength(), L' ');
     for (auto& width : widths) {
       width.TrimLeft(L' ');
diff --git a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
index a24cce4..57d71ff 100644
--- a/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
+++ b/xfa/fxfa/parser/cxfa_layoutpagemgr.cpp
@@ -65,7 +65,7 @@
 
 uint32_t GetRelevant(CXFA_Node* pFormItem, uint32_t dwParentRelvant) {
   uint32_t dwRelevant = XFA_WidgetStatus_Viewable | XFA_WidgetStatus_Printable;
-  WideStringView wsRelevant;
+  WideString wsRelevant;
   if (pFormItem->JSNode()->TryCData(XFA_Attribute::Relevant, wsRelevant,
                                     true)) {
     if (wsRelevant == L"+print" || wsRelevant == L"print")
@@ -137,12 +137,11 @@
 
 CXFA_Node* ResolveBreakTarget(CXFA_Node* pPageSetRoot,
                               bool bNewExprStyle,
-                              WideStringView& wsTargetExpr) {
+                              WideString& wsTargetAll) {
   CXFA_Document* pDocument = pPageSetRoot->GetDocument();
-  if (wsTargetExpr.IsEmpty())
+  if (wsTargetAll.IsEmpty())
     return nullptr;
 
-  WideString wsTargetAll(wsTargetExpr);
   wsTargetAll.TrimLeft();
   wsTargetAll.TrimRight();
   int32_t iSplitIndex = 0;
@@ -811,7 +810,8 @@
   switch (eType) {
     case XFA_Element::BreakBefore:
     case XFA_Element::BreakAfter: {
-      WideStringView wsBreakLeader, wsBreakTrailer;
+      WideString wsBreakLeader;
+      WideString wsBreakTrailer;
       CXFA_Node* pFormNode = pCurNode->GetNodeItem(
           XFA_NODEITEM_Parent, XFA_ObjectType::ContainerNode);
       CXFA_Node* pContainer = pFormNode->GetTemplateNode();
@@ -821,8 +821,7 @@
       if (pScript && !XFA_LayoutPageMgr_RunBreakTestScript(pScript))
         return false;
 
-      WideStringView wsTarget =
-          pCurNode->JSNode()->GetCData(XFA_Attribute::Target);
+      WideString wsTarget = pCurNode->JSNode()->GetCData(XFA_Attribute::Target);
       CXFA_Node* pTarget =
           ResolveBreakTarget(m_pTemplatePageSetRoot, true, wsTarget);
       wsBreakTrailer = pCurNode->JSNode()->GetCData(XFA_Attribute::Trailer);
@@ -859,7 +858,7 @@
     case XFA_Element::Break: {
       bool bStartNew =
           pCurNode->JSNode()->GetInteger(XFA_Attribute::StartNew) != 0;
-      WideStringView wsTarget = pCurNode->JSNode()->GetCData(
+      WideString wsTarget = pCurNode->JSNode()->GetCData(
           bBefore ? XFA_Attribute::BeforeTarget : XFA_Attribute::AfterTarget);
       CXFA_Node* pTarget =
           ResolveBreakTarget(m_pTemplatePageSetRoot, true, wsTarget);
@@ -950,9 +949,9 @@
           ->GetNodeItem(XFA_NODEITEM_Parent, XFA_ObjectType::ContainerNode)
           ->GetTemplateNode();
   if (pOverflowNode->GetElementType() == XFA_Element::Break) {
-    WideStringView wsOverflowLeader;
-    WideStringView wsOverflowTarget;
-    WideStringView wsOverflowTrailer;
+    WideString wsOverflowLeader;
+    WideString wsOverflowTarget;
+    WideString wsOverflowTrailer;
     pOverflowNode->JSNode()->TryCData(XFA_Attribute::OverflowLeader,
                                       wsOverflowLeader, true);
     pOverflowNode->JSNode()->TryCData(XFA_Attribute::OverflowTrailer,
@@ -995,9 +994,9 @@
   if (pOverflowNode->GetElementType() != XFA_Element::Overflow)
     return nullptr;
 
-  WideStringView wsOverflowLeader;
-  WideStringView wsOverflowTrailer;
-  WideStringView wsOverflowTarget;
+  WideString wsOverflowLeader;
+  WideString wsOverflowTrailer;
+  WideString wsOverflowTarget;
   pOverflowNode->JSNode()->TryCData(XFA_Attribute::Leader, wsOverflowLeader,
                                     true);
   pOverflowNode->JSNode()->TryCData(XFA_Attribute::Trailer, wsOverflowTrailer,
@@ -1087,7 +1086,7 @@
     CXFA_Node* pBookendNode,
     bool bLeader,
     CXFA_Node*& pBookendAppendTemplate) {
-  WideStringView wsBookendLeader;
+  WideString wsBookendLeader;
   CXFA_Node* pContainer =
       pBookendNode
           ->GetNodeItem(XFA_NODEITEM_Parent, XFA_ObjectType::ContainerNode)
@@ -1667,9 +1666,9 @@
   for (CXFA_Node* pCurNode = pFormNode->GetNodeItem(XFA_NODEITEM_FirstChild);
        pCurNode; pCurNode = pCurNode->GetNodeItem((XFA_NODEITEM_NextSibling))) {
     if (pCurNode->GetElementType() == XFA_Element::Break) {
-      WideStringView wsOverflowLeader;
-      WideStringView wsOverflowTarget;
-      WideStringView wsOverflowTrailer;
+      WideString wsOverflowLeader;
+      WideString wsOverflowTarget;
+      WideString wsOverflowTrailer;
       pCurNode->JSNode()->TryCData(XFA_Attribute::OverflowLeader,
                                    wsOverflowLeader, true);
       pCurNode->JSNode()->TryCData(XFA_Attribute::OverflowTrailer,
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index 2ab0b18..c906d26 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -199,10 +199,10 @@
       WideString wsName;
       JSNode()->GetAttribute(XFA_Attribute::Name, wsName, false);
       auto pCloneXMLElement = pdfium::MakeUnique<CFX_XMLElement>(wsName);
-      WideStringView wsValue = JSNode()->GetCData(XFA_Attribute::Value);
-      if (!wsValue.IsEmpty()) {
+      WideString wsValue = JSNode()->GetCData(XFA_Attribute::Value);
+      if (!wsValue.IsEmpty())
         pCloneXMLElement->SetTextData(WideString(wsValue));
-      }
+
       pCloneXML.reset(pCloneXMLElement.release());
       pClone->JSNode()->SetEnum(XFA_Attribute::Contains,
                                 XFA_ATTRIBUTEENUM_Unknown, false);
@@ -852,18 +852,17 @@
       if (pNode->m_pXMLNode->GetType() == FX_XMLNODE_Element) {
         CFX_XMLElement* pXMLElement =
             static_cast<CFX_XMLElement*>(pNode->m_pXMLNode);
-        WideStringView wsAttributeName =
+        WideString wsAttributeName =
             pNode->JSNode()->GetCData(XFA_Attribute::QualifiedName);
-        // TODO(tsepez): check usage of c_str() below.
-        pXMLElement->RemoveAttribute(wsAttributeName.unterminated_c_str());
+        pXMLElement->RemoveAttribute(wsAttributeName.c_str());
       }
       WideString wsName;
       pNode->JSNode()->GetAttribute(XFA_Attribute::Name, wsName, false);
       CFX_XMLElement* pNewXMLElement = new CFX_XMLElement(wsName);
-      WideStringView wsValue = JSNode()->GetCData(XFA_Attribute::Value);
-      if (!wsValue.IsEmpty()) {
+      WideString wsValue = JSNode()->GetCData(XFA_Attribute::Value);
+      if (!wsValue.IsEmpty())
         pNewXMLElement->SetTextData(WideString(wsValue));
-      }
+
       pNode->m_pXMLNode = pNewXMLElement;
       pNode->JSNode()->SetEnum(XFA_Attribute::Contains,
                                XFA_ATTRIBUTEENUM_Unknown, false);
@@ -963,9 +962,8 @@
         break;
       }
       if (eType == XFA_Element::InstanceManager) {
-        WideStringView wsName = JSNode()->GetCData(XFA_Attribute::Name);
-        WideStringView wsInstName =
-            pNode->JSNode()->GetCData(XFA_Attribute::Name);
+        WideString wsName = JSNode()->GetCData(XFA_Attribute::Name);
+        WideString wsInstName = pNode->JSNode()->GetCData(XFA_Attribute::Name);
         if (wsInstName.GetLength() > 0 && wsInstName[0] == '_' &&
             wsInstName.Right(wsInstName.GetLength() - 1) == wsName) {
           pInstanceMgr = pNode;
@@ -1020,14 +1018,14 @@
 void CXFA_Node::UpdateNameHash() {
   const XFA_NOTSUREATTRIBUTE* pNotsure =
       XFA_GetNotsureAttribute(GetElementType(), XFA_Attribute::Name);
-  WideStringView wsName;
+  WideString wsName;
   if (!pNotsure || pNotsure->eType == XFA_AttributeType::CData) {
     wsName = JSNode()->GetCData(XFA_Attribute::Name);
-    m_dwNameHash = FX_HashCode_GetW(wsName, false);
+    m_dwNameHash = FX_HashCode_GetW(wsName.AsStringView(), false);
   } else if (pNotsure->eType == XFA_AttributeType::Enum) {
     wsName =
         GetAttributeEnumByID(JSNode()->GetEnum(XFA_Attribute::Name))->pName;
-    m_dwNameHash = FX_HashCode_GetW(wsName, false);
+    m_dwNameHash = FX_HashCode_GetW(wsName.AsStringView(), false);
   }
 }
 
@@ -1058,8 +1056,8 @@
       continue;
     }
     if (iCount == 0) {
-      WideStringView wsName = pNode->JSNode()->GetCData(XFA_Attribute::Name);
-      WideStringView wsInstName = JSNode()->GetCData(XFA_Attribute::Name);
+      WideString wsName = pNode->JSNode()->GetCData(XFA_Attribute::Name);
+      WideString wsInstName = JSNode()->GetCData(XFA_Attribute::Name);
       if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
           wsInstName.Right(wsInstName.GetLength() - 1) != wsName) {
         return nullptr;
@@ -1089,8 +1087,8 @@
       continue;
     }
     if (iCount == 0) {
-      WideStringView wsName = pNode->JSNode()->GetCData(XFA_Attribute::Name);
-      WideStringView wsInstName = JSNode()->GetCData(XFA_Attribute::Name);
+      WideString wsName = pNode->JSNode()->GetCData(XFA_Attribute::Name);
+      WideString wsInstName = JSNode()->GetCData(XFA_Attribute::Name);
       if (wsInstName.GetLength() < 1 || wsInstName[0] != '_' ||
           wsInstName.Right(wsInstName.GetLength() - 1) != wsName) {
         return iCount;
@@ -1229,3 +1227,57 @@
   return pInstance;
 }
 
+pdfium::Optional<bool> CXFA_Node::GetDefaultBoolean(XFA_Attribute attr) const {
+  void* pValue = nullptr;
+  if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr,
+                                    XFA_AttributeType::Boolean,
+                                    GetPacketID())) {
+    return {};
+  }
+  return {!!pValue};
+}
+
+pdfium::Optional<int32_t> CXFA_Node::GetDefaultInteger(
+    XFA_Attribute attr) const {
+  void* pValue = nullptr;
+  if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr,
+                                    XFA_AttributeType::Integer,
+                                    GetPacketID())) {
+    return {};
+  }
+  return {static_cast<int32_t>(reinterpret_cast<uintptr_t>(pValue))};
+}
+
+pdfium::Optional<CXFA_Measurement> CXFA_Node::GetDefaultMeasurement(
+    XFA_Attribute attr) const {
+  void* pValue = nullptr;
+  if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr,
+                                    XFA_AttributeType::Measure,
+                                    GetPacketID())) {
+    return {};
+  }
+  CXFA_Measurement measure;
+  memcpy(&measure, pValue, sizeof(measure));
+  return {measure};
+}
+
+pdfium::Optional<WideString> CXFA_Node::GetDefaultCData(
+    XFA_Attribute attr) const {
+  void* pValue = nullptr;
+  if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr,
+                                    XFA_AttributeType::CData, GetPacketID())) {
+    return {};
+  }
+  WideStringView view((const wchar_t*)pValue);
+  return {WideString(view)};
+}
+
+pdfium::Optional<XFA_ATTRIBUTEENUM> CXFA_Node::GetDefaultEnum(
+    XFA_Attribute attr) const {
+  void* pValue = nullptr;
+  if (!XFA_GetAttributeDefaultValue(pValue, GetElementType(), attr,
+                                    XFA_AttributeType::Enum, GetPacketID())) {
+    return {};
+  }
+  return {static_cast<XFA_ATTRIBUTEENUM>(reinterpret_cast<uintptr_t>(pValue))};
+}
diff --git a/xfa/fxfa/parser/cxfa_node.h b/xfa/fxfa/parser/cxfa_node.h
index 073fd52..66a3174 100644
--- a/xfa/fxfa/parser/cxfa_node.h
+++ b/xfa/fxfa/parser/cxfa_node.h
@@ -140,6 +140,13 @@
 
   CXFA_Node* GetOccurNode();
 
+  pdfium::Optional<bool> GetDefaultBoolean(XFA_Attribute attr) const;
+  pdfium::Optional<int32_t> GetDefaultInteger(XFA_Attribute attr) const;
+  pdfium::Optional<CXFA_Measurement> GetDefaultMeasurement(
+      XFA_Attribute attr) const;
+  pdfium::Optional<WideString> GetDefaultCData(XFA_Attribute attr) const;
+  pdfium::Optional<XFA_ATTRIBUTEENUM> GetDefaultEnum(XFA_Attribute attr) const;
+
  private:
   CXFA_Node(CXFA_Document* pDoc,
             uint16_t ePacket,
diff --git a/xfa/fxfa/parser/cxfa_scriptdata.cpp b/xfa/fxfa/parser/cxfa_scriptdata.cpp
index ea957f9..f7352be 100644
--- a/xfa/fxfa/parser/cxfa_scriptdata.cpp
+++ b/xfa/fxfa/parser/cxfa_scriptdata.cpp
@@ -11,7 +11,7 @@
 CXFA_ScriptData::CXFA_ScriptData(CXFA_Node* pNode) : CXFA_DataData(pNode) {}
 
 XFA_ScriptDataType CXFA_ScriptData::GetContentType() {
-  WideStringView cData;
+  WideString cData;
   if (!m_pNode->JSNode()->TryCData(XFA_Attribute::ContentType, cData, false))
     return XFA_ScriptDataType::Formcalc;
   if (cData == L"application/x-javascript")
diff --git a/xfa/fxfa/parser/cxfa_simple_parser.cpp b/xfa/fxfa/parser/cxfa_simple_parser.cpp
index 7921435..579ca9e 100644
--- a/xfa/fxfa/parser/cxfa_simple_parser.cpp
+++ b/xfa/fxfa/parser/cxfa_simple_parser.cpp
@@ -60,8 +60,8 @@
 WideString GetElementTagNamespaceURI(CFX_XMLElement* pElement) {
   WideString wsNodeStr = pElement->GetNamespacePrefix();
   WideString wsNamespaceURI;
-  if (!XFA_FDEExtension_ResolveNamespaceQualifier(
-          pElement, wsNodeStr.AsStringView(), &wsNamespaceURI)) {
+  if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNodeStr,
+                                                  &wsNamespaceURI)) {
     return WideString();
   }
   return wsNamespaceURI;
@@ -103,21 +103,20 @@
 }
 
 bool ResolveAttribute(CFX_XMLElement* pElement,
-                      const WideStringView& wsAttributeName,
+                      const WideString& wsAttrName,
                       WideString& wsLocalAttrName,
                       WideString& wsNamespaceURI) {
-  WideString wsAttrName(wsAttributeName);
   WideString wsNSPrefix;
-  if (GetAttributeLocalName(wsAttributeName, wsLocalAttrName)) {
-    wsNSPrefix = wsAttrName.Left(wsAttributeName.GetLength() -
+  if (GetAttributeLocalName(wsAttrName.AsStringView(), wsLocalAttrName)) {
+    wsNSPrefix = wsAttrName.Left(wsAttrName.GetLength() -
                                  wsLocalAttrName.GetLength() - 1);
   }
   if (wsLocalAttrName == L"xmlns" || wsNSPrefix == L"xmlns" ||
       wsNSPrefix == L"xml") {
     return false;
   }
-  if (!XFA_FDEExtension_ResolveNamespaceQualifier(
-          pElement, wsNSPrefix.AsStringView(), &wsNamespaceURI)) {
+  if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
+                                                  &wsNamespaceURI)) {
     wsNamespaceURI.clear();
     return false;
   }
@@ -147,8 +146,8 @@
       wsNSPrefix = it.first.Left(pos.value());
     }
 
-    if (!XFA_FDEExtension_ResolveNamespaceQualifier(
-            pElement, wsNSPrefix.AsStringView(), &wsAttrNS)) {
+    if (!XFA_FDEExtension_ResolveNamespaceQualifier(pElement, wsNSPrefix,
+                                                    &wsAttrNS)) {
       continue;
     }
     if (bMatchNSAsPrefix) {
@@ -388,10 +387,9 @@
   return m_pXMLDoc.get();
 }
 
-bool XFA_FDEExtension_ResolveNamespaceQualifier(
-    CFX_XMLElement* pNode,
-    const WideStringView& wsQualifier,
-    WideString* wsNamespaceURI) {
+bool XFA_FDEExtension_ResolveNamespaceQualifier(CFX_XMLElement* pNode,
+                                                const WideString& wsQualifier,
+                                                WideString* wsNamespaceURI) {
   if (!pNode)
     return false;
 
@@ -952,7 +950,7 @@
                                          XFA_XDPPACKET ePacketID) {
   XFA_Element element = XFA_Element::Sharptext;
   if (pXFANode->GetElementType() == XFA_Element::ExData) {
-    WideStringView wsContentType =
+    WideString wsContentType =
         pXFANode->JSNode()->GetCData(XFA_Attribute::ContentType);
     if (wsContentType == L"text/html")
       element = XFA_Element::SharpxHTML;
@@ -1072,8 +1070,7 @@
         for (auto it : pXMLElement->GetAttributes()) {
           WideString wsName;
           WideString wsNS;
-          if (!ResolveAttribute(pXMLElement, it.first.AsStringView(), wsName,
-                                wsNS)) {
+          if (!ResolveAttribute(pXMLElement, it.first, wsName, wsNS)) {
             continue;
           }
           if (wsName == L"nil" && it.second == L"true") {
@@ -1205,7 +1202,7 @@
       pXFANode->InsertChild(pXFAChild, nullptr);
       pXFAChild->SetXMLMappingNode(pXMLChild);
       pXFAChild->SetFlag(XFA_NodeFlag_Initialized, false);
-      WideStringView wsCurValue =
+      WideString wsCurValue =
           pXFAChild->JSNode()->GetCData(XFA_Attribute::Value);
       wsValueTextBuf << wsCurValue;
     }
diff --git a/xfa/fxfa/parser/cxfa_strokedata.cpp b/xfa/fxfa/parser/cxfa_strokedata.cpp
index 93247e3..76798cb 100644
--- a/xfa/fxfa/parser/cxfa_strokedata.cpp
+++ b/xfa/fxfa/parser/cxfa_strokedata.cpp
@@ -32,9 +32,7 @@
 
 CXFA_Measurement CXFA_StrokeData::GetMSThickness() const {
   return m_pNode ? m_pNode->JSNode()->GetMeasure(XFA_Attribute::Thickness)
-                 : XFA_GetAttributeDefaultValue_Measure(
-                       XFA_Element::Edge, XFA_Attribute::Thickness,
-                       XFA_XDPPACKET_Form);
+                 : CXFA_Measurement(0.5, XFA_Unit::Pt);
 }
 
 void CXFA_StrokeData::SetMSThickness(CXFA_Measurement msThinkness) {
@@ -52,9 +50,9 @@
   if (!pNode)
     return 0xFF000000;
 
-  WideStringView wsColor;
+  WideString wsColor;
   pNode->JSNode()->TryCData(XFA_Attribute::Value, wsColor, true);
-  return CXFA_DataData::ToColor(wsColor);
+  return CXFA_DataData::ToColor(wsColor.AsStringView());
 }
 
 void CXFA_StrokeData::SetColor(FX_ARGB argb) {
diff --git a/xfa/fxfa/parser/cxfa_submitdata.cpp b/xfa/fxfa/parser/cxfa_submitdata.cpp
index 629cb9e..1d4b91c 100644
--- a/xfa/fxfa/parser/cxfa_submitdata.cpp
+++ b/xfa/fxfa/parser/cxfa_submitdata.cpp
@@ -18,10 +18,10 @@
   return m_pNode->JSNode()->GetEnum(XFA_Attribute::Format);
 }
 
-void CXFA_SubmitData::GetSubmitTarget(WideStringView& wsTarget) {
+void CXFA_SubmitData::GetSubmitTarget(WideString& wsTarget) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::Target, wsTarget, true);
 }
 
-void CXFA_SubmitData::GetSubmitXDPContent(WideStringView& wsContent) {
+void CXFA_SubmitData::GetSubmitXDPContent(WideString& wsContent) {
   m_pNode->JSNode()->TryCData(XFA_Attribute::XdpContent, wsContent, true);
 }
diff --git a/xfa/fxfa/parser/cxfa_submitdata.h b/xfa/fxfa/parser/cxfa_submitdata.h
index 28cb3c2..e90848d 100644
--- a/xfa/fxfa/parser/cxfa_submitdata.h
+++ b/xfa/fxfa/parser/cxfa_submitdata.h
@@ -19,8 +19,8 @@
 
   bool IsSubmitEmbedPDF();
   int32_t GetSubmitFormat();
-  void GetSubmitTarget(WideStringView& wsTarget);
-  void GetSubmitXDPContent(WideStringView& wsContent);
+  void GetSubmitTarget(WideString& wsTarget);
+  void GetSubmitXDPContent(WideString& wsContent);
 };
 
 #endif  // XFA_FXFA_PARSER_CXFA_SUBMITDATA_H_
diff --git a/xfa/fxfa/parser/cxfa_validatedata.cpp b/xfa/fxfa/parser/cxfa_validatedata.cpp
index c332b12..c7cfbab 100644
--- a/xfa/fxfa/parser/cxfa_validatedata.cpp
+++ b/xfa/fxfa/parser/cxfa_validatedata.cpp
@@ -45,7 +45,7 @@
     if (pItemNode->GetElementType() != XFA_Element::Text)
       continue;
 
-    WideStringView wsName;
+    WideString wsName;
     pItemNode->JSNode()->TryCData(XFA_Attribute::Name, wsName, true);
     if (wsName.IsEmpty() || wsName == wsMessageType) {
       pItemNode->JSNode()->TryContent(wsMessage, false, true);
@@ -83,7 +83,7 @@
     if (pItemNode->GetElementType() != XFA_Element::Text)
       continue;
 
-    WideStringView wsName;
+    WideString wsName;
     pItemNode->JSNode()->TryCData(XFA_Attribute::Name, wsName, true);
     if (wsName.IsEmpty() || wsName == wsMessageType) {
       pItemNode->JSNode()->SetContent(wsMessage, wsMessage, false, false, true);
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.cpp b/xfa/fxfa/parser/cxfa_widgetdata.cpp
index 48832eb..2e9eda8 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.cpp
+++ b/xfa/fxfa/parser/cxfa_widgetdata.cpp
@@ -198,39 +198,6 @@
   return pUIChild;
 }
 
-XFA_ATTRIBUTEENUM GetAttributeDefaultValue_Enum(XFA_Element eElement,
-                                                XFA_Attribute eAttribute,
-                                                uint32_t dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_AttributeType::Enum, dwPacket)) {
-    return (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
-  }
-  return XFA_ATTRIBUTEENUM_Unknown;
-}
-
-WideStringView GetAttributeDefaultValue_Cdata(XFA_Element eElement,
-                                              XFA_Attribute eAttribute,
-                                              uint32_t dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_AttributeType::CData, dwPacket)) {
-    return (const wchar_t*)pValue;
-  }
-  return nullptr;
-}
-
-bool GetAttributeDefaultValue_Boolean(XFA_Element eElement,
-                                      XFA_Attribute eAttribute,
-                                      uint32_t dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_AttributeType::Boolean, dwPacket)) {
-    return !!pValue;
-  }
-  return false;
-}
-
 }  // namespace
 
 CXFA_WidgetData::CXFA_WidgetData(CXFA_Node* pNode)
@@ -315,7 +282,7 @@
     CXFA_EventData eventData(pNode);
     if (eventData.GetActivity() == iActivity) {
       if (iActivity == XFA_ATTRIBUTEENUM_Ready) {
-        WideStringView wsRef;
+        WideString wsRef;
         eventData.GetRef(wsRef);
         if (bIsFormReady) {
           if (wsRef == WideStringView(L"$form"))
@@ -427,12 +394,11 @@
   return CFX_RectF(fLeftInset, fTopInset, fRightInset, fBottomInset);
 }
 
-int32_t CXFA_WidgetData::GetButtonHighlight() {
+XFA_ATTRIBUTEENUM CXFA_WidgetData::GetButtonHighlight() {
   CXFA_Node* pUIChild = GetUIChild();
   if (pUIChild)
     return pUIChild->JSNode()->GetEnum(XFA_Attribute::Highlight);
-  return GetAttributeDefaultValue_Enum(
-      XFA_Element::Button, XFA_Attribute::Highlight, XFA_XDPPACKET_Form);
+  return XFA_ATTRIBUTEENUM_Inverted;
 }
 
 bool CXFA_WidgetData::GetButtonRollover(WideString& wsRollover,
@@ -440,7 +406,7 @@
   if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_Element::Items, false)) {
     CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
     while (pText) {
-      WideStringView wsName;
+      WideString wsName;
       pText->JSNode()->TryCData(XFA_Attribute::Name, wsName, true);
       if (wsName == L"rollover") {
         pText->JSNode()->TryContent(wsRollover, false, true);
@@ -457,7 +423,7 @@
   if (CXFA_Node* pItems = m_pNode->GetChild(0, XFA_Element::Items, false)) {
     CXFA_Node* pText = pItems->GetNodeItem(XFA_NODEITEM_FirstChild);
     while (pText) {
-      WideStringView wsName;
+      WideString wsName;
       pText->JSNode()->TryCData(XFA_Attribute::Name, wsName, true);
       if (wsName == L"down") {
         pText->JSNode()->TryContent(wsDown, false, true);
@@ -470,46 +436,39 @@
   return false;
 }
 
-int32_t CXFA_WidgetData::GetCheckButtonShape() {
+XFA_ATTRIBUTEENUM CXFA_WidgetData::GetCheckButtonShape() {
   CXFA_Node* pUIChild = GetUIChild();
   if (pUIChild)
     return pUIChild->JSNode()->GetEnum(XFA_Attribute::Shape);
-  return GetAttributeDefaultValue_Enum(
-      XFA_Element::CheckButton, XFA_Attribute::Shape, XFA_XDPPACKET_Form);
+  return XFA_ATTRIBUTEENUM_Square;
 }
 
-int32_t CXFA_WidgetData::GetCheckButtonMark() {
+XFA_ATTRIBUTEENUM CXFA_WidgetData::GetCheckButtonMark() {
   CXFA_Node* pUIChild = GetUIChild();
   if (pUIChild)
     return pUIChild->JSNode()->GetEnum(XFA_Attribute::Mark);
-  return GetAttributeDefaultValue_Enum(XFA_Element::CheckButton,
-                                       XFA_Attribute::Mark, XFA_XDPPACKET_Form);
+  return XFA_ATTRIBUTEENUM_Default;
 }
 
 bool CXFA_WidgetData::IsRadioButton() {
-  if (CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent))
-    return pParent->GetElementType() == XFA_Element::ExclGroup;
-  return false;
+  CXFA_Node* pParent = m_pNode->GetNodeItem(XFA_NODEITEM_Parent);
+  return pParent && pParent->GetElementType() == XFA_Element::ExclGroup;
 }
 
 float CXFA_WidgetData::GetCheckButtonSize() {
   CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild)
+  if (pUIChild) {
     return pUIChild->JSNode()
         ->GetMeasure(XFA_Attribute::Size)
         .ToUnit(XFA_Unit::Pt);
-  return XFA_GetAttributeDefaultValue_Measure(
-             XFA_Element::CheckButton, XFA_Attribute::Size, XFA_XDPPACKET_Form)
-      .ToUnit(XFA_Unit::Pt);
+  }
+  return CXFA_Measurement(10, XFA_Unit::Pt).ToUnit(XFA_Unit::Pt);
 }
 
 bool CXFA_WidgetData::IsAllowNeutral() {
   CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild)
-    return pUIChild->JSNode()->GetBoolean(XFA_Attribute::AllowNeutral);
-  return GetAttributeDefaultValue_Boolean(XFA_Element::CheckButton,
-                                          XFA_Attribute::AllowNeutral,
-                                          XFA_XDPPACKET_Form);
+  return pUIChild &&
+         pUIChild->JSNode()->GetBoolean(XFA_Attribute::AllowNeutral);
 }
 
 XFA_CHECKSTATE CXFA_WidgetData::GetCheckState() {
@@ -695,28 +654,23 @@
   return nullptr;
 }
 
-int32_t CXFA_WidgetData::GetChoiceListCommitOn() {
+XFA_ATTRIBUTEENUM CXFA_WidgetData::GetChoiceListCommitOn() {
   CXFA_Node* pUIChild = GetUIChild();
   if (pUIChild)
     return pUIChild->JSNode()->GetEnum(XFA_Attribute::CommitOn);
-  return GetAttributeDefaultValue_Enum(
-      XFA_Element::ChoiceList, XFA_Attribute::CommitOn, XFA_XDPPACKET_Form);
+  return XFA_ATTRIBUTEENUM_Select;
 }
 
 bool CXFA_WidgetData::IsChoiceListAllowTextEntry() {
   CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild)
-    return pUIChild->JSNode()->GetBoolean(XFA_Attribute::TextEntry);
-  return GetAttributeDefaultValue_Boolean(
-      XFA_Element::ChoiceList, XFA_Attribute::TextEntry, XFA_XDPPACKET_Form);
+  return pUIChild && pUIChild->JSNode()->GetBoolean(XFA_Attribute::TextEntry);
 }
 
-int32_t CXFA_WidgetData::GetChoiceListOpen() {
+XFA_ATTRIBUTEENUM CXFA_WidgetData::GetChoiceListOpen() {
   CXFA_Node* pUIChild = GetUIChild();
   if (pUIChild)
     return pUIChild->JSNode()->GetEnum(XFA_Attribute::Open);
-  return GetAttributeDefaultValue_Enum(XFA_Element::ChoiceList,
-                                       XFA_Attribute::Open, XFA_XDPPACKET_Form);
+  return XFA_ATTRIBUTEENUM_UserControl;
 }
 
 bool CXFA_WidgetData::IsListBox() {
@@ -1231,7 +1185,7 @@
 
 bool CXFA_WidgetData::GetBarcodeAttribute_StartChar(char* val) {
   CXFA_Node* pUIChild = GetUIChild();
-  WideStringView wsStartEndChar;
+  WideString wsStartEndChar;
   if (pUIChild->JSNode()->TryCData(XFA_Attribute::StartChar, wsStartEndChar,
                                    true)) {
     if (wsStartEndChar.GetLength()) {
@@ -1244,7 +1198,7 @@
 
 bool CXFA_WidgetData::GetBarcodeAttribute_EndChar(char* val) {
   CXFA_Node* pUIChild = GetUIChild();
-  WideStringView wsStartEndChar;
+  WideString wsStartEndChar;
   if (pUIChild->JSNode()->TryCData(XFA_Attribute::EndChar, wsStartEndChar,
                                    true)) {
     if (wsStartEndChar.GetLength()) {
@@ -1364,29 +1318,22 @@
 
 void CXFA_WidgetData::GetPasswordChar(WideString& wsPassWord) {
   CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild) {
+  if (pUIChild)
     pUIChild->JSNode()->TryCData(XFA_Attribute::PasswordChar, wsPassWord, true);
-  } else {
-    wsPassWord = GetAttributeDefaultValue_Cdata(XFA_Element::PasswordEdit,
-                                                XFA_Attribute::PasswordChar,
-                                                XFA_XDPPACKET_Form);
-  }
+  else
+    wsPassWord = L"*";
 }
 
 bool CXFA_WidgetData::IsMultiLine() {
   CXFA_Node* pUIChild = GetUIChild();
-  if (pUIChild)
-    return pUIChild->JSNode()->GetBoolean(XFA_Attribute::MultiLine);
-  return GetAttributeDefaultValue_Boolean(
-      XFA_Element::TextEdit, XFA_Attribute::MultiLine, XFA_XDPPACKET_Form);
+  return pUIChild && pUIChild->JSNode()->GetBoolean(XFA_Attribute::MultiLine);
 }
 
-int32_t CXFA_WidgetData::GetVerticalScrollPolicy() {
+XFA_ATTRIBUTEENUM CXFA_WidgetData::GetVerticalScrollPolicy() {
   CXFA_Node* pUIChild = GetUIChild();
   if (pUIChild)
     return pUIChild->JSNode()->GetEnum(XFA_Attribute::VScrollPolicy);
-  return GetAttributeDefaultValue_Enum(
-      XFA_Element::TextEdit, XFA_Attribute::VScrollPolicy, XFA_XDPPACKET_Form);
+  return XFA_ATTRIBUTEENUM_Auto;
 }
 
 int32_t CXFA_WidgetData::GetMaxChars(XFA_Element& eType) {
diff --git a/xfa/fxfa/parser/cxfa_widgetdata.h b/xfa/fxfa/parser/cxfa_widgetdata.h
index 3f1b4dc..12e8113 100644
--- a/xfa/fxfa/parser/cxfa_widgetdata.h
+++ b/xfa/fxfa/parser/cxfa_widgetdata.h
@@ -70,11 +70,11 @@
 
   CXFA_BorderData GetUIBorderData();
   CFX_RectF GetUIMargin();
-  int32_t GetButtonHighlight();
+  XFA_ATTRIBUTEENUM GetButtonHighlight();
   bool GetButtonRollover(WideString& wsRollover, bool& bRichText);
   bool GetButtonDown(WideString& wsDown, bool& bRichText);
-  int32_t GetCheckButtonShape();
-  int32_t GetCheckButtonMark();
+  XFA_ATTRIBUTEENUM GetCheckButtonShape();
+  XFA_ATTRIBUTEENUM GetCheckButtonMark();
   float GetCheckButtonSize();
   bool IsAllowNeutral();
   bool IsRadioButton();
@@ -89,9 +89,9 @@
                                 bool bSyncData);
   CXFA_Node* GetExclGroupFirstMember();
   CXFA_Node* GetExclGroupNextMember(CXFA_Node* pNode);
-  int32_t GetChoiceListCommitOn();
+  XFA_ATTRIBUTEENUM GetChoiceListCommitOn();
   bool IsChoiceListAllowTextEntry();
-  int32_t GetChoiceListOpen();
+  XFA_ATTRIBUTEENUM GetChoiceListOpen();
   bool IsListBox();
   int32_t CountChoiceListItems(bool bSaveValue);
   bool GetChoiceListItem(WideString& wsText, int32_t nIndex, bool bSaveValue);
@@ -145,7 +145,7 @@
   void GetPasswordChar(WideString& wsPassWord);
 
   bool IsMultiLine();
-  int32_t GetVerticalScrollPolicy();
+  XFA_ATTRIBUTEENUM GetVerticalScrollPolicy();
   int32_t GetMaxChars(XFA_Element& eType);
   bool GetFracDigits(int32_t& iFracDigits);
   bool GetLeadDigits(int32_t& iLeadDigits);
diff --git a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
index 67256f2..128ad7b 100644
--- a/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
+++ b/xfa/fxfa/parser/xfa_document_datamerger_imp.cpp
@@ -424,13 +424,13 @@
 }
 
 CXFA_Node* FindGlobalDataNode(CXFA_Document* pDocument,
-                              WideStringView wsName,
+                              const WideString& wsName,
                               CXFA_Node* pDataScope,
                               XFA_Element eMatchNodeType) {
   if (wsName.IsEmpty())
     return nullptr;
 
-  uint32_t dwNameHash = FX_HashCode_GetW(wsName, false);
+  uint32_t dwNameHash = FX_HashCode_GetW(wsName.AsStringView(), false);
   CXFA_Node* pBounded = GetGlobalBinding(pDocument, dwNameHash);
   if (!pBounded) {
     pBounded =
@@ -442,13 +442,13 @@
 }
 
 CXFA_Node* FindOnceDataNode(CXFA_Document* pDocument,
-                            WideStringView wsName,
+                            const WideString& wsName,
                             CXFA_Node* pDataScope,
                             XFA_Element eMatchNodeType) {
   if (wsName.IsEmpty())
     return nullptr;
 
-  uint32_t dwNameHash = FX_HashCode_GetW(wsName, false);
+  uint32_t dwNameHash = FX_HashCode_GetW(wsName.AsStringView(), false);
   CXFA_Node* pLastDataScope = nullptr;
   for (CXFA_Node* pCurDataScope = pDataScope;
        pCurDataScope && pCurDataScope->GetPacketID() == XFA_XDPPACKET_Datasets;
@@ -469,7 +469,7 @@
 }
 
 CXFA_Node* FindDataRefDataNode(CXFA_Document* pDocument,
-                               WideStringView wsRef,
+                               const WideString& wsRef,
                                CXFA_Node* pDataScope,
                                XFA_Element eMatchNodeType,
                                CXFA_Node* pTemplateNode,
@@ -480,8 +480,8 @@
     dFlags |= (XFA_RESOLVENODE_Parent | XFA_RESOLVENODE_Siblings);
 
   XFA_RESOLVENODE_RS rs;
-  pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs, dFlags,
-                                                pTemplateNode);
+  pDocument->GetScriptContext()->ResolveObjects(
+      pDataScope, wsRef.AsStringView(), rs, dFlags, pTemplateNode);
   if (rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeAll ||
       rs.dwFlags == XFA_RESOLVENODE_RSTYPE_CreateNodeMidAll ||
       rs.objects.size() > 1) {
@@ -513,7 +513,7 @@
                                        CXFA_Node* pFormParent,
                                        CXFA_Node* pTemplateNode,
                                        std::vector<CXFA_Node*>* subforms) {
-  WideStringView wsSubformName =
+  WideString wsSubformName =
       pTemplateNode->JSNode()->GetCData(XFA_Attribute::Name);
   WideString wsInstMgrNodeName = L"_" + wsSubformName;
   uint32_t dwInstNameHash =
@@ -1165,13 +1165,13 @@
         bMatchRef = bDataRef;
         bParentDataRef = true;
         if (!pDataNode && bDataRef) {
-          WideStringView wsRef =
+          WideString wsRef =
               pTemplateNodeBind->JSNode()->GetCData(XFA_Attribute::Ref);
           uint32_t dFlags =
               XFA_RESOLVENODE_Children | XFA_RESOLVENODE_CreateNode;
           XFA_RESOLVENODE_RS rs;
-          pDocument->GetScriptContext()->ResolveObjects(pDataScope, wsRef, rs,
-                                                        dFlags, pTemplateNode);
+          pDocument->GetScriptContext()->ResolveObjects(
+              pDataScope, wsRef.AsStringView(), rs, dFlags, pTemplateNode);
           CXFA_Object* pObject =
               !rs.objects.empty() ? rs.objects.front() : nullptr;
           pDataNode = ToNode(pObject);
@@ -1465,7 +1465,7 @@
       this, pFormRoot, pTemplateChosen, false, nullptr);
   ASSERT(pSubformSetNode);
   if (!pDataTopLevel) {
-    WideStringView wsFormName =
+    WideString wsFormName =
         pSubformSetNode->JSNode()->GetCData(XFA_Attribute::Name);
     WideString wsDataTopLevelName(wsFormName.IsEmpty() ? L"form" : wsFormName);
     CFX_XMLElement* pDataTopLevelXMLNode =
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index 122cfb0..5bdfe58 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -393,17 +393,6 @@
   return XFA_Element::Unknown;
 }
 
-CXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_Element eElement,
-                                                      XFA_Attribute eAttribute,
-                                                      uint32_t dwPacket) {
-  void* pValue;
-  if (XFA_GetAttributeDefaultValue(pValue, eElement, eAttribute,
-                                   XFA_AttributeType::Measure, dwPacket)) {
-    return *(CXFA_Measurement*)pValue;
-  }
-  return CXFA_Measurement();
-}
-
 bool XFA_GetAttributeDefaultValue(void*& pValue,
                                   XFA_Element eElement,
                                   XFA_Attribute eAttribute,
diff --git a/xfa/fxfa/parser/xfa_utils.h b/xfa/fxfa/parser/xfa_utils.h
index a749856..cfa27bb 100644
--- a/xfa/fxfa/parser/xfa_utils.h
+++ b/xfa/fxfa/parser/xfa_utils.h
@@ -19,10 +19,9 @@
 double XFA_GetFractionalScale(uint32_t idx);
 int XFA_GetMaxFractionalScale();
 
-bool XFA_FDEExtension_ResolveNamespaceQualifier(
-    CFX_XMLElement* pNode,
-    const WideStringView& wsQualifier,
-    WideString* wsNamespaceURI);
+bool XFA_FDEExtension_ResolveNamespaceQualifier(CFX_XMLElement* pNode,
+                                                const WideString& wsQualifier,
+                                                WideString* wsNamespaceURI);
 
 template <class NodeType, class TraverseStrategy>
 class CXFA_NodeIteratorTemplate {
@@ -177,9 +176,6 @@
                                               int32_t& iCount);
 const XFA_ELEMENTINFO* XFA_GetElementByID(XFA_Element eName);
 XFA_Element XFA_GetElementTypeForName(const WideStringView& wsName);
-CXFA_Measurement XFA_GetAttributeDefaultValue_Measure(XFA_Element eElement,
-                                                      XFA_Attribute eAttribute,
-                                                      uint32_t dwPacket);
 bool XFA_GetAttributeDefaultValue(void*& pValue,
                                   XFA_Element eElement,
                                   XFA_Attribute eAttribute,
