diff --git a/xfa/fxfa/parser/xfa_object_imp.cpp b/xfa/fxfa/parser/xfa_object_imp.cpp
index 6f0cff3..eed1036 100644
--- a/xfa/fxfa/parser/xfa_object_imp.cpp
+++ b/xfa/fxfa/parser/xfa_object_imp.cpp
@@ -27,30 +27,59 @@
 #include "xfa/fxfa/parser/xfa_utils.h"
 #include "xfa/fxjse/cfxjse_arguments.h"
 
+namespace {
+
+void XFA_DeleteWideString(void* pData) {
+  delete static_cast<CFX_WideString*>(pData);
+}
+
+void XFA_CopyWideString(void*& pData) {
+  if (pData) {
+    CFX_WideString* pNewData = new CFX_WideString(*(CFX_WideString*)pData);
+    pData = pNewData;
+  }
+}
+
+XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {XFA_DeleteWideString,
+                                                         XFA_CopyWideString};
+
+XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) {
+  return static_cast<XFA_OBJECTTYPE>(XFA_GetElementByID(eElement)->eObjectType);
+}
+
+void XFA_DataNodeDeleteBindItem(void* pData) {
+  delete static_cast<CXFA_NodeArray*>(pData);
+}
+
+XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = {
+    XFA_DataNodeDeleteBindItem, nullptr};
+
+}  // namespace
+
 CXFA_Object::CXFA_Object(CXFA_Document* pDocument, uint32_t uFlags)
     : m_pDocument(pDocument), m_uFlags(uFlags) {}
+
 void CXFA_Object::GetClassName(CFX_WideStringC& wsName) const {
   wsName = XFA_GetElementByID(GetClassID())->pName;
 }
+
 uint32_t CXFA_Object::GetClassHashCode() const {
   return XFA_GetElementByID(GetClassID())->uHash;
 }
+
 XFA_ELEMENT CXFA_Object::GetClassID() const {
-  if (IsNode()) {
+  if (IsNode())
     return AsNode()->GetClassID();
-  }
-  if (IsOrdinaryObject()) {
+  if (IsOrdinaryObject())
     return AsOrdinaryObject()->GetClassID();
-  }
-  if (IsNodeList()) {
+  if (IsNodeList())
     return AsNodeList()->GetClassID();
-  }
-  if (IsOrdinaryList()) {
+  if (IsOrdinaryList())
     return XFA_ELEMENT_List;
-  }
   ASSERT(FALSE);
   return (XFA_ELEMENT)0;
 }
+
 void CXFA_Object::Script_ObjectClass_ClassName(CFXJSE_Value* pValue,
                                                FX_BOOL bSetting,
                                                XFA_ATTRIBUTE eAttribute) {
@@ -64,6 +93,7 @@
     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
   }
 }
+
 void CXFA_Object::ThrowScriptErrorMessage(int32_t iStringID, ...) {
   IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
   ASSERT(pAppProvider);
@@ -78,21 +108,6 @@
       "", FX_UTF8Encode(wsMessage.c_str(), wsMessage.GetLength()).AsStringC());
 }
 
-static void XFA_DeleteWideString(void* pData) {
-  delete static_cast<CFX_WideString*>(pData);
-}
-
-static void XFA_CopyWideString(void*& pData) {
-  if (pData) {
-    CFX_WideString* pNewData = new CFX_WideString(*(CFX_WideString*)pData);
-    pData = pNewData;
-  }
-}
-static XFA_MAPDATABLOCKCALLBACKINFO deleteWideStringCallBack = {
-    XFA_DeleteWideString, XFA_CopyWideString};
-static XFA_OBJECTTYPE XFA_GetElementObjectType(XFA_ELEMENT eElement) {
-  return (XFA_OBJECTTYPE)XFA_GetElementByID(eElement)->eObjectType;
-}
 CXFA_Node::CXFA_Node(CXFA_Document* pDoc,
                      uint16_t ePacket,
                      XFA_ELEMENT eElement)
@@ -109,30 +124,31 @@
       m_pMapModuleData(nullptr) {
   ASSERT(m_pDocument);
 }
+
 CXFA_Node::~CXFA_Node() {
-  ASSERT(m_pParent == NULL);
+  ASSERT(!m_pParent);
   RemoveMapModuleKey();
-  CXFA_Node *pNext, *pNode = m_pChild;
+  CXFA_Node* pNode = m_pChild;
   while (pNode) {
-    pNext = pNode->m_pNext;
-    pNode->m_pParent = NULL;
+    CXFA_Node* pNext = pNode->m_pNext;
+    pNode->m_pParent = nullptr;
     delete pNode;
     pNode = pNext;
   }
-  if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode)) {
+  if (m_pXMLNode && HasFlag(XFA_NODEFLAG_OwnXMLNode))
     m_pXMLNode->Release();
-  }
 }
+
 CXFA_Node* CXFA_Node::Clone(FX_BOOL bRecursive) {
   CXFA_Document* pFactory = m_pDocument->GetParser()->GetFactory();
   CXFA_Node* pClone = pFactory->CreateNode(m_ePacket, m_eNodeClass);
-  if (!pClone) {
-    return NULL;
-  }
+  if (!pClone)
+    return nullptr;
+
   MergeAllData(pClone);
   pClone->UpdateNameHash();
   if (IsNeedSavingXMLNode()) {
-    CFDE_XMLNode* pCloneXML = NULL;
+    CFDE_XMLNode* pCloneXML = nullptr;
     if (IsAttributeInXML()) {
       CFX_WideString wsName;
       GetAttribute(XFA_ATTRIBUTE_Name, wsName, FALSE);
@@ -142,7 +158,7 @@
         pCloneXMLElement->SetTextData(CFX_WideString(wsValue));
       }
       pCloneXML = pCloneXMLElement;
-      pCloneXMLElement = NULL;
+      pCloneXMLElement = nullptr;
       pClone->SetEnum(XFA_ATTRIBUTE_Contains, XFA_ATTRIBUTEENUM_Unknown);
     } else {
       pCloneXML = m_pXMLNode->Clone(FALSE);
@@ -157,9 +173,10 @@
     }
   }
   pClone->SetFlag(XFA_NODEFLAG_Initialized, true);
-  pClone->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+  pClone->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr);
   return pClone;
 }
+
 CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem) const {
   switch (eItem) {
     case XFA_NODEITEM_NextSibling:
@@ -171,45 +188,43 @@
     case XFA_NODEITEM_PrevSibling:
       if (m_pParent) {
         CXFA_Node* pSibling = m_pParent->m_pChild;
-        CXFA_Node* pPrev = NULL;
+        CXFA_Node* pPrev = nullptr;
         while (pSibling && pSibling != this) {
           pPrev = pSibling;
           pSibling = pSibling->m_pNext;
         }
         return pPrev;
       }
-      return NULL;
+      return nullptr;
     default:
       break;
   }
-  return NULL;
+  return nullptr;
 }
+
 CXFA_Node* CXFA_Node::GetNodeItem(XFA_NODEITEM eItem,
                                   XFA_OBJECTTYPE eType) const {
-  CXFA_Node* pNode = NULL;
+  CXFA_Node* pNode = nullptr;
   switch (eItem) {
     case XFA_NODEITEM_NextSibling:
       pNode = m_pNext;
       if (eType != XFA_OBJECTTYPEMASK) {
-        while (pNode && pNode->GetObjectType() != eType) {
+        while (pNode && pNode->GetObjectType() != eType)
           pNode = pNode->m_pNext;
-        }
       }
       break;
     case XFA_NODEITEM_FirstChild:
       pNode = m_pChild;
       if (eType != XFA_OBJECTTYPEMASK) {
-        while (pNode && pNode->GetObjectType() != eType) {
+        while (pNode && pNode->GetObjectType() != eType)
           pNode = pNode->m_pNext;
-        }
       }
       break;
     case XFA_NODEITEM_Parent:
       pNode = m_pParent;
       if (eType != XFA_OBJECTTYPEMASK) {
-        while (pNode && pNode->GetObjectType() != eType) {
+        while (pNode && pNode->GetObjectType() != eType)
           pNode = pNode->m_pParent;
-        }
       }
       break;
     case XFA_NODEITEM_PrevSibling:
@@ -229,6 +244,7 @@
   }
   return pNode;
 }
