Use symbols to represent parents in script hierarchy

These are still very fragile to insertions/deletions, but take a
step in the right direction.

- Add some names for missing enums.
- Convert int16_t to enum in a few places.
- Tidy one loop.

Change-Id: I5a7b502c4fda8166c210f2a90321f3c6fdb8dbf0
Reviewed-on: https://pdfium-review.googlesource.com/c/46672
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Reviewed-by: Lei Zhang <thestig@chromium.org>
diff --git a/xfa/fxfa/fxfa_basic.h b/xfa/fxfa/fxfa_basic.h
index 345fdff..1312318 100644
--- a/xfa/fxfa/fxfa_basic.h
+++ b/xfa/fxfa/fxfa_basic.h
@@ -135,7 +135,7 @@
 struct XFA_SCRIPTHIERARCHY {
   uint16_t wAttributeStart;
   uint16_t wAttributeCount;
-  int16_t wParentIndex;
+  XFA_Element wParentIndex;
 };
 
 #define XFA_PROPERTYFLAG_OneOf 0x01
diff --git a/xfa/fxfa/parser/elements.inc b/xfa/fxfa/parser/elements.inc
index e2ad579..094aebe 100644
--- a/xfa/fxfa/parser/elements.inc
+++ b/xfa/fxfa/parser/elements.inc
@@ -316,3 +316,12 @@
 ELEM____(0xfc78159fu, "numberSymbol", NumberSymbol)
 ELEM____(0xfcbd606cu, "tagged", Tagged)
 ELEM____(0xff063802u, "items", Items)
