@@ -78,6 +78,9 @@ void BrowserApp::OnContextCreated(CefRefPtr<CefBrowser> browser,
7878
7979 CefRefPtr<CefV8Value> func = CefV8Value::CreateFunction (" getCurrentScene" , this );
8080 obsStudioObj->SetValue (" getCurrentScene" , func, V8_PROPERTY_ATTRIBUTE_NONE);
81+
82+ CefRefPtr<CefV8Value> getStatus = CefV8Value::CreateFunction (" getStatus" , this );
83+ obsStudioObj->SetValue (" getStatus" , getStatus, V8_PROPERTY_ATTRIBUTE_NONE);
8184}
8285
8386void BrowserApp::ExecuteJSFunction (CefRefPtr<CefBrowser> browser,
@@ -164,23 +167,33 @@ bool BrowserApp::OnProcessMessageReceived(CefRefPtr<CefBrowser> browser,
164167
165168 return true ;
166169 }
167- else if (message->GetName () == " executeCallback" ) {
168- CefRefPtr<CefV8Context> context = browser->GetMainFrame ()->GetV8Context ();
170+ else if (message->GetName () == " executeCallback" )
171+ {
172+ CefRefPtr<CefV8Context> context = browser->GetMainFrame ()->GetV8Context ();
173+ CefRefPtr<CefV8Value> retval;
174+ CefRefPtr<CefV8Exception> exception;
169175
170- context->Enter ();
176+ context->Enter ();
177+
178+ CefRefPtr<CefListValue> arguments = message->GetArgumentList ();
179+ int callbackID = arguments->GetInt (0 );
180+ CefString jsonString = arguments->GetString (1 );
171181
172- int callbackID = message->GetArgumentList ()->GetInt (0 );
173- CefString jsonString = message->GetArgumentList ()->GetString (1 );
182+ std::string script = fmt::format (
183+ " JSON.parse('{}');" ,
184+ arguments->GetString (1 ).ToString (),
185+ jsonString.ToString ().c_str ());
174186
175187 CefRefPtr<CefV8Value> callback = callbackMap[callbackID];
176188 CefV8ValueList args;
177- args.push_back (CefV8Value::CreateString (jsonString));
178189
179- CefRefPtr<CefV8Value> retval;
180- CefRefPtr<CefV8Exception> exception;
181- callback->ExecuteFunction (NULL , args);
190+ context->Eval (script, browser->GetMainFrame ()->GetURL (), 0 , retval, exception);
191+
192+ args.push_back (retval);
193+
194+ callback->ExecuteFunction (NULL , args);
182195
183- context->Exit ();
196+ context->Exit ();
184197
185198 callbackMap.erase (callbackID);
186199
@@ -198,8 +211,8 @@ bool BrowserApp::Execute(const CefString& name,
198211 CefRefPtr<CefV8Value>& retval,
199212 CefString& exception)
200213{
201- if (name == " getCurrentScene" ) {
202-
214+ if (name == " getCurrentScene" )
215+ {
203216 if (arguments.size () == 1 && arguments[0 ]->IsFunction ()) {
204217 callbackId++;
205218 callbackMap[callbackId] = arguments[0 ];
@@ -215,6 +228,22 @@ bool BrowserApp::Execute(const CefString& name,
215228
216229 return true ;
217230 }
231+ else if (name == " getStatus" )
232+ {
233+ if (arguments.size () == 1 && arguments[0 ]->IsFunction ()) {
234+ callbackId++;
235+ callbackMap[callbackId] = arguments[0 ];
236+ }
237+
238+ CefRefPtr<CefProcessMessage> msg = CefProcessMessage::Create (" getStatus" );
239+ CefRefPtr<CefListValue> args = msg->GetArgumentList ();
240+ args->SetInt (0 , callbackId);
241+
242+ CefRefPtr<CefBrowser> browser = CefV8Context::GetCurrentContext ()->GetBrowser ();
243+ browser->SendProcessMessage (PID_BROWSER, msg);
244+
245+ return true ;
246+ }
218247
219248 // Function does not exist.
220249 return false ;
0 commit comments