+
 int32_t CXFA_Node::GetNodeList(CXFA_NodeArray& nodes,
                                uint32_t dwTypeFilter,
                                XFA_ELEMENT eElementFilter,
@@ -258,10 +274,10 @@
       pChild = pChild->m_pNext;
     }
   } else if (dwTypeFilter != 0) {
-    FX_BOOL bFilterChildren = (dwTypeFilter & XFA_NODEFILTER_Children) != 0;
-    FX_BOOL bFilterProperties = (dwTypeFilter & XFA_NODEFILTER_Properties) != 0;
-    FX_BOOL bFilterOneOfProperties =
-        (dwTypeFilter & XFA_NODEFILTER_OneOfProperty) != 0;
+    bool bFilterChildren = !!(dwTypeFilter & XFA_NODEFILTER_Children);
+    bool bFilterProperties = !!(dwTypeFilter & XFA_NODEFILTER_Properties);
+    bool bFilterOneOfProperties =
+        !!(dwTypeFilter & XFA_NODEFILTER_OneOfProperty);
     CXFA_Node* pChild = m_pChild;
     while (pChild) {
       const XFA_PROPERTY* pProperty = XFA_GetPropertyOfElement(
@@ -277,10 +293,8 @@
                     pChild->GetClassID() == XFA_ELEMENT_PageSet)) {
           nodes.Add(pChild);
         }
-      } else {
-        if (bFilterChildren) {
-          nodes.Add(pChild);
-        }
+      } else if (bFilterChildren) {
+        nodes.Add(pChild);
       }
       pChild = pChild->m_pNext;
     }
@@ -288,19 +302,17 @@
       int32_t iProperties = 0;
       const XFA_PROPERTY* pProperty =
           XFA_GetElementProperties(GetClassID(), iProperties);
-      if (pProperty == NULL || iProperties < 1) {
+      if (!pProperty || iProperties < 1)
         return 0;
-      }
       for (int32_t i = 0; i < iProperties; i++) {
         if (pProperty[i].uFlags & XFA_PROPERTYFLAG_DefaultOneOf) {
           CXFA_Document* pFactory = m_pDocument->GetParser()->GetFactory();
           const XFA_PACKETINFO* pPacket = XFA_GetPacketByID(GetPacketID());
           CXFA_Node* pNewNode =
               pFactory->CreateNode(pPacket, (XFA_ELEMENT)pProperty[i].eName);
-          if (!pNewNode) {
+          if (!pNewNode)
             break;
-          }
-          InsertChild(pNewNode, NULL);
+          InsertChild(pNewNode, nullptr);
           pNewNode->SetFlag(XFA_NODEFLAG_Initialized, true);
           nodes.Add(pNewNode);
           break;
@@ -310,6 +322,7 @@
   }
   return nodes.GetSize();
 }
+
 CXFA_Node* CXFA_Node::CreateSamePacketNode(XFA_ELEMENT eElement,
                                            uint32_t dwFlags) {
   CXFA_Document* pFactory = m_pDocument->GetParser()->GetFactory();
@@ -317,13 +330,14 @@
   pNode->SetFlag(dwFlags, true);
   return pNode;
 }
+
 CXFA_Node* CXFA_Node::CloneTemplateToForm(FX_BOOL bRecursive) {
   ASSERT(m_ePacket == XFA_XDPPACKET_Template);
   CXFA_Document* pFactory = m_pDocument->GetParser()->GetFactory();
   CXFA_Node* pClone = pFactory->CreateNode(XFA_XDPPACKET_Form, m_eNodeClass);
-  if (!pClone) {
-    return NULL;
-  }
+  if (!pClone)
+    return nullptr;
+
   pClone->SetTemplateNode(this);
   pClone->UpdateNameHash();
   pClone->SetXMLMappingNode(GetXMLMappingNode());
@@ -344,35 +358,30 @@
 void CXFA_Node::SetTemplateNode(CXFA_Node* pTemplateNode) {
   m_pAuxNode = pTemplateNode;
 }
+
 CXFA_Node* CXFA_Node::GetBindData() {
   ASSERT(GetPacketID() == XFA_XDPPACKET_Form);
   return static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
 }
+
 int32_t CXFA_Node::GetBindItems(CXFA_NodeArray& formItems) {
   if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
-    CXFA_NodeArray* pItems = NULL;
+    CXFA_NodeArray* pItems = nullptr;
     TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
     formItems.Copy(*pItems);
     return formItems.GetSize();
   }
   CXFA_Node* pFormNode =
       static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
-  if (pFormNode) {
+  if (pFormNode)
     formItems.Add(pFormNode);
-  }
   return formItems.GetSize();
 }
 