+ELEM_HIDDEN____(Object)
+ELEM_HIDDEN____(ListDuplicate)
+ELEM_HIDDEN____(Placeholder1)
+ELEM_HIDDEN____(Tree)
+ELEM_HIDDEN____(Node)
+ELEM_HIDDEN____(Placeholder2)
+ELEM_HIDDEN____(Placeholder3)
+ELEM_HIDDEN____(Model)
+ELEM_HIDDEN____(Placeholder4)
diff --git a/xfa/fxfa/parser/xfa_basic_data_element_script.cpp b/xfa/fxfa/parser/xfa_basic_data_element_script.cpp
index add5b1b..8e425d5 100644
--- a/xfa/fxfa/parser/xfa_basic_data_element_script.cpp
+++ b/xfa/fxfa/parser/xfa_basic_data_element_script.cpp
@@ -150,329 +150,339 @@
 #include "xfa/fxfa/fxfa_basic.h"
 
 const XFA_SCRIPTHIERARCHY g_XFAScriptIndex[] = {
-    {/* ps */ 0, 2, 316},
-    {/* to */ 2, 2, 316},
-    {/* ui */ 4, 2, 316},
-    {/* recordSet */ 6, 8, 316},
-    {/* subsetBelow */ 14, 4, 316},
-    {/* subformSet */ 18, 5, 317},
-    {/* adobeExtensionLevel */ 23, 2, 316},
-    {/* typeface */ 25, 1, 316},
-    {/* break */ 26, 12, 316},
-    {/* fontInfo */ 38, 2, 316},
-    {/* numberPattern */ 40, 1, 316},
-    {/* dynamicRender */ 41, 3, 316},
-    {/* printScaling */ 44, 2, 316},
-    {/* checkButton */ 46, 6, 316},
-    {/* datePatterns */ 52, 0, 316},
-    {/* sourceSet */ 52, 2, 319},
-    {/* amd */ 54, 2, 316},
-    {/* arc */ 56, 6, 316},
-    {/* day */ 62, 0, 316},
-    {/* era */ 62, 0, 316},
-    {/* jog */ 62, 2, 316},
-    {/* log */ 64, 2, 316},
-    {/* map */ 66, 6, 316},
-    {/* mdp */ 72, 4, 316},
-    {/* breakBefore */ 76, 7, 316},
-    {/* oid */ 83, 2, 320},
-    {/* pcl */ 85, 3, 316},
-    {/* pdf */ 88, 3, 316},
-    {/* ref */ 91, 2, 320},
-    {/* uri */ 93, 6, 320},
-    {/* xdc */ 99, 4, 316},
-    {/* xdp */ 103, 2, 316},
-    {/* xfa */ 105, 3, 319},
-    {/* xsl */ 108, 4, 316},
-    {/* zpl */ 112, 3, 316},
-    {/* cache */ 115, 2, 316},
-    {/* margin */ 117, 6, 316},
-    {/* keyUsage */ 123, 12, 316},
-    {/* exclude */ 135, 2, 316},
-    {/* choiceList */ 137, 5, 316},
-    {/* level */ 142, 2, 316},
-    {/* labelPrinter */ 144, 3, 316},
-    {/* calendarSymbols */ 147, 1, 316},
-    {/* para */ 148, 14, 316},
-    {/* part */ 162, 2, 316},
-    {/* pdfa */ 164, 2, 316},
-    {/* filter */ 166, 3, 316},
-    {/* present */ 169, 2, 316},
-    {/* pagination */ 171, 2, 316},
-    {/* encoding */ 173, 2, 316},
-    {/* event */ 175, 4, 316},
-    {/* whitespace */ 179, 2, 316},
-    {/* defaultUi */ 181, 2, 316},
-    {/* dataModel */ 183, 0, 319},
-    {/* barcode */ 183, 20, 316},
-    {/* timePattern */ 203, 1, 316},
-    {/* batchOutput */ 204, 3, 316},
-    {/* enforce */ 207, 2, 316},
-    {/* currencySymbols */ 209, 0, 316},
-    {/* addSilentPrint */ 209, 2, 316},
-    {/* rename */ 211, 2, 316},
-    {/* operation */ 213, 4, 320},
-    {/* typefaces */ 217, 0, 316},
-    {/* subjectDNs */ 217, 1, 316},
-    {/* issuers */ 218, 3, 316},
-    {/* signaturePseudoModel */ 221, 0, 312},
-    {/* wsdlConnection */ 221, 1, 316},
-    {/* debug */ 222, 2, 316},
-    {/* delta */ 224, 3, -1},
-    {/* eraNames */ 227, 0, 316},
-    {/* modifyAnnots */ 227, 2, 316},
-    {/* startNode */ 229, 2, 316},
-    {/* button */ 231, 3, 316},
-    {/* format */ 234, 2, 316},
-    {/* border */ 236, 6, 316},
-    {/* area */ 242, 10, 317},
-    {/* hyphenation */ 252, 9, 316},
-    {/* text */ 261, 5, 318},
-    {/* time */ 266, 4, 318},
-    {/* type */ 270, 2, 316},
-    {/* overprint */ 272, 2, 316},
-    {/* certificates */ 274, 5, 316},
-    {/* encryptionMethods */ 279, 3, 316},
-    {/* setProperty */ 282, 2, 316},
-    {/* printerName */ 284, 2, 316},
-    {/* startPage */ 286, 2, 316},
-    {/* pageOffset */ 288, 2, 316},
-    {/* dateTime */ 290, 4, 316},
-    {/* comb */ 294, 3, 316},
-    {/* pattern */ 297, 3, 316},
-    {/* ifEmpty */ 300, 2, 316},
-    {/* suppressBanner */ 302, 2, 316},
-    {/* outputBin */ 304, 2, 316},
-    {/* field */ 306, 36, 317},
-    {/* agent */ 342, 3, 316},
-    {/* outputXSL */ 345, 2, 316},
-    {/* adjustData */ 347, 2, 316},
-    {/* autoSave */ 349, 2, 316},
-    {/* contentArea */ 351, 7, 317},
-    {/* eventPseudoModel */ 358, 17, 312},
-    {/* wsdlAddress */ 375, 2, 320},
-    {/* solid */ 377, 2, 316},
-    {/* dateTimeSymbols */ 379, 0, 316},
-    {/* encryptionLevel */ 379, 2, 316},
-    {/* edge */ 381, 6, 316},
-    {/* stipple */ 387, 3, 316},
-    {/* attributes */ 390, 2, 316},
-    {/* versionControl */ 392, 4, 316},
-    {/* meridiem */ 396, 0, 316},
-    {/* exclGroup */ 396, 30, 316},
-    {/* toolTip */ 426, 2, 320},
-    {/* compress */ 428, 3, 316},
-    {/* reason */ 431, 2, 320},
-    {/* execute */ 433, 5, 316},
-    {/* contentCopy */ 438, 2, 316},
-    {/* dateTimeEdit */ 440, 3, 316},
-    {/* config */ 443, 2, 316},
-    {/* image */ 445, 8, 316},
-    {/* #xHTML */ 453, 1, 316},
-    {/* numberOfCopies */ 454, 2, 316},
-    {/* behaviorOverride */ 456, 2, 316},
-    {/* timeStamp */ 458, 4, 316},
-    {/* month */ 462, 0, 316},
-    {/* viewerPreferences */ 462, 2, 316},
-    {/* scriptModel */ 464, 2, 316},
-    {/* decimal */ 466, 6, 318},
-    {/* subform */ 472, 31, 317},
-    {/* select */ 503, 2, 320},
-    {/* window */ 505, 2, 316},
-    {/* localeSet */ 507, 2, 316},
-    {/* handler */ 509, 4, 320},
-    {/* hostPseudoModel */ 513, 11, 312},
-    {/* presence */ 524, 2, 316},
-    {/* record */ 526, 2, 316},
-    {/* embed */ 528, 2, 316},
-    {/* version */ 530, 2, 316},
-    {/* command */ 532, 3, 316},
-    {/* copies */ 535, 2, 316},
-    {/* staple */ 537, 3, 316},
-    {/* submitFormat */ 540, 3, 316},
-    {/* boolean */ 543, 4, 318},
-    {/* message */ 547, 4, 316},
-    {/* output */ 551, 2, 316},
-    {/* psMap */ 553, 0, 316},
-    {/* excludeNS */ 553, 2, 316},
-    {/* assist */ 555, 3, 316},
-    {/* picture */ 558, 6, 316},
-    {/* traversal */ 564, 2, 316},
-    {/* silentPrint */ 566, 2, 316},
-    {/* webClient */ 568, 3, 316},
-    {/* layoutPseudoModel */ 571, 1, 312},
-    {/* producer */ 572, 2, 316},
-    {/* corner */ 574, 8, 316},
-    {/* msgId */ 582, 2, 316},
-    {/* color */ 584, 4, 316},
-    {/* keep */ 588, 5, 316},
-    {/* query */ 593, 3, 316},
-    {/* insert */ 596, 2, 320},
-    {/* imageEdit */ 598, 3, 316},
-    {/* validate */ 601, 7, 316},
-    {/* digestMethods */ 608, 3, 316},
-    {/* numberPatterns */ 611, 0, 316},
-    {/* pageSet */ 611, 4, 317},
-    {/* integer */ 615, 4, 318},
-    {/* soapAddress */ 619, 2, 320},
-    {/* equate */ 621, 5, 316},
-    {/* formFieldFilling */ 626, 2, 316},
-    {/* pageRange */ 628, 2, 316},
-    {/* update */ 630, 2, 320},
-    {/* connectString */ 632, 2, 320},
-    {/* mode */ 634, 4, 316},
-    {/* layout */ 638, 2, 316},
-    {/* #xml */ 640, 1, 316},
-    {/* xsdConnection */ 641, 1, 316},
-    {/* traverse */ 642, 4, 316},
-    {/* encodings */ 646, 3, 316},
-    {/* template */ 649, 2, 319},
-    {/* acrobat */ 651, 2, 316},
-    {/* validationMessaging */ 653, 2, 316},
-    {/* signing */ 655, 3, 316},
-    {/* dataWindow */ 658, 4, 312},
-    {/* script */ 662, 10, 316},
-    {/* addViewerPreferences */ 672, 2, 316},
-    {/* alwaysEmbed */ 674, 4, 316},
-    {/* passwordEdit */ 678, 4, 316},
-    {/* numericEdit */ 682, 3, 316},
-    {/* encryptionMethod */ 685, 2, 316},
-    {/* change */ 687, 2, 316},
-    {/* pageArea */ 689, 8, 317},
-    {/* submitUrl */ 697, 3, 316},
-    {/* oids */ 700, 3, 316},
-    {/* signature */ 703, 2, 316},
-    {/* ADBE_JSConsole */ 705, 2, 316},
-    {/* caption */ 707, 5, 316},
-    {/* relevant */ 712, 4, 316},
-    {/* flipLabel */ 716, 2, 316},
-    {/* exData */ 718, 8, 318},
-    {/* dayNames */ 726, 1, 316},
-    {/* soapAction */ 727, 2, 320},
-    {/* defaultTypeface */ 729, 3, 316},
-    {/* manifest */ 732, 4, 316},
-    {/* overflow */ 736, 5, 316},
-    {/* linear */ 741, 3, 316},
-    {/* currencySymbol */ 744, 1, 316},
-    {/* delete */ 745, 2, 320},
-    {/* deltas */ 747, 0, 313},
-    {/* digestMethod */ 747, 2, 316},
-    {/* instanceManager */ 749, 3, 316},
-    {/* equateRange */ 752, 5, 316},
-    {/* medium */ 757, 7, 316},
-    {/* textEdit */ 764, 6, 316},
-    {/* templateCache */ 770, 3, 316},
-    {/* compressObjectStream */ 773, 2, 316},
-    {/* dataValue */ 775, 5, 316},
-    {/* accessibleContent */ 780, 2, 316},
-    {/* nodeList */ 782, 0, 314},
-    {/* includeXDPContent */ 782, 2, 316},
-    {/* xmlConnection */ 784, 1, 316},
-    {/* validateApprovalSignatures */ 785, 2, 316},
-    {/* signData */ 787, 5, 316},
-    {/* packets */ 792, 2, 316},
-    {/* datePattern */ 794, 1, 316},
-    {/* duplexOption */ 795, 2, 316},
-    {/* base */ 797, 2, 316},
-    {/* bind */ 799, 6, 316},
-    {/* compression */ 805, 2, 316},
-    {/* user */ 807, 2, 320},
-    {/* rectangle */ 809, 3, 316},
-    {/* effectiveOutputPolicy */ 812, 4, 316},
-    {/* ADBE_JSDebugger */ 816, 2, 316},
-    {/* acrobat7 */ 818, 2, 316},
-    {/* interactive */ 820, 2, 316},
-    {/* locale */ 822, 2, 316},
-    {/* currentPage */ 824, 2, 316},
-    {/* data */ 826, 2, 316},
-    {/* date */ 828, 4, 318},
-    {/* desc */ 832, 2, 316},
-    {/* encrypt */ 834, 5, 316},
-    {/* draw */ 839, 20, 317},
-    {/* encryption */ 859, 2, 316},
-    {/* meridiemNames */ 861, 0, 316},
-    {/* messaging */ 861, 2, 316},
-    {/* speak */ 863, 4, 320},
-    {/* dataGroup */ 867, 0, 316},
-    {/* common */ 867, 2, 316},
-    {/* #text */ 869, 1, 316},
-    {/* paginationOverride */ 870, 2, 316},
-    {/* reasons */ 872, 3, 316},
-    {/* signatureProperties */ 875, 2, 316},
-    {/* threshold */ 877, 2, 316},
-    {/* appearanceFilter */ 879, 4, 316},
-    {/* fill */ 883, 3, 316},
-    {/* font */ 886, 17, 316},
-    {/* form */ 903, 1, 319},
-    {/* mediumInfo */ 904, 2, 316},
-    {/* certificate */ 906, 2, 320},
-    {/* password */ 908, 2, 320},
-    {/* runScripts */ 910, 2, 316},
-    {/* trace */ 912, 2, 316},
-    {/* float */ 914, 4, 318},
-    {/* renderPolicy */ 918, 2, 316},
-    {/* logPseudoModel */ 920, 0, 312},
-    {/* destination */ 920, 2, 316},
-    {/* value */ 922, 4, 316},
-    {/* bookend */ 926, 4, 316},
-    {/* exObject */ 930, 6, 316},
-    {/* openAction */ 936, 2, 316},
-    {/* neverEmbed */ 938, 4, 316},
-    {/* bindItems */ 942, 3, 316},
-    {/* calculate */ 945, 3, 316},
-    {/* print */ 948, 2, 316},
-    {/* extras */ 950, 3, 316},
-    {/* proto */ 953, 0, 316},
-    {/* dSigData */ 953, 0, 316},
-    {/* creator */ 953, 2, 316},
-    {/* connect */ 955, 7, 316},
-    {/* permissions */ 962, 2, 316},
-    {/* connectionSet */ 964, 0, 319},
-    {/* submit */ 964, 7, 316},
-    {/* range */ 971, 2, 316},
-    {/* linearized */ 973, 2, 316},
-    {/* packet */ 975, 1, 316},
-    {/* rootElement */ 976, 2, 320},
-    {/* plaintextMetadata */ 978, 4, 316},
-    {/* numberSymbols */ 982, 0, 316},
-    {/* printHighQuality */ 982, 2, 316},
-    {/* driver */ 984, 2, 316},
-    {/* incrementalLoad */ 986, 4, 316},
-    {/* subjectDN */ 990, 1, 316},
-    {/* compressLogicalStructure */ 991, 2, 316},
-    {/* incrementalMerge */ 993, 2, 316},
-    {/* radial */ 995, 3, 316},
-    {/* variables */ 998, 2, 317},
-    {/* timePatterns */ 1000, 0, 316},
-    {/* effectiveInputPolicy */ 1000, 4, 316},
-    {/* nameAttr */ 1004, 4, 316},
-    {/* conformance */ 1008, 2, 316},
-    {/* transform */ 1010, 3, 316},
-    {/* lockDocument */ 1013, 4, 316},
-    {/* breakAfter */ 1017, 7, 316},
-    {/* line */ 1024, 4, 316},
-    {/* list */ 1028, 1, 313},
-    {/* source */ 1029, 3, 316},
-    {/* occur */ 1032, 5, 316},
-    {/* pickTrayByPDFSize */ 1037, 2, 316},
-    {/* monthNames */ 1039, 1, 316},
-    {/* severity */ 1040, 4, 316},
-    {/* groupParent */ 1044, 2, 316},
-    {/* documentAssembly */ 1046, 2, 316},
-    {/* numberSymbol */ 1048, 1, 316},
-    {/* tagged */ 1049, 2, 316},
-    {/*  */ 1051, 5, 316},
-    {/*  */ 1056, 1, -1},
-    {/*  */ 1057, 1, 312},
-    {/*  */ 1058, 0, 313},
-    {/*  */ 1058, 8, 312},
-    {/*  */ 1066, 6, 315},
-    {/*  */ 1072, 0, 316},
-    {/*  */ 1072, 0, 316},
-    {/*  */ 1072, 2, 316},
-    {/*  */ 1074, 2, 316}};
+    {/* ps */ 0, 2, XFA_Element::Node},
+    {/* to */ 2, 2, XFA_Element::Node},
+    {/* ui */ 4, 2, XFA_Element::Node},
+    {/* recordSet */ 6, 8, XFA_Element::Node},
+    {/* subsetBelow */ 14, 4, XFA_Element::Node},
+    {/* subformSet */ 18, 5, XFA_Element::Placeholder2},
+    {/* adobeExtensionLevel */ 23, 2, XFA_Element::Node},
+    {/* typeface */ 25, 1, XFA_Element::Node},
+    {/* break */ 26, 12, XFA_Element::Node},
+    {/* fontInfo */ 38, 2, XFA_Element::Node},
+    {/* numberPattern */ 40, 1, XFA_Element::Node},
+    {/* dynamicRender */ 41, 3, XFA_Element::Node},
+    {/* printScaling */ 44, 2, XFA_Element::Node},
+    {/* checkButton */ 46, 6, XFA_Element::Node},
+    {/* datePatterns */ 52, 0, XFA_Element::Node},
+    {/* sourceSet */ 52, 2, XFA_Element::Model},
+    {/* amd */ 54, 2, XFA_Element::Node},
+    {/* arc */ 56, 6, XFA_Element::Node},
+    {/* day */ 62, 0, XFA_Element::Node},
+    {/* era */ 62, 0, XFA_Element::Node},
+    {/* jog */ 62, 2, XFA_Element::Node},
+    {/* log */ 64, 2, XFA_Element::Node},
+    {/* map */ 66, 6, XFA_Element::Node},
+    {/* mdp */ 72, 4, XFA_Element::Node},
+    {/* breakBefore */ 76, 7, XFA_Element::Node},
+    {/* oid */ 83, 2, XFA_Element::Placeholder4},
+    {/* pcl */ 85, 3, XFA_Element::Node},
+    {/* pdf */ 88, 3, XFA_Element::Node},
+    {/* ref */ 91, 2, XFA_Element::Placeholder4},
+    {/* uri */ 93, 6, XFA_Element::Placeholder4},
+    {/* xdc */ 99, 4, XFA_Element::Node},
+    {/* xdp */ 103, 2, XFA_Element::Node},
+    {/* xfa */ 105, 3, XFA_Element::Model},
+    {/* xsl */ 108, 4, XFA_Element::Node},
+    {/* zpl */ 112, 3, XFA_Element::Node},
+    {/* cache */ 115, 2, XFA_Element::Node},
+    {/* margin */ 117, 6, XFA_Element::Node},
+    {/* keyUsage */ 123, 12, XFA_Element::Node},
+    {/* exclude */ 135, 2, XFA_Element::Node},
+    {/* choiceList */ 137, 5, XFA_Element::Node},
+    {/* level */ 142, 2, XFA_Element::Node},
+    {/* labelPrinter */ 144, 3, XFA_Element::Node},
+    {/* calendarSymbols */ 147, 1, XFA_Element::Node},
+    {/* para */ 148, 14, XFA_Element::Node},
+    {/* part */ 162, 2, XFA_Element::Node},
+    {/* pdfa */ 164, 2, XFA_Element::Node},
+    {/* filter */ 166, 3, XFA_Element::Node},
+    {/* present */ 169, 2, XFA_Element::Node},
+    {/* pagination */ 171, 2, XFA_Element::Node},
+    {/* encoding */ 173, 2, XFA_Element::Node},
+    {/* event */ 175, 4, XFA_Element::Node},
+    {/* whitespace */ 179, 2, XFA_Element::Node},
+    {/* defaultUi */ 181, 2, XFA_Element::Node},
+    {/* dataModel */ 183, 0, XFA_Element::Model},
+    {/* barcode */ 183, 20, XFA_Element::Node},
+    {/* timePattern */ 203, 1, XFA_Element::Node},
+    {/* batchOutput */ 204, 3, XFA_Element::Node},
+    {/* enforce */ 207, 2, XFA_Element::Node},
+    {/* currencySymbols */ 209, 0, XFA_Element::Node},
+    {/* addSilentPrint */ 209, 2, XFA_Element::Node},
+    {/* rename */ 211, 2, XFA_Element::Node},
+    {/* operation */ 213, 4, XFA_Element::Placeholder4},
+    {/* typefaces */ 217, 0, XFA_Element::Node},
+    {/* subjectDNs */ 217, 1, XFA_Element::Node},
+    {/* issuers */ 218, 3, XFA_Element::Node},
+    {/* signaturePseudoModel */ 221, 0, XFA_Element::Object},
+    {/* wsdlConnection */ 221, 1, XFA_Element::Node},
+    {/* debug */ 222, 2, XFA_Element::Node},
+    {/* delta */ 224, 3, XFA_Element::Unknown},
+    {/* eraNames */ 227, 0, XFA_Element::Node},
+    {/* modifyAnnots */ 227, 2, XFA_Element::Node},
+    {/* startNode */ 229, 2, XFA_Element::Node},
+    {/* button */ 231, 3, XFA_Element::Node},
+    {/* format */ 234, 2, XFA_Element::Node},
+    {/* border */ 236, 6, XFA_Element::Node},
+    {/* area */ 242, 10, XFA_Element::Placeholder2},
+    {/* hyphenation */ 252, 9, XFA_Element::Node},
+    {/* text */ 261, 5, XFA_Element::Placeholder3},
+    {/* time */ 266, 4, XFA_Element::Placeholder3},
+    {/* type */ 270, 2, XFA_Element::Node},
+    {/* overprint */ 272, 2, XFA_Element::Node},
+    {/* certificates */ 274, 5, XFA_Element::Node},
+    {/* encryptionMethods */ 279, 3, XFA_Element::Node},
+    {/* setProperty */ 282, 2, XFA_Element::Node},
+    {/* printerName */ 284, 2, XFA_Element::Node},
+    {/* startPage */ 286, 2, XFA_Element::Node},
+    {/* pageOffset */ 288, 2, XFA_Element::Node},
+    {/* dateTime */ 290, 4, XFA_Element::Node},
+    {/* comb */ 294, 3, XFA_Element::Node},
+    {/* pattern */ 297, 3, XFA_Element::Node},
+    {/* ifEmpty */ 300, 2, XFA_Element::Node},
+    {/* suppressBanner */ 302, 2, XFA_Element::Node},
+    {/* outputBin */ 304, 2, XFA_Element::Node},
+    {/* field */ 306, 36, XFA_Element::Placeholder2},
+    {/* agent */ 342, 3, XFA_Element::Node},
+    {/* outputXSL */ 345, 2, XFA_Element::Node},
+    {/* adjustData */ 347, 2, XFA_Element::Node},
+    {/* autoSave */ 349, 2, XFA_Element::Node},
+    {/* contentArea */ 351, 7, XFA_Element::Placeholder2},
+    {/* eventPseudoModel */ 358, 17, XFA_Element::Object},
+    {/* wsdlAddress */ 375, 2, XFA_Element::Placeholder4},
+    {/* solid */ 377, 2, XFA_Element::Node},
+    {/* dateTimeSymbols */ 379, 0, XFA_Element::Node},
+    {/* encryptionLevel */ 379, 2, XFA_Element::Node},
+    {/* edge */ 381, 6, XFA_Element::Node},
+    {/* stipple */ 387, 3, XFA_Element::Node},
+    {/* attributes */ 390, 2, XFA_Element::Node},
+    {/* versionControl */ 392, 4, XFA_Element::Node},
+    {/* meridiem */ 396, 0, XFA_Element::Node},
+    {/* exclGroup */ 396, 30, XFA_Element::Node},
+    {/* toolTip */ 426, 2, XFA_Element::Placeholder4},
+    {/* compress */ 428, 3, XFA_Element::Node},
+    {/* reason */ 431, 2, XFA_Element::Placeholder4},
+    {/* execute */ 433, 5, XFA_Element::Node},
+    {/* contentCopy */ 438, 2, XFA_Element::Node},
+    {/* dateTimeEdit */ 440, 3, XFA_Element::Node},
+    {/* config */ 443, 2, XFA_Element::Node},
+    {/* image */ 445, 8, XFA_Element::Node},
+    {/* #xHTML */ 453, 1, XFA_Element::Node},
+    {/* numberOfCopies */ 454, 2, XFA_Element::Node},
+    {/* behaviorOverride */ 456, 2, XFA_Element::Node},
+    {/* timeStamp */ 458, 4, XFA_Element::Node},
+    {/* month */ 462, 0, XFA_Element::Node},
+    {/* viewerPreferences */ 462, 2, XFA_Element::Node},
+    {/* scriptModel */ 464, 2, XFA_Element::Node},
+    {/* decimal */ 466, 6, XFA_Element::Placeholder3},
+    {/* subform */ 472, 31, XFA_Element::Placeholder2},
+    {/* select */ 503, 2, XFA_Element::Placeholder4},
+    {/* window */ 505, 2, XFA_Element::Node},
+    {/* localeSet */ 507, 2, XFA_Element::Node},
+    {/* handler */ 509, 4, XFA_Element::Placeholder4},
+    {/* hostPseudoModel */ 513, 11, XFA_Element::Object},
+    {/* presence */ 524, 2, XFA_Element::Node},
+    {/* record */ 526, 2, XFA_Element::Node},
+    {/* embed */ 528, 2, XFA_Element::Node},
+    {/* version */ 530, 2, XFA_Element::Node},
+    {/* command */ 532, 3, XFA_Element::Node},
+    {/* copies */ 535, 2, XFA_Element::Node},
+    {/* staple */ 537, 3, XFA_Element::Node},
+    {/* submitFormat */ 540, 3, XFA_Element::Node},
+    {/* boolean */ 543, 4, XFA_Element::Placeholder3},
+    {/* message */ 547, 4, XFA_Element::Node},
+    {/* output */ 551, 2, XFA_Element::Node},
+    {/* psMap */ 553, 0, XFA_Element::Node},
+    {/* excludeNS */ 553, 2, XFA_Element::Node},
+    {/* assist */ 555, 3, XFA_Element::Node},
+    {/* picture */ 558, 6, XFA_Element::Node},
+    {/* traversal */ 564, 2, XFA_Element::Node},
+    {/* silentPrint */ 566, 2, XFA_Element::Node},
+    {/* webClient */ 568, 3, XFA_Element::Node},
+    {/* layoutPseudoModel */ 571, 1, XFA_Element::Object},
+    {/* producer */ 572, 2, XFA_Element::Node},
+    {/* corner */ 574, 8, XFA_Element::Node},
+    {/* msgId */ 582, 2, XFA_Element::Node},
+    {/* color */ 584, 4, XFA_Element::Node},
+    {/* keep */ 588, 5, XFA_Element::Node},
+    {/* query */ 593, 3, XFA_Element::Node},
+    {/* insert */ 596, 2, XFA_Element::Placeholder4},
+    {/* imageEdit */ 598, 3, XFA_Element::Node},
+    {/* validate */ 601, 7, XFA_Element::Node},
+    {/* digestMethods */ 608, 3, XFA_Element::Node},
+    {/* numberPatterns */ 611, 0, XFA_Element::Node},
+    {/* pageSet */ 611, 4, XFA_Element::Placeholder2},
+    {/* integer */ 615, 4, XFA_Element::Placeholder3},
+    {/* soapAddress */ 619, 2, XFA_Element::Placeholder4},
+    {/* equate */ 621, 5, XFA_Element::Node},
+    {/* formFieldFilling */ 626, 2, XFA_Element::Node},
+    {/* pageRange */ 628, 2, XFA_Element::Node},
+    {/* update */ 630, 2, XFA_Element::Placeholder4},
+    {/* connectString */ 632, 2, XFA_Element::Placeholder4},
+    {/* mode */ 634, 4, XFA_Element::Node},
+    {/* layout */ 638, 2, XFA_Element::Node},
+    {/* #xml */ 640, 1, XFA_Element::Node},
+    {/* xsdConnection */ 641, 1, XFA_Element::Node},
+    {/* traverse */ 642, 4, XFA_Element::Node},
+    {/* encodings */ 646, 3, XFA_Element::Node},
+    {/* template */ 649, 2, XFA_Element::Model},
+    {/* acrobat */ 651, 2, XFA_Element::Node},
+    {/* validationMessaging */ 653, 2, XFA_Element::Node},
+    {/* signing */ 655, 3, XFA_Element::Node},
+    {/* dataWindow */ 658, 4, XFA_Element::Object},
+    {/* script */ 662, 10, XFA_Element::Node},
+    {/* addViewerPreferences */ 672, 2, XFA_Element::Node},
+    {/* alwaysEmbed */ 674, 4, XFA_Element::Node},
+    {/* passwordEdit */ 678, 4, XFA_Element::Node},
+    {/* numericEdit */ 682, 3, XFA_Element::Node},
+    {/* encryptionMethod */ 685, 2, XFA_Element::Node},
+    {/* change */ 687, 2, XFA_Element::Node},
+    {/* pageArea */ 689, 8, XFA_Element::Placeholder2},
+    {/* submitUrl */ 697, 3, XFA_Element::Node},
+    {/* oids */ 700, 3, XFA_Element::Node},
+    {/* signature */ 703, 2, XFA_Element::Node},
+    {/* ADBE_JSConsole */ 705, 2, XFA_Element::Node},
+    {/* caption */ 707, 5, XFA_Element::Node},
+    {/* relevant */ 712, 4, XFA_Element::Node},
+    {/* flipLabel */ 716, 2, XFA_Element::Node},
+    {/* exData */ 718, 8, XFA_Element::Placeholder3},
+    {/* dayNames */ 726, 1, XFA_Element::Node},
+    {/* soapAction */ 727, 2, XFA_Element::Placeholder4},
+    {/* defaultTypeface */ 729, 3, XFA_Element::Node},
+    {/* manifest */ 732, 4, XFA_Element::Node},
+    {/* overflow */ 736, 5, XFA_Element::Node},
+    {/* linear */ 741, 3, XFA_Element::Node},
+    {/* currencySymbol */ 744, 1, XFA_Element::Node},
+    {/* delete */ 745, 2, XFA_Element::Placeholder4},
+    {/* deltas */ 747, 0, XFA_Element::ListDuplicate},
+    {/* digestMethod */ 747, 2, XFA_Element::Node},
+    {/* instanceManager */ 749, 3, XFA_Element::Node},
+    {/* equateRange */ 752, 5, XFA_Element::Node},
+    {/* medium */ 757, 7, XFA_Element::Node},
+    {/* textEdit */ 764, 6, XFA_Element::Node},
+    {/* templateCache */ 770, 3, XFA_Element::Node},
+    {/* compressObjectStream */ 773, 2, XFA_Element::Node},
+    {/* dataValue */ 775, 5, XFA_Element::Node},
+    {/* accessibleContent */ 780, 2, XFA_Element::Node},
+    {/* nodeList */ 782, 0, XFA_Element::Placeholder1},
+    {/* includeXDPContent */ 782, 2, XFA_Element::Node},
+    {/* xmlConnection */ 784, 1, XFA_Element::Node},
+    {/* validateApprovalSignatures */ 785, 2, XFA_Element::Node},
+    {/* signData */ 787, 5, XFA_Element::Node},
+    {/* packets */ 792, 2, XFA_Element::Node},
+    {/* datePattern */ 794, 1, XFA_Element::Node},
+    {/* duplexOption */ 795, 2, XFA_Element::Node},
+    {/* base */ 797, 2, XFA_Element::Node},
+    {/* bind */ 799, 6, XFA_Element::Node},
+    {/* compression */ 805, 2, XFA_Element::Node},
+    {/* user */ 807, 2, XFA_Element::Placeholder4},
+    {/* rectangle */ 809, 3, XFA_Element::Node},
+    {/* effectiveOutputPolicy */ 812, 4, XFA_Element::Node},
+    {/* ADBE_JSDebugger */ 816, 2, XFA_Element::Node},
+    {/* acrobat7 */ 818, 2, XFA_Element::Node},
+    {/* interactive */ 820, 2, XFA_Element::Node},
+    {/* locale */ 822, 2, XFA_Element::Node},
+    {/* currentPage */ 824, 2, XFA_Element::Node},
+    {/* data */ 826, 2, XFA_Element::Node},
+    {/* date */ 828, 4, XFA_Element::Placeholder3},
+    {/* desc */ 832, 2, XFA_Element::Node},
+    {/* encrypt */ 834, 5, XFA_Element::Node},
+    {/* draw */ 839, 20, XFA_Element::Placeholder2},
+    {/* encryption */ 859, 2, XFA_Element::Node},
+    {/* meridiemNames */ 861, 0, XFA_Element::Node},
+    {/* messaging */ 861, 2, XFA_Element::Node},
+    {/* speak */ 863, 4, XFA_Element::Placeholder4},
+    {/* dataGroup */ 867, 0, XFA_Element::Node},
+    {/* common */ 867, 2, XFA_Element::Node},
+    {/* #text */ 869, 1, XFA_Element::Node},
+    {/* paginationOverride */ 870, 2, XFA_Element::Node},
+    {/* reasons */ 872, 3, XFA_Element::Node},
+    {/* signatureProperties */ 875, 2, XFA_Element::Node},
+    {/* threshold */ 877, 2, XFA_Element::Node},
+    {/* appearanceFilter */ 879, 4, XFA_Element::Node},
+    {/* fill */ 883, 3, XFA_Element::Node},
+    {/* font */ 886, 17, XFA_Element::Node},
+    {/* form */ 903, 1, XFA_Element::Model},
+    {/* mediumInfo */ 904, 2, XFA_Element::Node},
+    {/* certificate */ 906, 2, XFA_Element::Placeholder4},
+    {/* password */ 908, 2, XFA_Element::Placeholder4},
+    {/* runScripts */ 910, 2, XFA_Element::Node},
+    {/* trace */ 912, 2, XFA_Element::Node},
+    {/* float */ 914, 4, XFA_Element::Placeholder3},
+    {/* renderPolicy */ 918, 2, XFA_Element::Node},
+    {/* logPseudoModel */ 920, 0, XFA_Element::Object},
+    {/* destination */ 920, 2, XFA_Element::Node},
+    {/* value */ 922, 4, XFA_Element::Node},
+    {/* bookend */ 926, 4, XFA_Element::Node},
+    {/* exObject */ 930, 6, XFA_Element::Node},
+    {/* openAction */ 936, 2, XFA_Element::Node},
+    {/* neverEmbed */ 938, 4, XFA_Element::Node},
+    {/* bindItems */ 942, 3, XFA_Element::Node},
+    {/* calculate */ 945, 3, XFA_Element::Node},
+    {/* print */ 948, 2, XFA_Element::Node},
+    {/* extras */ 950, 3, XFA_Element::Node},
+    {/* proto */ 953, 0, XFA_Element::Node},
+    {/* dSigData */ 953, 0, XFA_Element::Node},
+    {/* creator */ 953, 2, XFA_Element::Node},
+    {/* connect */ 955, 7, XFA_Element::Node},
+    {/* permissions */ 962, 2, XFA_Element::Node},
+    {/* connectionSet */ 964, 0, XFA_Element::Model},
+    {/* submit */ 964, 7, XFA_Element::Node},
+    {/* range */ 971, 2, XFA_Element::Node},
+    {/* linearized */ 973, 2, XFA_Element::Node},
+    {/* packet */ 975, 1, XFA_Element::Node},
+    {/* rootElement */ 976, 2, XFA_Element::Placeholder4},
+    {/* plaintextMetadata */ 978, 4, XFA_Element::Node},
+    {/* numberSymbols */ 982, 0, XFA_Element::Node},
+    {/* printHighQuality */ 982, 2, XFA_Element::Node},
+    {/* driver */ 984, 2, XFA_Element::Node},
+    {/* incrementalLoad */ 986, 4, XFA_Element::Node},
+    {/* subjectDN */ 990, 1, XFA_Element::Node},
+    {/* compressLogicalStructure */ 991, 2, XFA_Element::Node},
+    {/* incrementalMerge */ 993, 2, XFA_Element::Node},
+    {/* radial */ 995, 3, XFA_Element::Node},
+    {/* variables */ 998, 2, XFA_Element::Placeholder2},
+    {/* timePatterns */ 1000, 0, XFA_Element::Node},
+    {/* effectiveInputPolicy */ 1000, 4, XFA_Element::Node},
+    {/* nameAttr */ 1004, 4, XFA_Element::Node},
+    {/* conformance */ 1008, 2, XFA_Element::Node},
+    {/* transform */ 1010, 3, XFA_Element::Node},
+    {/* lockDocument */ 1013, 4, XFA_Element::Node},
+    {/* breakAfter */ 1017, 7, XFA_Element::Node},
+    {/* line */ 1024, 4, XFA_Element::Node},
+    {/* list */ 1028, 1, XFA_Element::ListDuplicate},
+    {/* source */ 1029, 3, XFA_Element::Node},
+    {/* occur */ 1032, 5, XFA_Element::Node},
+    {/* pickTrayByPDFSize */ 1037, 2, XFA_Element::Node},
+    {/* monthNames */ 1039, 1, XFA_Element::Node},
+    {/* severity */ 1040, 4, XFA_Element::Node},
+    {/* groupParent */ 1044, 2, XFA_Element::Node},
+    {/* documentAssembly */ 1046, 2, XFA_Element::Node},
+    {/* numberSymbol */ 1048, 1, XFA_Element::Node},
+    {/* tagged */ 1049, 2, XFA_Element::Node},
+    {/* items */ 1051, 5, XFA_Element::Node},
+    {/* 312=Object */ 1056, 1, XFA_Element::Unknown},
+    {/* 313=ListDuplicate */ 1057, 1, XFA_Element::Object},
+    {/* 314=Placeholder1 */ 1058, 0, XFA_Element::ListDuplicate},
+    {/* 315=Tree */ 1058, 8, XFA_Element::Object},
+    {/* 316=Node  */ 1066, 6, XFA_Element::Tree},
+    {/* 317=Placeholder2 */ 1072, 0, XFA_Element::Node},
+    {/* 318=Placeholder3 */ 1072, 0, XFA_Element::Node},
+    {/* 319=Model */ 1072, 2, XFA_Element::Node},
+    {/* 320=Placeholder4 */ 1074, 2, XFA_Element::Node}};
 const size_t g_szScriptIndexCount = FX_ArraySize(g_XFAScriptIndex);
 
