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