From 03a9b6209e2490dba2d399563157c59f01d16789 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 5 Apr 2023 17:26:08 +0200 Subject: [PATCH 1/5] Adds platform interface for onHttpError --- .../CHANGELOG.md | 1 + .../lib/src/platform_navigation_delegate.dart | 13 ++++++ .../lib/src/types/http_response_error.dart | 45 +++++++++++++++++++ .../lib/src/types/types.dart | 1 + .../platform_navigation_delegate_test.dart | 14 ++++++ ...latform_webview_controller_test.mocks.dart | 10 +++++ 6 files changed, 84 insertions(+) create mode 100644 packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/http_response_error.dart diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 92852f7ce60..35acee9ddcf 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -2,6 +2,7 @@ * Updates minimum Flutter version to 3.3. * Fixes common typos in tests and documentation. +* Adds platform interface for onHttpError callback ## 2.1.0 diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart index 096975b8c33..451c135fdb4 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart @@ -19,6 +19,9 @@ typedef PageEventCallback = void Function(String url); /// Signature for callbacks that report loading progress of a page. typedef ProgressCallback = void Function(int progress); +/// Signature for callbacks that report http errors during loading a page. +typedef HttpResponseErrorCallback = void Function(HttpResponseError error); + /// Signature for callbacks that report a resource loading error. typedef WebResourceErrorCallback = void Function(WebResourceError error); @@ -90,6 +93,16 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { 'setOnPageFinished is not implemented on the current platform.'); } + /// Invoked when an error has occurred during loading. + /// + /// See [PlatformWebViewController.setPlatformNavigationDelegate]. + Future setOnHttpError( + HttpResponseErrorCallback onHttpError, + ) { + throw UnimplementedError( + 'setOnHttpError is not implemented on the current platform.'); + } + /// Invoked when a page is loading to report the progress. /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. 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 new file mode 100644 index 00000000000..635892ee712 --- /dev/null +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/types/http_response_error.dart @@ -0,0 +1,45 @@ +// 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'; + +/// Error returned in `PlatformNavigationDelegate.setOnHttpError` when an HTTP +/// response error has been received. +/// +/// Platform specific implementations can add additional fields by extending +/// this class. +/// +/// This example demonstrates how to extend the [HttpResponseError] to +/// provide additional platform specific parameters. +/// +/// When extending [HttpResponseError] additional parameters should always +/// accept `null` or have a default value to prevent breaking changes. +/// +/// ```dart +/// class IOSHttpResponseError extends HttpResponseError { +/// IOSHttpResponseError._(HttpResponseError error, {required this.domain}) +/// : super( +/// statusCode: error.statusCode, +/// ); +/// +/// factory IOSHttpResponseError.fromHttpResponseError( +/// HttpResponseError error, { +/// required String? domain, +/// }) { +/// return IOSHttpResponseError._(error, domain: domain); +/// } +/// +/// final String? domain; +/// } +/// ``` +@immutable +class HttpResponseError { + /// Used by the platform implementation to create a new [HttpResponseError]. + const HttpResponseError({ + required this.statusCode, + }); + + /// The HTTP status code. + final int statusCode; +} 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 693a2649a78..1da20655548 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 @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +export 'http_response_error.dart'; export 'javascript_message.dart'; export 'javascript_mode.dart'; export 'load_request_params.dart'; diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_navigation_delegate_test.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_navigation_delegate_test.dart index f06902c2784..ac9f065e2be 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_navigation_delegate_test.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_navigation_delegate_test.dart @@ -91,6 +91,20 @@ void main() { }); test( + 'Default implementation of setOnHttpError should throw unimplemented error', + () { + final PlatformNavigationDelegate callbackDelegate = + ExtendsPlatformNavigationDelegate( + const PlatformNavigationDelegateCreationParams()); + + expect( + () => callbackDelegate.setOnHttpError((HttpResponseError error) {}), + throwsUnimplementedError, + ); + }); + + test( + // ignore: lines_longer_than_80_chars 'Default implementation of setOnProgress should throw unimplemented error', () { final PlatformNavigationDelegate callbackDelegate = diff --git a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart index 5dbde6be102..2147fbcedd0 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/test/platform_webview_controller_test.mocks.dart @@ -83,6 +83,16 @@ class MockPlatformNavigationDelegate extends _i1.Mock returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); @override + _i4.Future setOnHttpError(_i3.HttpResponseErrorCallback? onHttpError) => + (super.noSuchMethod( + Invocation.method( + #setOnHttpError, + [onHttpError], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); + @override _i4.Future setOnProgress(_i3.ProgressCallback? onProgress) => (super.noSuchMethod( Invocation.method( From 2db7a34658367afd6d97cf2f0c1e74d7f7826c19 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 6 Apr 2023 09:04:09 +0200 Subject: [PATCH 2/5] Fixes feedback --- .../webview_flutter_platform_interface/CHANGELOG.md | 3 ++- .../lib/src/platform_navigation_delegate.dart | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 35acee9ddcf..17f7e6d02d2 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -2,7 +2,8 @@ * Updates minimum Flutter version to 3.3. * Fixes common typos in tests and documentation. -* Adds platform interface for onHttpError callback +* Adds support for listening to HTTP errors. See + `PlatformNavigationDelegate.setOnHttpError`. ## 2.1.0 diff --git a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart index 451c135fdb4..51e2cb2691b 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart +++ b/packages/webview_flutter/webview_flutter_platform_interface/lib/src/platform_navigation_delegate.dart @@ -93,7 +93,7 @@ abstract class PlatformNavigationDelegate extends PlatformInterface { 'setOnPageFinished is not implemented on the current platform.'); } - /// Invoked when an error has occurred during loading. + /// Invoked when an HTTP error has occurred during loading. /// /// See [PlatformWebViewController.setPlatformNavigationDelegate]. Future setOnHttpError( From c46ebab28f821c1c78beb8843468428d65cc1e11 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Thu, 6 Apr 2023 20:07:31 +0200 Subject: [PATCH 3/5] Fixes formatting issue --- .../lib/src/types/http_response_error.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 635892ee712..e51b8cf7e2c 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 @@ -6,7 +6,7 @@ import 'package:flutter/foundation.dart'; /// Error returned in `PlatformNavigationDelegate.setOnHttpError` when an HTTP /// response error has been received. -/// +/// /// Platform specific implementations can add additional fields by extending /// this class. /// From 93902c3baeab0b58f50ccfc81b74e32fc314bc86 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Tue, 11 Apr 2023 19:54:56 +0200 Subject: [PATCH 4/5] Bumps version --- .../webview_flutter_platform_interface/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md index 17f7e6d02d2..0d90e0c2f50 100644 --- a/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md +++ b/packages/webview_flutter/webview_flutter_platform_interface/CHANGELOG.md @@ -1,4 +1,4 @@ -## NEXT +## 2.2.0 * Updates minimum Flutter version to 3.3. * Fixes common typos in tests and documentation. From 00e5f218f0b15b2d33ae14a418e6650bfa3ca101 Mon Sep 17 00:00:00 2001 From: Hugo Olthof Date: Wed, 12 Apr 2023 09:59:14 +0200 Subject: [PATCH 5/5] Bumps version in pubspec --- .../webview_flutter_platform_interface/pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml b/packages/webview_flutter/webview_flutter_platform_interface/pubspec.yaml index 6d05e0ab629..b4c271375ee 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.1.0 +version: 2.2.0 environment: sdk: ">=2.18.0 <4.0.0"