Simplify and make more robust wxWebViewEdge initialization

Get rid of ms_isInitialized as it must be kept synchronized with
ms_loaderDll.IsLoaded() anyhow, and it's simpler to not have it at all
rather than ensuring this.

Also ensure that calling Initialize() again, after doing it first
unsuccessfully, doesn't assert because ms_loaderDll is already loaded,
by only leaving it with a valid handle if the initialization succeeded.

Closes #19041.
This commit is contained in:
Vadim Zeitlin
2021-01-25 00:10:32 +01:00
parent 4de8857c85
commit bc825de1fe
2 changed files with 12 additions and 17 deletions

View File

@@ -65,7 +65,6 @@ public:
ICoreWebView2Settings* GetSettings();
static bool ms_isInitialized;
static wxDynamicLibrary ms_loaderDll;
static bool Initialize();

View File

@@ -51,7 +51,6 @@ typedef HRESULT(__stdcall *GetAvailableCoreWebView2BrowserVersionString_t)(
CreateCoreWebView2EnvironmentWithOptions_t wxCreateCoreWebView2EnvironmentWithOptions = NULL;
GetAvailableCoreWebView2BrowserVersionString_t wxGetAvailableCoreWebView2BrowserVersionString = NULL;
bool wxWebViewEdgeImpl::ms_isInitialized = false;
wxDynamicLibrary wxWebViewEdgeImpl::ms_loaderDll;
wxWebViewEdgeImpl::wxWebViewEdgeImpl(wxWebViewEdge* webview):
@@ -113,39 +112,36 @@ HRESULT wxWebViewEdgeImpl::OnEnvironmentCreated(
bool wxWebViewEdgeImpl::Initialize()
{
if (ms_isInitialized)
if (ms_loaderDll.IsLoaded())
return true;
if (!ms_loaderDll.Load("WebView2Loader.dll", wxDL_DEFAULT | wxDL_QUIET))
wxDynamicLibrary loaderDll;
if (!loaderDll.Load("WebView2Loader.dll", wxDL_DEFAULT | wxDL_QUIET))
return false;
// Try to load functions from loader DLL
wxDL_INIT_FUNC(wx, CreateCoreWebView2EnvironmentWithOptions, ms_loaderDll);
wxDL_INIT_FUNC(wx, GetAvailableCoreWebView2BrowserVersionString, ms_loaderDll);
wxDL_INIT_FUNC(wx, CreateCoreWebView2EnvironmentWithOptions, loaderDll);
wxDL_INIT_FUNC(wx, GetAvailableCoreWebView2BrowserVersionString, loaderDll);
if (!wxGetAvailableCoreWebView2BrowserVersionString || !wxCreateCoreWebView2EnvironmentWithOptions)
return false;
// Check if a Edge browser can be found by the loader DLL
wxCoTaskMemPtr<wchar_t> versionStr;
HRESULT hr = wxGetAvailableCoreWebView2BrowserVersionString(NULL, &versionStr);
if (SUCCEEDED(hr) && versionStr)
if (FAILED(hr) || !versionStr)
{
ms_isInitialized = true;
return true;
}
else
wxLogApiError("GetCoreWebView2BrowserVersionInfo", hr);
return false;
}
ms_loaderDll.Attach(loaderDll.Detach());
return true;
}
void wxWebViewEdgeImpl::Uninitialize()
{
if (ms_isInitialized)
{
ms_loaderDll.Unload();
ms_isInitialized = false;
}
}
void wxWebViewEdgeImpl::UpdateBounds()