-static void XFA_DataNodeDeleteBindItem(void* pData) {
-  delete static_cast<CXFA_NodeArray*>(pData);
-}
-
-static XFA_MAPDATABLOCKCALLBACKINFO deleteBindItemCallBack = {
-    XFA_DataNodeDeleteBindItem, NULL};
 int32_t CXFA_Node::AddBindItem(CXFA_Node* pFormNode) {
   ASSERT(pFormNode);
   if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
-    CXFA_NodeArray* pItems = NULL;
+    CXFA_NodeArray* pItems = nullptr;
     TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
     ASSERT(pItems);
     if (pItems->Find(pFormNode) < 0) {
@@ -395,17 +404,17 @@
   m_uFlags |= XFA_NODEFLAG_BindFormItems;
   return 2;
 }
+
 int32_t CXFA_Node::RemoveBindItem(CXFA_Node* pFormNode) {
   if (m_uFlags & XFA_NODEFLAG_BindFormItems) {
-    CXFA_NodeArray* pItems = NULL;
+    CXFA_NodeArray* pItems = nullptr;
     TryObject(XFA_ATTRIBUTE_BindingNode, (void*&)pItems);
     ASSERT(pItems);
     int32_t iIndex = pItems->Find(pFormNode);
     int32_t iCount = pItems->GetSize();
     if (iIndex >= 0) {
-      if (iIndex != iCount - 1) {
+      if (iIndex != iCount - 1)
         pItems->SetAt(iIndex, pItems->GetAt(iCount - 1));
-      }
       pItems->RemoveAt(iCount - 1);
       if (iCount == 2) {
         CXFA_Node* pLastFormNode = pItems->GetAt(0);
@@ -419,86 +428,84 @@
   CXFA_Node* pOldFormItem =
       static_cast<CXFA_Node*>(GetObject(XFA_ATTRIBUTE_BindingNode));
   if (pOldFormItem == pFormNode) {
-    SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
-    pOldFormItem = NULL;
+    SetObject(XFA_ATTRIBUTE_BindingNode, nullptr);
+    pOldFormItem = nullptr;
   }
-  return pOldFormItem == NULL ? 0 : 1;
+  return pOldFormItem ? 1 : 0;
 }
+
 FX_BOOL CXFA_Node::HasBindItem() {
-  return (GetPacketID() == XFA_XDPPACKET_Datasets) &&
-         GetObject(XFA_ATTRIBUTE_BindingNode) != NULL;
+  return GetPacketID() == XFA_XDPPACKET_Datasets &&
+         GetObject(XFA_ATTRIBUTE_BindingNode);
 }
+
 CXFA_WidgetData* CXFA_Node::GetWidgetData() {
   return (CXFA_WidgetData*)GetObject(XFA_ATTRIBUTE_WidgetData);
 }
+
 CXFA_WidgetData* CXFA_Node::GetContainerWidgetData() {
-  if (GetPacketID() != XFA_XDPPACKET_Form) {
-    return NULL;
-  }
+  if (GetPacketID() != XFA_XDPPACKET_Form)
+    return nullptr;
   XFA_ELEMENT classID = GetClassID();
-  if (classID == XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
+  if (classID == XFA_ELEMENT_ExclGroup)
+    return nullptr;
   CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-  if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup) {
-    return NULL;
-  }
+  if (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_ExclGroup)
+    return nullptr;
+
   if (classID == XFA_ELEMENT_Field) {
     CXFA_WidgetData* pFieldWidgetData = GetWidgetData();
     if (pFieldWidgetData &&
         pFieldWidgetData->GetChoiceListOpen() ==
             XFA_ATTRIBUTEENUM_MultiSelect) {
-      return NULL;
+      return nullptr;
     } else {
       CFX_WideString wsPicture;
       if (pFieldWidgetData) {
         pFieldWidgetData->GetPictureContent(wsPicture,
                                             XFA_VALUEPICTURE_DataBind);
       }
-      if (!wsPicture.IsEmpty()) {
+      if (!wsPicture.IsEmpty())
         return pFieldWidgetData;
-      }
       CXFA_Node* pDataNode = GetBindData();
-      if (!pDataNode) {
-        return NULL;
-      }
-      pFieldWidgetData = NULL;
+      if (!pDataNode)
+        return nullptr;
+      pFieldWidgetData = nullptr;
       CXFA_NodeArray formNodes;
       pDataNode->GetBindItems(formNodes);
       for (int32_t i = 0; i < formNodes.GetSize(); i++) {
         CXFA_Node* pFormNode = formNodes.GetAt(i);
-        if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved)) {
+        if (!pFormNode || pFormNode->HasFlag(XFA_NODEFLAG_HasRemoved))
           continue;
-        }
         pFieldWidgetData = pFormNode->GetWidgetData();
         if (pFieldWidgetData) {
           pFieldWidgetData->GetPictureContent(wsPicture,
                                               XFA_VALUEPICTURE_DataBind);
         }
-        if (!wsPicture.IsEmpty()) {
+        if (!wsPicture.IsEmpty())
           break;
-        }
-        pFieldWidgetData = NULL;
+        pFieldWidgetData = nullptr;
       }
       return pFieldWidgetData;
     }
   }
   CXFA_Node* pGrandNode =
-      pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
+      pParentNode ? pParentNode->GetNodeItem(XFA_NODEITEM_Parent) : nullptr;
   CXFA_Node* pValueNode =
       (pParentNode && pParentNode->GetClassID() == XFA_ELEMENT_Value)
           ? pParentNode
-          : NULL;
+          : nullptr;
   if (!pValueNode) {
     pValueNode = (pGrandNode && pGrandNode->GetClassID() == XFA_ELEMENT_Value)
                      ? pGrandNode
-                     : NULL;
+                     : nullptr;
   }
   CXFA_Node* pParentOfValueNode =
-      pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : NULL;
+      pValueNode ? pValueNode->GetNodeItem(XFA_NODEITEM_Parent) : nullptr;
   return pParentOfValueNode ? pParentOfValueNode->GetContainerWidgetData()
-                            : NULL;
+                            : nullptr;
 }
+
 FX_BOOL CXFA_Node::GetLocaleName(CFX_WideString& wsLocaleName) {
   CXFA_Node* pForm = GetDocument()->GetXFAObject(XFA_HASHCODE_Form)->AsNode();
   CXFA_Node* pTopSubform = pForm->GetFirstChildByClass(XFA_ELEMENT_Subform);
@@ -511,30 +518,24 @@
       pLocaleNode = pLocaleNode->GetNodeItem(XFA_NODEITEM_Parent);
     }
   } while (pLocaleNode && pLocaleNode != pTopSubform && !bLocale);
-  if (bLocale) {
-    return bLocale;
-  }
+  if (bLocale)
+    return TRUE;
   CXFA_Node* pConfig = ToNode(GetDocument()->GetXFAObject(XFA_HASHCODE_Config));
   wsLocaleName = GetDocument()->GetLocalMgr()->GetConfigLocaleName(pConfig);
-  if (!wsLocaleName.IsEmpty()) {
-    bLocale = TRUE;
-  }
-  if (bLocale) {
-    return bLocale;
-  }
-  if (pTopSubform) {
-    bLocale = pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE);
-  }
-  if (bLocale) {
-    return bLocale;
+  if (!wsLocaleName.IsEmpty())
+    return TRUE;
+  if (pTopSubform &&
+      pTopSubform->TryCData(XFA_ATTRIBUTE_Locale, wsLocaleName, FALSE)) {
+    return TRUE;
   }
   IFX_Locale* pLocale = GetDocument()->GetLocalMgr()->GetDefLocale();
   if (pLocale) {
     wsLocaleName = pLocale->GetName();
-    bLocale = TRUE;
+    return TRUE;
   }
-  return bLocale;
+  return FALSE;
 }
+
 XFA_ATTRIBUTEENUM CXFA_Node::GetIntact() {
   XFA_ELEMENT eElement = GetClassID();
   CXFA_Node* pKeep = GetFirstChildByClass(XFA_ELEMENT_Keep);
@@ -551,21 +552,17 @@
             pPreviewRow->GetEnum(XFA_ATTRIBUTE_Layout) ==
                 XFA_ATTRIBUTEENUM_Row) {
           XFA_ATTRIBUTEENUM eValue;
-          if (pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE)) {
-            if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
-                eValue == XFA_ATTRIBUTEENUM_PageArea) {
-              return XFA_ATTRIBUTEENUM_ContentArea;
-            }
+          if (pKeep->TryEnum(XFA_ATTRIBUTE_Previous, eValue, FALSE) &&
+              (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
+               eValue == XFA_ATTRIBUTEENUM_PageArea)) {
+            return XFA_ATTRIBUTEENUM_ContentArea;
           }
-          CXFA_Node* pKeep =
+          CXFA_Node* pNode =
               pPreviewRow->GetFirstChildByClass(XFA_ELEMENT_Keep);
-          if (pKeep) {
-            if (pKeep->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE)) {
-              if (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
-                  eValue == XFA_ATTRIBUTEENUM_PageArea) {
-                return XFA_ATTRIBUTEENUM_ContentArea;
-              }
-            }
+          if (pNode && pNode->TryEnum(XFA_ATTRIBUTE_Next, eValue, FALSE) &&
+              (eValue == XFA_ATTRIBUTEENUM_ContentArea ||
+               eValue == XFA_ATTRIBUTEENUM_PageArea)) {
+            return XFA_ATTRIBUTEENUM_ContentArea;
           }
         }
       }
@@ -589,9 +586,8 @@
       break;
     case XFA_ELEMENT_Field: {
       CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
-      if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea) {
+      if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_PageArea)
         return XFA_ATTRIBUTEENUM_ContentArea;
-      }
       if (pParentNode->GetIntact() == XFA_ATTRIBUTEENUM_None) {
         XFA_ATTRIBUTEENUM eParLayout =
             pParentNode->GetEnum(XFA_ATTRIBUTE_Layout);
@@ -603,9 +599,8 @@
         XFA_VERSION version = m_pDocument->GetCurVersionMode();
         if (eParLayout == XFA_ATTRIBUTEENUM_Tb && version < XFA_VERSION_208) {
           CXFA_Measurement measureH;
-          if (TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE)) {
+          if (TryMeasure(XFA_ATTRIBUTE_H, measureH, FALSE))
             return XFA_ATTRIBUTEENUM_ContentArea;
-          }
         }
         return XFA_ATTRIBUTEENUM_None;
       }
@@ -618,16 +613,18 @@
   }
   return XFA_ATTRIBUTEENUM_None;
 }
+
 CXFA_Node* CXFA_Node::GetDataDescriptionNode() {
-  if (m_ePacket == XFA_XDPPACKET_Datasets) {
+  if (m_ePacket == XFA_XDPPACKET_Datasets)
     return m_pAuxNode;
-  }
-  return NULL;
+  return nullptr;
 }
+
 void CXFA_Node::SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode) {
   ASSERT(m_ePacket == XFA_XDPPACKET_Datasets);
   m_pAuxNode = pDataDescriptionNode;
 }
+
 void CXFA_Node::Script_TreeClass_ResolveNode(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
@@ -637,22 +634,19 @@
   CFX_WideString wsExpression =
       CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
   CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
+  if (!pScriptContext)
     return;
-  }
   CXFA_Node* refNode = this;
-  if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
+  if (refNode->GetClassID() == XFA_ELEMENT_Xfa)
     refNode = ToNode(pScriptContext->GetThisObject());
-  }
   uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
                     XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
                     XFA_RESOLVENODE_Siblings;
   XFA_RESOLVENODE_RS resoveNodeRS;
   int32_t iRet = pScriptContext->ResolveObjects(
       refNode, wsExpression.AsStringC(), resoveNodeRS, dwFlag);
