Add constants for common form field dictionary entries.

BUG=pdfium:1049

Change-Id: I34c8ab59ce684de2e06ab6c3c2acfa46d3b0acb9
Reviewed-on: https://pdfium-review.googlesource.com/c/51232
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Henrique Nakashima <hnakashima@chromium.org>
diff --git a/constants/BUILD.gn b/constants/BUILD.gn
index 9216738..30c6978 100644
--- a/constants/BUILD.gn
+++ b/constants/BUILD.gn
@@ -9,6 +9,7 @@
   sources = [
     "annotation_common.h",
     "annotation_flags.h",
+    "form_fields.h",
     "form_flags.h",
     "page_object.h",
     "stream_dict_common.h",
diff --git a/constants/form_fields.h b/constants/form_fields.h
new file mode 100644
index 0000000..248991b
--- /dev/null
+++ b/constants/form_fields.h
@@ -0,0 +1,27 @@
+// Copyright 2019 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONSTANTS_FORM_FIELDS_H_
+#define CONSTANTS_FORM_FIELDS_H_
+
+namespace pdfium {
+namespace form_fields {
+
+// PDF 1.7 spec, table 8.69.
+// Entries common to all field dictionaries.
+constexpr char kFT[] = "FT";
+constexpr char kParent[] = "Parent";
+constexpr char kKids[] = "Kids";
+constexpr char kT[] = "T";
+constexpr char kTU[] = "TU";
+constexpr char kTM[] = "TM";
+constexpr char kFf[] = "Ff";
+constexpr char kV[] = "V";
+constexpr char kDV[] = "DV";
+constexpr char kAA[] = "AA";
+
+}  // namespace form_fields
+}  // namespace pdfium
+
+#endif  // CONSTANTS_FORM_FIELDS_H_
diff --git a/core/fpdfapi/parser/cpdf_crypto_handler.cpp b/core/fpdfapi/parser/cpdf_crypto_handler.cpp
index d0335fc..a87211f 100644
--- a/core/fpdfapi/parser/cpdf_crypto_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_crypto_handler.cpp
@@ -12,6 +12,7 @@
 #include <stack>
 #include <utility>
 
+#include "constants/form_fields.h"
 #include "core/fdrm/fx_crypt.h"
 #include "core/fpdfapi/parser/cpdf_dictionary.h"
 #include "core/fpdfapi/parser/cpdf_number.h"
@@ -27,7 +28,6 @@
 
 constexpr char kContentsKey[] = "Contents";
 constexpr char kTypeKey[] = "Type";
-constexpr char kFTKey[] = "FT";
 constexpr char kSignTypeValue[] = "Sig";
 
 }  // namespace
@@ -39,7 +39,7 @@
     return false;
   const CPDF_Object* type_obj = dictionary->GetDirectObjectFor(kTypeKey);
   if (!type_obj)
-    type_obj = dictionary->GetDirectObjectFor(kFTKey);
+    type_obj = dictionary->GetDirectObjectFor(pdfium::form_fields::kFT);
   return type_obj && type_obj->GetString() == kSignTypeValue;
 }
 
@@ -302,7 +302,8 @@
       const CPDF_Dictionary* parent_dict =
           walker.GetParent() ? walker.GetParent()->GetDict() : nullptr;
       if (walker.dictionary_key() == kContentsKey &&
-          (parent_dict->KeyExist(kTypeKey) || parent_dict->KeyExist(kFTKey))) {
+          (parent_dict->KeyExist(kTypeKey) ||
+           parent_dict->KeyExist(pdfium::form_fields::kFT))) {
         // This object may be contents of signature dictionary.
         // But now values of 'Type' and 'FT' of dictionary keys are encrypted,
         // and we can not check this.
diff --git a/core/fpdfdoc/cpdf_annotlist.cpp b/core/fpdfdoc/cpdf_annotlist.cpp
index 482c79e..f249ab8 100644
--- a/core/fpdfdoc/cpdf_annotlist.cpp
+++ b/core/fpdfdoc/cpdf_annotlist.cpp
@@ -12,6 +12,7 @@
 
 #include "constants/annotation_common.h"
 #include "constants/annotation_flags.h"
+#include "constants/form_fields.h"
 #include "constants/form_flags.h"
 #include "core/fpdfapi/page/cpdf_page.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
@@ -88,8 +89,9 @@
   auto pAnnotDict = pDocument->New<CPDF_Dictionary>();
   pAnnotDict->SetNewFor<CPDF_Name>(pdfium::annotation::kType, "Annot");
   pAnnotDict->SetNewFor<CPDF_Name>(pdfium::annotation::kSubtype, "Popup");
-  pAnnotDict->SetNewFor<CPDF_String>("T", pParentDict->GetStringFor("T"),
-                                     false);
+  pAnnotDict->SetNewFor<CPDF_String>(
+      pdfium::form_fields::kT,
+      pParentDict->GetStringFor(pdfium::form_fields::kT), false);
   pAnnotDict->SetNewFor<CPDF_String>(pdfium::annotation::kContents,
                                      sContents.ToUTF8(), false);
 
@@ -126,7 +128,8 @@
     return;
   }
 
