xref: /aosp_15_r20/external/pdfium/xfa/fxfa/cxfa_ffdoc.cpp (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 #include "xfa/fxfa/cxfa_ffdoc.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include <algorithm>
10*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
11*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
12*3ac0a46fSAndroid Build Coastguard Worker 
13*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_dictionary.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_stream.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_stream_acc.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_nametree.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_read_only_span_stream.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/fx_extension.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmldocument.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmlelement.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmlnode.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/xml/cfx_xmlparser.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxge/dib/cfx_dibitmap.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/xfa/cjx_object.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/allocation.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/cppgc/heap.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_gefont.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fgas/font/cfgas_pdffontmgr.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fwl/cfwl_notedriver.h"
32*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffapp.h"
33*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffdocview.h"
34*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffnotify.h"
35*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_ffwidget.h"
36*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/cxfa_fontmgr.h"
37*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/layout/cxfa_layoutprocessor.h"
38*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_acrobat.h"
39*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_acrobat7.h"
40*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_dataexporter.h"
41*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_document.h"
42*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_document_builder.h"
43*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_dynamicrender.h"
44*3ac0a46fSAndroid Build Coastguard Worker #include "xfa/fxfa/parser/cxfa_node.h"
45*3ac0a46fSAndroid Build Coastguard Worker 
46*3ac0a46fSAndroid Build Coastguard Worker FX_IMAGEDIB_AND_DPI::FX_IMAGEDIB_AND_DPI() = default;
47*3ac0a46fSAndroid Build Coastguard Worker FX_IMAGEDIB_AND_DPI::FX_IMAGEDIB_AND_DPI(const FX_IMAGEDIB_AND_DPI& that) =
48*3ac0a46fSAndroid Build Coastguard Worker     default;
49*3ac0a46fSAndroid Build Coastguard Worker 
FX_IMAGEDIB_AND_DPI(const RetainPtr<CFX_DIBBase> & pDib,int32_t xDpi,int32_t yDpi)50*3ac0a46fSAndroid Build Coastguard Worker FX_IMAGEDIB_AND_DPI::FX_IMAGEDIB_AND_DPI(const RetainPtr<CFX_DIBBase>& pDib,
51*3ac0a46fSAndroid Build Coastguard Worker                                          int32_t xDpi,
52*3ac0a46fSAndroid Build Coastguard Worker                                          int32_t yDpi)
53*3ac0a46fSAndroid Build Coastguard Worker     : pDibSource(pDib), iImageXDpi(xDpi), iImageYDpi(yDpi) {}
54*3ac0a46fSAndroid Build Coastguard Worker 
55*3ac0a46fSAndroid Build Coastguard Worker FX_IMAGEDIB_AND_DPI::~FX_IMAGEDIB_AND_DPI() = default;
56*3ac0a46fSAndroid Build Coastguard Worker 
CXFA_FFDoc(CXFA_FFApp * pApp,CallbackIface * pDocEnvironment,CPDF_Document * pPDFDoc,cppgc::Heap * pHeap)57*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc::CXFA_FFDoc(CXFA_FFApp* pApp,
58*3ac0a46fSAndroid Build Coastguard Worker                        CallbackIface* pDocEnvironment,
59*3ac0a46fSAndroid Build Coastguard Worker                        CPDF_Document* pPDFDoc,
60*3ac0a46fSAndroid Build Coastguard Worker                        cppgc::Heap* pHeap)
61*3ac0a46fSAndroid Build Coastguard Worker     : m_pDocEnvironment(pDocEnvironment),
62*3ac0a46fSAndroid Build Coastguard Worker       m_pPDFDoc(pPDFDoc),
63*3ac0a46fSAndroid Build Coastguard Worker       m_pHeap(pHeap),
64*3ac0a46fSAndroid Build Coastguard Worker       m_pApp(pApp),
65*3ac0a46fSAndroid Build Coastguard Worker       m_pNotify(cppgc::MakeGarbageCollected<CXFA_FFNotify>(
66*3ac0a46fSAndroid Build Coastguard Worker           pHeap->GetAllocationHandle(),
67*3ac0a46fSAndroid Build Coastguard Worker           this)),
68*3ac0a46fSAndroid Build Coastguard Worker       m_pDocument(cppgc::MakeGarbageCollected<CXFA_Document>(
69*3ac0a46fSAndroid Build Coastguard Worker           pHeap->GetAllocationHandle(),
70*3ac0a46fSAndroid Build Coastguard Worker           m_pNotify,
71*3ac0a46fSAndroid Build Coastguard Worker           pHeap,
72*3ac0a46fSAndroid Build Coastguard Worker           cppgc::MakeGarbageCollected<CXFA_LayoutProcessor>(
73*3ac0a46fSAndroid Build Coastguard Worker               pHeap->GetAllocationHandle(),
74*3ac0a46fSAndroid Build Coastguard Worker               pHeap))) {}
75*3ac0a46fSAndroid Build Coastguard Worker 
76*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDoc::~CXFA_FFDoc() = default;
77*3ac0a46fSAndroid Build Coastguard Worker 
PreFinalize()78*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::PreFinalize() {
79*3ac0a46fSAndroid Build Coastguard Worker   if (m_DocView)
80*3ac0a46fSAndroid Build Coastguard Worker     m_DocView->RunDocClose();
81*3ac0a46fSAndroid Build Coastguard Worker 
82*3ac0a46fSAndroid Build Coastguard Worker   if (m_pDocument)
83*3ac0a46fSAndroid Build Coastguard Worker     m_pDocument->ClearLayoutData();
84*3ac0a46fSAndroid Build Coastguard Worker }
85*3ac0a46fSAndroid Build Coastguard Worker 
Trace(cppgc::Visitor * visitor) const86*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::Trace(cppgc::Visitor* visitor) const {
87*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pApp);
88*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pNotify);
89*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_pDocument);
90*3ac0a46fSAndroid Build Coastguard Worker   visitor->Trace(m_DocView);
91*3ac0a46fSAndroid Build Coastguard Worker }
92*3ac0a46fSAndroid Build Coastguard Worker 
BuildDoc(CFX_XMLDocument * pXML)93*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::BuildDoc(CFX_XMLDocument* pXML) {
94*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pXML);
95*3ac0a46fSAndroid Build Coastguard Worker 
96*3ac0a46fSAndroid Build Coastguard Worker   CXFA_DocumentBuilder builder(m_pDocument);
97*3ac0a46fSAndroid Build Coastguard Worker   if (!builder.BuildDocument(pXML, XFA_PacketType::Xdp))
98*3ac0a46fSAndroid Build Coastguard Worker     return false;
99*3ac0a46fSAndroid Build Coastguard Worker 
100*3ac0a46fSAndroid Build Coastguard Worker   m_pDocument->SetRoot(builder.GetRootNode());
101*3ac0a46fSAndroid Build Coastguard Worker   return true;
102*3ac0a46fSAndroid Build Coastguard Worker }
103*3ac0a46fSAndroid Build Coastguard Worker 
CreateDocView()104*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* CXFA_FFDoc::CreateDocView() {
105*3ac0a46fSAndroid Build Coastguard Worker   if (!m_DocView) {
106*3ac0a46fSAndroid Build Coastguard Worker     m_DocView = cppgc::MakeGarbageCollected<CXFA_FFDocView>(
107*3ac0a46fSAndroid Build Coastguard Worker         m_pHeap->GetAllocationHandle(), this);
108*3ac0a46fSAndroid Build Coastguard Worker   }
109*3ac0a46fSAndroid Build Coastguard Worker   return m_DocView;
110*3ac0a46fSAndroid Build Coastguard Worker }
111*3ac0a46fSAndroid Build Coastguard Worker 
SetChangeMark()112*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::SetChangeMark() {
113*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->SetChangeMark(this);
114*3ac0a46fSAndroid Build Coastguard Worker }
115*3ac0a46fSAndroid Build Coastguard Worker 
InvalidateRect(CXFA_FFPageView * pPageView,const CFX_RectF & rt)116*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::InvalidateRect(CXFA_FFPageView* pPageView,
117*3ac0a46fSAndroid Build Coastguard Worker                                 const CFX_RectF& rt) {
118*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->InvalidateRect(pPageView, rt);
119*3ac0a46fSAndroid Build Coastguard Worker }
120*3ac0a46fSAndroid Build Coastguard Worker 
DisplayCaret(CXFA_FFWidget * hWidget,bool bVisible,const CFX_RectF * pRtAnchor)121*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::DisplayCaret(CXFA_FFWidget* hWidget,
122*3ac0a46fSAndroid Build Coastguard Worker                               bool bVisible,
123*3ac0a46fSAndroid Build Coastguard Worker                               const CFX_RectF* pRtAnchor) {
124*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->DisplayCaret(hWidget, bVisible, pRtAnchor);
125*3ac0a46fSAndroid Build Coastguard Worker }
126*3ac0a46fSAndroid Build Coastguard Worker 
GetPopupPos(CXFA_FFWidget * hWidget,float fMinPopup,float fMaxPopup,const CFX_RectF & rtAnchor,CFX_RectF * pPopupRect) const127*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::GetPopupPos(CXFA_FFWidget* hWidget,
128*3ac0a46fSAndroid Build Coastguard Worker                              float fMinPopup,
129*3ac0a46fSAndroid Build Coastguard Worker                              float fMaxPopup,
130*3ac0a46fSAndroid Build Coastguard Worker                              const CFX_RectF& rtAnchor,
131*3ac0a46fSAndroid Build Coastguard Worker                              CFX_RectF* pPopupRect) const {
132*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->GetPopupPos(hWidget, fMinPopup, fMaxPopup, rtAnchor,
133*3ac0a46fSAndroid Build Coastguard Worker                                         pPopupRect);
134*3ac0a46fSAndroid Build Coastguard Worker }
135*3ac0a46fSAndroid Build Coastguard Worker 
PopupMenu(CXFA_FFWidget * hWidget,const CFX_PointF & ptPopup)136*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::PopupMenu(CXFA_FFWidget* hWidget, const CFX_PointF& ptPopup) {
137*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->PopupMenu(hWidget, ptPopup);
138*3ac0a46fSAndroid Build Coastguard Worker }
139*3ac0a46fSAndroid Build Coastguard Worker 
OnPageViewEvent(CXFA_FFPageView * pPageView,PageViewEvent eEvent)140*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::OnPageViewEvent(CXFA_FFPageView* pPageView,
141*3ac0a46fSAndroid Build Coastguard Worker                                  PageViewEvent eEvent) {
142*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->OnPageViewEvent(pPageView, eEvent);
143*3ac0a46fSAndroid Build Coastguard Worker }
144*3ac0a46fSAndroid Build Coastguard Worker 
WidgetPostAdd(CXFA_FFWidget * hWidget)145*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::WidgetPostAdd(CXFA_FFWidget* hWidget) {
146*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->WidgetPostAdd(hWidget);
147*3ac0a46fSAndroid Build Coastguard Worker }
148*3ac0a46fSAndroid Build Coastguard Worker 
WidgetPreRemove(CXFA_FFWidget * hWidget)149*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::WidgetPreRemove(CXFA_FFWidget* hWidget) {
150*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->WidgetPreRemove(hWidget);
151*3ac0a46fSAndroid Build Coastguard Worker }
152*3ac0a46fSAndroid Build Coastguard Worker 
CountPages() const153*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_FFDoc::CountPages() const {
154*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->CountPages(this);
155*3ac0a46fSAndroid Build Coastguard Worker }
156*3ac0a46fSAndroid Build Coastguard Worker 
GetCurrentPage() const157*3ac0a46fSAndroid Build Coastguard Worker int32_t CXFA_FFDoc::GetCurrentPage() const {
158*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->GetCurrentPage(this);
159*3ac0a46fSAndroid Build Coastguard Worker }
160*3ac0a46fSAndroid Build Coastguard Worker 
SetCurrentPage(int32_t iCurPage)161*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::SetCurrentPage(int32_t iCurPage) {
162*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->SetCurrentPage(this, iCurPage);
163*3ac0a46fSAndroid Build Coastguard Worker }
164*3ac0a46fSAndroid Build Coastguard Worker 
IsCalculationsEnabled() const165*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::IsCalculationsEnabled() const {
166*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->IsCalculationsEnabled(this);
167*3ac0a46fSAndroid Build Coastguard Worker }
168*3ac0a46fSAndroid Build Coastguard Worker 
SetCalculationsEnabled(bool bEnabled)169*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::SetCalculationsEnabled(bool bEnabled) {
170*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->SetCalculationsEnabled(this, bEnabled);
171*3ac0a46fSAndroid Build Coastguard Worker }
172*3ac0a46fSAndroid Build Coastguard Worker 
GetTitle() const173*3ac0a46fSAndroid Build Coastguard Worker WideString CXFA_FFDoc::GetTitle() const {
174*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->GetTitle(this);
175*3ac0a46fSAndroid Build Coastguard Worker }
176*3ac0a46fSAndroid Build Coastguard Worker 
SetTitle(const WideString & wsTitle)177*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::SetTitle(const WideString& wsTitle) {
178*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->SetTitle(this, wsTitle);
179*3ac0a46fSAndroid Build Coastguard Worker }
180*3ac0a46fSAndroid Build Coastguard Worker 
ExportData(const WideString & wsFilePath,bool bXDP)181*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::ExportData(const WideString& wsFilePath, bool bXDP) {
182*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->ExportData(this, wsFilePath, bXDP);
183*3ac0a46fSAndroid Build Coastguard Worker }
184*3ac0a46fSAndroid Build Coastguard Worker 
GotoURL(const WideString & bsURL)185*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::GotoURL(const WideString& bsURL) {
186*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->GotoURL(this, bsURL);
187*3ac0a46fSAndroid Build Coastguard Worker }
188*3ac0a46fSAndroid Build Coastguard Worker 
IsValidationsEnabled() const189*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::IsValidationsEnabled() const {
190*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->IsValidationsEnabled(this);
191*3ac0a46fSAndroid Build Coastguard Worker }
192*3ac0a46fSAndroid Build Coastguard Worker 
SetValidationsEnabled(bool bEnabled)193*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::SetValidationsEnabled(bool bEnabled) {
194*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->SetValidationsEnabled(this, bEnabled);
195*3ac0a46fSAndroid Build Coastguard Worker }
196*3ac0a46fSAndroid Build Coastguard Worker 
SetFocusWidget(CXFA_FFWidget * hWidget)197*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::SetFocusWidget(CXFA_FFWidget* hWidget) {
198*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->SetFocusWidget(this, hWidget);
199*3ac0a46fSAndroid Build Coastguard Worker }
200*3ac0a46fSAndroid Build Coastguard Worker 
Print(int32_t nStartPage,int32_t nEndPage,Mask<XFA_PrintOpt> dwOptions)201*3ac0a46fSAndroid Build Coastguard Worker void CXFA_FFDoc::Print(int32_t nStartPage,
202*3ac0a46fSAndroid Build Coastguard Worker                        int32_t nEndPage,
203*3ac0a46fSAndroid Build Coastguard Worker                        Mask<XFA_PrintOpt> dwOptions) {
204*3ac0a46fSAndroid Build Coastguard Worker   m_pDocEnvironment->Print(this, nStartPage, nEndPage, dwOptions);
205*3ac0a46fSAndroid Build Coastguard Worker }
206*3ac0a46fSAndroid Build Coastguard Worker 
GetHighlightColor() const207*3ac0a46fSAndroid Build Coastguard Worker FX_ARGB CXFA_FFDoc::GetHighlightColor() const {
208*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->GetHighlightColor(this);
209*3ac0a46fSAndroid Build Coastguard Worker }
210*3ac0a46fSAndroid Build Coastguard Worker 
GetIJSRuntime() const211*3ac0a46fSAndroid Build Coastguard Worker IJS_Runtime* CXFA_FFDoc::GetIJSRuntime() const {
212*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->GetIJSRuntime(this);
213*3ac0a46fSAndroid Build Coastguard Worker }
214*3ac0a46fSAndroid Build Coastguard Worker 
GetXMLDocument() const215*3ac0a46fSAndroid Build Coastguard Worker CFX_XMLDocument* CXFA_FFDoc::GetXMLDocument() const {
216*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->GetXMLDoc();
217*3ac0a46fSAndroid Build Coastguard Worker }
218*3ac0a46fSAndroid Build Coastguard Worker 
OpenLinkedFile(const WideString & wsLink)219*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<IFX_SeekableReadStream> CXFA_FFDoc::OpenLinkedFile(
220*3ac0a46fSAndroid Build Coastguard Worker     const WideString& wsLink) {
221*3ac0a46fSAndroid Build Coastguard Worker   return m_pDocEnvironment->OpenLinkedFile(this, wsLink);
222*3ac0a46fSAndroid Build Coastguard Worker }
223*3ac0a46fSAndroid Build Coastguard Worker 
GetDocView(CXFA_LayoutProcessor * pLayout)224*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* CXFA_FFDoc::GetDocView(CXFA_LayoutProcessor* pLayout) {
225*3ac0a46fSAndroid Build Coastguard Worker   return m_DocView && m_DocView->GetLayoutProcessor() == pLayout ? m_DocView
226*3ac0a46fSAndroid Build Coastguard Worker                                                                  : nullptr;
227*3ac0a46fSAndroid Build Coastguard Worker }
228*3ac0a46fSAndroid Build Coastguard Worker 
GetDocView()229*3ac0a46fSAndroid Build Coastguard Worker CXFA_FFDocView* CXFA_FFDoc::GetDocView() {
230*3ac0a46fSAndroid Build Coastguard Worker   return m_DocView;
231*3ac0a46fSAndroid Build Coastguard Worker }
232*3ac0a46fSAndroid Build Coastguard Worker 
OpenDoc(CFX_XMLDocument * pXML)233*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::OpenDoc(CFX_XMLDocument* pXML) {
234*3ac0a46fSAndroid Build Coastguard Worker   if (!BuildDoc(pXML))
235*3ac0a46fSAndroid Build Coastguard Worker     return false;
236*3ac0a46fSAndroid Build Coastguard Worker 
237*3ac0a46fSAndroid Build Coastguard Worker   // At this point we've got an XFA document and we want to always return
238*3ac0a46fSAndroid Build Coastguard Worker   // true to signify the load succeeded.
239*3ac0a46fSAndroid Build Coastguard Worker   m_pPDFFontMgr = std::make_unique<CFGAS_PDFFontMgr>(GetPDFDoc());
240*3ac0a46fSAndroid Build Coastguard Worker   m_FormType = FormType::kXFAForeground;
241*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Node* pConfig = ToNode(m_pDocument->GetXFAObject(XFA_HASHCODE_Config));
242*3ac0a46fSAndroid Build Coastguard Worker   if (!pConfig)
243*3ac0a46fSAndroid Build Coastguard Worker     return true;
244*3ac0a46fSAndroid Build Coastguard Worker 
245*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Acrobat* pAcrobat =
246*3ac0a46fSAndroid Build Coastguard Worker       pConfig->GetFirstChildByClass<CXFA_Acrobat>(XFA_Element::Acrobat);
247*3ac0a46fSAndroid Build Coastguard Worker   if (!pAcrobat)
248*3ac0a46fSAndroid Build Coastguard Worker     return true;
249*3ac0a46fSAndroid Build Coastguard Worker 
250*3ac0a46fSAndroid Build Coastguard Worker   CXFA_Acrobat7* pAcrobat7 =
251*3ac0a46fSAndroid Build Coastguard Worker       pAcrobat->GetFirstChildByClass<CXFA_Acrobat7>(XFA_Element::Acrobat7);
252*3ac0a46fSAndroid Build Coastguard Worker   if (!pAcrobat7)
253*3ac0a46fSAndroid Build Coastguard Worker     return true;
254*3ac0a46fSAndroid Build Coastguard Worker 
255*3ac0a46fSAndroid Build Coastguard Worker   CXFA_DynamicRender* pDynamicRender =
256*3ac0a46fSAndroid Build Coastguard Worker       pAcrobat7->GetFirstChildByClass<CXFA_DynamicRender>(
257*3ac0a46fSAndroid Build Coastguard Worker           XFA_Element::DynamicRender);
258*3ac0a46fSAndroid Build Coastguard Worker   if (!pDynamicRender)
259*3ac0a46fSAndroid Build Coastguard Worker     return true;
260*3ac0a46fSAndroid Build Coastguard Worker 
261*3ac0a46fSAndroid Build Coastguard Worker   WideString wsType = pDynamicRender->JSObject()->GetContent(false);
262*3ac0a46fSAndroid Build Coastguard Worker   if (wsType.EqualsASCII("required"))
263*3ac0a46fSAndroid Build Coastguard Worker     m_FormType = FormType::kXFAFull;
264*3ac0a46fSAndroid Build Coastguard Worker 
265*3ac0a46fSAndroid Build Coastguard Worker   return true;
266*3ac0a46fSAndroid Build Coastguard Worker }
267*3ac0a46fSAndroid Build Coastguard Worker 
GetPDFFont(const WideString & family,uint32_t styles,bool strict)268*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFGAS_GEFont> CXFA_FFDoc::GetPDFFont(const WideString& family,
269*3ac0a46fSAndroid Build Coastguard Worker                                                uint32_t styles,
270*3ac0a46fSAndroid Build Coastguard Worker                                                bool strict) {
271*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pPDFFontMgr)
272*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
273*3ac0a46fSAndroid Build Coastguard Worker 
274*3ac0a46fSAndroid Build Coastguard Worker   return m_pPDFFontMgr->GetFont(family, styles, strict);
275*3ac0a46fSAndroid Build Coastguard Worker }
276*3ac0a46fSAndroid Build Coastguard Worker 
GetPDFNamedImage(WideStringView wsName,int32_t & iImageXDpi,int32_t & iImageYDpi)277*3ac0a46fSAndroid Build Coastguard Worker RetainPtr<CFX_DIBitmap> CXFA_FFDoc::GetPDFNamedImage(WideStringView wsName,
278*3ac0a46fSAndroid Build Coastguard Worker                                                      int32_t& iImageXDpi,
279*3ac0a46fSAndroid Build Coastguard Worker                                                      int32_t& iImageYDpi) {
280*3ac0a46fSAndroid Build Coastguard Worker   uint32_t dwHash = FX_HashCode_GetW(wsName);
281*3ac0a46fSAndroid Build Coastguard Worker   auto it = m_HashToDibDpiMap.find(dwHash);
282*3ac0a46fSAndroid Build Coastguard Worker   if (it != m_HashToDibDpiMap.end()) {
283*3ac0a46fSAndroid Build Coastguard Worker     iImageXDpi = it->second.iImageXDpi;
284*3ac0a46fSAndroid Build Coastguard Worker     iImageYDpi = it->second.iImageYDpi;
285*3ac0a46fSAndroid Build Coastguard Worker     return it->second.pDibSource.As<CFX_DIBitmap>();
286*3ac0a46fSAndroid Build Coastguard Worker   }
287*3ac0a46fSAndroid Build Coastguard Worker 
288*3ac0a46fSAndroid Build Coastguard Worker   auto name_tree = CPDF_NameTree::Create(m_pPDFDoc, "XFAImages");
289*3ac0a46fSAndroid Build Coastguard Worker   size_t count = name_tree ? name_tree->GetCount() : 0;
290*3ac0a46fSAndroid Build Coastguard Worker   if (count == 0)
291*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
292*3ac0a46fSAndroid Build Coastguard Worker 
293*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<const CPDF_Object> pObject =
294*3ac0a46fSAndroid Build Coastguard Worker       name_tree->LookupValue(WideString(wsName));
295*3ac0a46fSAndroid Build Coastguard Worker   if (!pObject) {
296*3ac0a46fSAndroid Build Coastguard Worker     for (size_t i = 0; i < count; ++i) {
297*3ac0a46fSAndroid Build Coastguard Worker       WideString wsTemp;
298*3ac0a46fSAndroid Build Coastguard Worker       RetainPtr<CPDF_Object> pTempObject =
299*3ac0a46fSAndroid Build Coastguard Worker           name_tree->LookupValueAndName(i, &wsTemp);
300*3ac0a46fSAndroid Build Coastguard Worker       if (wsTemp == wsName) {
301*3ac0a46fSAndroid Build Coastguard Worker         pObject = std::move(pTempObject);
302*3ac0a46fSAndroid Build Coastguard Worker         break;
303*3ac0a46fSAndroid Build Coastguard Worker       }
304*3ac0a46fSAndroid Build Coastguard Worker     }
305*3ac0a46fSAndroid Build Coastguard Worker   }
306*3ac0a46fSAndroid Build Coastguard Worker 
307*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<const CPDF_Stream> pStream = ToStream(pObject);
308*3ac0a46fSAndroid Build Coastguard Worker   if (!pStream)
309*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
310*3ac0a46fSAndroid Build Coastguard Worker 
311*3ac0a46fSAndroid Build Coastguard Worker   auto pAcc = pdfium::MakeRetain<CPDF_StreamAcc>(std::move(pStream));
312*3ac0a46fSAndroid Build Coastguard Worker   pAcc->LoadAllDataFiltered();
313*3ac0a46fSAndroid Build Coastguard Worker 
314*3ac0a46fSAndroid Build Coastguard Worker   auto pImageFileRead =
315*3ac0a46fSAndroid Build Coastguard Worker       pdfium::MakeRetain<CFX_ReadOnlySpanStream>(pAcc->GetSpan());
316*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<CFX_DIBitmap> pDibSource = XFA_LoadImageFromBuffer(
317*3ac0a46fSAndroid Build Coastguard Worker       std::move(pImageFileRead), FXCODEC_IMAGE_UNKNOWN, iImageXDpi, iImageYDpi);
318*3ac0a46fSAndroid Build Coastguard Worker   m_HashToDibDpiMap[dwHash] = {pDibSource, iImageXDpi, iImageYDpi};
319*3ac0a46fSAndroid Build Coastguard Worker   return pDibSource;
320*3ac0a46fSAndroid Build Coastguard Worker }
321*3ac0a46fSAndroid Build Coastguard Worker 
SavePackage(CXFA_Node * pNode,const RetainPtr<IFX_SeekableStream> & pFile)322*3ac0a46fSAndroid Build Coastguard Worker bool CXFA_FFDoc::SavePackage(CXFA_Node* pNode,
323*3ac0a46fSAndroid Build Coastguard Worker                              const RetainPtr<IFX_SeekableStream>& pFile) {
324*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pNode || GetXFADoc()->GetRoot());
325*3ac0a46fSAndroid Build Coastguard Worker 
326*3ac0a46fSAndroid Build Coastguard Worker   CXFA_DataExporter exporter;
327*3ac0a46fSAndroid Build Coastguard Worker   return exporter.Export(pFile, pNode ? pNode : GetXFADoc()->GetRoot());
328*3ac0a46fSAndroid Build Coastguard Worker }
329