Combine ElementTable, parent array, and names.

Adds element name to avoid aliasing user input.
Makes a single table now that we don't distinguish hidden elements

Change-Id: I014ec4422dd744cb114f0ce3d0e7ed4d60ca6a58
Reviewed-on: https://pdfium-review.googlesource.com/c/47111
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/parser/xfa_basic_data.cpp b/xfa/fxfa/parser/xfa_basic_data.cpp
index 1cf9fcc..395add8 100644
--- a/xfa/fxfa/parser/xfa_basic_data.cpp
+++ b/xfa/fxfa/parser/xfa_basic_data.cpp
@@ -156,11 +156,13 @@
 struct ElementRecord {
   uint32_t hash;  // Hashed as wide string.
   XFA_Element element;
+  XFA_Element parent;
+  const char* name;
 };
 
 const ElementRecord g_ElementTable[] = {
 #undef ELEM____
-#define ELEM____(a, b, c, d) {a, XFA_Element::c},
+#define ELEM____(a, b, c, d) {a, XFA_Element::c, XFA_Element::d, b},
 #include "xfa/fxfa/parser/elements.inc"
 #undef ELEM____
 };
@@ -192,13 +194,6 @@
 #undef VALUE____
 };
 
-const XFA_Element g_XFAScriptParents[] = {
-#undef ELEM____
-#define ELEM____(a, b, c, d) XFA_Element::d,
-#include "xfa/fxfa/parser/elements.inc"
-#undef ELEM____
-};
-
 struct ElementAttributeRecord {
   XFA_Element element;
   XFA_Attribute attribute;
@@ -221,7 +216,7 @@
   auto* elem = std::lower_bound(
       std::begin(g_ElementTable), std::end(g_ElementTable), hash,
       [](const ElementRecord& a, uint32_t hash) { return a.hash < hash; });
-  if (elem != std::end(g_ElementTable) && elem->hash == hash)
+  if (elem != std::end(g_ElementTable) && name.EqualsASCII(elem->name))
     return elem->element;
   return XFA_Element::Unknown;
 }
@@ -286,7 +281,7 @@
       result.callback = it->callback;
       return result;
     }
-    element = g_XFAScriptParents[static_cast<size_t>(element)];
+    element = g_ElementTable[static_cast<size_t>(element)].parent;
   }
   return {};
 }