+static_assert(static_cast<int>(XFA_Element::Object) == 312, "312");
+static_assert(static_cast<int>(XFA_Element::ListDuplicate) == 313, "313");
+static_assert(static_cast<int>(XFA_Element::Placeholder1) == 314, "314");
+static_assert(static_cast<int>(XFA_Element::Tree) == 315, "315");
+static_assert(static_cast<int>(XFA_Element::Node) == 316, "316");
+static_assert(static_cast<int>(XFA_Element::Placeholder2) == 317, "317");
+static_assert(static_cast<int>(XFA_Element::Placeholder3) == 318, "318");
+static_assert(static_cast<int>(XFA_Element::Model) == 319, "319");
+static_assert(static_cast<int>(XFA_Element::Placeholder4) == 320, "320");
+
 #undef ATTR
 #define ATTR(a, b, c, d, e) a, d, e, reinterpret_cast<XFA_ATTRIBUTE_CALLBACK>(c)
 
diff --git a/xfa/fxfa/parser/xfa_utils.cpp b/xfa/fxfa/parser/xfa_utils.cpp
index ffc5fba..eb830bf 100644
--- a/xfa/fxfa/parser/xfa_utils.cpp
+++ b/xfa/fxfa/parser/xfa_utils.cpp
@@ -539,24 +539,17 @@
     return nullptr;
 
   uint32_t uHash = FX_HashCode_GetW(wsAttributeName, false);
