mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +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<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; }
|
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; }
|
operator ComClass*() const noexcept { return p; }
|
||||||
ComClass& operator*() const noexcept { return *p; }
|
ComClass& operator*() const noexcept { return *p; }
|
||||||
ComClass* operator->() const noexcept { return p; }
|
ComClass* operator->() const noexcept { return p; }
|
||||||
|
|
|
||||||
|
|
@ -727,22 +727,26 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
template <class ArgType>
|
template <typename ArgType>
|
||||||
static String getUriStringFromArgs (ArgType* args)
|
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;
|
const ScopeGuard scope { [&] { CoTaskMemFree (result); } };
|
||||||
args->get_Uri (&uri);
|
return String { CharPointer_UTF16 { result } };
|
||||||
String result { CharPointer_UTF16 { uri } };
|
|
||||||
CoTaskMemFree (uri);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ArgType>
|
||||||
|
static String getUriStringFromArgs (ArgType* args)
|
||||||
|
{
|
||||||
|
return callMethodWithLpwstrResult (args, &ArgType::get_Uri).value_or ("");
|
||||||
|
}
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
void addEventHandlers()
|
void addEventHandlers()
|
||||||
{
|
{
|
||||||
|
|
@ -783,10 +787,7 @@ private:
|
||||||
webView->add_NavigationCompleted (Callback<ICoreWebView2NavigationCompletedEventHandler> (
|
webView->add_NavigationCompleted (Callback<ICoreWebView2NavigationCompletedEventHandler> (
|
||||||
[this] (ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args) -> HRESULT
|
[this] (ICoreWebView2* sender, ICoreWebView2NavigationCompletedEventArgs* args) -> HRESULT
|
||||||
{
|
{
|
||||||
LPWSTR uri;
|
const auto uriString = callMethodWithLpwstrResult (sender, &ICoreWebView2::get_Source).value_or ("");
|
||||||
sender->get_Source (&uri);
|
|
||||||
|
|
||||||
String uriString (uri);
|
|
||||||
|
|
||||||
if (uriString.isNotEmpty())
|
if (uriString.isNotEmpty())
|
||||||
{
|
{
|
||||||
|
|
@ -843,7 +844,7 @@ private:
|
||||||
ComSmartPtr<ICoreWebView2WebResourceRequest> request;
|
ComSmartPtr<ICoreWebView2WebResourceRequest> request;
|
||||||
args->get_Request (request.resetAndGetPointerAddress());
|
args->get_Request (request.resetAndGetPointerAddress());
|
||||||
|
|
||||||
auto uriString = getUriStringFromArgs<ICoreWebView2WebResourceRequest> (request);
|
auto uriString = getUriStringFromArgs (request.get());
|
||||||
|
|
||||||
if (! urlRequest.url.isEmpty() && uriString == urlRequest.url
|
if (! urlRequest.url.isEmpty() && uriString == urlRequest.url
|
||||||
|| (uriString.endsWith ("/") && uriString.upToLastOccurrenceOf ("/", false, false) == urlRequest.url))
|
|| (uriString.endsWith ("/") && uriString.upToLastOccurrenceOf ("/", false, false) == urlRequest.url))
|
||||||
|
|
@ -911,11 +912,8 @@ private:
|
||||||
webView->add_WebMessageReceived (Callback<ICoreWebView2WebMessageReceivedEventHandler> (
|
webView->add_WebMessageReceived (Callback<ICoreWebView2WebMessageReceivedEventHandler> (
|
||||||
[this] (ICoreWebView2*, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT
|
[this] (ICoreWebView2*, ICoreWebView2WebMessageReceivedEventArgs* args) -> HRESULT
|
||||||
{
|
{
|
||||||
if (LPWSTR message = {};
|
if (const auto str = callMethodWithLpwstrResult (args, &ICoreWebView2WebMessageReceivedEventArgs::TryGetWebMessageAsString))
|
||||||
args->TryGetWebMessageAsString (std::addressof (message)) == S_OK)
|
owner.impl->handleNativeEvent (JSON::fromString (*str));
|
||||||
{
|
|
||||||
owner.impl->handleNativeEvent (JSON::fromString (StringRef { CharPointer_UTF16 (message) }));
|
|
||||||
}
|
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}).Get(), &webMessageReceivedToken);
|
}).Get(), &webMessageReceivedToken);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue