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 #include "fpdfsdk/javascript/global.h" | 7 #include "fpdfsdk/javascript/global.h" |
8 | 8 |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
161 const std::vector<CJS_Value>& params, | 161 const std::vector<CJS_Value>& params, |
162 CJS_Value& vRet, | 162 CJS_Value& vRet, |
163 CFX_WideString& sError) { | 163 CFX_WideString& sError) { |
164 CJS_Context* pContext = static_cast<CJS_Context*>(cc); | 164 CJS_Context* pContext = static_cast<CJS_Context*>(cc); |
165 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); | 165 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); |
166 if (params.size() != 2) { | 166 if (params.size() != 2) { |
167 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); | 167 sError = JSGetStringFromID(pContext, IDS_STRING_JSPARAMERROR); |
168 return FALSE; | 168 return FALSE; |
169 } | 169 } |
170 | 170 |
171 auto it = m_mapGlobal.find(params[0].ToCFXByteString(pRuntime->GetIsolate())); | 171 auto it = m_mapGlobal.find(params[0].ToCFXByteString(pRuntime)); |
172 if (it != m_mapGlobal.end()) { | 172 if (it != m_mapGlobal.end()) { |
173 JSGlobalData* pData = it->second; | 173 JSGlobalData* pData = it->second; |
174 if (!pData->bDeleted) { | 174 if (!pData->bDeleted) { |
175 pData->bPersistent = params[1].ToBool(pRuntime->GetIsolate()); | 175 pData->bPersistent = params[1].ToBool(pRuntime); |
176 return TRUE; | 176 return TRUE; |
177 } | 177 } |
178 } | 178 } |
179 | 179 |
180 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); | 180 sError = JSGetStringFromID(pContext, IDS_STRING_JSNOGLOBAL); |
181 return FALSE; | 181 return FALSE; |
182 } | 182 } |
183 | 183 |
184 void JSGlobalAlternate::UpdateGlobalPersistentVariables() { | 184 void JSGlobalAlternate::UpdateGlobalPersistentVariables() { |
| 185 CJS_Runtime* pRuntime = |
| 186 static_cast<CJS_Runtime*>(CFXJS_Engine::CurrentEngineFromIsolate( |
| 187 m_pJSObject->ToV8Object()->GetIsolate())); |
| 188 |
185 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) { | 189 for (int i = 0, sz = m_pGlobalData->GetSize(); i < sz; i++) { |
186 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); | 190 CJS_GlobalData_Element* pData = m_pGlobalData->GetAt(i); |
187 switch (pData->data.nType) { | 191 switch (pData->data.nType) { |
188 case JS_GlobalDataType::NUMBER: | 192 case JS_GlobalDataType::NUMBER: |
189 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NUMBER, | 193 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NUMBER, |
190 pData->data.dData, false, "", | 194 pData->data.dData, false, "", |
191 v8::Local<v8::Object>(), pData->bPersistent == 1); | 195 v8::Local<v8::Object>(), pData->bPersistent == 1); |
192 FXJS_PutObjectNumber(nullptr, m_pJSObject->ToV8Object(), | 196 pRuntime->PutObjectNumber(m_pJSObject->ToV8Object(), |
193 pData->data.sKey.UTF8Decode(), pData->data.dData); | 197 pData->data.sKey.UTF8Decode(), |
| 198 pData->data.dData); |
194 break; | 199 break; |
195 case JS_GlobalDataType::BOOLEAN: | 200 case JS_GlobalDataType::BOOLEAN: |
196 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::BOOLEAN, 0, | 201 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::BOOLEAN, 0, |
197 (bool)(pData->data.bData == 1), "", | 202 (bool)(pData->data.bData == 1), "", |
198 v8::Local<v8::Object>(), pData->bPersistent == 1); | 203 v8::Local<v8::Object>(), pData->bPersistent == 1); |
199 FXJS_PutObjectBoolean(nullptr, m_pJSObject->ToV8Object(), | 204 pRuntime->PutObjectBoolean(m_pJSObject->ToV8Object(), |
200 pData->data.sKey.UTF8Decode(), | 205 pData->data.sKey.UTF8Decode(), |
201 (bool)(pData->data.bData == 1)); | 206 (bool)(pData->data.bData == 1)); |
202 break; | 207 break; |
203 case JS_GlobalDataType::STRING: | 208 case JS_GlobalDataType::STRING: |
204 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::STRING, 0, | 209 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::STRING, 0, |
205 false, pData->data.sData, v8::Local<v8::Object>(), | 210 false, pData->data.sData, v8::Local<v8::Object>(), |
206 pData->bPersistent == 1); | 211 pData->bPersistent == 1); |
207 FXJS_PutObjectString(nullptr, m_pJSObject->ToV8Object(), | 212 pRuntime->PutObjectString(m_pJSObject->ToV8Object(), |
208 pData->data.sKey.UTF8Decode(), | 213 pData->data.sKey.UTF8Decode(), |
209 pData->data.sData.UTF8Decode()); | 214 pData->data.sData.UTF8Decode()); |
210 break; | 215 break; |
211 case JS_GlobalDataType::OBJECT: { | 216 case JS_GlobalDataType::OBJECT: { |
212 v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate(); | 217 v8::Local<v8::Object> pObj = pRuntime->NewFxDynamicObj(-1); |
213 v8::Local<v8::Object> pObj = | |
214 FXJS_NewFxDynamicObj(pRuntime, nullptr, -1); | |
215 | 218 |
216 PutObjectProperty(pObj, &pData->data); | 219 PutObjectProperty(pObj, &pData->data); |
217 | |
218 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0, | 220 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::OBJECT, 0, |
219 false, "", pObj, pData->bPersistent == 1); | 221 false, "", pObj, pData->bPersistent == 1); |
220 FXJS_PutObjectObject(nullptr, m_pJSObject->ToV8Object(), | 222 pRuntime->PutObjectObject(m_pJSObject->ToV8Object(), |
221 pData->data.sKey.UTF8Decode(), pObj); | 223 pData->data.sKey.UTF8Decode(), pObj); |
222 } break; | 224 } break; |
223 case JS_GlobalDataType::NULLOBJ: | 225 case JS_GlobalDataType::NULLOBJ: |
224 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NULLOBJ, 0, | 226 SetGlobalVariables(pData->data.sKey, JS_GlobalDataType::NULLOBJ, 0, |
225 false, "", v8::Local<v8::Object>(), | 227 false, "", v8::Local<v8::Object>(), |
226 pData->bPersistent == 1); | 228 pData->bPersistent == 1); |
227 FXJS_PutObjectNull(nullptr, m_pJSObject->ToV8Object(), | 229 pRuntime->PutObjectNull(m_pJSObject->ToV8Object(), |
228 pData->data.sKey.UTF8Decode()); | 230 pData->data.sKey.UTF8Decode()); |
229 break; | 231 break; |
230 } | 232 } |
231 } | 233 } |
232 } | 234 } |
233 | 235 |
234 void JSGlobalAlternate::CommitGlobalPersisitentVariables(IJS_Context* cc) { | 236 void JSGlobalAlternate::CommitGlobalPersisitentVariables(IJS_Context* cc) { |
235 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { | 237 for (auto it = m_mapGlobal.begin(); it != m_mapGlobal.end(); ++it) { |
236 CFX_ByteString name = it->first; | 238 CFX_ByteString name = it->first; |
237 JSGlobalData* pData = it->second; | 239 JSGlobalData* pData = it->second; |
238 if (pData->bDeleted) { | 240 if (pData->bDeleted) { |
(...skipping 25 matching lines...) Expand all Loading... |
264 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); | 266 m_pGlobalData->SetGlobalVariablePersistent(name, pData->bPersistent); |
265 break; | 267 break; |
266 } | 268 } |
267 } | 269 } |
268 } | 270 } |
269 } | 271 } |
270 | 272 |
271 void JSGlobalAlternate::ObjectToArray(IJS_Context* cc, | 273 void JSGlobalAlternate::ObjectToArray(IJS_Context* cc, |
272 v8::Local<v8::Object> pObj, | 274 v8::Local<v8::Object> pObj, |
273 CJS_GlobalVariableArray& array) { | 275 CJS_GlobalVariableArray& array) { |
274 v8::Isolate* isolate = pObj->GetIsolate(); | |
275 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); | 276 CJS_Runtime* pRuntime = CJS_Runtime::FromContext(cc); |
276 std::vector<CFX_WideString> pKeyList = | 277 std::vector<CFX_WideString> pKeyList = pRuntime->GetObjectPropertyNames(pObj); |
277 FXJS_GetObjectPropertyNames(isolate, pObj); | |
278 for (const auto& ws : pKeyList) { | 278 for (const auto& ws : pKeyList) { |
279 CFX_ByteString sKey = ws.UTF8Encode(); | 279 CFX_ByteString sKey = ws.UTF8Encode(); |
280 v8::Local<v8::Value> v = FXJS_GetObjectProperty(isolate, pObj, ws); | 280 v8::Local<v8::Value> v = pRuntime->GetObjectProperty(pObj, ws); |
281 switch (CJS_Value::GetValueType(v)) { | 281 switch (CJS_Value::GetValueType(v)) { |
282 case CJS_Value::VT_number: { | 282 case CJS_Value::VT_number: { |
283 CJS_KeyValue* pObjElement = new CJS_KeyValue; | 283 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
284 pObjElement->nType = JS_GlobalDataType::NUMBER; | 284 pObjElement->nType = JS_GlobalDataType::NUMBER; |
285 pObjElement->sKey = sKey; | 285 pObjElement->sKey = sKey; |
286 pObjElement->dData = FXJS_ToNumber(isolate, v); | 286 pObjElement->dData = pRuntime->ToNumber(v); |
287 array.Add(pObjElement); | 287 array.Add(pObjElement); |
288 } break; | 288 } break; |
289 case CJS_Value::VT_boolean: { | 289 case CJS_Value::VT_boolean: { |
290 CJS_KeyValue* pObjElement = new CJS_KeyValue; | 290 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
291 pObjElement->nType = JS_GlobalDataType::BOOLEAN; | 291 pObjElement->nType = JS_GlobalDataType::BOOLEAN; |
292 pObjElement->sKey = sKey; | 292 pObjElement->sKey = sKey; |
293 pObjElement->dData = FXJS_ToBoolean(isolate, v); | 293 pObjElement->dData = pRuntime->ToBoolean(v); |
294 array.Add(pObjElement); | 294 array.Add(pObjElement); |
295 } break; | 295 } break; |
296 case CJS_Value::VT_string: { | 296 case CJS_Value::VT_string: { |
297 CFX_ByteString sValue = | 297 CFX_ByteString sValue = |
298 CJS_Value(pRuntime, v).ToCFXByteString(pRuntime->GetIsolate()); | 298 CJS_Value(pRuntime, v).ToCFXByteString(pRuntime); |
299 CJS_KeyValue* pObjElement = new CJS_KeyValue; | 299 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
300 pObjElement->nType = JS_GlobalDataType::STRING; | 300 pObjElement->nType = JS_GlobalDataType::STRING; |
301 pObjElement->sKey = sKey; | 301 pObjElement->sKey = sKey; |
302 pObjElement->sData = sValue; | 302 pObjElement->sData = sValue; |
303 array.Add(pObjElement); | 303 array.Add(pObjElement); |
304 } break; | 304 } break; |
305 case CJS_Value::VT_object: { | 305 case CJS_Value::VT_object: { |
306 CJS_KeyValue* pObjElement = new CJS_KeyValue; | 306 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
307 pObjElement->nType = JS_GlobalDataType::OBJECT; | 307 pObjElement->nType = JS_GlobalDataType::OBJECT; |
308 pObjElement->sKey = sKey; | 308 pObjElement->sKey = sKey; |
309 ObjectToArray(cc, FXJS_ToObject(isolate, v), pObjElement->objData); | 309 ObjectToArray(cc, pRuntime->ToObject(v), pObjElement->objData); |
310 array.Add(pObjElement); | 310 array.Add(pObjElement); |
311 } break; | 311 } break; |
312 case CJS_Value::VT_null: { | 312 case CJS_Value::VT_null: { |
313 CJS_KeyValue* pObjElement = new CJS_KeyValue; | 313 CJS_KeyValue* pObjElement = new CJS_KeyValue; |
314 pObjElement->nType = JS_GlobalDataType::NULLOBJ; | 314 pObjElement->nType = JS_GlobalDataType::NULLOBJ; |
315 pObjElement->sKey = sKey; | 315 pObjElement->sKey = sKey; |
316 array.Add(pObjElement); | 316 array.Add(pObjElement); |
317 } break; | 317 } break; |
318 default: | 318 default: |
319 break; | 319 break; |
320 } | 320 } |
321 } | 321 } |
322 } | 322 } |
323 | 323 |
324 void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj, | 324 void JSGlobalAlternate::PutObjectProperty(v8::Local<v8::Object> pObj, |
325 CJS_KeyValue* pData) { | 325 CJS_KeyValue* pData) { |
| 326 CJS_Runtime* pRuntime = CJS_Runtime::CurrentRuntimeFromIsolate( |
| 327 m_pJSObject->ToV8Object()->GetIsolate()); |
| 328 |
326 for (int i = 0, sz = pData->objData.Count(); i < sz; i++) { | 329 for (int i = 0, sz = pData->objData.Count(); i < sz; i++) { |
327 CJS_KeyValue* pObjData = pData->objData.GetAt(i); | 330 CJS_KeyValue* pObjData = pData->objData.GetAt(i); |
328 switch (pObjData->nType) { | 331 switch (pObjData->nType) { |
329 case JS_GlobalDataType::NUMBER: | 332 case JS_GlobalDataType::NUMBER: |
330 FXJS_PutObjectNumber(nullptr, pObj, pObjData->sKey.UTF8Decode(), | 333 pRuntime->PutObjectNumber(pObj, pObjData->sKey.UTF8Decode(), |
331 pObjData->dData); | 334 pObjData->dData); |
332 break; | 335 break; |
333 case JS_GlobalDataType::BOOLEAN: | 336 case JS_GlobalDataType::BOOLEAN: |
334 FXJS_PutObjectBoolean(nullptr, pObj, pObjData->sKey.UTF8Decode(), | 337 pRuntime->PutObjectBoolean(pObj, pObjData->sKey.UTF8Decode(), |
335 pObjData->bData == 1); | 338 pObjData->bData == 1); |
336 break; | 339 break; |
337 case JS_GlobalDataType::STRING: | 340 case JS_GlobalDataType::STRING: |
338 FXJS_PutObjectString(nullptr, pObj, pObjData->sKey.UTF8Decode(), | 341 pRuntime->PutObjectString(pObj, pObjData->sKey.UTF8Decode(), |
339 pObjData->sData.UTF8Decode()); | 342 pObjData->sData.UTF8Decode()); |
340 break; | 343 break; |
341 case JS_GlobalDataType::OBJECT: { | 344 case JS_GlobalDataType::OBJECT: { |
342 v8::Isolate* pRuntime = m_pJSObject->ToV8Object()->GetIsolate(); | 345 v8::Local<v8::Object> pNewObj = pRuntime->NewFxDynamicObj(-1); |
343 v8::Local<v8::Object> pNewObj = | |
344 FXJS_NewFxDynamicObj(pRuntime, nullptr, -1); | |
345 PutObjectProperty(pNewObj, pObjData); | 346 PutObjectProperty(pNewObj, pObjData); |
346 FXJS_PutObjectObject(nullptr, pObj, pObjData->sKey.UTF8Decode(), | 347 pRuntime->PutObjectObject(pObj, pObjData->sKey.UTF8Decode(), pNewObj); |
347 pNewObj); | |
348 } break; | 348 } break; |
349 case JS_GlobalDataType::NULLOBJ: | 349 case JS_GlobalDataType::NULLOBJ: |
350 FXJS_PutObjectNull(nullptr, pObj, pObjData->sKey.UTF8Decode()); | 350 pRuntime->PutObjectNull(pObj, pObjData->sKey.UTF8Decode()); |
351 break; | 351 break; |
352 } | 352 } |
353 } | 353 } |
354 } | 354 } |
355 | 355 |
356 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { | 356 void JSGlobalAlternate::DestroyGlobalPersisitentVariables() { |
357 for (const auto& pair : m_mapGlobal) { | 357 for (const auto& pair : m_mapGlobal) { |
358 delete pair.second; | 358 delete pair.second; |
359 } | 359 } |
360 m_mapGlobal.clear(); | 360 m_mapGlobal.clear(); |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
434 pNewData->nType = JS_GlobalDataType::NULLOBJ; | 434 pNewData->nType = JS_GlobalDataType::NULLOBJ; |
435 pNewData->bPersistent = bDefaultPersistent; | 435 pNewData->bPersistent = bDefaultPersistent; |
436 } break; | 436 } break; |
437 default: | 437 default: |
438 return FALSE; | 438 return FALSE; |
439 } | 439 } |
440 | 440 |
441 m_mapGlobal[propname] = pNewData; | 441 m_mapGlobal[propname] = pNewData; |
442 return TRUE; | 442 return TRUE; |
443 } | 443 } |
OLD | NEW |