• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #include "fxjs/xfa/cjx_eventpseudomodel.h"
8 
9 #include <vector>
10 
11 #include "fxjs/cfxjse_engine.h"
12 #include "fxjs/cfxjse_value.h"
13 #include "xfa/fxfa/cxfa_eventparam.h"
14 #include "xfa/fxfa/cxfa_ffnotify.h"
15 #include "xfa/fxfa/cxfa_ffwidgethandler.h"
16 #include "xfa/fxfa/parser/cscript_eventpseudomodel.h"
17 
18 namespace {
19 
StringProperty(CFXJSE_Value * pValue,WideString & wsValue,bool bSetting)20 void StringProperty(CFXJSE_Value* pValue, WideString& wsValue, bool bSetting) {
21   if (bSetting) {
22     wsValue = pValue->ToWideString();
23     return;
24   }
25   pValue->SetString(wsValue.UTF8Encode().AsStringView());
26 }
27 
InterProperty(CFXJSE_Value * pValue,int32_t & iValue,bool bSetting)28 void InterProperty(CFXJSE_Value* pValue, int32_t& iValue, bool bSetting) {
29   if (bSetting) {
30     iValue = pValue->ToInteger();
31     return;
32   }
33   pValue->SetInteger(iValue);
34 }
35 
BooleanProperty(CFXJSE_Value * pValue,bool & bValue,bool bSetting)36 void BooleanProperty(CFXJSE_Value* pValue, bool& bValue, bool bSetting) {
37   if (bSetting) {
38     bValue = pValue->ToBoolean();
39     return;
40   }
41   pValue->SetBoolean(bValue);
42 }
43 
44 }  // namespace
45 
46 const CJX_MethodSpec CJX_EventPseudoModel::MethodSpecs[] = {
47     {"emit", emit_static},
48     {"reset", reset_static}};
49 
CJX_EventPseudoModel(CScript_EventPseudoModel * model)50 CJX_EventPseudoModel::CJX_EventPseudoModel(CScript_EventPseudoModel* model)
51     : CJX_Object(model) {
52   DefineMethods(MethodSpecs, FX_ArraySize(MethodSpecs));
53 }
54 
~CJX_EventPseudoModel()55 CJX_EventPseudoModel::~CJX_EventPseudoModel() {}
56 
change(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)57 void CJX_EventPseudoModel::change(CFXJSE_Value* pValue,
58                                   bool bSetting,
59                                   XFA_Attribute eAttribute) {
60   Property(pValue, XFA_Event::Change, bSetting);
61 }
62 
commitKey(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)63 void CJX_EventPseudoModel::commitKey(CFXJSE_Value* pValue,
64                                      bool bSetting,
65                                      XFA_Attribute eAttribute) {
66   Property(pValue, XFA_Event::CommitKey, bSetting);
67 }
68 
fullText(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)69 void CJX_EventPseudoModel::fullText(CFXJSE_Value* pValue,
70                                     bool bSetting,
71                                     XFA_Attribute eAttribute) {
72   Property(pValue, XFA_Event::FullText, bSetting);
73 }
74 
keyDown(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)75 void CJX_EventPseudoModel::keyDown(CFXJSE_Value* pValue,
76                                    bool bSetting,
77                                    XFA_Attribute eAttribute) {
78   Property(pValue, XFA_Event::Keydown, bSetting);
79 }
80 
modifier(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)81 void CJX_EventPseudoModel::modifier(CFXJSE_Value* pValue,
82                                     bool bSetting,
83                                     XFA_Attribute eAttribute) {
84   Property(pValue, XFA_Event::Modifier, bSetting);
85 }
86 
newContentType(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)87 void CJX_EventPseudoModel::newContentType(CFXJSE_Value* pValue,
88                                           bool bSetting,
89                                           XFA_Attribute eAttribute) {
90   Property(pValue, XFA_Event::NewContentType, bSetting);
91 }
92 
newText(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)93 void CJX_EventPseudoModel::newText(CFXJSE_Value* pValue,
94                                    bool bSetting,
95                                    XFA_Attribute eAttribute) {
96   Property(pValue, XFA_Event::NewText, bSetting);
97 }
98 
prevContentType(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)99 void CJX_EventPseudoModel::prevContentType(CFXJSE_Value* pValue,
100                                            bool bSetting,
101                                            XFA_Attribute eAttribute) {
102   Property(pValue, XFA_Event::PreviousContentType, bSetting);
103 }
104 
prevText(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)105 void CJX_EventPseudoModel::prevText(CFXJSE_Value* pValue,
106                                     bool bSetting,
107                                     XFA_Attribute eAttribute) {
108   Property(pValue, XFA_Event::PreviousText, bSetting);
109 }
110 
reenter(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)111 void CJX_EventPseudoModel::reenter(CFXJSE_Value* pValue,
112                                    bool bSetting,
113                                    XFA_Attribute eAttribute) {
114   Property(pValue, XFA_Event::Reenter, bSetting);
115 }
116 
selEnd(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)117 void CJX_EventPseudoModel::selEnd(CFXJSE_Value* pValue,
118                                   bool bSetting,
119                                   XFA_Attribute eAttribute) {
120   Property(pValue, XFA_Event::SelectionEnd, bSetting);
121 }
122 
selStart(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)123 void CJX_EventPseudoModel::selStart(CFXJSE_Value* pValue,
124                                     bool bSetting,
125                                     XFA_Attribute eAttribute) {
126   Property(pValue, XFA_Event::SelectionStart, bSetting);
127 }
128 
shift(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)129 void CJX_EventPseudoModel::shift(CFXJSE_Value* pValue,
130                                  bool bSetting,
131                                  XFA_Attribute eAttribute) {
132   Property(pValue, XFA_Event::Shift, bSetting);
133 }
134 
soapFaultCode(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)135 void CJX_EventPseudoModel::soapFaultCode(CFXJSE_Value* pValue,
136                                          bool bSetting,
137                                          XFA_Attribute eAttribute) {
138   Property(pValue, XFA_Event::SoapFaultCode, bSetting);
139 }
140 
soapFaultString(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)141 void CJX_EventPseudoModel::soapFaultString(CFXJSE_Value* pValue,
142                                            bool bSetting,
143                                            XFA_Attribute eAttribute) {
144   Property(pValue, XFA_Event::SoapFaultString, bSetting);
145 }
146 
target(CFXJSE_Value * pValue,bool bSetting,XFA_Attribute eAttribute)147 void CJX_EventPseudoModel::target(CFXJSE_Value* pValue,
148                                   bool bSetting,
149                                   XFA_Attribute eAttribute) {
150   Property(pValue, XFA_Event::Target, bSetting);
151 }
152 
emit(CJS_V8 * runtime,const std::vector<v8::Local<v8::Value>> & params)153 CJS_Return CJX_EventPseudoModel::emit(
154     CJS_V8* runtime,
155     const std::vector<v8::Local<v8::Value>>& params) {
156   CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext();
157   if (!pScriptContext)
158     return CJS_Return(true);
159 
160   CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
161   if (!pEventParam)
162     return CJS_Return(true);
163 
164   CXFA_FFNotify* pNotify = GetDocument()->GetNotify();
165   if (!pNotify)
166     return CJS_Return(true);
167 
168   CXFA_FFWidgetHandler* pWidgetHandler = pNotify->GetWidgetHandler();
169   if (!pWidgetHandler)
170     return CJS_Return(true);
171 
172   pWidgetHandler->ProcessEvent(pEventParam->m_pTarget, pEventParam);
173   return CJS_Return(true);
174 }
175 
reset(CJS_V8 * runtime,const std::vector<v8::Local<v8::Value>> & params)176 CJS_Return CJX_EventPseudoModel::reset(
177     CJS_V8* runtime,
178     const std::vector<v8::Local<v8::Value>>& params) {
179   CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext();
180   if (!pScriptContext)
181     return CJS_Return(true);
182 
183   CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
184   if (!pEventParam)
185     return CJS_Return(true);
186 
187   pEventParam->Reset();
188   return CJS_Return(true);
189 }
190 
Property(CFXJSE_Value * pValue,XFA_Event dwFlag,bool bSetting)191 void CJX_EventPseudoModel::Property(CFXJSE_Value* pValue,
192                                     XFA_Event dwFlag,
193                                     bool bSetting) {
194   CFXJSE_Engine* pScriptContext = GetDocument()->GetScriptContext();
195   if (!pScriptContext)
196     return;
197 
198   CXFA_EventParam* pEventParam = pScriptContext->GetEventParam();
199   if (!pEventParam)
200     return;
201 
202   switch (dwFlag) {
203     case XFA_Event::CancelAction:
204       BooleanProperty(pValue, pEventParam->m_bCancelAction, bSetting);
205       break;
206     case XFA_Event::Change:
207       StringProperty(pValue, pEventParam->m_wsChange, bSetting);
208       break;
209     case XFA_Event::CommitKey:
210       InterProperty(pValue, pEventParam->m_iCommitKey, bSetting);
211       break;
212     case XFA_Event::FullText:
213       StringProperty(pValue, pEventParam->m_wsFullText, bSetting);
214       break;
215     case XFA_Event::Keydown:
216       BooleanProperty(pValue, pEventParam->m_bKeyDown, bSetting);
217       break;
218     case XFA_Event::Modifier:
219       BooleanProperty(pValue, pEventParam->m_bModifier, bSetting);
220       break;
221     case XFA_Event::NewContentType:
222       StringProperty(pValue, pEventParam->m_wsNewContentType, bSetting);
223       break;
224     case XFA_Event::NewText:
225       StringProperty(pValue, pEventParam->m_wsNewText, bSetting);
226       break;
227     case XFA_Event::PreviousContentType:
228       StringProperty(pValue, pEventParam->m_wsPrevContentType, bSetting);
229       break;
230     case XFA_Event::PreviousText:
231       StringProperty(pValue, pEventParam->m_wsPrevText, bSetting);
232       break;
233     case XFA_Event::Reenter:
234       BooleanProperty(pValue, pEventParam->m_bReenter, bSetting);
235       break;
236     case XFA_Event::SelectionEnd:
237       InterProperty(pValue, pEventParam->m_iSelEnd, bSetting);
238       break;
239     case XFA_Event::SelectionStart:
240       InterProperty(pValue, pEventParam->m_iSelStart, bSetting);
241       break;
242     case XFA_Event::Shift:
243       BooleanProperty(pValue, pEventParam->m_bShift, bSetting);
244       break;
245     case XFA_Event::SoapFaultCode:
246       StringProperty(pValue, pEventParam->m_wsSoapFaultCode, bSetting);
247       break;
248     case XFA_Event::SoapFaultString:
249       StringProperty(pValue, pEventParam->m_wsSoapFaultString, bSetting);
250       break;
251     case XFA_Event::Target:
252       break;
253     default:
254       break;
255   }
256 }
257