Skip to content

Commit fe63ff3

Browse files
committed
memleak : show problem
1 parent 907cca8 commit fe63ff3

8 files changed

Lines changed: 46 additions & 9 deletions

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,15 +50,22 @@ namespace CefSharp
5050
{
5151
auto window = context->GetGlobal();
5252

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

55-
jsRootWrapper->V8Value = window;
56-
jsRootWrapper->Bind();
55+
wrapper->JavascriptRootObjectWrapper->V8Value = window;
56+
wrapper->JavascriptRootObjectWrapper->Bind();
5757
}
5858
};
5959

6060
void CefAppUnmanagedWrapper::OnContextReleased(CefRefPtr<CefBrowser> browser, CefRefPtr<CefFrame> frame, CefRefPtr<CefV8Context> context)
61-
{
61+
{
62+
auto wrapper = FindBrowserWrapper(browser, true);
63+
64+
if (wrapper->JavascriptRootObjectWrapper != nullptr)
65+
{
66+
delete wrapper->JavascriptRootObjectWrapper;
67+
wrapper->JavascriptRootObjectWrapper = nullptr;
68+
}
6269
};
6370

6471
CefBrowserWrapper^ CefAppUnmanagedWrapper::FindBrowserWrapper(CefRefPtr<CefBrowser> browser, bool mustExist)

CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ namespace CefSharp
4343
property bool IsPopup;
4444
property DuplexChannelFactory<IBrowserProcess^>^ ChannelFactory;
4545
property JavascriptRootObject^ JavascriptRootObject;
46+
property JavascriptRootObjectWrapper^ JavascriptRootObjectWrapper;
4647
property IBrowserProcess^ BrowserProcess;
4748

4849
JavascriptResponse^ EvaluateScriptInContext(CefRefPtr<CefV8Context> context, CefString script)

CefSharp.BrowserSubprocess.Core/JavascriptObjectWrapper.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ namespace CefSharp
2323

2424
//V8Value that represents this javascript object - only one per complex type
2525
auto javascriptObject = V8Value->CreateObject(JsPropertyHandler.get());
26+
2627
auto objectName = StringUtils::ToNative(_object->JavascriptName);
2728
V8Value->SetValue(objectName, javascriptObject, V8_PROPERTY_ATTRIBUTE_NONE);
2829

CefSharp.BrowserSubprocess.Core/JavascriptObjectWrapper.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "JavascriptMethodWrapper.h"
1111
#include "JavascriptPropertyWrapper.h"
12+
#include "JavascriptPropertyHandler.h"
1213

1314
using namespace System::Runtime::Serialization;
1415
using namespace System::Linq;
@@ -43,7 +44,17 @@ namespace CefSharp
4344
~JavascriptObjectWrapper()
4445
{
4546
V8Value = nullptr;
47+
JsPropertyHandler->DeleteGetterSetter();
4648
JsPropertyHandler = nullptr;
49+
50+
for each (JavascriptMethodWrapper^ var in _wrappedMethods)
51+
{
52+
delete var;
53+
}
54+
for each (JavascriptPropertyWrapper^ var in _wrappedProperties)
55+
{
56+
delete var;
57+
}
4758
}
4859

4960
void Bind();

CefSharp.BrowserSubprocess.Core/JavascriptPropertyHandler.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ namespace CefSharp
2525
_setter = setter;
2626
}
2727

28+
void DeleteGetterSetter(){
29+
delete _getter;
30+
delete _setter;
31+
}
32+
2833
~JavascriptPropertyHandler()
2934
{
3035
delete _getter;

CefSharp.BrowserSubprocess.Core/JavascriptPropertyWrapper.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ namespace CefSharp
1919

2020
if (_javascriptProperty->IsComplexType)
2121
{
22-
auto wrapperObject = gcnew JavascriptObjectWrapper(_javascriptProperty->JsObject, _browserProcess);
23-
wrapperObject->V8Value = V8Value.get();
24-
wrapperObject->Bind();
22+
auto javascriptObjectWrapper = gcnew JavascriptObjectWrapper(_javascriptProperty->JsObject, _browserProcess);
23+
javascriptObjectWrapper->V8Value = V8Value.get();
24+
javascriptObjectWrapper->Bind();
25+
26+
_javascriptObjectWrapper = javascriptObjectWrapper;
2527
}
2628
else
2729
{

CefSharp.BrowserSubprocess.Core/JavascriptPropertyWrapper.h

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#include "Stdafx.h"
88
#include "include/cef_v8.h"
99

10-
#include "JavascriptPropertyHandler.h"
10+
#include "JavascriptMethodWrapper.h"
1111

1212
using namespace CefSharp::Internals;
1313

@@ -19,7 +19,7 @@ namespace CefSharp
1919
JavascriptProperty^ _javascriptProperty;
2020
int64 _ownerId;
2121
IBrowserProcess^ _browserProcess;
22-
22+
Object^ _javascriptObjectWrapper;
2323
internal:
2424
MCefRefPtr<CefV8Value> V8Value;
2525

@@ -34,6 +34,12 @@ namespace CefSharp
3434
~JavascriptPropertyWrapper()
3535
{
3636
V8Value = nullptr;
37+
38+
if (_javascriptObjectWrapper != nullptr)
39+
{
40+
delete _javascriptObjectWrapper;
41+
_javascriptObjectWrapper = nullptr;
42+
}
3743
}
3844

3945
void Bind();

CefSharp.BrowserSubprocess.Core/JavascriptRootObjectWrapper.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,10 @@ namespace CefSharp
4040
~JavascriptRootObjectWrapper()
4141
{
4242
V8Value = nullptr;
43+
for each (JavascriptObjectWrapper^ var in _wrappedObjects)
44+
{
45+
delete var;
46+
}
4347
}
4448

4549
void Bind()

0 commit comments

Comments
 (0)