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