1 // Copyright 2014 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 "event.h"
8 
9 #include "Field.h"
10 #include "JS_Context.h"
11 #include "JS_Define.h"
12 #include "JS_EventHandler.h"
13 #include "JS_Object.h"
14 #include "JS_Value.h"
15 #include "fpdfsdk/include/javascript/IJavaScript.h"
16 
17 /* -------------------------- event -------------------------- */
18 
19 BEGIN_JS_STATIC_CONST(CJS_Event)
END_JS_STATIC_CONST()20 END_JS_STATIC_CONST()
21 
22 BEGIN_JS_STATIC_PROP(CJS_Event)
23 JS_STATIC_PROP_ENTRY(change)
24 JS_STATIC_PROP_ENTRY(changeEx)
25 JS_STATIC_PROP_ENTRY(commitKey)
26 JS_STATIC_PROP_ENTRY(fieldFull)
27 JS_STATIC_PROP_ENTRY(keyDown)
28 JS_STATIC_PROP_ENTRY(modifier)
29 JS_STATIC_PROP_ENTRY(name)
30 JS_STATIC_PROP_ENTRY(rc)
31 JS_STATIC_PROP_ENTRY(richChange)
32 JS_STATIC_PROP_ENTRY(richChangeEx)
33 JS_STATIC_PROP_ENTRY(richValue)
34 JS_STATIC_PROP_ENTRY(selEnd)
35 JS_STATIC_PROP_ENTRY(selStart)
36 JS_STATIC_PROP_ENTRY(shift)
37 JS_STATIC_PROP_ENTRY(source)
38 JS_STATIC_PROP_ENTRY(target)
39 JS_STATIC_PROP_ENTRY(targetName)
40 JS_STATIC_PROP_ENTRY(type)
41 JS_STATIC_PROP_ENTRY(value)
42 JS_STATIC_PROP_ENTRY(willCommit)
43 END_JS_STATIC_PROP()
44 
45 BEGIN_JS_STATIC_METHOD(CJS_Event)
46 END_JS_STATIC_METHOD()
47 
48 IMPLEMENT_JS_CLASS(CJS_Event, event)
49 
50 event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {}
51 
~event()52 event::~event() {
53 }
54 
change(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)55 FX_BOOL event::change(IJS_Context* cc,
56                       CJS_PropValue& vp,
57                       CFX_WideString& sError) {
58   CJS_Context* pContext = (CJS_Context*)cc;
59   CJS_EventHandler* pEvent = pContext->GetEventHandler();
60   CFX_WideString& wChange = pEvent->Change();
61   if (vp.IsSetting()) {
62     if (vp.GetType() == CJS_Value::VT_string)
63       vp >> wChange;
64   } else {
65     vp << wChange;
66   }
67   return TRUE;
68 }
69 
changeEx(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)70 FX_BOOL event::changeEx(IJS_Context* cc,
71                         CJS_PropValue& vp,
72                         CFX_WideString& sError) {
73   if (!vp.IsGetting())
74     return FALSE;
75 
76   CJS_Context* pContext = (CJS_Context*)cc;
77   CJS_EventHandler* pEvent = pContext->GetEventHandler();
78 
79   vp << pEvent->ChangeEx();
80   return TRUE;
81 }
82 
commitKey(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)83 FX_BOOL event::commitKey(IJS_Context* cc,
84                          CJS_PropValue& vp,
85                          CFX_WideString& sError) {
86   if (!vp.IsGetting())
87     return FALSE;
88 
89   CJS_Context* pContext = (CJS_Context*)cc;
90   CJS_EventHandler* pEvent = pContext->GetEventHandler();
91 
92   vp << pEvent->CommitKey();
93   return TRUE;
94 }
95 
fieldFull(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)96 FX_BOOL event::fieldFull(IJS_Context* cc,
97                          CJS_PropValue& vp,
98                          CFX_WideString& sError) {
99   CJS_Context* pContext = (CJS_Context*)cc;
100   CJS_EventHandler* pEvent = pContext->GetEventHandler();
101 
102   if (!vp.IsGetting() &&
103       wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
104     return FALSE;
105 
106   if (pEvent->FieldFull())
107     vp << TRUE;
108   else
109     vp << FALSE;
110   return TRUE;
111 }
112 
keyDown(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)113 FX_BOOL event::keyDown(IJS_Context* cc,
114                        CJS_PropValue& vp,
115                        CFX_WideString& sError) {
116   if (!vp.IsGetting())
117     return FALSE;
118 
119   CJS_Context* pContext = (CJS_Context*)cc;
120   CJS_EventHandler* pEvent = pContext->GetEventHandler();
121 
122   if (pEvent->KeyDown())
123     vp << TRUE;
124   else
125     vp << FALSE;
126   return TRUE;
127 }
128 
modifier(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)129 FX_BOOL event::modifier(IJS_Context* cc,
130                         CJS_PropValue& vp,
131                         CFX_WideString& sError) {
132   if (!vp.IsGetting())
133     return FALSE;
134 
135   CJS_Context* pContext = (CJS_Context*)cc;
136   CJS_EventHandler* pEvent = pContext->GetEventHandler();
137 
138   if (pEvent->Modifier())
139     vp << TRUE;
140   else
141     vp << FALSE;
142   return TRUE;
143 }
144 
name(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)145 FX_BOOL event::name(IJS_Context* cc,
146                     CJS_PropValue& vp,
147                     CFX_WideString& sError) {
148   if (!vp.IsGetting())
149     return FALSE;
150 
151   CJS_Context* pContext = (CJS_Context*)cc;
152   CJS_EventHandler* pEvent = pContext->GetEventHandler();
153 
154   vp << pEvent->Name();
155   return TRUE;
156 }
157 
rc(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)158 FX_BOOL event::rc(IJS_Context* cc, CJS_PropValue& vp, CFX_WideString& sError) {
159   CJS_Context* pContext = (CJS_Context*)cc;
160   CJS_EventHandler* pEvent = pContext->GetEventHandler();
161 
162   FX_BOOL& bRc = pEvent->Rc();
163   if (vp.IsSetting()) {
164     vp >> bRc;
165   } else {
166     vp << bRc;
167   }
168   return TRUE;
169 }
170 
richChange(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)171 FX_BOOL event::richChange(IJS_Context* cc,
172                           CJS_PropValue& vp,
173                           CFX_WideString& sError) {
174   return TRUE;
175   if (vp.IsSetting()) {
176   } else {
177     ;
178   }
179   return TRUE;
180 }
181 
richChangeEx(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)182 FX_BOOL event::richChangeEx(IJS_Context* cc,
183                             CJS_PropValue& vp,
184                             CFX_WideString& sError) {
185   return TRUE;
186   if (vp.IsSetting()) {
187   } else {
188     ;
189   }
190   return TRUE;
191 }
192 
richValue(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)193 FX_BOOL event::richValue(IJS_Context* cc,
194                          CJS_PropValue& vp,
195                          CFX_WideString& sError) {
196   return TRUE;
197   if (vp.IsSetting()) {
198   } else {
199     ;
200   }
201   return TRUE;
202 }
203 
selEnd(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)204 FX_BOOL event::selEnd(IJS_Context* cc,
205                       CJS_PropValue& vp,
206                       CFX_WideString& sError) {
207   CJS_Context* pContext = (CJS_Context*)cc;
208   CJS_EventHandler* pEvent = pContext->GetEventHandler();
209 
210   if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) {
211     return TRUE;
212   }
213 
214   int& iSelEnd = pEvent->SelEnd();
215   if (vp.IsSetting()) {
216     vp >> iSelEnd;
217   } else {
218     vp << iSelEnd;
219   }
220   return TRUE;
221 }
222 
selStart(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)223 FX_BOOL event::selStart(IJS_Context* cc,
224                         CJS_PropValue& vp,
225                         CFX_WideString& sError) {
226   CJS_Context* pContext = (CJS_Context*)cc;
227   CJS_EventHandler* pEvent = pContext->GetEventHandler();
228 
229   if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) {
230     return TRUE;
231   }
232   int& iSelStart = pEvent->SelStart();
233   if (vp.IsSetting()) {
234     vp >> iSelStart;
235   } else {
236     vp << iSelStart;
237   }
238   return TRUE;
239 }
240 
shift(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)241 FX_BOOL event::shift(IJS_Context* cc,
242                      CJS_PropValue& vp,
243                      CFX_WideString& sError) {
244   if (!vp.IsGetting())
245     return FALSE;
246 
247   CJS_Context* pContext = (CJS_Context*)cc;
248   CJS_EventHandler* pEvent = pContext->GetEventHandler();
249 
250   if (pEvent->Shift())
251     vp << TRUE;
252   else
253     vp << FALSE;
254   return TRUE;
255 }
256 
source(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)257 FX_BOOL event::source(IJS_Context* cc,
258                       CJS_PropValue& vp,
259                       CFX_WideString& sError) {
260   if (!vp.IsGetting())
261     return FALSE;
262 
263   CJS_Context* pContext = (CJS_Context*)cc;
264   CJS_EventHandler* pEvent = pContext->GetEventHandler();
265 
266   vp << pEvent->Source()->GetJSObject();
267   return TRUE;
268 }
269 
target(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)270 FX_BOOL event::target(IJS_Context* cc,
271                       CJS_PropValue& vp,
272                       CFX_WideString& sError) {
273   if (!vp.IsGetting())
274     return FALSE;
275 
276   CJS_Context* pContext = (CJS_Context*)cc;
277   CJS_EventHandler* pEvent = pContext->GetEventHandler();
278 
279   vp << pEvent->Target_Field()->GetJSObject();
280   return TRUE;
281 }
282 
targetName(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)283 FX_BOOL event::targetName(IJS_Context* cc,
284                           CJS_PropValue& vp,
285                           CFX_WideString& sError) {
286   if (!vp.IsGetting())
287     return FALSE;
288 
289   CJS_Context* pContext = (CJS_Context*)cc;
290   CJS_EventHandler* pEvent = pContext->GetEventHandler();
291 
292   vp << pEvent->TargetName();
293   return TRUE;
294 }
295 
type(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)296 FX_BOOL event::type(IJS_Context* cc,
297                     CJS_PropValue& vp,
298                     CFX_WideString& sError) {
299   if (!vp.IsGetting())
300     return FALSE;
301 
302   CJS_Context* pContext = (CJS_Context*)cc;
303   CJS_EventHandler* pEvent = pContext->GetEventHandler();
304 
305   vp << pEvent->Type();
306   return TRUE;
307 }
308 
value(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)309 FX_BOOL event::value(IJS_Context* cc,
310                      CJS_PropValue& vp,
311                      CFX_WideString& sError) {
312   CJS_Context* pContext = (CJS_Context*)cc;
313   CJS_EventHandler* pEvent = pContext->GetEventHandler();
314 
315   if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0)
316     return FALSE;
317   if (!pEvent->m_pValue)
318     return FALSE;
319   CFX_WideString& val = pEvent->Value();
320   if (vp.IsSetting()) {
321     vp >> val;
322   } else {
323     vp << val;
324   }
325   return TRUE;
326 }
327 
willCommit(IJS_Context * cc,CJS_PropValue & vp,CFX_WideString & sError)328 FX_BOOL event::willCommit(IJS_Context* cc,
329                           CJS_PropValue& vp,
330                           CFX_WideString& sError) {
331   if (!vp.IsGetting())
332     return FALSE;
333 
334   CJS_Context* pContext = (CJS_Context*)cc;
335   CJS_EventHandler* pEvent = pContext->GetEventHandler();
336 
337   if (pEvent->WillCommit())
338     vp << TRUE;
339   else
340     vp << FALSE;
341   return TRUE;
342 }
343