44using System . Threading ;
55using System . ComponentModel ;
66using StreamJsonRpc ;
7+ using System . Collections . Generic ;
8+ using CefSharp . Callback ;
9+ using System . IO ;
710
811namespace CefSharp . OutOfProcess . BrowserProcess
912{
@@ -17,6 +20,9 @@ public partial class OutOfProcessChromiumWebBrowser : IWebBrowserInternal
1720 "The undelying CefBrowser instance is not yet initialized. Use the IsBrowserInitializedChanged event and check " +
1821 "the IsBrowserInitialized property to determine when the browser has been initialized." ;
1922
23+ private IDevToolsMessageObserver _devtoolsMessageObserver ;
24+ private IRegistration _devtoolsRegistration ;
25+
2026 /// <summary>
2127 /// Internal ID used for tracking browsers between Processes;
2228 /// </summary>
@@ -343,7 +349,44 @@ void IWebBrowserInternal.OnAfterBrowserCreated(IBrowser browser)
343349 initialLoadAction = InitialLoad ;
344350 Interlocked . Exchange ( ref browserInitialized , 1 ) ;
345351
352+ var host = browser . GetHost ( ) ;
353+
346354 _ = _jsonRpc . NotifyAsync ( "OnAfterBrowserCreated" , _id , browser . GetHost ( ) . GetWindowHandle ( ) . ToInt32 ( ) ) ;
355+
356+ var observer = new CefSharpDevMessageObserver ( ) ;
357+ observer . OnDevToolsAgentDetached ( ( b ) =>
358+ {
359+ _ = _jsonRpc . NotifyAsync ( "OnDevToolsAgentDetached" , _id ) ;
360+ } ) ;
361+ observer . OnDevToolsMessage ( ( b , m ) =>
362+ {
363+ using var reader = new StreamReader ( m ) ;
364+ var msg = reader . ReadToEnd ( ) ;
365+
366+ _ = _jsonRpc . NotifyAsync ( "OnDevToolsMessage" , _id , msg ) ;
367+ } ) ;
368+
369+ _devtoolsMessageObserver = observer ;
370+
371+ _devtoolsRegistration = host . AddDevToolsMessageObserver ( _devtoolsMessageObserver ) ;
372+
373+ var devToolsClient = browser . GetDevToolsClient ( ) ;
374+
375+ //TODO: Do we need perforamnce and Log enabled?
376+ var devToolsEnableTask = Task . WhenAll ( devToolsClient . Page . EnableAsync ( ) ,
377+ devToolsClient . Page . SetLifecycleEventsEnabledAsync ( true ) ,
378+ devToolsClient . Runtime . EnableAsync ( ) ,
379+ devToolsClient . Network . EnableAsync ( ) ,
380+ devToolsClient . Performance . EnableAsync ( ) ,
381+ devToolsClient . Log . EnableAsync ( ) ) ;
382+
383+ _ = devToolsEnableTask . ContinueWith ( t =>
384+ {
385+ ( ( IDisposable ) devToolsClient ) . Dispose ( ) ;
386+
387+ _ = _jsonRpc . NotifyAsync ( "OnDevToolsReady" , _id ) ;
388+
389+ } , TaskScheduler . Default ) ;
347390 }
348391
349392 /// <summary>
@@ -672,6 +715,11 @@ protected virtual void Dispose(bool disposing)
672715
673716 if ( disposing )
674717 {
718+ _devtoolsRegistration ? . Dispose ( ) ;
719+ _devtoolsRegistration = null ;
720+ _devtoolsMessageObserver ? . Dispose ( ) ;
721+ _devtoolsMessageObserver = null ;
722+
675723 CanExecuteJavascriptInMainFrame = false ;
676724 Interlocked . Exchange ( ref browserInitialized , 0 ) ;
677725
0 commit comments