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:
parent
f72cf8ff14
commit
9092182605
2 changed files with 19 additions and 19 deletions
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue