From 4c56ae4d0d41331d778500e0c8bfc7f79a2612aa Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 17 Jun 2020 17:34:02 +0100 Subject: [PATCH] Windows: Check validity of this pointer in WebView2 callbacks and free WebView2Loader.dll in destructor --- .../native/juce_win32_WebBrowserComponent.cpp | 58 ++++++++++++------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp index 4fd34b8887..b664924f82 100644 --- a/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp +++ b/modules/juce_gui_extra/native/juce_win32_WebBrowserComponent.cpp @@ -341,6 +341,9 @@ public: { removeEventHandlers(); closeWebView(); + + if (webView2LoaderHandle != nullptr) + ::FreeLibrary (webView2LoaderHandle); } void createBrowser() override @@ -597,8 +600,12 @@ private: if (dllPath.isEmpty()) dllPath = "WebView2Loader.dll"; - auto loaderModule = LoadLibraryA (dllPath.toUTF8()); - auto* createWebViewEnvironmentWithOptions = (CreateWebViewEnvironmentWithOptionsFunc) GetProcAddress (loaderModule, + webView2LoaderHandle = LoadLibraryA (dllPath.toUTF8()); + + if (webView2LoaderHandle == nullptr) + return false; + + auto* createWebViewEnvironmentWithOptions = (CreateWebViewEnvironmentWithOptionsFunc) GetProcAddress (webView2LoaderHandle, "CreateCoreWebView2EnvironmentWithOptions"); if (createWebViewEnvironmentWithOptions == nullptr) { @@ -609,13 +616,16 @@ private: auto options = Microsoft::WRL::Make(); + WeakReference weakThis (this); auto hr = createWebViewEnvironmentWithOptions (nullptr, userDataFolder != File() ? userDataFolder.getFullPathName().toWideCharPointer() : nullptr, options.Get(), Callback( - [this] (HRESULT, ICoreWebView2Environment* env) -> HRESULT + [this, weakThis] (HRESULT, ICoreWebView2Environment* env) -> HRESULT { - webViewEnvironment = env; + if (weakThis != nullptr) + webViewEnvironment = env; + return S_OK; }).Get()); @@ -624,31 +634,32 @@ private: void createWebView() { - isCreating = true; - if (auto* peer = getPeer()) { + isCreating = true; + + WeakReference weakThis (this); + webViewEnvironment->CreateCoreWebView2Controller ((HWND) peer->getNativeHandle(), Callback ( - [this] (HRESULT, ICoreWebView2Controller* controller) -> HRESULT + [this, weakThis] (HRESULT, ICoreWebView2Controller* controller) -> HRESULT { - if (controller != nullptr) + if (weakThis != nullptr) { - webViewController = controller; - controller->get_CoreWebView2(webView.resetAndGetPointerAddress()); + isCreating = false; + + if (controller != nullptr) + { + webViewController = controller; + controller->get_CoreWebView2 (webView.resetAndGetPointerAddress()); + + addEventHandlers(); + componentMovedOrResized (true, true); + + if (webView != nullptr && urlRequest.url.isNotEmpty()) + webView->Navigate (urlRequest.url.toWideCharPointer()); + } } - else - { - jassertfalse; - } - - isCreating = false; - - addEventHandlers(); - componentMovedOrResized (true, true); - - if (webView != nullptr && urlRequest.url.isNotEmpty()) - webView->Navigate (urlRequest.url.toWideCharPointer()); return S_OK; }).Get()); @@ -691,6 +702,8 @@ private: //============================================================================== WebBrowserComponent& owner; + HMODULE webView2LoaderHandle = nullptr; + WinRTWrapper::ComPtr webViewEnvironment; WinRTWrapper::ComPtr webViewController; WinRTWrapper::ComPtr webView; @@ -712,6 +725,7 @@ private: bool isCreating = false; //============================================================================== + JUCE_DECLARE_WEAK_REFERENCEABLE (WebView2) JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WebView2) };