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 "fxjs/cjs_event.h" 8 9 #include "fxjs/JS_Define.h" 10 #include "fxjs/cjs_event_context.h" 11 #include "fxjs/cjs_eventhandler.h" 12 #include "fxjs/cjs_field.h" 13 #include "fxjs/cjs_object.h" 14 15 const JSPropertySpec CJS_Event::PropertySpecs[] = { 16 {"change", get_change_static, set_change_static}, 17 {"changeEx", get_change_ex_static, set_change_ex_static}, 18 {"commitKey", get_commit_key_static, set_commit_key_static}, 19 {"fieldFull", get_field_full_static, set_field_full_static}, 20 {"keyDown", get_key_down_static, set_key_down_static}, 21 {"modifier", get_modifier_static, set_modifier_static}, 22 {"name", get_name_static, set_name_static}, 23 {"rc", get_rc_static, set_rc_static}, 24 {"richChange", get_rich_change_static, set_rich_change_static}, 25 {"richChangeEx", get_rich_change_ex_static, set_rich_change_ex_static}, 26 {"richValue", get_rich_value_static, set_rich_value_static}, 27 {"selEnd", get_sel_end_static, set_sel_end_static}, 28 {"selStart", get_sel_start_static, set_sel_start_static}, 29 {"shift", get_shift_static, set_shift_static}, 30 {"source", get_source_static, set_source_static}, 31 {"target", get_target_static, set_target_static}, 32 {"targetName", get_target_name_static, set_target_name_static}, 33 {"type", get_type_static, set_type_static}, 34 {"value", get_value_static, set_value_static}, 35 {"willCommit", get_will_commit_static, set_will_commit_static}}; 36 37 int CJS_Event::ObjDefnID = -1; 38 39 // static 40 void CJS_Event::DefineJSObjects(CFXJS_Engine* pEngine) { 41 ObjDefnID = pEngine->DefineObj("event", FXJSOBJTYPE_STATIC, 42 JSConstructor<CJS_Event, event>, 43 JSDestructor<CJS_Event>); 44 DefineProps(pEngine, ObjDefnID, PropertySpecs, FX_ArraySize(PropertySpecs)); 45 } 46 47 event::event(CJS_Object* pJsObject) : CJS_EmbedObj(pJsObject) {} 48 49 event::~event() {} 50 51 CJS_Return event::get_change(CJS_Runtime* pRuntime) { 52 CJS_EventHandler* pEvent = 53 pRuntime->GetCurrentEventContext()->GetEventHandler(); 54 return CJS_Return(pRuntime->NewString(pEvent->Change().c_str())); 55 } 56 57 CJS_Return event::set_change(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 58 CJS_EventHandler* pEvent = 59 pRuntime->GetCurrentEventContext()->GetEventHandler(); 60 61 if (vp->IsString()) { 62 WideString& wChange = pEvent->Change(); 63 wChange = pRuntime->ToWideString(vp); 64 } 65 return CJS_Return(true); 66 } 67 68 CJS_Return event::get_change_ex(CJS_Runtime* pRuntime) { 69 CJS_EventHandler* pEvent = 70 pRuntime->GetCurrentEventContext()->GetEventHandler(); 71 72 return CJS_Return(pRuntime->NewString(pEvent->ChangeEx().c_str())); 73 } 74 75 CJS_Return event::set_change_ex(CJS_Runtime* pRuntime, 76 v8::Local<v8::Value> vp) { 77 return CJS_Return(false); 78 } 79 80 CJS_Return event::get_commit_key(CJS_Runtime* pRuntime) { 81 CJS_EventHandler* pEvent = 82 pRuntime->GetCurrentEventContext()->GetEventHandler(); 83 84 return CJS_Return(pRuntime->NewNumber(pEvent->CommitKey())); 85 } 86 87 CJS_Return event::set_commit_key(CJS_Runtime* pRuntime, 88 v8::Local<v8::Value> vp) { 89 return CJS_Return(false); 90 } 91 92 CJS_Return event::get_field_full(CJS_Runtime* pRuntime) { 93 CJS_EventHandler* pEvent = 94 pRuntime->GetCurrentEventContext()->GetEventHandler(); 95 96 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) 97 return CJS_Return(false); 98 99 return CJS_Return(pRuntime->NewBoolean(pEvent->FieldFull())); 100 } 101 102 CJS_Return event::set_field_full(CJS_Runtime* pRuntime, 103 v8::Local<v8::Value> vp) { 104 return CJS_Return(false); 105 } 106 107 CJS_Return event::get_key_down(CJS_Runtime* pRuntime) { 108 CJS_EventHandler* pEvent = 109 pRuntime->GetCurrentEventContext()->GetEventHandler(); 110 return CJS_Return(pRuntime->NewBoolean(pEvent->KeyDown())); 111 } 112 113 CJS_Return event::set_key_down(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 114 return CJS_Return(false); 115 } 116 117 CJS_Return event::get_modifier(CJS_Runtime* pRuntime) { 118 CJS_EventHandler* pEvent = 119 pRuntime->GetCurrentEventContext()->GetEventHandler(); 120 return CJS_Return(pRuntime->NewBoolean(pEvent->Modifier())); 121 } 122 123 CJS_Return event::set_modifier(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 124 return CJS_Return(false); 125 } 126 127 CJS_Return event::get_name(CJS_Runtime* pRuntime) { 128 CJS_EventHandler* pEvent = 129 pRuntime->GetCurrentEventContext()->GetEventHandler(); 130 return CJS_Return(pRuntime->NewString(pEvent->Name())); 131 } 132 133 CJS_Return event::set_name(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 134 return CJS_Return(false); 135 } 136 137 CJS_Return event::get_rc(CJS_Runtime* pRuntime) { 138 CJS_EventHandler* pEvent = 139 pRuntime->GetCurrentEventContext()->GetEventHandler(); 140 return CJS_Return(pRuntime->NewBoolean(pEvent->Rc())); 141 } 142 143 CJS_Return event::set_rc(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 144 CJS_EventHandler* pEvent = 145 pRuntime->GetCurrentEventContext()->GetEventHandler(); 146 pEvent->Rc() = pRuntime->ToBoolean(vp); 147 return CJS_Return(true); 148 } 149 150 CJS_Return event::get_rich_change(CJS_Runtime* pRuntime) { 151 return CJS_Return(true); 152 } 153 154 CJS_Return event::set_rich_change(CJS_Runtime* pRuntime, 155 v8::Local<v8::Value> vp) { 156 return CJS_Return(true); 157 } 158 159 CJS_Return event::get_rich_change_ex(CJS_Runtime* pRuntime) { 160 return CJS_Return(true); 161 } 162 163 CJS_Return event::set_rich_change_ex(CJS_Runtime* pRuntime, 164 v8::Local<v8::Value> vp) { 165 return CJS_Return(true); 166 } 167 168 CJS_Return event::get_rich_value(CJS_Runtime* pRuntime) { 169 return CJS_Return(true); 170 } 171 172 CJS_Return event::set_rich_value(CJS_Runtime* pRuntime, 173 v8::Local<v8::Value> vp) { 174 return CJS_Return(true); 175 } 176 177 CJS_Return event::get_sel_end(CJS_Runtime* pRuntime) { 178 CJS_EventHandler* pEvent = 179 pRuntime->GetCurrentEventContext()->GetEventHandler(); 180 181 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) 182 return CJS_Return(true); 183 184 return CJS_Return(pRuntime->NewNumber(pEvent->SelEnd())); 185 } 186 187 CJS_Return event::set_sel_end(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 188 CJS_EventHandler* pEvent = 189 pRuntime->GetCurrentEventContext()->GetEventHandler(); 190 191 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) 192 return CJS_Return(true); 193 194 pEvent->SetSelEnd(pRuntime->ToInt32(vp)); 195 return CJS_Return(true); 196 } 197 198 CJS_Return event::get_sel_start(CJS_Runtime* pRuntime) { 199 CJS_EventHandler* pEvent = 200 pRuntime->GetCurrentEventContext()->GetEventHandler(); 201 202 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) 203 return CJS_Return(true); 204 205 return CJS_Return(pRuntime->NewNumber(pEvent->SelStart())); 206 } 207 208 CJS_Return event::set_sel_start(CJS_Runtime* pRuntime, 209 v8::Local<v8::Value> vp) { 210 CJS_EventHandler* pEvent = 211 pRuntime->GetCurrentEventContext()->GetEventHandler(); 212 213 if (wcscmp((const wchar_t*)pEvent->Name(), L"Keystroke") != 0) 214 return CJS_Return(true); 215 216 pEvent->SetSelStart(pRuntime->ToInt32(vp)); 217 return CJS_Return(true); 218 } 219 220 CJS_Return event::get_shift(CJS_Runtime* pRuntime) { 221 CJS_EventHandler* pEvent = 222 pRuntime->GetCurrentEventContext()->GetEventHandler(); 223 return CJS_Return(pRuntime->NewBoolean(pEvent->Shift())); 224 } 225 226 CJS_Return event::set_shift(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 227 return CJS_Return(false); 228 } 229 230 CJS_Return event::get_source(CJS_Runtime* pRuntime) { 231 CJS_EventHandler* pEvent = 232 pRuntime->GetCurrentEventContext()->GetEventHandler(); 233 return CJS_Return(pEvent->Source()->GetJSObject()->ToV8Object()); 234 } 235 236 CJS_Return event::set_source(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 237 return CJS_Return(false); 238 } 239 240 CJS_Return event::get_target(CJS_Runtime* pRuntime) { 241 CJS_EventHandler* pEvent = 242 pRuntime->GetCurrentEventContext()->GetEventHandler(); 243 return CJS_Return(pEvent->Target_Field()->GetJSObject()->ToV8Object()); 244 } 245 246 CJS_Return event::set_target(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 247 return CJS_Return(false); 248 } 249 250 CJS_Return event::get_target_name(CJS_Runtime* pRuntime) { 251 CJS_EventHandler* pEvent = 252 pRuntime->GetCurrentEventContext()->GetEventHandler(); 253 return CJS_Return(pRuntime->NewString(pEvent->TargetName().c_str())); 254 } 255 256 CJS_Return event::set_target_name(CJS_Runtime* pRuntime, 257 v8::Local<v8::Value> vp) { 258 return CJS_Return(false); 259 } 260 261 CJS_Return event::get_type(CJS_Runtime* pRuntime) { 262 CJS_EventHandler* pEvent = 263 pRuntime->GetCurrentEventContext()->GetEventHandler(); 264 return CJS_Return(pRuntime->NewString(pEvent->Type())); 265 } 266 267 CJS_Return event::set_type(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 268 return CJS_Return(false); 269 } 270 271 CJS_Return event::get_value(CJS_Runtime* pRuntime) { 272 CJS_EventHandler* pEvent = 273 pRuntime->GetCurrentEventContext()->GetEventHandler(); 274 275 if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0) 276 return CJS_Return(false); 277 278 if (!pEvent->m_pValue) 279 return CJS_Return(false); 280 281 return CJS_Return(pRuntime->NewString(pEvent->Value().c_str())); 282 } 283 284 CJS_Return event::set_value(CJS_Runtime* pRuntime, v8::Local<v8::Value> vp) { 285 CJS_EventHandler* pEvent = 286 pRuntime->GetCurrentEventContext()->GetEventHandler(); 287 288 if (wcscmp((const wchar_t*)pEvent->Type(), L"Field") != 0) 289 return CJS_Return(false); 290 291 if (!pEvent->m_pValue) 292 return CJS_Return(false); 293 294 pEvent->Value() = pRuntime->ToWideString(vp); 295 return CJS_Return(true); 296 } 297 298 CJS_Return event::get_will_commit(CJS_Runtime* pRuntime) { 299 CJS_EventHandler* pEvent = 300 pRuntime->GetCurrentEventContext()->GetEventHandler(); 301 return CJS_Return(pRuntime->NewBoolean(pEvent->WillCommit())); 302 } 303 304 CJS_Return event::set_will_commit(CJS_Runtime* pRuntime, 305 v8::Local<v8::Value> vp) { 306 return CJS_Return(false); 307 } 308