xref: /aosp_15_r20/external/pdfium/fpdfsdk/cpdfsdk_formfillenvironment.h (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2016 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 FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_
8*3ac0a46fSAndroid Build Coastguard Worker #define FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_
9*3ac0a46fSAndroid Build Coastguard Worker 
10*3ac0a46fSAndroid Build Coastguard Worker #include <stdint.h>
11*3ac0a46fSAndroid Build Coastguard Worker 
12*3ac0a46fSAndroid Build Coastguard Worker #include <map>
13*3ac0a46fSAndroid Build Coastguard Worker #include <memory>
14*3ac0a46fSAndroid Build Coastguard Worker #include <set>
15*3ac0a46fSAndroid Build Coastguard Worker #include <utility>
16*3ac0a46fSAndroid Build Coastguard Worker #include <vector>
17*3ac0a46fSAndroid Build Coastguard Worker 
18*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/page/cpdf_occontext.h"
19*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfapi/parser/cpdf_document.h"
20*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_aaction.h"
21*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/cfx_timer.h"
22*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/mask.h"
23*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/observed_ptr.h"
24*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/retain_ptr.h"
25*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/unowned_ptr.h"
26*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_annot.h"
27*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/formfiller/cffl_interactiveformfiller.h"
28*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/cpwl_wnd.h"
29*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/pwl/ipwl_fillernotify.h"
30*3ac0a46fSAndroid Build Coastguard Worker #include "public/fpdf_formfill.h"
31*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/containers/span.h"
32*3ac0a46fSAndroid Build Coastguard Worker 
33*3ac0a46fSAndroid Build Coastguard Worker class CPDF_Action;
34*3ac0a46fSAndroid Build Coastguard Worker class CPDF_FormField;
35*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_InteractiveForm;
36*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_PageView;
37*3ac0a46fSAndroid Build Coastguard Worker class IJS_EventContext;
38*3ac0a46fSAndroid Build Coastguard Worker class IJS_Runtime;
39*3ac0a46fSAndroid Build Coastguard Worker class IPDF_Page;
40*3ac0a46fSAndroid Build Coastguard Worker struct CFFL_FieldAction;
41*3ac0a46fSAndroid Build Coastguard Worker 
42*3ac0a46fSAndroid Build Coastguard Worker // NOTE: |bsUTF16LE| must outlive the use of the result. Care must be taken
43*3ac0a46fSAndroid Build Coastguard Worker // since modifying the result would impact |bsUTF16LE|.
44*3ac0a46fSAndroid Build Coastguard Worker FPDF_WIDESTRING AsFPDFWideString(ByteString* bsUTF16LE);
45*3ac0a46fSAndroid Build Coastguard Worker 
46*3ac0a46fSAndroid Build Coastguard Worker // The CPDFSDK_FormFillEnvironment is "owned" by the embedder across the
47*3ac0a46fSAndroid Build Coastguard Worker // C API as a FPDF_FormHandle, and may pop out of existence at any time,
48*3ac0a46fSAndroid Build Coastguard Worker // so long as the associated embedder-owned FPDF_Document outlives it.
49*3ac0a46fSAndroid Build Coastguard Worker // Pointers from objects in the FPDF_Document ownership hierarchy should
50*3ac0a46fSAndroid Build Coastguard Worker // be ObservedPtr<> so as to clear themselves when the embedder "exits"
51*3ac0a46fSAndroid Build Coastguard Worker // the form fill environment.  Pointers from objects in this ownership
52*3ac0a46fSAndroid Build Coastguard Worker // heirarcy to objects in the FPDF_Document ownership hierarcy should be
53*3ac0a46fSAndroid Build Coastguard Worker // UnownedPtr<>, as should pointers from objects in this ownership
54*3ac0a46fSAndroid Build Coastguard Worker // hierarcy back to the form fill environment itself, so as to flag any
55*3ac0a46fSAndroid Build Coastguard Worker // lingering lifetime issues via the memory tools.
56*3ac0a46fSAndroid Build Coastguard Worker 
57*3ac0a46fSAndroid Build Coastguard Worker class CPDFSDK_FormFillEnvironment final
58*3ac0a46fSAndroid Build Coastguard Worker     : public CFX_Timer::HandlerIface,
59*3ac0a46fSAndroid Build Coastguard Worker       public CFFL_InteractiveFormFiller::CallbackIface {
60*3ac0a46fSAndroid Build Coastguard Worker  public:
61*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_FormFillEnvironment(CPDF_Document* pDoc, FPDF_FORMFILLINFO* pFFinfo);
62*3ac0a46fSAndroid Build Coastguard Worker 
63*3ac0a46fSAndroid Build Coastguard Worker   ~CPDFSDK_FormFillEnvironment() override;
64*3ac0a46fSAndroid Build Coastguard Worker 
65*3ac0a46fSAndroid Build Coastguard Worker   // TimerHandlerIface:
66*3ac0a46fSAndroid Build Coastguard Worker   int32_t SetTimer(int32_t uElapse, TimerCallback lpTimerFunc) override;
67*3ac0a46fSAndroid Build Coastguard Worker   void KillTimer(int32_t nTimerID) override;
68*3ac0a46fSAndroid Build Coastguard Worker 
69*3ac0a46fSAndroid Build Coastguard Worker   // CFFL_InteractiveFormFiller::CallbackIface:
70*3ac0a46fSAndroid Build Coastguard Worker   void InvalidateRect(CPDFSDK_Widget* widget,
71*3ac0a46fSAndroid Build Coastguard Worker                       const CFX_FloatRect& rect) override;
72*3ac0a46fSAndroid Build Coastguard Worker   void OutputSelectedRect(CFFL_FormField* pFormField,
73*3ac0a46fSAndroid Build Coastguard Worker                           const CFX_FloatRect& rect) override;
74*3ac0a46fSAndroid Build Coastguard Worker   bool IsSelectionImplemented() const override;
75*3ac0a46fSAndroid Build Coastguard Worker   void SetCursor(IPWL_FillerNotify::CursorStyle nCursorType) override;
76*3ac0a46fSAndroid Build Coastguard Worker   void OnSetFieldInputFocus(const WideString& text) override;
77*3ac0a46fSAndroid Build Coastguard Worker   void OnCalculate(ObservedPtr<CPDFSDK_Annot>& pAnnot) override;
78*3ac0a46fSAndroid Build Coastguard Worker   void OnFormat(ObservedPtr<CPDFSDK_Annot>& pAnnot) override;
79*3ac0a46fSAndroid Build Coastguard Worker   void Invalidate(IPDF_Page* page, const FX_RECT& rect) override;
80*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_PageView* GetOrCreatePageView(IPDF_Page* pUnderlyingPage) override;
81*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_PageView* GetPageView(IPDF_Page* pUnderlyingPage) override;
82*3ac0a46fSAndroid Build Coastguard Worker   CFX_Timer::HandlerIface* GetTimerHandler() override;
83*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_Annot* GetFocusAnnot() const override;
84*3ac0a46fSAndroid Build Coastguard Worker   bool SetFocusAnnot(ObservedPtr<CPDFSDK_Annot>& pAnnot) override;
85*3ac0a46fSAndroid Build Coastguard Worker   bool HasPermissions(uint32_t flags) const override;
86*3ac0a46fSAndroid Build Coastguard Worker   void OnChange() override;
87*3ac0a46fSAndroid Build Coastguard Worker 
88*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_PageView* GetPageViewAtIndex(int nIndex);
89*3ac0a46fSAndroid Build Coastguard Worker   void RemovePageView(IPDF_Page* pUnderlyingPage);
90*3ac0a46fSAndroid Build Coastguard Worker   void UpdateAllViews(CPDFSDK_Annot* pAnnot);
91*3ac0a46fSAndroid Build Coastguard Worker 
92*3ac0a46fSAndroid Build Coastguard Worker   bool KillFocusAnnot(Mask<FWL_EVENTFLAG> nFlags);
93*3ac0a46fSAndroid Build Coastguard Worker   void ClearAllFocusedAnnots();
94*3ac0a46fSAndroid Build Coastguard Worker 
95*3ac0a46fSAndroid Build Coastguard Worker   int GetPageCount() const;
96*3ac0a46fSAndroid Build Coastguard Worker 
GetChangeMark()97*3ac0a46fSAndroid Build Coastguard Worker   bool GetChangeMark() const { return m_bChangeMask; }
SetChangeMark()98*3ac0a46fSAndroid Build Coastguard Worker   void SetChangeMark() { m_bChangeMask = true; }
ClearChangeMark()99*3ac0a46fSAndroid Build Coastguard Worker   void ClearChangeMark() { m_bChangeMask = false; }
100*3ac0a46fSAndroid Build Coastguard Worker 
101*3ac0a46fSAndroid Build Coastguard Worker   void ProcJavascriptAction();
102*3ac0a46fSAndroid Build Coastguard Worker   bool ProcOpenAction();
103*3ac0a46fSAndroid Build Coastguard Worker 
104*3ac0a46fSAndroid Build Coastguard Worker   void ExecuteNamedAction(const ByteString& namedAction);
105*3ac0a46fSAndroid Build Coastguard Worker   void DoURIAction(const ByteString& bsURI, Mask<FWL_EVENTFLAG> modifiers);
106*3ac0a46fSAndroid Build Coastguard Worker   void DoGoToAction(int nPageIndex,
107*3ac0a46fSAndroid Build Coastguard Worker                     int zoomMode,
108*3ac0a46fSAndroid Build Coastguard Worker                     pdfium::span<float> fPosArray);
109*3ac0a46fSAndroid Build Coastguard Worker 
GetPDFDocument()110*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Document* GetPDFDocument() const { return m_pCPDFDoc; }
GetDocExtension()111*3ac0a46fSAndroid Build Coastguard Worker   CPDF_Document::Extension* GetDocExtension() const {
112*3ac0a46fSAndroid Build Coastguard Worker     return m_pCPDFDoc->GetExtension();
113*3ac0a46fSAndroid Build Coastguard Worker   }
114*3ac0a46fSAndroid Build Coastguard Worker 
IsJSPlatformPresent()115*3ac0a46fSAndroid Build Coastguard Worker   bool IsJSPlatformPresent() const { return m_pInfo && m_pInfo->m_pJsPlatform; }
GetJSPlatform()116*3ac0a46fSAndroid Build Coastguard Worker   IPDF_JSPLATFORM* GetJSPlatform() const {
117*3ac0a46fSAndroid Build Coastguard Worker     return m_pInfo ? m_pInfo->m_pJsPlatform : nullptr;
118*3ac0a46fSAndroid Build Coastguard Worker   }
119*3ac0a46fSAndroid Build Coastguard Worker 
120*3ac0a46fSAndroid Build Coastguard Worker   // Actions.
121*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionDocOpen(const CPDF_Action& action);
122*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionJavaScript(const CPDF_Action& JsAction, WideString csJSName);
123*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionPage(const CPDF_Action& action, CPDF_AAction::AActionType eType);
124*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionDocument(const CPDF_Action& action,
125*3ac0a46fSAndroid Build Coastguard Worker                         CPDF_AAction::AActionType eType);
126*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionField(const CPDF_Action& action,
127*3ac0a46fSAndroid Build Coastguard Worker                      CPDF_AAction::AActionType type,
128*3ac0a46fSAndroid Build Coastguard Worker                      CPDF_FormField* pFormField,
129*3ac0a46fSAndroid Build Coastguard Worker                      CFFL_FieldAction* data);
130*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionFieldJavaScript(const CPDF_Action& JsAction,
131*3ac0a46fSAndroid Build Coastguard Worker                                CPDF_AAction::AActionType type,
132*3ac0a46fSAndroid Build Coastguard Worker                                CPDF_FormField* pFormField,
133*3ac0a46fSAndroid Build Coastguard Worker                                CFFL_FieldAction* data);
134*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionLink(const CPDF_Action& action,
135*3ac0a46fSAndroid Build Coastguard Worker                     CPDF_AAction::AActionType type,
136*3ac0a46fSAndroid Build Coastguard Worker                     Mask<FWL_EVENTFLAG> modifiers);
137*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionDestination(const CPDF_Dest& dest);
138*3ac0a46fSAndroid Build Coastguard Worker   void DoActionNoJs(const CPDF_Action& action, CPDF_AAction::AActionType type);
139*3ac0a46fSAndroid Build Coastguard Worker   void DoActionGoTo(const CPDF_Action& action);
140*3ac0a46fSAndroid Build Coastguard Worker   void DoActionLaunch(const CPDF_Action& action);
141*3ac0a46fSAndroid Build Coastguard Worker   void DoActionURI(const CPDF_Action& action, Mask<FWL_EVENTFLAG> modifiers);
142*3ac0a46fSAndroid Build Coastguard Worker   void DoActionNamed(const CPDF_Action& action);
143*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionHide(const CPDF_Action& action);
144*3ac0a46fSAndroid Build Coastguard Worker   bool DoActionSubmitForm(const CPDF_Action& action);
145*3ac0a46fSAndroid Build Coastguard Worker   void DoActionResetForm(const CPDF_Action& action);
146*3ac0a46fSAndroid Build Coastguard Worker 
147*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_V8
148*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_PageView* GetCurrentView();
149*3ac0a46fSAndroid Build Coastguard Worker   IPDF_Page* GetCurrentPage() const;
150*3ac0a46fSAndroid Build Coastguard Worker 
151*3ac0a46fSAndroid Build Coastguard Worker   WideString GetLanguage();
152*3ac0a46fSAndroid Build Coastguard Worker   WideString GetPlatform();
153*3ac0a46fSAndroid Build Coastguard Worker 
154*3ac0a46fSAndroid Build Coastguard Worker   int JS_appAlert(const WideString& Msg,
155*3ac0a46fSAndroid Build Coastguard Worker                   const WideString& Title,
156*3ac0a46fSAndroid Build Coastguard Worker                   int Type,
157*3ac0a46fSAndroid Build Coastguard Worker                   int Icon);
158*3ac0a46fSAndroid Build Coastguard Worker   int JS_appResponse(const WideString& Question,
159*3ac0a46fSAndroid Build Coastguard Worker                      const WideString& Title,
160*3ac0a46fSAndroid Build Coastguard Worker                      const WideString& Default,
161*3ac0a46fSAndroid Build Coastguard Worker                      const WideString& cLabel,
162*3ac0a46fSAndroid Build Coastguard Worker                      FPDF_BOOL bPassword,
163*3ac0a46fSAndroid Build Coastguard Worker                      pdfium::span<uint8_t> response);
164*3ac0a46fSAndroid Build Coastguard Worker   void JS_appBeep(int nType);
165*3ac0a46fSAndroid Build Coastguard Worker   WideString JS_fieldBrowse();
166*3ac0a46fSAndroid Build Coastguard Worker   void JS_docmailForm(pdfium::span<const uint8_t> mailData,
167*3ac0a46fSAndroid Build Coastguard Worker                       FPDF_BOOL bUI,
168*3ac0a46fSAndroid Build Coastguard Worker                       const WideString& To,
169*3ac0a46fSAndroid Build Coastguard Worker                       const WideString& Subject,
170*3ac0a46fSAndroid Build Coastguard Worker                       const WideString& CC,
171*3ac0a46fSAndroid Build Coastguard Worker                       const WideString& BCC,
172*3ac0a46fSAndroid Build Coastguard Worker                       const WideString& Msg);
173*3ac0a46fSAndroid Build Coastguard Worker   void JS_docprint(FPDF_BOOL bUI,
174*3ac0a46fSAndroid Build Coastguard Worker                    int nStart,
175*3ac0a46fSAndroid Build Coastguard Worker                    int nEnd,
176*3ac0a46fSAndroid Build Coastguard Worker                    FPDF_BOOL bSilent,
177*3ac0a46fSAndroid Build Coastguard Worker                    FPDF_BOOL bShrinkToFit,
178*3ac0a46fSAndroid Build Coastguard Worker                    FPDF_BOOL bPrintAsImage,
179*3ac0a46fSAndroid Build Coastguard Worker                    FPDF_BOOL bReverse,
180*3ac0a46fSAndroid Build Coastguard Worker                    FPDF_BOOL bAnnotations);
181*3ac0a46fSAndroid Build Coastguard Worker   void JS_docgotoPage(int nPageNum);
182*3ac0a46fSAndroid Build Coastguard Worker   WideString JS_docGetFilePath();
183*3ac0a46fSAndroid Build Coastguard Worker 
184*3ac0a46fSAndroid Build Coastguard Worker #ifdef PDF_ENABLE_XFA
185*3ac0a46fSAndroid Build Coastguard Worker   int GetPageViewCount() const;
186*3ac0a46fSAndroid Build Coastguard Worker   void DisplayCaret(IPDF_Page* page,
187*3ac0a46fSAndroid Build Coastguard Worker                     FPDF_BOOL bVisible,
188*3ac0a46fSAndroid Build Coastguard Worker                     double left,
189*3ac0a46fSAndroid Build Coastguard Worker                     double top,
190*3ac0a46fSAndroid Build Coastguard Worker                     double right,
191*3ac0a46fSAndroid Build Coastguard Worker                     double bottom);
192*3ac0a46fSAndroid Build Coastguard Worker   int GetCurrentPageIndex() const;
193*3ac0a46fSAndroid Build Coastguard Worker   void SetCurrentPage(int iCurPage);
194*3ac0a46fSAndroid Build Coastguard Worker 
195*3ac0a46fSAndroid Build Coastguard Worker   // TODO(dsinclair): This should probably change to PDFium?
FFI_GetAppName()196*3ac0a46fSAndroid Build Coastguard Worker   WideString FFI_GetAppName() const { return WideString(L"Acrobat"); }
197*3ac0a46fSAndroid Build Coastguard Worker 
198*3ac0a46fSAndroid Build Coastguard Worker   void GotoURL(const WideString& wsURL);
199*3ac0a46fSAndroid Build Coastguard Worker   FS_RECTF GetPageViewRect(IPDF_Page* page);
200*3ac0a46fSAndroid Build Coastguard Worker   bool PopupMenu(IPDF_Page* page, int menuFlag, const CFX_PointF& pt);
201*3ac0a46fSAndroid Build Coastguard Worker   void EmailTo(FPDF_FILEHANDLER* fileHandler,
202*3ac0a46fSAndroid Build Coastguard Worker                FPDF_WIDESTRING pTo,
203*3ac0a46fSAndroid Build Coastguard Worker                FPDF_WIDESTRING pSubject,
204*3ac0a46fSAndroid Build Coastguard Worker                FPDF_WIDESTRING pCC,
205*3ac0a46fSAndroid Build Coastguard Worker                FPDF_WIDESTRING pBcc,
206*3ac0a46fSAndroid Build Coastguard Worker                FPDF_WIDESTRING pMsg);
207*3ac0a46fSAndroid Build Coastguard Worker   void UploadTo(FPDF_FILEHANDLER* fileHandler,
208*3ac0a46fSAndroid Build Coastguard Worker                 int fileFlag,
209*3ac0a46fSAndroid Build Coastguard Worker                 FPDF_WIDESTRING uploadTo);
210*3ac0a46fSAndroid Build Coastguard Worker   FPDF_FILEHANDLER* OpenFile(int fileType,
211*3ac0a46fSAndroid Build Coastguard Worker                              FPDF_WIDESTRING wsURL,
212*3ac0a46fSAndroid Build Coastguard Worker                              const char* mode);
213*3ac0a46fSAndroid Build Coastguard Worker   RetainPtr<IFX_SeekableReadStream> DownloadFromURL(const WideString& url);
214*3ac0a46fSAndroid Build Coastguard Worker   WideString PostRequestURL(const WideString& wsURL,
215*3ac0a46fSAndroid Build Coastguard Worker                             const WideString& wsData,
216*3ac0a46fSAndroid Build Coastguard Worker                             const WideString& wsContentType,
217*3ac0a46fSAndroid Build Coastguard Worker                             const WideString& wsEncode,
218*3ac0a46fSAndroid Build Coastguard Worker                             const WideString& wsHeader);
219*3ac0a46fSAndroid Build Coastguard Worker   FPDF_BOOL PutRequestURL(const WideString& wsURL,
220*3ac0a46fSAndroid Build Coastguard Worker                           const WideString& wsData,
221*3ac0a46fSAndroid Build Coastguard Worker                           const WideString& wsEncode);
222*3ac0a46fSAndroid Build Coastguard Worker 
223*3ac0a46fSAndroid Build Coastguard Worker   void PageEvent(int iPageCount, uint32_t dwEventType) const;
224*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_XFA
225*3ac0a46fSAndroid Build Coastguard Worker #endif  // PDF_ENABLE_V8
226*3ac0a46fSAndroid Build Coastguard Worker 
227*3ac0a46fSAndroid Build Coastguard Worker   WideString GetFilePath() const;
GetAppName()228*3ac0a46fSAndroid Build Coastguard Worker   ByteString GetAppName() const { return ByteString(); }
GetFormFillInfo()229*3ac0a46fSAndroid Build Coastguard Worker   FPDF_FORMFILLINFO* GetFormFillInfo() const { return m_pInfo; }
230*3ac0a46fSAndroid Build Coastguard Worker   void SubmitForm(pdfium::span<const uint8_t> form_data, const WideString& URL);
231*3ac0a46fSAndroid Build Coastguard Worker 
SetFocusableAnnotSubtypes(const std::vector<CPDF_Annot::Subtype> & focusableAnnotTypes)232*3ac0a46fSAndroid Build Coastguard Worker   void SetFocusableAnnotSubtypes(
233*3ac0a46fSAndroid Build Coastguard Worker       const std::vector<CPDF_Annot::Subtype>& focusableAnnotTypes) {
234*3ac0a46fSAndroid Build Coastguard Worker     m_FocusableAnnotTypes = focusableAnnotTypes;
235*3ac0a46fSAndroid Build Coastguard Worker   }
GetFocusableAnnotSubtypes()236*3ac0a46fSAndroid Build Coastguard Worker   const std::vector<CPDF_Annot::Subtype>& GetFocusableAnnotSubtypes() const {
237*3ac0a46fSAndroid Build Coastguard Worker     return m_FocusableAnnotTypes;
238*3ac0a46fSAndroid Build Coastguard Worker   }
239*3ac0a46fSAndroid Build Coastguard Worker 
240*3ac0a46fSAndroid Build Coastguard Worker   // Never returns null.
GetInteractiveFormFiller()241*3ac0a46fSAndroid Build Coastguard Worker   CFFL_InteractiveFormFiller* GetInteractiveFormFiller() {
242*3ac0a46fSAndroid Build Coastguard Worker     return m_pInteractiveFormFiller.get();
243*3ac0a46fSAndroid Build Coastguard Worker   }
244*3ac0a46fSAndroid Build Coastguard Worker 
245*3ac0a46fSAndroid Build Coastguard Worker   IJS_Runtime* GetIJSRuntime();                   // Creates if not present.
246*3ac0a46fSAndroid Build Coastguard Worker   CPDFSDK_InteractiveForm* GetInteractiveForm();  // Creates if not present.
247*3ac0a46fSAndroid Build Coastguard Worker 
248*3ac0a46fSAndroid Build Coastguard Worker  private:
249*3ac0a46fSAndroid Build Coastguard Worker   using RunScriptCallback = std::function<void(IJS_EventContext* context)>;
250*3ac0a46fSAndroid Build Coastguard Worker 
251*3ac0a46fSAndroid Build Coastguard Worker   IPDF_Page* GetPage(int nIndex) const;
252*3ac0a46fSAndroid Build Coastguard Worker   void OnSetFieldInputFocusInternal(const WideString& text, bool bFocus);
253*3ac0a46fSAndroid Build Coastguard Worker   void SendOnFocusChange(ObservedPtr<CPDFSDK_Annot>& pAnnot);
254*3ac0a46fSAndroid Build Coastguard Worker 
255*3ac0a46fSAndroid Build Coastguard Worker   // Support methods for Actions.
256*3ac0a46fSAndroid Build Coastguard Worker   void RunScript(const WideString& script, const RunScriptCallback& cb);
257*3ac0a46fSAndroid Build Coastguard Worker   bool ExecuteDocumentOpenAction(const CPDF_Action& action,
258*3ac0a46fSAndroid Build Coastguard Worker                                  std::set<const CPDF_Dictionary*>* visited);
259*3ac0a46fSAndroid Build Coastguard Worker   bool ExecuteDocumentPageAction(const CPDF_Action& action,
260*3ac0a46fSAndroid Build Coastguard Worker                                  CPDF_AAction::AActionType type,
261*3ac0a46fSAndroid Build Coastguard Worker                                  std::set<const CPDF_Dictionary*>* visited);
262*3ac0a46fSAndroid Build Coastguard Worker   bool ExecuteFieldAction(const CPDF_Action& action,
263*3ac0a46fSAndroid Build Coastguard Worker                           CPDF_AAction::AActionType type,
264*3ac0a46fSAndroid Build Coastguard Worker                           CPDF_FormField* pFormField,
265*3ac0a46fSAndroid Build Coastguard Worker                           CFFL_FieldAction* data,
266*3ac0a46fSAndroid Build Coastguard Worker                           std::set<const CPDF_Dictionary*>* visited);
267*3ac0a46fSAndroid Build Coastguard Worker   void RunDocumentPageJavaScript(CPDF_AAction::AActionType type,
268*3ac0a46fSAndroid Build Coastguard Worker                                  const WideString& script);
269*3ac0a46fSAndroid Build Coastguard Worker   void RunDocumentOpenJavaScript(const WideString& sScriptName,
270*3ac0a46fSAndroid Build Coastguard Worker                                  const WideString& script);
271*3ac0a46fSAndroid Build Coastguard Worker   void RunFieldJavaScript(CPDF_FormField* pFormField,
272*3ac0a46fSAndroid Build Coastguard Worker                           CPDF_AAction::AActionType type,
273*3ac0a46fSAndroid Build Coastguard Worker                           CFFL_FieldAction* data,
274*3ac0a46fSAndroid Build Coastguard Worker                           const WideString& script);
275*3ac0a46fSAndroid Build Coastguard Worker   bool IsValidField(const CPDF_Dictionary* pFieldDict);
276*3ac0a46fSAndroid Build Coastguard Worker 
277*3ac0a46fSAndroid Build Coastguard Worker   UnownedPtr<FPDF_FORMFILLINFO> const m_pInfo;
278*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<IJS_Runtime> m_pIJSRuntime;
279*3ac0a46fSAndroid Build Coastguard Worker 
280*3ac0a46fSAndroid Build Coastguard Worker   // Iterator stability guarantees as provided by std::map<> required.
281*3ac0a46fSAndroid Build Coastguard Worker   std::map<IPDF_Page*, std::unique_ptr<CPDFSDK_PageView>> m_PageMap;
282*3ac0a46fSAndroid Build Coastguard Worker 
283*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<CPDFSDK_InteractiveForm> m_pInteractiveForm;
284*3ac0a46fSAndroid Build Coastguard Worker   ObservedPtr<CPDFSDK_Annot> m_pFocusAnnot;
285*3ac0a46fSAndroid Build Coastguard Worker   UnownedPtr<CPDF_Document> const m_pCPDFDoc;
286*3ac0a46fSAndroid Build Coastguard Worker   std::unique_ptr<CFFL_InteractiveFormFiller> m_pInteractiveFormFiller;
287*3ac0a46fSAndroid Build Coastguard Worker   bool m_bChangeMask = false;
288*3ac0a46fSAndroid Build Coastguard Worker   bool m_bBeingDestroyed = false;
289*3ac0a46fSAndroid Build Coastguard Worker 
290*3ac0a46fSAndroid Build Coastguard Worker   // Holds the list of focusable annot types.
291*3ac0a46fSAndroid Build Coastguard Worker   // Annotations of type WIDGET are by default focusable.
292*3ac0a46fSAndroid Build Coastguard Worker   std::vector<CPDF_Annot::Subtype> m_FocusableAnnotTypes = {
293*3ac0a46fSAndroid Build Coastguard Worker       CPDF_Annot::Subtype::WIDGET};
294*3ac0a46fSAndroid Build Coastguard Worker };
295*3ac0a46fSAndroid Build Coastguard Worker 
296*3ac0a46fSAndroid Build Coastguard Worker #endif  // FPDFSDK_CPDFSDK_FORMFILLENVIRONMENT_H_
297