-  CPDF_Object* pFieldTypeObj = FPDF_GetFieldAttr(pAnnotDict, "FT");
+  CPDF_Object* pFieldTypeObj =
+      FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kFT);
   if (!pFieldTypeObj)
     return;
 
@@ -137,7 +140,8 @@
     return;
   }
 
-  CPDF_Object* pFieldFlagsObj = FPDF_GetFieldAttr(pAnnotDict, "Ff");
+  CPDF_Object* pFieldFlagsObj =
+      FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kFf);
   uint32_t flags = pFieldFlagsObj ? pFieldFlagsObj->GetInteger() : 0;
   if (field_type == "Ch") {
     auto type = (flags & pdfium::form_flags::kChoiceCombo)
@@ -154,7 +158,8 @@
   if (pAnnotDict->KeyExist(pdfium::annotation::kAS))
     return;
 
-  CPDF_Dictionary* pParentDict = pAnnotDict->GetDictFor("Parent");
+  CPDF_Dictionary* pParentDict =
+      pAnnotDict->GetDictFor(pdfium::form_fields::kParent);
   if (!pParentDict || !pParentDict->KeyExist(pdfium::annotation::kAS))
     return;
 
diff --git a/core/fpdfdoc/cpdf_formfield.cpp b/core/fpdfdoc/cpdf_formfield.cpp
index 1c9ea00..15b9066 100644
--- a/core/fpdfdoc/cpdf_formfield.cpp
+++ b/core/fpdfdoc/cpdf_formfield.cpp
@@ -10,6 +10,7 @@
 #include <set>
 #include <utility>
 
+#include "constants/form_fields.h"
 #include "constants/form_flags.h"
 #include "core/fpdfapi/parser/cfdf_document.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
@@ -58,8 +59,8 @@
   if (pAttr)
     return pAttr;
 
-  return FPDF_GetFieldAttrRecursive(pFieldDict->GetDictFor("Parent"), name,
-                                    nLevel + 1);
+  return FPDF_GetFieldAttrRecursive(
+      pFieldDict->GetDictFor(pdfium::form_fields::kParent), name, nLevel + 1);
 }
 
 }  // namespace
@@ -88,14 +89,14 @@
   CPDF_Dictionary* pLevel = pFieldDict;
   while (pLevel) {
     visited.insert(pLevel);
-    WideString short_name = pLevel->GetUnicodeTextFor("T");
+    WideString short_name = pLevel->GetUnicodeTextFor(pdfium::form_fields::kT);
     if (!short_name.IsEmpty()) {
       if (full_name.IsEmpty())
         full_name = std::move(short_name);
       else
         full_name = short_name + L'.' + full_name;
     }
-    pLevel = pLevel->GetDictFor("Parent");
+    pLevel = pLevel->GetDictFor(pdfium::form_fields::kParent);
     if (pdfium::ContainsKey(visited, pLevel))
       break;
   }
@@ -111,9 +112,11 @@
 CPDF_FormField::~CPDF_FormField() {}
 
 void CPDF_FormField::InitFieldFlags() {
-  const CPDF_Object* ft_attr = FPDF_GetFieldAttr(m_pDict.Get(), "FT");
+  const CPDF_Object* ft_attr =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kFT);
   ByteString type_name = ft_attr ? ft_attr->GetString() : ByteString();
