diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 190d79bed86b..3729a1034b2a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,5 +1,6 @@ -## NEXT +## 2.14.1 +* Adds support to retrieve WebView cookies. See `PlatformWebViewCookieManager.getCookies`. * Updates minimum supported SDK version to Flutter 3.32/Dart 3.8. ## 2.14.0 diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart index 112b85e12568..6368ce7fdb7a 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_webview_cookie_manager.dart @@ -64,4 +64,12 @@ abstract class PlatformWebViewCookieManager extends PlatformInterface { 'setCookie is not implemented on the current platform', ); } + + /// Returns a list of existing cookies for the specified domain from all + /// [WebView] instances of the application. + Future> getCookies(Uri url) { + throw UnimplementedError( + 'getCookies is not implemented on the current platform', + ); + } } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart index 026f2d6c6e02..1ab8e0867a17 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/webview_cookie.dart @@ -38,4 +38,9 @@ class WebViewCookie { /// Its value should match "path-value" in RFC6265bis: /// https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis-02#section-4.1.1 final String path; + + @override + String toString() { + return 'WebViewCookie{name: $name, value: $value, domain: $domain, path: $path}'; + } } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 22f34bbbc538..9afef9cfef4c 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml +++ b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml @@ -4,7 +4,7 @@ repository: https://github.com/flutter/packages/tree/main/packages/webview_flutt issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+webview_flutter%22 # NOTE: We strongly prefer non-breaking changes, even at the expense of a # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes -version: 2.14.0 +version: 2.14.1 environment: sdk: ^3.8.0 diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_cookie_manager_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_cookie_manager_test.dart new file mode 100644 index 000000000000..471bdfbbd085 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_cookie_manager_test.dart @@ -0,0 +1,125 @@ +// Copyright 2013 The Flutter Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter_test/flutter_test.dart'; +import 'package:mockito/mockito.dart'; +import 'package:plugin_platform_interface/plugin_platform_interface.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart'; + +import 'webview_platform_test.mocks.dart'; + +void main() { + setUp(() { + WebViewPlatform.instance = MockWebViewPlatformWithMixin(); + }); + + test('Cannot be implemented with `implements`', () { + when( + (WebViewPlatform.instance! as MockWebViewPlatform) + .createPlatformCookieManager(any), + ).thenReturn(ImplementsPlatformWebViewCookieManager()); + + expect(() { + PlatformWebViewCookieManager( + const PlatformWebViewCookieManagerCreationParams(), + ); + // In versions of `package:plugin_platform_interface` prior to fixing + // https://github.com/flutter/flutter/issues/109339, an attempt to + // implement a platform interface using `implements` would sometimes throw + // a `NoSuchMethodError` and other times throw an `AssertionError`. After + // the issue is fixed, an `AssertionError` will always be thrown. For the + // purpose of this test, we don't really care what exception is thrown, so + // just allow any exception. + }, throwsA(anything)); + }); + + test('Can be extended', () { + const params = PlatformWebViewCookieManagerCreationParams(); + when( + (WebViewPlatform.instance! as MockWebViewPlatform) + .createPlatformCookieManager(any), + ).thenReturn(ExtendsPlatformWebViewCookieManager(params)); + + expect(PlatformWebViewCookieManager(params), isNotNull); + }); + + test('Can be mocked with `implements`', () { + when( + (WebViewPlatform.instance! as MockWebViewPlatform) + .createPlatformCookieManager(any), + ).thenReturn(MockWebViewCookieManagerDelegate()); + + expect( + PlatformWebViewCookieManager( + const PlatformWebViewCookieManagerCreationParams(), + ), + isNotNull, + ); + }); + + test( + 'Default implementation of clearCookies should throw unimplemented error', + () { + final PlatformWebViewCookieManager cookieManager = + ExtendsPlatformWebViewCookieManager( + const PlatformWebViewCookieManagerCreationParams(), + ); + + expect(() => cookieManager.clearCookies(), throwsUnimplementedError); + }, + ); + + test( + 'Default implementation of setCookie should throw unimplemented error', + () { + final PlatformWebViewCookieManager cookieManager = + ExtendsPlatformWebViewCookieManager( + const PlatformWebViewCookieManagerCreationParams(), + ); + + expect( + () => cookieManager.setCookie( + const WebViewCookie(name: 'foo', value: 'bar', domain: 'flutter.dev'), + ), + throwsUnimplementedError, + ); + }, + ); + + test( + 'Default implementation of getCookies should throw unimplemented error', + () { + final PlatformWebViewCookieManager cookieManager = + ExtendsPlatformWebViewCookieManager( + const PlatformWebViewCookieManagerCreationParams(), + ); + + expect( + () => cookieManager.getCookies(Uri.parse('https://flutter.dev')), + throwsUnimplementedError, + ); + }, + ); +} + +class MockWebViewPlatformWithMixin extends MockWebViewPlatform + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin {} + +class ImplementsPlatformWebViewCookieManager + implements PlatformWebViewCookieManager { + @override + dynamic noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation); +} + +class MockWebViewCookieManagerDelegate extends Mock + with + // ignore: prefer_mixin + MockPlatformInterfaceMixin + implements PlatformWebViewCookieManager {} + +class ExtendsPlatformWebViewCookieManager extends PlatformWebViewCookieManager { + ExtendsPlatformWebViewCookieManager(super.params) : super.implementation(); +}