// Copyright 1998-2015 Epic Games, Inc. All Rights Reserved. #include "UnrealCEFSubProcess.h" #include "UnrealCEFSubProcessRemoteMethodHandler.h" #include "UnrealCEFSubProcessRemoteScripting.h" #if WITH_CEF3 bool FUnrealCEFSubProcessRemoteMethodHandler::Execute(const CefString&, CefRefPtr Object, const CefV8ValueList& Arguments, CefRefPtr& Retval, CefString& InException) { return RemoteObject->ExecuteMethod(MethodName, Object, Arguments, Retval, InException); } bool FUnrealCEFSubProcessRemoteObject::ExecuteMethod(const CefString& MethodName, CefRefPtr Object, const CefV8ValueList& Arguments, CefRefPtr& Retval, CefString& InException) { CefRefPtr Context = CefV8Context::GetCurrentContext(); CefRefPtr Exception; CefRefPtr 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 Accept = PromiseObjects->GetValue(1); CefRefPtr Reject = PromiseObjects->GetValue(2); check(Retval->IsObject()); check(Accept->IsFunction()); check(Reject->IsFunction()); FGuid CallbackGuid = RemoteScripting->CallbackRegistry.FindOrAdd(Context, Retval, Accept, Reject, true); CefRefPtr Message = CefProcessMessage::Create("UE::ExecuteUObjectMethod"); CefRefPtr 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; } // Destructor will notify the client that the uobject is no longer being referenced on the JS side FUnrealCEFSubProcessRemoteObject::~FUnrealCEFSubProcessRemoteObject() { CefRefPtr Message = CefProcessMessage::Create("UE::ReleaseUObject"); CefRefPtr MessageArguments = Message->GetArgumentList(); MessageArguments->SetString(0, CefString(*ObjectId.ToString(EGuidFormats::Digits))); Browser->SendProcessMessage(PID_BROWSER, Message); } #endif