-  const CPDF_Object* ff_attr = FPDF_GetFieldAttr(m_pDict.Get(), "Ff");
+  const CPDF_Object* ff_attr =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kFf);
   uint32_t flags = ff_attr ? ff_attr->GetInteger() : 0;
   if (flags & pdfium::form_flags::kReadOnly) {
     m_Flags |= pdfium::form_flags::kReadOnly;
@@ -212,12 +215,14 @@
     case kRichText:
     case kFile:
     default: {
-      const CPDF_Object* pDV = FPDF_GetFieldAttr(m_pDict.Get(), "DV");
+      const CPDF_Object* pDV =
+          FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
       WideString csDValue;
       if (pDV)
         csDValue = pDV->GetUnicodeText();
 
-      const CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+      const CPDF_Object* pV =
+          FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
       WideString csValue;
       if (pV)
         csValue = pV->GetUnicodeText();
@@ -235,14 +240,16 @@
         if (!pClone)
           return false;
 
-        m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("V"));
-        m_pDict->SetFor("V", std::move(pClone));
+        m_pForm->GetDocument()->AddOrphan(
+            m_pDict->RemoveFor(pdfium::form_fields::kV));
+        m_pDict->SetFor(pdfium::form_fields::kV, std::move(pClone));
         if (pRV) {
           m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
           m_pDict->SetFor("RV", pDV->Clone());
         }
       } else {
-        m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("V"));
+        m_pForm->GetDocument()->AddOrphan(
+            m_pDict->RemoveFor(pdfium::form_fields::kV));
         m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("RV"));
       }
       if (notify == NotificationOption::kNotify)
@@ -294,22 +301,26 @@
 }
 
 CPDF_AAction CPDF_FormField::GetAdditionalAction() const {
-  const CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict.Get(), "AA");
+  const CPDF_Object* pObj =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kAA);
   return CPDF_AAction(pObj ? pObj->GetDict() : nullptr);
 }
 
 WideString CPDF_FormField::GetAlternateName() const {
-  const CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict.Get(), "TU");
+  const CPDF_Object* pObj =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kTU);
   return pObj ? pObj->GetUnicodeText() : WideString();
 }
 
 WideString CPDF_FormField::GetMappingName() const {
-  const CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict.Get(), "TM");
+  const CPDF_Object* pObj =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kTM);
   return pObj ? pObj->GetUnicodeText() : WideString();
 }
 
 uint32_t CPDF_FormField::GetFieldFlags() const {
-  const CPDF_Object* pObj = FPDF_GetFieldAttr(m_pDict.Get(), "Ff");
+  const CPDF_Object* pObj =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kFf);
   return pObj ? pObj->GetInteger() : 0;
 }
 
@@ -327,13 +338,14 @@
     return GetCheckValue(bDefault);
 
   const CPDF_Object* pValue =
-      FPDF_GetFieldAttr(m_pDict.Get(), bDefault ? "DV" : "V");
+      FPDF_GetFieldAttr(m_pDict.Get(), bDefault ? pdfium::form_fields::kDV
+                                                : pdfium::form_fields::kV);
   if (!pValue) {
     if (!bDefault) {
       if (m_Type == kRichText)
-        pValue = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+        pValue = FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
       if (!pValue && m_Type != kText)
-        pValue = FPDF_GetFieldAttr(m_pDict.Get(), "DV");
+        pValue = FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
     }
     if (!pValue)
       return WideString();
@@ -380,7 +392,8 @@
           !NotifyBeforeValueChange(csValue)) {
         return false;
       }
-      ByteString key(bDefault ? "DV" : "V");
+      ByteString key(bDefault ? pdfium::form_fields::kDV
+                              : pdfium::form_fields::kV);
       m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor(key));
       m_pDict->SetNewFor<CPDF_String>(key, csValue);
       int iIndex = FindOptionValue(csValue);
