xref: /aosp_15_r20/external/pdfium/fxjs/cjs_event_context.cpp (revision 3ac0a46f773bac49fa9476ec2b1cf3f8da5ec3a4)
1*3ac0a46fSAndroid Build Coastguard Worker // Copyright 2017 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 "fxjs/cjs_event_context.h"
8*3ac0a46fSAndroid Build Coastguard Worker 
9*3ac0a46fSAndroid Build Coastguard Worker #include "core/fpdfdoc/cpdf_formfield.h"
10*3ac0a46fSAndroid Build Coastguard Worker #include "core/fxcrt/autorestorer.h"
11*3ac0a46fSAndroid Build Coastguard Worker #include "fpdfsdk/cpdfsdk_formfillenvironment.h"
12*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_field.h"
13*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/cjs_runtime.h"
14*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_define.h"
15*3ac0a46fSAndroid Build Coastguard Worker #include "fxjs/js_resources.h"
16*3ac0a46fSAndroid Build Coastguard Worker #include "third_party/base/check.h"
17*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-context.h"
18*3ac0a46fSAndroid Build Coastguard Worker #include "v8/include/v8-isolate.h"
19*3ac0a46fSAndroid Build Coastguard Worker 
CJS_EventContext(CJS_Runtime * pRuntime)20*3ac0a46fSAndroid Build Coastguard Worker CJS_EventContext::CJS_EventContext(CJS_Runtime* pRuntime)
21*3ac0a46fSAndroid Build Coastguard Worker     : m_pRuntime(pRuntime), m_pFormFillEnv(pRuntime->GetFormFillEnv()) {}
22*3ac0a46fSAndroid Build Coastguard Worker 
23*3ac0a46fSAndroid Build Coastguard Worker CJS_EventContext::~CJS_EventContext() = default;
24*3ac0a46fSAndroid Build Coastguard Worker 
RunScript(const WideString & script)25*3ac0a46fSAndroid Build Coastguard Worker absl::optional<IJS_Runtime::JS_Error> CJS_EventContext::RunScript(
26*3ac0a46fSAndroid Build Coastguard Worker     const WideString& script) {
27*3ac0a46fSAndroid Build Coastguard Worker   v8::Isolate::Scope isolate_scope(m_pRuntime->GetIsolate());
28*3ac0a46fSAndroid Build Coastguard Worker   v8::HandleScope handle_scope(m_pRuntime->GetIsolate());
29*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Context> context = m_pRuntime->GetV8Context();
30*3ac0a46fSAndroid Build Coastguard Worker   v8::Context::Scope context_scope(context);
31*3ac0a46fSAndroid Build Coastguard Worker 
32*3ac0a46fSAndroid Build Coastguard Worker   if (m_bBusy) {
33*3ac0a46fSAndroid Build Coastguard Worker     return IJS_Runtime::JS_Error(1, 1,
34*3ac0a46fSAndroid Build Coastguard Worker                                  JSGetStringFromID(JSMessage::kBusyError));
35*3ac0a46fSAndroid Build Coastguard Worker   }
36*3ac0a46fSAndroid Build Coastguard Worker 
37*3ac0a46fSAndroid Build Coastguard Worker   AutoRestorer<bool> restorer(&m_bBusy);
38*3ac0a46fSAndroid Build Coastguard Worker   m_bBusy = true;
39*3ac0a46fSAndroid Build Coastguard Worker 
40*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(IsValid());
41*3ac0a46fSAndroid Build Coastguard Worker   CJS_Runtime::FieldEvent event(TargetName(), EventKind());
42*3ac0a46fSAndroid Build Coastguard Worker   if (!m_pRuntime->AddEventToSet(event)) {
43*3ac0a46fSAndroid Build Coastguard Worker     return IJS_Runtime::JS_Error(
44*3ac0a46fSAndroid Build Coastguard Worker         1, 1, JSGetStringFromID(JSMessage::kDuplicateEventError));
45*3ac0a46fSAndroid Build Coastguard Worker   }
46*3ac0a46fSAndroid Build Coastguard Worker 
47*3ac0a46fSAndroid Build Coastguard Worker   absl::optional<IJS_Runtime::JS_Error> err;
48*3ac0a46fSAndroid Build Coastguard Worker   if (script.GetLength() > 0)
49*3ac0a46fSAndroid Build Coastguard Worker     err = m_pRuntime->ExecuteScript(script);
50*3ac0a46fSAndroid Build Coastguard Worker 
51*3ac0a46fSAndroid Build Coastguard Worker   m_pRuntime->RemoveEventFromSet(event);
52*3ac0a46fSAndroid Build Coastguard Worker   Destroy();
53*3ac0a46fSAndroid Build Coastguard Worker   return err;
54*3ac0a46fSAndroid Build Coastguard Worker }
55*3ac0a46fSAndroid Build Coastguard Worker 
SourceField()56*3ac0a46fSAndroid Build Coastguard Worker CJS_Field* CJS_EventContext::SourceField() {
57*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pDocObj = m_pRuntime->NewFXJSBoundObject(
58*3ac0a46fSAndroid Build Coastguard Worker       CJS_Document::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
59*3ac0a46fSAndroid Build Coastguard Worker   if (pDocObj.IsEmpty())
60*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
61*3ac0a46fSAndroid Build Coastguard Worker 
62*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pFieldObj = m_pRuntime->NewFXJSBoundObject(
63*3ac0a46fSAndroid Build Coastguard Worker       CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
64*3ac0a46fSAndroid Build Coastguard Worker   if (pFieldObj.IsEmpty())
65*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
66*3ac0a46fSAndroid Build Coastguard Worker 
67*3ac0a46fSAndroid Build Coastguard Worker   auto* pFormFillEnv = GetFormFillEnv();
68*3ac0a46fSAndroid Build Coastguard Worker   auto* pJSDocument = static_cast<CJS_Document*>(
69*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(m_pRuntime->GetIsolate(), pDocObj));
70*3ac0a46fSAndroid Build Coastguard Worker   pJSDocument->SetFormFillEnv(pFormFillEnv);
71*3ac0a46fSAndroid Build Coastguard Worker 
72*3ac0a46fSAndroid Build Coastguard Worker   auto* pJSField = static_cast<CJS_Field*>(
73*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(m_pRuntime->GetIsolate(), pFieldObj));
74*3ac0a46fSAndroid Build Coastguard Worker   pJSField->AttachField(pJSDocument, SourceName());
75*3ac0a46fSAndroid Build Coastguard Worker   return pJSField;
76*3ac0a46fSAndroid Build Coastguard Worker }
77*3ac0a46fSAndroid Build Coastguard Worker 
TargetField()78*3ac0a46fSAndroid Build Coastguard Worker CJS_Field* CJS_EventContext::TargetField() {
79*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pDocObj = m_pRuntime->NewFXJSBoundObject(
80*3ac0a46fSAndroid Build Coastguard Worker       CJS_Document::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
81*3ac0a46fSAndroid Build Coastguard Worker   if (pDocObj.IsEmpty())
82*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
83*3ac0a46fSAndroid Build Coastguard Worker 
84*3ac0a46fSAndroid Build Coastguard Worker   v8::Local<v8::Object> pFieldObj = m_pRuntime->NewFXJSBoundObject(
85*3ac0a46fSAndroid Build Coastguard Worker       CJS_Field::GetObjDefnID(), FXJSOBJTYPE_DYNAMIC);
86*3ac0a46fSAndroid Build Coastguard Worker   if (pFieldObj.IsEmpty())
87*3ac0a46fSAndroid Build Coastguard Worker     return nullptr;
88*3ac0a46fSAndroid Build Coastguard Worker 
89*3ac0a46fSAndroid Build Coastguard Worker   auto* pFormFillEnv = GetFormFillEnv();
90*3ac0a46fSAndroid Build Coastguard Worker   auto* pJSDocument = static_cast<CJS_Document*>(
91*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(m_pRuntime->GetIsolate(), pDocObj));
92*3ac0a46fSAndroid Build Coastguard Worker   pJSDocument->SetFormFillEnv(pFormFillEnv);
93*3ac0a46fSAndroid Build Coastguard Worker 
94*3ac0a46fSAndroid Build Coastguard Worker   auto* pJSField = static_cast<CJS_Field*>(
95*3ac0a46fSAndroid Build Coastguard Worker       CFXJS_Engine::GetObjectPrivate(m_pRuntime->GetIsolate(), pFieldObj));
96*3ac0a46fSAndroid Build Coastguard Worker   pJSField->AttachField(pJSDocument, TargetName());
97*3ac0a46fSAndroid Build Coastguard Worker   return pJSField;
98*3ac0a46fSAndroid Build Coastguard Worker }
99*3ac0a46fSAndroid Build Coastguard Worker 
OnDoc_Open(const WideString & strTargetName)100*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnDoc_Open(const WideString& strTargetName) {
101*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kDocOpen);
102*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = strTargetName;
103*3ac0a46fSAndroid Build Coastguard Worker }
104*3ac0a46fSAndroid Build Coastguard Worker 
OnDoc_WillPrint()105*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnDoc_WillPrint() {
106*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kDocWillPrint);
107*3ac0a46fSAndroid Build Coastguard Worker }
108*3ac0a46fSAndroid Build Coastguard Worker 
OnDoc_DidPrint()109*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnDoc_DidPrint() {
110*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kDocDidPrint);
111*3ac0a46fSAndroid Build Coastguard Worker }
112*3ac0a46fSAndroid Build Coastguard Worker 
OnDoc_WillSave()113*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnDoc_WillSave() {
114*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kDocWillSave);
115*3ac0a46fSAndroid Build Coastguard Worker }
116*3ac0a46fSAndroid Build Coastguard Worker 
OnDoc_DidSave()117*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnDoc_DidSave() {
118*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kDocDidSave);
119*3ac0a46fSAndroid Build Coastguard Worker }
120*3ac0a46fSAndroid Build Coastguard Worker 
OnDoc_WillClose()121*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnDoc_WillClose() {
122*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kDocWillClose);
123*3ac0a46fSAndroid Build Coastguard Worker }
124*3ac0a46fSAndroid Build Coastguard Worker 
OnPage_Open()125*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnPage_Open() {
126*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kPageOpen);
127*3ac0a46fSAndroid Build Coastguard Worker }
128*3ac0a46fSAndroid Build Coastguard Worker 
OnPage_Close()129*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnPage_Close() {
130*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kPageClose);
131*3ac0a46fSAndroid Build Coastguard Worker }
132*3ac0a46fSAndroid Build Coastguard Worker 
OnPage_InView()133*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnPage_InView() {
134*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kPageInView);
135*3ac0a46fSAndroid Build Coastguard Worker }
136*3ac0a46fSAndroid Build Coastguard Worker 
OnPage_OutView()137*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnPage_OutView() {
138*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kPageOutView);
139*3ac0a46fSAndroid Build Coastguard Worker }
140*3ac0a46fSAndroid Build Coastguard Worker 
OnField_MouseEnter(bool bModifier,bool bShift,CPDF_FormField * pTarget)141*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_MouseEnter(bool bModifier,
142*3ac0a46fSAndroid Build Coastguard Worker                                           bool bShift,
143*3ac0a46fSAndroid Build Coastguard Worker                                           CPDF_FormField* pTarget) {
144*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldMouseEnter);
145*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
146*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
147*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
148*3ac0a46fSAndroid Build Coastguard Worker }
149*3ac0a46fSAndroid Build Coastguard Worker 
OnField_MouseExit(bool bModifier,bool bShift,CPDF_FormField * pTarget)150*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_MouseExit(bool bModifier,
151*3ac0a46fSAndroid Build Coastguard Worker                                          bool bShift,
152*3ac0a46fSAndroid Build Coastguard Worker                                          CPDF_FormField* pTarget) {
153*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldMouseExit);
154*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
155*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
156*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
157*3ac0a46fSAndroid Build Coastguard Worker }
158*3ac0a46fSAndroid Build Coastguard Worker 
OnField_MouseDown(bool bModifier,bool bShift,CPDF_FormField * pTarget)159*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_MouseDown(bool bModifier,
160*3ac0a46fSAndroid Build Coastguard Worker                                          bool bShift,
161*3ac0a46fSAndroid Build Coastguard Worker                                          CPDF_FormField* pTarget) {
162*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldMouseDown);
163*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
164*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
165*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
166*3ac0a46fSAndroid Build Coastguard Worker }
167*3ac0a46fSAndroid Build Coastguard Worker 
OnField_MouseUp(bool bModifier,bool bShift,CPDF_FormField * pTarget)168*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_MouseUp(bool bModifier,
169*3ac0a46fSAndroid Build Coastguard Worker                                        bool bShift,
170*3ac0a46fSAndroid Build Coastguard Worker                                        CPDF_FormField* pTarget) {
171*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldMouseUp);
172*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
173*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
174*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
175*3ac0a46fSAndroid Build Coastguard Worker }
176*3ac0a46fSAndroid Build Coastguard Worker 
OnField_Focus(bool bModifier,bool bShift,CPDF_FormField * pTarget,WideString * pValue)177*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_Focus(bool bModifier,
178*3ac0a46fSAndroid Build Coastguard Worker                                      bool bShift,
179*3ac0a46fSAndroid Build Coastguard Worker                                      CPDF_FormField* pTarget,
180*3ac0a46fSAndroid Build Coastguard Worker                                      WideString* pValue) {
181*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pValue);
182*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldFocus);
183*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
184*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
185*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
186*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = pValue;
187*3ac0a46fSAndroid Build Coastguard Worker }
188*3ac0a46fSAndroid Build Coastguard Worker 
OnField_Blur(bool bModifier,bool bShift,CPDF_FormField * pTarget,WideString * pValue)189*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_Blur(bool bModifier,
190*3ac0a46fSAndroid Build Coastguard Worker                                     bool bShift,
191*3ac0a46fSAndroid Build Coastguard Worker                                     CPDF_FormField* pTarget,
192*3ac0a46fSAndroid Build Coastguard Worker                                     WideString* pValue) {
193*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pValue);
194*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldBlur);
195*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
196*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
197*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
198*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = pValue;
199*3ac0a46fSAndroid Build Coastguard Worker }
200*3ac0a46fSAndroid Build Coastguard Worker 
OnField_Keystroke(WideString * strChange,const WideString & strChangeEx,bool KeyDown,bool bModifier,int * pSelEnd,int * pSelStart,bool bShift,CPDF_FormField * pTarget,WideString * pValue,bool bWillCommit,bool bFieldFull,bool * pbRc)201*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_Keystroke(WideString* strChange,
202*3ac0a46fSAndroid Build Coastguard Worker                                          const WideString& strChangeEx,
203*3ac0a46fSAndroid Build Coastguard Worker                                          bool KeyDown,
204*3ac0a46fSAndroid Build Coastguard Worker                                          bool bModifier,
205*3ac0a46fSAndroid Build Coastguard Worker                                          int* pSelEnd,
206*3ac0a46fSAndroid Build Coastguard Worker                                          int* pSelStart,
207*3ac0a46fSAndroid Build Coastguard Worker                                          bool bShift,
208*3ac0a46fSAndroid Build Coastguard Worker                                          CPDF_FormField* pTarget,
209*3ac0a46fSAndroid Build Coastguard Worker                                          WideString* pValue,
210*3ac0a46fSAndroid Build Coastguard Worker                                          bool bWillCommit,
211*3ac0a46fSAndroid Build Coastguard Worker                                          bool bFieldFull,
212*3ac0a46fSAndroid Build Coastguard Worker                                          bool* pbRc) {
213*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pValue);
214*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pbRc);
215*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pSelStart);
216*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pSelEnd);
217*3ac0a46fSAndroid Build Coastguard Worker 
218*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldKeystroke);
219*3ac0a46fSAndroid Build Coastguard Worker   m_nCommitKey = 0;
220*3ac0a46fSAndroid Build Coastguard Worker   m_pWideStrChange = strChange;
221*3ac0a46fSAndroid Build Coastguard Worker   m_WideStrChangeEx = strChangeEx;
222*3ac0a46fSAndroid Build Coastguard Worker   m_bKeyDown = KeyDown;
223*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
224*3ac0a46fSAndroid Build Coastguard Worker   m_pISelEnd = pSelEnd;
225*3ac0a46fSAndroid Build Coastguard Worker   m_pISelStart = pSelStart;
226*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
227*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
228*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = pValue;
229*3ac0a46fSAndroid Build Coastguard Worker   m_bWillCommit = bWillCommit;
230*3ac0a46fSAndroid Build Coastguard Worker   m_pbRc = pbRc;
231*3ac0a46fSAndroid Build Coastguard Worker   m_bFieldFull = bFieldFull;
232*3ac0a46fSAndroid Build Coastguard Worker }
233*3ac0a46fSAndroid Build Coastguard Worker 
OnField_Validate(WideString * strChange,const WideString & strChangeEx,bool bKeyDown,bool bModifier,bool bShift,CPDF_FormField * pTarget,WideString * pValue,bool * pbRc)234*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_Validate(WideString* strChange,
235*3ac0a46fSAndroid Build Coastguard Worker                                         const WideString& strChangeEx,
236*3ac0a46fSAndroid Build Coastguard Worker                                         bool bKeyDown,
237*3ac0a46fSAndroid Build Coastguard Worker                                         bool bModifier,
238*3ac0a46fSAndroid Build Coastguard Worker                                         bool bShift,
239*3ac0a46fSAndroid Build Coastguard Worker                                         CPDF_FormField* pTarget,
240*3ac0a46fSAndroid Build Coastguard Worker                                         WideString* pValue,
241*3ac0a46fSAndroid Build Coastguard Worker                                         bool* pbRc) {
242*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pValue);
243*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pbRc);
244*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldValidate);
245*3ac0a46fSAndroid Build Coastguard Worker   m_pWideStrChange = strChange;
246*3ac0a46fSAndroid Build Coastguard Worker   m_WideStrChangeEx = strChangeEx;
247*3ac0a46fSAndroid Build Coastguard Worker   m_bKeyDown = bKeyDown;
248*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = bModifier;
249*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = bShift;
250*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
251*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = pValue;
252*3ac0a46fSAndroid Build Coastguard Worker   m_pbRc = pbRc;
253*3ac0a46fSAndroid Build Coastguard Worker }
254*3ac0a46fSAndroid Build Coastguard Worker 
OnField_Calculate(CPDF_FormField * pSource,CPDF_FormField * pTarget,WideString * pValue,bool * pRc)255*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_Calculate(CPDF_FormField* pSource,
256*3ac0a46fSAndroid Build Coastguard Worker                                          CPDF_FormField* pTarget,
257*3ac0a46fSAndroid Build Coastguard Worker                                          WideString* pValue,
258*3ac0a46fSAndroid Build Coastguard Worker                                          bool* pRc) {
259*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pValue);
260*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pRc);
261*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldCalculate);
262*3ac0a46fSAndroid Build Coastguard Worker   if (pSource)
263*3ac0a46fSAndroid Build Coastguard Worker     m_strSourceName = pSource->GetFullName();
264*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
265*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = pValue;
266*3ac0a46fSAndroid Build Coastguard Worker   m_pbRc = pRc;
267*3ac0a46fSAndroid Build Coastguard Worker }
268*3ac0a46fSAndroid Build Coastguard Worker 
OnField_Format(CPDF_FormField * pTarget,WideString * pValue)269*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnField_Format(CPDF_FormField* pTarget,
270*3ac0a46fSAndroid Build Coastguard Worker                                       WideString* pValue) {
271*3ac0a46fSAndroid Build Coastguard Worker   DCHECK(pValue);
272*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kFieldFormat);
273*3ac0a46fSAndroid Build Coastguard Worker   m_nCommitKey = 0;
274*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName = pTarget->GetFullName();
275*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = pValue;
276*3ac0a46fSAndroid Build Coastguard Worker   m_bWillCommit = true;
277*3ac0a46fSAndroid Build Coastguard Worker }
278*3ac0a46fSAndroid Build Coastguard Worker 
OnExternal_Exec()279*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::OnExternal_Exec() {
280*3ac0a46fSAndroid Build Coastguard Worker   Initialize(Kind::kExternalExec);
281*3ac0a46fSAndroid Build Coastguard Worker }
282*3ac0a46fSAndroid Build Coastguard Worker 
Initialize(Kind kind)283*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::Initialize(Kind kind) {
284*3ac0a46fSAndroid Build Coastguard Worker   m_eKind = kind;
285*3ac0a46fSAndroid Build Coastguard Worker   m_strTargetName.clear();
286*3ac0a46fSAndroid Build Coastguard Worker   m_strSourceName.clear();
287*3ac0a46fSAndroid Build Coastguard Worker   m_pWideStrChange = nullptr;
288*3ac0a46fSAndroid Build Coastguard Worker   m_WideStrChangeDu.clear();
289*3ac0a46fSAndroid Build Coastguard Worker   m_WideStrChangeEx.clear();
290*3ac0a46fSAndroid Build Coastguard Worker   m_nCommitKey = -1;
291*3ac0a46fSAndroid Build Coastguard Worker   m_bKeyDown = false;
292*3ac0a46fSAndroid Build Coastguard Worker   m_bModifier = false;
293*3ac0a46fSAndroid Build Coastguard Worker   m_bShift = false;
294*3ac0a46fSAndroid Build Coastguard Worker   m_pISelEnd = nullptr;
295*3ac0a46fSAndroid Build Coastguard Worker   m_nSelEndDu = 0;
296*3ac0a46fSAndroid Build Coastguard Worker   m_pISelStart = nullptr;
297*3ac0a46fSAndroid Build Coastguard Worker   m_nSelStartDu = 0;
298*3ac0a46fSAndroid Build Coastguard Worker   m_bWillCommit = false;
299*3ac0a46fSAndroid Build Coastguard Worker   m_pValue = nullptr;
300*3ac0a46fSAndroid Build Coastguard Worker   m_bFieldFull = false;
301*3ac0a46fSAndroid Build Coastguard Worker   m_pbRc = nullptr;
302*3ac0a46fSAndroid Build Coastguard Worker   m_bRcDu = false;
303*3ac0a46fSAndroid Build Coastguard Worker   m_bValid = true;
304*3ac0a46fSAndroid Build Coastguard Worker }
305*3ac0a46fSAndroid Build Coastguard Worker 
Destroy()306*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::Destroy() {
307*3ac0a46fSAndroid Build Coastguard Worker   m_bValid = false;
308*3ac0a46fSAndroid Build Coastguard Worker }
309*3ac0a46fSAndroid Build Coastguard Worker 
IsUserGesture() const310*3ac0a46fSAndroid Build Coastguard Worker bool CJS_EventContext::IsUserGesture() const {
311*3ac0a46fSAndroid Build Coastguard Worker   switch (m_eKind) {
312*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseDown:
313*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseUp:
314*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldKeystroke:
315*3ac0a46fSAndroid Build Coastguard Worker       return true;
316*3ac0a46fSAndroid Build Coastguard Worker     default:
317*3ac0a46fSAndroid Build Coastguard Worker       return false;
318*3ac0a46fSAndroid Build Coastguard Worker   }
319*3ac0a46fSAndroid Build Coastguard Worker }
320*3ac0a46fSAndroid Build Coastguard Worker 
Change()321*3ac0a46fSAndroid Build Coastguard Worker WideString& CJS_EventContext::Change() {
322*3ac0a46fSAndroid Build Coastguard Worker   return m_pWideStrChange ? *m_pWideStrChange : m_WideStrChangeDu;
323*3ac0a46fSAndroid Build Coastguard Worker }
324*3ac0a46fSAndroid Build Coastguard Worker 
Name() const325*3ac0a46fSAndroid Build Coastguard Worker ByteStringView CJS_EventContext::Name() const {
326*3ac0a46fSAndroid Build Coastguard Worker   switch (m_eKind) {
327*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocDidPrint:
328*3ac0a46fSAndroid Build Coastguard Worker       return "DidPrint";
329*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocDidSave:
330*3ac0a46fSAndroid Build Coastguard Worker       return "DidSave";
331*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocOpen:
332*3ac0a46fSAndroid Build Coastguard Worker       return "Open";
333*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocWillClose:
334*3ac0a46fSAndroid Build Coastguard Worker       return "WillClose";
335*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocWillPrint:
336*3ac0a46fSAndroid Build Coastguard Worker       return "WillPrint";
337*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocWillSave:
338*3ac0a46fSAndroid Build Coastguard Worker       return "WillSave";
339*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kExternalExec:
340*3ac0a46fSAndroid Build Coastguard Worker       return "Exec";
341*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldFocus:
342*3ac0a46fSAndroid Build Coastguard Worker       return "Focus";
343*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldBlur:
344*3ac0a46fSAndroid Build Coastguard Worker       return "Blur";
345*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseDown:
346*3ac0a46fSAndroid Build Coastguard Worker       return "Mouse Down";
347*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseUp:
348*3ac0a46fSAndroid Build Coastguard Worker       return "Mouse Up";
349*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseEnter:
350*3ac0a46fSAndroid Build Coastguard Worker       return "Mouse Enter";
351*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseExit:
352*3ac0a46fSAndroid Build Coastguard Worker       return "Mouse Exit";
353*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldCalculate:
354*3ac0a46fSAndroid Build Coastguard Worker       return "Calculate";
355*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldFormat:
356*3ac0a46fSAndroid Build Coastguard Worker       return "Format";
357*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldKeystroke:
358*3ac0a46fSAndroid Build Coastguard Worker       return "Keystroke";
359*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldValidate:
360*3ac0a46fSAndroid Build Coastguard Worker       return "Validate";
361*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageOpen:
362*3ac0a46fSAndroid Build Coastguard Worker       return "Open";
363*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageClose:
364*3ac0a46fSAndroid Build Coastguard Worker       return "Close";
365*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageInView:
366*3ac0a46fSAndroid Build Coastguard Worker       return "InView";
367*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageOutView:
368*3ac0a46fSAndroid Build Coastguard Worker       return "OutView";
369*3ac0a46fSAndroid Build Coastguard Worker     default:
370*3ac0a46fSAndroid Build Coastguard Worker       return "";
371*3ac0a46fSAndroid Build Coastguard Worker   }
372*3ac0a46fSAndroid Build Coastguard Worker }
373*3ac0a46fSAndroid Build Coastguard Worker 
Type() const374*3ac0a46fSAndroid Build Coastguard Worker ByteStringView CJS_EventContext::Type() const {
375*3ac0a46fSAndroid Build Coastguard Worker   switch (m_eKind) {
376*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocDidPrint:
377*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocDidSave:
378*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocOpen:
379*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocWillClose:
380*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocWillPrint:
381*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kDocWillSave:
382*3ac0a46fSAndroid Build Coastguard Worker       return "Doc";
383*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kExternalExec:
384*3ac0a46fSAndroid Build Coastguard Worker       return "External";
385*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldBlur:
386*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldFocus:
387*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseDown:
388*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseUp:
389*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseEnter:
390*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldMouseExit:
391*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldCalculate:
392*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldFormat:
393*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldKeystroke:
394*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kFieldValidate:
395*3ac0a46fSAndroid Build Coastguard Worker       return "Field";
396*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageOpen:
397*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageClose:
398*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageInView:
399*3ac0a46fSAndroid Build Coastguard Worker     case Kind::kPageOutView:
400*3ac0a46fSAndroid Build Coastguard Worker       return "Page";
401*3ac0a46fSAndroid Build Coastguard Worker     default:
402*3ac0a46fSAndroid Build Coastguard Worker       return "";
403*3ac0a46fSAndroid Build Coastguard Worker   }
404*3ac0a46fSAndroid Build Coastguard Worker }
405*3ac0a46fSAndroid Build Coastguard Worker 
Rc()406*3ac0a46fSAndroid Build Coastguard Worker bool& CJS_EventContext::Rc() {
407*3ac0a46fSAndroid Build Coastguard Worker   return m_pbRc ? *m_pbRc : m_bRcDu;
408*3ac0a46fSAndroid Build Coastguard Worker }
409*3ac0a46fSAndroid Build Coastguard Worker 
SelEnd() const410*3ac0a46fSAndroid Build Coastguard Worker int CJS_EventContext::SelEnd() const {
411*3ac0a46fSAndroid Build Coastguard Worker   return m_pISelEnd ? *m_pISelEnd : m_nSelEndDu;
412*3ac0a46fSAndroid Build Coastguard Worker }
413*3ac0a46fSAndroid Build Coastguard Worker 
SelStart() const414*3ac0a46fSAndroid Build Coastguard Worker int CJS_EventContext::SelStart() const {
415*3ac0a46fSAndroid Build Coastguard Worker   return m_pISelStart ? *m_pISelStart : m_nSelStartDu;
416*3ac0a46fSAndroid Build Coastguard Worker }
417*3ac0a46fSAndroid Build Coastguard Worker 
SetSelEnd(int value)418*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::SetSelEnd(int value) {
419*3ac0a46fSAndroid Build Coastguard Worker   int& target = m_pISelEnd ? *m_pISelEnd : m_nSelEndDu;
420*3ac0a46fSAndroid Build Coastguard Worker   target = value;
421*3ac0a46fSAndroid Build Coastguard Worker }
422*3ac0a46fSAndroid Build Coastguard Worker 
SetSelStart(int value)423*3ac0a46fSAndroid Build Coastguard Worker void CJS_EventContext::SetSelStart(int value) {
424*3ac0a46fSAndroid Build Coastguard Worker   int& target = m_pISelStart ? *m_pISelStart : m_nSelStartDu;
425*3ac0a46fSAndroid Build Coastguard Worker   target = value;
426*3ac0a46fSAndroid Build Coastguard Worker }
427