Do not post support requests, bug reports or feature requests. Discuss CEF here. Non-CEF related discussion goes in General Discussion!
by erinus » Fri Dec 30, 2016 10:10 pm
I retrive CefValue (by CefParseJSON) in CefUrlRequestClient.OnRequestComplete. I want to convert it to CefV8Value, then pass it into JS Function Callback (CefV8Value). Is there some conversion could do that ?
Thank you.
[main.html]
- Code: Select all
mycefobj.GetHttpJson(function (res) {
alert(res.ip);
});
[myapp.cc]
- Code: Select all
bool V8Handler::Execute(...) {
...
if (name == "GetHttpJson") {
CefRefPtr<CefV8Value> onrequestcomplete = arguments[0].get();
CefRefPtr<CefRequestContext> context = CefRequestContext::GetGlobalContext();
CefRefPtr<CefRequest> req = CefRequest::Create();
req->SetMethod("GET");
req->SetURL("http://ip.jsontest.com/");
CefRefPtr<POSURLRequestClient> client = new POSURLRequestClient ();
client->SetRequestCompleteCallback(onrequestcomplete, CefV8Context::GetCurrentContext());
CefURLRequest::Create(req, client, NULL);
retval = CefV8Value::CreateNull();
return true;
...
}
[myrequest.cc]
- Code: Select all
void URLRequestClient::OnRequestComplete(CefRefPtr<CefURLRequest> request) {
CEF_REQUIRE_UI_THREAD();
CefRefPtr<CefValue> json = CefParseJSON(buffer.data(), JSON_PARSER_ALLOW_TRAILING_COMMAS);
if (json->IsValid()) {
OnRequestCompleteCallbackContext->Enter();
CefV8ValueList args;
args.push_back(json); // I want to make conversion here
OnRequestCompleteCallback->ExecuteFunctionWithContext(OnRequestCompleteCallbackContext, NULL, args);
OnRequestCompleteCallbackContext->Exit();
}
}
-
erinus
- Newbie
-
- Posts: 4
- Joined: Fri Dec 30, 2016 9:59 pm
by erinus » Sun Jan 01, 2017 8:59 am
answered by myself
- Code: Select all
CefRefPtr<CefV8Value> CefValueToCefV8Value(CefRefPtr<CefValue> value) {
CefRefPtr<CefV8Value> result;
switch (value->GetType()) {
case VTYPE_INVALID:
{
//std::cout << "Type: VTYPE_INVALID" << std::endl;
result = CefV8Value::CreateNull();
}
break;
case VTYPE_NULL:
{
//std::cout << "Type: VTYPE_NULL" << std::endl;
result = CefV8Value::CreateNull();
}
break;
case VTYPE_BOOL:
{
//std::cout << "Type: VTYPE_BOOL" << std::endl;
result = CefV8Value::CreateBool(value->GetBool());
}
break;
case VTYPE_INT:
{
//std::cout << "Type: VTYPE_INT" << std::endl;
result = CefV8Value::CreateInt(value->GetInt());
}
break;
case VTYPE_DOUBLE:
{
//std::cout << "Type: VTYPE_DOUBLE" << std::endl;
result = CefV8Value::CreateDouble(value->GetDouble());
}
break;
case VTYPE_STRING:
{
//std::cout << "Type: VTYPE_STRING" << std::endl;
result = CefV8Value::CreateString(value->GetString());
}
break;
case VTYPE_BINARY:
{
//std::cout << "Type: VTYPE_BINARY" << std::endl;
result = CefV8Value::CreateNull();
}
break;
case VTYPE_DICTIONARY:
{
//std::cout << "Type: VTYPE_DICTIONARY" << std::endl;
result = CefV8Value::CreateObject(NULL, NULL);
CefRefPtr<CefDictionaryValue> dict = value->GetDictionary();
CefDictionaryValue::KeyList keys;
dict->GetKeys(keys);
for (unsigned int i = 0; i < keys.size(); i++) {
CefString key = keys[i];
result->SetValue(key, CefValueToCefV8Value(dict->GetValue(key)), V8_PROPERTY_ATTRIBUTE_NONE);
}
}
break;
case VTYPE_LIST:
{
//std::cout << "Type: VTYPE_LIST" << std::endl;
CefRefPtr<CefListValue> list = value->GetList();
int size = list->GetSize();
result = CefV8Value::CreateArray(size);
for (int i = 0; i < size; i++) {
result->SetValue(i, CefValueToCefV8Value(list->GetValue(i)));
}
}
break;
}
return result;
}
-
erinus
- Newbie
-
- Posts: 4
- Joined: Fri Dec 30, 2016 9:59 pm
Return to CEF Discussion
Who is online
Users browsing this forum: No registered users and 62 guests