@@ -447,7 +460,8 @@
 }
 
 int CPDF_FormField::CountSelectedItems() const {
-  const CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+  const CPDF_Object* pValue =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
   if (!pValue) {
     pValue = FPDF_GetFieldAttr(m_pDict.Get(), "I");
     if (!pValue)
@@ -461,7 +475,8 @@
 }
 
 int CPDF_FormField::GetSelectedIndex(int index) const {
-  const CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+  const CPDF_Object* pValue =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
   if (!pValue) {
     pValue = FPDF_GetFieldAttr(m_pDict.Get(), "I");
     if (!pValue)
@@ -505,7 +520,8 @@
     if (!NotifyListOrComboBoxBeforeChange(csValue))
       return false;
   }
-  m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("V"));
+  m_pForm->GetDocument()->AddOrphan(
+      m_pDict->RemoveFor(pdfium::form_fields::kV));
   m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
   if (notify == NotificationOption::kNotify)
     NotifyListOrComboBoxAfterChange();
@@ -520,7 +536,8 @@
     return true;
 
   WideString opt_value = GetOptionValue(index);
-  const CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+  const CPDF_Object* pValue =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
   if (!pValue) {
     pValue = FPDF_GetFieldAttr(m_pDict.Get(), "I");
     if (!pValue)
@@ -581,7 +598,7 @@
 void CPDF_FormField::SetItemSelectionSelected(int index,
                                               const WideString& opt_value) {
   if (GetType() != kListBox) {
-    m_pDict->SetNewFor<CPDF_String>("V", opt_value);
+    m_pDict->SetNewFor<CPDF_String>(pdfium::form_fields::kV, opt_value);
     CPDF_Array* pI = m_pDict->SetNewFor<CPDF_Array>("I");
     pI->AddNew<CPDF_Number>(index);
     return;
@@ -589,11 +606,11 @@
 
   SelectOption(index, true, NotificationOption::kDoNotNotify);
   if (!(m_Flags & kFormListMultiSelect)) {
-    m_pDict->SetNewFor<CPDF_String>("V", opt_value);
+    m_pDict->SetNewFor<CPDF_String>(pdfium::form_fields::kV, opt_value);
     return;
   }
 
-  CPDF_Array* pArray = m_pDict->SetNewFor<CPDF_Array>("V");
+  CPDF_Array* pArray = m_pDict->SetNewFor<CPDF_Array>(pdfium::form_fields::kV);
   for (int i = 0; i < CountOptions(); i++) {
     if (i == index || IsItemSelected(i))
       pArray->AddNew<CPDF_String>(GetOptionValue(i));
@@ -602,20 +619,24 @@
 
 void CPDF_FormField::SetItemSelectionUnselected(int index,
                                                 const WideString& opt_value) {
-  const CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+  const CPDF_Object* pValue =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
   if (!pValue)
     return;
 
   if (GetType() != kListBox) {
-    m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("V"));
+    m_pForm->GetDocument()->AddOrphan(
+        m_pDict->RemoveFor(pdfium::form_fields::kV));
     m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("I"));
     return;
   }
 
   SelectOption(index, false, NotificationOption::kDoNotNotify);
   if (pValue->IsString()) {
-    if (pValue->GetUnicodeText() == opt_value)
-      m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("V"));
+    if (pValue->GetUnicodeText() == opt_value) {
+      m_pForm->GetDocument()->AddOrphan(
+          m_pDict->RemoveFor(pdfium::form_fields::kV));
+    }
     return;
   }
 
@@ -628,8 +649,9 @@
       pArray->AddNew<CPDF_String>(GetOptionValue(i));
   }
   if (pArray->size() > 0) {
-    m_pForm->GetDocument()->AddOrphan(m_pDict->RemoveFor("V"));
-    m_pDict->SetFor("V", std::move(pArray));
+    m_pForm->GetDocument()->AddOrphan(
+        m_pDict->RemoveFor(pdfium::form_fields::kV));
+    m_pDict->SetFor(pdfium::form_fields::kV, std::move(pArray));
   }
 }
 
@@ -643,7 +665,8 @@
 
 int CPDF_FormField::GetDefaultSelectedItem() const {
   ASSERT(GetType() == kComboBox || GetType() == kListBox);
-  const CPDF_Object* pValue = FPDF_GetFieldAttr(m_pDict.Get(), "DV");
+  const CPDF_Object* pValue =
+      FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kDV);
   if (!pValue)
     return -1;
   WideString csDV = pValue->GetUnicodeText();
@@ -737,17 +760,19 @@
   if (!ToArray(pOpt)) {
     ByteString csBExport = PDF_EncodeText(csWExport);
     if (bChecked) {
-      m_pDict->SetNewFor<CPDF_Name>("V", csBExport);
+      m_pDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kV, csBExport);
     } else {
       ByteString csV;
-      const CPDF_Object* pV = FPDF_GetFieldAttr(m_pDict.Get(), "V");
+      const CPDF_Object* pV =
+          FPDF_GetFieldAttr(m_pDict.Get(), pdfium::form_fields::kV);
       if (pV)
         csV = pV->GetString();
       if (csV == csBExport)
-        m_pDict->SetNewFor<CPDF_Name>("V", "Off");
+        m_pDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kV, "Off");
     }
   } else if (bChecked) {
-    m_pDict->SetNewFor<CPDF_Name>("V", ByteString::Format("%d", iControlIndex));
+    m_pDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kV,
+                                  ByteString::Format("%d", iControlIndex));
   }
   if (notify == NotificationOption::kNotify && m_pForm->GetFormNotify())
     m_pForm->GetFormNotify()->AfterCheckedStatusChange(this);
