1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

WebBrowserComponent: Fix leak on Windows

Co-authored-by: Aid Vllasaliu <vllasaliu.aid@gmail.com>
This commit is contained in:
reuk 2025-01-07 11:21:05 +00:00
parent f72cf8ff14
commit 9092182605
No known key found for this signature in database
2 changed files with 19 additions and 19 deletions

View file

@ -116,6 +116,8 @@ public:
ComSmartPtr& operator= (const ComSmartPtr<U>& newP) { ComSmartPtr copy { newP }; std::swap (copy.p, p); return *this; }
ComSmartPtr& operator= (const ComSmartPtr& newP) { ComSmartPtr copy { newP }; std::swap (copy.p, p); return *this; }
ComClass* get() const noexcept { return p; }
operator ComClass*() const noexcept { return p; }
ComClass& operator*() const noexcept { return *p; }
ComClass* operator->() const noexcept { return p; }

View file

@ -727,22 +727,26 @@ private:
}
//==============================================================================
template <class ArgType>
static String getUriStringFromArgs (ArgType* args)
template <typename ArgType>
static std::optional<String> callMethodWithLpwstrResult (ArgType* args, HRESULT (ArgType::* method) (LPWSTR*))
{
if (args != nullptr)
// According to the API reference for WebView2, the result of any method with an LPWSTR
// out-parameter should be freed by the caller using CoTaskMemFree.
if (LPWSTR result{}; args != nullptr && SUCCEEDED ((args->*method) (&result)))
{
LPWSTR uri;
args->get_Uri (&uri);
String result { CharPointer_UTF16 { uri } };
CoTaskMemFree (uri);
return result;
const ScopeGuard scope { [&] { CoTaskMemFree (result); } };
return String { CharPointer_UTF16 { result } };
}
return {};
}
template <typename ArgType>
static String getUriStringFromArgs (ArgType* args)
{
return callMethodWithLpwstrResult (args, &ArgType::get_Uri).value_or ("");
}
//==============================================================================
void addEventHandlers()
{
@ -783,10 +787,7 @@ private:
webView->add_NavigationCompleted (Callback<ICoreWebView2NavigationCompletedEventHandler> (
[this] (ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args) -> HRESULT
{
LPWSTR uri;
sender->get_Source (&uri);
String uriString (uri);
const auto uriString = callMethodWithLpwstrResult (sender, &ICoreWebView2::get_Source).value_or ("");
if (uriString.isNotEmpty())
{
@ -843,7 +844,7 @@ private:
ComSmartPtr<ICoreWebView2WebResourceRequest> request;
args->get_Request (request.resetAndGetPointerAddress());
auto uriString = getUriStringFromArgs<ICoreWebView2WebResourceRequest> (request);
auto uriString = getUriStringFromArgs (request.get());
if (! urlRequest.url.isEmpty() && uriString == urlRequest.url
|| (uriString.endsWith ("/") && uriString.upToLastOccurrenceOf ("/", false, false) == urlRequest.url))
@ -911,11 +912,8 @@ private:
webView->add_WebMessageReceived (Callback<ICoreWebView2WebMessageReceivedEventHandler> (
[this] (ICoreWebView2*, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT
{
if (LPWSTR message = {};
args->TryGetWebMessageAsString (std::addressof (message)) == S_OK)
{
owner.impl->handleNativeEvent (JSON::fromString (StringRef { CharPointer_UTF16 (message) }));
}
if (const auto str = callMethodWithLpwstrResult (args, &ICoreWebView2WebMessageReceivedEventArgs::TryGetWebMessageAsString))
owner.impl->handleNativeEvent (JSON::fromString (*str));
return S_OK;
}).Get(), &webMessageReceivedToken);