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 {};
}