OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #ifndef FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_ | 7 #ifndef FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_ |
8 #define FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_ | 8 #define FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_ |
9 | 9 |
10 #include "../jsapi/fxjs_v8.h" | 10 #include "../jsapi/fxjs_v8.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 /* ======================================== PROP CALLBACK | 72 /* ======================================== PROP CALLBACK |
73 * ============================================ */ | 73 * ============================================ */ |
74 | 74 |
75 template <class C, | 75 template <class C, |
76 FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, CFX_WideString&)> | 76 FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, CFX_WideString&)> |
77 void JSPropGetter(const char* prop_name_string, | 77 void JSPropGetter(const char* prop_name_string, |
78 const char* class_name_string, | 78 const char* class_name_string, |
79 v8::Local<v8::String> property, | 79 v8::Local<v8::String> property, |
80 const v8::PropertyCallbackInfo<v8::Value>& info) { | 80 const v8::PropertyCallbackInfo<v8::Value>& info) { |
81 v8::Isolate* isolate = info.GetIsolate(); | 81 v8::Isolate* isolate = info.GetIsolate(); |
82 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 82 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
83 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 83 if (!pRuntime) |
84 if (v.IsEmpty()) | |
85 return; | 84 return; |
86 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
87 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
88 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 85 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
89 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); | 86 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); |
90 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); | 87 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); |
91 CFX_WideString sError; | 88 CFX_WideString sError; |
92 CJS_PropValue value(isolate); | 89 CJS_PropValue value(isolate); |
93 value.StartGetting(); | 90 value.StartGetting(); |
94 if (!(pObj->*M)(pRuntimeContext, value, sError)) { | 91 if (!(pObj->*M)(pRuntimeContext, value, sError)) { |
95 FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, | 92 FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, |
96 sError)); | 93 sError)); |
97 return; | 94 return; |
98 } | 95 } |
99 info.GetReturnValue().Set((v8::Local<v8::Value>)value); | 96 info.GetReturnValue().Set((v8::Local<v8::Value>)value); |
100 } | 97 } |
101 | 98 |
102 template <class C, | 99 template <class C, |
103 FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, CFX_WideString&)> | 100 FX_BOOL (C::*M)(IFXJS_Context*, CJS_PropValue&, CFX_WideString&)> |
104 void JSPropSetter(const char* prop_name_string, | 101 void JSPropSetter(const char* prop_name_string, |
105 const char* class_name_string, | 102 const char* class_name_string, |
106 v8::Local<v8::String> property, | 103 v8::Local<v8::String> property, |
107 v8::Local<v8::Value> value, | 104 v8::Local<v8::Value> value, |
108 const v8::PropertyCallbackInfo<void>& info) { | 105 const v8::PropertyCallbackInfo<void>& info) { |
109 v8::Isolate* isolate = info.GetIsolate(); | 106 v8::Isolate* isolate = info.GetIsolate(); |
110 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 107 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
111 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 108 if (!pRuntime) |
112 if (v.IsEmpty()) | |
113 return; | 109 return; |
114 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
115 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
116 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 110 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
117 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); | 111 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); |
118 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); | 112 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); |
119 CFX_WideString sError; | 113 CFX_WideString sError; |
120 CJS_PropValue propValue(CJS_Value(isolate, value, CJS_Value::VT_unknown)); | 114 CJS_PropValue propValue(CJS_Value(isolate, value, CJS_Value::VT_unknown)); |
121 propValue.StartSetting(); | 115 propValue.StartSetting(); |
122 if (!(pObj->*M)(pRuntimeContext, propValue, sError)) { | 116 if (!(pObj->*M)(pRuntimeContext, propValue, sError)) { |
123 FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, | 117 FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, |
124 sError)); | 118 sError)); |
125 } | 119 } |
(...skipping 18 matching lines...) Expand all Loading... |
144 | 138 |
145 template <class C, | 139 template <class C, |
146 FX_BOOL (C::*M)(IFXJS_Context*, | 140 FX_BOOL (C::*M)(IFXJS_Context*, |
147 const CJS_Parameters&, | 141 const CJS_Parameters&, |
148 CJS_Value&, | 142 CJS_Value&, |
149 CFX_WideString&)> | 143 CFX_WideString&)> |
150 void JSMethod(const char* method_name_string, | 144 void JSMethod(const char* method_name_string, |
151 const char* class_name_string, | 145 const char* class_name_string, |
152 const v8::FunctionCallbackInfo<v8::Value>& info) { | 146 const v8::FunctionCallbackInfo<v8::Value>& info) { |
153 v8::Isolate* isolate = info.GetIsolate(); | 147 v8::Isolate* isolate = info.GetIsolate(); |
154 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 148 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
155 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 149 if (!pRuntime) |
156 if (v.IsEmpty()) | |
157 return; | 150 return; |
158 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
159 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
160 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 151 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
161 CJS_Parameters parameters; | 152 CJS_Parameters parameters; |
162 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { | 153 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { |
163 parameters.push_back(CJS_Value(isolate, info[i], CJS_Value::VT_unknown)); | 154 parameters.push_back(CJS_Value(isolate, info[i], CJS_Value::VT_unknown)); |
164 } | 155 } |
165 CJS_Value valueRes(isolate); | 156 CJS_Value valueRes(isolate); |
166 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); | 157 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); |
167 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); | 158 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); |
168 CFX_WideString sError; | 159 CFX_WideString sError; |
169 if (!(pObj->*M)(pRuntimeContext, parameters, valueRes, sError)) { | 160 if (!(pObj->*M)(pRuntimeContext, parameters, valueRes, sError)) { |
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
275 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); | 266 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); |
276 FX_BOOL bRet = pObj->QueryProperty(propname.c_str()); | 267 FX_BOOL bRet = pObj->QueryProperty(propname.c_str()); |
277 info.GetReturnValue().Set(bRet ? 4 : 0); | 268 info.GetReturnValue().Set(bRet ? 4 : 0); |
278 } | 269 } |
279 | 270 |
280 template <class Alt> | 271 template <class Alt> |
281 void JSSpecialPropGet(const char* class_name, | 272 void JSSpecialPropGet(const char* class_name, |
282 v8::Local<v8::String> property, | 273 v8::Local<v8::String> property, |
283 const v8::PropertyCallbackInfo<v8::Value>& info) { | 274 const v8::PropertyCallbackInfo<v8::Value>& info) { |
284 v8::Isolate* isolate = info.GetIsolate(); | 275 v8::Isolate* isolate = info.GetIsolate(); |
285 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 276 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
286 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 277 if (!pRuntime) |
287 if (v.IsEmpty()) | |
288 return; | 278 return; |
289 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
290 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
291 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 279 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
292 CJS_Object* pJSObj = | 280 CJS_Object* pJSObj = |
293 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); | 281 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); |
294 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); | 282 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); |
295 v8::String::Utf8Value utf8_value(property); | 283 v8::String::Utf8Value utf8_value(property); |
296 CFX_WideString propname = | 284 CFX_WideString propname = |
297 CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); | 285 CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); |
298 CFX_WideString sError; | 286 CFX_WideString sError; |
299 CJS_PropValue value(isolate); | 287 CJS_PropValue value(isolate); |
300 value.StartGetting(); | 288 value.StartGetting(); |
301 if (!pObj->DoProperty(pRuntimeContext, propname.c_str(), value, sError)) { | 289 if (!pObj->DoProperty(pRuntimeContext, propname.c_str(), value, sError)) { |
302 FXJS_Error(isolate, JSFormatErrorString(class_name, "GetProperty", sError)); | 290 FXJS_Error(isolate, JSFormatErrorString(class_name, "GetProperty", sError)); |
303 return; | 291 return; |
304 } | 292 } |
305 info.GetReturnValue().Set((v8::Local<v8::Value>)value); | 293 info.GetReturnValue().Set((v8::Local<v8::Value>)value); |
306 } | 294 } |
307 | 295 |
308 template <class Alt> | 296 template <class Alt> |
309 void JSSpecialPropPut(const char* class_name, | 297 void JSSpecialPropPut(const char* class_name, |
310 v8::Local<v8::String> property, | 298 v8::Local<v8::String> property, |
311 v8::Local<v8::Value> value, | 299 v8::Local<v8::Value> value, |
312 const v8::PropertyCallbackInfo<v8::Value>& info) { | 300 const v8::PropertyCallbackInfo<v8::Value>& info) { |
313 v8::Isolate* isolate = info.GetIsolate(); | 301 v8::Isolate* isolate = info.GetIsolate(); |
314 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 302 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
315 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 303 if (!pRuntime) |
316 if (v.IsEmpty()) | |
317 return; | 304 return; |
318 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
319 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
320 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 305 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
321 CJS_Object* pJSObj = | 306 CJS_Object* pJSObj = |
322 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); | 307 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); |
323 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); | 308 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); |
324 v8::String::Utf8Value utf8_value(property); | 309 v8::String::Utf8Value utf8_value(property); |
325 CFX_WideString propname = | 310 CFX_WideString propname = |
326 CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); | 311 CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); |
327 CFX_WideString sError; | 312 CFX_WideString sError; |
328 CJS_PropValue PropValue(CJS_Value(isolate, value, CJS_Value::VT_unknown)); | 313 CJS_PropValue PropValue(CJS_Value(isolate, value, CJS_Value::VT_unknown)); |
329 PropValue.StartSetting(); | 314 PropValue.StartSetting(); |
330 if (!pObj->DoProperty(pRuntimeContext, propname.c_str(), PropValue, sError)) { | 315 if (!pObj->DoProperty(pRuntimeContext, propname.c_str(), PropValue, sError)) { |
331 FXJS_Error(isolate, JSFormatErrorString(class_name, "PutProperty", sError)); | 316 FXJS_Error(isolate, JSFormatErrorString(class_name, "PutProperty", sError)); |
332 } | 317 } |
333 } | 318 } |
334 | 319 |
335 template <class Alt> | 320 template <class Alt> |
336 void JSSpecialPropDel(const char* class_name, | 321 void JSSpecialPropDel(const char* class_name, |
337 v8::Local<v8::String> property, | 322 v8::Local<v8::String> property, |
338 const v8::PropertyCallbackInfo<v8::Boolean>& info) { | 323 const v8::PropertyCallbackInfo<v8::Boolean>& info) { |
339 v8::Isolate* isolate = info.GetIsolate(); | 324 v8::Isolate* isolate = info.GetIsolate(); |
340 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 325 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
341 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 326 if (!pRuntime) |
342 if (v.IsEmpty()) | |
343 return; | 327 return; |
344 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
345 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
346 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 328 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
347 CJS_Object* pJSObj = | 329 CJS_Object* pJSObj = |
348 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); | 330 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); |
349 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); | 331 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); |
350 v8::String::Utf8Value utf8_value(property); | 332 v8::String::Utf8Value utf8_value(property); |
351 CFX_WideString propname = | 333 CFX_WideString propname = |
352 CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); | 334 CFX_WideString::FromUTF8(*utf8_value, utf8_value.length()); |
353 CFX_WideString sError; | 335 CFX_WideString sError; |
354 if (!pObj->DelProperty(pRuntimeContext, propname.c_str(), sError)) { | 336 if (!pObj->DelProperty(pRuntimeContext, propname.c_str(), sError)) { |
355 CFX_ByteString cbName; | 337 CFX_ByteString cbName; |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
441 } | 423 } |
442 | 424 |
443 /* ======================================== GLOBAL METHODS | 425 /* ======================================== GLOBAL METHODS |
444 * ============================================ */ | 426 * ============================================ */ |
445 | 427 |
446 template <FX_BOOL ( | 428 template <FX_BOOL ( |
447 *F)(IFXJS_Context*, const CJS_Parameters&, CJS_Value&, CFX_WideString&)> | 429 *F)(IFXJS_Context*, const CJS_Parameters&, CJS_Value&, CFX_WideString&)> |
448 void JSGlobalFunc(const char* func_name_string, | 430 void JSGlobalFunc(const char* func_name_string, |
449 const v8::FunctionCallbackInfo<v8::Value>& info) { | 431 const v8::FunctionCallbackInfo<v8::Value>& info) { |
450 v8::Isolate* isolate = info.GetIsolate(); | 432 v8::Isolate* isolate = info.GetIsolate(); |
451 v8::Local<v8::Context> context = isolate->GetCurrentContext(); | 433 IFXJS_Runtime* pRuntime = FXJS_GetRuntimeFromIsolate(isolate); |
452 v8::Local<v8::Value> v = context->GetEmbedderData(1); | 434 if (!pRuntime) |
453 if (v.IsEmpty()) | |
454 return; | 435 return; |
455 v8::Local<v8::External> field = v8::Local<v8::External>::Cast(v); | |
456 IFXJS_Runtime* pRuntime = (IFXJS_Runtime*)field->Value(); | |
457 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); | 436 IFXJS_Context* pRuntimeContext = pRuntime->GetCurrentContext(); |
458 CJS_Parameters parameters; | 437 CJS_Parameters parameters; |
459 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { | 438 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { |
460 parameters.push_back(CJS_Value(isolate, info[i], CJS_Value::VT_unknown)); | 439 parameters.push_back(CJS_Value(isolate, info[i], CJS_Value::VT_unknown)); |
461 } | 440 } |
462 CJS_Value valueRes(isolate); | 441 CJS_Value valueRes(isolate); |
463 CFX_WideString sError; | 442 CFX_WideString sError; |
464 if (!(*F)(pRuntimeContext, parameters, valueRes, sError)) { | 443 if (!(*F)(pRuntimeContext, parameters, valueRes, sError)) { |
465 FXJS_Error(isolate, JSFormatErrorString(func_name_string, nullptr, sError)); | 444 FXJS_Error(isolate, JSFormatErrorString(func_name_string, nullptr, sError)); |
466 return; | 445 return; |
(...skipping 23 matching lines...) Expand all Loading... |
490 for (int i = 0; i < FX_ArraySize(global_methods) - 1; ++i) { \ | 469 for (int i = 0; i < FX_ArraySize(global_methods) - 1; ++i) { \ |
491 FXJS_DefineGlobalMethod(pIsolate, \ | 470 FXJS_DefineGlobalMethod(pIsolate, \ |
492 js_class_name::global_methods[i].pName, \ | 471 js_class_name::global_methods[i].pName, \ |
493 js_class_name::global_methods[i].pMethodCall); \ | 472 js_class_name::global_methods[i].pMethodCall); \ |
494 } \ | 473 } \ |
495 } | 474 } |
496 | 475 |
497 CJS_Value::Type GET_VALUE_TYPE(v8::Local<v8::Value> p); | 476 CJS_Value::Type GET_VALUE_TYPE(v8::Local<v8::Value> p); |
498 | 477 |
499 #endif // FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_ | 478 #endif // FPDFSDK_INCLUDE_JAVASCRIPT_JS_DEFINE_H_ |
OLD | NEW |