-  if (iRet < 1) {
+  if (iRet < 1)
     return FXJSE_Value_SetNull(pArguments->GetReturnValue());
-  }
   if (resoveNodeRS.dwFlags == XFA_RESOVENODE_RSTYPE_Nodes) {
     CXFA_Object* pNode = resoveNodeRS.nodes[0];
     FXJSE_Value_Set(pArguments->GetReturnValue(),
@@ -671,6 +665,7 @@
     }
   }
 }
+
 void CXFA_Node::Script_TreeClass_ResolveNodes(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
@@ -681,30 +676,27 @@
   CFX_WideString wsExpression =
       CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
   CFXJSE_Value* pValue = pArguments->GetReturnValue();
-  if (!pValue) {
+  if (!pValue)
     return;
-  }
   uint32_t dwFlag = XFA_RESOLVENODE_Children | XFA_RESOLVENODE_Attributes |
                     XFA_RESOLVENODE_Properties | XFA_RESOLVENODE_Parent |
                     XFA_RESOLVENODE_Siblings;
   CXFA_Node* refNode = this;
-  if (refNode->GetClassID() == XFA_ELEMENT_Xfa) {
+  if (refNode->GetClassID() == XFA_ELEMENT_Xfa)
     refNode = ToNode(m_pDocument->GetScriptContext()->GetThisObject());
-  }
   Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag, refNode);
 }
+
 void CXFA_Node::Script_Som_ResolveNodeList(CFXJSE_Value* pValue,
                                            CFX_WideString wsExpression,
                                            uint32_t dwFlag,
                                            CXFA_Node* refNode) {
   CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
+  if (!pScriptContext)
     return;
-  }
   XFA_RESOLVENODE_RS resoveNodeRS;
-  if (refNode == NULL) {
+  if (!refNode)
     refNode = this;
-  }
   pScriptContext->ResolveObjects(refNode, wsExpression.AsStringC(),
                                  resoveNodeRS, dwFlag);
   CXFA_ArrayNodeList* pNodeList = new CXFA_ArrayNodeList(m_pDocument);
@@ -727,6 +719,7 @@
   FXJSE_Value_SetObject(pValue, (CXFA_Object*)pNodeList,
                         pScriptContext->GetJseNormalClass());
 }
+
 void CXFA_Node::Script_TreeClass_All(CFXJSE_Value* pValue,
                                      FX_BOOL bSetting,
                                      XFA_ATTRIBUTE eAttribute) {
@@ -740,13 +733,13 @@
     Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag);
   }
 }
+
 void CXFA_Node::Script_TreeClass_Nodes(CFXJSE_Value* pValue,
                                        FX_BOOL bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
   CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
-  if (!pScriptContext) {
+  if (!pScriptContext)
     return;
-  }
   if (bSetting) {
     IXFA_AppProvider* pAppProvider = m_pDocument->GetNotify()->GetAppProvider();
     ASSERT(pAppProvider);
@@ -761,6 +754,7 @@
                           pScriptContext->GetJseNormalClass());
   }
 }
+
 void CXFA_Node::Script_TreeClass_ClassAll(CFXJSE_Value* pValue,
                                           FX_BOOL bSetting,
                                           XFA_ATTRIBUTE eAttribute) {
@@ -774,6 +768,7 @@
     Script_Som_ResolveNodeList(pValue, wsExpression, dwFlag);
   }
 }
+
 void CXFA_Node::Script_TreeClass_Parent(CFXJSE_Value* pValue,
                                         FX_BOOL bSetting,
                                         XFA_ATTRIBUTE eAttribute) {
@@ -789,24 +784,25 @@
     }
   }
 }
+
 void CXFA_Node::Script_TreeClass_Index(CFXJSE_Value* pValue,
                                        FX_BOOL bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
+  if (bSetting)
     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
+  else
     FXJSE_Value_SetInteger(pValue, GetNodeSameNameIndex());
-  }
 }
+
 void CXFA_Node::Script_TreeClass_ClassIndex(CFXJSE_Value* pValue,
                                             FX_BOOL bSetting,
                                             XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
+  if (bSetting)
     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
+  else
     FXJSE_Value_SetInteger(pValue, GetNodeSameClassIndex());
-  }
 }
+
 void CXFA_Node::Script_TreeClass_SomExpression(CFXJSE_Value* pValue,
                                                FX_BOOL bSetting,
                                                XFA_ATTRIBUTE eAttribute) {
@@ -819,6 +815,7 @@
                               FX_UTF8Encode(wsSOMExpression).AsStringC());
   }
 }
+
 void CXFA_Node::Script_NodeClass_ApplyXSL(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
@@ -841,10 +838,8 @@
   CFX_WideString wsExpression;
   CFX_WideString wsValue;
   int32_t iAction = 0;
-  if (iLength >= 1) {
-    wsExpression =
-        CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
-  }
+  wsExpression =
+      CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
   if (iLength >= 2) {
     wsValue =
         CFX_WideString::FromUTF8(pArguments->GetUTF8String(1).AsStringC());
@@ -864,13 +859,13 @@
     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"clone");
     return;
   }
-  FX_BOOL bClone = TRUE;
-  bClone = pArguments->GetInt32(0) == 0 ? FALSE : TRUE;
+  bool bClone = !!pArguments->GetInt32(0);
   CXFA_Node* pCloneNode = Clone(bClone);
   FXJSE_Value_Set(
       pArguments->GetReturnValue(),
       m_pDocument->GetScriptContext()->GetJSValueFromMap(pCloneNode));
 }
+
 void CXFA_Node::Script_NodeClass_GetAttribute(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength != 1) {
@@ -883,10 +878,10 @@
   CFX_WideString wsValue;
   GetAttribute(wsExpression.AsStringC(), wsValue);
   CFXJSE_Value* pValue = pArguments->GetReturnValue();
-  if (pValue) {
+  if (pValue)
     FXJSE_Value_SetUTF8String(pValue, FX_UTF8Encode(wsValue).AsStringC());
-  }
 }
+
 void CXFA_Node::Script_NodeClass_GetElement(CFXJSE_Arguments* pArguments) {
   int32_t iLength = pArguments->GetLength();
   if (iLength < 1 || iLength > 2) {
@@ -895,13 +890,10 @@
   }
   CFX_WideString wsExpression;
   int32_t iValue = 0;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression = CFX_WideString::FromUTF8(bsExpression.AsStringC());
-  }
-  if (iLength >= 2) {
+  wsExpression =
+      CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
+  if (iLength >= 2)
     iValue = pArguments->GetInt32(1);
-  }
   const XFA_ELEMENTINFO* pElementInfo =
       XFA_GetElementByName(wsExpression.AsStringC());
   CXFA_Node* pNode = GetProperty(iValue, pElementInfo->eName);
@@ -918,14 +910,12 @@
     return;
   }
   CFX_WideString wsExpression;
-  FX_BOOL bParent = TRUE;
+  bool bParent = true;
   int32_t iIndex = 0;
-  if (iLength >= 1) {
-    wsExpression =
-        CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
-  }
+  wsExpression =
+      CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
   if (iLength >= 2)
-    bParent = !!pArguments->GetInt32(1) ? TRUE : FALSE;
+    bParent = !!pArguments->GetInt32(1);
   if (iLength >= 3)
     iIndex = pArguments->GetInt32(2);
   FX_BOOL bHas = FALSE;
@@ -957,36 +947,29 @@
     return;
   }
   CFX_WideString wsExpression;
