| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 1 | // Copyright 2014 PDFium Authors. All rights reserved. |
| 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 | |
| dsinclair | 1628024 | 2016-07-21 12:03:47 -0700 | [diff] [blame] | 7 | #ifndef XFA_FXFA_PARSER_CXFA_DOCUMENT_H_ |
| 8 | #define XFA_FXFA_PARSER_CXFA_DOCUMENT_H_ |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 9 | |
| tsepez | 6bb3b89 | 2017-01-05 12:18:41 -0800 | [diff] [blame] | 10 | #include <map> |
| Tom Sepez | 742fa8c | 2017-03-21 17:08:48 -0700 | [diff] [blame] | 11 | #include <memory> |
| Tom Sepez | f8a9439 | 2017-03-14 12:13:22 -0700 | [diff] [blame] | 12 | #include <vector> |
| tsepez | 6bb3b89 | 2017-01-05 12:18:41 -0800 | [diff] [blame] | 13 | |
| Tom Sepez | 1a3e186 | 2018-08-21 22:56:37 +0000 | [diff] [blame] | 14 | #include "core/fxcrt/unowned_ptr.h" |
| dsinclair | 5b49309 | 2016-09-29 20:20:24 -0700 | [diff] [blame] | 15 | #include "xfa/fxfa/fxfa.h" |
| Dan Sinclair | ec1843d | 2017-03-28 16:04:41 -0400 | [diff] [blame] | 16 | #include "xfa/fxfa/parser/cxfa_localemgr.h" |
| Dan Sinclair | 80bf582 | 2018-02-13 20:55:03 +0000 | [diff] [blame] | 17 | #include "xfa/fxfa/parser/cxfa_nodeowner.h" |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 18 | |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 19 | enum XFA_VERSION { |
| 20 | XFA_VERSION_UNKNOWN = 0, |
| 21 | XFA_VERSION_200 = 200, |
| 22 | XFA_VERSION_202 = 202, |
| 23 | XFA_VERSION_204 = 204, |
| 24 | XFA_VERSION_205 = 205, |
| 25 | XFA_VERSION_206 = 206, |
| 26 | XFA_VERSION_207 = 207, |
| 27 | XFA_VERSION_208 = 208, |
| 28 | XFA_VERSION_300 = 300, |
| 29 | XFA_VERSION_301 = 301, |
| 30 | XFA_VERSION_303 = 303, |
| 31 | XFA_VERSION_306 = 306, |
| 32 | XFA_VERSION_DEFAULT = XFA_VERSION_303, |
| 33 | XFA_VERSION_MIN = 200, |
| 34 | XFA_VERSION_MAX = 400, |
| 35 | }; |
| 36 | |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 37 | enum XFA_DocFlag { |
| 38 | XFA_DOCFLAG_StrictScoping = 0x0001, |
| 39 | XFA_DOCFLAG_HasInteractive = 0x0002, |
| 40 | XFA_DOCFLAG_Interactive = 0x0004, |
| 41 | XFA_DOCFLAG_Scripting = 0x0008 |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 42 | }; |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 43 | |
| Dan Sinclair | 472bb7f | 2017-11-06 18:17:41 +0000 | [diff] [blame] | 44 | class CFXJSE_Engine; |
| Dan Sinclair | e9f7db9 | 2018-06-05 18:24:12 +0000 | [diff] [blame] | 45 | class CJS_Runtime; |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 46 | class CScript_DataWindow; |
| 47 | class CScript_EventPseudoModel; |
| 48 | class CScript_HostPseudoModel; |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 49 | class CScript_LayoutPseudoModel; |
| Tom Sepez | fb25606 | 2018-02-01 19:23:03 +0000 | [diff] [blame] | 50 | class CScript_LogPseudoModel; |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 51 | class CScript_SignaturePseudoModel; |
| Dan Sinclair | 472bb7f | 2017-11-06 18:17:41 +0000 | [diff] [blame] | 52 | class CXFA_FFNotify; |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 53 | class CXFA_Node; |
| Dan Sinclair | 472bb7f | 2017-11-06 18:17:41 +0000 | [diff] [blame] | 54 | class CXFA_Object; |
| weili | 47bcd4c | 2016-06-16 08:00:06 -0700 | [diff] [blame] | 55 | |
| Tom Sepez | 5586545 | 2018-08-27 20:18:04 +0000 | [diff] [blame] | 56 | class CXFA_Document final : public CXFA_NodeOwner { |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 57 | public: |
| Tom Sepez | 9010e56 | 2019-06-11 16:59:51 +0000 | [diff] [blame] | 58 | class LayoutProcessorIface { |
| 59 | public: |
| 60 | LayoutProcessorIface(); |
| 61 | virtual ~LayoutProcessorIface(); |
| 62 | virtual void SetForceRelayout(bool enable) = 0; |
| 63 | |
| 64 | void SetDocument(CXFA_Document* pDocument) { m_pDocument = pDocument; } |
| 65 | CXFA_Document* GetDocument() const { return m_pDocument.Get(); } |
| 66 | |
| 67 | private: |
| 68 | UnownedPtr<CXFA_Document> m_pDocument; |
| 69 | }; |
| 70 | |
| 71 | CXFA_Document(CXFA_FFNotify* notify, |
| 72 | std::unique_ptr<LayoutProcessorIface> pLayout); |
| Dan Sinclair | 80bf582 | 2018-02-13 20:55:03 +0000 | [diff] [blame] | 73 | ~CXFA_Document() override; |
| Dan Sinclair | 8853b7f | 2018-02-13 19:00:27 +0000 | [diff] [blame] | 74 | |
| Tom Sepez | 7e4877f | 2019-04-05 21:32:36 +0000 | [diff] [blame] | 75 | bool HasScriptContext() const { return !!m_pScriptContext; } |
| Dan Sinclair | e9f7db9 | 2018-06-05 18:24:12 +0000 | [diff] [blame] | 76 | CFXJSE_Engine* InitScriptContext(CJS_Runtime* fxjs_runtime); |
| Tom Sepez | 7e4877f | 2019-04-05 21:32:36 +0000 | [diff] [blame] | 77 | |
| 78 | // Only safe to call in situations where the context is known to exist, |
| 79 | // and always returns non-NULL in those situations. In other words, we have |
| 80 | // to call InitScriptContext() first to avoid a situation where the context |
| 81 | // won't have an isolate set into it. |
| Tom Sepez | ad7d586 | 2019-02-06 23:02:03 +0000 | [diff] [blame] | 82 | CFXJSE_Engine* GetScriptContext() const; |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 83 | |
| Dan Sinclair | 9c112f9 | 2018-02-13 21:27:44 +0000 | [diff] [blame] | 84 | CXFA_FFNotify* GetNotify() const { return notify_.Get(); } |
| Lei Zhang | 5822da7 | 2018-07-30 17:46:18 +0000 | [diff] [blame] | 85 | CXFA_LocaleMgr* GetLocaleMgr(); |
| dsinclair | cbfef57 | 2016-05-18 13:16:12 -0700 | [diff] [blame] | 86 | CXFA_Object* GetXFAObject(XFA_HashCode wsNodeNameHash); |
| Tom Sepez | 1ab2757 | 2018-12-14 20:31:31 +0000 | [diff] [blame] | 87 | CXFA_Node* GetNodeByID(CXFA_Node* pRoot, WideStringView wsID) const; |
| Tom Sepez | 1a3e186 | 2018-08-21 22:56:37 +0000 | [diff] [blame] | 88 | CXFA_Node* GetNotBindNode( |
| 89 | const std::vector<UnownedPtr<CXFA_Object>>& arrayNodes) const; |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 90 | |
| Tom Sepez | 9010e56 | 2019-06-11 16:59:51 +0000 | [diff] [blame] | 91 | LayoutProcessorIface* GetLayoutProcessor() const { |
| 92 | return m_pLayoutProcessor.get(); |
| 93 | } |
| Tom Sepez | ad7d586 | 2019-02-06 23:02:03 +0000 | [diff] [blame] | 94 | |
| 95 | CXFA_Node* GetRoot() const { return m_pRootNode; } |
| Dan Sinclair | 80bf582 | 2018-02-13 20:55:03 +0000 | [diff] [blame] | 96 | void SetRoot(CXFA_Node* pNewRoot) { m_pRootNode = pNewRoot; } |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 97 | |
| Dan Sinclair | d8d6f55 | 2018-02-14 15:44:21 +0000 | [diff] [blame] | 98 | bool HasFlag(uint32_t dwFlag) const { |
| 99 | return (m_dwDocFlags & dwFlag) == dwFlag; |
| 100 | } |
| tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 101 | void SetFlag(uint32_t dwFlag, bool bOn); |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 102 | |
| tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 103 | bool IsInteractive(); |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 104 | XFA_VERSION GetCurVersionMode() { return m_eCurVersionMode; } |
| Ryan Harrison | 275e260 | 2017-09-18 14:23:18 -0400 | [diff] [blame] | 105 | XFA_VERSION RecognizeXFAVersionNumber(const WideString& wsTemplateNS); |
| Henrique Nakashima | 36b2059 | 2018-07-24 20:25:45 +0000 | [diff] [blame] | 106 | FormType GetFormType() const; |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 107 | |
| Dan Sinclair | c40c5aa | 2017-11-30 21:29:11 +0000 | [diff] [blame] | 108 | CXFA_Node* CreateNode(XFA_PacketType packet, XFA_Element eElement); |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 109 | |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 110 | void DoProtoMerge(); |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 111 | void DoDataMerge(); |
| tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 112 | void DoDataRemerge(bool bDoDataMerge); |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 113 | CXFA_Node* DataMerge_CopyContainer(CXFA_Node* pTemplateNode, |
| 114 | CXFA_Node* pFormNode, |
| 115 | CXFA_Node* pDataScope, |
| tsepez | d19e912 | 2016-11-02 15:43:18 -0700 | [diff] [blame] | 116 | bool bOneInstance, |
| 117 | bool bDataMerge, |
| 118 | bool bUpLevel); |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 119 | void DataMerge_UpdateBindingRelations(CXFA_Node* pFormUpdateRoot); |
| dsinclair | eea31b7 | 2016-07-19 10:27:12 -0700 | [diff] [blame] | 120 | |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 121 | void ClearLayoutData(); |
| 122 | |
| Dan Sinclair | 5a55253 | 2018-04-05 19:05:11 +0000 | [diff] [blame] | 123 | CXFA_Node* GetGlobalBinding(uint32_t dwNameHash); |
| 124 | void RegisterGlobalBinding(uint32_t dwNameHash, CXFA_Node* pDataNode); |
| Tom Sepez | e7731b3 | 2019-06-14 23:46:44 +0000 | [diff] [blame] | 125 | void SetPendingNodesUnusedAndUnbound(); |
| Dan Sinclair | 5a55253 | 2018-04-05 19:05:11 +0000 | [diff] [blame] | 126 | |
| Tom Sepez | f8a9439 | 2017-03-14 12:13:22 -0700 | [diff] [blame] | 127 | std::vector<CXFA_Node*> m_pPendingPageSet; |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 128 | |
| Dan Sinclair | 25d2ad4 | 2017-03-23 15:19:44 -0400 | [diff] [blame] | 129 | private: |
| Tom Sepez | 69873e9 | 2019-02-04 19:42:39 +0000 | [diff] [blame] | 130 | UnownedPtr<CXFA_FFNotify> const notify_; |
| Tom Sepez | 9010e56 | 2019-06-11 16:59:51 +0000 | [diff] [blame] | 131 | CXFA_Node* m_pRootNode = nullptr; |
| Dan Sinclair | 5a55253 | 2018-04-05 19:05:11 +0000 | [diff] [blame] | 132 | std::map<uint32_t, CXFA_Node*> m_rgGlobalBinding; |
| Dan Sinclair | 3fff90a | 2017-11-01 13:12:39 +0000 | [diff] [blame] | 133 | std::unique_ptr<CFXJSE_Engine> m_pScriptContext; |
| Tom Sepez | 9010e56 | 2019-06-11 16:59:51 +0000 | [diff] [blame] | 134 | std::unique_ptr<LayoutProcessorIface> m_pLayoutProcessor; |
| Lei Zhang | 5822da7 | 2018-07-30 17:46:18 +0000 | [diff] [blame] | 135 | std::unique_ptr<CXFA_LocaleMgr> m_pLocaleMgr; |
| Tom Sepez | 742fa8c | 2017-03-21 17:08:48 -0700 | [diff] [blame] | 136 | std::unique_ptr<CScript_DataWindow> m_pScriptDataWindow; |
| 137 | std::unique_ptr<CScript_EventPseudoModel> m_pScriptEvent; |
| 138 | std::unique_ptr<CScript_HostPseudoModel> m_pScriptHost; |
| 139 | std::unique_ptr<CScript_LogPseudoModel> m_pScriptLog; |
| 140 | std::unique_ptr<CScript_LayoutPseudoModel> m_pScriptLayout; |
| 141 | std::unique_ptr<CScript_SignaturePseudoModel> m_pScriptSignature; |
| Tom Sepez | 9010e56 | 2019-06-11 16:59:51 +0000 | [diff] [blame] | 142 | XFA_VERSION m_eCurVersionMode = XFA_VERSION_DEFAULT; |
| 143 | uint32_t m_dwDocFlags = 0; |
| Dan Sinclair | 1770c02 | 2016-03-14 14:14:16 -0400 | [diff] [blame] | 144 | }; |
| 145 | |
| dsinclair | 1628024 | 2016-07-21 12:03:47 -0700 | [diff] [blame] | 146 | #endif // XFA_FXFA_PARSER_CXFA_DOCUMENT_H_ |