diff --git a/core/fpdfdoc/cpdf_interactiveform.cpp b/core/fpdfdoc/cpdf_interactiveform.cpp
index 5555904..5507763 100644
--- a/core/fpdfdoc/cpdf_interactiveform.cpp
+++ b/core/fpdfdoc/cpdf_interactiveform.cpp
@@ -9,6 +9,7 @@
 #include <utility>
 #include <vector>
 
+#include "constants/form_fields.h"
 #include "constants/stream_dict_common.h"
 #include "core/fpdfapi/font/cpdf_font.h"
 #include "core/fpdfapi/font/cpdf_fontencoding.h"
@@ -841,7 +842,7 @@
     return;
 
   uint32_t dwParentObjNum = pFieldDict->GetObjNum();
-  CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids");
+  CPDF_Array* pKids = pFieldDict->GetArrayFor(pdfium::form_fields::kKids);
   if (!pKids) {
     AddTerminalField(pFieldDict);
     return;
@@ -851,7 +852,8 @@
   if (!pFirstKid)
     return;
 
-  if (pFirstKid->KeyExist("T") || pFirstKid->KeyExist("Kids")) {
+  if (pFirstKid->KeyExist(pdfium::form_fields::kT) ||
+      pFirstKid->KeyExist(pdfium::form_fields::kKids)) {
     for (size_t i = 0; i < pKids->size(); i++) {
       CPDF_Dictionary* pChildDict = pKids->GetDictAt(i);
       if (pChildDict) {
@@ -885,10 +887,11 @@
 }
 
 void CPDF_InteractiveForm::AddTerminalField(CPDF_Dictionary* pFieldDict) {
-  if (!pFieldDict->KeyExist("FT")) {
+  if (!pFieldDict->KeyExist(pdfium::form_fields::kFT)) {
     // Key "FT" is required for terminal fields, it is also inheritable.
-    CPDF_Dictionary* pParentDict = pFieldDict->GetDictFor("Parent");
-    if (!pParentDict || !pParentDict->KeyExist("FT"))
+    CPDF_Dictionary* pParentDict =
+        pFieldDict->GetDictFor(pdfium::form_fields::kParent);
+    if (!pParentDict || !pParentDict->KeyExist(pdfium::form_fields::kFT))
       return;
   }
 
@@ -901,42 +904,45 @@
   pField = m_pFieldTree->GetField(csWName);
   if (!pField) {
     CPDF_Dictionary* pParent = pFieldDict;
-    if (!pFieldDict->KeyExist("T") &&
+    if (!pFieldDict->KeyExist(pdfium::form_fields::kT) &&
         pFieldDict->GetStringFor("Subtype") == "Widget") {
-      pParent = pFieldDict->GetDictFor("Parent");
+      pParent = pFieldDict->GetDictFor(pdfium::form_fields::kParent);
       if (!pParent)
         pParent = pFieldDict;
     }
 
-    if (pParent && pParent != pFieldDict && !pParent->KeyExist("FT")) {
-      if (pFieldDict->KeyExist("FT")) {
-        CPDF_Object* pFTValue = pFieldDict->GetDirectObjectFor("FT");
+    if (pParent && pParent != pFieldDict &&
+        !pParent->KeyExist(pdfium::form_fields::kFT)) {
+      if (pFieldDict->KeyExist(pdfium::form_fields::kFT)) {
+        CPDF_Object* pFTValue =
+            pFieldDict->GetDirectObjectFor(pdfium::form_fields::kFT);
         if (pFTValue)
-          pParent->SetFor("FT", pFTValue->Clone());
+          pParent->SetFor(pdfium::form_fields::kFT, pFTValue->Clone());
       }
 
-      if (pFieldDict->KeyExist("Ff")) {
-        CPDF_Object* pFfValue = pFieldDict->GetDirectObjectFor("Ff");
+      if (pFieldDict->KeyExist(pdfium::form_fields::kFf)) {
+        CPDF_Object* pFfValue =
+            pFieldDict->GetDirectObjectFor(pdfium::form_fields::kFf);
         if (pFfValue)
-          pParent->SetFor("Ff", pFfValue->Clone());
+          pParent->SetFor(pdfium::form_fields::kFf, pFfValue->Clone());
       }
     }
 
     auto newField = pdfium::MakeUnique<CPDF_FormField>(this, pParent);
     pField = newField.get();
-    CPDF_Object* pTObj = pDict->GetObjectFor("T");
+    CPDF_Object* pTObj = pDict->GetObjectFor(pdfium::form_fields::kT);
     if (ToReference(pTObj)) {
       std::unique_ptr<CPDF_Object> pClone = pTObj->CloneDirectObject();
       if (pClone)
-        pDict->SetFor("T", std::move(pClone));
+        pDict->SetFor(pdfium::form_fields::kT, std::move(pClone));
       else
-        pDict->SetNewFor<CPDF_Name>("T", ByteString());
+        pDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kT, ByteString());
     }
     if (!m_pFieldTree->SetField(csWName, std::move(newField)))
       return;
   }
 
-  CPDF_Array* pKids = pFieldDict->GetArrayFor("Kids");
+  CPDF_Array* pKids = pFieldDict->GetArrayFor(pdfium::form_fields::kKids);
   if (pKids) {
     for (size_t i = 0; i < pKids->size(); i++) {
       CPDF_Dictionary* pKid = pKids->GetDictAt(i);
@@ -990,8 +996,10 @@
       bFind = pdfium::ContainsValue(*fields, pField);
     if (bIncludeOrExclude == bFind) {
       const CPDF_Dictionary* pFieldDict = pField->GetDict();
-      if (pField->IsRequired() && pFieldDict->GetStringFor("V").IsEmpty())
+      if (pField->IsRequired() &&
+          pFieldDict->GetStringFor(pdfium::form_fields::kV).IsEmpty()) {
         return false;
+      }
     }
   }
   return true;
@@ -1047,26 +1055,29 @@
       continue;
 
     if ((dwFlags & 0x02) != 0 &&
-        pField->GetDict()->GetStringFor("V").IsEmpty()) {
+        pField->GetDict()->GetStringFor(pdfium::form_fields::kV).IsEmpty()) {
       continue;
     }
 
     WideString fullname = FPDF_GetFullName(pField->GetFieldDict());
     auto pFieldDict = pDoc->New<CPDF_Dictionary>();
-    pFieldDict->SetNewFor<CPDF_String>("T", fullname);
+    pFieldDict->SetNewFor<CPDF_String>(pdfium::form_fields::kT, fullname);
     if (pField->GetType() == CPDF_FormField::kCheckBox ||
         pField->GetType() == CPDF_FormField::kRadioButton) {
       WideString csExport = pField->GetCheckValue(false);
       ByteString csBExport = PDF_EncodeText(csExport);
       CPDF_Object* pOpt = FPDF_GetFieldAttr(pField->GetDict(), "Opt");
-      if (pOpt)
-        pFieldDict->SetNewFor<CPDF_String>("V", csBExport, false);
-      else
-        pFieldDict->SetNewFor<CPDF_Name>("V", csBExport);
+      if (pOpt) {
+        pFieldDict->SetNewFor<CPDF_String>(pdfium::form_fields::kV, csBExport,
+                                           false);
+      } else {
+        pFieldDict->SetNewFor<CPDF_Name>(pdfium::form_fields::kV, csBExport);
+      }
     } else {
-      CPDF_Object* pV = FPDF_GetFieldAttr(pField->GetDict(), "V");
+      CPDF_Object* pV =
+          FPDF_GetFieldAttr(pField->GetDict(), pdfium::form_fields::kV);
       if (pV)
-        pFieldDict->SetFor("V", pV->CloneDirectObject());
+        pFieldDict->SetFor(pdfium::form_fields::kV, pV->CloneDirectObject());
     }
     pFields->Add(std::move(pFieldDict));
   }
diff --git a/core/fpdfdoc/cpvt_generateap.cpp b/core/fpdfdoc/cpvt_generateap.cpp
index 3117253..8f28c65 100644
--- a/core/fpdfdoc/cpvt_generateap.cpp
+++ b/core/fpdfdoc/cpvt_generateap.cpp
@@ -12,6 +12,7 @@
 #include <utility>
 
 #include "constants/annotation_common.h"
+#include "constants/form_fields.h"
 #include "core/fpdfapi/font/cpdf_font.h"
 #include "core/fpdfapi/parser/cpdf_array.h"
 #include "core/fpdfapi/parser/cpdf_boolean.h"
@@ -365,7 +366,7 @@
                                   const CPDF_Dictionary& pAnnotDict,
                                   CPDF_Font* pDefFont,
                                   const ByteString& sFontName) {
-  WideString swValue(pAnnotDict.GetUnicodeTextFor("T"));
+  WideString swValue(pAnnotDict.GetUnicodeTextFor(pdfium::form_fields::kT));
   swValue += L'\n';
   swValue += pAnnotDict.GetUnicodeTextFor(pdfium::annotation::kContents);
   CPVT_FontMap map(pDoc, nullptr, pDefFont, sFontName);
@@ -1079,15 +1080,18 @@
   switch (type) {
     case CPVT_GenerateAP::kTextField: {
       WideString swValue =
-          FPDF_GetFieldAttr(pAnnotDict, "V")
-              ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
+          FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kV)
+              ? FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kV)
+                    ->GetUnicodeText()
               : WideString();
       int32_t nAlign = FPDF_GetFieldAttr(pAnnotDict, "Q")
                            ? FPDF_GetFieldAttr(pAnnotDict, "Q")->GetInteger()
                            : 0;
-      uint32_t dwFlags = FPDF_GetFieldAttr(pAnnotDict, "Ff")
-                             ? FPDF_GetFieldAttr(pAnnotDict, "Ff")->GetInteger()
-                             : 0;
+      uint32_t dwFlags =
+          FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kFf)
+              ? FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kFf)
+                    ->GetInteger()
+              : 0;
       uint32_t dwMaxLen =
           FPDF_GetFieldAttr(pAnnotDict, "MaxLen")
               ? FPDF_GetFieldAttr(pAnnotDict, "MaxLen")->GetInteger()
@@ -1150,8 +1154,9 @@
     }
     case CPVT_GenerateAP::kComboBox: {
       WideString swValue =
-          FPDF_GetFieldAttr(pAnnotDict, "V")
-              ? FPDF_GetFieldAttr(pAnnotDict, "V")->GetUnicodeText()
+          FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kV)
+              ? FPDF_GetFieldAttr(pAnnotDict, pdfium::form_fields::kV)
+                    ->GetUnicodeText()
               : WideString();
       CPVT_FontMap map(
           pDoc, pStreamDict ? pStreamDict->GetDictFor("Resources") : nullptr,
diff --git a/fpdfsdk/cpdfsdk_helpers.cpp b/fpdfsdk/cpdfsdk_helpers.cpp
index 2a64f5f..6715c99 100644
--- a/fpdfsdk/cpdfsdk_helpers.cpp
+++ b/fpdfsdk/cpdfsdk_helpers.cpp
@@ -6,6 +6,7 @@
 
 #include "fpdfsdk/cpdfsdk_helpers.h"
 
+#include "constants/form_fields.h"
 #include "constants/stream_dict_common.h"
 #include "core/fpdfapi/cpdf_modulemgr.h"
 #include "core/fpdfapi/page/cpdf_page.h"
@@ -390,7 +391,7 @@
       break;
     case CPDF_Annot::Subtype::WIDGET: {
       const CPDF_Dictionary* pAnnotDict = pAnnot->GetAnnotDict();
-      ByteString cbString = pAnnotDict->GetStringFor("FT");
+      ByteString cbString = pAnnotDict->GetStringFor(pdfium::form_fields::kFT);
       if (cbString == "Sig")
         RaiseUnSupportError(FPDF_UNSP_ANNOT_SIG);
       break;