-  FX_BOOL bIgnoreRoot = TRUE;
-  FX_BOOL bOverwrite = 0;
-  if (iLength >= 1) {
-    CFX_ByteString bsExpression = pArguments->GetUTF8String(0);
-    wsExpression = CFX_WideString::FromUTF8(bsExpression.AsStringC());
-    if (wsExpression.IsEmpty()) {
-      return;
-    }
-  }
-  if (iLength >= 2) {
-    bIgnoreRoot = pArguments->GetInt32(1) == 0 ? FALSE : TRUE;
-  }
-  if (iLength >= 3) {
-    bOverwrite = pArguments->GetInt32(2) == 0 ? FALSE : TRUE;
-  }
-  IXFA_Parser* pParser = IXFA_Parser::Create(m_pDocument);
-  if (!pParser) {
+  bool bIgnoreRoot = true;
+  bool bOverwrite = 0;
+  wsExpression =
+      CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
+  if (wsExpression.IsEmpty())
     return;
-  }
-  CFDE_XMLNode* pXMLNode = NULL;
-  int32_t iParserStatus = pParser->ParseXMLData(wsExpression, pXMLNode, NULL);
-  if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode) {
-    pParser->Release();
-    pParser = NULL;
+  if (iLength >= 2)
+    bIgnoreRoot = !!pArguments->GetInt32(1);
+  if (iLength >= 3)
+    bOverwrite = !!pArguments->GetInt32(2);
+  std::unique_ptr<IXFA_Parser, ReleaseDeleter<IXFA_Parser>> pParser(
+      IXFA_Parser::Create(m_pDocument));
+  if (!pParser)
     return;
-  }
+  CFDE_XMLNode* pXMLNode = nullptr;
+  int32_t iParserStatus =
+      pParser->ParseXMLData(wsExpression, pXMLNode, nullptr);
+  if (iParserStatus != XFA_PARSESTATUS_Done || !pXMLNode)
+    return;
   if (bIgnoreRoot &&
       (pXMLNode->GetType() != FDE_XMLNODE_Element ||
        XFA_RecognizeRichText(static_cast<CFDE_XMLElement*>(pXMLNode)))) {
-    bIgnoreRoot = FALSE;
+    bIgnoreRoot = false;
   }
   CXFA_Node* pFakeRoot = Clone(FALSE);
   CFX_WideStringC wsContentType = GetCData(XFA_ATTRIBUTE_ContentType);
@@ -997,7 +980,7 @@
   CFDE_XMLNode* pFakeXMLRoot = pFakeRoot->GetXMLMappingNode();
   if (!pFakeXMLRoot) {
     CFDE_XMLNode* pThisXMLRoot = GetXMLMappingNode();
-    pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : NULL;
+    pFakeXMLRoot = pThisXMLRoot ? pThisXMLRoot->Clone(FALSE) : nullptr;
   }
   if (!pFakeXMLRoot) {
     CFX_WideStringC wsClassName;
@@ -1045,11 +1028,10 @@
         CFDE_XMLNode* pTempXMLNode = GetXMLMappingNode();
         SetXMLMappingNode(pFakeXMLRoot);
         SetFlag(XFA_NODEFLAG_OwnXMLNode, false);
-        if (pTempXMLNode &&
-            pTempXMLNode->GetNodeItem(CFDE_XMLNode::Parent) == NULL) {
+        if (pTempXMLNode && !pTempXMLNode->GetNodeItem(CFDE_XMLNode::Parent)) {
           pFakeXMLRoot = pTempXMLNode;
         } else {
-          pFakeXMLRoot = NULL;
+          pFakeXMLRoot = nullptr;
         }
       }
       MoveBufferMapData(pFakeRoot, this, XFA_CalcData, TRUE);
@@ -1071,13 +1053,13 @@
   } else {
     if (pFakeXMLRoot) {
       pFakeXMLRoot->Release();
-      pFakeXMLRoot = NULL;
+      pFakeXMLRoot = nullptr;
     }
   }
-  pParser->Release();
-  pParser = NULL;
 }
+
 void CXFA_Node::Script_NodeClass_SaveFilteredXML(CFXJSE_Arguments* pArguments) {
+  // TODO(weili): Check whether we need to implement this, pdfium:501.
 }
 
 void CXFA_Node::Script_NodeClass_SaveXML(CFXJSE_Arguments* pArguments) {
@@ -1086,13 +1068,13 @@
     ThrowScriptErrorMessage(XFA_IDS_INCORRECT_NUMBER_OF_METHOD, L"saveXML");
     return;
   }
-  FX_BOOL bPrettyMode = FALSE;
+  bool bPrettyMode = false;
   if (iLength == 1) {
     if (pArguments->GetUTF8String(0) != "pretty") {
       ThrowScriptErrorMessage(XFA_IDS_ARGUMENT_MISMATCH);
       return;
     }
-    bPrettyMode = TRUE;
+    bPrettyMode = true;
   }
   CFX_ByteStringC bsXMLHeader = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
   if (GetPacketID() == XFA_XDPPACKET_Form ||
@@ -1106,11 +1088,13 @@
       }
       XFA_DataExporter_DealWithDataGroupNode(this);
     }
-    std::unique_ptr<IFX_MemoryStream> pMemoryStream(
-        FX_CreateMemoryStream(TRUE));
-    std::unique_ptr<IFX_Stream> pStream(IFX_Stream::CreateStream(
-        (IFX_FileWrite*)pMemoryStream.get(),
-        FX_STREAMACCESS_Text | FX_STREAMACCESS_Write | FX_STREAMACCESS_Append));
+    std::unique_ptr<IFX_MemoryStream, ReleaseDeleter<IFX_MemoryStream>>
+        pMemoryStream(FX_CreateMemoryStream(TRUE));
+    std::unique_ptr<IFX_Stream, ReleaseDeleter<IFX_Stream>> pStream(
+        IFX_Stream::CreateStream(
+            static_cast<IFX_FileWrite*>(pMemoryStream.get()),
+            FX_STREAMACCESS_Text | FX_STREAMACCESS_Write |
+                FX_STREAMACCESS_Append));
     if (!pStream) {
       FXJSE_Value_SetUTF8String(pArguments->GetReturnValue(), bsXMLHeader);
       return;
@@ -1118,7 +1102,7 @@
     pStream->SetCodePage(FX_CODEPAGE_UTF8);
     pStream->WriteData(bsXMLHeader.raw_str(), bsXMLHeader.GetLength());
     if (GetPacketID() == XFA_XDPPACKET_Form)
-      XFA_DataExporter_RegenerateFormFile(this, pStream.get(), NULL, TRUE);
+      XFA_DataExporter_RegenerateFormFile(this, pStream.get(), nullptr, TRUE);
     else
       pElement->SaveXMLNode(pStream.get());
     // TODO(weili): Check whether we need to save pretty print XML, pdfium:501.
@@ -1143,7 +1127,7 @@
       CFX_WideString::FromUTF8(pArguments->GetUTF8String(0).AsStringC());
   CFX_WideString wsAttribute =
       CFX_WideString::FromUTF8(pArguments->GetUTF8String(1).AsStringC());
-  SetAttribute(wsAttribute.AsStringC(), wsAttributeValue.AsStringC(), TRUE);
+  SetAttribute(wsAttribute.AsStringC(), wsAttributeValue.AsStringC(), true);
 }
 
 void CXFA_Node::Script_NodeClass_SetElement(CFXJSE_Arguments* pArguments) {
@@ -1154,11 +1138,9 @@
   }
   CXFA_Node* pNode = nullptr;
   CFX_WideString wsName;
-  if (iLength >= 1)
-    pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
-  if (iLength >= 2) {
+  pNode = static_cast<CXFA_Node*>(pArguments->GetObject(0));
+  if (iLength == 2)
     wsName = CFX_WideString::FromUTF8(pArguments->GetUTF8String(1).AsStringC());
-  }
   // TODO(weili): check whether we need to implement this, pdfium:501.
   // For now, just put the variables here to avoid unused variable warning.
   (void)pNode;
@@ -1176,6 +1158,7 @@
     FXJSE_Value_SetUTF8String(pValue, FX_UTF8Encode(wsNameSpace).AsStringC());
   }
 }
+
 void CXFA_Node::Script_NodeClass_Model(CFXJSE_Value* pValue,
                                        FX_BOOL bSetting,
                                        XFA_ATTRIBUTE eAttribute) {
@@ -1186,15 +1169,16 @@
                                 GetModelNode()));
   }
 }
+
 void CXFA_Node::Script_NodeClass_IsContainer(CFXJSE_Value* pValue,
                                              FX_BOOL bSetting,
                                              XFA_ATTRIBUTE eAttribute) {
-  if (bSetting) {
+  if (bSetting)
     ThrowScriptErrorMessage(XFA_IDS_INVAlID_PROP_SET);
-  } else {
+  else
     FXJSE_Value_SetBoolean(pValue, IsContainerNode());
-  }
 }
