diff --git a/packages/webview_flutter/webview_flutter/CHANGELOG.md b/packages/webview_flutter/webview_flutter/CHANGELOG.md index c8156a65732e..98140b97d977 100644 --- a/packages/webview_flutter/webview_flutter/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 4.14.0 +* Add method to retrieve cookies. See `WebViewCookieManager.getCookies`. * Updates minimum supported SDK version to Flutter 3.38/Dart 3.10. ## 4.13.1 diff --git a/packages/webview_flutter/webview_flutter/example/lib/main.dart b/packages/webview_flutter/webview_flutter/example/lib/main.dart index 4bbe867a7247..f713b14e7343 100644 --- a/packages/webview_flutter/webview_flutter/example/lib/main.dart +++ b/packages/webview_flutter/webview_flutter/example/lib/main.dart @@ -412,8 +412,15 @@ class SampleMenu extends StatelessWidget { } Future _onListCookies(BuildContext context) async { - final cookies = - await webViewController.runJavaScriptReturningResult('document.cookie') as String; + final Uri? domain = Uri.tryParse((await webViewController.currentUrl()) ?? ''); + + final List cookies; + if (domain == null) { + cookies = []; + } else { + cookies = await cookieManager.getCookies(domain: domain); + } + if (context.mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar( @@ -504,12 +511,14 @@ class SampleMenu extends StatelessWidget { return webViewController.loadHtmlString(kTransparentBackgroundPage); } - Widget _getCookieList(String cookies) { - if (cookies == '""') { + Widget _getCookieList(List cookies) { + if (cookies.isEmpty) { return Container(); } - final List cookieList = cookies.split(';'); - final Iterable cookieWidgets = cookieList.map((String cookie) => Text(cookie)); + + final Iterable cookieWidgets = cookies.map( + (WebViewCookie cookie) => Text(cookie.toString()), + ); return Column( mainAxisAlignment: MainAxisAlignment.end, mainAxisSize: MainAxisSize.min, diff --git a/packages/webview_flutter/webview_flutter/lib/src/webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter/lib/src/webview_cookie_manager.dart index 19edf524ca15..f28f24ec1b71 100644 --- a/packages/webview_flutter/webview_flutter/lib/src/webview_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter/lib/src/webview_cookie_manager.dart @@ -83,4 +83,11 @@ class WebViewCookieManager { /// /// This is a no op on iOS versions below 11. Future setCookie(WebViewCookie cookie) => platform.setCookie(cookie); + + /// Gets a list of existing cookie for specified domain from all + /// WebView instances of the application. + /// + /// Each platform can have different url requirements. Please check individual + /// platform implementation for details + Future> getCookies({required Uri domain}) => platform.getCookies(domain); } diff --git a/packages/webview_flutter/webview_flutter/pubspec.yaml b/packages/webview_flutter/webview_flutter/pubspec.yaml index 866d31800e8b..3eeb6f17b3b0 100644 --- a/packages/webview_flutter/webview_flutter/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter/pubspec.yaml @@ -2,7 +2,7 @@ name: webview_flutter description: A Flutter plugin that provides a WebView widget backed by the system webview. repository: https://github.com/flutter/packages/tree/main/packages/webview_flutter/webview_flutter issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview%22 -version: 4.13.1 +version: 4.14.0 environment: sdk: ^3.10.0 @@ -21,9 +21,9 @@ flutter: dependencies: flutter: sdk: flutter - webview_flutter_android: ^4.7.0 - webview_flutter_platform_interface: ^2.13.0 - webview_flutter_wkwebview: ^3.22.0 + webview_flutter_android: ^4.12.0 + webview_flutter_platform_interface: ^2.15.1 + webview_flutter_wkwebview: ^3.25.1 dev_dependencies: build_runner: ^2.1.5 diff --git a/packages/webview_flutter/webview_flutter/test/legacy/webview_flutter_test.mocks.dart b/packages/webview_flutter/webview_flutter/test/legacy/webview_flutter_test.mocks.dart index ca6d14f12116..be55a4c6e666 100644 --- a/packages/webview_flutter/webview_flutter/test/legacy/webview_flutter_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter/test/legacy/webview_flutter_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.5 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in webview_flutter/test/legacy/webview_flutter_test.dart. // Do not manually edit this file. @@ -33,6 +33,7 @@ import 'package:webview_flutter_platform_interface/src/legacy/types/types.dart' // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakeWidget_0 extends _i1.SmartFake implements _i2.Widget { _FakeWidget_0(Object parent, Invocation parentInvocation) : super(parent, parentInvocation); diff --git a/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.mocks.dart b/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.mocks.dart index 1dd1436310e4..28982b7550aa 100644 --- a/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter/test/navigation_delegate_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.5 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in webview_flutter/test/navigation_delegate_test.dart. // Do not manually edit this file. @@ -28,6 +28,7 @@ import 'package:webview_flutter_platform_interface/src/webview_platform.dart' as // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakePlatformWebViewCookieManager_0 extends _i1.SmartFake implements _i2.PlatformWebViewCookieManager { diff --git a/packages/webview_flutter/webview_flutter/test/webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter/test/webview_controller_test.mocks.dart index 8290ae784c81..8f419af62120 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_controller_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.5 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in webview_flutter/test/webview_controller_test.dart. // Do not manually edit this file. @@ -24,6 +24,7 @@ import 'package:webview_flutter_platform_interface/src/types/types.dart' as _i2; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakePlatformWebViewControllerCreationParams_0 extends _i1.SmartFake implements _i2.PlatformWebViewControllerCreationParams { @@ -73,6 +74,15 @@ class MockPlatformWebViewController extends _i1.Mock implements _i4.PlatformWebV ) as _i5.Future); + @override + _i5.Future loadFileWithParams(_i2.LoadFileParams? params) => + (super.noSuchMethod( + Invocation.method(#loadFileWithParams, [params]), + returnValue: _i5.Future.value(), + returnValueForMissingStub: _i5.Future.value(), + ) + as _i5.Future); + @override _i5.Future loadFlutterAsset(String? key) => (super.noSuchMethod( diff --git a/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.dart b/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.dart index 651ffb976e22..3a51a3399b58 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.dart @@ -38,5 +38,32 @@ void main() { as WebViewCookie; expect(capturedCookie, cookie); }); + + test('getCookies', () async { + final mockPlatformWebViewCookieManager = MockPlatformWebViewCookieManager(); + final cookieManager = WebViewCookieManager.fromPlatform(mockPlatformWebViewCookieManager); + + when( + mockPlatformWebViewCookieManager.getCookies(Uri(host: 'flutter.dev')), + ).thenAnswer((_) async => []); + + final List cookies = await cookieManager.getCookies( + domain: Uri(host: 'flutter.dev'), + ); + + expect(cookies, isEmpty); + + verify(mockPlatformWebViewCookieManager.getCookies(Uri(host: 'flutter.dev'))).called(1); + + const cookie = WebViewCookie(name: 'name', value: 'value', domain: 'domain'); + + when( + mockPlatformWebViewCookieManager.getCookies(Uri(host: 'domain')), + ).thenAnswer((_) => Future.value([cookie])); + + expect(await cookieManager.getCookies(domain: Uri(host: 'domain')), isNotEmpty); + + verify(mockPlatformWebViewCookieManager.getCookies(Uri(host: 'domain'))).called(1); + }); }); } diff --git a/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.mocks.dart b/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.mocks.dart index ae191eea5b17..7e51cfd41ef7 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_cookie_manager_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.5 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in webview_flutter/test/webview_cookie_manager_test.dart. // Do not manually edit this file. @@ -22,6 +22,7 @@ import 'package:webview_flutter_platform_interface/src/types/types.dart' as _i2; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakePlatformWebViewCookieManagerCreationParams_0 extends _i1.SmartFake implements _i2.PlatformWebViewCookieManagerCreationParams { @@ -65,4 +66,12 @@ class MockPlatformWebViewCookieManager extends _i1.Mock returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + + @override + _i4.Future> getCookies(Uri? url) => + (super.noSuchMethod( + Invocation.method(#getCookies, [url]), + returnValue: _i4.Future>.value(<_i2.WebViewCookie>[]), + ) + as _i4.Future>); } diff --git a/packages/webview_flutter/webview_flutter/test/webview_widget_test.mocks.dart b/packages/webview_flutter/webview_flutter/test/webview_widget_test.mocks.dart index ca0f668664c2..8126ad33a79c 100644 --- a/packages/webview_flutter/webview_flutter/test/webview_widget_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter/test/webview_widget_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.5 from annotations +// Mocks generated by Mockito 5.4.6 from annotations // in webview_flutter/test/webview_widget_test.dart. // Do not manually edit this file. @@ -27,6 +27,7 @@ import 'package:webview_flutter_platform_interface/src/types/types.dart' as _i2; // ignore_for_file: unnecessary_parenthesis // ignore_for_file: camel_case_types // ignore_for_file: subtype_of_sealed_class +// ignore_for_file: invalid_use_of_internal_member class _FakePlatformWebViewControllerCreationParams_0 extends _i1.SmartFake implements _i2.PlatformWebViewControllerCreationParams { @@ -83,6 +84,15 @@ class MockPlatformWebViewController extends _i1.Mock implements _i6.PlatformWebV ) as _i7.Future); + @override + _i7.Future loadFileWithParams(_i2.LoadFileParams? params) => + (super.noSuchMethod( + Invocation.method(#loadFileWithParams, [params]), + returnValue: _i7.Future.value(), + returnValueForMissingStub: _i7.Future.value(), + ) + as _i7.Future); + @override _i7.Future loadFlutterAsset(String? key) => (super.noSuchMethod(