• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 The PDFium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef XFA_FXFA_PARSER_CXFA_NODE_H_
8 #define XFA_FXFA_PARSER_CXFA_NODE_H_
9 
10 #include <stddef.h>
11 #include <stdint.h>
12 
13 #include <utility>
14 #include <vector>
15 
16 #include "core/fxcrt/fx_coordinates.h"
17 #include "core/fxcrt/mask.h"
18 #include "core/fxcrt/retain_ptr.h"
19 #include "core/fxcrt/unowned_ptr.h"
20 #include "core/fxcrt/widestring.h"
21 #include "core/fxge/dib/fx_dib.h"
22 #include "fxjs/gc/gced_tree_node_mixin.h"
23 #include "third_party/abseil-cpp/absl/types/optional.h"
24 #include "third_party/base/span.h"
25 #include "v8/include/cppgc/member.h"
26 #include "v8/include/cppgc/visitor.h"
27 #include "xfa/fxfa/cxfa_ffwidget_type.h"
28 #include "xfa/fxfa/fxfa.h"
29 #include "xfa/fxfa/parser/cxfa_object.h"
30 
31 class CFGAS_GEFont;
32 class CFX_DIBitmap;
33 class CFX_XMLDocument;
34 class CFX_XMLNode;
35 class CXFA_Bind;
36 class CXFA_Border;
37 class CXFA_Calculate;
38 class CXFA_Caption;
39 class CXFA_Event;
40 class CXFA_EventParam;
41 class CXFA_FFDoc;
42 class CXFA_FFDocView;
43 class CXFA_Font;
44 class CXFA_Keep;
45 class CXFA_Margin;
46 class CXFA_Measurement;
47 class CXFA_Occur;
48 class CXFA_Para;
49 class CXFA_Script;
50 class CXFA_TextLayout;
51 class CXFA_Ui;
52 class CXFA_Validate;
53 class CXFA_Value;
54 class CXFA_WidgetLayoutData;
55 class GCedLocaleIface;
56 
57 enum class XFA_NodeFilter : uint8_t {
58   kChildren = 1 << 0,
59   kProperties = 1 << 1,
60   kOneOfProperty = 1 << 2,
61 };
62 
63 enum class XFA_CheckState : uint8_t {
64   kOn = 0,
65   kOff = 1,
66   kNeutral = 2,
67 };
68 
69 enum class XFA_ValuePicture : uint8_t {
70   kRaw = 0,
71   kDisplay,
72   kEdit,
73   kDataBind,
74 };
75 
76 enum class XFA_NodeFlag : uint8_t {
77   kNone = 0,
78   kInitialized = 1 << 0,
79   kHasRemovedChildren = 1 << 1,
80   kNeedsInitApp = 1 << 2,
81   kBindFormItems = 1 << 3,
82   kUserInteractive = 1 << 4,
83   kUnusedNode = 1 << 5,
84   kLayoutGeneratedNode = 1 << 6
85 };
86 
87 enum class XFA_PropertyFlag : uint8_t {
88   kOneOf = 1 << 0,
89   kDefaultOneOf = 1 << 1,
90 };
91 
92 class CXFA_Node : public CXFA_Object, public GCedTreeNodeMixin<CXFA_Node> {
93  public:
94   struct PropertyData {
95     PropertyData() = delete;
PropertyDataPropertyData96     constexpr PropertyData(XFA_Element property,
97                            uint8_t occurrence_count,
98                            Mask<XFA_PropertyFlag> flags)
99         : property(property),
100           occurrence_count(occurrence_count),
101           flags(flags) {}
102 
103     XFA_Element property;
104     uint8_t occurrence_count;
105     Mask<XFA_PropertyFlag> flags;
106   };
107 
108   struct AttributeData {
109     XFA_Attribute attribute;
110     XFA_AttributeType type;
111     void* default_value;
112   };
113 
114   // Node is created from cppgc heap.
115   static CXFA_Node* Create(CXFA_Document* doc,
116                            XFA_Element element,
117                            XFA_PacketType packet);
118 
119   ~CXFA_Node() override;
120 
121   // CXFA_Object:
122   void Trace(cppgc::Visitor* visitor) const override;
123 
124   bool HasProperty(XFA_Element property) const;
125   bool HasPropertyFlag(XFA_Element property, XFA_PropertyFlag flag) const;
126   uint8_t PropertyOccurrenceCount(XFA_Element property) const;
127 
128   std::pair<CXFA_Node*, int32_t> GetProperty(int32_t index,
129                                              XFA_Element eProperty) const;
130   CXFA_Node* GetOrCreateProperty(int32_t index, XFA_Element eProperty);
131 
132   void SendAttributeChangeMessage(XFA_Attribute eAttribute, bool bScriptModify);
133 
134   bool HasAttribute(XFA_Attribute attr) const;
135   XFA_AttributeType GetAttributeType(XFA_Attribute type) const;
136 
137   // Note: returns XFA_Attribute::Unknown for invalid indicies.
138   XFA_Attribute GetAttribute(size_t i) const;
139 
GetPacketType()140   XFA_PacketType GetPacketType() const { return m_ePacket; }
141 
142   void SetInitializedFlagAndNotify();
143   void SetFlag(XFA_NodeFlag dwFlag);
144   void ClearFlag(XFA_NodeFlag dwFlag);
145 
146   CXFA_Node* CreateInstanceIfPossible(bool bDataMerge);
147   int32_t GetCount();
148   CXFA_Node* GetItemIfExists(int32_t iIndex);
149   void RemoveItem(CXFA_Node* pRemoveInstance, bool bRemoveDataBinding);
150   void InsertItem(CXFA_Node* pNewInstance,
151                   int32_t iPos,
152                   int32_t iCount,
153                   bool bMoveDataBindingNodes);
154 
IsInitialized()155   bool IsInitialized() const { return HasFlag(XFA_NodeFlag::kInitialized); }
IsUserInteractive()156   bool IsUserInteractive() const {
157     return HasFlag(XFA_NodeFlag::kUserInteractive);
158   }
IsUnusedNode()159   bool IsUnusedNode() const { return HasFlag(XFA_NodeFlag::kUnusedNode); }
IsLayoutGeneratedNode()160   bool IsLayoutGeneratedNode() const {
161     return HasFlag(XFA_NodeFlag::kLayoutGeneratedNode);
162   }
163 
164   bool PresenceRequiresSpace() const;
165   void SetBindingNode(CXFA_Node* node);
166   void SetNodeAndDescendantsUnused();
167 
HasRemovedChildren()168   bool HasRemovedChildren() const {
169     return HasFlag(XFA_NodeFlag::kHasRemovedChildren);
170   }
171 
172   bool IsAttributeInXML();
IsFormContainer()173   bool IsFormContainer() const {
174     return m_ePacket == XFA_PacketType::Form && IsContainerNode();
175   }
176 
SetXMLMappingNode(CFX_XMLNode * node)177   void SetXMLMappingNode(CFX_XMLNode* node) { xml_node_ = node; }
GetXMLMappingNode()178   CFX_XMLNode* GetXMLMappingNode() const { return xml_node_; }
179   CFX_XMLNode* CreateXMLMappingNode();
180   bool IsNeedSavingXMLNode() const;
181 
182   void SetToXML(const WideString& value);
183 
GetNameHash()184   uint32_t GetNameHash() const { return m_dwNameHash; }
IsUnnamed()185   bool IsUnnamed() const { return m_dwNameHash == 0; }
186   CXFA_Node* GetModelNode();
187   void UpdateNameHash();
188 
189   size_t CountChildren(XFA_Element eType, bool bOnlyChild);
190 
191   template <typename T>
GetChild(size_t index,XFA_Element eType,bool bOnlyChild)192   T* GetChild(size_t index, XFA_Element eType, bool bOnlyChild) {
193     return static_cast<T*>(GetChildInternal(index, eType, bOnlyChild));
194   }
195 
196   template <typename T>
GetChild(size_t index,XFA_Element eType,bool bOnlyChild)197   const T* GetChild(size_t index, XFA_Element eType, bool bOnlyChild) const {
198     return static_cast<const T*>(GetChildInternal(index, eType, bOnlyChild));
199   }
200 
201   bool IsAncestorOf(const CXFA_Node* that) const;
202 
203   void InsertChildAndNotify(int32_t index, CXFA_Node* pNode);
204   void InsertChildAndNotify(CXFA_Node* pNode, CXFA_Node* pBeforeNode);
205   void RemoveChildAndNotify(CXFA_Node* pNode, bool bNotify);
206 
207   CXFA_Node* Clone(bool bRecursive);
208 
209   CXFA_Node* GetNextContainerSibling() const;
210   CXFA_Node* GetPrevContainerSibling() const;
211   CXFA_Node* GetFirstContainerChild() const;
212   CXFA_Node* GetContainerParent() const;
213 
214   std::vector<CXFA_Node*> GetNodeListForType(XFA_Element eTypeFilter);
215   std::vector<CXFA_Node*> GetNodeListWithFilter(Mask<XFA_NodeFilter> dwFilter);
216   CXFA_Node* CreateSamePacketNode(XFA_Element eType);
217   CXFA_Node* CloneTemplateToForm(bool bRecursive);
218   CXFA_Node* GetTemplateNodeIfExists() const;
219   void SetTemplateNode(CXFA_Node* pTemplateNode);
220   CXFA_Node* GetDataDescriptionNode();
221   void SetDataDescriptionNode(CXFA_Node* pDataDescriptionNode);
222   CXFA_Node* GetBindData();
HasBindItems()223   bool HasBindItems() const { return !binding_nodes_.empty(); }
224   std::vector<CXFA_Node*> GetBindItemsCopy() const;
225   void AddBindItem(CXFA_Node* pFormNode);
226   // Returns true if there are still more items.
227   bool RemoveBindItem(CXFA_Node* pFormNode);
228   bool HasBindItem() const;
229   CXFA_Node* GetContainerNode();
230   GCedLocaleIface* GetLocale();
231   absl::optional<WideString> GetLocaleName();
232   XFA_AttributeValue GetIntact();
233   WideString GetNameExpression();
234 
235   CXFA_Node* GetFirstChildByName(WideStringView wsNodeName) const;
236   CXFA_Node* GetFirstChildByName(uint32_t dwNodeNameHash) const;
237   template <typename T>
GetFirstChildByClass(XFA_Element eType)238   T* GetFirstChildByClass(XFA_Element eType) const {
239     return static_cast<T*>(GetFirstChildByClassInternal(eType));
240   }
241   CXFA_Node* GetNextSameNameSibling(uint32_t dwNodeNameHash) const;
242   template <typename T>
GetNextSameNameSibling(WideStringView wsNodeName)243   T* GetNextSameNameSibling(WideStringView wsNodeName) const {
244     return static_cast<T*>(GetNextSameNameSiblingInternal(wsNodeName));
245   }
246   template <typename T>
GetNextSameClassSibling(XFA_Element eType)247   T* GetNextSameClassSibling(XFA_Element eType) const {
248     return static_cast<T*>(GetNextSameClassSiblingInternal(eType));
249   }
250 
251   CXFA_Node* GetOneChildNamed(WideStringView wsName);
252   CXFA_Node* GetOneChildOfClass(WideStringView wsClass);
253 
254   std::vector<CXFA_Node*> GetSiblings(bool bIsClassName);
255   size_t GetIndex(bool bIsProperty, bool bIsClassIndex);
256   size_t GetIndexByName();
257   size_t GetIndexByClassName();
258 
259   CXFA_Node* GetInstanceMgrOfSubform();
260 
261   absl::optional<bool> GetDefaultBoolean(XFA_Attribute attr) const;
262   absl::optional<int32_t> GetDefaultInteger(XFA_Attribute attr) const;
263   absl::optional<CXFA_Measurement> GetDefaultMeasurement(
264       XFA_Attribute attr) const;
265   absl::optional<WideString> GetDefaultCData(XFA_Attribute attr) const;
266   absl::optional<XFA_AttributeValue> GetDefaultEnum(XFA_Attribute attr) const;
267 
268   bool IsOpenAccess() const;
269 
270   CXFA_Occur* GetOccurIfExists();
271   CXFA_Border* GetBorderIfExists() const;
272   CXFA_Border* GetOrCreateBorderIfPossible();
273   CXFA_Caption* GetCaptionIfExists() const;
274   CXFA_Font* GetFontIfExists() const;
275   CXFA_Font* GetOrCreateFontIfPossible();
276 
277   float GetFontSize() const;
278   FX_ARGB GetTextColor() const;
279   float GetLineHeight() const;
280 
281   CXFA_Margin* GetMarginIfExists() const;
282   CXFA_Para* GetParaIfExists() const;
283   CXFA_Calculate* GetCalculateIfExists() const;
284   CXFA_Validate* GetValidateIfExists() const;
285   CXFA_Validate* GetOrCreateValidateIfPossible();
286 
287   CXFA_Value* GetFormValueIfExists() const;
288   WideString GetRawValue() const;
289 
290   int32_t GetRotate() const;
291   absl::optional<float> TryWidth();
292 
293   CXFA_Node* GetExclGroupIfExists();
294 
295   XFA_EventError ProcessEvent(CXFA_FFDocView* pDocView,
296                               XFA_AttributeValue iActivity,
297                               CXFA_EventParam* pEventParam);
298   XFA_EventError ProcessCalculate(CXFA_FFDocView* pDocView);
299   XFA_EventError ProcessValidate(CXFA_FFDocView* pDocView, int32_t iFlags);
300   XFA_EventError ExecuteScript(CXFA_FFDocView* pDocView,
301                                CXFA_Script* script,
302                                CXFA_EventParam* pEventParam);
303   std::pair<XFA_EventError, bool> ExecuteBoolScript(
304       CXFA_FFDocView* pDocView,
305       CXFA_Script* script,
306       CXFA_EventParam* pEventParam);
307 
308   CXFA_Node* GetUIChildNode();
309 
310   // NOTE: value returned is often determined by child UI node, and
311   // can't be used to infer anything about this particual node itself.
312   XFA_FFWidgetType GetFFWidgetType();
313 
314   CFX_RectF GetUIMargin();
315   CXFA_Border* GetUIBorder();
316 
SetPreNull(bool val)317   void SetPreNull(bool val) { m_bPreNull = val; }
IsNull()318   bool IsNull() const { return m_bIsNull; }
SetIsNull(bool val)319   void SetIsNull(bool val) { m_bIsNull = val; }
320 
SetWidgetReady()321   void SetWidgetReady() { is_widget_ready_ = true; }
IsWidgetReady()322   bool IsWidgetReady() const { return is_widget_ready_; }
323   std::vector<CXFA_Event*> GetEventByActivity(XFA_AttributeValue iActivity,
324                                               bool bIsFormReady);
325 
326   void ResetData();
327   void StartWidgetLayout(CXFA_FFDoc* doc,
328                          float* pCalcWidth,
329                          float* pCalcHeight);
330   absl::optional<float> FindSplitPos(CXFA_FFDocView* pDocView,
331                                      size_t szBlockIndex,
332                                      float fCalcHeight);
333 
334   bool LoadCaption(CXFA_FFDoc* doc);
335   CXFA_TextLayout* GetCaptionTextLayout();
336   CXFA_TextLayout* GetTextLayout();
337 
338   bool LoadLayoutImage(CXFA_FFDoc* doc);
339   bool LoadEditImage(CXFA_FFDoc* doc);
340   CFX_Size GetLayoutImageDpi() const;
341   CFX_Size GetEditImageDpi() const;
342   RetainPtr<CFX_DIBitmap> GetLayoutImage();
343   RetainPtr<CFX_DIBitmap> GetEditImage();
344   void SetLayoutImage(RetainPtr<CFX_DIBitmap> newImage);
345   void SetEditImage(RetainPtr<CFX_DIBitmap> newImage);
346 
347   RetainPtr<CFGAS_GEFont> GetFGASFont(CXFA_FFDoc* doc);
348 
349   bool IsListBox();
350   bool IsRadioButton();
351   bool IsMultiLine();
352 
353   bool HasButtonRollover() const;
354   bool HasButtonDown() const;
355 
356   float GetCheckButtonSize();
357 
358   XFA_CheckState GetCheckState();
359   void SetCheckState(XFA_CheckState eCheckState);
360 
361   CXFA_Node* GetSelectedMember();
362   CXFA_Node* SetSelectedMember(WideStringView wsName);
363   void SetSelectedMemberByValue(WideStringView wsValue,
364                                 bool bNotify,
365                                 bool bScriptModify,
366                                 bool bSyncData);
367 
368   CXFA_Node* GetExclGroupFirstMember();
369   CXFA_Node* GetExclGroupNextMember(CXFA_Node* pNode);
370 
371   bool IsChoiceListAllowTextEntry();
372   size_t CountChoiceListItems(bool bSaveValue);
373   absl::optional<WideString> GetChoiceListItem(int32_t nIndex, bool bSaveValue);
374   bool IsChoiceListMultiSelect();
375   bool IsChoiceListCommitOnSelect();
376   std::vector<WideString> GetChoiceListItems(bool bSaveValue);
377 
378   int32_t CountSelectedItems();
379   int32_t GetSelectedItem(int32_t nIndex);
380   std::vector<int32_t> GetSelectedItems();
381   std::vector<WideString> GetSelectedItemsValue();
382   void SetSelectedItems(const std::vector<int32_t>& iSelArray,
383                         bool bNotify,
384                         bool bScriptModify,
385                         bool bSyncData);
386   void InsertItem(const WideString& wsLabel,
387                   const WideString& wsValue,
388                   bool bNotify);
389   bool DeleteItem(int32_t nIndex, bool bNotify, bool bScriptModify);
390   void ClearAllSelections();
391 
392   bool GetItemState(int32_t nIndex);
393   void SetItemState(int32_t nIndex,
394                     bool bSelected,
395                     bool bNotify,
396                     bool bScriptModify);
397 
398   WideString GetItemValue(WideStringView wsLabel);
399 
400   bool IsHorizontalScrollPolicyOff();
401   bool IsVerticalScrollPolicyOff();
402   absl::optional<int32_t> GetNumberOfCells();
403 
404   bool SetValue(XFA_ValuePicture eValueType, const WideString& wsValue);
405   WideString GetValue(XFA_ValuePicture eValueType);
406   WideString GetPictureContent(XFA_ValuePicture ePicture);
407   WideString GetNormalizeDataValue(const WideString& wsValue);
408   WideString GetFormatDataValue(const WideString& wsValue);
409   WideString NormalizeNumStr(const WideString& wsValue);
410 
411   std::pair<XFA_Element, int32_t> GetMaxChars() const;
412   int32_t GetFracDigits() const;
413   int32_t GetLeadDigits() const;
414 
415   WideString NumericLimit(const WideString& wsValue);
416 
417   bool IsTransparent() const;
418   bool IsProperty() const;
419 
420  protected:
421   CXFA_Node(CXFA_Document* pDoc,
422             XFA_PacketType ePacket,
423             Mask<XFA_XDPPACKET> validPackets,
424             XFA_ObjectType oType,
425             XFA_Element eType,
426             pdfium::span<const PropertyData> properties,
427             pdfium::span<const AttributeData> attributes,
428             CJX_Object* js_object);
429 
430   virtual XFA_Element GetValueNodeType() const;
431   virtual XFA_FFWidgetType GetDefaultFFWidgetType() const;
432 
433  private:
434   void ProcessScriptTestValidate(CXFA_FFDocView* pDocView,
435                                  CXFA_Validate* validate,
436                                  bool bVersionFlag);
437   XFA_EventError ProcessFormatTestValidate(CXFA_FFDocView* pDocView,
438                                            CXFA_Validate* validate,
439                                            bool bVersionFlag);
440   XFA_EventError ProcessNullTestValidate(CXFA_FFDocView* pDocView,
441                                          CXFA_Validate* validate,
442                                          int32_t iFlags,
443                                          bool bVersionFlag);
444   WideString GetValidateCaptionName(bool bVersionFlag);
445   WideString GetValidateMessage(bool bError, bool bVersionFlag);
446 
447   bool HasFlag(XFA_NodeFlag dwFlag) const;
448   const PropertyData* GetPropertyData(XFA_Element property) const;
449   const AttributeData* GetAttributeData(XFA_Attribute attr) const;
450   absl::optional<XFA_Element> GetFirstPropertyWithFlag(
451       XFA_PropertyFlag flag) const;
452   void OnRemoved(bool bNotify) const;
453   absl::optional<void*> GetDefaultValue(XFA_Attribute attr,
454                                         XFA_AttributeType eType) const;
455   CXFA_Node* GetChildInternal(size_t index,
456                               XFA_Element eType,
457                               bool bOnlyChild) const;
458   CXFA_Node* GetFirstChildByClassInternal(XFA_Element eType) const;
459   CXFA_Node* GetNextSameNameSiblingInternal(WideStringView wsNodeName) const;
460   CXFA_Node* GetNextSameClassSiblingInternal(XFA_Element eType) const;
461   void CalcCaptionSize(CXFA_FFDoc* doc, CFX_SizeF* pszCap);
462   bool CalculateFieldAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
463   bool CalculateWidgetAutoSize(CFX_SizeF* pSize);
464   bool CalculateTextEditAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
465   bool CalculateCheckButtonAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
466   bool CalculatePushButtonAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
467   CFX_SizeF CalculateImageSize(float img_width,
468                                float img_height,
469                                const CFX_Size& dpi);
470   bool CalculateImageEditAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
471   bool CalculateImageAutoSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
472   float CalculateWidgetAutoHeight(float fHeightCalc);
473   float CalculateWidgetAutoWidth(float fWidthCalc);
474   float GetWidthWithoutMargin(float fWidthCalc) const;
475   float GetHeightWithoutMargin(float fHeightCalc) const;
476   void CalculateTextContentSize(CXFA_FFDoc* doc, CFX_SizeF* pSize);
477   CFX_SizeF CalculateAccWidthAndHeight(CXFA_FFDoc* doc, float fWidth);
478   void InitLayoutData(CXFA_FFDoc* doc);
479   void StartTextLayout(CXFA_FFDoc* doc, float* pCalcWidth, float* pCalcHeight);
480 
481   void InsertListTextItem(CXFA_Node* pItems,
482                           const WideString& wsText,
483                           int32_t nIndex);
484   WideString GetItemLabel(WideStringView wsValue) const;
485 
486   std::pair<XFA_FFWidgetType, CXFA_Ui*> CreateChildUIAndValueNodesIfNeeded();
487   void CreateValueNodeIfNeeded(CXFA_Value* value, CXFA_Node* pUIChild);
488   CXFA_Node* CreateUINodeIfNeeded(CXFA_Ui* ui, XFA_Element type);
489   bool IsValidInPacket(XFA_PacketType packet) const;
490   void SetImageEdit(const WideString& wsContentType,
491                     const WideString& wsHref,
492                     const WideString& wsData);
GetBindingNode()493   CXFA_Node* GetBindingNode() const {
494     if (binding_nodes_.empty())
495       return nullptr;
496     return binding_nodes_[0];
497   }
BindsFormItems()498   bool BindsFormItems() const { return HasFlag(XFA_NodeFlag::kBindFormItems); }
NeedsInitApp()499   bool NeedsInitApp() const { return HasFlag(XFA_NodeFlag::kNeedsInitApp); }
500   void SyncValue(const WideString& wsValue, bool bNotify);
501   CXFA_Value* GetDefaultValueIfExists();
502   CXFA_Bind* GetBindIfExists() const;
503   absl::optional<XFA_AttributeValue> GetIntactFromKeep(
504       const CXFA_Keep* pKeep,
505       XFA_AttributeValue eLayoutType) const;
506   CXFA_Node* GetTransparentParent();
507 
508   absl::optional<float> TryHeight();
509   absl::optional<float> TryMinWidth();
510   absl::optional<float> TryMinHeight();
511   absl::optional<float> TryMaxWidth();
512   absl::optional<float> TryMaxHeight();
513   XFA_EventError ProcessEventInternal(CXFA_FFDocView* pDocView,
514                                       XFA_AttributeValue iActivity,
515                                       CXFA_Event* event,
516                                       CXFA_EventParam* pEventParam);
517 
518   CFX_XMLDocument* GetXMLDocument() const;
519 
520   XFA_FFWidgetType ff_widget_type_ = XFA_FFWidgetType::kNone;
521   bool m_bIsNull = true;
522   bool m_bPreNull = true;
523   bool is_widget_ready_ = false;
524   const pdfium::span<const PropertyData> m_Properties;
525   const pdfium::span<const AttributeData> m_Attributes;
526   const Mask<XFA_XDPPACKET> m_ValidPackets;
527   UnownedPtr<CFX_XMLNode> xml_node_;
528   const XFA_PacketType m_ePacket;
529   uint8_t m_ExecuteRecursionDepth = 0;
530   Mask<XFA_NodeFlag> m_uNodeFlags = XFA_NodeFlag::kNone;
531   uint32_t m_dwNameHash = 0;
532   cppgc::Member<CXFA_Node> m_pAuxNode;
533   std::vector<cppgc::Member<CXFA_Node>> binding_nodes_;
534   cppgc::Member<CXFA_WidgetLayoutData> m_pLayoutData;
535   cppgc::Member<CXFA_Ui> ui_;
536 };
537 
538 #endif  // XFA_FXFA_PARSER_CXFA_NODE_H_
539