xref: /aosp_15_r20/external/pdfium/xfa/fxfa/parser/cxfa_document.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2014 The PDFium Authors
2*3ac0a46fSAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*3ac0a46fSAndroid Build Coastguard Worker // found in the LICENSE file.
4*3ac0a46fSAndroid Build Coastguard Worker 
5*3ac0a46fSAndroid Build Coastguard Worker // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6*3ac0a46fSAndroid Build Coastguard Worker 
7*3ac0a46fSAndroid Build Coastguard Worker #ifndef XFA_FXFA_PARSER_CXFA_DOCUMENT_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define XFA_FXFA_PARSER_CXFA_DOCUMENT_H_
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include <stddef.h>
11*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker #include <map>
14*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
15*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
16*3ac0a46fSAndroid Build Coastguard Worker 
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/widestring.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/gc/heap.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/abseil-cpp/absl/types/optional.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/span.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/garbage-collected.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/member.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/persistent.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/visitor.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/fxfa.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/fxfa_basic.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_localemgr.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_nodeowner.h"
30*3ac0a46fSAndroid Build Coastguard Worker 
31*3ac0a46fSAndroid Build Coastguard Worker class CFXJSE_Engine;
32*3ac0a46fSAndroid Build Coastguard Worker class CJS_Runtime;
33*3ac0a46fSAndroid Build Coastguard Worker class CScript_DataWindow;
34*3ac0a46fSAndroid Build Coastguard Worker class CScript_EventPseudoModel;
35*3ac0a46fSAndroid Build Coastguard Worker class CScript_HostPseudoModel;
36*3ac0a46fSAndroid Build Coastguard Worker class CScript_LayoutPseudoModel;
37*3ac0a46fSAndroid Build Coastguard Worker class CScript_LogPseudoModel;
38*3ac0a46fSAndroid Build Coastguard Worker class CScript_SignaturePseudoModel;
39*3ac0a46fSAndroid Build Coastguard Worker class CXFA_FFNotify;
40*3ac0a46fSAndroid Build Coastguard Worker class CXFA_Node;
41*3ac0a46fSAndroid Build Coastguard Worker class CXFA_Object;
42*3ac0a46fSAndroid Build Coastguard Worker 
43*3ac0a46fSAndroid Build Coastguard Worker namespace cppgc {
44*3ac0a46fSAndroid Build Coastguard Worker class Heap;
45*3ac0a46fSAndroid Build Coastguard Worker }  // namespace cppgc
46*3ac0a46fSAndroid Build Coastguard Worker 
47*3ac0a46fSAndroid Build Coastguard Worker enum XFA_VERSION {
48*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_UNKNOWN = 0,
49*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_200 = 200,
50*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_202 = 202,
51*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_204 = 204,
52*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_205 = 205,
53*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_206 = 206,
54*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_207 = 207,
55*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_208 = 208,
56*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_300 = 300,
57*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_301 = 301,
58*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_303 = 303,
59*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_306 = 306,
60*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_DEFAULT = XFA_VERSION_303,
61*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_MIN = 200,
62*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION_MAX = 400,
63*3ac0a46fSAndroid Build Coastguard Worker };
64*3ac0a46fSAndroid Build Coastguard Worker 
65*3ac0a46fSAndroid Build Coastguard Worker class CXFA_Document final : public cppgc::GarbageCollected<CXFA_Document> {
66*3ac0a46fSAndroid Build Coastguard Worker  public:
67*3ac0a46fSAndroid Build Coastguard Worker   class LayoutProcessorIface
68*3ac0a46fSAndroid Build Coastguard Worker       : public cppgc::GarbageCollected<LayoutProcessorIface> {
69*3ac0a46fSAndroid Build Coastguard Worker    public:
70*3ac0a46fSAndroid Build Coastguard Worker     LayoutProcessorIface();
71*3ac0a46fSAndroid Build Coastguard Worker     virtual ~LayoutProcessorIface();
72*3ac0a46fSAndroid Build Coastguard Worker 
73*3ac0a46fSAndroid Build Coastguard Worker     virtual void Trace(cppgc::Visitor* visitor) const;
74*3ac0a46fSAndroid Build Coastguard Worker     virtual void SetForceRelayout() = 0;
75*3ac0a46fSAndroid Build Coastguard Worker     virtual void SetHasChangedContainer() = 0;
76*3ac0a46fSAndroid Build Coastguard Worker 
SetDocument(CXFA_Document * pDocument)77*3ac0a46fSAndroid Build Coastguard Worker     void SetDocument(CXFA_Document* pDocument) { m_pDocument = pDocument; }
GetDocument()78*3ac0a46fSAndroid Build Coastguard Worker     CXFA_Document* GetDocument() const { return m_pDocument; }
79*3ac0a46fSAndroid Build Coastguard Worker 
80*3ac0a46fSAndroid Build Coastguard Worker    private:
81*3ac0a46fSAndroid Build Coastguard Worker     cppgc::Member<CXFA_Document> m_pDocument;
82*3ac0a46fSAndroid Build Coastguard Worker   };
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
85*3ac0a46fSAndroid Build Coastguard Worker   ~CXFA_Document();
86*3ac0a46fSAndroid Build Coastguard Worker 
87*3ac0a46fSAndroid Build Coastguard Worker   void Trace(cppgc::Visitor* visitor) const;
88*3ac0a46fSAndroid Build Coastguard Worker 
HasScriptContext()89*3ac0a46fSAndroid Build Coastguard Worker   bool HasScriptContext() const { return !!m_pScriptContext; }
90*3ac0a46fSAndroid Build Coastguard Worker   CFXJSE_Engine* InitScriptContext(CJS_Runtime* fxjs_runtime);
91*3ac0a46fSAndroid Build Coastguard Worker 
92*3ac0a46fSAndroid Build Coastguard Worker   // Only safe to call in situations where the context is known to exist,
93*3ac0a46fSAndroid Build Coastguard Worker   // and always returns non-NULL in those situations. In other words, we have
94*3ac0a46fSAndroid Build Coastguard Worker   // to call InitScriptContext() first to avoid a situation where the context
95*3ac0a46fSAndroid Build Coastguard Worker   // won't have an isolate set into it.
96*3ac0a46fSAndroid Build Coastguard Worker   CFXJSE_Engine* GetScriptContext() const;
97*3ac0a46fSAndroid Build Coastguard Worker 
GetNotify()98*3ac0a46fSAndroid Build Coastguard Worker   CXFA_FFNotify* GetNotify() const { return notify_; }
GetNodeOwner()99*3ac0a46fSAndroid Build Coastguard Worker   CXFA_NodeOwner* GetNodeOwner() { return node_owner_; }
100*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Heap* GetHeap() const;
101*3ac0a46fSAndroid Build Coastguard Worker   CXFA_LocaleMgr* GetLocaleMgr();
102*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Object* GetXFAObject(XFA_HashCode wsNodeNameHash);
103*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* GetNodeByID(CXFA_Node* pRoot, WideStringView wsID) const;
104*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* GetNotBindNode(
105*3ac0a46fSAndroid Build Coastguard Worker       pdfium::span<cppgc::Member<CXFA_Object>> arrayNodes) const;
106*3ac0a46fSAndroid Build Coastguard Worker 
GetLayoutProcessor()107*3ac0a46fSAndroid Build Coastguard Worker   LayoutProcessorIface* GetLayoutProcessor() const {
108*3ac0a46fSAndroid Build Coastguard Worker     return m_pLayoutProcessor;
109*3ac0a46fSAndroid Build Coastguard Worker   }
GetRoot()110*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* GetRoot() const { return m_pRootNode; }
SetRoot(CXFA_Node * pNewRoot)111*3ac0a46fSAndroid Build Coastguard Worker   void SetRoot(CXFA_Node* pNewRoot) { m_pRootNode = pNewRoot; }
112*3ac0a46fSAndroid Build Coastguard Worker 
is_strict_scoping()113*3ac0a46fSAndroid Build Coastguard Worker   bool is_strict_scoping() const { return m_bStrictScoping; }
set_is_strict_scoping()114*3ac0a46fSAndroid Build Coastguard Worker   void set_is_strict_scoping() { m_bStrictScoping = true; }
115*3ac0a46fSAndroid Build Coastguard Worker 
is_scripting()116*3ac0a46fSAndroid Build Coastguard Worker   bool is_scripting() const { return m_bScripting; }
set_is_scripting()117*3ac0a46fSAndroid Build Coastguard Worker   void set_is_scripting() { m_bScripting = true; }
118*3ac0a46fSAndroid Build Coastguard Worker 
119*3ac0a46fSAndroid Build Coastguard Worker   bool IsInteractive();
GetCurVersionMode()120*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION GetCurVersionMode() const { return m_eCurVersionMode; }
121*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION RecognizeXFAVersionNumber(const WideString& wsTemplateNS);
122*3ac0a46fSAndroid Build Coastguard Worker   FormType GetFormType() const;
123*3ac0a46fSAndroid Build Coastguard Worker 
124*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* CreateNode(XFA_PacketType packet, XFA_Element eElement);
125*3ac0a46fSAndroid Build Coastguard Worker 
126*3ac0a46fSAndroid Build Coastguard Worker   void DoProtoMerge();
127*3ac0a46fSAndroid Build Coastguard Worker   void DoDataMerge();
128*3ac0a46fSAndroid Build Coastguard Worker   void DoDataRemerge();
129*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode,
130*3ac0a46fSAndroid Build Coastguard Worker                                      CXFA_Node* pFormNode,
131*3ac0a46fSAndroid Build Coastguard Worker                                      CXFA_Node* pDataScope,
132*3ac0a46fSAndroid Build Coastguard Worker                                      bool bOneInstance,
133*3ac0a46fSAndroid Build Coastguard Worker                                      bool bDataMerge,
134*3ac0a46fSAndroid Build Coastguard Worker                                      bool bUpLevel);
135*3ac0a46fSAndroid Build Coastguard Worker   void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot);
136*3ac0a46fSAndroid Build Coastguard Worker 
137*3ac0a46fSAndroid Build Coastguard Worker   void ClearLayoutData();
138*3ac0a46fSAndroid Build Coastguard Worker 
139*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* GetGlobalBinding(uint32_t dwNameHash);
140*3ac0a46fSAndroid Build Coastguard Worker   void RegisterGlobalBinding(uint32_t dwNameHash, CXFA_Node* pDataNode);
141*3ac0a46fSAndroid Build Coastguard Worker 
142*3ac0a46fSAndroid Build Coastguard Worker   size_t GetPendingNodesCount() const;
143*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* GetPendingNodeAtIndex(size_t index) const;
144*3ac0a46fSAndroid Build Coastguard Worker   void AppendPendingNode(CXFA_Node* node);
145*3ac0a46fSAndroid Build Coastguard Worker   void ClearPendingNodes();
146*3ac0a46fSAndroid Build Coastguard Worker   void SetPendingNodesUnusedAndUnbound();
147*3ac0a46fSAndroid Build Coastguard Worker 
148*3ac0a46fSAndroid Build Coastguard Worker  private:
149*3ac0a46fSAndroid Build Coastguard Worker   friend class CXFA_DocumentTest_ParseXFAVersion_Test;
150*3ac0a46fSAndroid Build Coastguard Worker   friend class CXFA_DocumentTest_ParseUseHref_Test;
151*3ac0a46fSAndroid Build Coastguard Worker   friend class CXFA_DocumentTest_ParseUse_Test;
152*3ac0a46fSAndroid Build Coastguard Worker 
153*3ac0a46fSAndroid Build Coastguard Worker   static XFA_VERSION ParseXFAVersion(const WideString& wsTemplateNS);
154*3ac0a46fSAndroid Build Coastguard Worker   static void ParseUseHref(const WideString& wsUseVal,
155*3ac0a46fSAndroid Build Coastguard Worker                            WideStringView& wsURI,
156*3ac0a46fSAndroid Build Coastguard Worker                            WideStringView& wsID,
157*3ac0a46fSAndroid Build Coastguard Worker                            WideStringView& wsSOM);
158*3ac0a46fSAndroid Build Coastguard Worker   static void ParseUse(const WideString& wsUseVal,
159*3ac0a46fSAndroid Build Coastguard Worker                        WideStringView& wsID,
160*3ac0a46fSAndroid Build Coastguard Worker                        WideStringView& wsSOM);
161*3ac0a46fSAndroid Build Coastguard Worker 
162*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Document(CXFA_FFNotify* notify,
163*3ac0a46fSAndroid Build Coastguard Worker                 cppgc::Heap* heap,
164*3ac0a46fSAndroid Build Coastguard Worker                 LayoutProcessorIface* pLayout);
165*3ac0a46fSAndroid Build Coastguard Worker 
166*3ac0a46fSAndroid Build Coastguard Worker   UnownedPtr<cppgc::Heap> heap_;
167*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CXFA_FFNotify> const notify_;
168*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CXFA_NodeOwner> const node_owner_;
169*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CXFA_Node> m_pRootNode;
170*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<CFXJSE_Engine> m_pScriptContext;
171*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<LayoutProcessorIface> m_pLayoutProcessor;
172*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CXFA_LocaleMgr> m_pLocaleMgr;
173*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CScript_DataWindow> m_pScriptDataWindow;
174*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CScript_EventPseudoModel> m_pScriptEvent;
175*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CScript_HostPseudoModel> m_pScriptHost;
176*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CScript_LogPseudoModel> m_pScriptLog;
177*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CScript_LayoutPseudoModel> m_pScriptLayout;
178*3ac0a46fSAndroid Build Coastguard Worker   cppgc::Member<CScript_SignaturePseudoModel> m_pScriptSignature;
179*3ac0a46fSAndroid Build Coastguard Worker   std::map<uint32_t, cppgc::Member<CXFA_Node>> m_rgGlobalBinding;
180*3ac0a46fSAndroid Build Coastguard Worker   std::vector<cppgc::Member<CXFA_Node>> m_pPendingPageSet;
181*3ac0a46fSAndroid Build Coastguard Worker   XFA_VERSION m_eCurVersionMode = XFA_VERSION_DEFAULT;
182*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<bool> m_Interactive;
183*3ac0a46fSAndroid Build Coastguard Worker   bool m_bStrictScoping = false;
184*3ac0a46fSAndroid Build Coastguard Worker   bool m_bScripting = false;
185*3ac0a46fSAndroid Build Coastguard Worker };
186*3ac0a46fSAndroid Build Coastguard Worker 
187*3ac0a46fSAndroid Build Coastguard Worker #endif  // XFA_FXFA_PARSER_CXFA_DOCUMENT_H_
188