diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 1ceffd7c7ff7..aac4c6261fcd 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.10.0 + +* Adds `WebResourceRequest` and `WebResourceResponse` to `HttpResponseError`. + ## 2.9.1 * Updates minimum required plugin_platform_interface version to 2.1.7. diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/http_response_error.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/http_response_error.dart index e51b8cf7e2c5..beca1f680dff 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/http_response_error.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/http_response_error.dart @@ -4,6 +4,9 @@ import 'package:flutter/foundation.dart'; +import 'web_resource_request.dart'; +import 'web_resource_response.dart'; + /// Error returned in `PlatformNavigationDelegate.setOnHttpError` when an HTTP /// response error has been received. /// @@ -37,9 +40,13 @@ import 'package:flutter/foundation.dart'; class HttpResponseError { /// Used by the platform implementation to create a new [HttpResponseError]. const HttpResponseError({ - required this.statusCode, + this.request, + this.response, }); - /// The HTTP status code. - final int statusCode; + /// The associated request. + final WebResourceRequest? request; + + /// The associated response. + final WebResourceResponse? response; } diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart index c89f32a238fb..ec6c0bc2c471 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/types.dart @@ -20,5 +20,7 @@ export 'platform_webview_widget_creation_params.dart'; export 'scroll_position_change.dart'; export 'url_change.dart'; export 'web_resource_error.dart'; +export 'web_resource_request.dart'; +export 'web_resource_response.dart'; export 'webview_cookie.dart'; export 'webview_credential.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_request.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_request.dart new file mode 100644 index 000000000000..18ba83badbe1 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_request.dart @@ -0,0 +1,43 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; + +/// Defines the parameters of the web resource request from the associated request. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// This example demonstrates how to extend the [WebResourceRequest] to +/// provide additional platform specific parameters. +/// +/// When extending [WebResourceRequest] additional parameters should always +/// accept `null` or have a default value to prevent breaking changes. +/// +/// ```dart +/// class AndroidWebResourceRequest extends WebResourceRequest { +/// WebResourceRequest._({ +/// required WebResourceRequest request, +/// }) : super( +/// uri: request.uri, +/// ); +/// +/// factory AndroidWebResourceRequest.fromWebResourceRequest( +/// WebResourceRequest request, { +/// Map headers, +/// }) { +/// return AndroidWebResourceRequest._(request, headers: headers); +/// } +/// +/// final Map headers; +/// } +/// ``` +@immutable +class WebResourceRequest { + /// Used by the platform implementation to create a new [WebResourceRequest]. + const WebResourceRequest({required this.uri}); + + /// URI for the request. + final Uri uri; +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_response.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_response.dart new file mode 100644 index 000000000000..f4269ee6a5b5 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/web_resource_response.dart @@ -0,0 +1,55 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'package:flutter/foundation.dart'; + +/// Contains information about the response for a request. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// This example demonstrates how to extend the [WebResourceResponse] to +/// provide additional platform specific parameters. +/// +/// When extending [WebResourceResponse] additional parameters should always +/// accept `null` or have a default value to prevent breaking changes. +/// +/// ```dart +/// class AndroidWebResourceResponse extends WebResourceResponse { +/// WebResourceResponse._({ +/// required WebResourceResponse response, +/// }) : super( +/// uri: response.uri, +/// statusCode: response.statusCode, +/// headers: response.headers, +/// ); +/// +/// factory AndroidWebResourceResponse.fromWebResourceResponse( +/// WebResourceResponse response, { +/// Uri? historyUrl, +/// }) { +/// return AndroidWebResourceResponse._(response, historyUrl: historyUrl); +/// } +/// +/// final Uri? historyUrl; +/// } +/// ``` +@immutable +class WebResourceResponse { + /// Used by the platform implementation to create a new [WebResourceResponse]. + const WebResourceResponse({ + required this.uri, + required this.statusCode, + this.headers = const {}, + }); + + /// The URI that this response is associated with. + final Uri? uri; + + /// The HTTP status code. + final int statusCode; + + /// Headers for the request. + final Map headers; +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 850d07ff6cdc..8e00b1d3e2ab 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.9.1 +version: 2.10.0 environment: sdk: ">=3.0.0 <4.0.0" diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/types_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/types_test.dart new file mode 100644 index 000000000000..b364500d6fbb --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/types_test.dart @@ -0,0 +1,32 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// 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:webview_flutter_platform_interface/src/types/types.dart'; + +void main() { + group('types', () { + test('WebResourceRequest', () { + final Uri uri = Uri.parse('https://www.google.com'); + final WebResourceRequest request = WebResourceRequest(uri: uri); + expect(request.uri, uri); + }); + + test('WebResourceResponse', () { + final Uri uri = Uri.parse('https://www.google.com'); + const int statusCode = 404; + const Map headers = {'a': 'header'}; + + final WebResourceResponse response = WebResourceResponse( + uri: uri, + statusCode: statusCode, + headers: headers, + ); + + expect(response.uri, uri); + expect(response.statusCode, statusCode); + expect(response.headers, headers); + }); + }); +} diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/webview_flutter_platform_interface_export_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_flutter_platform_interface_export_test.dart new file mode 100644 index 000000000000..f8c6ee9ce657 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/webview_flutter_platform_interface_export_test.dart @@ -0,0 +1,40 @@ +// Copyright 2013 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// ignore_for_file: unnecessary_statements + +import 'package:flutter_test/flutter_test.dart'; +import 'package:webview_flutter_platform_interface/webview_flutter_platform_interface.dart' + as main_file; + +void main() { + test( + 'ensures webview_flutter_platform_interface.dart exports classes in types directory', + () { + main_file.JavaScriptConsoleMessage; + main_file.JavaScriptLogLevel; + main_file.JavaScriptMessage; + main_file.JavaScriptMode; + main_file.LoadRequestMethod; + main_file.NavigationDecision; + main_file.NavigationRequest; + main_file.NavigationRequestCallback; + main_file.PageEventCallback; + main_file.PlatformNavigationDelegateCreationParams; + main_file.PlatformWebViewControllerCreationParams; + main_file.PlatformWebViewCookieManagerCreationParams; + main_file.PlatformWebViewPermissionRequest; + main_file.PlatformWebViewWidgetCreationParams; + main_file.ProgressCallback; + main_file.WebViewPermissionResourceType; + main_file.WebResourceRequest; + main_file.WebResourceResponse; + main_file.WebResourceError; + main_file.WebResourceErrorCallback; + main_file.WebViewCookie; + main_file.WebResourceErrorType; + main_file.UrlChange; + }, + ); +}