void ScriptCore::UIT_Evaluate(CefRefPtr<CefBrowser> browser, CefString script) { CefRefPtr<CefFrame> mainFrame; if (TryGetMainFrame(browser, mainFrame)) { CefRefPtr<CefV8Context> context = mainFrame->GetV8Context(); if (context.get() && context->Enter()) { CefRefPtr<CefV8Value> result; CefRefPtr<CefV8Exception> exception; bool success = context->Eval(script, result, exception); if (success) { try { _result = convertFromCef(result); } catch (Exception^ ex) { _exceptionMessage = ex->Message; } } else if (exception.get()) { _exceptionMessage = toClr(exception->GetMessage()); } else { _exceptionMessage = "Failed to evaluate script"; } context->Exit(); }
bool FUnrealCEFSubProcessRemoteObject::ExecuteMethod(const CefString& MethodName, CefRefPtr<CefV8Value> Object, const CefV8ValueList& Arguments, CefRefPtr<CefV8Value>& Retval, CefString& InException) { CefRefPtr<CefV8Context> Context = CefV8Context::GetCurrentContext(); CefRefPtr<CefV8Exception> Exception; CefRefPtr<CefV8Value> PromiseObjects; // Run JS code that creates and unwraps a Promise object if (!Context->Eval( "(function() " \ "{ " " var Accept, Reject, PromiseObject;" \ " PromiseObject = new Promise(function(InAccept, InReject) " \ " {" " Accept = InAccept;" \ " Reject = InReject;" \ " });" \ " return [PromiseObject, Accept, Reject];" \ "})()" , PromiseObjects, Exception)) { InException = Exception->GetMessage(); return false; } if (!(PromiseObjects.get() && PromiseObjects->IsArray() && PromiseObjects->GetArrayLength() == 3)) { return false; } Retval = PromiseObjects->GetValue(0); CefRefPtr<CefV8Value> Accept = PromiseObjects->GetValue(1); CefRefPtr<CefV8Value> Reject = PromiseObjects->GetValue(2); check(Retval->IsObject()); check(Accept->IsFunction()); check(Reject->IsFunction()); FGuid CallbackGuid = RemoteScripting->CallbackRegistry.FindOrAdd(Context, Retval, Accept, Reject, true); CefRefPtr<CefProcessMessage> Message = CefProcessMessage::Create("UE::ExecuteUObjectMethod"); CefRefPtr<CefListValue> MessageArguments = Message->GetArgumentList(); MessageArguments->SetString(0, CefString(*ObjectId.ToString(EGuidFormats::Digits))); MessageArguments->SetString(1, MethodName); MessageArguments->SetString(2, CefString(*CallbackGuid.ToString(EGuidFormats::Digits))); MessageArguments->SetList(3, RemoteScripting->V8ArrayToCef(Arguments)); Browser->SendProcessMessage(PID_BROWSER, Message); return true; }