Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(160)

Side by Side Diff: fpdfsdk/javascript/JS_Define.h

Issue 2245863002: Push v8::Isolate into CFXJS_Engine class (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Null isolate before letting CFXJS_Engine dtor invoked Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « fpdfsdk/javascript/Field.cpp ('k') | fpdfsdk/javascript/JS_EventHandler.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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_JAVASCRIPT_JS_DEFINE_H_ 7 #ifndef FPDFSDK_JAVASCRIPT_JS_DEFINE_H_
8 #define FPDFSDK_JAVASCRIPT_JS_DEFINE_H_ 8 #define FPDFSDK_JAVASCRIPT_JS_DEFINE_H_
9 9
10 #include <vector> 10 #include <vector>
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 { 0, 0 } \ 69 { 0, 0 } \
70 } \ 70 } \
71 ; // NOLINT 71 ; // NOLINT
72 72
73 template <class C, 73 template <class C,
74 FX_BOOL (C::*M)(IJS_Context*, CJS_PropValue&, CFX_WideString&)> 74 FX_BOOL (C::*M)(IJS_Context*, CJS_PropValue&, CFX_WideString&)>
75 void JSPropGetter(const char* prop_name_string, 75 void JSPropGetter(const char* prop_name_string,
76 const char* class_name_string, 76 const char* class_name_string,
77 v8::Local<v8::String> property, 77 v8::Local<v8::String> property,
78 const v8::PropertyCallbackInfo<v8::Value>& info) { 78 const v8::PropertyCallbackInfo<v8::Value>& info) {
79 v8::Isolate* isolate = info.GetIsolate();
80 CJS_Runtime* pRuntime = 79 CJS_Runtime* pRuntime =
81 static_cast<CJS_Runtime*>(FXJS_GetCurrentEngineFromIsolate(isolate)); 80 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
82 if (!pRuntime) 81 if (!pRuntime)
83 return; 82 return;
84 IJS_Context* pContext = pRuntime->GetCurrentContext(); 83 CJS_Object* pJSObj =
85 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); 84 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
86 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); 85 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
87 CFX_WideString sError; 86 CFX_WideString sError;
88 CJS_PropValue value(pRuntime); 87 CJS_PropValue value(pRuntime);
89 value.StartGetting(); 88 value.StartGetting();
90 if (!(pObj->*M)(pContext, value, sError)) { 89 if (!(pObj->*M)(pRuntime->GetCurrentContext(), value, sError)) {
91 FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, 90 pRuntime->Error(
92 sError)); 91 JSFormatErrorString(class_name_string, prop_name_string, sError));
93 return; 92 return;
94 } 93 }
95 info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(isolate)); 94 info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(pRuntime));
96 } 95 }
97 96
98 template <class C, 97 template <class C,
99 FX_BOOL (C::*M)(IJS_Context*, CJS_PropValue&, CFX_WideString&)> 98 FX_BOOL (C::*M)(IJS_Context*, CJS_PropValue&, CFX_WideString&)>
100 void JSPropSetter(const char* prop_name_string, 99 void JSPropSetter(const char* prop_name_string,
101 const char* class_name_string, 100 const char* class_name_string,
102 v8::Local<v8::String> property, 101 v8::Local<v8::String> property,
103 v8::Local<v8::Value> value, 102 v8::Local<v8::Value> value,
104 const v8::PropertyCallbackInfo<void>& info) { 103 const v8::PropertyCallbackInfo<void>& info) {
105 v8::Isolate* isolate = info.GetIsolate();
106 CJS_Runtime* pRuntime = 104 CJS_Runtime* pRuntime =
107 static_cast<CJS_Runtime*>(FXJS_GetCurrentEngineFromIsolate(isolate)); 105 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
108 if (!pRuntime) 106 if (!pRuntime)
109 return; 107 return;
110 IJS_Context* pContext = pRuntime->GetCurrentContext(); 108 CJS_Object* pJSObj =
111 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); 109 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
112 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); 110 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
113 CFX_WideString sError; 111 CFX_WideString sError;
114 CJS_PropValue propValue(pRuntime, CJS_Value(pRuntime, value)); 112 CJS_PropValue propValue(pRuntime, CJS_Value(pRuntime, value));
115 propValue.StartSetting(); 113 propValue.StartSetting();
116 if (!(pObj->*M)(pContext, propValue, sError)) { 114 if (!(pObj->*M)(pRuntime->GetCurrentContext(), propValue, sError)) {
117 FXJS_Error(isolate, JSFormatErrorString(class_name_string, prop_name_string, 115 pRuntime->Error(
118 sError)); 116 JSFormatErrorString(class_name_string, prop_name_string, sError));
119 } 117 }
120 } 118 }
121 119
122 #define JS_STATIC_PROP(prop_name, class_name) \ 120 #define JS_STATIC_PROP(prop_name, class_name) \
123 static void get_##prop_name##_static( \ 121 static void get_##prop_name##_static( \
124 v8::Local<v8::String> property, \ 122 v8::Local<v8::String> property, \
125 const v8::PropertyCallbackInfo<v8::Value>& info) { \ 123 const v8::PropertyCallbackInfo<v8::Value>& info) { \
126 JSPropGetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \ 124 JSPropGetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \
127 property, info); \ 125 property, info); \
128 } \ 126 } \
129 static void set_##prop_name##_static( \ 127 static void set_##prop_name##_static( \
130 v8::Local<v8::String> property, v8::Local<v8::Value> value, \ 128 v8::Local<v8::String> property, v8::Local<v8::Value> value, \
131 const v8::PropertyCallbackInfo<void>& info) { \ 129 const v8::PropertyCallbackInfo<void>& info) { \
132 JSPropSetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \ 130 JSPropSetter<class_name, &class_name::prop_name>(#prop_name, #class_name, \
133 property, value, info); \ 131 property, value, info); \
134 } 132 }
135 133
136 template <class C, 134 template <class C,
137 FX_BOOL (C::*M)(IJS_Context*, 135 FX_BOOL (C::*M)(IJS_Context*,
138 const std::vector<CJS_Value>&, 136 const std::vector<CJS_Value>&,
139 CJS_Value&, 137 CJS_Value&,
140 CFX_WideString&)> 138 CFX_WideString&)>
141 void JSMethod(const char* method_name_string, 139 void JSMethod(const char* method_name_string,
142 const char* class_name_string, 140 const char* class_name_string,
143 const v8::FunctionCallbackInfo<v8::Value>& info) { 141 const v8::FunctionCallbackInfo<v8::Value>& info) {
144 v8::Isolate* isolate = info.GetIsolate();
145 CJS_Runtime* pRuntime = 142 CJS_Runtime* pRuntime =
146 static_cast<CJS_Runtime*>(FXJS_GetCurrentEngineFromIsolate(isolate)); 143 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
147 if (!pRuntime) 144 if (!pRuntime)
148 return; 145 return;
149 IJS_Context* pContext = pRuntime->GetCurrentContext();
150 std::vector<CJS_Value> parameters; 146 std::vector<CJS_Value> parameters;
151 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { 147 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
152 parameters.push_back(CJS_Value(pRuntime, info[i])); 148 parameters.push_back(CJS_Value(pRuntime, info[i]));
153 } 149 }
154 CJS_Value valueRes(pRuntime); 150 CJS_Object* pJSObj =
155 CJS_Object* pJSObj = (CJS_Object*)FXJS_GetPrivate(isolate, info.Holder()); 151 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
156 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject()); 152 C* pObj = reinterpret_cast<C*>(pJSObj->GetEmbedObject());
157 CFX_WideString sError; 153 CFX_WideString sError;
158 if (!(pObj->*M)(pContext, parameters, valueRes, sError)) { 154 CJS_Value valueRes(pRuntime);
159 FXJS_Error(isolate, JSFormatErrorString(class_name_string, 155 if (!(pObj->*M)(pRuntime->GetCurrentContext(), parameters, valueRes,
160 method_name_string, sError)); 156 sError)) {
157 pRuntime->Error(
158 JSFormatErrorString(class_name_string, method_name_string, sError));
161 return; 159 return;
162 } 160 }
163 info.GetReturnValue().Set(valueRes.ToV8Value(isolate)); 161 info.GetReturnValue().Set(valueRes.ToV8Value(pRuntime));
164 } 162 }
165 163
166 #define JS_STATIC_METHOD(method_name, class_name) \ 164 #define JS_STATIC_METHOD(method_name, class_name) \
167 static void method_name##_static( \ 165 static void method_name##_static( \
168 const v8::FunctionCallbackInfo<v8::Value>& info) { \ 166 const v8::FunctionCallbackInfo<v8::Value>& info) { \
169 JSMethod<class_name, &class_name::method_name>(#method_name, #class_name, \ 167 JSMethod<class_name, &class_name::method_name>(#method_name, #class_name, \
170 info); \ 168 info); \
171 } 169 }
172 170
173 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \ 171 #define JS_SPECIAL_STATIC_METHOD(method_name, class_alternate, class_name) \
174 static void method_name##_static( \ 172 static void method_name##_static( \
175 const v8::FunctionCallbackInfo<v8::Value>& info) { \ 173 const v8::FunctionCallbackInfo<v8::Value>& info) { \
176 JSMethod<class_alternate, &class_alternate::method_name>( \ 174 JSMethod<class_alternate, &class_alternate::method_name>( \
177 #method_name, #class_name, info); \ 175 #method_name, #class_name, info); \
178 } 176 }
179 177
180 // All JS classes have a name, an object defintion ID, and the ability to 178 // All JS classes have a name, an object defintion ID, and the ability to
181 // register themselves with FXJS_V8. We never make a BASE class on its own 179 // register themselves with FXJS_V8. We never make a BASE class on its own
182 // because it can't really do anything. 180 // because it can't really do anything.
183 #define DECLARE_JS_CLASS_BASE_PART() \ 181 #define DECLARE_JS_CLASS_BASE_PART() \
184 static const wchar_t* g_pClassName; \ 182 static const wchar_t* g_pClassName; \
185 static int g_nObjDefnID; \ 183 static int g_nObjDefnID; \
186 static void DefineJSObjects(v8::Isolate* pIsolate, FXJSOBJTYPE eObjType); 184 static void DefineJSObjects(CFXJS_Engine* pEngine, FXJSOBJTYPE eObjType);
187 185
188 #define IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ 186 #define IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \
189 const wchar_t* js_class_name::g_pClassName = JS_WIDESTRING(class_name); \ 187 const wchar_t* js_class_name::g_pClassName = JS_WIDESTRING(class_name); \
190 int js_class_name::g_nObjDefnID = -1; 188 int js_class_name::g_nObjDefnID = -1;
191 189
192 // CONST classes provide constants, but not constructors, methods, or props. 190 // CONST classes provide constants, but not constructors, methods, or props.
193 #define DECLARE_JS_CLASS_CONST() \ 191 #define DECLARE_JS_CLASS_CONST() \
194 DECLARE_JS_CLASS_BASE_PART() \ 192 DECLARE_JS_CLASS_BASE_PART() \
195 DECLARE_JS_CLASS_CONST_PART() 193 DECLARE_JS_CLASS_CONST_PART()
196 194
197 #define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \ 195 #define IMPLEMENT_JS_CLASS_CONST(js_class_name, class_name) \
198 IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ 196 IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \
199 IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ 197 IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \
200 void js_class_name::DefineJSObjects(v8::Isolate* pIsolate, \ 198 void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine, \
201 FXJSOBJTYPE eObjType) { \ 199 FXJSOBJTYPE eObjType) { \
202 g_nObjDefnID = FXJS_DefineObj(pIsolate, js_class_name::g_pClassName, \ 200 g_nObjDefnID = pEngine->DefineObj(js_class_name::g_pClassName, eObjType, \
203 eObjType, nullptr, nullptr); \ 201 nullptr, nullptr); \
204 DefineConsts(pIsolate); \ 202 DefineConsts(pEngine); \
205 } 203 }
206 204
207 #define DECLARE_JS_CLASS_CONST_PART() \ 205 #define DECLARE_JS_CLASS_CONST_PART() \
208 static JSConstSpec JS_Class_Consts[]; \ 206 static JSConstSpec JS_Class_Consts[]; \
209 static void DefineConsts(v8::Isolate* pIsolate); 207 static void DefineConsts(CFXJS_Engine* pEngine);
210 208
211 #define IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ 209 #define IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \
212 void js_class_name::DefineConsts(v8::Isolate* pIsolate) { \ 210 void js_class_name::DefineConsts(CFXJS_Engine* pEngine) { \
213 for (size_t i = 0; i < FX_ArraySize(JS_Class_Consts) - 1; ++i) { \ 211 for (size_t i = 0; i < FX_ArraySize(JS_Class_Consts) - 1; ++i) { \
214 FXJS_DefineObjConst( \ 212 pEngine->DefineObjConst( \
215 pIsolate, g_nObjDefnID, JS_Class_Consts[i].pName, \ 213 g_nObjDefnID, JS_Class_Consts[i].pName, \
216 JS_Class_Consts[i].t == 0 \ 214 JS_Class_Consts[i].t == 0 \
217 ? FXJS_NewNumber(pIsolate, JS_Class_Consts[i].number) \ 215 ? pEngine->NewNumber(JS_Class_Consts[i].number) \
218 : FXJS_NewString(pIsolate, JS_Class_Consts[i].str)); \ 216 : pEngine->NewString(JS_Class_Consts[i].str)); \
219 } \ 217 } \
220 } 218 }
221 219
222 // Convenience macros for declaring classes without an alternate. 220 // Convenience macros for declaring classes without an alternate.
223 #define DECLARE_JS_CLASS() DECLARE_JS_CLASS_RICH() 221 #define DECLARE_JS_CLASS() DECLARE_JS_CLASS_RICH()
224 #define IMPLEMENT_JS_CLASS(js_class_name, class_name) \ 222 #define IMPLEMENT_JS_CLASS(js_class_name, class_name) \
225 IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name) 223 IMPLEMENT_JS_CLASS_RICH(js_class_name, class_name, class_name)
226 224
227 // Rich JS classes provide constants, methods, properties, and the ability 225 // Rich JS classes provide constants, methods, properties, and the ability
228 // to construct native object state. 226 // to construct native object state.
229 #define DECLARE_JS_CLASS_RICH() \ 227 #define DECLARE_JS_CLASS_RICH() \
230 DECLARE_JS_CLASS_BASE_PART() \ 228 DECLARE_JS_CLASS_BASE_PART() \
231 DECLARE_JS_CLASS_CONST_PART() \ 229 DECLARE_JS_CLASS_CONST_PART() \
232 DECLARE_JS_CLASS_RICH_PART() 230 DECLARE_JS_CLASS_RICH_PART()
233 231
234 #define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \ 232 #define IMPLEMENT_JS_CLASS_RICH(js_class_name, class_alternate, class_name) \
235 IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ 233 IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \
236 IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ 234 IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \
237 IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \ 235 IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \
238 void js_class_name::DefineJSObjects(v8::Isolate* pIsolate, \ 236 void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine, \
239 FXJSOBJTYPE eObjType) { \ 237 FXJSOBJTYPE eObjType) { \
240 g_nObjDefnID = FXJS_DefineObj(pIsolate, js_class_name::g_pClassName, \ 238 g_nObjDefnID = pEngine->DefineObj(js_class_name::g_pClassName, eObjType, \
241 eObjType, JSConstructor, JSDestructor); \ 239 JSConstructor, JSDestructor); \
242 DefineConsts(pIsolate); \ 240 DefineConsts(pEngine); \
243 DefineProps(pIsolate); \ 241 DefineProps(pEngine); \
244 DefineMethods(pIsolate); \ 242 DefineMethods(pEngine); \
245 } 243 }
246 244
247 #define DECLARE_JS_CLASS_RICH_PART() \ 245 #define DECLARE_JS_CLASS_RICH_PART() \
248 static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj); \ 246 static void JSConstructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj); \
249 static void JSDestructor(v8::Local<v8::Object> obj); \ 247 static void JSDestructor(CFXJS_Engine* pEngine, v8::Local<v8::Object> obj); \
250 static void DefineProps(v8::Isolate* pIsoalte); \ 248 static void DefineProps(CFXJS_Engine* pEngine); \
251 static void DefineMethods(v8::Isolate* pIsoalte); \ 249 static void DefineMethods(CFXJS_Engine* pEngine); \
252 static JSPropertySpec JS_Class_Properties[]; \ 250 static JSPropertySpec JS_Class_Properties[]; \
253 static JSMethodSpec JS_Class_Methods[]; 251 static JSMethodSpec JS_Class_Methods[];
254 252
255 #define IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, \ 253 #define IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, \
256 class_name) \ 254 class_name) \
257 void js_class_name::JSConstructor(CFXJS_Engine* pEngine, \ 255 void js_class_name::JSConstructor(CFXJS_Engine* pEngine, \
258 v8::Local<v8::Object> obj) { \ 256 v8::Local<v8::Object> obj) { \
259 CJS_Object* pObj = new js_class_name(obj); \ 257 CJS_Object* pObj = new js_class_name(obj); \
260 pObj->SetEmbedObject(new class_alternate(pObj)); \ 258 pObj->SetEmbedObject(new class_alternate(pObj)); \
261 FXJS_SetPrivate(nullptr, obj, (void*)pObj); \ 259 pEngine->SetObjectPrivate(obj, (void*)pObj); \
262 pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine)); \ 260 pObj->InitInstance(static_cast<CJS_Runtime*>(pEngine)); \
263 } \ 261 } \
264 void js_class_name::JSDestructor(v8::Local<v8::Object> obj) { \ 262 void js_class_name::JSDestructor(CFXJS_Engine* pEngine, \
265 js_class_name* pObj = (js_class_name*)FXJS_GetPrivate(nullptr, obj); \ 263 v8::Local<v8::Object> obj) { \
266 pObj->ExitInstance(); \ 264 js_class_name* pObj = \
267 delete pObj; \ 265 static_cast<js_class_name*>(pEngine->GetObjectPrivate(obj)); \
268 } \ 266 pObj->ExitInstance(); \
269 void js_class_name::DefineProps(v8::Isolate* pIsolate) { \ 267 delete pObj; \
270 for (size_t i = 0; i < FX_ArraySize(JS_Class_Properties) - 1; ++i) { \ 268 } \
271 FXJS_DefineObjProperty( \ 269 void js_class_name::DefineProps(CFXJS_Engine* pEngine) { \
272 pIsolate, g_nObjDefnID, JS_Class_Properties[i].pName, \ 270 for (size_t i = 0; i < FX_ArraySize(JS_Class_Properties) - 1; ++i) { \
273 JS_Class_Properties[i].pPropGet, JS_Class_Properties[i].pPropPut); \ 271 pEngine->DefineObjProperty(g_nObjDefnID, JS_Class_Properties[i].pName, \
274 } \ 272 JS_Class_Properties[i].pPropGet, \
275 } \ 273 JS_Class_Properties[i].pPropPut); \
276 void js_class_name::DefineMethods(v8::Isolate* pIsolate) { \ 274 } \
277 for (size_t i = 0; i < FX_ArraySize(JS_Class_Methods) - 1; ++i) { \ 275 } \
278 FXJS_DefineObjMethod(pIsolate, g_nObjDefnID, JS_Class_Methods[i].pName, \ 276 void js_class_name::DefineMethods(CFXJS_Engine* pEngine) { \
279 JS_Class_Methods[i].pMethodCall); \ 277 for (size_t i = 0; i < FX_ArraySize(JS_Class_Methods) - 1; ++i) { \
280 } \ 278 pEngine->DefineObjMethod(g_nObjDefnID, JS_Class_Methods[i].pName, \
279 JS_Class_Methods[i].pMethodCall); \
280 } \
281 } 281 }
282 282
283 // Special JS classes implement methods, props, and queries, but not consts. 283 // Special JS classes implement methods, props, and queries, but not consts.
284 #define DECLARE_SPECIAL_JS_CLASS() \ 284 #define DECLARE_SPECIAL_JS_CLASS() \
285 DECLARE_JS_CLASS_BASE_PART() \ 285 DECLARE_JS_CLASS_BASE_PART() \
286 DECLARE_JS_CLASS_CONST_PART() \ 286 DECLARE_JS_CLASS_CONST_PART() \
287 DECLARE_JS_CLASS_RICH_PART() \ 287 DECLARE_JS_CLASS_RICH_PART() \
288 DECLARE_SPECIAL_JS_CLASS_PART() 288 DECLARE_SPECIAL_JS_CLASS_PART()
289 289
290 #define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \ 290 #define IMPLEMENT_SPECIAL_JS_CLASS(js_class_name, class_alternate, class_name) \
291 IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \ 291 IMPLEMENT_JS_CLASS_BASE_PART(js_class_name, class_name) \
292 IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \ 292 IMPLEMENT_JS_CLASS_CONST_PART(js_class_name, class_name) \
293 IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \ 293 IMPLEMENT_JS_CLASS_RICH_PART(js_class_name, class_alternate, class_name) \
294 IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, class_name) \ 294 IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, class_name) \
295 void js_class_name::DefineJSObjects(v8::Isolate* pIsolate, \ 295 void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine, \
296 FXJSOBJTYPE eObjType) { \ 296 FXJSOBJTYPE eObjType) { \
297 g_nObjDefnID = FXJS_DefineObj(pIsolate, js_class_name::g_pClassName, \ 297 g_nObjDefnID = pEngine->DefineObj(js_class_name::g_pClassName, eObjType, \
298 eObjType, JSConstructor, JSDestructor); \ 298 JSConstructor, JSDestructor); \
299 DefineConsts(pIsolate); \ 299 DefineConsts(pEngine); \
300 DefineProps(pIsolate); \ 300 DefineProps(pEngine); \
301 DefineMethods(pIsolate); \ 301 DefineMethods(pEngine); \
302 DefineAllProperties(pIsolate); \ 302 DefineAllProperties(pEngine); \
303 } 303 }
304 304
305 #define DECLARE_SPECIAL_JS_CLASS_PART() \ 305 #define DECLARE_SPECIAL_JS_CLASS_PART() \
306 static void queryprop_static( \ 306 static void queryprop_static( \
307 v8::Local<v8::String> property, \ 307 v8::Local<v8::String> property, \
308 const v8::PropertyCallbackInfo<v8::Integer>& info); \ 308 const v8::PropertyCallbackInfo<v8::Integer>& info); \
309 static void getprop_static(v8::Local<v8::String> property, \ 309 static void getprop_static(v8::Local<v8::String> property, \
310 const v8::PropertyCallbackInfo<v8::Value>& info); \ 310 const v8::PropertyCallbackInfo<v8::Value>& info); \
311 static void putprop_static(v8::Local<v8::String> property, \ 311 static void putprop_static(v8::Local<v8::String> property, \
312 v8::Local<v8::Value> value, \ 312 v8::Local<v8::Value> value, \
313 const v8::PropertyCallbackInfo<v8::Value>& info); \ 313 const v8::PropertyCallbackInfo<v8::Value>& info); \
314 static void delprop_static( \ 314 static void delprop_static( \
315 v8::Local<v8::String> property, \ 315 v8::Local<v8::String> property, \
316 const v8::PropertyCallbackInfo<v8::Boolean>& info); \ 316 const v8::PropertyCallbackInfo<v8::Boolean>& info); \
317 static void DefineAllProperties(v8::Isolate* pIsolate); 317 static void DefineAllProperties(CFXJS_Engine* pEngine);
318 318
319 #define IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, \ 319 #define IMPLEMENT_SPECIAL_JS_CLASS_PART(js_class_name, class_alternate, \
320 class_name) \ 320 class_name) \
321 void js_class_name::queryprop_static( \ 321 void js_class_name::queryprop_static( \
322 v8::Local<v8::String> property, \ 322 v8::Local<v8::String> property, \
323 const v8::PropertyCallbackInfo<v8::Integer>& info) { \ 323 const v8::PropertyCallbackInfo<v8::Integer>& info) { \
324 JSSpecialPropQuery<class_alternate>(#class_name, property, info); \ 324 JSSpecialPropQuery<class_alternate>(#class_name, property, info); \
325 } \ 325 } \
326 void js_class_name::getprop_static( \ 326 void js_class_name::getprop_static( \
327 v8::Local<v8::String> property, \ 327 v8::Local<v8::String> property, \
328 const v8::PropertyCallbackInfo<v8::Value>& info) { \ 328 const v8::PropertyCallbackInfo<v8::Value>& info) { \
329 JSSpecialPropGet<class_alternate>(#class_name, property, info); \ 329 JSSpecialPropGet<class_alternate>(#class_name, property, info); \
330 } \ 330 } \
331 void js_class_name::putprop_static( \ 331 void js_class_name::putprop_static( \
332 v8::Local<v8::String> property, v8::Local<v8::Value> value, \ 332 v8::Local<v8::String> property, v8::Local<v8::Value> value, \
333 const v8::PropertyCallbackInfo<v8::Value>& info) { \ 333 const v8::PropertyCallbackInfo<v8::Value>& info) { \
334 JSSpecialPropPut<class_alternate>(#class_name, property, value, info); \ 334 JSSpecialPropPut<class_alternate>(#class_name, property, value, info); \
335 } \ 335 } \
336 void js_class_name::delprop_static( \ 336 void js_class_name::delprop_static( \
337 v8::Local<v8::String> property, \ 337 v8::Local<v8::String> property, \
338 const v8::PropertyCallbackInfo<v8::Boolean>& info) { \ 338 const v8::PropertyCallbackInfo<v8::Boolean>& info) { \
339 JSSpecialPropDel<class_alternate>(#class_name, property, info); \ 339 JSSpecialPropDel<class_alternate>(#class_name, property, info); \
340 } \ 340 } \
341 void js_class_name::DefineAllProperties(v8::Isolate* pIsolate) { \ 341 void js_class_name::DefineAllProperties(CFXJS_Engine* pEngine) { \
342 FXJS_DefineObjAllProperties( \ 342 pEngine->DefineObjAllProperties( \
343 pIsolate, g_nObjDefnID, js_class_name::queryprop_static, \ 343 g_nObjDefnID, js_class_name::queryprop_static, \
344 js_class_name::getprop_static, js_class_name::putprop_static, \ 344 js_class_name::getprop_static, js_class_name::putprop_static, \
345 js_class_name::delprop_static); \ 345 js_class_name::delprop_static); \
346 } 346 }
347 347
348 template <class Alt> 348 template <class Alt>
349 void JSSpecialPropQuery(const char*, 349 void JSSpecialPropQuery(const char*,
350 v8::Local<v8::String> property, 350 v8::Local<v8::String> property,
351 const v8::PropertyCallbackInfo<v8::Integer>& info) { 351 const v8::PropertyCallbackInfo<v8::Integer>& info) {
352 v8::Isolate* isolate = info.GetIsolate(); 352 CJS_Runtime* pRuntime =
353 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
353 v8::String::Utf8Value utf8_value(property); 354 v8::String::Utf8Value utf8_value(property);
354 CFX_WideString propname = CFX_WideString::FromUTF8( 355 CFX_WideString propname = CFX_WideString::FromUTF8(
355 CFX_ByteStringC(*utf8_value, utf8_value.length())); 356 CFX_ByteStringC(*utf8_value, utf8_value.length()));
356 CJS_Object* pJSObj = 357 CJS_Object* pJSObj =
357 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); 358 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
358 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); 359 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
359 FX_BOOL bRet = pObj->QueryProperty(propname.c_str()); 360 FX_BOOL bRet = pObj->QueryProperty(propname.c_str());
360 info.GetReturnValue().Set(bRet ? 4 : 0); 361 info.GetReturnValue().Set(bRet ? 4 : 0);
361 } 362 }
362 363
363 template <class Alt> 364 template <class Alt>
364 void JSSpecialPropGet(const char* class_name, 365 void JSSpecialPropGet(const char* class_name,
365 v8::Local<v8::String> property, 366 v8::Local<v8::String> property,
366 const v8::PropertyCallbackInfo<v8::Value>& info) { 367 const v8::PropertyCallbackInfo<v8::Value>& info) {
367 v8::Isolate* isolate = info.GetIsolate();
368 CJS_Runtime* pRuntime = 368 CJS_Runtime* pRuntime =
369 static_cast<CJS_Runtime*>(FXJS_GetCurrentEngineFromIsolate(isolate)); 369 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
370 if (!pRuntime) 370 if (!pRuntime)
371 return; 371 return;
372 IJS_Context* pContext = pRuntime->GetCurrentContext();
373 CJS_Object* pJSObj = 372 CJS_Object* pJSObj =
374 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); 373 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
375 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); 374 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
376 v8::String::Utf8Value utf8_value(property); 375 v8::String::Utf8Value utf8_value(property);
377 CFX_WideString propname = CFX_WideString::FromUTF8( 376 CFX_WideString propname = CFX_WideString::FromUTF8(
378 CFX_ByteStringC(*utf8_value, utf8_value.length())); 377 CFX_ByteStringC(*utf8_value, utf8_value.length()));
379 CFX_WideString sError; 378 CFX_WideString sError;
380 CJS_PropValue value(pRuntime); 379 CJS_PropValue value(pRuntime);
381 value.StartGetting(); 380 value.StartGetting();
382 if (!pObj->DoProperty(pContext, propname.c_str(), value, sError)) { 381 if (!pObj->DoProperty(pRuntime->GetCurrentContext(), propname.c_str(), value,
383 FXJS_Error(isolate, JSFormatErrorString(class_name, "GetProperty", sError)); 382 sError)) {
383 pRuntime->Error(JSFormatErrorString(class_name, "GetProperty", sError));
384 return; 384 return;
385 } 385 }
386 info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(isolate)); 386 info.GetReturnValue().Set(value.GetJSValue()->ToV8Value(pRuntime));
387 } 387 }
388 388
389 template <class Alt> 389 template <class Alt>
390 void JSSpecialPropPut(const char* class_name, 390 void JSSpecialPropPut(const char* class_name,
391 v8::Local<v8::String> property, 391 v8::Local<v8::String> property,
392 v8::Local<v8::Value> value, 392 v8::Local<v8::Value> value,
393 const v8::PropertyCallbackInfo<v8::Value>& info) { 393 const v8::PropertyCallbackInfo<v8::Value>& info) {
394 v8::Isolate* isolate = info.GetIsolate();
395 CJS_Runtime* pRuntime = 394 CJS_Runtime* pRuntime =
396 static_cast<CJS_Runtime*>(FXJS_GetCurrentEngineFromIsolate(isolate)); 395 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
397 if (!pRuntime) 396 if (!pRuntime)
398 return; 397 return;
399 IJS_Context* pContext = pRuntime->GetCurrentContext();
400 CJS_Object* pJSObj = 398 CJS_Object* pJSObj =
401 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); 399 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
402 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); 400 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
403 v8::String::Utf8Value utf8_value(property); 401 v8::String::Utf8Value utf8_value(property);
404 CFX_WideString propname = CFX_WideString::FromUTF8( 402 CFX_WideString propname = CFX_WideString::FromUTF8(
405 CFX_ByteStringC(*utf8_value, utf8_value.length())); 403 CFX_ByteStringC(*utf8_value, utf8_value.length()));
406 CFX_WideString sError; 404 CFX_WideString sError;
407 CJS_PropValue PropValue(pRuntime, CJS_Value(pRuntime, value)); 405 CJS_PropValue PropValue(pRuntime, CJS_Value(pRuntime, value));
408 PropValue.StartSetting(); 406 PropValue.StartSetting();
409 if (!pObj->DoProperty(pContext, propname.c_str(), PropValue, sError)) { 407 if (!pObj->DoProperty(pRuntime->GetCurrentContext(), propname.c_str(),
410 FXJS_Error(isolate, JSFormatErrorString(class_name, "PutProperty", sError)); 408 PropValue, sError)) {
409 pRuntime->Error(JSFormatErrorString(class_name, "PutProperty", sError));
411 } 410 }
412 } 411 }
413 412
414 template <class Alt> 413 template <class Alt>
415 void JSSpecialPropDel(const char* class_name, 414 void JSSpecialPropDel(const char* class_name,
416 v8::Local<v8::String> property, 415 v8::Local<v8::String> property,
417 const v8::PropertyCallbackInfo<v8::Boolean>& info) { 416 const v8::PropertyCallbackInfo<v8::Boolean>& info) {
418 v8::Isolate* isolate = info.GetIsolate();
419 CJS_Runtime* pRuntime = 417 CJS_Runtime* pRuntime =
420 static_cast<CJS_Runtime*>(FXJS_GetCurrentEngineFromIsolate(isolate)); 418 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
421 if (!pRuntime) 419 if (!pRuntime)
422 return; 420 return;
423 IJS_Context* pContext = pRuntime->GetCurrentContext();
424 CJS_Object* pJSObj = 421 CJS_Object* pJSObj =
425 reinterpret_cast<CJS_Object*>(FXJS_GetPrivate(isolate, info.Holder())); 422 static_cast<CJS_Object*>(pRuntime->GetObjectPrivate(info.Holder()));
426 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject()); 423 Alt* pObj = reinterpret_cast<Alt*>(pJSObj->GetEmbedObject());
427 v8::String::Utf8Value utf8_value(property); 424 v8::String::Utf8Value utf8_value(property);
428 CFX_WideString propname = CFX_WideString::FromUTF8( 425 CFX_WideString propname = CFX_WideString::FromUTF8(
429 CFX_ByteStringC(*utf8_value, utf8_value.length())); 426 CFX_ByteStringC(*utf8_value, utf8_value.length()));
430 CFX_WideString sError; 427 CFX_WideString sError;
431 if (!pObj->DelProperty(pContext, propname.c_str(), sError)) { 428 if (!pObj->DelProperty(pRuntime->GetCurrentContext(), propname.c_str(),
429 sError)) {
432 CFX_ByteString cbName; 430 CFX_ByteString cbName;
433 cbName.Format("%s.%s", class_name, "DelProperty"); 431 cbName.Format("%s.%s", class_name, "DelProperty");
434 // Probably a missing call to JSFX_Error(). 432 // Probably a missing call to JSFX_Error().
435 } 433 }
436 } 434 }
437 435
438 template <FX_BOOL (*F)(IJS_Context*, 436 template <FX_BOOL (*F)(IJS_Context*,
439 const std::vector<CJS_Value>&, 437 const std::vector<CJS_Value>&,
440 CJS_Value&, 438 CJS_Value&,
441 CFX_WideString&)> 439 CFX_WideString&)>
442 void JSGlobalFunc(const char* func_name_string, 440 void JSGlobalFunc(const char* func_name_string,
443 const v8::FunctionCallbackInfo<v8::Value>& info) { 441 const v8::FunctionCallbackInfo<v8::Value>& info) {
444 CJS_Runtime* pRuntime = static_cast<CJS_Runtime*>( 442 CJS_Runtime* pRuntime =
445 FXJS_GetCurrentEngineFromIsolate(info.GetIsolate())); 443 CJS_Runtime::CurrentRuntimeFromIsolate(info.GetIsolate());
446 if (!pRuntime) 444 if (!pRuntime)
447 return; 445 return;
448 IJS_Context* pContext = pRuntime->GetCurrentContext();
449 std::vector<CJS_Value> parameters; 446 std::vector<CJS_Value> parameters;
450 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) { 447 for (unsigned int i = 0; i < (unsigned int)info.Length(); i++) {
451 parameters.push_back(CJS_Value(pRuntime, info[i])); 448 parameters.push_back(CJS_Value(pRuntime, info[i]));
452 } 449 }
453 CJS_Value valueRes(pRuntime); 450 CJS_Value valueRes(pRuntime);
454 CFX_WideString sError; 451 CFX_WideString sError;
455 if (!(*F)(pContext, parameters, valueRes, sError)) { 452 if (!(*F)(pRuntime->GetCurrentContext(), parameters, valueRes, sError)) {
456 FXJS_Error(pRuntime->GetIsolate(), 453 pRuntime->Error(JSFormatErrorString(func_name_string, nullptr, sError));
457 JSFormatErrorString(func_name_string, nullptr, sError));
458 return; 454 return;
459 } 455 }
460 info.GetReturnValue().Set(valueRes.ToV8Value(pRuntime->GetIsolate())); 456 info.GetReturnValue().Set(valueRes.ToV8Value(pRuntime));
461 } 457 }
462 458
463 #define JS_STATIC_GLOBAL_FUN(fun_name) \ 459 #define JS_STATIC_GLOBAL_FUN(fun_name) \
464 static void fun_name##_static( \ 460 static void fun_name##_static( \
465 const v8::FunctionCallbackInfo<v8::Value>& info) { \ 461 const v8::FunctionCallbackInfo<v8::Value>& info) { \
466 JSGlobalFunc<fun_name>(#fun_name, info); \ 462 JSGlobalFunc<fun_name>(#fun_name, info); \
467 } 463 }
468 464
469 #define JS_STATIC_DECLARE_GLOBAL_FUN() \ 465 #define JS_STATIC_DECLARE_GLOBAL_FUN() \
470 static JSMethodSpec global_methods[]; \ 466 static JSMethodSpec global_methods[]; \
471 static void DefineJSObjects(v8::Isolate* pIsolate) 467 static void DefineJSObjects(CFXJS_Engine* pEngine)
472 468
473 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \ 469 #define BEGIN_JS_STATIC_GLOBAL_FUN(js_class_name) \
474 JSMethodSpec js_class_name::global_methods[] = { 470 JSMethodSpec js_class_name::global_methods[] = {
475 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name) \ 471 #define JS_STATIC_GLOBAL_FUN_ENTRY(method_name) \
476 JS_STATIC_METHOD_ENTRY(method_name) 472 JS_STATIC_METHOD_ENTRY(method_name)
477 473
478 #define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD() 474 #define END_JS_STATIC_GLOBAL_FUN() END_JS_STATIC_METHOD()
479 475
480 #define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \ 476 #define IMPLEMENT_JS_STATIC_GLOBAL_FUN(js_class_name) \
481 void js_class_name::DefineJSObjects(v8::Isolate* pIsolate) { \ 477 void js_class_name::DefineJSObjects(CFXJS_Engine* pEngine) { \
482 for (size_t i = 0; i < FX_ArraySize(global_methods) - 1; ++i) { \ 478 for (size_t i = 0; i < FX_ArraySize(global_methods) - 1; ++i) { \
483 FXJS_DefineGlobalMethod(pIsolate, \ 479 pEngine->DefineGlobalMethod( \
484 js_class_name::global_methods[i].pName, \ 480 js_class_name::global_methods[i].pName, \
485 js_class_name::global_methods[i].pMethodCall); \ 481 js_class_name::global_methods[i].pMethodCall); \
486 } \ 482 } \
487 } 483 }
488 484
489 #endif // FPDFSDK_JAVASCRIPT_JS_DEFINE_H_ 485 #endif // FPDFSDK_JAVASCRIPT_JS_DEFINE_H_
OLDNEW
« no previous file with comments | « fpdfsdk/javascript/Field.cpp ('k') | fpdfsdk/javascript/JS_EventHandler.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698