-  int32_t iElementIndex = static_cast<int32_t>(eElement);
-  while (iElementIndex != -1) {
-    const XFA_SCRIPTHIERARCHY* scriptIndex = g_XFAScriptIndex + iElementIndex;
-    size_t iCount = scriptIndex->wAttributeCount;
-    if (iCount == 0) {
-      iElementIndex = scriptIndex->wParentIndex;
-      continue;
-    }
-
+  while (eElement != XFA_Element::Unknown) {
+    const XFA_SCRIPTHIERARCHY* scriptIndex =
+        &g_XFAScriptIndex[static_cast<size_t>(eElement)];
     size_t iStart = scriptIndex->wAttributeStart;
-    size_t iEnd = iStart + iCount;
+    size_t iEnd = iStart + scriptIndex->wAttributeCount;
     for (size_t iter = iStart; iter < iEnd; ++iter) {
-      const XFA_SCRIPTATTRIBUTEINFO* pInfo = g_SomAttributeData + iter;
+      const XFA_SCRIPTATTRIBUTEINFO* pInfo = &g_SomAttributeData[iter];
       if (uHash == pInfo->uHash)
         return pInfo;
     }
-
-    iElementIndex = scriptIndex->wParentIndex;
+    eElement = scriptIndex->wParentIndex;
   }
   return nullptr;
 }