Skip to content

Commit c4bfd44

Browse files
committed
Replaced kPromiseCreatorScript with native promise
1 parent d5d0cb9 commit c4bfd44

File tree

6 files changed

+29
-121
lines changed

6 files changed

+29
-121
lines changed

CefSharp.BrowserSubprocess.Core/Async/JavascriptAsyncMethodCallback.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,11 @@ namespace CefSharp
1313
{
1414
void JavascriptAsyncMethodCallback::Success(const CefRefPtr<CefV8Value>& result)
1515
{
16-
if (_resolve.get() && _context.get() && _context->Enter())
16+
if (_promise.get() && _context.get() && _context->Enter())
1717
{
1818
try
1919
{
20-
CefV8ValueList args;
21-
args.push_back(result);
22-
_resolve->ExecuteFunction(nullptr, args);
20+
_promise->ResolvePromise(result);
2321
}
2422
finally
2523
{
@@ -30,13 +28,11 @@ namespace CefSharp
3028

3129
void JavascriptAsyncMethodCallback::Fail(const CefString& exception)
3230
{
33-
if (_reject.get() && _context.get() && _context->Enter())
31+
if (_promise.get() && _context.get() && _context->Enter())
3432
{
3533
try
3634
{
37-
CefV8ValueList args;
38-
args.push_back(CefV8Value::CreateString(exception));
39-
_reject->ExecuteFunction(nullptr, args);
35+
_promise->RejectPromise(exception);
4036
}
4137
finally
4238
{

CefSharp.BrowserSubprocess.Core/Async/JavascriptAsyncMethodCallback.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,19 @@ namespace CefSharp
1616
{
1717
private:
1818
MCefRefPtr<CefV8Context> _context;
19-
MCefRefPtr<CefV8Value> _resolve;
20-
MCefRefPtr<CefV8Value> _reject;
19+
MCefRefPtr<CefV8Value> _promise;
2120

2221
public:
23-
JavascriptAsyncMethodCallback(CefRefPtr<CefV8Context> context, CefRefPtr<CefV8Value> resolve, CefRefPtr<CefV8Value> reject)
24-
:_context(context), _resolve(resolve.get()), _reject(reject.get())
22+
JavascriptAsyncMethodCallback(CefRefPtr<CefV8Context> context, CefRefPtr<CefV8Value> promise)
23+
:_context(context), _promise(promise.get())
2524
{
2625

2726
}
2827

2928
!JavascriptAsyncMethodCallback()
3029
{
31-
_resolve = nullptr;
32-
_reject = nullptr;
3330
_context = nullptr;
31+
_promise = nullptr;
3432
}
3533

3634
~JavascriptAsyncMethodCallback()

CefSharp.BrowserSubprocess.Core/Async/JavascriptAsyncMethodHandler.cpp

Lines changed: 3 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -24,32 +24,10 @@ namespace CefSharp
2424
auto context = CefV8Context::GetCurrentContext();
2525
auto frame = context->GetFrame();
2626

27-
CefRefPtr<CefV8Value> promiseData;
28-
CefRefPtr<CefV8Exception> promiseException;
29-
//this will create a promise and give us the reject/resolve functions {p: Promise, res: resolve(), rej: reject()}
30-
if (!context->Eval(CefAppUnmanagedWrapper::kPromiseCreatorScript, CefString(), 0, promiseData, promiseException))
31-
{
32-
LOG(WARNING) << "JavascriptAsyncMethodHandler::Execute promiseData returned exception: " + promiseException->GetMessage().ToString();
33-
34-
exception = promiseException->GetMessage();
35-
36-
return true;
37-
}
38-
39-
//when refreshing the browser this is sometimes null, in this case return true and log message
40-
//https://github.com/cefsharp/CefSharp/pull/2446
41-
if (promiseData == nullptr)
42-
{
43-
LOG(WARNING) << "JavascriptAsyncMethodHandler::Execute promiseData returned nullptr";
44-
45-
return true;
46-
}
47-
48-
retval = promiseData->GetValue("p");
27+
CefRefPtr<CefV8Value> promise = CefV8Value::CreatePromise();
28+
retval = promise;
4929

50-
auto resolve = promiseData->GetValue("res");
51-
auto reject = promiseData->GetValue("rej");
52-
auto callback = gcnew JavascriptAsyncMethodCallback(context, resolve, reject);
30+
auto callback = gcnew JavascriptAsyncMethodCallback(context, promise);
5331
auto callbackId = _methodCallbackSave->Invoke(callback);
5432

5533
auto request = CefProcessMessage::Create(kJavascriptAsyncMethodCallRequest);

CefSharp.BrowserSubprocess.Core/BindObjectAsyncHandler.h

Lines changed: 16 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -165,54 +165,15 @@ namespace CefSharp
165165
rootObject->Bind(cachedObjects, context->GetGlobal());
166166

167167
//Objects already bound or ignore cache
168-
CefRefPtr<CefV8Value> promiseResolve;
169-
CefRefPtr<CefV8Exception> promiseException;
170-
171-
auto promiseResolveScript = StringUtils::ToNative("Promise.resolve({Success:true, Count:" + cachedObjects->Count + ", Message:'OK'});");
172-
173-
if (context->Eval(promiseResolveScript, CefString(), 0, promiseResolve, promiseException))
174-
{
175-
retval = promiseResolve;
176-
}
177-
else
178-
{
179-
exception = promiseException->GetMessage();
180-
181-
return true;
182-
}
168+
retval = CreateResultObject(cachedObjects->Count, "OK", true);
183169

184170
NotifyObjectBound(frame, objectNamesWithBoundStatus);
185171
}
186172
else
187173
{
188-
CefRefPtr<CefV8Value> promiseData;
189-
CefRefPtr<CefV8Exception> promiseException;
190-
//this will create a promise and give us the reject/resolve functions {p: Promise, res: resolve(), rej: reject()}
191-
if (!context->Eval(CefAppUnmanagedWrapper::kPromiseCreatorScript, CefString(), 0, promiseData, promiseException))
192-
{
193-
exception = promiseException->GetMessage();
194-
195-
return true;
196-
}
197-
198-
//when refreshing the browser this is sometimes null, in this case return true and log message
199-
//https://github.com/cefsharp/CefSharp/pull/2446
200-
if (promiseData == nullptr)
201-
{
202-
LOG(WARNING) << "BindObjectAsyncHandler::Execute promiseData returned nullptr";
203-
204-
return true;
205-
}
206-
207-
//return the promose
208-
retval = promiseData->GetValue("p");
209-
210-
//References to the promise resolve and reject methods
211-
auto resolve = promiseData->GetValue("res");
212-
auto reject = promiseData->GetValue("rej");
213-
214-
auto callback = gcnew JavascriptAsyncMethodCallback(context, resolve, reject);
215-
174+
CefRefPtr<CefV8Value> promise = CefV8Value::CreatePromise();
175+
retval = promise;
176+
auto callback = gcnew JavascriptAsyncMethodCallback(context, promise);
216177
auto request = CefProcessMessage::Create(kJavascriptRootObjectRequest);
217178
auto argList = request->GetArgumentList();
218179

@@ -228,24 +189,7 @@ namespace CefSharp
228189
else
229190
{
230191
//Objects already bound or ignore cache
231-
CefRefPtr<CefV8Value> promiseResolve;
232-
CefRefPtr<CefV8Exception> promiseException;
233-
234-
auto promiseResolveScript = CefString("Promise.resolve({Success:false, Count:0, Message:'Object(s) already bound'});");
235-
236-
if (context->Eval(promiseResolveScript, CefString(), 0, promiseResolve, promiseException))
237-
{
238-
retval = promiseResolve;
239-
240-
if (notifyIfAlreadyBound)
241-
{
242-
NotifyObjectBound(frame, objectNamesWithBoundStatus);
243-
}
244-
}
245-
else
246-
{
247-
exception = promiseException->GetMessage();
248-
}
192+
retval = CreateResultObject(0, "Object(s) already bound", false);
249193
}
250194
}
251195
else
@@ -267,6 +211,17 @@ namespace CefSharp
267211
return true;
268212
}
269213

214+
static CefRefPtr<CefV8Value> CreateResultObject(int count, String^ message, bool isSuccess)
215+
{
216+
auto response = CefV8Value::CreateObject(nullptr, nullptr);
217+
218+
response->SetValue("Count", CefV8Value::CreateInt(count), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
219+
response->SetValue("Message", CefV8Value::CreateString(StringUtils::ToNative(message)), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
220+
response->SetValue("Success", CefV8Value::CreateBool(isSuccess), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
221+
222+
return response;
223+
}
224+
270225
private:
271226
void NotifyObjectBound(const CefRefPtr<CefFrame> frame, List<Tuple<String^, bool, bool>^>^ objectNamesWithBoundStatus)
272227
{

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,6 @@ namespace CefSharp
3535
{
3636
namespace BrowserSubprocess
3737
{
38-
const CefString CefAppUnmanagedWrapper::kPromiseCreatorScript = ""
39-
"(function()"
40-
"{"
41-
" var result = {};"
42-
" var promise = new Promise(function(resolve, reject) {"
43-
" result.res = resolve; result.rej = reject;"
44-
" });"
45-
" result.p = promise;"
46-
" return result;"
47-
"})();";
4838

4939
const CefString kRenderProcessId = CefString("RenderProcessId");
5040
const CefString kRenderProcessIdCamelCase = CefString("renderProcessId");
@@ -662,23 +652,15 @@ namespace CefSharp
662652

663653
if (_registerBoundObjectRegistry->TryGetAndRemoveMethodCallback(callbackId, callback))
664654
{
665-
//Response object has no Accessor or Interceptor
666-
auto response = CefV8Value::CreateObject(nullptr, nullptr);
667-
668-
response->SetValue("Count", CefV8Value::CreateInt(javascriptObjects->Count), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
669655

670656
if (javascriptObjects->Count > 0)
671657
{
672658
//TODO: JSB Should we include a list of successfully bound object names?
673-
response->SetValue("Success", CefV8Value::CreateBool(true), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
674-
response->SetValue("Message", CefV8Value::CreateString("OK"), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
675-
callback->Success(response);
659+
callback->Success(BindObjectAsyncHandler::CreateResultObject(javascriptObjects->Count, "OK", true));
676660
}
677661
else
678662
{
679-
response->SetValue("Success", CefV8Value::CreateBool(false), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
680-
response->SetValue("Message", CefV8Value::CreateString("Zero objects bounds"), CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
681-
callback->Success(response);
663+
callback->Success(BindObjectAsyncHandler::CreateResultObject(javascriptObjects->Count, "Zero objects bounds", false));
682664
}
683665

684666
//Send message notifying Browser Process of which objects were bound

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ namespace CefSharp
4040
gcroot<RegisterBoundObjectRegistry^> _registerBoundObjectRegistry;
4141

4242
public:
43-
static const CefString kPromiseCreatorScript;
4443

4544
CefAppUnmanagedWrapper(IRenderProcessHandler^ handler, List<CefCustomScheme^>^ schemes, bool enableFocusedNodeChanged, Action<CefBrowserWrapper^>^ onBrowserCreated, Action<CefBrowserWrapper^>^ onBrowserDestroyed) : SubProcessApp(schemes)
4645
{

0 commit comments

Comments
 (0)