File tree Expand file tree Collapse file tree 5 files changed +66
-1
lines changed
CefSharp.BrowserSubprocess.Core Expand file tree Collapse file tree 5 files changed +66
-1
lines changed Original file line number Diff line number Diff 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
Original file line number Diff line number Diff 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 );
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff 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}
Original file line number Diff line number Diff line change 99using System . Threading ;
1010using CefSharp . ModelBinding ;
1111using CefSharp . Event ;
12+ using System . Threading . Tasks ;
1213
1314namespace 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 ) ;
You can’t perform that action at this time.
0 commit comments