Skip to content

Commit 349edc7

Browse files
committed
Merge pull request #666 from amaitland/fix/jsb-memoryleak
Fix JavaScript Binding Memoryleak
2 parents aee3c83 + 843d4ea commit 349edc7

12 files changed

+55
-21
lines changed

CefSharp.BrowserSubprocess.Core/CefAppUnmanagedWrapper.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
#include "Stdafx.h"
77

8-
#include "CefAppWrapper.h"
98
#include "CefBrowserWrapper.h"
109
#include "CefAppUnmanagedWrapper.h"
10+
#include "JavascriptRootObjectWrapper.h"
1111

1212
using namespace System;
1313
using namespace System::Diagnostics;
@@ -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/CefAppUnmanagedWrapper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include "include/cef_base.h"
1111

1212
#include "CefBrowserWrapper.h"
13-
#include "CefAppWrapper.h"
1413

1514
using namespace System::Collections::Generic;
1615

CefSharp.BrowserSubprocess.Core/CefAppWrapper.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
#include "include/cef_app.h"
99
#include "include/cef_base.h"
1010

11-
#include "JavascriptRootObjectWrapper.h"
1211
#include "CefBrowserWrapper.h"
1312
#include "CefAppUnmanagedWrapper.h"
1413

CefSharp.BrowserSubprocess.Core/CefBrowserWrapper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "TypeUtils.h"
1212
#include "Stdafx.h"
13+
#include "JavascriptRootObjectWrapper.h"
1314

1415
using namespace CefSharp::Internals;
1516
using namespace System;
@@ -43,6 +44,7 @@ namespace CefSharp
4344
property bool IsPopup;
4445
property DuplexChannelFactory<IBrowserProcess^>^ ChannelFactory;
4546
property JavascriptRootObject^ JavascriptRootObject;
47+
property JavascriptRootObjectWrapper^ JavascriptRootObjectWrapper;
4648
property IBrowserProcess^ BrowserProcess;
4749

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

CefSharp.BrowserSubprocess.Core/CefTaskScheduler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
//
33
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.
44

5+
#pragma once
6+
57
#include "Stdafx.h"
68
#include "CefTaskScheduler.h"
79

CefSharp.BrowserSubprocess.Core/JavascriptMethodWrapper.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include "Stdafx.h"
77

88
#include "JavascriptMethodWrapper.h"
9-
#include "CefAppWrapper.h"
109

1110
using namespace System;
1211

CefSharp.BrowserSubprocess.Core/JavascriptObjectWrapper.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
#include "Stdafx.h"
77

88
#include "JavascriptObjectWrapper.h"
9-
#include "CefAppWrapper.h"
109

1110
using namespace System;
1211
using namespace CefSharp::Internals;
@@ -16,13 +15,13 @@ namespace CefSharp
1615
void JavascriptObjectWrapper::Bind()
1716
{
1817
//Create property handler for get and set of Properties of this object
19-
JsPropertyHandler = new JavascriptPropertyHandler(
18+
_jsPropertyHandler = new JavascriptPropertyHandler(
2019
gcnew Func<String^, BrowserProcessResponse^>(this, &JavascriptObjectWrapper::GetProperty),
2120
gcnew Func<String^, Object^, BrowserProcessResponse^>(this, &JavascriptObjectWrapper::SetProperty)
2221
);
2322

2423
//V8Value that represents this javascript object - only one per complex type
25-
auto javascriptObject = V8Value->CreateObject(JsPropertyHandler.get());
24+
auto javascriptObject = V8Value->CreateObject(_jsPropertyHandler.get());
2625
auto objectName = StringUtils::ToNative(_object->JavascriptName);
2726
V8Value->SetValue(objectName, javascriptObject, V8_PROPERTY_ATTRIBUTE_NONE);
2827

CefSharp.BrowserSubprocess.Core/JavascriptObjectWrapper.h

Lines changed: 14 additions & 2 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;
@@ -25,10 +26,11 @@ namespace CefSharp
2526
List<JavascriptMethodWrapper^>^ _wrappedMethods;
2627
List<JavascriptPropertyWrapper^>^ _wrappedProperties;
2728
IBrowserProcess^ _browserProcess;
29+
MCefRefPtr<JavascriptPropertyHandler> _jsPropertyHandler;
2830

2931
internal:
3032
MCefRefPtr<CefV8Value> V8Value;
31-
MCefRefPtr<JavascriptPropertyHandler> JsPropertyHandler;
33+
3234

3335
public:
3436
JavascriptObjectWrapper(JavascriptObject^ object, IBrowserProcess^ browserProcess)
@@ -43,7 +45,17 @@ namespace CefSharp
4345
~JavascriptObjectWrapper()
4446
{
4547
V8Value = nullptr;
46-
JsPropertyHandler = nullptr;
48+
_jsPropertyHandler->Cleanup();
49+
_jsPropertyHandler = nullptr;
50+
51+
for each (JavascriptMethodWrapper^ var in _wrappedMethods)
52+
{
53+
delete var;
54+
}
55+
for each (JavascriptPropertyWrapper^ var in _wrappedProperties)
56+
{
57+
delete var;
58+
}
4759
}
4860

4961
void Bind();

CefSharp.BrowserSubprocess.Core/JavascriptPropertyHandler.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ namespace CefSharp
3131
delete _setter;
3232
}
3333

34+
void Cleanup()
35+
{
36+
delete _getter;
37+
delete _setter;
38+
}
39+
3440
virtual bool Get(const CefString& name, const CefRefPtr<CefV8Value> object, CefRefPtr<CefV8Value>& retval,
3541
CefString& exception) override
3642
{

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
{

0 commit comments

Comments
 (0)