+
 void CXFA_Node::Script_NodeClass_IsNull(CFXJSE_Value* pValue,
                                         FX_BOOL bSetting,
                                         XFA_ATTRIBUTE eAttribute) {
@@ -1209,6 +1193,7 @@
     FXJSE_Value_SetBoolean(pValue, !TryContent(strValue) || strValue.IsEmpty());
   }
 }
+
 void CXFA_Node::Script_NodeClass_OneOfChild(CFXJSE_Value* pValue,
                                             FX_BOOL bSetting,
                                             XFA_ATTRIBUTE eAttribute) {
@@ -1224,6 +1209,7 @@
     }
   }
 }
+
 void CXFA_Node::Script_ContainerClass_GetDelta(CFXJSE_Arguments* pArguments) {}
 void CXFA_Node::Script_ContainerClass_GetDeltas(CFXJSE_Arguments* pArguments) {
   CXFA_ArrayNodeList* pFormNodes = new CXFA_ArrayNodeList(m_pDocument);
@@ -1473,7 +1459,7 @@
           wsSOM = wsUseVal;
         }
       }
-      CXFA_Node* pProtoNode = NULL;
+      CXFA_Node* pProtoNode = nullptr;
       if (!wsSOM.IsEmpty()) {
         uint32_t dwFlag = XFA_RESOLVENODE_Children |
                           XFA_RESOLVENODE_Attributes |
@@ -1651,7 +1637,7 @@
     }
     CFX_WideString wsNewValue = CFX_WideString::FromUTF8(newValue.AsStringC());
     CFX_WideString wsFormatValue(wsNewValue);
-    CXFA_WidgetData* pContainerWidgetData = NULL;
+    CXFA_WidgetData* pContainerWidgetData = nullptr;
     if (GetPacketID() == XFA_XDPPACKET_Datasets) {
       CXFA_NodeArray formNodes;
       GetBindItems(formNodes);
@@ -1669,7 +1655,7 @@
         if (!wsPicture.IsEmpty()) {
           break;
         }
-        pContainerWidgetData = NULL;
+        pContainerWidgetData = nullptr;
       }
     } else if (GetPacketID() == XFA_XDPPACKET_Form) {
       pContainerWidgetData = GetContainerWidgetData();
@@ -2500,7 +2486,7 @@
       CFX_WideStringC wsInstName = pInstMgrNode->GetCData(XFA_ATTRIBUTE_Name);
       if (wsInstName.GetLength() < 1 || wsInstName.GetAt(0) != '_' ||
           wsInstName.Mid(1) != wsName) {
-        return NULL;
+        return nullptr;
       }
       dwNameHash = pNode->GetNameHash();
     }
@@ -2512,7 +2498,7 @@
       return pNode;
     }
   }
-  return NULL;
+  return nullptr;
 }
 void CXFA_Node::Script_Som_InstanceIndex(CFXJSE_Value* pValue,
                                          FX_BOOL bSetting,
@@ -2520,7 +2506,7 @@
   if (bSetting) {
     int32_t iTo = FXJSE_Value_ToInteger(pValue);
     int32_t iFrom = Subform_and_SubformSet_InstanceIndex();
-    CXFA_Node* pManagerNode = NULL;
+    CXFA_Node* pManagerNode = nullptr;
     for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
          pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
       if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
@@ -2554,7 +2540,7 @@
                                                XFA_ATTRIBUTE eAttribute) {
   if (!bSetting) {
     CFX_WideStringC wsName = GetCData(XFA_ATTRIBUTE_Name);
-    CXFA_Node* pInstanceMgr = NULL;
+    CXFA_Node* pInstanceMgr = nullptr;
     for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_PrevSibling); pNode;
          pNode = pNode->GetNodeItem(XFA_NODEITEM_PrevSibling)) {
       if (pNode->GetClassID() == XFA_ELEMENT_InstanceManager) {
@@ -3053,7 +3039,7 @@
         pDataParent->RemoveChild(pDataNode);
       }
     }
-    pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, NULL);
+    pFormNode->SetObject(XFA_ATTRIBUTE_BindingNode, nullptr);
   }
 }
 static CXFA_Node* XFA_ScriptInstanceManager_CreateInstance(
@@ -3062,7 +3048,7 @@
   CXFA_Document* pDocument = pInstMgrNode->GetDocument();
   CXFA_Node* pTemplateNode = pInstMgrNode->GetTemplateNode();
   CXFA_Node* pFormParent = pInstMgrNode->GetNodeItem(XFA_NODEITEM_Parent);
-  CXFA_Node* pDataScope = NULL;
+  CXFA_Node* pDataScope = nullptr;
   for (CXFA_Node* pRootBoundNode = pFormParent;
        pRootBoundNode &&
        pRootBoundNode->GetObjectType() == XFA_OBJECTTYPE_ContainerNode;
@@ -3719,9 +3705,9 @@
                                 const CFX_WideStringC& wsValue,
                                 bool bNotify) {
   const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr);
-  if (pAttr == NULL) {
+  if (!pAttr)
     return FALSE;
-  }
+
   XFA_ATTRIBUTETYPE eType = pAttr->eType;
   if (eType == XFA_ATTRIBUTETYPE_NOTSURE) {
     const XFA_NOTSUREATTRIBUTE* pNotsure =
@@ -3756,7 +3742,7 @@
                                 CFX_WideString& wsValue,
                                 FX_BOOL bUseDefault) {
   const XFA_ATTRIBUTEINFO* pAttr = XFA_GetAttributeByID(eAttr);
-  if (pAttr == NULL) {
+  if (!pAttr) {
     return FALSE;
   }
   XFA_ATTRIBUTETYPE eType = pAttr->eType;
@@ -3844,30 +3830,27 @@
 FX_BOOL CXFA_Node::TryBoolean(XFA_ATTRIBUTE eAttr,
                               FX_BOOL& bValue,
                               FX_BOOL bUseDefault) {
-  void* pValue = NULL;
-  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue)) {
+  void* pValue = nullptr;
+  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Boolean, bUseDefault, pValue))
     return FALSE;
-  }
   bValue = (FX_BOOL)(uintptr_t)pValue;
   return TRUE;
 }
 FX_BOOL CXFA_Node::TryInteger(XFA_ATTRIBUTE eAttr,
                               int32_t& iValue,
                               FX_BOOL bUseDefault) {
-  void* pValue = NULL;
-  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue)) {
+  void* pValue = nullptr;
+  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Integer, bUseDefault, pValue))
     return FALSE;
-  }
   iValue = (int32_t)(uintptr_t)pValue;
   return TRUE;
 }
 FX_BOOL CXFA_Node::TryEnum(XFA_ATTRIBUTE eAttr,
                            XFA_ATTRIBUTEENUM& eValue,
                            FX_BOOL bUseDefault) {
-  void* pValue = NULL;
-  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue)) {
+  void* pValue = nullptr;
+  if (!GetValue(eAttr, XFA_ATTRIBUTETYPE_Enum, bUseDefault, pValue))
     return FALSE;
-  }
   eValue = (XFA_ATTRIBUTEENUM)(uintptr_t)pValue;
   return TRUE;
 }
@@ -4048,7 +4031,7 @@
   if (!bUseDefault) {
     return FALSE;
   }
-  void* pValue = NULL;
+  void* pValue = nullptr;
   if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
                                    XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
     wsValue = (const FX_WCHAR*)pValue;
@@ -4075,7 +4058,7 @@
   if (!bUseDefault) {
     return FALSE;
   }
