xref: /aosp_15_r20/external/pdfium/xfa/fxfa/cxfa_ffdoc.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1 // Copyright 2014 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_CXFA_FFDOC_H_
8 #define XFA_FXFA_CXFA_FFDOC_H_
9 
10 #include <map>
11 #include <memory>
12 
13 #include "core/fxcrt/fx_coordinates.h"
14 #include "core/fxcrt/fx_stream.h"
15 #include "core/fxcrt/mask.h"
16 #include "core/fxcrt/retain_ptr.h"
17 #include "core/fxcrt/unowned_ptr.h"
18 #include "core/fxge/dib/fx_dib.h"
19 #include "fxjs/gc/heap.h"
20 #include "v8/include/cppgc/garbage-collected.h"
21 #include "v8/include/cppgc/member.h"
22 #include "v8/include/cppgc/prefinalizer.h"
23 #include "v8/include/cppgc/visitor.h"
24 #include "xfa/fxfa/fxfa.h"
25 #include "xfa/fxfa/parser/cxfa_document.h"
26 
27 class CFGAS_GEFont;
28 class CFGAS_PDFFontMgr;
29 class CFX_DIBBase;
30 class CFX_DIBitmap;
31 class CFX_XMLDocument;
32 class CPDF_Document;
33 class CXFA_FFApp;
34 class CXFA_FFDoc;
35 class CXFA_FFDocView;
36 class CXFA_FFNotify;
37 class CXFA_FFPageView;
38 class CXFA_FFWidget;
39 class CXFA_LayoutProcessor;
40 class IJS_Runtime;
41 
42 struct FX_IMAGEDIB_AND_DPI {
43   FX_IMAGEDIB_AND_DPI();
44   FX_IMAGEDIB_AND_DPI(const FX_IMAGEDIB_AND_DPI& that);
45   FX_IMAGEDIB_AND_DPI(const RetainPtr<CFX_DIBBase>& pDib,
46                       int32_t xDpi,
47                       int32_t yDpi);
48   ~FX_IMAGEDIB_AND_DPI();
49 
50   RetainPtr<CFX_DIBBase> pDibSource;
51   int32_t iImageXDpi;
52   int32_t iImageYDpi;
53 };
54 
55 class CXFA_FFDoc : public cppgc::GarbageCollected<CXFA_FFDoc> {
56   CPPGC_USING_PRE_FINALIZER(CXFA_FFDoc, PreFinalize);
57 
58  public:
59   enum class PageViewEvent {
60     kPostAdded = 1,
61     kPostRemoved = 3,
62     kStopLayout = 4,
63   };
64 
65   class CallbackIface {
66    public:
67     virtual ~CallbackIface() = default;
68 
69     virtual void SetChangeMark(CXFA_FFDoc* hDoc) = 0;
70     virtual void InvalidateRect(CXFA_FFPageView* pPageView,
71                                 const CFX_RectF& rt) = 0;
72     // Show or hide caret.
73     virtual void DisplayCaret(CXFA_FFWidget* hWidget,
74                               bool bVisible,
75                               const CFX_RectF* pRtAnchor) = 0;
76 
77     virtual bool GetPopupPos(CXFA_FFWidget* hWidget,
78                              float fMinPopup,
79                              float fMaxPopup,
80                              const CFX_RectF& rtAnchor,
81                              CFX_RectF* pPopupRect) = 0;
82     virtual bool PopupMenu(CXFA_FFWidget* hWidget,
83                            const CFX_PointF& ptPopup) = 0;
84 
85     virtual void OnPageViewEvent(CXFA_FFPageView* pPageView,
86                                  PageViewEvent eEvent) = 0;
87 
88     // Caller must not pass in nullptr.
89     virtual void WidgetPostAdd(CXFA_FFWidget* hWidget) = 0;
90     virtual void WidgetPreRemove(CXFA_FFWidget* hWidget) = 0;
91 
92     virtual int32_t CountPages(const CXFA_FFDoc* hDoc) const = 0;
93     virtual int32_t GetCurrentPage(const CXFA_FFDoc* hDoc) const = 0;
94     virtual void SetCurrentPage(CXFA_FFDoc* hDoc, int32_t iCurPage) = 0;
95     virtual bool IsCalculationsEnabled(const CXFA_FFDoc* hDoc) const = 0;
96     virtual void SetCalculationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0;
97     virtual WideString GetTitle(const CXFA_FFDoc* hDoc) const = 0;
98     virtual void SetTitle(CXFA_FFDoc* hDoc, const WideString& wsTitle) = 0;
99     virtual void ExportData(CXFA_FFDoc* hDoc,
100                             const WideString& wsFilePath,
101                             bool bXDP) = 0;
102     virtual void GotoURL(CXFA_FFDoc* hDoc, const WideString& bsURL) = 0;
103     virtual bool IsValidationsEnabled(const CXFA_FFDoc* hDoc) const = 0;
104     virtual void SetValidationsEnabled(CXFA_FFDoc* hDoc, bool bEnabled) = 0;
105     virtual void SetFocusWidget(CXFA_FFDoc* hDoc, CXFA_FFWidget* hWidget) = 0;
106     virtual void Print(CXFA_FFDoc* hDoc,
107                        int32_t nStartPage,
108                        int32_t nEndPage,
109                        Mask<XFA_PrintOpt> dwOptions) = 0;
110     virtual FX_ARGB GetHighlightColor(const CXFA_FFDoc* hDoc) const = 0;
111     virtual IJS_Runtime* GetIJSRuntime(const CXFA_FFDoc* hDoc) const = 0;
112     virtual CFX_XMLDocument* GetXMLDoc() const = 0;
113     virtual RetainPtr<IFX_SeekableReadStream> OpenLinkedFile(
114         CXFA_FFDoc* hDoc,
115         const WideString& wsLink) = 0;
116 
117 #ifdef PDF_XFA_ELEMENT_SUBMIT_ENABLED
118     virtual bool Submit(CXFA_FFDoc* hDoc, CXFA_Submit* submit) = 0;
119 #endif  // PDF_XFA_ELEMENT_SUBMIT_ENABLED
120   };
121 
122   CONSTRUCT_VIA_MAKE_GARBAGE_COLLECTED;
123   ~CXFA_FFDoc();
124 
125   void PreFinalize();
126   void Trace(cppgc::Visitor* visitor) const;
127 
128   bool OpenDoc(CFX_XMLDocument* pXML);
129 
130   void SetChangeMark();
131   void InvalidateRect(CXFA_FFPageView* pPageView, const CFX_RectF& rt);
132   void DisplayCaret(CXFA_FFWidget* hWidget,
133                     bool bVisible,
134                     const CFX_RectF* pRtAnchor);
135   bool GetPopupPos(CXFA_FFWidget* hWidget,
136                    float fMinPopup,
137                    float fMaxPopup,
138                    const CFX_RectF& rtAnchor,
139                    CFX_RectF* pPopupRect) const;
140   bool PopupMenu(CXFA_FFWidget* hWidget, const CFX_PointF& ptPopup);
141   void OnPageViewEvent(CXFA_FFPageView* pPageView, PageViewEvent eEvent);
142   void WidgetPostAdd(CXFA_FFWidget* hWidget);
143   void WidgetPreRemove(CXFA_FFWidget* hWidget);
144   int32_t CountPages() const;
145   int32_t GetCurrentPage() const;
146   void SetCurrentPage(int32_t iCurPage);
147   bool IsCalculationsEnabled() const;
148   void SetCalculationsEnabled(bool bEnabled);
149   WideString GetTitle() const;
150   void SetTitle(const WideString& wsTitle);
151   void ExportData(const WideString& wsFilePath, bool bXDP);
152   void GotoURL(const WideString& bsURL);
153   bool IsValidationsEnabled() const;
154   void SetValidationsEnabled(bool bEnabled);
155   void SetFocusWidget(CXFA_FFWidget* hWidget);
156   void Print(int32_t nStartPage,
157              int32_t nEndPage,
158              Mask<XFA_PrintOpt> dwOptions);
159   FX_ARGB GetHighlightColor() const;
160   IJS_Runtime* GetIJSRuntime() const;
161   CFX_XMLDocument* GetXMLDocument() const;
162   RetainPtr<IFX_SeekableReadStream> OpenLinkedFile(const WideString& wsLink);
163 
164   CXFA_FFDocView* CreateDocView();
GetFormType()165   FormType GetFormType() const { return m_FormType; }
GetHeap()166   cppgc::Heap* GetHeap() const { return m_pHeap; }
GetXFADoc()167   CXFA_Document* GetXFADoc() const { return m_pDocument; }
GetApp()168   CXFA_FFApp* GetApp() const { return m_pApp; }
GetPDFDoc()169   CPDF_Document* GetPDFDoc() const { return m_pPDFDoc; }
170   CXFA_FFDocView* GetDocView(CXFA_LayoutProcessor* pLayout);
171   CXFA_FFDocView* GetDocView();
172   RetainPtr<CFGAS_GEFont> GetPDFFont(const WideString& family,
173                                      uint32_t styles,
174                                      bool strict);
175   RetainPtr<CFX_DIBitmap> GetPDFNamedImage(WideStringView wsName,
176                                            int32_t& iImageXDpi,
177                                            int32_t& iImageYDpi);
178 
179   bool SavePackage(CXFA_Node* pNode,
180                    const RetainPtr<IFX_SeekableStream>& pFile);
181 
182  private:
183   CXFA_FFDoc(CXFA_FFApp* pApp,
184              CallbackIface* pDocEnvironment,
185              CPDF_Document* pPDFDoc,
186              cppgc::Heap* pHeap);
187   bool BuildDoc(CFX_XMLDocument* pXML);
188 
189   UnownedPtr<CallbackIface> const m_pDocEnvironment;
190   UnownedPtr<CPDF_Document> const m_pPDFDoc;
191   UnownedPtr<cppgc::Heap> const m_pHeap;
192   cppgc::Member<CXFA_FFApp> const m_pApp;
193   cppgc::Member<CXFA_FFNotify> m_pNotify;
194   cppgc::Member<CXFA_Document> m_pDocument;
195   cppgc::Member<CXFA_FFDocView> m_DocView;
196   std::unique_ptr<CFGAS_PDFFontMgr> m_pPDFFontMgr;
197   std::map<uint32_t, FX_IMAGEDIB_AND_DPI> m_HashToDibDpiMap;
198   FormType m_FormType = FormType::kXFAForeground;
199 };
200 
201 #endif  // XFA_FXFA_CXFA_FFDOC_H_
202