1212#include " BindObjectAsyncHandler.h"
1313#include " JavascriptPostMessageHandler.h"
1414#include " JavascriptRootObjectWrapper.h"
15+ #include " JavascriptPromiseHandler.h"
1516#include " Async\JavascriptAsyncMethodCallback.h"
1617#include " Serialization\V8Serialization.h"
1718#include " Serialization\JsObjectsSerialization.h"
@@ -146,6 +147,7 @@ namespace CefSharp
146147 auto removeObjectFromCacheFunction = CefV8Value::CreateFunction (kRemoveObjectFromCache , new RegisterBoundObjectHandler (_javascriptObjects));
147148 auto isObjectCachedFunction = CefV8Value::CreateFunction (kIsObjectCached , new RegisterBoundObjectHandler (_javascriptObjects));
148149 auto postMessageFunction = CefV8Value::CreateFunction (kPostMessage , new JavascriptPostMessageHandler (rootObject == nullptr ? nullptr : rootObject->CallbackRegistry ));
150+ auto promiseHandlerFunction = CefV8Value::CreateFunction (kSendEvalScriptResponse , new JavascriptPromiseHandler ());
149151
150152 // By default We'll support both CefSharp and cefSharp, for those who prefer the JS style
151153 auto createCefSharpObj = !_jsBindingPropertyName.empty ();
@@ -159,6 +161,7 @@ namespace CefSharp
159161 cefSharpObj->SetValue (kRemoveObjectFromCache , removeObjectFromCacheFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
160162 cefSharpObj->SetValue (kIsObjectCached , isObjectCachedFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
161163 cefSharpObj->SetValue (kPostMessage , postMessageFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
164+ cefSharpObj->SetValue (kSendEvalScriptResponse , promiseHandlerFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
162165 cefSharpObj->SetValue (kRenderProcessId , CefV8Value::CreateInt (processId), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
163166
164167 global->SetValue (_jsBindingPropertyName, cefSharpObj, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
@@ -172,6 +175,7 @@ namespace CefSharp
172175 cefSharpObjCamelCase->SetValue (kRemoveObjectFromCacheCamelCase , removeObjectFromCacheFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
173176 cefSharpObjCamelCase->SetValue (kIsObjectCachedCamelCase , isObjectCachedFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
174177 cefSharpObjCamelCase->SetValue (kPostMessageCamelCase , postMessageFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
178+ cefSharpObjCamelCase->SetValue (kSendEvalScriptResponseCamelCase , promiseHandlerFunction, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
175179 cefSharpObjCamelCase->SetValue (kRenderProcessIdCamelCase , CefV8Value::CreateInt (processId), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_NONE);
176180
177181 global->SetValue (_jsBindingPropertyNameCamelCase, cefSharpObjCamelCase, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
@@ -376,6 +380,7 @@ namespace CefSharp
376380 // these messages are roughly handled the same way
377381 if (name == kEvaluateJavascriptRequest || name == kJavascriptCallbackRequest )
378382 {
383+ bool sendResponse = true ;
379384 bool success = false ;
380385 CefRefPtr<CefV8Value> result;
381386 CefString errorMessage;
@@ -433,8 +438,17 @@ namespace CefSharp
433438 // we need to do this here to be able to store the v8context
434439 if (success)
435440 {
436- auto responseArgList = response->GetArgumentList ();
437- SerializeV8Object (result, responseArgList, 2 , callbackRegistry);
441+ // If the response is a string of CefSharpDefEvalScriptRes then
442+ // we don't send the response, we'll let that happen when the promise has completed.
443+ if (result->IsString () && result->GetStringValue () == " CefSharpDefEvalScriptRes" )
444+ {
445+ sendResponse = false ;
446+ }
447+ else
448+ {
449+ auto responseArgList = response->GetArgumentList ();
450+ SerializeV8Object (result, responseArgList, 2 , callbackRegistry);
451+ }
438452 }
439453 else
440454 {
@@ -521,14 +535,17 @@ namespace CefSharp
521535 }
522536 }
523537
524- auto responseArgList = response->GetArgumentList ();
525- responseArgList->SetBool (0 , success);
526- SetInt64 (responseArgList, 1 , callbackId);
527- if (!success)
538+ if (sendResponse)
528539 {
529- responseArgList->SetString (2 , errorMessage);
540+ auto responseArgList = response->GetArgumentList ();
541+ responseArgList->SetBool (0 , success);
542+ SetInt64 (responseArgList, 1 , callbackId);
543+ if (!success)
544+ {
545+ responseArgList->SetString (2 , errorMessage);
546+ }
547+ frame->SendProcessMessage (sourceProcessId, response);
530548 }
531- frame->SendProcessMessage (sourceProcessId, response);
532549
533550 handled = true ;
534551 }
0 commit comments