Skip to content

Commit 4b422da

Browse files
committed
IJavascriptObjectRepositry - Add ObjectBoundInJavascript event
Executed on the thread pool when objects are bound in JS
1 parent eae578c commit 4b422da

File tree

5 files changed

+66
-1
lines changed

5 files changed

+66
-1
lines changed

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,21 @@ namespace CefSharp
472472
callback->Success(CefV8Value::CreateBool(true));
473473

474474
//TODO: JSB deal with failure - no object matching bound
475+
476+
//Send message notifying Browser Process of which objects were bound
477+
auto msg = CefProcessMessage::Create(kJavascriptObjectsBoundInJavascript);
478+
auto args = msg->GetArgumentList();
479+
480+
auto names = CefListValue::Create();
481+
args->SetList(0, names);
482+
483+
for (auto i = 0; i < javascriptObjects->Count; i++)
484+
{
485+
auto name = javascriptObjects[i]->JavascriptName;
486+
names->SetString(i, StringUtils::ToNative(name));
487+
}
488+
489+
browser->SendProcessMessage(CefProcessId::PID_BROWSER, msg);
475490
}
476491
}
477492
finally

CefSharp.Core/Internals/ClientAdapter.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1138,7 +1138,7 @@ namespace CefSharp
11381138
auto argList = message->GetArgumentList();
11391139
IJavascriptCallbackFactory^ callbackFactory = _browserAdapter->JavascriptCallbackFactory;
11401140

1141-
//TODO: Rename messages (remove Root from name)
1141+
//TODO: JSB Rename messages (remove Root from name)
11421142
if (name == kJavascriptRootObjectRequest)
11431143
{
11441144
if (!Object::ReferenceEquals(_browserAdapter, nullptr) && !_browserAdapter->IsDisposed)
@@ -1171,6 +1171,24 @@ namespace CefSharp
11711171

11721172
handled = true;
11731173
}
1174+
else if (name == kJavascriptObjectsBoundInJavascript)
1175+
{
1176+
if (!Object::ReferenceEquals(_browserAdapter, nullptr) && !_browserAdapter->IsDisposed)
1177+
{
1178+
auto objectRepository = _browserAdapter->JavascriptObjectRepository;
1179+
1180+
auto objectNames = argList->GetList(0);
1181+
auto names = gcnew List<String^>(objectNames->GetSize());
1182+
for (auto i = 0; i < objectNames->GetSize(); i++)
1183+
{
1184+
names->Add(StringUtils::ToClr(objectNames->GetString(i)));
1185+
}
1186+
1187+
objectRepository->ObjectsBound(names);
1188+
}
1189+
1190+
handled = true;
1191+
}
11741192
else if (name == kOnContextCreatedRequest)
11751193
{
11761194
_browserControl->SetCanExecuteJavascriptOnMainFrame(true);

CefSharp.Core/Internals/Messaging/Messages.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ namespace CefSharp
4141
// optional message via command line argument when the subprocess is
4242
// created.
4343
const CefString kOnFocusedNodeChanged = "OnFocusedNodeChanged";
44+
//Message containing a request/notification that JSB objects have been bound
45+
const CefString kJavascriptObjectsBoundInJavascript = "JavascriptObjectsBoundInJavascript";
4446
}
4547
}
4648
}

CefSharp/IJavascriptObjectRepository.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,10 @@ public interface IJavascriptObjectRepository : IDisposable
4141
/// registered with the repository
4242
/// </summary>
4343
event EventHandler<JavascriptBindingEventArgs> ResolveObject;
44+
45+
/// <summary>
46+
/// Event handler is triggered when a object has been successfully bound on javascript
47+
/// </summary>
48+
event EventHandler<JavascriptBindingEventArgs> ObjectBoundInJavascript;
4449
}
4550
}

CefSharp/Internals/JavascriptObjectRepository.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Threading;
1010
using CefSharp.ModelBinding;
1111
using CefSharp.Event;
12+
using System.Threading.Tasks;
1213

1314
namespace CefSharp.Internals
1415
{
@@ -34,6 +35,7 @@ public class JavascriptObjectRepository : IJavascriptObjectRepository
3435
private static long lastId;
3536

3637
public event EventHandler<JavascriptBindingEventArgs> ResolveObject;
38+
public event EventHandler<JavascriptBindingEventArgs> ObjectBoundInJavascript;
3739

3840
/// <summary>
3941
/// A hash from assigned object ids to the objects,
@@ -83,6 +85,29 @@ public List<JavascriptObject> GetObjects(List<string> names = null)
8385
return objects.Values.Where(x => names.Contains(x.JavascriptName)).ToList();
8486
}
8587

88+
89+
public void ObjectsBound(List<string> names)
90+
{
91+
//TODO: JSB Should this be a single event invocation or
92+
// one per object that was bound??? (Currently one per object)
93+
94+
//Execute on Threadpool so we don't unnessicarily block the CEF IO thread
95+
var handler = ObjectBoundInJavascript;
96+
if(handler != null)
97+
{
98+
Task.Run(() =>
99+
{
100+
foreach (var name in names)
101+
{
102+
if (handler != null)
103+
{
104+
handler(this, new JavascriptBindingEventArgs(this, name));
105+
}
106+
}
107+
});
108+
}
109+
}
110+
86111
private JavascriptObject CreateJavascriptObject(bool camelCaseJavascriptNames)
87112
{
88113
var id = Interlocked.Increment(ref lastId);

0 commit comments

Comments
 (0)