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 "fpdfsdk/javascript/event.h"
8
9 #include "fpdfsdk/javascript/Field.h"
10 #include "fpdfsdk/javascript/JS_Define.h"
11 #include "fpdfsdk/javascript/JS_EventHandler.h"
12 #include "fpdfsdk/javascript/JS_Object.h"
13 #include "fpdfsdk/javascript/JS_Value.h"
14 #include "fpdfsdk/javascript/cjs_event_context.h"
15
16 JSConstSpec CJS_Event::ConstSpecs[] = {{0, JSConstSpec::Number, 0, 0}};
17
18 JSPropertySpec CJS_Event::PropertySpecs[] = {
19 {"change", get_change_static, set_change_static},
20 {"changeEx", get_changeEx_static, set_changeEx_static},
21 {"commitKey", get_commitKey_static, set_commitKey_static},
22 {"fieldFull", get_fieldFull_static, set_fieldFull_static},
23 {"keyDown", get_keyDown_static, set_keyDown_static},
24 {"modifier", get_modifier_static, set_modifier_static},
25 {"name", get_name_static, set_name_static},
26 {"rc", get_rc_static, set_rc_static},
27 {"richChange", get_richChange_static, set_richChange_static},
28 {"richChangeEx", get_richChangeEx_static, set_richChangeEx_static},
29 {"richValue", get_richValue_static, set_richValue_static},
30 {"selEnd", get_selEnd_static, set_selEnd_static},
31 {"selStart", get_selStart_static, set_selStart_static},
32 {"shift", get_shift_static, set_shift_static},
33 {"source", get_source_static, set_source_static},
34 {"target", get_target_static, set_target_static},
35 {"targetName", get_targetName_static, set_targetName_static},
36 {"type", get_type_static, set_type_static},
37 {"value", get_value_static, set_value_static},
38 {"willCommit", get_willCommit_static, set_willCommit_static},
39 {0, 0, 0}};
40
41 JSMethodSpec CJS_Event::MethodSpecs[] = {{0, 0}};
42
IMPLEMENT_JS_CLASS(CJS_Event,event)43 IMPLEMENT_JS_CLASS(CJS_Event, event)
44
45 event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {}
46
~event()47 event::~event() {}
48
change(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)49 bool event::change(CJS_Runtime* pRuntime,
50 CJS_PropValue& vp,
51 CFX_WideString& sError) {
52 CJS_EventHandler* pEvent =
53 pRuntime->GetCurrentEventContext()->GetEventHandler();
54 CFX_WideString& wChange = pEvent->Change();
55 if (vp.IsSetting()) {
56 if (vp.GetJSValue()->GetType() == CJS_Value::VT_string)
57 vp >> wChange;
58 return true;
59 }
60 vp << wChange;
61 return true;
62 }
63
changeEx(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)64 bool event::changeEx(CJS_Runtime* pRuntime,
65 CJS_PropValue& vp,
66 CFX_WideString& sError) {
67 if (!vp.IsGetting())
68 return false;
69
70 CJS_EventHandler* pEvent =
71 pRuntime->GetCurrentEventContext()->GetEventHandler();
72
73 vp << pEvent->ChangeEx();
74 return true;
75 }
76
commitKey(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)77 bool event::commitKey(CJS_Runtime* pRuntime,
78 CJS_PropValue& vp,
79 CFX_WideString& sError) {
80 if (!vp.IsGetting())
81 return false;
82
83 CJS_EventHandler* pEvent =
84 pRuntime->GetCurrentEventContext()->GetEventHandler();
85
86 vp << pEvent->CommitKey();
87 return true;
88 }
89
fieldFull(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)90 bool event::fieldFull(CJS_Runtime* pRuntime,
91 CJS_PropValue& vp,
92 CFX_WideString& sError) {
93 CJS_EventHandler* pEvent =
94 pRuntime->GetCurrentEventContext()->GetEventHandler();
95
96 if (!vp.IsGetting() &&
97 wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
98 return false;
99
100 vp << pEvent->FieldFull();
101 return true;
102 }
103
keyDown(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)104 bool event::keyDown(CJS_Runtime* pRuntime,
105 CJS_PropValue& vp,
106 CFX_WideString& sError) {
107 if (!vp.IsGetting())
108 return false;
109
110 CJS_EventHandler* pEvent =
111 pRuntime->GetCurrentEventContext()->GetEventHandler();
112
113 vp << pEvent->KeyDown();
114 return true;
115 }
116
modifier(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)117 bool event::modifier(CJS_Runtime* pRuntime,
118 CJS_PropValue& vp,
119 CFX_WideString& sError) {
120 if (!vp.IsGetting())
121 return false;
122
123 CJS_EventHandler* pEvent =
124 pRuntime->GetCurrentEventContext()->GetEventHandler();
125
126 vp << pEvent->Modifier();
127 return true;
128 }
129
name(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)130 bool event::name(CJS_Runtime* pRuntime,
131 CJS_PropValue& vp,
132 CFX_WideString& sError) {
133 if (!vp.IsGetting())
134 return false;
135
136 CJS_EventHandler* pEvent =
137 pRuntime->GetCurrentEventContext()->GetEventHandler();
138
139 vp << pEvent->Name();
140 return true;
141 }
142
rc(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)143 bool event::rc(CJS_Runtime* pRuntime,
144 CJS_PropValue& vp,
145 CFX_WideString& sError) {
146 CJS_EventHandler* pEvent =
147 pRuntime->GetCurrentEventContext()->GetEventHandler();
148
149 bool& bRc = pEvent->Rc();
150 if (vp.IsSetting())
151 vp >> bRc;
152 else
153 vp << bRc;
154
155 return true;
156 }
157
richChange(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)158 bool event::richChange(CJS_Runtime* pRuntime,
159 CJS_PropValue& vp,
160 CFX_WideString& sError) {
161 return true;
162 }
163
richChangeEx(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)164 bool event::richChangeEx(CJS_Runtime* pRuntime,
165 CJS_PropValue& vp,
166 CFX_WideString& sError) {
167 return true;
168 }
169
richValue(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)170 bool event::richValue(CJS_Runtime* pRuntime,
171 CJS_PropValue& vp,
172 CFX_WideString& sError) {
173 return true;
174 }
175
selEnd(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)176 bool event::selEnd(CJS_Runtime* pRuntime,
177 CJS_PropValue& vp,
178 CFX_WideString& sError) {
179 CJS_EventHandler* pEvent =
180 pRuntime->GetCurrentEventContext()->GetEventHandler();
181
182 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
183 return true;
184
185 int& iSelEnd = pEvent->SelEnd();
186 if (vp.IsSetting())
187 vp >> iSelEnd;
188 else
189 vp << iSelEnd;
190
191 return true;
192 }
193
selStart(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)194 bool event::selStart(CJS_Runtime* pRuntime,
195 CJS_PropValue& vp,
196 CFX_WideString& sError) {
197 CJS_EventHandler* pEvent =
198 pRuntime->GetCurrentEventContext()->GetEventHandler();
199
200 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0)
201 return true;
202
203 int& iSelStart = pEvent->SelStart();
204 if (vp.IsSetting())
205 vp >> iSelStart;
206 else
207 vp << iSelStart;
208
209 return true;
210 }
211
shift(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)212 bool event::shift(CJS_Runtime* pRuntime,
213 CJS_PropValue& vp,
214 CFX_WideString& sError) {
215 if (!vp.IsGetting())
216 return false;
217
218 CJS_EventHandler* pEvent =
219 pRuntime->GetCurrentEventContext()->GetEventHandler();
220
221 vp << pEvent->Shift();
222 return true;
223 }
224
source(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)225 bool event::source(CJS_Runtime* pRuntime,
226 CJS_PropValue& vp,
227 CFX_WideString& sError) {
228 if (!vp.IsGetting())
229 return false;
230
231 CJS_EventHandler* pEvent =
232 pRuntime->GetCurrentEventContext()->GetEventHandler();
233
234 vp << pEvent->Source()->GetJSObject();
235 return true;
236 }
237
target(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)238 bool event::target(CJS_Runtime* pRuntime,
239 CJS_PropValue& vp,
240 CFX_WideString& sError) {
241 if (!vp.IsGetting())
242 return false;
243
244 CJS_EventHandler* pEvent =
245 pRuntime->GetCurrentEventContext()->GetEventHandler();
246
247 vp << pEvent->Target_Field()->GetJSObject();
248 return true;
249 }
250
targetName(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)251 bool event::targetName(CJS_Runtime* pRuntime,
252 CJS_PropValue& vp,
253 CFX_WideString& sError) {
254 if (!vp.IsGetting())
255 return false;
256
257 CJS_EventHandler* pEvent =
258 pRuntime->GetCurrentEventContext()->GetEventHandler();
259
260 vp << pEvent->TargetName();
261 return true;
262 }
263
type(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)264 bool event::type(CJS_Runtime* pRuntime,
265 CJS_PropValue& vp,
266 CFX_WideString& sError) {
267 if (!vp.IsGetting())
268 return false;
269
270 CJS_EventHandler* pEvent =
271 pRuntime->GetCurrentEventContext()->GetEventHandler();
272
273 vp << pEvent->Type();
274 return true;
275 }
276
value(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)277 bool event::value(CJS_Runtime* pRuntime,
278 CJS_PropValue& vp,
279 CFX_WideString& sError) {
280 CJS_EventHandler* pEvent =
281 pRuntime->GetCurrentEventContext()->GetEventHandler();
282
283 if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0)
284 return false;
285
286 if (!pEvent->m_pValue)
287 return false;
288
289 CFX_WideString& val = pEvent->Value();
290 if (vp.IsSetting())
291 vp >> val;
292 else
293 vp << val;
294
295 return true;
296 }
297
willCommit(CJS_Runtime * pRuntime,CJS_PropValue & vp,CFX_WideString & sError)298 bool event::willCommit(CJS_Runtime* pRuntime,
299 CJS_PropValue& vp,
300 CFX_WideString& sError) {
301 if (!vp.IsGetting())
302 return false;
303
304 CJS_EventHandler* pEvent =
305 pRuntime->GetCurrentEventContext()->GetEventHandler();
306
307 vp << pEvent->WillCommit();
308 return true;
309 }
310