Skip to content

Commit 38f787b

Browse files
authored
Merge 5e55774 into d5d0cb9
2 parents d5d0cb9 + 5e55774 commit 38f787b

File tree

7 files changed

+61
-118
lines changed

7 files changed

+61
-118
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: 30 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -165,54 +165,17 @@ 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+
auto promiseResolve = CefV8Value::CreatePromise();
169+
promiseResolve->ResolvePromise(CreateResultObject(cachedObjects->Count, "OK", true));
170+
retval = promiseResolve;
183171

184172
NotifyObjectBound(frame, objectNamesWithBoundStatus);
185173
}
186174
else
187175
{
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-
176+
CefRefPtr<CefV8Value> promise = CefV8Value::CreatePromise();
177+
retval = promise;
178+
auto callback = gcnew JavascriptAsyncMethodCallback(context, promise);
216179
auto request = CefProcessMessage::Create(kJavascriptRootObjectRequest);
217180
auto argList = request->GetArgumentList();
218181

@@ -228,23 +191,13 @@ namespace CefSharp
228191
else
229192
{
230193
//Objects already bound or ignore cache
231-
CefRefPtr<CefV8Value> promiseResolve;
232-
CefRefPtr<CefV8Exception> promiseException;
194+
auto promiseResolve = CefV8Value::CreatePromise();
195+
promiseResolve->ResolvePromise(CreateResultObject(0, "Object(s) already bound", false));
196+
retval = promiseResolve;
233197

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))
198+
if (notifyIfAlreadyBound)
237199
{
238-
retval = promiseResolve;
239-
240-
if (notifyIfAlreadyBound)
241-
{
242-
NotifyObjectBound(frame, objectNamesWithBoundStatus);
243-
}
244-
}
245-
else
246-
{
247-
exception = promiseException->GetMessage();
200+
NotifyObjectBound(frame, objectNamesWithBoundStatus);
248201
}
249202
}
250203
}
@@ -267,6 +220,25 @@ namespace CefSharp
267220
return true;
268221
}
269222

223+
static CefRefPtr<CefV8Value> CreateResultObject(int count, String^ message, bool isSuccess)
224+
{
225+
auto response = CefV8Value::CreateObject(nullptr, nullptr);
226+
227+
const auto countResult = CefV8Value::CreateInt(count);
228+
const auto messageResult = CefV8Value::CreateString(StringUtils::ToNative(message));
229+
const auto successResult = CefV8Value::CreateBool(isSuccess);
230+
231+
response->SetValue("Count", countResult, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
232+
response->SetValue("Message", messageResult, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
233+
response->SetValue("Success", successResult, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
234+
235+
response->SetValue("count", countResult, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
236+
response->SetValue("message", messageResult, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
237+
response->SetValue("success", successResult, CefV8Value::PropertyAttribute::V8_PROPERTY_ATTRIBUTE_READONLY);
238+
239+
return response;
240+
}
241+
270242
private:
271243
void NotifyObjectBound(const CefRefPtr<CefFrame> frame, List<Tuple<String^, bool, bool>^>^ objectNamesWithBoundStatus)
272244
{

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
{

CefSharp.Example/Resources/BindingTestAsync.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,22 @@ QUnit.module('BindingTestAsync', (hooks) =>
286286
assert.ok(window.boundAsync2 === undefined, "boundAsync2 is now undefined");
287287
});
288288

289+
QUnit.test("Validate BindObjectAsync result object fields:", async (assert) =>
290+
{
291+
const response = await CefSharp.BindObjectAsync({ NotifyIfAlreadyBound: true, IgnoreCache: true }, "boundAsync2");
292+
const keys = Object.getOwnPropertyDescriptors(response);
293+
294+
assert.equal(!!keys["count"], true, "count");
295+
assert.equal(!!keys["Count"], true, "Count");
296+
297+
assert.equal(!!keys["message"], true, "message");
298+
assert.equal(!!keys["Message"], true, "Message");
299+
300+
assert.equal(!!keys["success"], true, "success");
301+
assert.equal(!!keys["Success"], true, "Success");
302+
303+
assert.equal(true, CefSharp.DeleteBoundObject("boundAsync2"), "Object was unbound");
304+
assert.ok(window.boundAsync2 === undefined, "boundAsync2 is now undefined");
305+
});
306+
289307
});

0 commit comments

Comments
 (0)