-  void* pValue = NULL;
+  void* pValue = nullptr;
   if (XFA_GetAttributeDefaultValue(pValue, GetClassID(), eAttr,
                                    XFA_ATTRIBUTETYPE_Cdata, m_ePacket)) {
     wsValue = (CFX_WideStringC)(const FX_WCHAR*)pValue;
@@ -4092,7 +4075,7 @@
 FX_BOOL CXFA_Node::TryObject(XFA_ATTRIBUTE eAttr, void*& pData) {
   void* pKey = XFA_GetMapKey_Element(GetClassID(), eAttr);
   pData = GetUserData(pKey);
-  return pData != NULL;
+  return pData != nullptr;
 }
 FX_BOOL CXFA_Node::SetValue(XFA_ATTRIBUTE eAttr,
                             XFA_ATTRIBUTETYPE eType,
@@ -4145,7 +4128,7 @@
 }
 static void XFA_DefaultFreeData(void* pData) {}
 static XFA_MAPDATABLOCKCALLBACKINFO gs_XFADefaultFreeData = {
-    XFA_DefaultFreeData, NULL};
+    XFA_DefaultFreeData, nullptr};
 FX_BOOL CXFA_Node::SetUserData(void* pKey,
                                void* pData,
                                XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
@@ -4165,8 +4148,8 @@
                                     bool bNotify,
                                     FX_BOOL bScriptModify,
                                     FX_BOOL bSyncData) {
-  CXFA_Node* pNode = NULL;
-  CXFA_Node* pBindNode = NULL;
+  CXFA_Node* pNode = nullptr;
+  CXFA_Node* pBindNode = nullptr;
   switch (GetObjectType()) {
     case XFA_OBJECTTYPE_ContainerNode: {
       if (XFA_FieldIsMultiListBox(this)) {
@@ -4209,7 +4192,7 @@
                 valueNodes, XFA_NODEFILTER_Children, XFA_ELEMENT_DataValue);
             if (iDatas < iSize) {
               int32_t iAddNodes = iSize - iDatas;
-              CXFA_Node* pValueNodes = NULL;
+              CXFA_Node* pValueNodes = nullptr;
               while (iAddNodes-- > 0) {
                 pValueNodes =
                     pBind->CreateSamePacketNode(XFA_ELEMENT_DataValue);
@@ -4217,7 +4200,7 @@
                 pValueNodes->CreateXMLMappingNode();
                 pBind->InsertChild(pValueNodes);
               }
-              pValueNodes = NULL;
+              pValueNodes = nullptr;
             } else if (iDatas > iSize) {
               int32_t iDelNodes = iDatas - iSize;
               while (iDelNodes-- > 0) {
@@ -4269,7 +4252,7 @@
           pNode->SetScriptContent(wsContent, wsContent, bNotify, true, FALSE);
         }
       }
-      pBindNode = NULL;
+      pBindNode = nullptr;
       break;
     }
     case XFA_OBJECTTYPE_ContentNode: {
@@ -4354,7 +4337,7 @@
 FX_BOOL CXFA_Node::TryContent(CFX_WideString& wsContent,
                               FX_BOOL bScriptModify,
                               FX_BOOL bProto) {
-  CXFA_Node* pNode = NULL;
+  CXFA_Node* pNode = nullptr;
   switch (GetObjectType()) {
     case XFA_OBJECTTYPE_ContainerNode:
       if (GetClassID() == XFA_ELEMENT_ExclGroup) {
@@ -4475,9 +4458,9 @@
   uint32_t dwPacket = GetPacketID();
   const XFA_PROPERTY* pProperty =
       XFA_GetPropertyOfElement(eElement, eProperty, dwPacket);
-  if (pProperty == NULL || index >= pProperty->uOccur) {
-    return NULL;
-  }
+  if (!pProperty || index >= pProperty->uOccur)
+    return nullptr;
+
   CXFA_Node* pNode = m_pChild;
   int32_t iCount = 0;
   for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
@@ -4488,17 +4471,16 @@
       }
     }
   }
-  if (!bCreateProperty) {
-    return NULL;
-  }
+  if (!bCreateProperty)
+    return nullptr;
+
   if (pProperty->uFlags & XFA_PROPERTYFLAG_OneOf) {
     pNode = m_pChild;
     for (; pNode; pNode = pNode->GetNodeItem(XFA_NODEITEM_NextSibling)) {
       const XFA_PROPERTY* pExistProperty =
           XFA_GetPropertyOfElement(eElement, pNode->GetClassID(), dwPacket);
-      if (pExistProperty && (pExistProperty->uFlags & XFA_PROPERTYFLAG_OneOf)) {
-        return NULL;
-      }
+      if (pExistProperty && (pExistProperty->uFlags & XFA_PROPERTYFLAG_OneOf))
+        return nullptr;
     }
   }
   CXFA_Document* pFactory = m_pDocument->GetParser()->GetFactory();
@@ -4506,9 +4488,8 @@
   CXFA_Node* pNewNode = nullptr;
   for (; iCount <= index; iCount++) {
     pNewNode = pFactory->CreateNode(pPacket, eProperty);
-    if (!pNewNode) {
-      return NULL;
-    }
+    if (!pNewNode)
+      return nullptr;
     InsertChild(pNewNode, nullptr);
     pNewNode->SetFlag(XFA_NODEFLAG_Initialized, true);
   }
@@ -4552,7 +4533,7 @@
       }
     }
   }
-  return NULL;
+  return nullptr;
 }
 int32_t CXFA_Node::InsertChild(int32_t index, CXFA_Node* pNode) {
   ASSERT(!pNode->m_pNext);
@@ -4561,7 +4542,7 @@
   ASSERT(ret);
   (void)ret;  // Avoid unused variable warning.
 
-  if (m_pChild == NULL || index == 0) {
+  if (!m_pChild || index == 0) {
     if (index > 0) {
       return -1;
     }
@@ -4583,18 +4564,18 @@
     pPrev->m_pNext = pNode;
     index = iCount;
   }
-  if (pNode->m_pNext == NULL) {
+  if (!pNode->m_pNext) {
     m_pLastChild = pNode;
   }
   ASSERT(m_pLastChild);
-  ASSERT(m_pLastChild->m_pNext == NULL);
+  ASSERT(!m_pLastChild->m_pNext);
   pNode->ClearFlag(XFA_NODEFLAG_HasRemoved);
   CXFA_FFNotify* pNotify = m_pDocument->GetParser()->GetNotify();
   if (pNotify)
     pNotify->OnChildAdded(this);
 
   if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
-    ASSERT(pNode->m_pXMLNode->GetNodeItem(CFDE_XMLNode::Parent) == NULL);
+    ASSERT(!pNode->m_pXMLNode->GetNodeItem(CFDE_XMLNode::Parent));
     m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, index);
     pNode->ClearFlag(XFA_NODEFLAG_OwnXMLNode);
   }
@@ -4613,7 +4594,7 @@
 
   int32_t nIndex = -1;
   pNode->m_pParent = this;
-  if (m_pChild == NULL || pBeforeNode == m_pChild) {
+  if (!m_pChild || pBeforeNode == m_pChild) {
     pNode->m_pNext = m_pChild;
     m_pChild = pNode;
     nIndex = 0;
@@ -4630,18 +4611,18 @@
     pNode->m_pNext = pPrev->m_pNext;
     pPrev->m_pNext = pNode;
   }
-  if (pNode->m_pNext == NULL) {
+  if (!pNode->m_pNext) {
     m_pLastChild = pNode;
   }
   ASSERT(m_pLastChild);
-  ASSERT(m_pLastChild->m_pNext == NULL);
+  ASSERT(!m_pLastChild->m_pNext);
   pNode->ClearFlag(XFA_NODEFLAG_HasRemoved);
   CXFA_FFNotify* pNotify = m_pDocument->GetParser()->GetNotify();
   if (pNotify)
     pNotify->OnChildAdded(this);
 
   if (IsNeedSavingXMLNode() && pNode->m_pXMLNode) {
-    ASSERT(pNode->m_pXMLNode->GetNodeItem(CFDE_XMLNode::Parent) == NULL);
+    ASSERT(!pNode->m_pXMLNode->GetNodeItem(CFDE_XMLNode::Parent));
     m_pXMLNode->InsertChildNode(pNode->m_pXMLNode, nIndex);
     pNode->ClearFlag(XFA_NODEFLAG_OwnXMLNode);
   }
@@ -4649,7 +4630,7 @@
 }
 CXFA_Node* CXFA_Node::Deprecated_GetPrevSibling() {
   if (!m_pParent) {
-    return NULL;
+    return nullptr;
   }
   for (CXFA_Node* pSibling = m_pParent->m_pChild; pSibling;
        pSibling = pSibling->m_pNext) {
@@ -4657,10 +4638,10 @@
       return pSibling;
     }
   }
-  return NULL;
+  return nullptr;
 }
 FX_BOOL CXFA_Node::RemoveChild(CXFA_Node* pNode, bool bNotify) {
-  if (pNode == NULL || pNode->m_pParent != this) {
+  if (!pNode || pNode->m_pParent != this) {
     ASSERT(FALSE);
     return FALSE;
   }
@@ -4669,18 +4650,18 @@
     if (m_pLastChild == pNode) {
       m_pLastChild = pNode->m_pNext;
     }
-    pNode->m_pNext = NULL;
-    pNode->m_pParent = NULL;
+    pNode->m_pNext = nullptr;
+    pNode->m_pParent = nullptr;
   } else {
     CXFA_Node* pPrev = pNode->Deprecated_GetPrevSibling();
     pPrev->m_pNext = pNode->m_pNext;
     if (m_pLastChild == pNode) {
       m_pLastChild = pNode->m_pNext ? pNode->m_pNext : pPrev;
     }
-    pNode->m_pNext = NULL;
-    pNode->m_pParent = NULL;
+    pNode->m_pNext = nullptr;
+    pNode->m_pParent = nullptr;
   }
-  ASSERT(m_pLastChild == NULL || m_pLastChild->m_pNext == NULL);
+  ASSERT(!m_pLastChild || !m_pLastChild->m_pNext);
   OnRemoved(bNotify);
   pNode->SetFlag(XFA_NODEFLAG_HasRemoved, true);
   m_pDocument->AddPurgeNode(pNode);
@@ -4721,7 +4702,7 @@
       return pNode;
     }
   }
