diff --git a/xfa/fwl/cfwl_monthcalendar.cpp b/xfa/fwl/cfwl_monthcalendar.cpp
index 4d799ff..a9c276e 100644
--- a/xfa/fwl/cfwl_monthcalendar.cpp
+++ b/xfa/fwl/cfwl_monthcalendar.cpp
@@ -255,9 +255,9 @@
   if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
 
-  int32_t iCount = pdfium::CollectionSize<int32_t>(m_arrDates);
+  int32_t iCount = pdfium::CollectionSize<int32_t>(m_DateArray);
   for (int32_t j = 0; j < iCount; j++) {
-    DATEINFO* pDataInfo = m_arrDates[j].get();
+    DATEINFO* pDataInfo = m_DateArray[j].get();
     if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Selected) {
       params.m_dwStates |= CFWL_PartState_Selected;
       if (pDataInfo->dwStates & FWL_ITEMSTATE_MCD_Flag) {
@@ -335,9 +335,9 @@
   if (pMatrix)
     params.m_matrix.Concat(*pMatrix);
 
-  int32_t iCount = pdfium::CollectionSize<int32_t>(m_arrDates);
+  int32_t iCount = pdfium::CollectionSize<int32_t>(m_DateArray);
   for (int32_t j = 0; j < iCount; j++) {
-    DATEINFO* pDataInfo = m_arrDates[j].get();
+    DATEINFO* pDataInfo = m_DateArray[j].get();
     params.m_wsText = pDataInfo->wsDay;
     params.m_PartRect = pDataInfo->rect;
     params.m_dwStates = pDataInfo->dwStates;
@@ -369,10 +369,10 @@
   if (m_iMonth != m_iCurMonth || m_iYear != m_iCurYear)
     return;
 
-  if (m_iDay < 1 || m_iDay > pdfium::CollectionSize<int32_t>(m_arrDates))
+  if (m_iDay < 1 || m_iDay > pdfium::CollectionSize<int32_t>(m_DateArray))
     return;
 
-  DATEINFO* pDate = m_arrDates[m_iDay - 1].get();
+  DATEINFO* pDate = m_DateArray[m_iDay - 1].get();
   if (!pDate)
     return;
 
@@ -501,7 +501,7 @@
   int32_t iWeekOfMonth = 0;
   float fLeft = m_DatesRect.left;
   float fTop = m_DatesRect.top;
-  for (const auto& pDateInfo : m_arrDates) {
+  for (const auto& pDateInfo : m_DateArray) {
     if (bNewWeek) {
       iWeekOfMonth++;
       bNewWeek = false;
@@ -538,7 +538,7 @@
 }
 
 void CFWL_MonthCalendar::ClearDateItem() {
-  m_arrDates.clear();
+  m_DateArray.clear();
 }
 
 void CFWL_MonthCalendar::ResetDateItem() {
@@ -552,11 +552,11 @@
     uint32_t dwStates = 0;
     if (m_iYear == m_iCurYear && m_iMonth == m_iCurMonth && m_iDay == (i + 1))
       dwStates |= FWL_ITEMSTATE_MCD_Flag;
-    if (pdfium::ContainsValue(m_arrSelDays, i + 1))
+    if (pdfium::ContainsValue(m_SelDayArray, i + 1))
       dwStates |= FWL_ITEMSTATE_MCD_Selected;
 
     CFX_RectF rtDate;
-    m_arrDates.push_back(pdfium::MakeUnique<DATEINFO>(
+    m_DateArray.push_back(pdfium::MakeUnique<DATEINFO>(
         i + 1, iDayOfWeek, dwStates, rtDate, WideString::Format(L"%d", i + 1)));
     iDayOfWeek++;
   }
@@ -609,24 +609,24 @@
 }
 
 void CFWL_MonthCalendar::RemoveSelDay() {
-  int32_t iDatesCount = pdfium::CollectionSize<int32_t>(m_arrDates);
-  for (int32_t iSelDay : m_arrSelDays) {
+  int32_t iDatesCount = pdfium::CollectionSize<int32_t>(m_DateArray);
+  for (int32_t iSelDay : m_SelDayArray) {
     if (iSelDay <= iDatesCount)
-      m_arrDates[iSelDay - 1]->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
+      m_DateArray[iSelDay - 1]->dwStates &= ~FWL_ITEMSTATE_MCD_Selected;
   }
-  m_arrSelDays.clear();
+  m_SelDayArray.clear();
 }
 
 void CFWL_MonthCalendar::AddSelDay(int32_t iDay) {
   ASSERT(iDay > 0);
-  if (!pdfium::ContainsValue(m_arrSelDays, iDay))
+  if (!pdfium::ContainsValue(m_SelDayArray, iDay))
     return;
 
   RemoveSelDay();
-  if (iDay <= pdfium::CollectionSize<int32_t>(m_arrDates))
-    m_arrDates[iDay - 1]->dwStates |= FWL_ITEMSTATE_MCD_Selected;
+  if (iDay <= pdfium::CollectionSize<int32_t>(m_DateArray))
+    m_DateArray[iDay - 1]->dwStates |= FWL_ITEMSTATE_MCD_Selected;
 
-  m_arrSelDays.push_back(iDay);
+  m_SelDayArray.push_back(iDay);
 }
 
 void CFWL_MonthCalendar::JumpToToday() {
@@ -638,7 +638,7 @@
     return;
   }
 
-  if (!pdfium::ContainsValue(m_arrSelDays, m_iDay))
+  if (!pdfium::ContainsValue(m_SelDayArray, m_iDay))
     AddSelDay(m_iDay);
 }
 
@@ -661,7 +661,7 @@
 
 int32_t CFWL_MonthCalendar::GetDayAtPoint(const CFX_PointF& point) const {
   int i = 1;  // one-based day values.
-  for (const auto& pDateInfo : m_arrDates) {
+  for (const auto& pDateInfo : m_DateArray) {
     if (pDateInfo->rect.Contains(point))
       return i;
     ++i;
@@ -670,10 +670,10 @@
 }
 
 CFX_RectF CFWL_MonthCalendar::GetDayRect(int32_t iDay) {
-  if (iDay <= 0 || iDay > pdfium::CollectionSize<int32_t>(m_arrDates))
+  if (iDay <= 0 || iDay > pdfium::CollectionSize<int32_t>(m_DateArray))
     return CFX_RectF();
 
-  DATEINFO* pDateInfo = m_arrDates[iDay - 1].get();
+  DATEINFO* pDateInfo = m_DateArray[iDay - 1].get();
   return pDateInfo ? pDateInfo->rect : CFX_RectF();
 }
 
@@ -751,15 +751,16 @@
     return;
 
   int32_t iOldSel = 0;
-  if (!m_arrSelDays.empty())
-    iOldSel = m_arrSelDays[0];
+  if (!m_SelDayArray.empty())
+    iOldSel = m_SelDayArray[0];
 
   int32_t iCurSel = GetDayAtPoint(pMsg->m_pos);
   if (iCurSel > 0) {
-    DATEINFO* lpDatesInfo = m_arrDates[iCurSel - 1].get();
+    DATEINFO* lpDatesInfo = m_DateArray[iCurSel - 1].get();
     CFX_RectF rtInvalidate(lpDatesInfo->rect);
-    if (iOldSel > 0 && iOldSel <= pdfium::CollectionSize<int32_t>(m_arrDates)) {
-      lpDatesInfo = m_arrDates[iOldSel - 1].get();
+    if (iOldSel > 0 &&
+        iOldSel <= pdfium::CollectionSize<int32_t>(m_DateArray)) {
+      lpDatesInfo = m_DateArray[iOldSel - 1].get();
       rtInvalidate.Union(lpDatesInfo->rect);
     }
     AddSelDay(iCurSel);
diff --git a/xfa/fwl/cfwl_monthcalendar.h b/xfa/fwl/cfwl_monthcalendar.h
index 38742a4..2972cf7 100644
--- a/xfa/fwl/cfwl_monthcalendar.h
+++ b/xfa/fwl/cfwl_monthcalendar.h
@@ -160,7 +160,7 @@
   CFX_RectF m_TodayFlagRect;
   WideString m_wsHead;
   WideString m_wsToday;
-  std::vector<std::unique_ptr<DATEINFO>> m_arrDates;
+  std::vector<std::unique_ptr<DATEINFO>> m_DateArray;
   int32_t m_iCurYear = 2011;
   int32_t m_iCurMonth = 1;
   int32_t m_iYear = 2011;
@@ -174,7 +174,7 @@
   CFX_SizeF m_HeadSize;
   CFX_SizeF m_CellSize;
   CFX_SizeF m_TodaySize;
-  std::vector<int32_t> m_arrSelDays;
+  std::vector<int32_t> m_SelDayArray;
   CFX_RectF m_ClientRect;
 };
 
diff --git a/xfa/fxfa/cxfa_ffdocview.cpp b/xfa/fxfa/cxfa_ffdocview.cpp
index 62b2fb2..676ef67 100644
--- a/xfa/fxfa/cxfa_ffdocview.cpp
+++ b/xfa/fxfa/cxfa_ffdocview.cpp
@@ -143,7 +143,7 @@
 }
 
 void CXFA_FFDocView::ShowNullTestMsg() {
-  int32_t iCount = pdfium::CollectionSize<int32_t>(m_arrNullTestMsg);
+  int32_t iCount = pdfium::CollectionSize<int32_t>(m_NullTestMsgArray);
   CXFA_FFApp* pApp = m_pDoc->GetApp();
   IXFA_AppProvider* pAppProvider = pApp->GetAppProvider();
   if (pAppProvider && iCount) {
@@ -151,7 +151,7 @@
     iCount -= iRemain;
     WideString wsMsg;
     for (int32_t i = 0; i < iCount; i++)
-      wsMsg += m_arrNullTestMsg[i] + L"\n";
+      wsMsg += m_NullTestMsgArray[i] + L"\n";
 
     if (iRemain > 0) {
       wsMsg += L"\n" + WideString::Format(
@@ -163,7 +163,7 @@
                          static_cast<uint32_t>(AlertIcon::kStatus),
                          static_cast<uint32_t>(AlertButton::kOK));
   }
-  m_arrNullTestMsg.clear();
+  m_NullTestMsgArray.clear();
 }
 
 void CXFA_FFDocView::UpdateDocView() {
diff --git a/xfa/fxfa/cxfa_ffdocview.h b/xfa/fxfa/cxfa_ffdocview.h
index dbc5319..33029cc 100644
--- a/xfa/fxfa/cxfa_ffdocview.h
+++ b/xfa/fxfa/cxfa_ffdocview.h
@@ -99,7 +99,7 @@
 
   bool m_bLayoutEvent = false;
   bool m_bInLayoutStatus = false;
-  std::vector<WideString> m_arrNullTestMsg;
+  std::vector<WideString> m_NullTestMsgArray;
 
   void ResetLayoutProcessor() { m_pXFADocLayout.Release(); }
 
diff --git a/xfa/fxfa/parser/cxfa_node.cpp b/xfa/fxfa/parser/cxfa_node.cpp
index a1a540d..fe21aba 100644
--- a/xfa/fxfa/parser/cxfa_node.cpp
+++ b/xfa/fxfa/parser/cxfa_node.cpp
@@ -2577,7 +2577,7 @@
       return iRet;
 
     if (eNullTest != XFA_AttributeValue::Disabled) {
-      pDocView->m_arrNullTestMsg.push_back(wsNullMsg);
+      pDocView->m_NullTestMsgArray.push_back(wsNullMsg);
       return XFA_EventError::kError;
     }
     return XFA_EventError::kSuccess;
