95 lines
3.4 KiB
C++
95 lines
3.4 KiB
C++
#include <WebView2EnvironmentOptions.h>
|
|
#include <wil/wrl.h>
|
|
|
|
#include "../utils/log.h"
|
|
#include "webview_environment.h"
|
|
|
|
#include "webview_environment_manager.h"
|
|
|
|
namespace flutter_inappwebview_plugin
|
|
{
|
|
using namespace Microsoft::WRL;
|
|
|
|
WebViewEnvironment::WebViewEnvironment(const FlutterInappwebviewWindowsPlugin* plugin, const std::string& id)
|
|
: plugin(plugin), id(id),
|
|
channelDelegate(std::make_unique<WebViewEnvironmentChannelDelegate>(this, plugin->registrar->messenger()))
|
|
{}
|
|
|
|
void WebViewEnvironment::create(const std::unique_ptr<WebViewEnvironmentSettings> settings, const std::function<void(HRESULT)> completionHandler)
|
|
{
|
|
if (!plugin) {
|
|
if (completionHandler) {
|
|
completionHandler(E_FAIL);
|
|
}
|
|
return;
|
|
}
|
|
|
|
auto hwnd = plugin->webViewEnvironmentManager->getHWND();
|
|
if (!hwnd) {
|
|
if (completionHandler) {
|
|
completionHandler(E_FAIL);
|
|
}
|
|
return;
|
|
}
|
|
|
|
auto options = Make<CoreWebView2EnvironmentOptions>();
|
|
if (settings) {
|
|
if (settings->additionalBrowserArguments.has_value()) {
|
|
options->put_AdditionalBrowserArguments(utf8_to_wide(settings->additionalBrowserArguments.value()).c_str());
|
|
}
|
|
if (settings->allowSingleSignOnUsingOSPrimaryAccount.has_value()) {
|
|
options->put_AllowSingleSignOnUsingOSPrimaryAccount(settings->allowSingleSignOnUsingOSPrimaryAccount.value());
|
|
}
|
|
if (settings->language.has_value()) {
|
|
options->put_Language(utf8_to_wide(settings->language.value()).c_str());
|
|
}
|
|
if (settings->targetCompatibleBrowserVersion.has_value()) {
|
|
options->put_TargetCompatibleBrowserVersion(utf8_to_wide(settings->targetCompatibleBrowserVersion.value()).c_str());
|
|
}
|
|
}
|
|
|
|
auto hr = CreateCoreWebView2EnvironmentWithOptions(
|
|
settings && settings->browserExecutableFolder.has_value() ? utf8_to_wide(settings->browserExecutableFolder.value()).c_str() : nullptr,
|
|
settings && settings->userDataFolder.has_value() ? utf8_to_wide(settings->userDataFolder.value()).c_str() : nullptr,
|
|
options.Get(),
|
|
Callback<ICoreWebView2CreateCoreWebView2EnvironmentCompletedHandler>(
|
|
[this, hwnd, completionHandler](HRESULT result, wil::com_ptr<ICoreWebView2Environment> environment) -> HRESULT
|
|
{
|
|
if (succeededOrLog(result)) {
|
|
environment_ = std::move(environment);
|
|
|
|
auto hr = environment_->CreateCoreWebView2Controller(hwnd, Callback<ICoreWebView2CreateCoreWebView2ControllerCompletedHandler>(
|
|
[this, completionHandler](HRESULT result, wil::com_ptr<ICoreWebView2Controller> controller) -> HRESULT
|
|
{
|
|
if (succeededOrLog(result)) {
|
|
webViewController_ = std::move(controller);
|
|
webViewController_->get_CoreWebView2(&webView_);
|
|
webViewController_->put_IsVisible(false);
|
|
}
|
|
if (completionHandler) {
|
|
completionHandler(result);
|
|
}
|
|
return S_OK;
|
|
}).Get());
|
|
|
|
if (failedAndLog(hr) && completionHandler) {
|
|
completionHandler(hr);
|
|
}
|
|
}
|
|
else if (completionHandler) {
|
|
completionHandler(result);
|
|
}
|
|
return S_OK;
|
|
}).Get());
|
|
|
|
if (failedAndLog(hr) && completionHandler) {
|
|
completionHandler(hr);
|
|
}
|
|
}
|
|
|
|
WebViewEnvironment::~WebViewEnvironment()
|
|
{
|
|
debugLog("dealloc WebViewEnvironment");
|
|
}
|
|
}
|