Skip to content

Commit 678f458

Browse files
committed
CefRenderProcess process creates too many channels (and does not close them)
1 parent 5a5dfbc commit 678f458

File tree

11 files changed

+49
-38
lines changed

11 files changed

+49
-38
lines changed

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace CefSharp
5050
{
5151
auto window = context->GetGlobal();
5252

53-
auto jsRootWrapper = gcnew JavascriptRootObjectWrapper(wrapper->JavascriptRootObject, wrapper->CreateBrowserProxyDelegate);
53+
auto jsRootWrapper = gcnew JavascriptRootObjectWrapper(wrapper->JavascriptRootObject, wrapper->BrowserProcess);
5454

5555
jsRootWrapper->V8Value = window;
5656
jsRootWrapper->Bind();

CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ namespace CefSharp
4343
property bool IsPopup;
4444
property DuplexChannelFactory<IBrowserProcess^>^ ChannelFactory;
4545
property JavascriptRootObject^ JavascriptRootObject;
46-
property Func<IBrowserProcess^>^ CreateBrowserProxyDelegate;
46+
property IBrowserProcess^ BrowserProcess;
4747

4848
JavascriptResponse^ EvaluateScriptInContext(CefRefPtr<CefV8Context> context, CefString script)
4949
{

CefSharp.BrowserSubprocess.Core/JavascriptMethodWrapper.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ namespace CefSharp
2222

2323
BrowserProcessResponse^ JavascriptMethodWrapper::Execute(array<Object^>^ parameters)
2424
{
25-
auto browserProxy = _createBrowserProxyDelegate();
26-
27-
return browserProxy->CallMethod(_ownerId, _javascriptMethod->JavascriptName, parameters);
25+
return _browserProcess->CallMethod(_ownerId, _javascriptMethod->JavascriptName, parameters);
2826
}
2927
}

CefSharp.BrowserSubprocess.Core/JavascriptMethodWrapper.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ namespace CefSharp
1919
MCefRefPtr<JavascriptMethodHandler> _javascriptMethodHandler;
2020
JavascriptMethod^ _javascriptMethod;
2121
int64 _ownerId;
22-
Func<IBrowserProcess^>^ _createBrowserProxyDelegate;
22+
IBrowserProcess^ _browserProcess;
2323

2424
internal:
2525
MCefRefPtr<CefV8Value> V8Value;
2626

2727
public:
28-
JavascriptMethodWrapper(JavascriptMethod^ javascriptMethod, int64 ownerId, Func<IBrowserProcess^>^ createBrowserProxyDelegate)
28+
JavascriptMethodWrapper(JavascriptMethod^ javascriptMethod, int64 ownerId, IBrowserProcess^ browserProcess)
2929
{
3030
_javascriptMethod = javascriptMethod;
3131
_ownerId = ownerId;
32-
_createBrowserProxyDelegate = createBrowserProxyDelegate;
32+
_browserProcess = browserProcess;
3333
_javascriptMethodHandler = new JavascriptMethodHandler(gcnew Func<array<Object^>^, BrowserProcessResponse^>(this, &JavascriptMethodWrapper::Execute));
3434
}
3535

CefSharp.BrowserSubprocess.Core/JavascriptObjectWrapper.cpp

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace CefSharp
2828

2929
for each (JavascriptMethod^ method in Enumerable::OfType<JavascriptMethod^>(_object->Methods))
3030
{
31-
auto wrappedMethod = gcnew JavascriptMethodWrapper(method, _object->Id, _createBrowserProxyDelegate);
31+
auto wrappedMethod = gcnew JavascriptMethodWrapper(method, _object->Id, _browserProcess);
3232
wrappedMethod->V8Value = javascriptObject;
3333
wrappedMethod->Bind();
3434

@@ -37,7 +37,7 @@ namespace CefSharp
3737

3838
for each (JavascriptProperty^ prop in Enumerable::OfType<JavascriptProperty^>(_object->Properties))
3939
{
40-
auto wrappedproperty = gcnew JavascriptPropertyWrapper(prop, _object->Id, _createBrowserProxyDelegate);
40+
auto wrappedproperty = gcnew JavascriptPropertyWrapper(prop, _object->Id, _browserProcess);
4141
wrappedproperty->V8Value = javascriptObject;
4242
wrappedproperty->Bind();
4343

@@ -47,15 +47,11 @@ namespace CefSharp
4747

4848
BrowserProcessResponse^ JavascriptObjectWrapper::GetProperty(String^ memberName)
4949
{
50-
auto browserProxy = _createBrowserProxyDelegate();
51-
52-
return browserProxy->GetProperty(_object->Id, memberName);
50+
return _browserProcess->GetProperty(_object->Id, memberName);
5351
};
5452

5553
BrowserProcessResponse^ JavascriptObjectWrapper::SetProperty(String^ memberName, Object^ value)
5654
{
57-
auto browserProxy = _createBrowserProxyDelegate();
58-
59-
return browserProxy->SetProperty(_object->Id, memberName, value);
55+
return _browserProcess->SetProperty(_object->Id, memberName, value);
6056
};
6157
}

CefSharp.BrowserSubprocess.Core/JavascriptObjectWrapper.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,17 @@ namespace CefSharp
2424
JavascriptObject^ _object;
2525
List<JavascriptMethodWrapper^>^ _wrappedMethods;
2626
List<JavascriptPropertyWrapper^>^ _wrappedProperties;
27-
Func<IBrowserProcess^>^ _createBrowserProxyDelegate;
27+
IBrowserProcess^ _browserProcess;
2828

2929
internal:
3030
MCefRefPtr<CefV8Value> V8Value;
3131
MCefRefPtr<JavascriptPropertyHandler> JsPropertyHandler;
3232

3333
public:
34-
JavascriptObjectWrapper(JavascriptObject^ object, Func<IBrowserProcess^>^ createBrowserProxyDelegate)
34+
JavascriptObjectWrapper(JavascriptObject^ object, IBrowserProcess^ browserProcess)
3535
{
3636
_object = object;
37-
_createBrowserProxyDelegate = createBrowserProxyDelegate;
37+
_browserProcess = browserProcess;
3838

3939
_wrappedMethods = gcnew List<JavascriptMethodWrapper^>();
4040
_wrappedProperties = gcnew List<JavascriptPropertyWrapper^>();

CefSharp.BrowserSubprocess.Core/JavascriptPropertyWrapper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ namespace CefSharp
1919

2020
if (_javascriptProperty->IsComplexType)
2121
{
22-
auto wrapperObject = gcnew JavascriptObjectWrapper(_javascriptProperty->JsObject, _createBrowserProxyDelegate);
22+
auto wrapperObject = gcnew JavascriptObjectWrapper(_javascriptProperty->JsObject, _browserProcess);
2323
wrapperObject->V8Value = V8Value.get();
2424
wrapperObject->Bind();
2525
}

CefSharp.BrowserSubprocess.Core/JavascriptPropertyWrapper.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ namespace CefSharp
1818
private:
1919
JavascriptProperty^ _javascriptProperty;
2020
int64 _ownerId;
21-
Func<IBrowserProcess^>^ _createBrowserProxyDelegate;
21+
IBrowserProcess^ _browserProcess;
2222

2323
internal:
2424
MCefRefPtr<CefV8Value> V8Value;
2525

2626
public:
27-
JavascriptPropertyWrapper(JavascriptProperty^ javascriptProperty, int64 ownerId, Func<IBrowserProcess^>^ createBrowserProxyDelegate)
27+
JavascriptPropertyWrapper(JavascriptProperty^ javascriptProperty, int64 ownerId, IBrowserProcess^ browserProcess)
2828
{
2929
_javascriptProperty = javascriptProperty;
3030
_ownerId = ownerId;
31-
_createBrowserProxyDelegate = createBrowserProxyDelegate;
31+
_browserProcess = browserProcess;
3232
}
3333

3434
~JavascriptPropertyWrapper()

CefSharp.BrowserSubprocess.Core/JavascriptRootObjectWrapper.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,30 +24,30 @@ namespace CefSharp
2424
private:
2525
JavascriptRootObject^ _rootObject;
2626
List<JavascriptObjectWrapper^>^ _wrappedObjects;
27-
Func<IBrowserProcess^>^ _createBrowserProxyDelegate;
27+
IBrowserProcess^ _browserProcess;
2828

2929
internal:
3030
MCefRefPtr<CefV8Value> V8Value;
3131

3232
public:
33-
JavascriptRootObjectWrapper(JavascriptRootObject^ rootObject, Func<IBrowserProcess^>^ createBrowserProxyDelegate)
33+
JavascriptRootObjectWrapper(JavascriptRootObject^ rootObject, IBrowserProcess^ browserProcess)
3434
{
3535
_rootObject = rootObject;
36-
_createBrowserProxyDelegate = createBrowserProxyDelegate;
36+
_browserProcess = browserProcess;
3737
_wrappedObjects = gcnew List<JavascriptObjectWrapper^>();
3838
}
3939

4040
~JavascriptRootObjectWrapper()
4141
{
4242
V8Value = nullptr;
4343
}
44-
44+
4545
void Bind()
4646
{
4747
auto memberObjects = _rootObject->MemberObjects;
4848
for each (JavascriptObject^ obj in Enumerable::OfType<JavascriptObject^>(memberObjects))
4949
{
50-
auto wrapperObject = gcnew JavascriptObjectWrapper(obj, _createBrowserProxyDelegate);
50+
auto wrapperObject = gcnew JavascriptObjectWrapper(obj, _browserProcess);
5151
wrapperObject->V8Value = V8Value.get();
5252
wrapperObject->Bind();
5353

CefSharp.BrowserSubprocess/CefRenderProcess.cs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -58,30 +58,26 @@ public override void OnBrowserCreated(CefBrowserWrapper browser)
5858

5959
channelFactory.Open();
6060

61-
var proxy = channelFactory.CreateChannel();
61+
var browserProcess = channelFactory.CreateChannel();
62+
var clientChannel = ((IClientChannel)browserProcess);
6263

63-
var clientChannel = ((IClientChannel)proxy);
64-
6564
try
6665
{
6766
clientChannel.Open();
67+
browserProcess.Connect();
6868

69-
proxy.Connect();
70-
71-
var javascriptObject = proxy.GetRegisteredJavascriptObjects();
69+
var javascriptObject = browserProcess.GetRegisteredJavascriptObjects();
7270

7371
if (javascriptObject.MemberObjects.Count > 0)
7472
{
7573
browser.JavascriptRootObject = javascriptObject;
76-
browser.CreateBrowserProxyDelegate = channelFactory.CreateChannel;
7774
}
7875

7976
browser.ChannelFactory = channelFactory;
80-
77+
browser.BrowserProcess = browserProcess;
8178
}
8279
catch(Exception)
8380
{
84-
8581
}
8682
}
8783

@@ -96,8 +92,15 @@ public override void OnBrowserDestroyed(CefBrowserWrapper browser)
9692
channelFactory.Close();
9793
}
9894

95+
var clientChannel = ((IClientChannel)browser.BrowserProcess);
96+
97+
if (clientChannel.State == CommunicationState.Opened)
98+
{
99+
clientChannel.Close();
100+
}
101+
99102
browser.ChannelFactory = null;
100-
browser.CreateBrowserProxyDelegate = null;
103+
browser.BrowserProcess = null;
101104
browser.JavascriptRootObject = null;
102105
}
103106

0 commit comments

Comments
 (0)