-  return NULL;
+  return nullptr;
 }
 CXFA_Node* CXFA_Node::GetFirstChildByClass(XFA_ELEMENT eElement) const {
   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_FirstChild); pNode;
@@ -4730,7 +4711,7 @@
       return pNode;
     }
   }
-  return NULL;
+  return nullptr;
 }
 CXFA_Node* CXFA_Node::GetNextSameNameSibling(uint32_t dwNameHash) const {
   for (CXFA_Node* pNode = GetNodeItem(XFA_NODEITEM_NextSibling); pNode;
@@ -4739,7 +4720,7 @@
       return pNode;
     }
   }
-  return NULL;
+  return nullptr;
 }
 CXFA_Node* CXFA_Node::GetNextSameNameSibling(
     const CFX_WideStringC& wsNodeName) const {
@@ -4752,7 +4733,7 @@
       return pNode;
     }
   }
-  return NULL;
+  return nullptr;
 }
 int32_t CXFA_Node::GetNodeSameNameIndex() const {
   CXFA_ScriptContext* pScriptContext = m_pDocument->GetScriptContext();
@@ -4776,7 +4757,7 @@
   pScriptContext->GetSomExpression(this, wsSOMExpression);
 }
 CXFA_Node* CXFA_Node::GetInstanceMgrOfSubform() {
-  CXFA_Node* pInstanceMgr = NULL;
+  CXFA_Node* pInstanceMgr = nullptr;
   if (m_ePacket == XFA_XDPPACKET_Form) {
     CXFA_Node* pParentNode = GetNodeItem(XFA_NODEITEM_Parent);
     if (!pParentNode || pParentNode->GetClassID() == XFA_ELEMENT_Area) {
@@ -4972,7 +4953,7 @@
     }
     pNode = pNode->GetPacketID() != XFA_XDPPACKET_Datasets
                 ? pNode->GetTemplateNode()
-                : NULL;
+                : nullptr;
   }
   return FALSE;
 }
@@ -4996,7 +4977,7 @@
     XFA_MAPDATABLOCKCALLBACKINFO* pCallbackInfo) {
   XFA_MAPMODULEDATA* pModule = CreateMapModuleData();
   XFA_MAPDATABLOCK*& pBuffer = pModule->m_BufferMap[pKey];
-  if (pBuffer == NULL) {
+  if (!pBuffer) {
     pBuffer =
         (XFA_MAPDATABLOCK*)FX_Alloc(uint8_t, sizeof(XFA_MAPDATABLOCK) + iBytes);
   } else if (pBuffer->iBytes != iBytes) {
@@ -5008,9 +4989,9 @@
   } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
     pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
   }
-  if (pBuffer == NULL) {
+  if (!pBuffer)
     return;
-  }
+
   pBuffer->pCallbackInfo = pCallbackInfo;
   pBuffer->iBytes = iBytes;
   FXSYS_memcpy(pBuffer->GetData(), pValue, iBytes);
@@ -5019,7 +5000,7 @@
                                       void*& pValue,
                                       int32_t& iBytes,
                                       FX_BOOL bProtoAlso) const {
-  XFA_MAPDATABLOCK* pBuffer = NULL;
+  XFA_MAPDATABLOCK* pBuffer = nullptr;
   const CXFA_Node* pNode = this;
   while (pNode) {
     XFA_MAPMODULEDATA* pModule = pNode->GetMapModuleData();
@@ -5028,9 +5009,9 @@
     }
     pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
                 ? pNode->GetTemplateNode()
-                : NULL;
+                : nullptr;
   }
-  if (pBuffer == NULL) {
+  if (!pBuffer) {
     return FALSE;
   }
   pValue = pBuffer->GetData();
@@ -5049,7 +5030,7 @@
     }
     pNode = (bProtoAlso && pNode->GetPacketID() != XFA_XDPPACKET_Datasets)
                 ? pNode->GetTemplateNode()
-                : NULL;
+                : nullptr;
   }
   return FALSE;
 }
@@ -5059,7 +5040,7 @@
     return;
 
   if (pKey) {
-    XFA_MAPDATABLOCK* pBuffer = NULL;
+    XFA_MAPDATABLOCK* pBuffer = nullptr;
     pModule->m_BufferMap.Lookup(pKey, pBuffer);
     if (pBuffer) {
       if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
@@ -5119,7 +5100,7 @@
       }
       continue;
     }
-    if (pBuffer == NULL) {
+    if (!pBuffer) {
       pBuffer = (XFA_MAPDATABLOCK*)FX_Alloc(
           uint8_t, sizeof(XFA_MAPDATABLOCK) + pSrcBuffer->iBytes);
     } else if (pBuffer->iBytes != pSrcBuffer->iBytes) {
@@ -5131,7 +5112,7 @@
     } else if (pBuffer->pCallbackInfo && pBuffer->pCallbackInfo->pFree) {
       pBuffer->pCallbackInfo->pFree(*(void**)pBuffer->GetData());
     }
-    if (pBuffer == NULL) {
+    if (!pBuffer) {
       continue;
     }
     pBuffer->pCallbackInfo = pSrcBuffer->pCallbackInfo;
@@ -5153,8 +5134,8 @@
   if (pDstModule->GetClassID() != GetClassID()) {
     bNeedMove = FALSE;
   }
-  XFA_MAPMODULEDATA* pSrcModuleData = NULL;
-  XFA_MAPMODULEDATA* pDstModuleData = NULL;
+  XFA_MAPMODULEDATA* pSrcModuleData = nullptr;
+  XFA_MAPMODULEDATA* pDstModuleData = nullptr;
   if (bNeedMove) {
     pSrcModuleData = GetMapModuleData();
     if (!pSrcModuleData) {
@@ -5211,7 +5192,7 @@
     if (dwHashCode == ret->GetNameHash())
       return ret;
   }
-  return NULL;
+  return nullptr;
 }
 void CXFA_NodeList::Script_ListClass_Append(CFXJSE_Arguments* pArguments) {
   int32_t argc = pArguments->GetLength();
@@ -5309,7 +5290,7 @@
 }
 FX_BOOL CXFA_ArrayNodeList::Insert(CXFA_Node* pNewNode,
                                    CXFA_Node* pBeforeNode) {
-  if (pBeforeNode == NULL) {
+  if (!pBeforeNode) {
     m_array.Add(pNewNode);
   } else {
     int32_t iSize = m_array.GetSize();
@@ -5337,7 +5318,7 @@
   if (iIndex >= 0 && iIndex < iSize) {
     return m_array[iIndex];
   }
-  return NULL;
+  return nullptr;
 }
 CXFA_AttachNodeList::CXFA_AttachNodeList(CXFA_Document* pDocument,
                                          CXFA_Node* pAttachNode)
