From 081a21bb6a47a656cc6129d2088b12f0e1f78cf3 Mon Sep 17 00:00:00 2001 From: xiaohucode <1601633802@qq.com> Date: Sat, 2 Sep 2023 22:16:22 +0800 Subject: [PATCH 01/27] add GetCookies Method --- lib/src/webview.dart | 9 +++++++++ windows/webview.cc | 38 ++++++++++++++++++++++++++++++++++++++ windows/webview.h | 3 +++ windows/webview_bridge.cc | 19 +++++++++++++++++++ 4 files changed, 69 insertions(+) diff --git a/lib/src/webview.dart b/lib/src/webview.dart index 32d0770..bfef387 100644 --- a/lib/src/webview.dart +++ b/lib/src/webview.dart @@ -397,6 +397,15 @@ class WebviewController extends ValueNotifier { return _methodChannel.invokeMethod('clearCookies'); } + /// get browser Cookies. + Future getCookies(String url) async { + if (_isDisposed) { + return ''; + } + assert(value.isInitialized); + return _methodChannel.invokeMethod('getCookies', url); + } + /// Clears browser cache. Future clearCache() async { if (_isDisposed) { diff --git a/windows/webview.cc b/windows/webview.cc index 0de207a..d584bc3 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -417,6 +417,44 @@ bool Webview::ClearCookies() { L"{}", nullptr) == S_OK; } +void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { + if (IsValid()) { + wil::com_ptr cookieManager; + auto webview2 = webview_.try_query(); + webview2->get_CookieManager(cookieManager.put()); + if (SUCCEEDED(cookieManager->GetCookies( + util::Utf16FromUtf8(url).c_str(), + Callback( + [this, url, callback]( + HRESULT error_code, + ICoreWebView2CookieList* list) -> HRESULT { + std::wstring result; + + UINT cookie_list_size; + list->get_Count(&cookie_list_size); + for (UINT i = 0; i < cookie_list_size; i++) { + wil::com_ptr cookie; + list->GetValueAtIndex(i, &cookie); + LPWSTR name_ptr; + cookie->get_Name(&name_ptr); + LPWSTR value_ptr; + cookie->get_Value(&value_ptr); + result.append(name_ptr + std::wstring(L"=")); + result.append(value_ptr + std::wstring(L";")); + // std::wcout << L"cookie:" << name_ptr << L"=" << value_ptr + // << ";\n"; + } + // std::wcout << L"cookies:" << result; + callback(SUCCEEDED(error_code), util::Utf8FromUtf16(result)); + return S_OK; + }) + .Get()))) { + return; + } + } + callback(false, std::string()); +} + bool Webview::ClearCache() { if (!IsValid()) { return false; diff --git a/windows/webview.h b/windows/webview.h index 567e742..a63a408 100644 --- a/windows/webview.h +++ b/windows/webview.h @@ -107,6 +107,7 @@ class Webview { typedef std::function AddScriptToExecuteOnDocumentCreatedCallback; typedef std::function ScriptExecutedCallback; + typedef std::function GetCookiesCallback; typedef std::function WebMessageReceivedCallback; typedef std::function WebviewPermissionRequestedCompleter; @@ -145,6 +146,8 @@ class Webview { ScriptExecutedCallback callback); bool PostWebMessage(const std::string& json); bool ClearCookies(); + void GetCookies(const std::string& url, + GetCookiesCallback callback); bool ClearCache(); bool SetCacheDisabled(bool disabled); void SetPopupWindowPolicy(WebviewPopupWindowPolicy policy); diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index f417f9a..8650979 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -41,6 +41,7 @@ constexpr auto kMethodSetVirtualHostNameMapping = "setVirtualHostNameMapping"; constexpr auto kMethodClearVirtualHostNameMapping = "clearVirtualHostNameMapping"; constexpr auto kMethodClearCookies = "clearCookies"; +constexpr auto kMethodGetCookies = "getCookies"; constexpr auto kMethodClearCache = "clearCache"; constexpr auto kMethodSetCacheDisabled = "setCacheDisabled"; constexpr auto kMethodSetPopupWindowPolicy = "setPopupWindowPolicy"; @@ -642,6 +643,24 @@ void WebviewBridge::HandleMethodCall( return result->Error(kMethodFailed); } + // getCookies + if (method_name.compare(kMethodGetCookies) == 0) { + if (const auto url = std::get_if(method_call.arguments())) { + std::shared_ptr> + shared_result = std::move(result); + webview_->GetCookies( + *url, [shared_result](bool success, const std::string& cookies) { + if (!cookies.empty() || !success) { + shared_result->Success(std::move(cookies)); + } else { + shared_result->Error(kScriptFailed, "getCookies failed."); + } + }); + return; + } + return result->Error(kErrorInvalidArgs); + } + // clearCache if (method_name.compare(kMethodClearCache) == 0) { if (webview_->ClearCache()) { From ed1f176c968d7053c58eda9fda1cfd8b20f3f07c Mon Sep 17 00:00:00 2001 From: xiaohucode <1601633802@qq.com> Date: Sun, 3 Sep 2023 17:08:26 +0800 Subject: [PATCH 02/27] success check --- windows/webview_bridge.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 8650979..773e316 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -650,8 +650,8 @@ void WebviewBridge::HandleMethodCall( shared_result = std::move(result); webview_->GetCookies( *url, [shared_result](bool success, const std::string& cookies) { - if (!cookies.empty() || !success) { - shared_result->Success(std::move(cookies)); + if (success) { + shared_result->Success(cookies); } else { shared_result->Error(kScriptFailed, "getCookies failed."); } From 801a5732f6eff57ba52ad6c440d49ee0b5b0a920 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 09:25:53 +0800 Subject: [PATCH 03/27] feat: add setCookies --- lib/src/webview.dart | 19 ++++++++++++++++++- windows/webview.cc | 35 +++++++++++++++++++++++++++++++++++ windows/webview.h | 2 ++ windows/webview_bridge.cc | 17 +++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) diff --git a/lib/src/webview.dart b/lib/src/webview.dart index 13c3aca..f01df63 100644 --- a/lib/src/webview.dart +++ b/lib/src/webview.dart @@ -7,8 +7,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:flutter/widgets.dart'; -import 'enums.dart'; import 'cursor.dart'; +import 'enums.dart'; class HistoryChanged { final bool canGoBack; @@ -406,6 +406,23 @@ class WebviewController extends ValueNotifier { return _methodChannel.invokeMethod('getCookies', url); } + /// Sets browser cookies. + Future setCookies(String url, Map cookies) async { + assert(value.isInitialized); // 确保 WebView 已经初始化 + if (_isDisposed) { + return; + } + + // 将 cookies Map 转换成 EncodableMap 以供 MethodChannel 使用 + final cookiesMap = cookies.map((key, value) => MapEntry(key, value)); + + // 调用 MethodChannel,发送 'setCookies' 方法及其参数 + await _methodChannel.invokeMethod('setCookies', { + 'url': url, + 'cookies': cookiesMap, + }); + } + /// Clears browser cache. Future clearCache() async { if (_isDisposed) { diff --git a/windows/webview.cc b/windows/webview.cc index d584bc3..dfb76a9 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -455,6 +455,41 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { callback(false, std::string()); } +void Webview::SetCookies(const std::string& url, const std::map& cookies, std::function callback) { + if (IsValid()) { + wil::com_ptr cookieManager; + auto webview2 = webview_.try_query(); + if (webview2) { + webview2->get_CookieManager(cookieManager.put()); + if (cookieManager) { + HRESULT hr = S_OK; + for (const auto& pair : cookies) { + wil::com_ptr cookie; + hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(url).c_str(), L"/", &cookie); + if (FAILED(hr)) { + callback(false); // 创建cookie失败 + return; + } + + hr = cookieManager->AddOrUpdateCookie(cookie.get()); + if (FAILED(hr)) { + callback(false); // 添加或更新cookie失败 + return; + } + } + + callback(true); // 成功添加或更新所有cookie + } else { + callback(false); // 获取cookie管理器失败 + } + } else { + callback(false); // 查询ICoreWebView2_2失败 + } + } else { + callback(false); // Webview不在有效状态 + } +} + bool Webview::ClearCache() { if (!IsValid()) { return false; diff --git a/windows/webview.h b/windows/webview.h index a63a408..d6045bd 100644 --- a/windows/webview.h +++ b/windows/webview.h @@ -108,6 +108,7 @@ class Webview { AddScriptToExecuteOnDocumentCreatedCallback; typedef std::function ScriptExecutedCallback; typedef std::function GetCookiesCallback; + typedef std::function SetCookiesCallback; typedef std::function WebMessageReceivedCallback; typedef std::function WebviewPermissionRequestedCompleter; @@ -148,6 +149,7 @@ class Webview { bool ClearCookies(); void GetCookies(const std::string& url, GetCookiesCallback callback); + void SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback); bool ClearCache(); bool SetCacheDisabled(bool disabled); void SetPopupWindowPolicy(WebviewPopupWindowPolicy policy); diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index a41731f..7249193 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -38,6 +38,7 @@ constexpr auto kMethodClearVirtualHostNameMapping = "clearVirtualHostNameMapping"; constexpr auto kMethodClearCookies = "clearCookies"; constexpr auto kMethodGetCookies = "getCookies"; +constexpr auto kMethodSetCookies = "setCookies"; constexpr auto kMethodClearCache = "clearCache"; constexpr auto kMethodSetCacheDisabled = "setCacheDisabled"; constexpr auto kMethodSetPopupWindowPolicy = "setPopupWindowPolicy"; @@ -646,6 +647,22 @@ void WebviewBridge::HandleMethodCall( return result->Error(kErrorInvalidArgs); } + // setCookies + if (method_name.compare(kMethodSetCookies) == 0) { + const auto* args_map = std::get_if(method_call.arguments()); + if (args_map) { + const auto url_it = args_map->find(flutter::EncodableValue("url")); + const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); + if (url_it != args_map->end() && cookies_it != args_map->end()) { + const auto& url = std::get(url_it->second); + const auto& cookiesMap = std::get(cookies_it->second); + SetCookies(url, cookiesMap, std::move(result)); + return; + } + } + result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); + } + // clearCache if (method_name.compare(kMethodClearCache) == 0) { if (webview_->ClearCache()) { From c921dfacd0ce843a753321e416a513772470d30c Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 11:03:57 +0800 Subject: [PATCH 04/27] feat: add setCookies --- windows/webview_bridge.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 7249193..b03ae60 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -656,7 +656,7 @@ void WebviewBridge::HandleMethodCall( if (url_it != args_map->end() && cookies_it != args_map->end()) { const auto& url = std::get(url_it->second); const auto& cookiesMap = std::get(cookies_it->second); - SetCookies(url, cookiesMap, std::move(result)); + webview_->SetCookies(url, cookiesMap, std::move(result)); return; } } From 573397dc694a802e323d7a55e03d1bfabaf38349 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 11:12:53 +0800 Subject: [PATCH 05/27] feat: add setCookies --- windows/webview_bridge.cc | 44 ++++++++++++++++++++++++++------------- 1 file changed, 30 insertions(+), 14 deletions(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index b03ae60..503119a 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -648,20 +648,36 @@ void WebviewBridge::HandleMethodCall( } // setCookies - if (method_name.compare(kMethodSetCookies) == 0) { - const auto* args_map = std::get_if(method_call.arguments()); - if (args_map) { - const auto url_it = args_map->find(flutter::EncodableValue("url")); - const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); - if (url_it != args_map->end() && cookies_it != args_map->end()) { - const auto& url = std::get(url_it->second); - const auto& cookiesMap = std::get(cookies_it->second); - webview_->SetCookies(url, cookiesMap, std::move(result)); - return; - } - } - result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); - } +// setCookies +if (method_name.compare(kMethodSetCookies) == 0) { + const auto* args_map = std::get_if(method_call.arguments()); + if (args_map) { + const auto url_it = args_map->find(flutter::EncodableValue("url")); + const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); + if (url_it != args_map->end() && cookies_it != args_map->end()) { + const auto& url = std::get(url_it->second); + + // 将 EncodableMap 转换为 std::map + std::map cookies; + const auto& cookiesMap = std::get(cookies_it->second); + for (const auto& pair : cookiesMap) { + const auto& key = std::get(pair.first); + const auto& value = std::get(pair.second); + cookies[key] = value; + } + + webview_->SetCookies(url, cookies, [result = std::move(result)](bool success) { + if (success) { + result->Success(); + } else { + result->Error("SetCookiesFailed", "Failed to set cookies."); + } + }); + return; + } + } + result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); +} // clearCache if (method_name.compare(kMethodClearCache) == 0) { From a55caa53f7582cb42b38fbf68b2167923f59d773 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:02:35 +0800 Subject: [PATCH 06/27] feat: add setCookies --- lib/src/webview.dart | 2 -- windows/webview.cc | 12 ++++----- windows/webview_bridge.cc | 51 ++++++++++++++++++--------------------- 3 files changed, 29 insertions(+), 36 deletions(-) diff --git a/lib/src/webview.dart b/lib/src/webview.dart index f01df63..9e2d268 100644 --- a/lib/src/webview.dart +++ b/lib/src/webview.dart @@ -413,10 +413,8 @@ class WebviewController extends ValueNotifier { return; } - // 将 cookies Map 转换成 EncodableMap 以供 MethodChannel 使用 final cookiesMap = cookies.map((key, value) => MapEntry(key, value)); - // 调用 MethodChannel,发送 'setCookies' 方法及其参数 await _methodChannel.invokeMethod('setCookies', { 'url': url, 'cookies': cookiesMap, diff --git a/windows/webview.cc b/windows/webview.cc index dfb76a9..dcc2b38 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -467,26 +467,26 @@ void Webview::SetCookies(const std::string& url, const std::map cookie; hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(url).c_str(), L"/", &cookie); if (FAILED(hr)) { - callback(false); // 创建cookie失败 + callback(false); return; } hr = cookieManager->AddOrUpdateCookie(cookie.get()); if (FAILED(hr)) { - callback(false); // 添加或更新cookie失败 + callback(false); return; } } - callback(true); // 成功添加或更新所有cookie + callback(true); } else { - callback(false); // 获取cookie管理器失败 + callback(false); } } else { - callback(false); // 查询ICoreWebView2_2失败 + callback(false); } } else { - callback(false); // Webview不在有效状态 + callback(false); } } diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 503119a..d06687c 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -647,37 +647,32 @@ void WebviewBridge::HandleMethodCall( return result->Error(kErrorInvalidArgs); } - // setCookies -// setCookies -if (method_name.compare(kMethodSetCookies) == 0) { - const auto* args_map = std::get_if(method_call.arguments()); - if (args_map) { - const auto url_it = args_map->find(flutter::EncodableValue("url")); - const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); - if (url_it != args_map->end() && cookies_it != args_map->end()) { - const auto& url = std::get(url_it->second); - - // 将 EncodableMap 转换为 std::map - std::map cookies; - const auto& cookiesMap = std::get(cookies_it->second); - for (const auto& pair : cookiesMap) { - const auto& key = std::get(pair.first); - const auto& value = std::get(pair.second); - cookies[key] = value; - } + void WebviewBridge::OnSetCookiesSuccess() { + result_->Success(); + } - webview_->SetCookies(url, cookies, [result = std::move(result)](bool success) { - if (success) { - result->Success(); - } else { - result->Error("SetCookiesFailed", "Failed to set cookies."); + if (method_name.compare(kMethodSetCookies) == 0) { + const auto* args_map = std::get_if(method_call.arguments()); + if (args_map) { + const auto url_it = args_map->find(flutter::EncodableValue("url")); + const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); + if (url_it != args_map->end() && cookies_it != args_map->end()) { + const auto& url = std::get(url_it->second); + + std::map cookies; + const auto& cookiesMap = std::get(cookies_it->second); + for (const auto& pair : cookiesMap) { + const auto& key = std::get(pair.first); + const auto& value = std::get(pair.second); + cookies[key] = value; } - }); - return; + + webview_->SetCookies(url, cookies, std::bind(&WebviewBridge::OnSetCookiesSuccess, this)); + return; + } } - } - result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); -} + result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); + } // clearCache if (method_name.compare(kMethodClearCache) == 0) { From 661bebcdeb42aeac2760d96fcbba777e0eba461a Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:11:25 +0800 Subject: [PATCH 07/27] feat: add setCookies --- windows/webview_bridge.cc | 47 +++++++++++++++++++++------------------ 1 file changed, 25 insertions(+), 22 deletions(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index d06687c..c941fee 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -647,31 +647,34 @@ void WebviewBridge::HandleMethodCall( return result->Error(kErrorInvalidArgs); } - void WebviewBridge::OnSetCookiesSuccess() { - result_->Success(); - } + // setCookies + if (method_name.compare(kMethodSetCookies) == 0) { + const auto* args_map = std::get_if(method_call.arguments()); + if (args_map) { + const auto url_it = args_map->find(flutter::EncodableValue("url")); + const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); + if (url_it != args_map->end() && cookies_it != args_map->end()) { + const auto& url = std::get(url_it->second); + + std::map cookies; + const auto& cookiesMap = std::get(cookies_it->second); + for (const auto& pair : cookiesMap) { + const auto& key = std::get(pair.first); + const auto& value = std::get(pair.second); + cookies[key] = value; + } - if (method_name.compare(kMethodSetCookies) == 0) { - const auto* args_map = std::get_if(method_call.arguments()); - if (args_map) { - const auto url_it = args_map->find(flutter::EncodableValue("url")); - const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); - if (url_it != args_map->end() && cookies_it != args_map->end()) { - const auto& url = std::get(url_it->second); - - std::map cookies; - const auto& cookiesMap = std::get(cookies_it->second); - for (const auto& pair : cookiesMap) { - const auto& key = std::get(pair.first); - const auto& value = std::get(pair.second); - cookies[key] = value; + webview_->SetCookies(url, cookies, [result](bool success) mutable { + if (success) { + result->Success(); + } else { + result->Error("SetCookiesFailed", "Failed to set cookies."); } - - webview_->SetCookies(url, cookies, std::bind(&WebviewBridge::OnSetCookiesSuccess, this)); - return; - } + }); + return; } - result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); + } + result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); } // clearCache From 8ae552611f84dd0d621b7712c9403a38e62fd7d3 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:17:26 +0800 Subject: [PATCH 08/27] feat: add setCookies --- windows/webview_bridge.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index c941fee..3637fcb 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -664,7 +664,7 @@ void WebviewBridge::HandleMethodCall( cookies[key] = value; } - webview_->SetCookies(url, cookies, [result](bool success) mutable { + webview_->SetCookies(url, cookies, [result = std::move(result)](bool success) mutable { if (success) { result->Success(); } else { From b3805be7f94c289c45d683856710b78e9a8b4f00 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:26:17 +0800 Subject: [PATCH 09/27] feat: add setCookies --- windows/webview_bridge.cc | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 3637fcb..11fd60c 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -655,6 +655,7 @@ void WebviewBridge::HandleMethodCall( const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); if (url_it != args_map->end() && cookies_it != args_map->end()) { const auto& url = std::get(url_it->second); + shared_result = std::move(result); std::map cookies; const auto& cookiesMap = std::get(cookies_it->second); @@ -664,11 +665,11 @@ void WebviewBridge::HandleMethodCall( cookies[key] = value; } - webview_->SetCookies(url, cookies, [result = std::move(result)](bool success) mutable { + webview_->SetCookies(url, cookies, [shared_result](bool success) { if (success) { - result->Success(); + shared_result->Success(); } else { - result->Error("SetCookiesFailed", "Failed to set cookies."); + shared_result->Error("SetCookiesFailed", "Failed to set cookies."); } }); return; From 3b390e082bb64a5e1af637266979ce9c58e5c4fe Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:31:24 +0800 Subject: [PATCH 10/27] feat: add setCookies --- windows/webview.cc | 2 +- windows/webview_bridge.cc | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/windows/webview.cc b/windows/webview.cc index dcc2b38..1fb57f4 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -455,7 +455,7 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { callback(false, std::string()); } -void Webview::SetCookies(const std::string& url, const std::map& cookies, std::function callback) { +void Webview::SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback) { if (IsValid()) { wil::com_ptr cookieManager; auto webview2 = webview_.try_query(); diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 11fd60c..26b3016 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -651,11 +651,11 @@ void WebviewBridge::HandleMethodCall( if (method_name.compare(kMethodSetCookies) == 0) { const auto* args_map = std::get_if(method_call.arguments()); if (args_map) { + shared_result = std::move(result); const auto url_it = args_map->find(flutter::EncodableValue("url")); const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); if (url_it != args_map->end() && cookies_it != args_map->end()) { const auto& url = std::get(url_it->second); - shared_result = std::move(result); std::map cookies; const auto& cookiesMap = std::get(cookies_it->second); @@ -664,7 +664,6 @@ void WebviewBridge::HandleMethodCall( const auto& value = std::get(pair.second); cookies[key] = value; } - webview_->SetCookies(url, cookies, [shared_result](bool success) { if (success) { shared_result->Success(); From f5dc8a65a0376a57d852b31031dc359da3464305 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:35:49 +0800 Subject: [PATCH 11/27] feat: add setCookies --- windows/webview_bridge.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 26b3016..7a23431 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -651,7 +651,8 @@ void WebviewBridge::HandleMethodCall( if (method_name.compare(kMethodSetCookies) == 0) { const auto* args_map = std::get_if(method_call.arguments()); if (args_map) { - shared_result = std::move(result); + std::shared_ptr> + shared_result = std::move(result); const auto url_it = args_map->find(flutter::EncodableValue("url")); const auto cookies_it = args_map->find(flutter::EncodableValue("cookies")); if (url_it != args_map->end() && cookies_it != args_map->end()) { From f8ef6e2eec17738830a4d87cb82f33abe92712d7 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:43:02 +0800 Subject: [PATCH 12/27] feat: add setCookies --- windows/webview.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/windows/webview.cc b/windows/webview.cc index 1fb57f4..12812b5 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -479,6 +479,7 @@ void Webview::SetCookies(const std::string& url, const std::map Date: Tue, 2 Apr 2024 12:54:44 +0800 Subject: [PATCH 13/27] feat: add log --- windows/webview.cc | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/windows/webview.cc b/windows/webview.cc index 12812b5..d08b435 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -455,42 +455,56 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { callback(false, std::string()); } +#include // 确保包含了这个头文件来使用 OutputDebugString + void Webview::SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback) { + OutputDebugStringA("Attempting to set cookies.\n"); + if (IsValid()) { + OutputDebugStringA("WebView is valid.\n"); wil::com_ptr cookieManager; auto webview2 = webview_.try_query(); if (webview2) { + OutputDebugStringA("ICoreWebView2_2 interface is available.\n"); webview2->get_CookieManager(cookieManager.put()); if (cookieManager) { + OutputDebugStringA("CookieManager is obtained.\n"); HRESULT hr = S_OK; for (const auto& pair : cookies) { wil::com_ptr cookie; hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(url).c_str(), L"/", &cookie); if (FAILED(hr)) { + OutputDebugStringA("Failed to create a cookie.\n"); callback(false); return; } hr = cookieManager->AddOrUpdateCookie(cookie.get()); if (FAILED(hr)) { + OutputDebugStringA("Failed to add or update a cookie.\n"); callback(false); return; } } + OutputDebugStringA("Cookies set successfully.\n"); callback(true); return; } else { + OutputDebugStringA("Failed to obtain CookieManager.\n"); callback(false); } } else { + OutputDebugStringA("ICoreWebView2_2 interface is not available.\n"); callback(false); } } else { + OutputDebugStringA("WebView is not valid.\n"); callback(false); } } + bool Webview::ClearCache() { if (!IsValid()) { return false; From 383af994bd7f0bd09e7fdc76cc7ba560f2ae313a Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 12:58:34 +0800 Subject: [PATCH 14/27] feat: add log --- windows/webview.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/windows/webview.cc b/windows/webview.cc index d08b435..d5c2a2b 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -455,8 +455,6 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { callback(false, std::string()); } -#include // 确保包含了这个头文件来使用 OutputDebugString - void Webview::SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback) { OutputDebugStringA("Attempting to set cookies.\n"); From 05c61f70ad7f17121d40ea0d1a44c157848d8199 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 13:13:50 +0800 Subject: [PATCH 15/27] feat: add log --- windows/webview.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/windows/webview.cc b/windows/webview.cc index d5c2a2b..b104404 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -469,6 +469,9 @@ void Webview::SetCookies(const std::string& url, const std::map cookie; hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(url).c_str(), L"/", &cookie); if (FAILED(hr)) { From 1822cef504b281816a0c9b93f15659ff1260694c Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 13:35:56 +0800 Subject: [PATCH 16/27] feat: fix setCookies domain --- windows/webview.cc | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/windows/webview.cc b/windows/webview.cc index b104404..81bc616 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -457,6 +457,7 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { void Webview::SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback) { OutputDebugStringA("Attempting to set cookies.\n"); + std::string domain = ExtractDomainFromUrl(url); if (IsValid()) { OutputDebugStringA("WebView is valid.\n"); @@ -469,11 +470,11 @@ void Webview::SetCookies(const std::string& url, const std::map cookie; - hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(url).c_str(), L"/", &cookie); + hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(domain).c_str(), L"/", &cookie); if (FAILED(hr)) { OutputDebugStringA("Failed to create a cookie.\n"); callback(false); @@ -505,6 +506,22 @@ void Webview::SetCookies(const std::string& url, const std::map Date: Tue, 2 Apr 2024 13:45:09 +0800 Subject: [PATCH 17/27] feat: fix setCookies domain --- windows/webview.cc | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/windows/webview.cc b/windows/webview.cc index 81bc616..4a305eb 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -455,9 +455,11 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { callback(false, std::string()); } -void Webview::SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback) { +void Webview::SetCookies(const std::string& originalUrl, const std::map& cookies, SetCookiesCallback callback) { OutputDebugStringA("Attempting to set cookies.\n"); - std::string domain = ExtractDomainFromUrl(url); + + // 从原始URL中提取域名 + std::string domain = ExtractDomainFromUrl(originalUrl); if (IsValid()) { OutputDebugStringA("WebView is valid.\n"); @@ -474,6 +476,7 @@ void Webview::SetCookies(const std::string& url, const std::map cookie; + // 使用提取的域名设置cookie hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(domain).c_str(), L"/", &cookie); if (FAILED(hr)) { OutputDebugStringA("Failed to create a cookie.\n"); @@ -506,8 +509,9 @@ void Webview::SetCookies(const std::string& url, const std::map Date: Tue, 2 Apr 2024 13:55:44 +0800 Subject: [PATCH 18/27] feat: fix setCookies domain --- windows/webview.h | 1 + 1 file changed, 1 insertion(+) diff --git a/windows/webview.h b/windows/webview.h index d6045bd..bf314d1 100644 --- a/windows/webview.h +++ b/windows/webview.h @@ -150,6 +150,7 @@ class Webview { void GetCookies(const std::string& url, GetCookiesCallback callback); void SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback); + std::string ExtractDomainFromUrl(const std::string& url); bool ClearCache(); bool SetCacheDisabled(bool disabled); void SetPopupWindowPolicy(WebviewPopupWindowPolicy policy); From b6d8a9ebcd8b1922f2be5bc8509a2dff66491533 Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 14:10:54 +0800 Subject: [PATCH 19/27] feat: fix setCookies domain --- windows/webview.cc | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/windows/webview.cc b/windows/webview.cc index 4a305eb..cc465b6 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -458,7 +458,6 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { void Webview::SetCookies(const std::string& originalUrl, const std::map& cookies, SetCookiesCallback callback) { OutputDebugStringA("Attempting to set cookies.\n"); - // 从原始URL中提取域名 std::string domain = ExtractDomainFromUrl(originalUrl); if (IsValid()) { @@ -476,7 +475,6 @@ void Webview::SetCookies(const std::string& originalUrl, const std::map cookie; - // 使用提取的域名设置cookie hr = cookieManager->CreateCookie(util::Utf16FromUtf8(pair.first).c_str(), util::Utf16FromUtf8(pair.second).c_str(), util::Utf16FromUtf8(domain).c_str(), L"/", &cookie); if (FAILED(hr)) { OutputDebugStringA("Failed to create a cookie.\n"); @@ -510,17 +508,14 @@ void Webview::SetCookies(const std::string& originalUrl, const std::map Date: Tue, 2 Apr 2024 14:14:51 +0800 Subject: [PATCH 20/27] feat: fix setCookies domain --- windows/webview.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/windows/webview.cc b/windows/webview.cc index cc465b6..042f8de 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -508,7 +508,7 @@ void Webview::SetCookies(const std::string& originalUrl, const std::map Date: Tue, 2 Apr 2024 14:40:24 +0800 Subject: [PATCH 21/27] feat: add setCookiesWithDomains --- lib/src/webview.dart | 12 ++++++++++ windows/webview.cc | 46 +++++++++++++++++++++++++++++++++++++++ windows/webview.h | 1 + windows/webview_bridge.cc | 37 +++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+) diff --git a/lib/src/webview.dart b/lib/src/webview.dart index 9e2d268..ba27bc7 100644 --- a/lib/src/webview.dart +++ b/lib/src/webview.dart @@ -421,6 +421,18 @@ class WebviewController extends ValueNotifier { }); } + /// Sets browser cookies with specific domains. + Future setCookiesWithDomains(Map> cookiesWithDomains) async { + assert(value.isInitialized); // 确保 WebView 已经初始化 + if (_isDisposed) { + return; + } + + await _methodChannel.invokeMethod('setCookiesWithDomains', { + 'cookiesWithDomains': cookiesWithDomains, + }); + } + /// Clears browser cache. Future clearCache() async { if (_isDisposed) { diff --git a/windows/webview.cc b/windows/webview.cc index 042f8de..685f60b 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -507,6 +507,52 @@ void Webview::SetCookies(const std::string& originalUrl, const std::map>& cookiesWithDomains, SetCookiesCallback callback) { + if (!IsValid()) { + OutputDebugStringA("WebView is not valid.\n"); + callback(false); + return; + } + + wil::com_ptr cookieManager; + auto webview2 = webview_.try_query(); + if (!webview2) { + OutputDebugStringA("ICoreWebView2_2 interface is not available.\n"); + callback(false); + return; + } + + webview2->get_CookieManager(cookieManager.put()); + if (!cookieManager) { + OutputDebugStringA("Failed to obtain CookieManager.\n"); + callback(false); + return; + } + + HRESULT hr = S_OK; + for (const auto& domainAndCookies : cookiesWithDomains) { + const std::string& domain = domainAndCookies.first; + for (const auto& nameAndValue : domainAndCookies.second) { + wil::com_ptr cookie; + hr = cookieManager->CreateCookie(util::Utf16FromUtf8(nameAndValue.first).c_str(), util::Utf16FromUtf8(nameAndValue.second).c_str(), util::Utf16FromUtf8(domain).c_str(), L"/", &cookie); + if (FAILED(hr)) { + OutputDebugStringA(("Failed to create a cookie for domain: " + domain + "\n").c_str()); + callback(false); + return; + } + + hr = cookieManager->AddOrUpdateCookie(cookie.get()); + if (FAILED(hr)) { + OutputDebugStringA(("Failed to add or update a cookie for domain: " + domain + "\n").c_str()); + callback(false); + return; + } + } + } + + OutputDebugStringA("Cookies set successfully for multiple domains.\n"); + callback(true); +} std::string Webview::ExtractDomainFromUrl(const std::string& url) { auto pos = url.find("://"); diff --git a/windows/webview.h b/windows/webview.h index bf314d1..733c4f4 100644 --- a/windows/webview.h +++ b/windows/webview.h @@ -149,6 +149,7 @@ class Webview { bool ClearCookies(); void GetCookies(const std::string& url, GetCookiesCallback callback); + void SetCookiesWithDomains(const std::map>& cookiesWithDomains, SetCookiesCallback callback); void SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback); std::string ExtractDomainFromUrl(const std::string& url); bool ClearCache(); diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index 7a23431..e580f30 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -39,6 +39,7 @@ constexpr auto kMethodClearVirtualHostNameMapping = constexpr auto kMethodClearCookies = "clearCookies"; constexpr auto kMethodGetCookies = "getCookies"; constexpr auto kMethodSetCookies = "setCookies"; +constexpr auto kMethodSetCookiesWithDomains = "setCookiesWithDomains"; constexpr auto kMethodClearCache = "clearCache"; constexpr auto kMethodSetCacheDisabled = "setCacheDisabled"; constexpr auto kMethodSetPopupWindowPolicy = "setPopupWindowPolicy"; @@ -678,6 +679,42 @@ void WebviewBridge::HandleMethodCall( result->Error("InvalidArguments", "Invalid arguments for 'setCookies'. Expected 'url' and 'cookies'."); } + if (method_name.compare(kMethodSetCookiesWithDomains) == 0) { + const auto* args_map = std::get_if(method_call.arguments()); + if (args_map) { + std::shared_ptr> shared_result = std::move(result); + const auto cookies_it = args_map->find(flutter::EncodableValue("cookiesWithDomains")); + if (cookies_it != args_map->end()) { + const auto& cookiesWithDomainsMap = std::get(cookies_it->second); + std::map> cookiesWithDomains; + + for (const auto& domainPair : cookiesWithDomainsMap) { + const auto& domain = std::get(domainPair.first); + const auto& cookiesMap = std::get(domainPair.second); + + std::map cookies; + for (const auto& cookiePair : cookiesMap) { + const auto& cookieName = std::get(cookiePair.first); + const auto& cookieValue = std::get(cookiePair.second); + cookies[cookieName] = cookieValue; + } + + cookiesWithDomains[domain] = cookies; + } + + webview_->SetCookiesWithDomains(cookiesWithDomains, [shared_result](bool success) { + if (success) { + shared_result->Success(); + } else { + shared_result->Error("SetCookiesWithDomainsFailed", "Failed to set cookies with domains."); + } + }); + return; + } + } + result->Error("InvalidArguments", "Invalid arguments for 'setCookiesWithDomains'."); + } + // clearCache if (method_name.compare(kMethodClearCache) == 0) { if (webview_->ClearCache()) { From 122880e87acb54de310b7fa842f170290b85c98b Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 15:07:16 +0800 Subject: [PATCH 22/27] feat: add setCookiesWithDomains --- lib/src/webview.dart | 13 +++++++---- windows/webview.cc | 47 +++++++++++++++++++++++++++------------ windows/webview.h | 1 + windows/webview_bridge.cc | 42 ++++++++++++++++++++-------------- 4 files changed, 68 insertions(+), 35 deletions(-) diff --git a/lib/src/webview.dart b/lib/src/webview.dart index ba27bc7..ac86647 100644 --- a/lib/src/webview.dart +++ b/lib/src/webview.dart @@ -397,13 +397,18 @@ class WebviewController extends ValueNotifier { return _methodChannel.invokeMethod('clearCookies'); } - /// get browser Cookies. - Future getCookies(String url) async { + /// Get browser cookies as a list of maps, each representing a cookie. + Future>> getCookies(String url) async { if (_isDisposed) { - return ''; + return []; } assert(value.isInitialized); - return _methodChannel.invokeMethod('getCookies', url); + final dynamic result = await _methodChannel.invokeMethod('getCookies', url); + if (result is List) { + return result.map>((e) => Map.from(e)).toList(); + } else { + return []; + } } /// Sets browser cookies. diff --git a/windows/webview.cc b/windows/webview.cc index 685f60b..3293cbe 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -417,7 +417,7 @@ bool Webview::ClearCookies() { L"{}", nullptr) == S_OK; } -void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { +void Webview::GetCookies(const std::string& url, GetCookiesFullInfoCallback callback) { if (IsValid()) { wil::com_ptr cookieManager; auto webview2 = webview_.try_query(); @@ -428,33 +428,52 @@ void Webview::GetCookies(const std::string& url, GetCookiesCallback callback) { [this, url, callback]( HRESULT error_code, ICoreWebView2CookieList* list) -> HRESULT { - std::wstring result; + std::vector> cookies; UINT cookie_list_size; list->get_Count(&cookie_list_size); - for (UINT i = 0; i < cookie_list_size; i++) { + for (UINT i = 0; i < cookie_list_size; ++i) { wil::com_ptr cookie; list->GetValueAtIndex(i, &cookie); - LPWSTR name_ptr; - cookie->get_Name(&name_ptr); - LPWSTR value_ptr; - cookie->get_Value(&value_ptr); - result.append(name_ptr + std::wstring(L"=")); - result.append(value_ptr + std::wstring(L";")); - // std::wcout << L"cookie:" << name_ptr << L"=" << value_ptr - // << ";\n"; + + std::map cookieDetails; + // Get name + wil::unique_cotaskmem_string name; + cookie->get_Name(&name); + cookieDetails["name"] = util::Utf8FromUtf16(name.get()); + + // Get value + wil::unique_cotaskmem_string value; + cookie->get_Value(&value); + cookieDetails["value"] = util::Utf8FromUtf16(value.get()); + + // Get domain + wil::unique_cotaskmem_string domain; + cookie->get_Domain(&domain); + cookieDetails["domain"] = util::Utf8FromUtf16(domain.get()); + + // Get path + wil::unique_cotaskmem_string path; + cookie->get_Path(&path); + cookieDetails["path"] = util::Utf8FromUtf16(path.get()); + + // Add more properties as needed... + + cookies.push_back(cookieDetails); } - // std::wcout << L"cookies:" << result; - callback(SUCCEEDED(error_code), util::Utf8FromUtf16(result)); + + callback(SUCCEEDED(error_code), cookies); return S_OK; }) .Get()))) { return; } } - callback(false, std::string()); + // In case of failure or WebView not valid + callback(false, {}); } + void Webview::SetCookies(const std::string& originalUrl, const std::map& cookies, SetCookiesCallback callback) { OutputDebugStringA("Attempting to set cookies.\n"); diff --git a/windows/webview.h b/windows/webview.h index 733c4f4..051f566 100644 --- a/windows/webview.h +++ b/windows/webview.h @@ -108,6 +108,7 @@ class Webview { AddScriptToExecuteOnDocumentCreatedCallback; typedef std::function ScriptExecutedCallback; typedef std::function GetCookiesCallback; + typedef std::function>& cookies)> GetCookiesFullInfoCallback; typedef std::function SetCookiesCallback; typedef std::function WebMessageReceivedCallback; typedef std::function diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index e580f30..f55547d 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -630,23 +630,31 @@ void WebviewBridge::HandleMethodCall( return result->Error(kMethodFailed); } - // getCookies - if (method_name.compare(kMethodGetCookies) == 0) { - if (const auto url = std::get_if(method_call.arguments())) { - std::shared_ptr> - shared_result = std::move(result); - webview_->GetCookies( - *url, [shared_result](bool success, const std::string& cookies) { - if (success) { - shared_result->Success(cookies); - } else { - shared_result->Error(kScriptFailed, "getCookies failed."); - } - }); - return; - } - return result->Error(kErrorInvalidArgs); - } + // getCookies + if (method_name.compare(kMethodGetCookies) == 0) { + if (const auto url = std::get_if(method_call.arguments())) { + std::shared_ptr> shared_result = std::move(result); + webview_->GetCookies( + *url, [shared_result](bool success, const std::vector>& cookies) { + if (success) { + // 转换cookies数据为flutter::EncodableValue + flutter::EncodableList cookiesList; + for (const auto& cookie : cookies) { + flutter::EncodableMap cookieMap; + for (const auto& field : cookie) { + cookieMap[flutter::EncodableValue(field.first)] = flutter::EncodableValue(field.second); + } + cookiesList.push_back(flutter::EncodableValue(cookieMap)); + } + shared_result->Success(flutter::EncodableValue(cookiesList)); + } else { + shared_result->Error(kScriptFailed, "getCookies failed."); + } + }); + return; + } + return result->Error(kErrorInvalidArgs); + } // setCookies if (method_name.compare(kMethodSetCookies) == 0) { From 531c61350b0b4f299b48f268d951305e53710dae Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 15:32:06 +0800 Subject: [PATCH 23/27] feat: add setCookiesWithDomains --- windows/webview.cc | 128 ++++++++++++++++++++++---------------- windows/webview.h | 3 +- windows/webview_bridge.cc | 1 - 3 files changed, 77 insertions(+), 55 deletions(-) diff --git a/windows/webview.cc b/windows/webview.cc index 3293cbe..f8ff090 100644 --- a/windows/webview.cc +++ b/windows/webview.cc @@ -418,59 +418,83 @@ bool Webview::ClearCookies() { } void Webview::GetCookies(const std::string& url, GetCookiesFullInfoCallback callback) { - if (IsValid()) { - wil::com_ptr cookieManager; - auto webview2 = webview_.try_query(); - webview2->get_CookieManager(cookieManager.put()); - if (SUCCEEDED(cookieManager->GetCookies( - util::Utf16FromUtf8(url).c_str(), - Callback( - [this, url, callback]( - HRESULT error_code, - ICoreWebView2CookieList* list) -> HRESULT { - std::vector> cookies; - - UINT cookie_list_size; - list->get_Count(&cookie_list_size); - for (UINT i = 0; i < cookie_list_size; ++i) { - wil::com_ptr cookie; - list->GetValueAtIndex(i, &cookie); - - std::map cookieDetails; - // Get name - wil::unique_cotaskmem_string name; - cookie->get_Name(&name); - cookieDetails["name"] = util::Utf8FromUtf16(name.get()); - - // Get value - wil::unique_cotaskmem_string value; - cookie->get_Value(&value); - cookieDetails["value"] = util::Utf8FromUtf16(value.get()); - - // Get domain - wil::unique_cotaskmem_string domain; - cookie->get_Domain(&domain); - cookieDetails["domain"] = util::Utf8FromUtf16(domain.get()); - - // Get path - wil::unique_cotaskmem_string path; - cookie->get_Path(&path); - cookieDetails["path"] = util::Utf8FromUtf16(path.get()); - - // Add more properties as needed... - - cookies.push_back(cookieDetails); - } - - callback(SUCCEEDED(error_code), cookies); - return S_OK; - }) - .Get()))) { - return; + if (IsValid()) { + wil::com_ptr cookieManager; + auto webview2 = webview_.try_query(); + webview2->get_CookieManager(cookieManager.put()); + if (SUCCEEDED(cookieManager->GetCookies( + util::Utf16FromUtf8(url).c_str(), + Callback( + [this, url, callback]( + HRESULT error_code, + ICoreWebView2CookieList* list) -> HRESULT { + std::vector> cookies; + + UINT cookie_list_size; + list->get_Count(&cookie_list_size); + for (UINT i = 0; i < cookie_list_size; ++i) { + wil::com_ptr cookie; + list->GetValueAtIndex(i, &cookie); + + std::map cookieDetails; + + // Get name + wil::unique_cotaskmem_string name; + cookie->get_Name(&name); + cookieDetails["name"] = util::Utf8FromUtf16(name.get()); + + // Get value + wil::unique_cotaskmem_string value; + cookie->get_Value(&value); + cookieDetails["value"] = util::Utf8FromUtf16(value.get()); + + // Get domain + wil::unique_cotaskmem_string domain; + cookie->get_Domain(&domain); + cookieDetails["domain"] = util::Utf8FromUtf16(domain.get()); + + // Get path + wil::unique_cotaskmem_string path; + cookie->get_Path(&path); + cookieDetails["path"] = util::Utf8FromUtf16(path.get()); + + // Get Expires + double expires; + cookie->get_Expires(&expires); + cookieDetails["expires"] = std::to_string(expires); // Expires is a timestamp + + // Get IsSecure + BOOL isSecure; + cookie->get_IsSecure(&isSecure); + cookieDetails["is_secure"] = isSecure ? "true" : "false"; + + // Get IsSession + BOOL isSession; + cookie->get_IsSession(&isSession); + cookieDetails["is_session"] = isSession ? "true" : "false"; + + // Get IsHttpOnly + BOOL isHttpOnly; + cookie->get_IsHttpOnly(&isHttpOnly); + cookieDetails["is_http_only"] = isHttpOnly ? "true" : "false"; + + // Get SameSite + COREWEBVIEW2_COOKIE_SAME_SITE_KIND sameSite; + cookie->get_SameSite(&sameSite); + cookieDetails["same_site"] = std::to_string(sameSite); // SameSite is an enum + + cookies.push_back(cookieDetails); + } + + callback(SUCCEEDED(error_code), cookies); + return S_OK; + }) + .Get()))) { + return; + } } - } - // In case of failure or WebView not valid - callback(false, {}); + // In case of failure or WebView not valid + callback(false, {}); } diff --git a/windows/webview.h b/windows/webview.h index 051f566..28d1746 100644 --- a/windows/webview.h +++ b/windows/webview.h @@ -148,8 +148,7 @@ class Webview { ScriptExecutedCallback callback); bool PostWebMessage(const std::string& json); bool ClearCookies(); - void GetCookies(const std::string& url, - GetCookiesCallback callback); + void GetCookies(const std::string& url,GetCookiesCallback callback); void SetCookiesWithDomains(const std::map>& cookiesWithDomains, SetCookiesCallback callback); void SetCookies(const std::string& url, const std::map& cookies, SetCookiesCallback callback); std::string ExtractDomainFromUrl(const std::string& url); diff --git a/windows/webview_bridge.cc b/windows/webview_bridge.cc index f55547d..b6388a9 100644 --- a/windows/webview_bridge.cc +++ b/windows/webview_bridge.cc @@ -637,7 +637,6 @@ void WebviewBridge::HandleMethodCall( webview_->GetCookies( *url, [shared_result](bool success, const std::vector>& cookies) { if (success) { - // 转换cookies数据为flutter::EncodableValue flutter::EncodableList cookiesList; for (const auto& cookie : cookies) { flutter::EncodableMap cookieMap; From b8fed5c7f46ee0185b3a1f2e6e280931ff2f75bb Mon Sep 17 00:00:00 2001 From: JI <237525603@qq.com> Date: Tue, 2 Apr 2024 15:32:29 +0800 Subject: [PATCH 24/27] feat: add setCookiesWithDomains --- .idea/workspace.xml | 145 ++++++++++++++++++++++++++++++++++++++++---- webview_windows.iml | 1 - 2 files changed, 132 insertions(+), 14 deletions(-) diff --git a/.idea/workspace.xml b/.idea/workspace.xml index a6a1075..787656e 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,5 +1,20 @@ + + + + + + + + + + @@ -22,24 +37,128 @@ - - - - - - - - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +