Skip to content

Commit a731a27

Browse files
committed
JsonRpc - Use Strongly typed interfaces instead of strings
1 parent 5fd343c commit a731a27

9 files changed

Lines changed: 194 additions & 136 deletions

CefSharp.OutOfProcess.BrowserProcess/BrowserProcessHandler.cs

Lines changed: 56 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,20 @@
55
using System.Linq;
66
using System.Collections.Generic;
77
using System.Diagnostics;
8+
using CefSharp.OutOfProcess.Interface;
9+
using System.Threading.Tasks;
810

911
namespace CefSharp.OutOfProcess.BrowserProcess
1012
{
11-
public class BrowserProcessHandler : CefSharp.Handler.BrowserProcessHandler
13+
public class BrowserProcessHandler : CefSharp.Handler.BrowserProcessHandler, IBrowserProcessServer
1214
{
1315
private readonly int _parentProcessId;
1416
private IList<OutOfProcessChromiumWebBrowser> _browsers = new List<OutOfProcessChromiumWebBrowser>();
1517
/// <summary>
1618
/// JSON RPC used for IPC with host
1719
/// </summary>
1820
private JsonRpc _jsonRpc;
21+
private IOutOfProcessServer _outOfProcessServer;
1922

2023
public BrowserProcessHandler(int parentProcessId)
2124
{
@@ -27,78 +30,81 @@ protected override void OnContextInitialized()
2730
base.OnContextInitialized();
2831

2932
_jsonRpc = JsonRpc.Attach(Console.OpenStandardOutput(), Console.OpenStandardInput());
33+
_outOfProcessServer = _jsonRpc.Attach<IOutOfProcessServer>();
3034
_jsonRpc.AllowModificationWhileListening = true;
35+
_jsonRpc.AddLocalRpcTarget<IBrowserProcessServer>(this, null);
36+
_jsonRpc.AllowModificationWhileListening = false;
3137

32-
_jsonRpc.AddLocalRpcMethod("CloseBrowser", (Action<int>)delegate (int browserId)
33-
{
34-
_ = CefThread.ExecuteOnUiThread(() =>
35-
{
36-
var p = _browsers.FirstOrDefault(x => x.Id == browserId);
37-
38-
_browsers.Remove(p);
38+
var threadId = Kernel32.GetCurrentThreadId();
3939

40-
p.Dispose();
40+
_outOfProcessServer.NotifyContextInitialized(threadId, Cef.CefSharpVersion, Cef.CefVersion, Cef.ChromiumVersion);
41+
}
4142

42-
return true;
43-
});
44-
});
43+
protected override void Dispose(bool disposing)
44+
{
45+
base.Dispose(disposing);
4546

46-
_jsonRpc.AddLocalRpcMethod("SendDevToolsMessage", (Action<int, string>)delegate (int browserId, string message)
47+
if(disposing)
4748
{
48-
_ = CefThread.ExecuteOnUiThread(() =>
49-
{
50-
var browser = _browsers.FirstOrDefault(x => x.Id == browserId);
49+
_jsonRpc?.Dispose();
50+
_jsonRpc = null;
51+
}
52+
}
5153

52-
browser?.GetBrowserHost().SendDevToolsMessage(message);
54+
Task IBrowserProcessServer.CloseBrowser(int browserId)
55+
{
56+
return CefThread.ExecuteOnUiThread(() =>
57+
{
58+
var p = _browsers.FirstOrDefault(x => x.Id == browserId);
5359

54-
return true;
55-
});
56-
});
60+
_browsers.Remove(p);
5761

58-
_jsonRpc.AddLocalRpcMethod("CloseHost", (Action)delegate ()
59-
{
60-
_ = CefThread.ExecuteOnUiThread(() =>
61-
{
62-
Cef.QuitMessageLoop();
62+
p.Dispose();
6363

64-
return true;
65-
});
64+
return true;
6665
});
66+
}
6767

68-
_jsonRpc.AddLocalRpcMethod("CreateBrowser", (Action<int, string, int>)delegate (int parentHwnd, string url, int id)
68+
Task IBrowserProcessServer.SendDevToolsMessage(int browserId, string message)
69+
{
70+
return CefThread.ExecuteOnUiThread(() =>
6971
{
70-
//Debugger.Break();
72+
var browser = _browsers.FirstOrDefault(x => x.Id == browserId);
7173

72-
_ = CefThread.ExecuteOnUiThread(() =>
73-
{
74-
var browser = new OutOfProcessChromiumWebBrowser(_jsonRpc, id, url);
74+
browser?.GetBrowserHost().SendDevToolsMessage(message);
7575

76-
var windowInfo = new WindowInfo();
77-
windowInfo.WindowName = "CefSharpBrowserProcess";
78-
windowInfo.SetAsChild(new IntPtr(parentHwnd));
79-
80-
browser.CreateBrowser(windowInfo);
81-
82-
_browsers.Add(browser);
83-
84-
return true;
85-
});
76+
return true;
8677
});
78+
}
8779

88-
var threadId = Kernel32.GetCurrentThreadId();
80+
Task IBrowserProcessServer.CloseHost()
81+
{
82+
return CefThread.ExecuteOnUiThread(() =>
83+
{
84+
Cef.QuitMessageLoop();
8985

90-
_ = _jsonRpc.NotifyAsync("OnContextInitialized", threadId, Cef.CefSharpVersion, Cef.CefVersion, Cef.ChromiumVersion);
86+
return true;
87+
});
9188
}
9289

93-
protected override void Dispose(bool disposing)
90+
Task IBrowserProcessServer.CreateBrowser(IntPtr parentHwnd, string url, int id)
9491
{
95-
base.Dispose(disposing);
92+
//Debugger.Break();
9693

97-
if(disposing)
94+
return CefThread.ExecuteOnUiThread(() =>
9895
{
99-
_jsonRpc?.Dispose();
100-
_jsonRpc = null;
101-
}
96+
var browser = new OutOfProcessChromiumWebBrowser(_outOfProcessServer, id, url);
97+
98+
var windowInfo = new WindowInfo();
99+
windowInfo.WindowName = "CefSharpBrowserProcess";
100+
windowInfo.SetAsChild(parentHwnd);
101+
102+
browser.CreateBrowser(windowInfo);
103+
104+
_browsers.Add(browser);
105+
106+
return true;
107+
});
102108
}
103109
}
104110
}

CefSharp.OutOfProcess.BrowserProcess/CefSharp.OutOfProcess.BrowserProcess.csproj

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,15 @@
1919
</ItemGroup>
2020

2121
<ItemGroup Condition="'$(TargetFramework)' == 'net462'">
22-
<PackageReference Include="CefSharp.Common" Version="102.0.90-RCI4501"/>
22+
<PackageReference Include="CefSharp.Common" Version="102.0.90-RCI4501" />
2323
</ItemGroup>
2424

2525
<ItemGroup Condition="'$(TargetFramework)' != 'net462'">
26-
<PackageReference Include="CefSharp.Common.NETCore" Version="102.0.90-RCI4501"/>
26+
<PackageReference Include="CefSharp.Common.NETCore" Version="102.0.90-RCI4501" />
27+
</ItemGroup>
28+
29+
<ItemGroup>
30+
<ProjectReference Include="..\CefSharp.OutOfProcess.Interface\CefSharp.OutOfProcess.Interface.csproj" />
2731
</ItemGroup>
2832

2933
</Project>

CefSharp.OutOfProcess.BrowserProcess/OutOfProcessChromiumWebBrowser.cs

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,9 @@
33
using System.Threading.Tasks;
44
using System.Threading;
55
using System.ComponentModel;
6-
using StreamJsonRpc;
7-
using System.Collections.Generic;
86
using CefSharp.Callback;
97
using System.IO;
8+
using CefSharp.OutOfProcess.Interface;
109

1110
namespace CefSharp.OutOfProcess.BrowserProcess
1211
{
@@ -36,7 +35,7 @@ public partial class OutOfProcessChromiumWebBrowser : IWebBrowserInternal
3635
/// <summary>
3736
/// JSON RPC used for IPC with host
3837
/// </summary>
39-
private JsonRpc _jsonRpc;
38+
private IOutOfProcessServer outOfProcessServer;
4039

4140
/// <summary>
4241
/// Flag to guard the creation of the underlying browser - only one instance can be created
@@ -305,7 +304,7 @@ void IWebBrowserInternal.OnStatusMessage(StatusMessageEventArgs args)
305304
{
306305
StatusMessage?.Invoke(this, args);
307306

308-
_ = _jsonRpc.NotifyAsync("StatusMessage", _id, args.Value);
307+
outOfProcessServer.NotifyStatusMessage(_id, args.Value);
309308
}
310309

311310
/// <summary>
@@ -352,20 +351,19 @@ void IWebBrowserInternal.OnAfterBrowserCreated(IBrowser browser)
352351
Interlocked.Exchange(ref browserInitialized, 1);
353352

354353
var host = browser.GetHost();
355-
356-
_ = _jsonRpc.NotifyAsync("OnAfterBrowserCreated", _id, browser.GetHost().GetWindowHandle().ToInt32());
354+
outOfProcessServer.NotifyBrowserCreated(_id, browser.GetHost().GetWindowHandle());
357355

358356
var observer = new CefSharpDevMessageObserver();
359357
observer.OnDevToolsAgentDetached((b) =>
360358
{
361-
_ = _jsonRpc.NotifyAsync("OnDevToolsAgentDetached", _id);
359+
outOfProcessServer.NotifyDevToolsAgentDetached(_id);
362360
});
363361
observer.OnDevToolsMessage((b, m) =>
364362
{
365363
using var reader = new StreamReader(m);
366364
var msg = reader.ReadToEnd();
367365

368-
_ = _jsonRpc.NotifyAsync("OnDevToolsMessage", _id, msg);
366+
outOfProcessServer.NotifyDevToolsMessage(_id, msg);
369367
});
370368

371369
_devtoolsMessageObserver = observer;
@@ -386,7 +384,7 @@ void IWebBrowserInternal.OnAfterBrowserCreated(IBrowser browser)
386384
{
387385
((IDisposable)devToolsClient).Dispose();
388386

389-
_ = _jsonRpc.NotifyAsync("OnDevToolsReady", _id);
387+
outOfProcessServer.NotifyDevToolsReady(_id);
390388

391389
}, TaskScheduler.Default);
392390
}
@@ -672,12 +670,12 @@ public bool IsBrowserInitialized
672670
/// you have a chance to subscribe to the event as the CEF Browser is created async. (Issue https://github.com/cefsharp/CefSharp/issues/3552).
673671
/// </param>
674672
/// <exception cref="System.InvalidOperationException">Cef::Initialize() failed</exception>
675-
public OutOfProcessChromiumWebBrowser(JsonRpc jsonRpc, int id, string address = "",
673+
public OutOfProcessChromiumWebBrowser(IOutOfProcessServer outOfProcessServer, int id, string address = "",
676674
IRequestContext requestContext = null)
677675
{
678676
_id = id;
679677
RequestContext = requestContext;
680-
_jsonRpc = jsonRpc;
678+
this.outOfProcessServer = outOfProcessServer;
681679

682680
Cef.AddDisposable(this);
683681
Address = address;
@@ -876,7 +874,7 @@ void IWebBrowserInternal.SetAddress(AddressChangedEventArgs args)
876874

877875
AddressChanged?.Invoke(this, args);
878876

879-
_ = _jsonRpc.NotifyAsync("AddressChanged", _id, args.Address);
877+
outOfProcessServer.NotifyAddressChanged(_id, args.Address);
880878
}
881879

882880
/// <summary>
@@ -889,7 +887,7 @@ partial void SetLoadingStateChange(LoadingStateChangedEventArgs args)
889887
CanGoForward = args.CanGoForward;
890888
IsLoading = args.IsLoading;
891889

892-
_ = _jsonRpc.NotifyAsync("LoadingStateChange", _id, args.CanGoBack, args.CanGoForward, args.IsLoading);
890+
outOfProcessServer.NotifyLoadingStateChange(_id, args.CanGoBack, args.CanGoForward, args.IsLoading);
893891
}
894892

895893
/// <summary>
@@ -900,7 +898,7 @@ void IWebBrowserInternal.SetTitle(TitleChangedEventArgs args)
900898
{
901899
TitleChanged?.Invoke(this, args);
902900

903-
_ = _jsonRpc.NotifyAsync("TitleChanged", _id, args.Title);
901+
outOfProcessServer.NotifyTitleChanged(_id, args.Title);
904902
}
905903

906904
/// <summary>

CefSharp.OutOfProcess.Core/CefSharp.OutOfProcess.Core.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
<PackageReference Include="PInvoke.Kernel32" Version="0.7.104" />
1010
<PackageReference Include="PInvoke.User32" Version="0.7.104" />
1111
<PackageReference Include="StreamJsonRpc" Version="2.11.35" />
12+
<ProjectReference Include="..\CefSharp.OutOfProcess.Interface\CefSharp.OutOfProcess.Interface.csproj" />
1213

1314
<ProjectReference Include="..\CefSharp.Puppeteer\lib\PuppeteerSharp\CefSharp.DevTools.OutOfProcess.csproj" />
1415
</ItemGroup>

0 commit comments

Comments
 (0)