2019-11-02 03:16:47 +00:00
import ' dart:async ' ;
2021-01-30 13:53:32 +00:00
import ' dart:io ' ;
2019-11-02 03:16:47 +00:00
2021-01-30 13:53:32 +00:00
import ' package:device_info/device_info.dart ' ;
2019-10-26 02:42:50 +00:00
import ' package:flutter/services.dart ' ;
2021-01-30 13:53:32 +00:00
import ' package:intl/intl.dart ' ;
2019-10-26 02:42:50 +00:00
2021-01-30 13:53:32 +00:00
import ' in_app_webview_controller.dart ' ;
import ' headless_in_app_webview.dart ' ;
2019-11-25 00:42:27 +00:00
import ' types.dart ' ;
2020-05-11 00:48:41 +00:00
///Class that implements a singleton object (shared instance) which manages the cookies used by WebView instances.
2020-05-29 12:51:26 +00:00
///On Android, it is implemented using [CookieManager](https://developer.android.com/reference/android/webkit/CookieManager).
///On iOS, it is implemented using [WKHTTPCookieStore](https://developer.apple.com/documentation/webkit/wkhttpcookiestore).
2019-10-26 02:42:50 +00:00
///
2021-01-31 21:08:20 +00:00
///**NOTE for iOS below 11.0 (LIMITED SUPPORT!)**: in this case, almost all of the methods ([CookieManager.deleteAllCookies] and [IOSCookieManager.getAllCookies] are not supported!)
2021-01-30 13:53:32 +00:00
///has been implemented using JavaScript because there is no other way to work with them on iOS below 11.0.
///See https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies for JavaScript restrictions.
2019-10-26 02:42:50 +00:00
class CookieManager {
2021-01-28 16:10:15 +00:00
static CookieManager ? _instance ;
2019-12-01 11:55:06 +00:00
static const MethodChannel _channel = const MethodChannel (
' com.pichillilorenzo/flutter_inappwebview_cookiemanager ' ) ;
2019-10-26 02:42:50 +00:00
2021-01-31 21:08:20 +00:00
///Contains only iOS-specific methods of [CookieManager].
late IOSCookieManager ios ;
///Gets the [CookieManager] shared instance.
2019-10-31 02:20:07 +00:00
static CookieManager instance ( ) {
2021-01-28 16:10:15 +00:00
return ( _instance ! = null ) ? _instance ! : _init ( ) ;
2019-10-26 02:42:50 +00:00
}
2019-10-31 02:20:07 +00:00
static CookieManager _init ( ) {
_channel . setMethodCallHandler ( _handleMethod ) ;
2020-05-29 17:56:03 +00:00
_instance = CookieManager ( ) ;
2021-01-31 21:08:20 +00:00
_instance ! . ios = IOSCookieManager . instance ( ) ;
2021-01-28 16:10:15 +00:00
return _instance ! ;
2019-10-31 02:20:07 +00:00
}
2019-12-01 11:55:06 +00:00
static Future < dynamic > _handleMethod ( MethodCall call ) async { }
2019-10-26 02:42:50 +00:00
2021-01-30 13:53:32 +00:00
///Sets a cookie for the given [url]. Any existing cookie with the same [host], [path] and [name] will be replaced with the new cookie.
///The cookie being set will be ignored if it is expired.
2019-10-26 02:42:50 +00:00
///
///The default value of [path] is `"/"`.
///If [domain] is `null`, its default value will be the domain name of [url].
2021-01-30 13:53:32 +00:00
///
///[iosBelow11WebViewController] could be used if you need to set a session-only cookie using JavaScript (so [isHttpOnly] cannot be set, see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies)
///on the current URL of the [WebView] managed by that controller when you need to target iOS below 11. In this case the [url] parameter is ignored.
///
///**NOTE for iOS below 11.0**: If [iosBelow11WebViewController] is `null` or JavaScript is disabled for it, it will try to use a [HeadlessInAppWebView]
///to set the cookie (session-only cookie won't work! In that case, you should set also [expiresDate] or [maxAge]).
2019-12-01 11:55:06 +00:00
Future < void > setCookie (
2021-01-28 16:10:15 +00:00
{ required String url ,
required String name ,
required String value ,
String ? domain ,
2019-12-01 11:55:06 +00:00
String path = " / " ,
2021-01-28 16:10:15 +00:00
int ? expiresDate ,
int ? maxAge ,
bool ? isSecure ,
bool ? isHttpOnly ,
2021-01-30 13:53:32 +00:00
HTTPCookieSameSitePolicy ? sameSite ,
InAppWebViewController ? iosBelow11WebViewController } ) async {
2020-06-13 01:50:19 +00:00
if ( domain = = null ) domain = _getDomainName ( url ) ;
2019-10-26 02:42:50 +00:00
2021-01-28 16:10:15 +00:00
assert ( url . isNotEmpty ) ;
assert ( name . isNotEmpty ) ;
assert ( value . isNotEmpty ) ;
assert ( domain . isNotEmpty ) ;
assert ( path . isNotEmpty ) ;
2019-10-26 02:42:50 +00:00
2021-01-30 13:53:32 +00:00
if ( Platform . isIOS ) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin ( ) ;
IosDeviceInfo iosInfo = await deviceInfo . iosInfo ;
var version = double . tryParse ( iosInfo . systemVersion ) ;
if ( version ! = null & & version < 11.0 ) {
2021-02-01 14:55:27 +00:00
await _setCookieWithJavaScript ( url: url , name: name , value: value , domain: domain ,
path: path , expiresDate: expiresDate , maxAge: maxAge , isSecure: isSecure ,
sameSite: sameSite , webViewController: iosBelow11WebViewController ) ;
2021-01-30 13:53:32 +00:00
return ;
}
}
2019-10-26 02:42:50 +00:00
Map < String , dynamic > args = < String , dynamic > { } ;
args . putIfAbsent ( ' url ' , ( ) = > url ) ;
args . putIfAbsent ( ' name ' , ( ) = > name ) ;
args . putIfAbsent ( ' value ' , ( ) = > value ) ;
args . putIfAbsent ( ' domain ' , ( ) = > domain ) ;
args . putIfAbsent ( ' path ' , ( ) = > path ) ;
args . putIfAbsent ( ' expiresDate ' , ( ) = > expiresDate ? . toString ( ) ) ;
args . putIfAbsent ( ' maxAge ' , ( ) = > maxAge ) ;
args . putIfAbsent ( ' isSecure ' , ( ) = > isSecure ) ;
2020-06-13 01:50:19 +00:00
args . putIfAbsent ( ' isHttpOnly ' , ( ) = > isHttpOnly ) ;
args . putIfAbsent ( ' sameSite ' , ( ) = > sameSite ? . toValue ( ) ) ;
2019-10-26 02:42:50 +00:00
await _channel . invokeMethod ( ' setCookie ' , args ) ;
}
2021-02-01 14:55:27 +00:00
Future < void > _setCookieWithJavaScript (
{ required String url ,
required String name ,
required String value ,
required String domain ,
String path = " / " ,
int ? expiresDate ,
int ? maxAge ,
bool ? isSecure ,
HTTPCookieSameSitePolicy ? sameSite ,
InAppWebViewController ? webViewController } ) async {
var cookieValue = name + " = " + value + " ; Domain= " + domain + " ; Path= " + path ;
if ( expiresDate ! = null )
cookieValue + = " ; Expires= " + _getCookieExpirationDate ( expiresDate ) ;
if ( maxAge ! = null )
cookieValue + = " ; Max-Age= " + maxAge . toString ( ) ;
if ( isSecure ! = null & & isSecure )
cookieValue + = " ; Secure " ;
if ( sameSite ! = null )
cookieValue + = " ; SameSite= " + sameSite . toValue ( ) ;
cookieValue + = " ; " ;
if ( webViewController ! = null ) {
InAppWebViewGroupOptions ? options = await webViewController . getOptions ( ) ;
if ( options ! = null & & options . crossPlatform ! = null & &
options . crossPlatform ! . javaScriptEnabled ) {
await webViewController . evaluateJavascript (
source : ' document.cookie=" $ cookieValue " ' ) ;
return ;
}
}
var setCookieCompleter = Completer < void > ( ) ;
var headlessWebView = new HeadlessInAppWebView (
initialUrl: url ,
onLoadStop: ( controller , url ) async {
await controller . evaluateJavascript (
source : ' document.cookie=" $ cookieValue " ' ) ;
setCookieCompleter . complete ( ) ;
} ,
) ;
await headlessWebView . run ( ) ;
await setCookieCompleter . future ;
await headlessWebView . dispose ( ) ;
}
2019-10-26 02:42:50 +00:00
///Gets all the cookies for the given [url].
2021-01-30 13:53:32 +00:00
///
///[iosBelow11WebViewController] is used for getting the cookies (also session-only cookies) using JavaScript (cookies with `isHttpOnly` enabled cannot be found, see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies)
///from the current context of the [WebView] managed by that controller when you need to target iOS below 11. JavaScript must be enabled in order to work.
///In this case the [url] parameter is ignored.
///
///**NOTE for iOS below 11.0**: All the cookies returned this way will have all the properties to `null` except for [Cookie.name] and [Cookie.value].
///If [iosBelow11WebViewController] is `null` or JavaScript is disabled for it, it will try to use a [HeadlessInAppWebView]
///to get the cookies (session-only cookies and cookies with `isHttpOnly` enabled won't be found!).
Future < List < Cookie > > getCookies ( { required String url , InAppWebViewController ? iosBelow11WebViewController } ) async {
2021-01-28 16:10:15 +00:00
assert ( url . isNotEmpty ) ;
2019-10-26 02:42:50 +00:00
2021-01-30 13:53:32 +00:00
if ( Platform . isIOS ) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin ( ) ;
IosDeviceInfo iosInfo = await deviceInfo . iosInfo ;
var version = double . tryParse ( iosInfo . systemVersion ) ;
if ( version ! = null & & version < 11.0 ) {
2021-02-01 14:55:27 +00:00
return await _getCookiesWithJavaScript ( url: url , webViewController: iosBelow11WebViewController ) ;
2021-01-30 13:53:32 +00:00
}
}
2021-02-01 14:55:27 +00:00
List < Cookie > cookies = [ ] ;
2019-10-26 02:42:50 +00:00
Map < String , dynamic > args = < String , dynamic > { } ;
args . putIfAbsent ( ' url ' , ( ) = > url ) ;
2019-12-01 11:55:06 +00:00
List < dynamic > cookieListMap =
await _channel . invokeMethod ( ' getCookies ' , args ) ;
2019-11-25 00:42:27 +00:00
cookieListMap = cookieListMap . cast < Map < dynamic , dynamic > > ( ) ;
2020-06-13 01:50:19 +00:00
2021-01-30 13:53:32 +00:00
cookieListMap . forEach ( ( cookieMap ) {
2019-12-01 11:55:06 +00:00
cookies . add ( Cookie (
2021-01-30 13:53:32 +00:00
name: cookieMap [ " name " ] ,
value: cookieMap [ " value " ] ,
expiresDate: cookieMap [ " expiresDate " ] ,
isSessionOnly: cookieMap [ " isSessionOnly " ] ,
domain: cookieMap [ " domain " ] ,
2020-06-21 22:09:35 +00:00
sameSite:
2021-01-30 13:53:32 +00:00
HTTPCookieSameSitePolicy . fromValue ( cookieMap [ " sameSite " ] ) ,
isSecure: cookieMap [ " isSecure " ] ,
isHttpOnly: cookieMap [ " isHttpOnly " ] ,
path: cookieMap [ " path " ] ) ) ;
} ) ;
2019-10-26 02:42:50 +00:00
return cookies ;
}
2021-02-01 14:55:27 +00:00
Future < List < Cookie > > _getCookiesWithJavaScript ( { required String url , InAppWebViewController ? webViewController } ) async {
assert ( url . isNotEmpty ) ;
List < Cookie > cookies = [ ] ;
if ( webViewController ! = null ) {
InAppWebViewGroupOptions ? options = await webViewController . getOptions ( ) ;
if ( options ! = null & & options . crossPlatform ! = null & &
options . crossPlatform ! . javaScriptEnabled ) {
List < String > documentCookies = ( await webViewController . evaluateJavascript ( source : ' document.cookie ' ) as String )
. split ( ' ; ' ) . map ( ( documentCookie ) = > documentCookie . trim ( ) ) . toList ( ) ;
documentCookies . forEach ( ( documentCookie ) {
List < String > cookie = documentCookie . split ( ' = ' ) ;
cookies . add ( Cookie (
name: cookie [ 0 ] ,
value: cookie [ 1 ] ,
)
) ;
} ) ;
return cookies ;
}
}
var pageLoaded = Completer < void > ( ) ;
var headlessWebView = new HeadlessInAppWebView (
initialUrl: url ,
onLoadStop: ( controller , url ) async {
pageLoaded . complete ( ) ;
} ,
) ;
await headlessWebView . run ( ) ;
await pageLoaded . future ;
List < String > documentCookies = ( await headlessWebView . webViewController . evaluateJavascript ( source : ' document.cookie ' ) as String )
. split ( ' ; ' ) . map ( ( documentCookie ) = > documentCookie . trim ( ) ) . toList ( ) ;
documentCookies . forEach ( ( documentCookie ) {
List < String > cookie = documentCookie . split ( ' = ' ) ;
cookies . add ( Cookie (
name: cookie [ 0 ] ,
value: cookie [ 1 ] ,
)
) ;
} ) ;
await headlessWebView . dispose ( ) ;
return cookies ;
}
2019-10-26 02:42:50 +00:00
///Gets a cookie by its [name] for the given [url].
2021-01-30 13:53:32 +00:00
///
///[iosBelow11WebViewController] is used for getting the cookie (also session-only cookie) using JavaScript (cookie with `isHttpOnly` enabled cannot be found, see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies)
///from the current context of the [WebView] managed by that controller when you need to target iOS below 11. JavaScript must be enabled in order to work.
///In this case the [url] parameter is ignored.
///
///**NOTE for iOS below 11.0**: All the cookies returned this way will have all the properties to `null` except for [Cookie.name] and [Cookie.value].
///If [iosBelow11WebViewController] is `null` or JavaScript is disabled for it, it will try to use a [HeadlessInAppWebView]
///to get the cookie (session-only cookie and cookie with `isHttpOnly` enabled won't be found!).
2021-01-28 16:10:15 +00:00
Future < Cookie ? > getCookie (
2021-01-30 13:53:32 +00:00
{ required String url , required String name , InAppWebViewController ? iosBelow11WebViewController } ) async {
2021-01-28 16:10:15 +00:00
assert ( url . isNotEmpty ) ;
assert ( name . isNotEmpty ) ;
2019-10-26 02:42:50 +00:00
2021-01-30 13:53:32 +00:00
if ( Platform . isIOS ) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin ( ) ;
IosDeviceInfo iosInfo = await deviceInfo . iosInfo ;
var version = double . tryParse ( iosInfo . systemVersion ) ;
if ( version ! = null & & version < 11.0 ) {
2021-02-01 14:55:27 +00:00
List < Cookie > cookies = await _getCookiesWithJavaScript ( url: url , webViewController: iosBelow11WebViewController ) ;
return cookies . cast < Cookie ? > ( ) . firstWhere ( ( cookie ) = > cookie ! . name = = name , orElse: ( ) = > null ) ;
2021-01-30 13:53:32 +00:00
}
}
2019-10-26 02:42:50 +00:00
Map < String , dynamic > args = < String , dynamic > { } ;
args . putIfAbsent ( ' url ' , ( ) = > url ) ;
List < dynamic > cookies = await _channel . invokeMethod ( ' getCookies ' , args ) ;
cookies = cookies . cast < Map < dynamic , dynamic > > ( ) ;
2019-12-01 11:55:06 +00:00
for ( var i = 0 ; i < cookies . length ; i + + ) {
2019-10-26 02:42:50 +00:00
cookies [ i ] = cookies [ i ] . cast < String , dynamic > ( ) ;
if ( cookies [ i ] [ " name " ] = = name )
2020-06-13 01:50:19 +00:00
return Cookie (
name: cookies [ i ] [ " name " ] ,
value: cookies [ i ] [ " value " ] ,
expiresDate: cookies [ i ] [ " expiresDate " ] ,
isSessionOnly: cookies [ i ] [ " isSessionOnly " ] ,
domain: cookies [ i ] [ " domain " ] ,
2020-06-21 22:09:35 +00:00
sameSite:
HTTPCookieSameSitePolicy . fromValue ( cookies [ i ] [ " sameSite " ] ) ,
2020-06-13 01:50:19 +00:00
isSecure: cookies [ i ] [ " isSecure " ] ,
isHttpOnly: cookies [ i ] [ " isHttpOnly " ] ,
path: cookies [ i ] [ " path " ] ) ;
2019-10-26 02:42:50 +00:00
}
return null ;
}
///Removes a cookie by its [name] for the given [url], [domain] and [path].
///
///The default value of [path] is `"/"`.
2021-01-30 13:53:32 +00:00
///If [domain] is empty, its default value will be the domain name of [url].
///
///[iosBelow11WebViewController] is used for deleting the cookie (also session-only cookie) using JavaScript (cookie with `isHttpOnly` enabled cannot be deleted, see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies)
///from the current context of the [WebView] managed by that controller when you need to target iOS below 11. JavaScript must be enabled in order to work.
///In this case the [url] parameter is ignored.
///
///**NOTE for iOS below 11.0**: If [iosBelow11WebViewController] is `null` or JavaScript is disabled for it, it will try to use a [HeadlessInAppWebView]
///to delete the cookie (session-only cookie and cookie with `isHttpOnly` enabled won't be deleted!).
2019-12-01 11:55:06 +00:00
Future < void > deleteCookie (
2021-01-28 16:10:15 +00:00
{ required String url ,
required String name ,
2019-12-01 11:55:06 +00:00
String domain = " " ,
2021-01-30 13:53:32 +00:00
String path = " / " ,
InAppWebViewController ? iosBelow11WebViewController } ) async {
2021-01-28 16:10:15 +00:00
if ( domain . isEmpty ) domain = _getDomainName ( url ) ;
2019-10-26 02:42:50 +00:00
2021-01-28 16:10:15 +00:00
assert ( url . isNotEmpty ) ;
assert ( name . isNotEmpty ) ;
2021-01-30 13:53:32 +00:00
if ( Platform . isIOS ) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin ( ) ;
IosDeviceInfo iosInfo = await deviceInfo . iosInfo ;
var version = double . tryParse ( iosInfo . systemVersion ) ;
if ( version ! = null & & version < 11.0 ) {
2021-02-01 14:55:27 +00:00
await _setCookieWithJavaScript ( url: url , name: name , value: " " , path: path , domain: domain , maxAge: - 1 , webViewController: iosBelow11WebViewController ) ;
2021-01-30 13:53:32 +00:00
return ;
}
}
2019-10-26 02:42:50 +00:00
Map < String , dynamic > args = < String , dynamic > { } ;
args . putIfAbsent ( ' url ' , ( ) = > url ) ;
args . putIfAbsent ( ' name ' , ( ) = > name ) ;
args . putIfAbsent ( ' domain ' , ( ) = > domain ) ;
args . putIfAbsent ( ' path ' , ( ) = > path ) ;
await _channel . invokeMethod ( ' deleteCookie ' , args ) ;
}
///Removes all cookies for the given [url], [domain] and [path].
///
///The default value of [path] is `"/"`.
2021-01-30 13:53:32 +00:00
///If [domain] is empty, its default value will be the domain name of [url].
///
///[iosBelow11WebViewController] is used for deleting the cookies (also session-only cookies) using JavaScript (cookies with `isHttpOnly` enabled cannot be deleted, see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies)
///from the current context of the [WebView] managed by that controller when you need to target iOS below 11. JavaScript must be enabled in order to work.
///In this case the [url] parameter is ignored.
///
///**NOTE for iOS below 11.0**: If [iosBelow11WebViewController] is `null` or JavaScript is disabled for it, it will try to use a [HeadlessInAppWebView]
///to delete the cookies (session-only cookies and cookies with `isHttpOnly` enabled won't be deleted!).
2019-12-01 11:55:06 +00:00
Future < void > deleteCookies (
2021-01-30 13:53:32 +00:00
{ required String url , String domain = " " , String path = " / " ,
InAppWebViewController ? iosBelow11WebViewController } ) async {
2021-01-28 16:10:15 +00:00
if ( domain . isEmpty ) domain = _getDomainName ( url ) ;
2019-10-26 02:42:50 +00:00
2021-01-28 16:10:15 +00:00
assert ( url . isNotEmpty ) ;
2021-01-30 13:53:32 +00:00
if ( Platform . isIOS ) {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin ( ) ;
IosDeviceInfo iosInfo = await deviceInfo . iosInfo ;
var version = double . tryParse ( iosInfo . systemVersion ) ;
if ( version ! = null & & version < 11.0 ) {
2021-02-01 14:55:27 +00:00
List < Cookie > cookies = await _getCookiesWithJavaScript ( url: url , webViewController: iosBelow11WebViewController ) ;
2021-01-30 13:53:32 +00:00
for ( var i = 0 ; i < cookies . length ; i + + ) {
2021-02-01 14:55:27 +00:00
await _setCookieWithJavaScript ( url: url , name: cookies [ i ] . name , value: " " , path: path , domain: domain , maxAge: - 1 , webViewController: iosBelow11WebViewController ) ;
2021-01-30 13:53:32 +00:00
}
return ;
}
}
2019-10-26 02:42:50 +00:00
Map < String , dynamic > args = < String , dynamic > { } ;
args . putIfAbsent ( ' url ' , ( ) = > url ) ;
args . putIfAbsent ( ' domain ' , ( ) = > domain ) ;
args . putIfAbsent ( ' path ' , ( ) = > path ) ;
await _channel . invokeMethod ( ' deleteCookies ' , args ) ;
}
///Removes all cookies.
2021-01-30 13:53:32 +00:00
///
///**NOTE for iOS**: available from iOS 11.0+.
2019-10-31 02:20:07 +00:00
Future < void > deleteAllCookies ( ) async {
2019-10-26 02:42:50 +00:00
Map < String , dynamic > args = < String , dynamic > { } ;
await _channel . invokeMethod ( ' deleteAllCookies ' , args ) ;
}
2019-10-31 02:20:07 +00:00
String _getDomainName ( String url ) {
2019-10-26 02:42:50 +00:00
Uri uri = Uri . parse ( url ) ;
String domain = uri . host ;
2021-01-28 16:10:15 +00:00
// ignore: unnecessary_null_comparison
2019-12-01 11:55:06 +00:00
if ( domain = = null ) return " " ;
2019-10-26 02:42:50 +00:00
return domain . startsWith ( " www. " ) ? domain . substring ( 4 ) : domain ;
}
2021-01-30 13:53:32 +00:00
String _getCookieExpirationDate ( int expiresDate ) {
var dateTime = DateTime . fromMillisecondsSinceEpoch ( expiresDate ) . toUtc ( ) ;
return DateFormat ( ' EEE, d MMM yyyy hh:mm:ss ' , " en_US " ) . format ( dateTime ) + ' GMT ' ;
}
2019-12-01 11:55:06 +00:00
}
2021-01-31 21:08:20 +00:00
///Class that contains only iOS-specific methods of [CookieManager].
class IOSCookieManager {
static IOSCookieManager ? _instance ;
///Gets the [IOSCookieManager] shared instance.
static IOSCookieManager instance ( ) {
return ( _instance ! = null ) ? _instance ! : _init ( ) ;
}
static IOSCookieManager _init ( ) {
_instance = IOSCookieManager ( ) ;
return _instance ! ;
}
///Fetches all stored cookies.
///
///**NOTE**: available on iOS 11.0+.
///
///**Official iOS API**: https://developer.apple.com/documentation/webkit/wkhttpcookiestore/2882005-getallcookies
Future < List < Cookie > > getAllCookies ( ) async {
List < Cookie > cookies = [ ] ;
Map < String , dynamic > args = < String , dynamic > { } ;
List < dynamic > cookieListMap =
await CookieManager . _channel . invokeMethod ( ' getAllCookies ' , args ) ;
cookieListMap = cookieListMap . cast < Map < dynamic , dynamic > > ( ) ;
cookieListMap . forEach ( ( cookieMap ) {
cookies . add ( Cookie (
name: cookieMap [ " name " ] ,
value: cookieMap [ " value " ] ,
expiresDate: cookieMap [ " expiresDate " ] ,
isSessionOnly: cookieMap [ " isSessionOnly " ] ,
domain: cookieMap [ " domain " ] ,
sameSite:
HTTPCookieSameSitePolicy . fromValue ( cookieMap [ " sameSite " ] ) ,
isSecure: cookieMap [ " isSecure " ] ,
isHttpOnly: cookieMap [ " isHttpOnly " ] ,
path: cookieMap [ " path " ] ) ) ;
} ) ;
return cookies ;
}
}