@@ -296,6 +296,56 @@ void BrowserApp::SetDocumentVisibility(CefRefPtr<CefBrowser> browser,
296
296
}
297
297
#endif
298
298
299
+ CefRefPtr<CefV8Value> CefValueToCefV8Value (CefRefPtr<CefValue> value)
300
+ {
301
+ CefRefPtr<CefV8Value> result;
302
+ switch (value->GetType ()) {
303
+ case VTYPE_INVALID:
304
+ result = CefV8Value::CreateNull ();
305
+ break ;
306
+ case VTYPE_NULL:
307
+ result = CefV8Value::CreateNull ();
308
+ break ;
309
+ case VTYPE_BOOL:
310
+ result = CefV8Value::CreateBool (value->GetBool ());
311
+ break ;
312
+ case VTYPE_INT:
313
+ result = CefV8Value::CreateInt (value->GetInt ());
314
+ break ;
315
+ case VTYPE_DOUBLE:
316
+ result = CefV8Value::CreateDouble (value->GetDouble ());
317
+ break ;
318
+ case VTYPE_STRING:
319
+ result = CefV8Value::CreateString (value->GetString ());
320
+ break ;
321
+ case VTYPE_BINARY:
322
+ result = CefV8Value::CreateNull ();
323
+ break ;
324
+ case VTYPE_DICTIONARY: {
325
+ result = CefV8Value::CreateObject (nullptr , nullptr );
326
+ CefRefPtr<CefDictionaryValue> dict = value->GetDictionary ();
327
+ CefDictionaryValue::KeyList keys;
328
+ dict->GetKeys (keys);
329
+ for (unsigned int i = 0 ; i < keys.size (); i++) {
330
+ CefString key = keys[i];
331
+ result->SetValue (
332
+ key, CefValueToCefV8Value (dict->GetValue (key)),
333
+ V8_PROPERTY_ATTRIBUTE_NONE);
334
+ }
335
+ } break ;
336
+ case VTYPE_LIST: {
337
+ CefRefPtr<CefListValue> list = value->GetList ();
338
+ size_t size = list->GetSize ();
339
+ result = CefV8Value::CreateArray ((int )size);
340
+ for (size_t i = 0 ; i < size; i++) {
341
+ result->SetValue ((int )i, CefValueToCefV8Value (
342
+ list->GetValue (i)));
343
+ }
344
+ } break ;
345
+ }
346
+ return result;
347
+ }
348
+
299
349
bool BrowserApp::OnProcessMessageReceived (CefRefPtr<CefBrowser> browser,
300
350
CefRefPtr<CefFrame> frame,
301
351
CefProcessId source_process,
@@ -369,25 +419,20 @@ bool BrowserApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
369
419
} else if (message->GetName () == " executeCallback" ) {
370
420
CefRefPtr<CefV8Context> context =
371
421
browser->GetMainFrame ()->GetV8Context ();
372
- CefRefPtr<CefV8Value> retval;
373
- CefRefPtr<CefV8Exception> exception ;
374
422
375
423
context->Enter ();
376
424
377
425
CefRefPtr<CefListValue> arguments = message->GetArgumentList ();
378
426
int callbackID = arguments->GetInt (0 );
379
427
CefString jsonString = arguments->GetString (1 );
380
428
381
- std::string script;
382
- script += " JSON.parse('" ;
383
- script += arguments->GetString (1 ).ToString ();
384
- script += " ');" ;
429
+ CefRefPtr<CefValue> json =
430
+ CefParseJSON (arguments->GetString (1 ).ToString (), {});
385
431
386
432
CefRefPtr<CefV8Value> callback = callbackMap[callbackID];
387
433
CefV8ValueList args;
388
434
389
- context->Eval (script, browser->GetMainFrame ()->GetURL (), 0 ,
390
- retval, exception );
435
+ CefRefPtr<CefV8Value> retval = CefValueToCefV8Value (json);
391
436
392
437
args.push_back (retval);
393
438
0 commit comments