Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit 8c23256

Browse files
committed
[[ Bug 22005 ]] Fix memory leaks when using browser widget
This patch fixes two different types of leak which occur in the browser widget. The first is from the wrapper classes used to host the platform specific callback interfaces for events and javascript handlers. A pair of these wrapper class instances leak for every instance of the browser widget on all platforms. The leak is caused by not releasing the (reference-counted) instances correctly. The second is from a failure to free the c-string form of the current javascript handlers list. The last set will leak when the browser widget instance is destroyed. This affects Mac, Windows, Linux and iOS. The leak has been fixed by freeing the c-string in the per-platform destructors.
1 parent b5e0e6b commit 8c23256

6 files changed

Lines changed: 35 additions & 9 deletions

File tree

docs/notes/bugfix-22005.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Fix memory leaks from using the browser widget

libbrowser/src/libbrowser.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,21 @@ void MCBrowserRefCounted::Destroy()
5050

5151
////////////////////////////////////////////////////////////////////////////////
5252

53+
MCBrowserBase::MCBrowserBase(void)
54+
: m_event_handler(nil),
55+
m_javascript_handler(nil)
56+
{
57+
}
58+
59+
MCBrowserBase::~MCBrowserBase(void)
60+
{
61+
if (m_event_handler)
62+
m_event_handler->Release();
63+
64+
if (m_javascript_handler)
65+
m_javascript_handler->Release();
66+
}
67+
5368
void MCBrowserBase::SetEventHandler(MCBrowserEventHandler *p_handler)
5469
{
5570
if (p_handler)
@@ -470,6 +485,9 @@ bool MCBrowserSetRequestHandler(MCBrowserRef p_browser, MCBrowserRequestCallback
470485
return false;
471486

472487
p_browser->SetEventHandler(t_wrapper);
488+
489+
t_wrapper->Release();
490+
473491
return true;
474492
}
475493

@@ -515,6 +533,9 @@ bool MCBrowserSetJavaScriptHandler(MCBrowserRef p_browser, MCBrowserJavaScriptCa
515533
return false;
516534

517535
p_browser->SetJavaScriptHandler(t_wrapper);
536+
537+
t_wrapper->Release();
538+
518539
return true;
519540
}
520541

libbrowser/src/libbrowser_cef.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1291,7 +1291,10 @@ void MCCefBrowserBase::Finalize()
12911291
// IM-2014-07-21: [[ Bug 12296 ]] Notify client of browser being closed
12921292
if (m_client)
12931293
m_client->OnOwnerClosed();
1294-
1294+
1295+
if (m_javascript_handlers != nil)
1296+
MCCStringFree(m_javascript_handlers);
1297+
12951298
m_browser = nil;
12961299
m_client = nil;
12971300
}

libbrowser/src/libbrowser_internal.h

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,8 @@ typedef bool (*MCBrowserIterateCallback)(MCBrowser *p_browser, void *p_context);
3030
class MCBrowserBase : public MCBrowser
3131
{
3232
public:
33-
MCBrowserBase() : m_event_handler(nil), m_javascript_handler(nil)
34-
{
35-
}
36-
37-
virtual ~MCBrowserBase()
38-
{
39-
}
33+
MCBrowserBase(void);
34+
virtual ~MCBrowserBase(void);
4035

4136
void SetEventHandler(MCBrowserEventHandler *p_handler);
4237
void SetJavaScriptHandler(MCBrowserJavaScriptHandler *p_handler);

libbrowser/src/libbrowser_osx_webview.mm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,9 @@ inline void MCBrowserRunBlockOnMainFiber(void (^p_block)(void))
425425
if (m_ui_delegate != nil)
426426
[m_ui_delegate release];
427427

428+
if (m_js_handlers != nil)
429+
MCCStringFree(m_js_handlers);
430+
428431
if (m_js_handler_list != nil)
429432
[m_js_handler_list release];
430433
});

libbrowser/src/libbrowser_uiwebview.mm

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,10 @@ inline void MCBrowserRunBlockOnMainFiber(void (^p_block)(void))
233233

234234
if (m_delegate != nil)
235235
[m_delegate release];
236-
236+
237+
if (m_js_handlers != nil)
238+
MCCStringFree(m_js_handlers);
239+
237240
if (m_js_handler_list != nil)
238241
[m_js_handler_list release];
239242
});

0 commit comments

Comments
 (0)